diff -Nru cups-2.3.3op2/.lgtm.yml cups-2.4.1op1/.lgtm.yml --- cups-2.3.3op2/.lgtm.yml 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/.lgtm.yml 2022-01-27 11:11:42.000000000 +0000 @@ -2,3 +2,5 @@ - exclude: cpp/integer-multiplication-cast-to-long - exclude: cpp/missing-header-guard - exclude: cpp/short-global-name + - exclude: cpp/tainted-format-string + - exclude: cpp/toctou-race-condition diff -Nru cups-2.3.3op2/.travis.yml cups-2.4.1op1/.travis.yml --- cups-2.3.3op2/.travis.yml 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/.travis.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -# -# Travis CI configuration file for CUPS. -# - -language: c - -script: ./configure --enable-debug --enable-debug-guards --enable-debug-printfs --enable-unit-tests && make && make test - -matrix: - include: - # Linux-specific build stuff - - os: linux - dist: focal - virt: vm - sudo: required - before_script: sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6' - addons: - apt: - packages: [libavahi-client-dev, libgnutls28-dev, zlib1g-dev] - - # macOS-specific build stuff - - os: osx - osx_image: xcode12.2 - - -notifications: - email: - # TODO: Need mailing list for OpenPrinting CI builds - recipients: - - msweet@msweet.org diff -Nru cups-2.3.3op2/CHANGES-OPENPRINTING.md cups-2.4.1op1/CHANGES-OPENPRINTING.md --- cups-2.3.3op2/CHANGES-OPENPRINTING.md 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/CHANGES-OPENPRINTING.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -OpenPrinting CUPS Changes -========================= - -Changes in CUPS v2.3.3op2 -------------------------- - -- Security: Fixed a buffer (read) overflow in the `ippReadIO` function - (CVE-2020-10001) -- Clarified the documentation for the "Listen" directive (Issue #53) -- Fixed duplicate ColorModel entries for AirPrint printers (Issue 59) -- Fixed directory/permission defaults for Debian kfreebsd-based systems - (Issue #60, Issue #61) -- Fixed crash bug in `ppdOpen` (Issue #64, Issue #78) -- Fixed regression in `snprintf` emulation function (Issue #67) -- The scheduler's systemd service file now waits for the nslcd service to start - (Issue #69) -- The libusb-based USB backend now uses a simpler read timer implementation to - avoid a regression in a previous change (Issue #72) -- The PPD caching code now only tracks the `APPrinterIconPath` value on macOS - (Issue #73) -- Fixed segfault in help.cgi when searching in man pages (Issue #81) -- Root certificates were incorrectly stored in "~/.cups/ssl". - - -Changes in CUPS v2.3.3op1 -------------------------- - -- The automated test suite can now be activated using `make test` for - consistency with other projects and CI environments - the old `make check` - continues to work as well, and the previous test server behavior can be - accessed by running `make testserver`. -- ippeveprinter now supports multiple icons and strings files. -- ippeveprinter now uses the system's FQDN with Avahi. -- ippeveprinter now supports Get-Printer-Attributes on "/". -- ippeveprinter now uses a deterministic "printer-uuid" value. -- ippeveprinter now uses system sounds on macOS for Identify-Printer. -- Updated ippfind to look for files in "~/Desktop" on Windows. -- Updated ippfind to honor `SKIP-XXX` directives with `PAUSE`. -- Updated IPP Everywhere support to work around printers that only advertise - color raster support but really also support grayscale (Issue #1) -- ipptool now supports DNS-SD URIs like `ipps://My%20Printer._ipps._tcp.local` - (Issue #5) -- The scheduler now allows root backends to have world read permissions but not - world execute permissions (Issue #21) -- Failures to bind IPv6 listener sockets no longer cause errors if IPv6 is - disabled on the host (Issue #25) -- The SNMP backend now supports the HP and Ricoh vendor MIBs (Issue #28) -- The scheduler no longer includes a timestamp in files it writes (Issue #29) -- The systemd service names are now "cups.service" and "cups-lpd.service" - (Issue #30, Issue #31) -- The scheduler no longer adds the local hostname to the ServerAlias list - (Issue #32) -- Added `LogFileGroup` directive in "cups-files.conf" to control the group - owner of log files (Issue #34) -- Added `--with-max-log-size` configure option (Issue #35) -- Added `--enable-sync-on-close` configure option (Issue #37) -- Added `--with-error-policy` configure option (Issue #38) -- IPP Everywhere PPDs could have an "unknown" default InputSlot (Issue #44) -- The `httpAddrListen` function now uses a listen backlog of 128. -- Added USB quirks (Apple issue #5789, #5823, #5831) -- Fixed IPP Everywhere v1.1 conformance issues in ippeveprinter. -- Fixed DNS-SD name collision support in ippeveprinter. -- Fixed compiler and code analyzer warnings. -- Fixed TLS support on Windows. -- Fixed ippfind sub-type searches with Avahi. -- Fixed the default hostname used by ippeveprinter on macOS. -- Fixed resolution of local IPP-USB printers with Avahi. -- Fixed coverity issues (Issue #2) -- Fixed `httpAddrConnect` issues (Issue #3) -- Fixed web interface device URI issue (Issue #4) -- Fixed lp/lpr "printer/class not found" error reporting (Issue #6) -- Fixed xinetd support for LPD clients (Issue #7) -- Fixed libtool build issue (Issue #11) -- Fixed a memory leak in the scheduler (Issue #12) -- Fixed a potential integer overflow in the PPD hashing code (Issue #13) -- Fixed output-bin and print-quality handling issues (Issue #18) -- Fixed PPD options getting mapped to odd IPP values like "tray---4" (Issue #23) -- Fixed remote access to the cupsd.conf and log files (Issue #24) -- Fixed the automated test suite when running in certain build/CI environments - (Issue #25) -- Fixed a logging regression caused by a previous change for Apple issue #5604 - (Issue #25) -- Fixed fax phone number handling with GNOME (Issue #40) -- Fixed potential rounding error in rastertopwg filter (Issue #41) -- Fixed the "uri-security-supported" value from the scheduler (Issue #42) -- Fixed IPP backend crash bug with "printer-alert" values (Issue #43) -- Removed old Solaris inetconv(1m) reference in cups-lpd man page (Issue #46) -- Fixed default options that incorrectly use the "custom" prefix (Issue #48) -- Fixed a memory leak when resolving DNS-SD URIs (Issue #49) -- Fixed systemd status reporting by adopting the notify interface (Issue #51) -- Fixed crash in rastertopwg (Apple issue #5773) -- Fixed cupsManualCopies values in IPP Everywhere PPDs (Apple issue #5807) diff -Nru cups-2.3.3op2/CHANGES.md cups-2.4.1op1/CHANGES.md --- cups-2.3.3op2/CHANGES.md 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/CHANGES.md 2022-01-27 11:11:42.000000000 +0000 @@ -1,406 +1,208 @@ -CHANGES - 2.3.3 - 2020-04-24 -============================ +CHANGES - OpenPrinting CUPS 2.4.1 - 2022-01-27 +============================================== -Changes in CUPS v2.3.3 ----------------------- +Changes in CUPS v2.4.1 (27th January 2020) +------------------------------------------ -- CVE-2020-3898: The `ppdOpen` function did not handle invalid UI - constraint. `ppdcSource::get_resolution` function did not handle - invalid resolution strings. -- CVE-2019-8842: The `ippReadIO` function may under-read an extension - field. -- Fixed WARNING_OPTIONS support for GCC 9.x - -Changes in CUPS v2.3.2 ----------------------- - -- Localization updates. - - -Changes in CUPS v2.3.1 ----------------------- - -- Documentation updates (Issue #5661, #5674, #5682) -- CVE-2019-2228: The `ippSetValuetag` function did not validate the default - language value. -- Fixed a crash bug in the web interface (Issue #5621) -- The PPD cache code now looks up page sizes using their dimensions - (Issue #5633) -- PPD files containing "custom" option keywords did not work (Issue #5639) -- Added a workaround for the scheduler's systemd support (Issue #5640) -- On Windows, TLS certificates generated on February 29 would likely fail - (Issue #5643) -- Added a DigestOptions directive for the `client.conf` file to control whether - MD5-based Digest authentication is allowed (Issue #5647) -- Fixed a bug in the handling of printer resource files (Issue #5652) -- The libusb-based USB backend now reports an error when the distribution - permissions are wrong (Issue #5658) -- Added paint can labels to Dymo driver (Issue #5662) -- The `ippeveprinter` program now supports authentication (Issue #5665) -- The `ippeveprinter` program now advertises DNS-SD services on the correct - interfaces, and provides a way to turn them off (Issue #5666) -- The `--with-dbusdir` option was ignored by the configure script (Issue #5671) -- Sandboxed applications were not able to get the default printer (Issue #5676) -- Log file access controls were not preserved by `cupsctl` (Issue #5677) -- Default printers set with `lpoptions` did not work in all cases (Issue #5681, - Issue #5683, Issue #5684) -- Fixed an error in the jobs web interface template (Issue #5694) -- Fixed an off-by-one error in `ippEnumString` (Issue #5695) -- Fixed some new compiler warnings (Issue #5700) -- Fixed a few issues with the Apple Raster support (rdar://55301114) -- The IPP backend did not detect all cases where a job should be retried using - a raster format (rdar://56021091) -- Fixed spelling of "fold-accordion". -- Fixed the default common name for TLS certificates used by `ippeveprinter`. -- Fixed the option names used for IPP Everywhere finishing options. -- Added support for the second roll of the DYMO Twin/DUO label printers. - - -Changes in CUPS v2.3.0 ----------------------- - -- CVE-2019-8696 and CVE-2019-8675: Fixed SNMP buffer overflows (rdar://51685251) -- Added a GPL2/LGPL2 exception to the new CUPS license terms. -- Documentation updates (Issue #5604) -- Localization updates (Issue #5637) -- Fixed a bug in the scheduler job cleanup code (Issue #5588) -- Fixed builds when there is no TLS library (Issue #5590) -- Eliminated some new GCC compiler warnings (Issue #5591) -- Removed dead code from the scheduler (Issue #5593) -- "make" failed with GZIP options (Issue #5595) -- Fixed potential excess logging from the scheduler when removing job files - (Issue #5597) -- Fixed a NULL pointer dereference bug in `httpGetSubField2` (Issue #5598) -- Added FIPS-140 workarounds for GNU TLS (Issue #5601, Issue #5622) -- The scheduler no longer provides a default value for the description - (Issue #5603) -- The scheduler now logs jobs held for authentication using the error level so - it is clear what happened (Issue #5604) -- The `lpadmin` command did not always update the PPD file for changes to the - `cupsIPPSupplies` and `cupsSNMPSupplies` keywords (Issue #5610) -- The scheduler now uses both the group's membership list as well as the - various OS-specific membership functions to determine whether a user belongs - to a named group (Issue #5613) -- Added USB quirks rule for HP LaserJet 1015 (Issue #5617) -- Fixed some PPD parser issues (Issue #5623, Issue #5624) -- The IPP parser no longer allows invalid member attributes in collections - (Issue #5630) -- The configure script now treats the "wheel" group as a potential system - group (Issue #5638) -- Fixed a USB printing issue on macOS (rdar://31433931) -- Fixed IPP buffer overflow (rdar://50035411) -- Fixed memory disclosure issue in the scheduler (rdar://51373853) -- Fixed DoS issues in the scheduler (rdar://51373929) -- Fixed an issue with unsupported "sides" values in the IPP backend - (rdar://51775322) -- The scheduler would restart continuously when idle and printers were not - shared (rdar://52561199) -- Fixed an issue with `EXPECT !name WITH-VALUE ...` tests. -- Fixed a command ordering issue in the Zebra ZPL driver. -- Fixed a memory leak in `ppdOpen`. - - -Changes in CUPS v2.3rc1 ------------------------ - -- The `cups-config` script no longer adds extra libraries when linking against - shared libraries (Issue #5261) -- The supplied example print documents have been optimized for size - (Issue #5529) -- The `cupsctl` command now prevents setting "cups-files.conf" directives - (Issue #5530) -- The "forbidden" message in the web interface is now explained (Issue #5547) -- The footer in the web interface covered some content on small displays - (Issue #5574) -- The libusb-based USB backend now enforces read limits, improving print speed - in many cases (Issue #5583) -- The `ippeveprinter` command now looks for print commands in the "command" - subdirectory. -- The `ipptool` command now supports `$date-current` and `$date-start` variables - to insert the current and starting date and time values, as well as ISO-8601 - relative time values such as "PT30S" for 30 seconds in the future. - - -Changes in CUPS v2.3b8 ----------------------- - -- Media size matching now uses a tolerance of 0.5mm (rdar://33822024) -- The lpadmin command would hang with a bad PPD file (rdar://41495016) -- Fixed a potential crash bug in cups-driverd (rdar://46625579) -- Fixed a performance regression with large PPDs (rdar://47040759) -- Fixed a memory reallocation bug in HTTP header value expansion - (rdar://problem/50000749) -- Timed out job submission now yields an error (Issue #5570) -- Restored minimal support for the `Emulators` keyword in PPD files to allow - old Samsung printer drivers to continue to work (Issue #5562) -- The scheduler did not encode octetString values like "job-password" correctly - for the print filters (Issue #5558) -- The `cupsCheckDestSupported` function did not check octetString values - correctly (Issue #5557) -- Added support for `UserAgentTokens` directive in "client.conf" (Issue #5555) -- Updated the systemd service file for cupsd (Issue #5551) -- The `ippValidateAttribute` function did not catch all instances of invalid - UTF-8 strings (Issue #5509) -- Fixed an issue with the self-signed certificates generated by GNU TLS - (Issue #5506) -- Fixed a potential memory leak when reading at the end of a file (Issue #5473) -- Fixed potential unaligned accesses in the string pool (Issue #5474) -- Fixed a potential memory leak when loading a PPD file (Issue #5475) -- Added a USB quirks rule for the Lexmark E120n (Issue #5478) -- Updated the USB quirks rule for Zebra label printers (Issue #5395) -- Fixed a compile error on Linux (Issue #5483) -- The lpadmin command, web interface, and scheduler all queried an IPP - Everywhere printer differently, resulting in different PPDs for the same - printer (Issue #5484) -- The web interface no longer provides access to the log files (Issue #5513) -- Non-Kerberized printing to Windows via IPP was broken (Issue #5515) -- Eliminated use of private headers and some deprecated macOS APIs (Issue #5516) -- The scheduler no longer stops a printer if an error occurs when a job is - canceled or aborted (Issue #5517) -- Added a USB quirks rule for the DYMO 450 Turbo (Issue #5521) -- Added a USB quirks rule for Xerox printers (Issue #5523) -- The scheduler's self-signed certificate did not include all of the alternate - names for the server when using GNU TLS (Issue #5525) -- Fixed compiler warnings with newer versions of GCC (Issue #5532, Issue #5533) -- Fixed some PPD caching and IPP Everywhere PPD accounting/password bugs - (Issue #5535) -- Fixed `PreserveJobHistory` bug with time values (Issue #5538) -- The scheduler no longer advertises the HTTP methods it supports (Issue #5540) -- Localization updates (Issue #5461, Issues #5471, Issue #5481, Issue #5486, - Issue #5489, Issue #5491, Issue #5492, Issue #5493, Issue #5494, Issue #5495, - Issue #5497, Issue #5499, Issue #5500, Issue #5501, Issue #5504) -- The scheduler did not always idle exit as quickly as it could. -- Added a new `ippeveprinter` command based on the old ippserver sample code. - - -Changes in CUPS v2.3b7 ----------------------- - -- Fixed some build failures (Issue #5451, Issue #5463) -- Running ppdmerge with the same input and output filenames did not work as - advertised (Issue #5455) - - -Changes in CUPS v2.3b6 ----------------------- - -- Localization update (Issue #5339, Issue #5348, Issue #5362, Issue #5408, - Issue #5410) -- Documentation updates (Issue #5369, Issue #5402, Issue #5403, Issue #5404) -- CVE-2018-4300: Linux session cookies used a predictable random number seed. -- All user commands now support the `--help` option (Issue #5326) -- The `lpoptions` command now works with IPP Everywhere printers that have not - yet been added as local queues (Issue #5045) -- The lpadmin command would create a non-working printer in some error cases - (Issue #5305) -- The scheduler would crash if an empty `AccessLog` directive was specified - (Issue #5309) -- The scheduler did not idle-exit on some Linux distributions (Issue #5319) -- Fixed a regression in the changes to ippValidateAttribute (Issue #5322, - Issue #5330) -- Fixed a crash bug in the Epson dot matrix driver (Issue #5323) -- Automatic debug logging of job errors did not work with systemd (Issue #5337) -- The web interface did not list the IPP Everywhere "driver" (Issue #5338) -- The scheduler did not report all of the supported job options and values - (Issue #5340) -- The IPP Everywhere "driver" now properly supports face-up printers - (Issue #5345) -- Fixed some typos in the label printer drivers (Issue #5350) -- Setting the `Community` name to the empty string in `snmp.conf` now disables - SNMP supply level monitoring by all the standard network backends - (Issue #5354) -- Multi-file jobs could get stuck if the backend failed (Issue #5359, - Issue #5413) -- The IPP Everywhere "driver" no longer does local filtering when printing to - a shared CUPS printer (Issue #5361) -- The lpadmin command now correctly reports IPP errors when configuring an - IPP Everywhere printer (Issue #5370) -- Fixed some memory leaks discovered by Coverity (Issue #5375) -- The PPD compiler incorrectly terminated JCL options (Issue #5379) -- The cupstestppd utility did not generate errors for missing/mismatched - CloseUI/JCLCloseUI keywords (Issue #5381) -- The scheduler now reports the actual location of the log file (Issue #5398) -- Added USB quirk rules (Issue #5395, Issue #5420, Issue #5443) -- The generated PPD files for IPP Everywhere printers did not contain the - cupsManualCopies keyword (Issue #5433) -- Kerberos credentials might be truncated (Issue #5435) -- The handling of `MaxJobTime 0` did not match the documentation (Issue #5438) -- Fixed a bug adding a queue with the `-E` option (Issue #5440) -- The `cupsaddsmb` program has been removed (Issue #5449) -- The `cupstestdsc` program has been removed (Issue #5450) -- The scheduler was being backgrounded on macOS, causing applications to spin - (rdar://40436080) -- The scheduler did not validate that required initial request attributes were - in the operation group (rdar://41098178) -- Authentication in the web interface did not work on macOS (rdar://41444473) -- Fixed an issue with HTTP Digest authentication (rdar://41709086) -- The scheduler could crash when job history was purged (rdar://42198057) -- Fixed a crash bug when mapping PPD duplex options to IPP attributes - (rdar://46183976) -- Fixed a memory leak for some IPP (extension) syntaxes. -- The `cupscgi`, `cupsmime`, and `cupsppdc` support libraries are no longer - installed as shared libraries. -- The `snmp` backend is now deprecated. - - -Changes in CUPS v2.3b5 ----------------------- - -- The `ipptool` program no longer checks for duplicate attributes when running - in list or CSV mode (Issue #5278) -- The `cupsCreateJob`, `cupsPrintFile2`, and `cupsPrintFiles2` APIs did not use - the supplied HTTP connection (Issue #5288) -- Fixed another crash in the scheduler when adding an IPP Everywhere printer - (Issue #5290) -- Added a workaround for certain web browsers that do not support multiple - authentication schemes in a single response header (Issue #5289) -- Fixed policy limits containing the `All` operation (Issue #5296) -- The scheduler was always restarted after idle-exit with systemd (Issue #5297) -- Added a USB quirks rule for the HP LaserJet P1102 (Issue #5310) -- The mailto notifier did not wait for the welcome message (Issue #5312) -- Fixed a parsing bug in the pstops filter (Issue #5321) -- Documentation updates (Issue #5299, Issue #5301, Issue #5306) -- Localization updates (Issue #5317) -- The scheduler allowed environment variables to be specified in the - `cupsd.conf` file (rdar://37836779, rdar://37836995, rdar://37837252, - rdar://37837581) -- Fax queues did not support pause (p) or wait-for-dialtone (w) characters - (rdar://39212256) -- The scheduler did not validate notify-recipient-uri values properly - (rdar://40068936) -- The IPP parser allowed invalid group tags (rdar://40442124) -- Fixed a parsing bug in the new authentication code. - - -Changes in CUPS v2.3b4 ----------------------- - -- NOTICE: Printer drivers are now deprecated (Issue #5270) -- Kerberized printing to another CUPS server did not work correctly - (Issue #5233) -- Fixed printing to some IPP Everywhere printers (Issue #5238) -- Fixed installation of filters (Issue #5247) -- The scheduler now supports using temporary print queues for older IPP/1.1 - print queues like those shared by CUPS 1.3 and earlier (Issue #5241) -- Star Micronics printers need the "unidir" USB quirk rule (Issue #5251) -- Documentation fixes (Issue #5252) -- Fixed a compile issue when PAM is not available (Issue #5253) -- Label printers supported by the rastertolabel driver don't support SNMP, so - don't delay printing to test it (Issue #5256) -- The scheduler could crash while adding an IPP Everywhere printer (Issue #5258) -- The Lexmark Optra E310 printer needs the "no-reattach" USB quirk rule - (Issue #5259) -- Systemd did not restart cupsd when configuration changes were made that - required a restart (Issue #5263) -- The IPP Everywhere PPD generator did not include the `cupsJobPassword` - keyword, when supported (Issue #5265) -- Fixed an Avahi crash bug in the scheduler (Issue #5268) -- Raw print queues are now deprecated (Issue #5269) -- Fixed an RPM packaging problem (Issue #5276) -- The IPP backend did not properly detect failed PDF prints (rdar://34055474) -- TLS connections now properly timeout (rdar://34938533) -- Temp files could not be created in some sandboxed applications - (rdar://37789645) -- The ipptool `--ippserver` option did not encode out-of-band attributes - correctly. -- Added public `cupsEncodeOption` API for encoding a single option as an IPP - attribute. -- Removed support for the `-D_PPD_DEPRECATED=""` developer cheat - the PPD API - should no longer be used. -- Removed support for `-D_IPP_PRIVATE_STRUCTURES=1` developer cheat - the IPP - accessor functions should be used instead. - - -Changes in CUPS v2.3b3 ----------------------- - -- More fixes for printing to old CUPS servers (Issue #5211) -- The IPP Everywhere PPD generator did not support deep grayscale or 8-bit per - component AdobeRGB (Issue #5227) -- Additional changes for the scheduler to substitute default values for invalid - job attributes when running in "relaxed conformance" mode (Issue #5229) -- Localization changes (Issue #5232, rdar://37068158) -- The `cupsCopyDestInfo` function did not work with all print queues - (Issue #5235) - - -Changes in CUPS v2.3b2 ----------------------- - -- Localization changes (Issue #5210) -- Build fixes (Issue #5217) -- IPP Everywhere PPDs were not localized to English (Issue #5205) -- The `cupsGetDests` and `cupsEnumDests` functions no longer filter out local - print services like IPP USB devices (Issue #5206) -- The `cupsCopyDest` function now correctly copies the `is_default` value - (Issue #5208) -- Printing to old CUPS servers has been fixed (Issue #5211) -- The `ppdInstallableConflict` tested too many constraints (Issue #5213) -- All HTTP field values can now be longer than `HTTP_MAX_VALUE` bytes - (Issue #5216) -- Added a USB quirk rule for Canon MP280 series printers (Issue #5221) -- The `cupsRasterWritePixels` function did not correctly swap bytes for some - formats (Issue #5225) -- Fixed an issue with mapping finishing options (rdar://34250727) -- The `ppdLocalizeIPPReason` function incorrectly returned a localized version - of "none" (rdar://36566269) -- The scheduler did not add ".local" to the default DNS-SD host name when - needed. - - -Changes in CUPS v2.3b1 ----------------------- - -- CUPS is now provided under the Apache License, Version 2.0. -- Documentation updates (Issue #4580, Issue #5177, Issue #5192) -- The `cupsCopyDestConflicts` function now handles collection attribute - ("media-col", "finishings-col", etc.) constraints (Issue #4096) -- The `lpoptions` command incorrectly saved default options (Issue #4717) -- The `lpstat` command now reports when new jobs are being held (Issue #4761) -- The `ippfind` command now supports finding printers whose name starts with an - underscore (Issue #4833) -- The CUPS library now supports the latest HTTP Digest authentication - specification including support for SHA-256 (Issue #4862) -- The scheduler now supports the "printer-id" attribute (Issue #4868) -- No longer support backslash, question mark, or quotes in printer names - (Issue #4966) -- The scheduler no longer logs pages as they are printed, instead just logging - a total of the pages printed at job completion (Issue #4991) -- Dropped RSS subscription management from the web interface (Issue #5012) -- Bonjour printer sharing now uses the DNS-SD hostname (or ServerName value if - none is defined) when registering shared printers on the network (Issue #5071) -- The `ipptool` command now supports writing `ippserver` attributes files - (Issue #5093) -- The `lp` and `lpr` commands now provide better error messages when the default - printer cannot be found (Issue #5096) -- The `lpadmin` command now provides a better error message when an unsupported - System V interface script is used (Issue #5111) -- The scheduler did not write out dirty configuration and state files if there - were open client connections (Issue #5118) -- The `SSLOptions` directive now supports `MinTLS` and `MaxTLS` options to - control the minimum and maximum TLS versions that will be allowed, - respectively (Issue #5119) -- Dropped hard-coded CGI scripting language support (Issue #5124) -- The `cupsEnumDests` function did not include options from the lpoptions - files (Issue #5144) -- Fixed the `ippserver` sample code when threading is disabled or unavailable - (Issue #5154) -- Added label markup to checkbox and radio button controls in the web interface - templates (Issue #5161) -- Fixed group validation on OpenBSD (Issue #5166) -- Improved IPP Everywhere media support, including a new - `cupsAddDestMediaOptions` function (Issue #5167) -- IPP Everywhere PPDs now include localizations of printer-specific media types, - when available (Issue #5168) -- The cups-driverd program incorrectly stopped scanning PPDs as soon as a loop - was seen (Issue #5170) -- IPP Everywhere PPDs now support IPP job presets (Issue #5179) -- IPP Everywhere PPDs now support finishing templates (Issue #5180) -- Fixed a journald support bug in the scheduler (Issue #5181) -- Fixed PAM module detection and added support for the common PAM definitions - (Issue #5185) -- The scheduler now substitutes default values for invalid job attributes when - running in "relaxed conformance" mode (Issue #5186) -- The scheduler did not work with older versions of uClibc (Issue #5188) -- The scheduler now generates a strings file for localizing PPD options - (Issue #5194) +- The default color mode now is now configurable and defaults to the printer's + reported default mode (Issue #277) +- Configuration script now checks linking for -Wl,-pie flags (Issue #303) +- Fixed memory leaks - in testi18n (Issue #313), in `cups_enum_dests()` + (Issue #317), in `_cupsEncodeOption()` and `http_tls_upgrade()` (Issue #322) +- Fixed missing bracket in de/index.html (Issue #299) +- Fixed typos in configuration scripts (Issues #304, #316) +- Removed remaining legacy code for `RIP_MAX_CACHE` environment variable + (Issue #323) +- Removed deprecated directives from cupsctl and cups-files.conf (Issue #300) +- Removed `purge-jobs` legacy code from CGI scripts and templates (Issue #325) + + +Changes in CUPS v2.4.0 (29th November 2021) +------------------------------------------- + +- Added configure option --with-idle-exit-timeout (Issue #294) +- Added --with-systemd-timeoutstartsec configure option (Issue #298) +- DigestOptions now are applied for MD5 Digest authentication defined + by RFC 2069 as well (Issue #287) +- Fixed compilation on Solaris (Issue #293) +- Fixed and improved German translations (Issue #296, Issue #297) + + +Changes in CUPS v2.4rc1 (12th November 2021) +-------------------------------------------- + +- Added warning and debug messages when loading printers + if the queue is raw or with driver (Issue #286) +- Compilation now uses -fstack-protector-strong if available (Issue #285) + + +Changes in CUPS v2.4b1 (27th October 2021) +------------------------------------------ + +- Added support for CUPS running in a Snapcraft snap. +- Added basic OAuth 2.0 client support (Issue #100) +- Added support for AirPrint and Mopria clients (Issue #105) +- Added configure support for specifying systemd dependencies in the CUPS + service file (Issue #144) +- Added several features and improvements to `ipptool` (Issue #153) +- Added a JSON output mode for `ipptool`. +- The `ipptool` command now correctly reports an error when a test file cannot + be found. +- CUPS library now uses thread safe `getpwnam_r` and `getpwuid_r` functions + (Issue #274) +- Fixed Kerberos authentication for the web interface (Issue #19) +- The ZPL sample driver now supports more "standard" label sizes (Issue #70) +- Fixed reporting of printer instances when enumerating and when no options are + set for the main instance (Issue #71) +- Reverted USB read limit enforcement change from CUPS 2.2.12 (Issue #72) +- The IPP backend did not return the correct status code when a job was canceled + at the printer/server (Issue #74) +- The `testlang` unit test program now loops over all of the available locales + by default (Issue #85) +- The `cupsfilter` command now shows error messages when options are used + incorrectly (Issue #88) +- The PPD functions now treat boolean values as case-insensitive (Issue #106) +- Temporary queue names no longer end with an underscore (Issue #110) +- The USB backend now runs as root (Issue #121) +- Added pkg-config file for libcups (Issue #122) +- Fixed a PPD memory leak caused by emulator definitions (Issue #124) +- Fixed a `DISPLAY` bug in `ipptool` (Issue #139) +- The scheduler now includes the `[Job N]` prefix for job log messages, even + when using syslog logging (Issue #154) +- Added support for locales using the GB18030 character set (Issue #159) +- `httpReconnect2` did not reset the socket file descriptor when the TLS + negotiation failed (Apple #5907) +- `httpUpdate` did not reset the socket file descriptor when the TLS + negotiation failed (Apple #5915) +- The IPP backend now retries Validate-Job requests (Issue #132) +- Now show better error messages when a driver interface program fails to + provide a PPD file (Issue #148) +- Added dark mode support to the CUPS web interface (Issue #152) +- Added a workaround for Solaris in `httpAddrConnect2` (Issue #156) +- Fixed an interaction between `--remote-admin` and `--remote-any` for the + `cupsctl` command (Issue #158) +- Now use a 60 second timeout for reading USB backchannel data (Issue #160) +- The USB backend now tries harder to find a serial number (Issue #170) +- Fixed `@IF(name)` handling in `cupsd.conf` (Apple #5918) +- Fixed documentation and added examples for CUPS' limited CGI support + (Apple #5940) +- Fixed the `lpc` command prompt (Apple #5946) +- Now always pass "localhost" in the `Host:` header when talking over a domain + socket or the loopback interface (Issue #185) +- Fixed a job history update issue in the scheduler (Issue #187) +- Fixed `job-pages-per-set` value for duplex print jobs. +- Fixed an edge case in `ippReadIO` to make sure that only complete attributes + and values are retained on an error (Issue #195) +- Hardened `ippReadIO` to prevent invalid IPP messages from being propagated + (Issue #195, Issue #196) +- The scheduler now supports the "everywhere" model directly (Issue #201) +- Fixed some IPP Everywhere option mapping problems (Issue #238) +- Fixed support for "job-hold-until" with the Restart-Job operation (Issue #250) +- Fixed the default color/grayscale presets for IPP Everywhere PPDs (Issue #262) +- Fixed support for the 'offline-report' state for all USB backends (Issue #264) +- Documentation fixes (Issue #92, Issue #163, Issue #177, Issue #184) +- Localization updates (Issue #123, Issue #129, Issue #134, Issue #146, + Issue #164) +- USB quirk updates (Issue #192, Issue #270, Apple #5766, Apple #5838, + Apple #5843, Apple #5867) +- Web interface updates (Issue #142, Issue #218) +- The `ippeveprinter` tool now automatically uses an available port. +- Fixed several Windows TLS and hashing issues. +- Deprecated cups-config (Issue #97) +- Deprecated Kerberos (`AuthType Negotiate`) authentication (Issue #98) +- Removed support for the (long deprecated and unused) `FontPath`, + `ListenBackLog`, `LPDConfigFile`, `KeepAliveTimeout`, `RIPCache`, and + `SMBConfigFile` directives in `cupsd.conf` and `cups-files.conf`. +- Stubbed out deprecated `httpMD5` functions. +- Add test for undefined page ranges during printing. + + +CUPS v2.3.3op2 (February 1, 2021) +--------------------------------- + +- Security: Fixed a buffer (read) overflow in the `ippReadIO` function + (CVE-2020-10001) +- Clarified the documentation for the "Listen" directive (Issue #53) +- Fixed duplicate ColorModel entries for AirPrint printers (Issue 59) +- Fixed directory/permission defaults for Debian kfreebsd-based systems + (Issue #60, Issue #61) +- Fixed crash bug in `ppdOpen` (Issue #64, Issue #78) +- Fixed regression in `snprintf` emulation function (Issue #67) +- The scheduler's systemd service file now waits for the nslcd service to start + (Issue #69) +- The libusb-based USB backend now uses a simpler read timer implementation to + avoid a regression in a previous change (Issue #72) +- The PPD caching code now only tracks the `APPrinterIconPath` value on macOS + (Issue #73) +- Fixed segfault in help.cgi when searching in man pages (Issue #81) +- Root certificates were incorrectly stored in "~/.cups/ssl". + + +CUPS v2.3.3op1 (November 27, 2020) +---------------------------------- + +- The automated test suite can now be activated using `make test` for + consistency with other projects and CI environments - the old `make check` + continues to work as well, and the previous test server behavior can be + accessed by running `make testserver`. +- ippeveprinter now supports multiple icons and strings files. +- ippeveprinter now uses the system's FQDN with Avahi. +- ippeveprinter now supports Get-Printer-Attributes on "/". +- ippeveprinter now uses a deterministic "printer-uuid" value. +- ippeveprinter now uses system sounds on macOS for Identify-Printer. +- Updated ippfind to look for files in "~/Desktop" on Windows. +- Updated ippfind to honor `SKIP-XXX` directives with `PAUSE`. +- Updated IPP Everywhere support to work around printers that only advertise + color raster support but really also support grayscale (Issue #1) +- ipptool now supports DNS-SD URIs like `ipps://My%20Printer._ipps._tcp.local` + (Issue #5) +- The scheduler now allows root backends to have world read permissions but not + world execute permissions (Issue #21) +- Failures to bind IPv6 listener sockets no longer cause errors if IPv6 is + disabled on the host (Issue #25) +- The SNMP backend now supports the HP and Ricoh vendor MIBs (Issue #28) +- The scheduler no longer includes a timestamp in files it writes (Issue #29) +- The systemd service names are now "cups.service" and "cups-lpd.service" + (Issue #30, Issue #31) +- The scheduler no longer adds the local hostname to the ServerAlias list + (Issue #32) +- Added `LogFileGroup` directive in "cups-files.conf" to control the group + owner of log files (Issue #34) +- Added `--with-max-log-size` configure option (Issue #35) +- Added `--enable-sync-on-close` configure option (Issue #37) +- Added `--with-error-policy` configure option (Issue #38) +- IPP Everywhere PPDs could have an "unknown" default InputSlot (Issue #44) +- The `httpAddrListen` function now uses a listen backlog of 128. +- Added USB quirks (Apple issue #5789, #5823, #5831) +- Fixed IPP Everywhere v1.1 conformance issues in ippeveprinter. +- Fixed DNS-SD name collision support in ippeveprinter. +- Fixed compiler and code analyzer warnings. +- Fixed TLS support on Windows. +- Fixed ippfind sub-type searches with Avahi. +- Fixed the default hostname used by ippeveprinter on macOS. +- Fixed resolution of local IPP-USB printers with Avahi. +- Fixed coverity issues (Issue #2) +- Fixed `httpAddrConnect` issues (Issue #3) +- Fixed web interface device URI issue (Issue #4) +- Fixed lp/lpr "printer/class not found" error reporting (Issue #6) +- Fixed xinetd support for LPD clients (Issue #7) +- Fixed libtool build issue (Issue #11) +- Fixed a memory leak in the scheduler (Issue #12) +- Fixed a potential integer overflow in the PPD hashing code (Issue #13) +- Fixed output-bin and print-quality handling issues (Issue #18) +- Fixed PPD options getting mapped to odd IPP values like "tray---4" (Issue #23) +- Fixed remote access to the cupsd.conf and log files (Issue #24) +- Fixed the automated test suite when running in certain build/CI environments + (Issue #25) +- Fixed a logging regression caused by a previous change for Apple issue #5604 + (Issue #25) +- Fixed fax phone number handling with GNOME (Issue #40) +- Fixed potential rounding error in rastertopwg filter (Issue #41) +- Fixed the "uri-security-supported" value from the scheduler (Issue #42) +- Fixed IPP backend crash bug with "printer-alert" values (Issue #43) +- Removed old Solaris inetconv(1m) reference in cups-lpd man page (Issue #46) +- Fixed default options that incorrectly use the "custom" prefix (Issue #48) +- Fixed a memory leak when resolving DNS-SD URIs (Issue #49) +- Fixed systemd status reporting by adopting the notify interface (Issue #51) +- Fixed crash in rastertopwg (Apple issue #5773) +- Fixed cupsManualCopies values in IPP Everywhere PPDs (Apple issue #5807) diff -Nru cups-2.3.3op2/CONTRIBUTING.md cups-2.4.1op1/CONTRIBUTING.md --- cups-2.3.3op2/CONTRIBUTING.md 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/CONTRIBUTING.md 2022-01-27 11:11:42.000000000 +0000 @@ -1,15 +1,10 @@ Contributing to CUPS ==================== -CUPS is developed by Apple Inc. and distributed as open source software under +CUPS is developed by OpenPrinting and distributed as open source software under the Apache License, Version 2.0 with exceptions to allow linking to GPL2/LGPL2 -code. Significant contributions to CUPS must be licensed to Apple using the -Apple Contributor Agreement: +code. - https://www.cups.org/AppleContributorAgreement_2011-03-10.pdf - -Contributions should be submitted as attachments to bug reports on the -[CUPS Github project](https://github.com/apple/cups). Changes to existing -source files should be submitted as unified diffs while new source files -should be provided as-is or in an archive. Github pull requests can also be -used to submit changes. +Contributions should be submitted either as pull requests or as attachments +(unified diffs) to bug reports on the OpenPrinting CUPS Github project at +. diff -Nru cups-2.3.3op2/CREDITS.md cups-2.4.1op1/CREDITS.md --- cups-2.3.3op2/CREDITS.md 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/CREDITS.md 2022-01-27 11:11:42.000000000 +0000 @@ -1,5 +1,5 @@ -CREDITS - 2019-08-21 -==================== +Credits +======= Few projects are completed by one person, and CUPS is no exception. We'd like to thank the following individuals for their contributions: @@ -50,5 +50,5 @@ integration. Yugami - LDAP browsing support. -If I've missed someone, please let me know by sending an email to -"msweet@apple.com". +If we've missed someone, please let us know by filing an issue at +. diff -Nru cups-2.3.3op2/DEVELOPING.md cups-2.4.1op1/DEVELOPING.md --- cups-2.3.3op2/DEVELOPING.md 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/DEVELOPING.md 2022-01-27 11:11:42.000000000 +0000 @@ -8,11 +8,10 @@ How To Contact The Developers ----------------------------- -The CUPS mailing lists 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 "cups" mailing list is intended for -CUPS usage questions and new software announcements while the "cups-devel" -mailing list provides a forum for CUPS developers and monitoring new bugs. +The Linux Foundation's "printing-architecture" mailing list is the primary means +of asking questions and informally discussing issues and feature requests with +the OpenPrinting developers. To subscribe or see the mailing list archives, go +to . Interfaces @@ -42,17 +41,17 @@ Build System ------------ -The CUPS build system uses GNU autoconf to tailor the library to the local +The CUPS build system uses GNU autoconf to tailor the software to the local operating system. Project files for the current release of Microsoft Visual Studio are also provided for Microsoft Windows®. To improve portability, makefiles must not make use of features unique to GNU make. See the MAKEFILE GUIDELINES section for a description of the allowed make features and makefile guidelines. -Additional GNU build programs such as GNU automake and GNU libtool 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. +Additional GNU build programs such as GNU autoheader, GNU automake, and GNU +libtool must not be used. GNU autoheader rewrites the "config.h" template, GNU +automake produces non-portable makefiles which depend on GNU-specific +extensions, and GNU libtool is not portable or reliable enough for CUPS. Version Numbering @@ -123,16 +122,14 @@ ### Source Files -All source files names must be 16 characters or less in length to ensure -compatibility with older UNIX filesystems. Source files containing functions -have an extension of ".c" for C and ".cxx" for C++ source files. All other -"include" files have an extension of ".h". Tabs are set to 8 characters or -columns. +All source files names must consist of lowercase ASCII letters, numbers, dash +("-"), underscore ("_"), and period (".") to ensure compatibility across +different filesystems. Source files containing functions have an extension of +".c" for C and ".cxx" for C++ source files. All other "include" files have an +extension of ".h". Tabs are set to 8 characters/columns. -> Note: -> -> The ".cxx" extension is used because it is the only common C++ extension -> between Linux, macOS, UNIX, and Windows. +> Note: The ".cxx" extension is used because it is the only common C++ extension +> between Linux®, macOS®, Unix®, and Windows®. The top of each source file contains a header giving the purpose or nature of the source file and the copyright and licensing notice: @@ -140,7 +137,7 @@ /* * Description of file contents. * - * Copyright 2017 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. @@ -168,21 +165,19 @@ 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"): +so that it is not necessary. C source files can use either the block comment +format ("/* comment */") or the C99/C++ "//" comment format, with the block +comment format being preferred for multi-line comments: /* - * Clear the state array before we begin... + * Clear the state array before we begin. Make sure that every + * element is set to `CUPS_STATE_IDLE`. */ for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++) array[i] = CUPS_STATE_IDLE; - /* - * Wait for state changes on another thread... - */ - + // Wait for state changes on another thread... do { for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++) @@ -202,12 +197,9 @@ the code at the original indentation: { - int i; /* Looping var */ - - /* - * Process foobar values from 0 to 999... - */ + int i; // Looping var + // Process foobar values from 0 to 999... for (i = 0; i < 1000; i ++) { do_this(i); @@ -262,11 +254,14 @@ /* * 'do_this()' - Compute y = this(x). * + * This function computes "this(x)" and returns the result. "x" must be + * between 0.0 and 1.1. + * * Notes: none. */ - static float /* O - Inverse power value, 0.0 <= y <= 1.1 */ - do_this(float x) /* I - Power value (0.0 <= x <= 1.1) */ + static float // O - Inverse power value, 0.0 <= y <= 1.1 + do_this(float x) // I - Power value (0.0 <= x <= 1.1) { ... return (y); @@ -277,7 +272,8 @@ the "IO" prefix for the corresponding in-line comment. The [codedoc](https://www.msweet.org/codedoc) documentation generator also -understands the following special text in the function description comment: +understands some markdown syntax as well as the following special text in the +function description comment: @deprecated@ - Marks the function as deprecated: not recommended for new development and scheduled for removal. @@ -303,10 +299,10 @@ variables, local static variables are suitably protected for concurrent access. Each variable is declared on a separate line and is immediately followed by a -comment block describing the variable: +comment describing the variable: - int ThisVariable; /* The current state of this */ - static int that_variable; /* The current state of that */ + int ThisVariable; // The current state of this + static int that_variable; // The current state of that ### Types @@ -317,9 +313,9 @@ to avoid conflicts with system types. Private type names start with an underscore, e.g., `_cups_this_t`, `_cups_that_t`, etc. -Each type has a comment block immediately after the typedef: +Each type has a comment immediately after the typedef: - typedef int cups_this_type_t; /* This type is for CUPS foobar options. */ + typedef int cups_this_type_t; // This type is for CUPS foobar options. ### Structures @@ -330,13 +326,13 @@ program, to avoid conflicts with system types. Private structure names start with an underscore, e.g., `_cups_this_s`, `_cups_that_s`, etc. -Each structure has a comment block immediately after the struct and each member -is documented similar to the variable naming policy above: +Each structure has a comment immediately after the struct and each member is +documented similar to the variable naming policy above: - struct cups_this_struct_s /* This structure is for CUPS foobar options. */ + struct cups_this_struct_s // This structure is for CUPS foobar options. { - int this_member; /* Current state for this */ - int that_member; /* Current state for that */ + int this_member; // Current state for this + int that_member; // Current state for that }; @@ -351,20 +347,20 @@ Typed enumerations should be used whenever possible to allow for type checking by the compiler. -Comment blocks immediately follow each constant: +Comments immediately follow each constant: - typedef enum cups_tray_e /* Tray enumerations */ + typedef enum cups_tray_e // Tray enumerations { - CUPS_TRAY_THIS, /* This tray */ - CUPS_TRAY_THAT /* That tray */ + CUPS_TRAY_THIS, // This tray + CUPS_TRAY_THAT // That tray } cups_tray_t; ## Makefile Guidelines -The following is a guide to the makefile-based build system used by CUPS. -These standards have been developed over the years to allow CUPS to be built on -as many systems and environments as possible. +The following is a guide to the (POSIX) makefile-based build system used by +CUPS. These guidelines have been developed over the years to allow CUPS to be +built on as many systems and environments as possible. ### General Organization @@ -383,7 +379,7 @@ # # Makefile for ... # - # Copyright 2017 by Apple Inc. + # Copyright © 2021-2022 by OpenPrinting # # Licensed under Apache License v2.0. See the file "LICENSE" for more # information. @@ -392,9 +388,9 @@ ### Portable Makefile Construction -CUPS uses a common subset of make program syntax to ensure that the software -can be compiled "out of the box" on as many systems as possible. The following -is a list of assumptions we follow when constructing makefiles: +CUPS uses a common subset of POSIX make program syntax to ensure that the +software can be compiled "out of the box" on as many systems as possible. The +following is a list of assumptions we follow when constructing makefiles: - Targets; we assume that the make program supports the notion of simple targets of the form "name:" that perform tab-indented commands that follow @@ -534,7 +530,8 @@ - `install-headers`; installs all include files in their corresponding locations (also see "INSTALL/UNINSTALL SUPPORT"), - `install-libs`; installs all library files in their corresponding locations - (also see "INSTALL/UNINSTALL SUPPORT"), and + (also see "INSTALL/UNINSTALL SUPPORT"), +- `test`: builds and runs unit tests, and - `uninstall`; removes all distribution files from their corresponding locations (also see "INSTALL/UNINSTALL SUPPORT"). @@ -554,6 +551,7 @@ TAB echo Linking $@... TAB $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) + ### Static Libraries Static libraries have a prefix of "lib" and the extension ".a". A typical @@ -565,6 +563,7 @@ TAB $(AR) $(ARFLAGS) $@ $(OBJECTS) TAB $(RANLIB) $@ + ### Shared Libraries Shared libraries have a prefix of "lib" and the extension ".dylib" or ".so" @@ -590,6 +589,7 @@ TAB $(LN) libname.$(DSOVERSION).dylib libname.$(DSOMAJOR).dylib TAB $(LN) libname.$(DSOVERSION).dylib libname.dylib + ### Dependencies Static dependencies are expressed in each makefile following the target, for @@ -605,8 +605,8 @@ depend: TAB $(CC) -MM $(ALL_CFLAGS) $(OBJS:.o=.c) >Dependencies -We regenerate the automatic dependencies on an macOS system and express any -non-macOS dependencies statically in the makefile. +We regenerate the automatic dependencies on an Ubuntu system and express any +non-Linux dependencies statically in the makefile. ### Install/Uninstall Support diff -Nru cups-2.3.3op2/INSTALL.md cups-2.4.1op1/INSTALL.md --- cups-2.3.3op2/INSTALL.md 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/INSTALL.md 2022-01-27 11:11:42.000000000 +0000 @@ -1,48 +1,35 @@ -INSTALL - CUPS v2.3.3op2 - 2021-02-01 -===================================== +Building and Installing OpenPrinting CUPS v2.4.1 +================================================ -This file describes how to compile and install CUPS from source code. For more -information on CUPS see the file called "README.md". A complete change log can -be found in "CHANGES.md". +This file describes how to compile and install CUPS from source code. For more +information on CUPS see the file called `README.md`. Using CUPS requires additional third-party support software and printer drivers. -These are typically included with your operating system distribution. Apple -does not endorse or support third-party support software for CUPS. +These are typically included with your operating system distribution. -> Note: Current versions of macOS DO NOT allow installation to /usr with the -> default System Integrity Protection (SIP) settings. In addition, we do not -> recommend replacing the CUPS supplied with macOS because: -> -> a. not all versions of CUPS are compatible with every macOS release, -> -> b. code signing prevents replacement of system libraries and access to the -> system keychain (needed for encrypted printer sharing), and -> -> c. software updates will often replace parts of your local installation, -> potentially rendering your system unusable. -> -> Apple only supports using the Clang supplied with Xcode to build CUPS on -> macOS. - -BEFORE YOU BEGIN +Before You Begin ---------------- You'll need ANSI-compliant C and C++ compilers, plus a make program and POSIX- compliant shell (/bin/sh). The GNU compiler tools and Bash work well and we -have tested the current CUPS code against several versions of GCC with excellent -results. +have tested the current CUPS code against several versions of Clang and GCC with +excellent results. -The makefiles used by the project should work with most versions of make. We've -tested them with GNU make as well as the make programs shipped by 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 ZLIB library for compression support, the GNU -TLS library for encryption support on platforms other than iOS, macOS, or -Windows, 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. +The makefiles used by the project should work with POSIX-compliant versions of +`make`. We've tested them with GNU make as well as several vendor make programs. +BSD users should use GNU make (`gmake`) since BSD make is not POSIX-compliant +and does not support the `include` directive. + +Besides these tools you'll want ZLIB for compression support, Avahi for mDNS +support, LIBUSB for USB printing support, the GNU TLS library for encryption +support on platforms other than iOS, macOS, or Windows, and PAM for +authentication support. CUPS will compile and run without these, however you'll +miss out on many of the features provided by CUPS. + +> Note: Kerberos support is deprecated starting with CUPS 2.4.0 and will be +> removed in a future version of CUPS. To build CUPS with Kerberos support, +> specify the "--enable-gssapi" configure option below. On a stock Ubuntu install, the following command will install the required prerequisites: @@ -51,12 +38,8 @@ libgnutls28-dev libkrb5-dev libnss-mdns libpam-dev \ libsystemd-dev libusb-1.0-0-dev zlib1g-dev -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 macOS. - -CONFIGURATION +Configuration ------------- CUPS uses GNU autoconf, so you should find the usual "configure" script in the @@ -71,17 +54,14 @@ ./configure --prefix=/some/directory -> Note: Current versions of macOS DO NOT allow installation to /usr with the -> default System Integrity Protection (SIP) settings. - To see a complete list of configuration options, use the `--help` option: ./configure --help If any of the dependent libraries are not installed in a system default location -(typically "/usr/include" and "/usr/lib") you'll need to set the CFLAGS, -CPPFLAGS, CXXFLAGS, DSOFLAGS, and LDFLAGS environment variables prior to running -configure: +(typically "/usr/include" and "/usr/lib") you'll need to set the `CFLAGS`, +`CPPFLAGS`, `CXXFLAGS`, `DSOFLAGS`, and `LDFLAGS` environment variables prior to +running configure: setenv CFLAGS "-I/some/directory" setenv CPPFLAGS "-I/some/directory" @@ -108,81 +88,72 @@ diagnose a variety of common problems - use the "--enable-unit-tests" configure option to run them at build time. -On macOS, 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 + make or if you have FreeBSD, NetBSD, or OpenBSD type: - gmake ENTER + gmake to build the software. -TESTING THE SOFTWARE +Testing the Software -------------------- Aside from the built-in unit tests, CUPS includes an automated test framework for testing the entire printing system. To run the tests, just type: - make test ENTER + make test or if you have FreeBSD, NetBSD, or OpenBSD type: - gmake test ENTER + gmake test The test framework runs a copy of the CUPS scheduler (cupsd) on port 8631 in -/tmp/cups-$USER and produces a nice HTML report of the results. +"/tmp/cups-$USER" and produces a nice HTML report of the results. -INSTALLING THE SOFTWARE +Installing the Software ----------------------- Once you have built the software you need to install it. The "install" target provides a quick way to install the software on your local system: - make install ENTER + make install or for FreeBSD, NetBSD, or OpenBSD: - gmake install ENTER + gmake install -Use the BUILDROOT variable to install to an alternate root directory: +Use the `BUILDROOT` variable to install to an alternate root directory: - make BUILDROOT=/some/other/root/directory install ENTER + make BUILDROOT=/some/other/root/directory install You can also build binary packages that can be installed on other machines using the RPM spec file ("packaging/cups.spec") or EPM list file ("packaging/cups.list"). The latter also supports building of binary RPMs, so it may be more convenient to use. -You can find the RPM software at: - - http://www.rpm.org/ - -The EPM software is available at: +You can find the RPM software at . - https://michaelrsweet.github.io/epm +The EPM software is available at . -CREATING BINARY DISTRIBUTIONS WITH EPM +Creating Binary Distributions With Epm -------------------------------------- The top level makefile supports generation of many types of binary distributions using EPM. To build a binary distribution type: - make ENTER + make FORMAT or - gmake ENTER + gmake FORMAT -for FreeBSD, NetBSD, and OpenBSD. The target is one of the following: +for FreeBSD, NetBSD, and OpenBSD. The "FORMAT" target is one of the following: - "epm": Builds a script + tarfile package - "bsd": Builds a *BSD package @@ -192,7 +163,7 @@ - "slackware": Build a Slackware package -GETTING DEBUG LOGGING FROM CUPS +Getting Debug Logging From CUPS ------------------------------- When configured with the `--enable-debug-printfs` option, CUPS compiles in @@ -208,20 +179,3 @@ the messages to stderr. Prefix a filename with "+" to append to an existing file. You can include a single "%d" in the filename to embed the current process ID. - - -REPORTING PROBLEMS ------------------- - -If you have problems, *read the documentation first*! If the documentation does -not solve your problems, please post a message on the users forum at: - - https://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 from the -configure script and make should also be sent, as it often helps to determine -the cause of your problem. - -If you are running a version of Linux, be sure to provide the Linux distribution -you have, too. diff -Nru cups-2.3.3op2/Makedefs.in cups-2.4.1op1/Makedefs.in --- cups-2.3.3op2/Makedefs.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/Makedefs.in 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ # # Common makefile definitions for CUPS. # +# Copyright © 2021 by OpenPrinting. # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products, all rights reserved. # @@ -34,7 +35,7 @@ LIBTOOL = @LIBTOOL@ LN = @LN@ -sf MKDIR = @MKDIR@ -p -MV = @MV@ +MV = @MV@ -f RANLIB = @RANLIB@ RM = @RM@ -f RMDIR = @RMDIR@ @@ -148,10 +149,10 @@ # ALL_CFLAGS = -I.. -D_CUPS_SOURCE $(CFLAGS) \ - $(SSLFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \ + $(TLSFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \ $(ONDEMANDFLAGS) $(OPTIONS) ALL_CXXFLAGS = -I.. -D_CUPS_SOURCE $(CXXFLAGS) \ - $(SSLFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \ + $(TLSFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \ $(ONDEMANDFLAGS) $(OPTIONS) ALL_DSOFLAGS = -L../cups @ARCHFLAGS@ @RELROFLAGS@ $(DSOFLAGS) $(OPTIM) ALL_LDFLAGS = -L../cups @LDARCHFLAGS@ @RELROFLAGS@ $(LDFLAGS) \ @@ -174,15 +175,15 @@ LDFLAGS = @LDFLAGS@ LINKCUPS = @LINKCUPS@ LINKCUPSSTATIC = ../cups/$(LIBCUPSSTATIC) $(LIBS) -LIBS = $(LIBGSSAPI) $(DNSSDLIBS) $(SSLLIBS) $(LIBZ) $(COMMONLIBS) +LIBS = $(LIBGSSAPI) $(DNSSDLIBS) $(TLSLIBS) $(LIBZ) $(COMMONLIBS) ONDEMANDFLAGS = @ONDEMANDFLAGS@ ONDEMANDLIBS = @ONDEMANDLIBS@ OPTIM = @OPTIM@ OPTIONS = @WARNING_OPTIONS@ PAMLIBS = @PAMLIBS@ -SERVERLIBS = @SERVERLIBS@ -SSLFLAGS = @SSLFLAGS@ -SSLLIBS = @SSLLIBS@ +SERVERLIBS = @SERVERLIBS@ @APPARMORLIBS@ @SNAPDGLIBLIBS@ +TLSFLAGS = @TLSFLAGS@ +TLSLIBS = @TLSLIBS@ UNITTESTS = @UNITTESTS@ @@ -213,7 +214,6 @@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ -privateinclude = @privateinclude@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -227,6 +227,7 @@ CACHEDIR = $(BUILDROOT)@CUPS_CACHEDIR@ DATADIR = $(BUILDROOT)@CUPS_DATADIR@ DOCDIR = $(BUILDROOT)@CUPS_DOCROOT@ +CUPS_PKGCONFPATH = $(BUILDROOT)@CUPS_PKGCONFPATH@ ICONDIR = @ICONDIR@ INCLUDEDIR = $(BUILDROOT)$(includedir) LIBDIR = $(BUILDROOT)$(libdir) @@ -234,7 +235,6 @@ LOGDIR = $(BUILDROOT)@CUPS_LOGDIR@ MANDIR = $(BUILDROOT)@mandir@ MENUDIR = @MENUDIR@ -PRIVATEINCLUDE = $(BUILDROOT)@PRIVATEINCLUDE@ RCLEVELS = @RCLEVELS@ RCSTART = @RCSTART@ RCSTOP = @RCSTOP@ diff -Nru cups-2.3.3op2/Makefile cups-2.4.1op1/Makefile --- cups-2.3.3op2/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ # # Top-level Makefile for CUPS. # -# Copyright © 2020 by Michael R Sweet +# Copyright © 2020-2022 by OpenPrinting # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products, all rights reserved. # @@ -103,10 +103,11 @@ $(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) cups.pc $(RM) desktop/cups.desktop $(RM) doc/index.html $(RM) packaging/cups.list - $(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) scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist scheduler/cups-lpdAT.service scheduler/cups.path scheduler/cups.service scheduler/cups.socket $(RM) templates/header.tmpl -$(RM) doc/*/index.html -$(RM) templates/*/header.tmpl @@ -173,6 +174,9 @@ echo Installing cups-config script... $(INSTALL_DIR) -m 755 $(BINDIR) $(INSTALL_SCRIPT) cups-config $(BINDIR)/cups-config + echo Installing cups.pc file... + $(INSTALL_DIR) -m 755 $(CUPS_PKGCONFPATH) + $(INSTALL_DATA) cups.pc $(CUPS_PKGCONFPATH)/cups.pc # @@ -225,6 +229,9 @@ echo Uninstalling cups-config script... $(RM) $(BINDIR)/cups-config -$(RMDIR) $(BINDIR) + echo Uninstalling cups.pc file... + $(RM) $(CUPS_PKGCONFPATH)/cups.pc + -$(RMDIR) $(CUPS_PKGCONFPATH) # diff -Nru cups-2.3.3op2/NOTICE cups-2.4.1op1/NOTICE --- cups-2.3.3op2/NOTICE 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/NOTICE 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,6 @@ CUPS -Copyright © 2020-2021 by Michael R Sweet +Copyright © 2020-2022 by OpenPrinting Copyright © 2007-2019 by Apple Inc. Copyright © 1997-2007 by Easy Software Products. diff -Nru cups-2.3.3op2/README.md cups-2.4.1op1/README.md --- cups-2.3.3op2/README.md 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/README.md 2022-01-27 11:11:42.000000000 +0000 @@ -1,38 +1,43 @@ -README - CUPS v2.3.3op2 - 2021-02-01 -==================================== +OpenPrinting CUPS v2.4.1 +======================== ![Version](https://img.shields.io/github/v/release/openprinting/cups?include_prereleases) ![Apache 2.0](https://img.shields.io/github/license/openprinting/cups) -[![Build and Test](https://github.com/OpenPrinting/cups/workflows/Build%20and%20Test/badge.svg)](https://github.com/OpenPrinting/cups/actions) +[![Build and Test](https://github.com/OpenPrinting/cups/workflows/Build%20and%20Test/badge.svg)](https://github.com/OpenPrinting/cups/actions/workflows/build.yml) +[![Coverity Scan](https://img.shields.io/coverity/scan/23806)](https://scan.coverity.com/projects/openprinting-cups) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/4ea68dc02692436b82541b6f232eba66)](https://www.codacy.com/gh/OpenPrinting/cups/dashboard?utm_source=github.com&utm_medium=referral&utm_content=OpenPrinting/cups&utm_campaign=Badge_Grade) +[![LGTM Grade](https://img.shields.io/lgtm/grade/cpp/github/OpenPrinting/cups)](https://lgtm.com/projects/g/OpenPrinting/cups/?mode=list) -> *Note:* This version of CUPS is being maintained by the OpenPrinting -> organization. It tracks the current Apple CUPS sources and includes common -> changes and bug fixes for the various Linux distributions and other UNIX®-like -> operating systems. - -INTRODUCTION +Introduction ------------ -CUPS is a standards-based, open source printing system developed by Apple Inc. -for macOS® and other UNIX®-like operating systems. CUPS uses the Internet -Printing Protocol ("IPP") and provides System V and Berkeley command-line -interfaces, a web interface, and a C API to manage printers and print jobs. It -supports printing to both local (parallel, serial, USB) and networked printers, -and printers can be shared from one computer to another, even over the Internet! - -Internally, CUPS uses PostScript Printer Description ("PPD") files to describe -printer capabilities and features and a wide variety of generic and device- -specific programs to convert and print many types of files. Sample drivers are -included with CUPS to support many Dymo, EPSON, HP, Intellitech, OKIDATA, and -Zebra printers. Many more drivers are available online and (in some cases) on -the driver CD-ROM that came with your printer. +OpenPrinting CUPS is the most current version of CUPS, a standards-based, open +source printing system for Linux® and other Unix®-like operating systems. CUPS +supports printing to: + +- [AirPrint™][1] and [IPP Everywhere™][2] printers, +- Network and local (USB) printers with Printer Applications, and +- Network and local (USB) printers with (legacy) PPD-based printer drivers. + +CUPS provides the System V ("lp") and Berkeley ("lpr") command-line interfaces, +a configurable web interface, a C API, and common print filters, drivers, and +backends for printing. The [cups-filters][3] project provides additional +filters and drivers. + +CUPS is licensed under the Apache License Version 2.0 with an exception to allow +linking against GNU GPL2-only software. See the files `LICENSE` and `NOTICE` +for more information. + +> Note: Apple maintains a separate repository for the CUPS that ships with macOS +> and iOS at . -CUPS is licensed under the Apache License Version 2.0. See the file -"LICENSE" for more information. +[1]: https://support.apple.com/en-us/HT201311 +[2]: https://www.pwg.org/ipp/everywhere.html +[3]: https://github.com/openprinting/cups-filters -READING THE DOCUMENTATION +Reading the Documentation ------------------------- Initial documentation to get you started is provided in the root directory of @@ -54,103 +59,94 @@ If you're having trouble getting that far, the documentation is located under the `doc/help` and `man` directories. -Please read the documentation before asking questions. +*Please read the documentation before asking questions.* -GETTING SUPPORT AND OTHER RESOURCES +Getting Support and Other Resources ----------------------------------- -If you have problems, *read the documentation first!* We also provide two -mailing lists which are available at . +In addition to the OpenPrinting CUPS home page at +, we provide a mailing list for CUPS users +and developers to ask questions and discuss issues at +. -See the CUPS web site at for other resources. - -SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER ------------------------------------------------- +Setting Up Printers +------------------- CUPS includes a web-based administration tool that allows you to manage printers, classes, and jobs on your server. Open -in your browser to access the printer administration tools: +in your browser to access the printer administration tools. You will be asked +for the administration password (root or any other user in the "sys", "system", +"root", "admin", or "lpadmin" group on your system) when performing any +administrative function. + +The `lpadmin` command is used to manage printers from the command-line. For +example, the following command creates a print queue called "myprinter" for an +IPP Everywhere printer at address "11.22.33.44": + + lpadmin -p myprinter -E -v "ipp://11.22.33.44/ipp/print" -m everywhere + +The `-p` option specifies the printer name. The `-E` option enables the printer +and accepts new print jobs immediately. The `-v` option specifies the *device +URI* for the printer, which tells CUPS how to communicate with the printer. And +the `-m` option specifies the model (driver) to use, in this case the IPP +Everywhere ("everywhere") driver that is used for AirPrint and IPP Everywhere +printers as well as shared printers and printers supported through Printer +Applications. + +Legacy printers are supported using PPD (PostScript Printer Description) files +that describe printer capabilities and driver programs needed for each printer. +CUPS includes several sample PPD files for common legacy printers: + + Driver | PPD Name + -----------------------------|------------------------------ + Dymo Label Printers | drv:///sample.drv/dymo.ppd + Intellitech Intellibar | drv:///sample.drv/intelbar.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 + Generic PostScript Printer | drv:///sample.drv/generic.ppd + HP DeskJet Series | drv:///sample.drv/deskjet.ppd + HP LaserJet Series | drv:///sample.drv/laserjet.ppd + OKIDATA 9-Pin Series | drv:///sample.drv/okidata9.ppd + OKIDATA 24-Pin Series | drv:///sample.drv/okidat24.ppd + Zebra CPCL Label Printer | drv:///sample.drv/zebracpl.ppd + Zebra EPL1 Label Printer | drv:///sample.drv/zebraep1.ppd + Zebra EPL2 Label Printer | drv:///sample.drv/zebraep2.ppd + Zebra ZPL Label Printer | drv:///sample.drv/zebra.ppd -*Do not* use the hostname for your machine - it will not work with the default -CUPS configuration. To enable administration access on other addresses, check -the `Allow Remote Administration` box and click on the `Change Settings` button. - -You will be asked for the administration password (root or any other user in the -"sys", "system", "root", "admin", or "lpadmin" group on your system) when -performing any administrative function. - - -SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE ------------------------------------------------ - -CUPS currently uses PPD (PostScript Printer Description) files that describe -printer capabilities and driver programs needed for each printer. The -`everywhere` PPD is used for nearly all modern networks printers sold since -about 2009. For example, the following command creates a print queue for a -printer at address "11.22.33.44": - - lpadmin -p printername -E -v ipp://11.22.33.44/ipp/print -m everywhere - -CUPS also includes several sample PPD files you can use for "legacy" printers: - - Driver | PPD Name - ----------------------------- | ------------------------------ - Dymo Label Printers | drv:///sample.drv/dymo.ppd - Intellitech Intellibar | drv:///sample.drv/intelbar.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 - Generic PostScript Printer | drv:///sample.drv/generic.ppd - HP DeskJet Series | drv:///sample.drv/deskjet.ppd - HP LaserJet Series | drv:///sample.drv/laserjet.ppd - OKIDATA 9-Pin Series | drv:///sample.drv/okidata9.ppd - OKIDATA 24-Pin Series | drv:///sample.drv/okidat24.ppd - Zebra CPCL Label Printer | drv:///sample.drv/zebracpl.ppd - Zebra EPL1 Label Printer | drv:///sample.drv/zebraep1.ppd - Zebra EPL2 Label Printer | drv:///sample.drv/zebraep2.ppd - Zebra ZPL Label Printer | drv:///sample.drv/zebra.ppd +The sample drivers provide basic printing capabilities, but generally do not +exercise the full potential of the printers or CUPS. Other drivers provide +greater printing capabilities. You can run the `lpinfo -m` command to list all of the available drivers: lpinfo -m -Run the `lpinfo -v` command to list the available printers: +Similarly, the `lpinfo -v` command lists the available printers and their device +URIs: lpinfo -v -Then use the correct URI to add the printer using the `lpadmin` command: - - lpadmin -p printername -E -v device-uri -m ppd-name +Once you know the device URI and driver name, add the printer using the +`lpadmin` command: -Current network printers typically use `ipp` or `ipps` URIS: + lpadmin -p PRINTER-NAME -E -v "DEVICE-URI" -m DRIVER-NAME - lpadmin -p printername -E -v ipp://11.22.33.44/ipp/print -m everywhere - lpadmin -p printername -E -v ipps://11.22.33.44/ipp/print -m everywhere -Older network printers typically use `socket` or `lpd` URIs: - - lpadmin -p printername -E -v socket://11.22.33.44 -m ppd-name - 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. Other drivers provide -greater printing capabilities. - - -PRINTING FILES +Printing Files -------------- CUPS provides both the System V `lp` and Berkeley `lpr` commands for printing: - lp filename - lpr filename + lp FILENAME + lpr FILENAME -Both the `lp` and `lpr` commands support printing options for the driver: +Both the `lp` and `lpr` commands support printing options: - lp -o media=A4 -o resolution=600dpi filename - lpr -o media=A4 -o resolution=600dpi filename + lp -o media=A4 -o resolution=600dpi FILENAME + lpr -o media=A4 -o resolution=600dpi FILENAME CUPS recognizes many types of images files as well as PDF, PostScript, and text files, so you can print those files directly rather than through an application. @@ -158,17 +154,19 @@ If you have an application that generates output specifically for your printer then you need to use the `-oraw` or `-l` options: - lp -o raw filename - lpr -l filename + lp -o raw FILENAME + lpr -l FILENAME This will prevent the filters from misinterpreting your print file. -LEGAL STUFF +Legal Stuff ----------- -Copyright © 2020-2021 by Michael R Sweet -Copyright © 2007-2019 by Apple Inc. +Copyright © 2020-2022 by OpenPrinting + +Copyright © 2007-2020 by Apple Inc. + Copyright © 1997-2007 by Easy Software Products. CUPS is provided under the terms of the Apache License, Version 2.0 with diff -Nru cups-2.3.3op2/SECURITY.md cups-2.4.1op1/SECURITY.md --- cups-2.3.3op2/SECURITY.md 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/SECURITY.md 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,121 @@ +Security Policy +=============== + +This file describes how security issues are reported and handled, and what the +expectations are for security issues reported to this project. + + +Responsible Disclosure +---------------------- + +With *responsible disclosure*, a security issue (and its fix) is disclosed only +after a mutually-agreed period of time (the "embargo date"). The issue and fix +are shared amongst and reviewed by the key stakeholders (Linux distributions, +OS vendors, etc.) and the CERT/CC. Fixes are released to the public on the +agreed-upon date. + +> Responsible disclosure applies only to production releases. A security +> vulnerability that only affects unreleased code can be fixed immediately +> without coordination. Vendors *should not* package and release unstable +> snapshots, beta releases, or release candidates of this software. + + +Supported Versions +------------------ + +All production releases of this software are subject to this security policy. A +production release is tagged and given a semantic version number of the form: + + MAJOR.MINOR.PATCH + +where "MAJOR" is an integer starting at 1 and "MINOR" and "PATCH" are integers +starting at 0. A feature release has a "PATCH" value of 0, for example: + + 1.0.0 + 1.1.0 + 2.0.0 + +Beta releases and release candidates are *not* prodution releases and use +semantic version numbers of the form: + + MAJOR.MINORbNUMBER + MAJOR.MINORrcNUMBER + +where "MAJOR" and "MINOR" identify the new feature release version number and +"NUMBER" identifies a beta or release candidate number starting at 1, for +example: + + 1.0b1 + 1.0b2 + 1.0rc1 + + +Reporting a Vulnerability +------------------------- + +Report all security issues to "security AT msweet.org". Expect a response +within 5 business days. Any proposed embargo date should be at least 30 days +and no more than 90 days in the future. + + +PGP Public Key +-------------- + +The following PGP public key can be used for signing security messages. + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- +Comment: GPGTools - https://gpgtools.org + +mQINBF6L0RgBEAC8FTqc/1Al+pWW+ULE0OB2qdbiA2NBjEm0X0WhvpjkqihS1Oih +ij3fzFxKJ+DgutQyDb4QFD8tCFL0f0rtNL1Iz8TtiAJjvlhL4kG5cdq5HYEchO10 +qFeZ1DqvnHXB4pbKouEQ7Q/FqB1PG+m6y2q1ntgW+VPKm/nFUWBCmhTQicY3FOEG +q9r90enc8vhQGOX4p01KR0+izI/g+97pWgMMj5N4zHuXV/GrPhlVgo3Wn1OfEuX4 +9vmv7GX4G17Me3E3LOo0c6fmPHJsrRG5oifLpvEJXVZW/RhJR3/pKMPSI5gW8Sal +lKAkNeV7aZG3U0DCiIVL6E4FrqXP4PPj1KBixtxOHqzQW8EJwuqbszNN3vp9w6jM +GvGtl8w5Qrw/BwnGC6Dmw+Qv04p9JRY2lygzZYcKuwZbLzBdC2CYy7P2shoKiymX +ARv+i+bUl6OmtDe2aYaqRkNDgJkpuVInBlMHwOyLP6fN2o7ETXQZ+0a1vQsgjmD+ +Mngkc44HRnzsIJ3Ga4WwW8ggnAwUzJ/DgJFYOSbRUF/djBT4/EFoU+/kjXRqq8/d +c8HjZtz2L27njmMw68/bYmY1TliLp50PXGzJA/KeY90stwKtTI0ufwAyi9i9BaYq +cGbdq5jnfSNMDdKW2kLCNTQeUWSSytMTsdU0Av3Jrv5KQF8x5GaXcpCOTwARAQAB +tExNaWNoYWVsIFN3ZWV0IChzZWN1cml0eUBtc3dlZXQub3JnKSAoU2VjdXJpdHkg +UEdQIEtleSkgPHNlY3VyaXR5QG1zd2VldC5vcmc+iQJUBBMBCgA+FiEEOElfSXYU +h91AF0sBpZiItz2feQIFAl6L0RgCGwMFCQeGH4AFCwkIBwMFFQoJCAsFFgIDAQAC +HgECF4AACgkQpZiItz2feQIhjhAAqZHuQJkPBsAKUvJtPiyunpR6JENTUIDxnVXG +nue+Zev+B7PzQ7C4CAx7vXwuWTt/BXoyQFKRUrm+YGiBTvLYQ8fPqudDnycSaf/A +n01Ushdlhyg1wmCBGHTgt29IkEZphNj6BebRd675RTOSD5y14jrqUb+gxRNuNDa5 +ZiZBlBE4A8TV6nvlCyLP5oXyTvKQRFCh4dEiL5ZvpoxnhNvJpSe1ohL8iJ9aeAd5 +JdakOKi8MmidRPYC5IldXwduW7VC7dtqSiPqT5aSN0GJ8nIhSpn/ZkOEAPHAtxxa +0VgjltXwUDktu74MUUghdg2vC1df2Z+PqHLsGEqOmxoBIJYXroIqSEpO3Ma7hz0r +Xg1AWHMR/xxiLXLxgaZRvTp7AlaNjbqww8JDG8g+nDIeGsgIwWN/6uPczledvDQa +HtlMfN97i+rt6sCu13UMZHpBKOGg7eAGRhgpOwpUqmlW1b+ojRHGkmZ8oJSE7sFT +gzSGNkmfVgA1ILl0mi8OBVZ4jlUg6EgVsiPlzolH92iscK7g50PdjzpQe0m3gmcL +dpOmSL8Fti05dPfamJzIvJd28kMZ6yMnACKj9rq/VpfgYBLK8dbNUjEOQ2oq7PyR +Ye/LE1OmAJwfZQkyQNI8yAFXoRJ8u3/bRb3SPvGGWquGBDKHv2K1XiCW65uyLe5B +RNJWmme5Ag0EXovRGAEQAJZMFeIMt/ocLskrp89ZyBTTiavFKn9+QW7C2Mb36A73 +J2g9vRFBSRizb+t8lSzP/T1GbKS0cEmfEpQppWImTbOMV6ZgxrM0IUy1Yd7Kyc0K +oNMZvykRYwVMzxB5hiQ88kCLfqTNCveIvu1xcB9pWkf+cuDmGCxA3I+yc3Eh/SOP +urDsHObt7fyEmJpSxCXlMFHRCuWyGXhMNvhR186t9mANW0PyxKJ8efr+2Vhm1+pA +Vk9JESac/lREvx9PVFmlPdqgqRkQ0TQB5+ROo9Wy77cxQr5+rvSZZff630I1YgZf +Ph6xOV1/q6vJ3RBNA2nPSTjPeeWQ7pTn7PZGJwCjIUjhMbO+EJVKUJNOAEg033mG +tLfbFUYdhA/dRgFuKz90loCMfsnf3e4o/TFydSHUuwBUtOWkL1BBWEbk95M/Zr00 +w5fD9knas1u5Lc4ogXzTFPnvJ6hM1RAFJEd+FYzJZIvzwrIx4Ag1DOKViVBpeLTu +HWj+xckEgvxEBglplALzfSIJ0CLQSNL8iMFbzCnPeUoQfPkqu37KHrB9syAA06Tb +qw1Ax0qBqKInGIgBd0w6dFLF3s04xVcPAXWyJ0w4I7h2bs+aD6YwwK6xxCtXxtN5 +Q1LQM8s3tKNXER3mZ8zfwgwjsdLVwhXhysFi6Dlkvk/Vrbn1QDfJnzq+F9LsGRGb +ABEBAAGJAjwEGAEKACYWIQQ4SV9JdhSH3UAXSwGlmIi3PZ95AgUCXovRGAIbDAUJ +B4YfgAAKCRClmIi3PZ95AhDZD/40fShzDS/smZZL0oXN4GgZ62FrXWBdLjontkXo +d8hDh1wJZwqsLVbtO2Gu0CPeH9GclQ3bYsR19sGMM4FDgjMu57O/TU6GZl2Ywcjh +ayhRTHyAq/BKZn71AM0N7LS8MdNTaLbTbzEu5oGbAmOVv5f0SUnQoGxbeF8ih5bo +hR3ZcORujWMgnymL3+cerNyIDQAtfMAUTfpVcwem4CvquA9Wjtur8YN1t+N7I3o2 +eMTNSyNUL9Yx3NxbyJ0yrrMvASo+ZVRaPW5+ET9Iqd68ILSY04Gnar3URJssggX8 ++cuyEbP9bAG8qYqcr2aSC2dW84mL/RnZGR//1dfS0Ugk6Osj0LSF5i+mz0CbIjYQ +PKgLlgpycuGZBC5kG3RWWfanM0HxPDx10a7vEWA1A5Q+csx4yi3CW/giC1zAdhUO +cJ1l4Uj/oxpGeLN7BnT/2NzU/px2fpbaG+xU4HlwjzFM2cIOUIohHFhdvFZbFIIA +mePqTBnEB3HtXYRTgMoYDXLWhlOXjyVnMR45WDfvEA3KqbAz6sNMtaOJ6rHBWnR1 +1YbpvDWUeaGSLXBoGyo3RgTrN9jON8lE/oUxFobnEdfZGD+uwIniylc5rw3+VkBU ++QGZDfgPgxjSmKsWq1cK6rNfBacGYrdyqf90VemEsvR8r0Ump0RPzBMlAAq0Xkup +WkiKlA== +=0GzT +-----END PGP PUBLIC KEY BLOCK----- +``` diff -Nru cups-2.3.3op2/backend/Makefile cups-2.4.1op1/backend/Makefile --- cups-2.3.3op2/backend/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ # # Backend makefile for CUPS. # -# Copyright 2007-2019 by Apple Inc. -# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# Copyright © 2021-2022 by OpenPrinting. +# Copyright © 2007-2019 by Apple Inc. +# Copyright © 1997-2007 by Easy Software Products, all rights reserved. # -# Licensed under Apache License v2.0. See the file "LICENSE" for more information. +# Licensed under Apache License v2.0. See the file "LICENSE" for more +# information. # include ../Makedefs @@ -15,19 +17,18 @@ # RBACKENDS are installed mode 0744 so cupsd will run them as root... # -# UBACKENDS and ULBACKENDS are installed mode 0755 so cupsd will run them as -# an unprivileged user... +# UBACKENDS are installed mode 0755 so cupsd will run them as an unprivileged +# user... # # See http://www.cups.org/doc/api-filter.html for more info... RBACKENDS = \ ipp \ lpd \ + usb \ $(DNSSD_BACKEND) UBACKENDS = \ snmp \ socket -ULBACKENDS = \ - usb UNITTESTS = \ test1284 \ testbackend \ @@ -35,8 +36,7 @@ TARGETS = \ libbackend.a \ $(RBACKENDS) \ - $(UBACKENDS) \ - $(ULBACKENDS) + $(UBACKENDS) LIBOBJS = \ ieee1284.o \ network.o \ @@ -65,7 +65,7 @@ # Make library targets... # -libs: $(ULBACKENDS) +libs: # @@ -161,18 +161,6 @@ # 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 # @@ -185,7 +173,7 @@ $(RM) $(SERVERBIN)/apple/$$file; \ done -$(RMDIR) $(SERVERBIN)/apple - for file in $(RBACKENDS) $(UBACKENDS) $(ULBACKENDS); do \ + for file in $(RBACKENDS) $(UBACKENDS); do \ $(RM) $(SERVERBIN)/backend/$$file; \ done for file in $(IPPALIASES); do \ diff -Nru cups-2.3.3op2/backend/backend-private.h cups-2.4.1op1/backend/backend-private.h --- cups-2.3.3op2/backend/backend-private.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/backend-private.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * Backend support definitions for CUPS. * - * Copyright © 2007-2014 by Apple Inc. + * Copyright © 2021 by OpenPrinting + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -53,6 +54,14 @@ /* + * Log messages in backend signal handlers or other places where stdio cannot + * be used... + */ + +# define backendMessage(msg) {const char *s = msg; write(2, s, strlen(s));} + + +/* * OID constants... */ @@ -320,7 +329,6 @@ extern int backendWaitLoop(int snmp_fd, http_addr_t *addr, int use_bc, _cups_sccb_t side_cb); - # ifdef __cplusplus } # endif /* __cplusplus */ diff -Nru cups-2.3.3op2/backend/dnssd.c cups-2.4.1op1/backend/dnssd.c --- cups-2.3.3op2/backend/dnssd.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/dnssd.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * DNS-SD discovery backend for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2008-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -13,9 +14,9 @@ #include "backend-private.h" #include -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER # include -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI # include # include @@ -44,9 +45,9 @@ typedef struct { -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceRef ref; /* Service reference for query */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI AvahiRecordBrowser *ref; /* Browser for query */ #endif /* HAVE_AVAHI */ @@ -81,10 +82,10 @@ * Local functions... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER static void browse_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context) _CUPS_NONNULL(1,5,6,7,8); static void browse_local_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context) _CUPS_NONNULL(1,5,6,7,8); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI static void browse_callback(AvahiServiceBrowser *browser, AvahiIfIndex interface, @@ -103,7 +104,7 @@ static int compare_devices(cups_device_t *a, cups_device_t *b); static void exec_backend(char **argv) _CUPS_NORETURN; static cups_device_t *get_device(cups_array_t *devices, const char *serviceName, const char *regtype, const char *replyDomain) _CUPS_NONNULL(1,2,3,4); -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER static void query_callback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullName, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) _CUPS_NONNULL(1,5,9,11); #elif defined(HAVE_AVAHI) static int poll_callback(struct pollfd *pollfds, @@ -118,7 +119,7 @@ size_t rdlen, AvahiLookupResultFlags flags, void *context); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ static void sigterm_handler(int sig); static void unquote(char *dst, const char *src, size_t dstsize) _CUPS_NONNULL(1,2); @@ -135,7 +136,7 @@ cups_array_t *devices; /* Device array */ cups_device_t *device; /* Current device */ char uriName[1024]; /* Unquoted fullName for URI */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER int fd; /* Main file descriptor */ fd_set input; /* Input set for select() */ struct timeval timeout; /* Timeout for select() */ @@ -152,7 +153,7 @@ pdl_datastream_ref, /* AppSocket service reference */ printer_ref, /* LPD service reference */ riousbprint_ref; /* Remote IO service reference */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI AvahiClient *client; /* Client information */ int error; /* Error code, if any */ @@ -216,7 +217,7 @@ * Browse for different kinds of printers... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER if (DNSServiceCreateConnection(&main_ref) != kDNSServiceErr_NoError) { perror("ERROR: Unable to create service connection"); @@ -277,7 +278,7 @@ riousbprint_ref = main_ref; DNSServiceBrowse(&riousbprint_ref, kDNSServiceFlagsShareConnection, 0, "_riousbprint._tcp", NULL, browse_callback, devices); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI if ((simple_poll = avahi_simple_poll_new()) == NULL) @@ -333,7 +334,7 @@ { int announce = 0; /* Announce printers? */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER FD_ZERO(&input); FD_SET(fd, &input); @@ -369,7 +370,7 @@ if (!got_data) announce = 1; -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ /* fprintf(stderr, "DEBUG: announce=%d\n", announce);*/ @@ -379,9 +380,9 @@ * Announce any devices we've found... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceErrorType status; /* DNS query status */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ cups_device_t *best; /* Best matching device */ char device_uri[1024]; /* Device URI */ int count; /* Number of queries */ @@ -408,7 +409,7 @@ { fprintf(stderr, "DEBUG: Querying \"%s\"...\n", device->fullName); -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER device->ref = main_ref; status = DNSServiceQueryRecord(&(device->ref), @@ -446,7 +447,7 @@ } else if (!device->sent) { -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER /* * Got the TXT records, now report the device... */ @@ -454,7 +455,7 @@ DNSServiceRefDeallocate(device->ref); #else avahi_record_browser_free(device->ref); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ device->ref = NULL; @@ -535,7 +536,7 @@ } -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER /* * 'browse_callback()' - Browse devices. */ @@ -618,7 +619,7 @@ device->fullName); device->sent = 1; } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI @@ -867,13 +868,13 @@ free(device->domain); device->domain = strdup(replyDomain); -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceConstructFullName(fullName, device->name, regtype, replyDomain); #else /* HAVE_AVAHI */ avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName, regtype, replyDomain); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ free(device->fullName); device->fullName = strdup(fullName); @@ -886,7 +887,12 @@ * Yes, add the device... */ - device = calloc(sizeof(cups_device_t), 1); + if ((device = calloc(sizeof(cups_device_t), 1)) == NULL) + { + perror("DEBUG: Out of memory adding a device"); + return (NULL); + } + device->name = strdup(serviceName); device->domain = strdup(replyDomain); device->type = key.type; @@ -898,11 +904,11 @@ * Set the "full name" of this service, which is used for queries... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain); #else /* HAVE_AVAHI */ avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName, regtype, replyDomain); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ device->fullName = strdup(fullName); @@ -944,8 +950,8 @@ #endif /* HAVE_AVAHI */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) -# ifdef HAVE_DNSSD +#ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER /* * 'query_callback()' - Process query data. */ @@ -986,7 +992,7 @@ { AvahiClient *client = avahi_record_browser_get_client(browser); /* Client information */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ char *ptr; /* Pointer into string */ cups_device_t *device = (cups_device_t *)context; /* Device */ @@ -1002,7 +1008,7 @@ device_id[2048]; /* 1284 device ID */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER fprintf(stderr, "DEBUG2: query_callback(sdRef=%p, flags=%x, " "interfaceIndex=%d, errorCode=%d, fullName=\"%s\", " "rrtype=%u, rrclass=%u, rdlen=%u, rdata=%p, ttl=%u, " @@ -1034,7 +1040,7 @@ return; } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ /* * Pull out the priority and make and model from the TXT @@ -1236,7 +1242,7 @@ else device->make_and_model = strdup(model); } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ /* diff -Nru cups-2.3.3op2/backend/ipp.c cups-2.4.1op1/backend/ipp.c --- cups-2.3.3op2/backend/ipp.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/ipp.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * IPP backend for CUPS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -256,6 +257,7 @@ 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? */ + validate_retried = 0, /* Was Validate-Job request retried? */ copies, /* Number of copies for job */ copies_remaining; /* Number of copies remaining */ const char *content_type, /* CONTENT_TYPE environment variable */ @@ -1429,7 +1431,7 @@ */ if (version == 10) - create_job = send_document = 0; + create_job = 0; /* * Start monitoring the printer in the background... @@ -1495,9 +1497,7 @@ * One or more options are not supported... */ - ipp_attribute_t *attr; /* Unsupported attribute */ - - if ((attr = ippFindAttribute(response, "sides", IPP_TAG_ZERO)) != NULL) + if (ippFindAttribute(response, "sides", IPP_TAG_ZERO)) { /* * The sides value is not supported, revert to one-sided as needed... @@ -1559,7 +1559,17 @@ ipp_status == IPP_STATUS_ERROR_BAD_REQUEST) break; else if (job_auth == NULL && ipp_status > IPP_STATUS_ERROR_BAD_REQUEST) + { + if (!validate_retried) + { + // Retry Validate-Job operation once, to work around known printer bug... + validate_retried = 1; + sleep(10); + continue; + } + goto cleanup; + } } /* @@ -2240,7 +2250,8 @@ else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED) fputs("JOBSTATE: account-authorization-failed\n", stderr); - if (job_canceled) + // job_canceled can be -1 which should not be treated as CUPS_BACKEND_OK + if (job_canceled > 0) return (CUPS_BACKEND_OK); else if (ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED || ipp_status == IPP_STATUS_ERROR_FORBIDDEN || ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED) return (CUPS_BACKEND_AUTH_REQUIRED); @@ -2817,8 +2828,6 @@ static const char * const allowed = "0123456789#*-+.()pw"; /* Allowed characters */ - destination = ippNew(); - /* * Unescape and filter out spaces and other characters that are not * allowed in a tel: URI. @@ -2851,6 +2860,8 @@ if (strlen(phone) > 0) { + destination = ippNew(); + 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); fprintf(stderr, "DEBUG: Faxing to phone %s; destination-uri: %s\n", phone, tel_uri); @@ -3232,7 +3243,8 @@ const char *device_uri, /* I - Device URI */ int fd) /* I - File to print */ { - const char *auth_negotiate;/* AUTH_NEGOTIATE env var */ + const char *auth_negotiate,/* AUTH_NEGOTIATE env var */ + *content_type; /* [FINAL_]CONTENT_TYPE env vars */ xpc_connection_t conn; /* Connection to XPC service */ xpc_object_t request; /* Request message dictionary */ __block xpc_object_t response; /* Response message dictionary */ @@ -3295,6 +3307,10 @@ getenv("AUTH_INFO_REQUIRED")); if ((auth_negotiate = getenv("AUTH_NEGOTIATE")) != NULL) xpc_dictionary_set_string(request, "auth-negotiate", auth_negotiate); + if ((content_type = getenv("CONTENT_TYPE")) != NULL) + xpc_dictionary_set_string(request, "content-type", content_type); + if ((content_type = getenv("FINAL_CONTENT_TYPE")) != NULL) + xpc_dictionary_set_string(request, "final-content-type", content_type); xpc_dictionary_set_fd(request, "stdin", fd); xpc_dictionary_set_fd(request, "stderr", 2); xpc_dictionary_set_fd(request, "side-channel", CUPS_SC_FD); @@ -3417,7 +3433,7 @@ { (void)sig; /* remove compiler warnings... */ - write(2, "DEBUG: Got SIGTERM.\n", 20); + backendMessage("DEBUG: Got SIGTERM.\n"); #if defined(HAVE_GSSAPI) && defined(HAVE_XPC) if (child_pid) @@ -3433,7 +3449,7 @@ * Flag that the job should be canceled... */ - write(2, "DEBUG: sigterm_handler: job_canceled = 1.\n", 25); + backendMessage("DEBUG: sigterm_handler: job_canceled = 1.\n"); job_canceled = 1; return; diff -Nru cups-2.3.3op2/backend/org.cups.usb-quirks cups-2.4.1op1/backend/org.cups.usb-quirks --- cups-2.3.3op2/backend/org.cups.usb-quirks 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/org.cups.usb-quirks 2022-01-27 11:11:42.000000000 +0000 @@ -68,7 +68,7 @@ # Canon, Inc. PIXMA iP6000D Printer (https://bugs.launchpad.net/bugs/1160638) 0x04a9 0x1095 unidir -# Canon, Inc. PIXMA iP4200 Printer (Issue #4155) +# Canon, Inc. PIXMA iP4200 Printer (Apple #4155) 0x04a9 0x10a2 unidir # Canon, Inc. PIXMA iP4300 Printer (https://bugs.launchpad.net/bugs/1032385) @@ -77,22 +77,76 @@ # Canon, Inc. MP210 (https://bugzilla.redhat.com/show_bug.cgi?id=847923#c53) 0x04a9 0x1721 unidir +# Canon, Inc. MP220 Printer +0x04a9 0x1722 unidir + +# Canon, Inc. MP230 Printer +0x04a9 0x175f unidir + +# Canon, Inc. MP240 Printer (https://github.com/agalakhov/captdriver/issues/7#issuecomment-890380405) +0x04a9 0x1732 unidir + +# Canon, Inc. MP250 Printer +0x04a9 0x173a unidir + +# Canon, Inc. MP260 Printer +0x04a9 0x1733 unidir + +# Canon, Inc. MP270 Printer +0x04a9 0x173b unidir + +# Canon, Inc. MP280 series (Apple #5221) +0x04a9 0x1746 unidir + +# Canon PIXMA MP410 +0x04a9 0x1702 unidir + +# Canon PIXMA MP430 +0x04a9 0x1703 unidir + +# Canon PIXMA MP450 +0x04a9 0x170b unidir + +# Canon PIXMA MP460 +0x04a9 0x1716 unidir + +# Canon PIXMA MP470 +0x04a9 0x1723 unidir + +# Canon PIXMA MP480 (Issue #192) +0x04a9 0x1731 unidir + +# Canon PIXMA MP490 +0x04a9 0x173c unidir + +# Canon PIXMA MP493 +0x04a9 0x1757 unidir + +# Canon PIXMA MP495 +0x04a9 0x1747 unidir + # Canon, Inc. MP500 Printer (https://bugs.launchpad.net/bugs/1032456) 0x04a9 0x170c unidir # Canon, Inc. MP510 Printer (https://bugs.launchpad.net/bugs/1050009) 0x04a9 0x1717 unidir +# Canon, Inc. MP520 Printer +0x04a9 0x1724 unidir + +# Canon, Inc. MP530 Printer +0x04a9 0x1712 unidir + # Canon, Inc. MP540 Printer, https://bugzilla.redhat.com/967873 0x04a9 0x1730 unidir -# Canon, Inc. MP550 Printer (Issue #4155) +# Canon, Inc. MP550 Printer (Apple #4155) 0x04a9 0x173d unidir -# Canon, Inc. MP560 Printer (Issue #4155) +# Canon, Inc. MP560 Printer (Apple #4155) 0x04a9 0x173e unidir -# Canon, Inc. PIXMA G1501 Printer (Issue #5831) +# Canon, Inc. PIXMA G1501 Printer (Apple #5831) 0x04a9 0x1796 unidir # Canon, Inc. MF4150 Printer (https://bugs.launchpad.net/bugs/1160638) @@ -140,10 +194,13 @@ # All Samsung devices (https://bugs.launchpad.net/bugs/1032456) 0x04e8 soft-reset +# Samsung SCX-3405W works without quirks (https://github.com/OpenPrinting/cups/issues/270) +0x04e8 0x344f whitelist + # Samsung ML-2160 Series (https://bugzilla.redhat.com/show_bug.cgi?id=873123) 0x04e8 0x330f unidir -# All Zebra devices (https://bugs.launchpad.net/bugs/1001028) (Issue #5395) +# All Zebra devices (https://bugs.launchpad.net/bugs/1001028) (Apple #5395) 0x0a5f unidir no-reattach # Canon CP-10 @@ -233,81 +290,84 @@ # Lexmark E238 () 0x043d 0x00d7 no-reattach -# Lexmark E238 (Issue #4448) +# Lexmark E238 (Apple #4448) 0x043d 0x009a no-reattach -# Canon MX310 (Issue #4482) +# Canon MX310 (Apple #4482) 0x04a9 0x1728 unidir -# Canon MX320 (Issue #4482) +# Canon MX320 (Apple #4482) 0x04A9 0x1736 unidir -# All Intermec devices (Issue #4553) +# All Intermec devices (Apple #4553) 0x067e no-reattach -# HP LaserJet 1010 (Issue #5789) +# HP LaserJet 1010 (Apple #5789) 0x03f0 0x0c17 delay-close -# HP LaserJet 1015 (Issue #5617) +# HP LaserJet 1015 (Apple #5617) 0x03f0 0x0e17 delay-close -# HP LaserJet 1150 (Issue #4549) +# HP LaserJet 1150 (Apple #4549) 0x03f0 0x0f17 delay-close -# HP LaserJet 1300 (Issue #4549) +# HP LaserJet 1300 (Apple #4549) 0x03f0 0x1017 delay-close 0x03f0 0x1117 delay-close -# HP LaserJet 1320 (Issue #4549) +# HP LaserJet 1320 (Apple #4549) 0x03f0 0x1d17 delay-close # Canon, Inc. MP530 Printer 0x04a9 0x1712 unidir -# Xerox WorkCentre 3220 (https://bugs.launchpad.net/bugs/1406203, Issue #4789) +# Xerox WorkCentre 3220 (https://bugs.launchpad.net/bugs/1406203, Apple #4789) 0x0924 0x4294 no-reattach -# Lexmark C540n (Issue #4778) +# Lexmark C540n (Apple #4778) 0x043d 0x0139 no-reattach -# Kyocera Ecosys P6026cdn (Issue #4900) +# Kyocera Ecosys P6026cdn (Apple #4900) 0x0482 0x063f no-reattach -# Kyocera Ecosys P6130cdn (Issue #5102) +# Kyocera Ecosys P6130cdn (Apple #5102) 0x0482 0x0677 no-reattach -# Lexmark E260dn (Issue #4994) +# Lexmark E260dn (Apple #4994) 0x043d 0x0123 no-reattach -# HP LaserJet 1160 (Issue #5121) +# HP LaserJet 1160 (Apple #5121) 0x03f0 0x1e17 delay-close -# Canon, Inc. MP280 series (Issue #5221) -0x04a9 0x1746 unidir - -# Star Micronics printers (Issue #5251) +# Star Micronics printers (Apple #5251) 0x0519 unidir -# Lexmark Optra E310 (Issue #5259) +# Lexmark Optra E310 (Apple #5259) 0x043d 0x000c no-reattach -# HP LaserJet P1102 (Issue #5310) +# HP LaserJet P1102 (Apple #5310) 0x03F0 0x002A no-reattach # Lexmark MS317dn 0x043d 0x0226 no-reattach -# Star TSP743 (Issue #5443) +# Star TSP743 (Apple #5443) 0x0519 0x0001 delay-close -# Lexmark E120n (Issue #5478) +# Lexmark E120n (Apple #5478) 0x043d 0x00cc no-reattach -# All Xerox printers (Issue #5523) -0x0924 no-reattach +# Lexmark E120n MT4506-100 (Apple #5766) +0x043d 0x00cd no-reattach -# Dymo 450 Turbo (Issue #5521) -0x0922 0x0021 unidir +# All Xerox printers (Apple #5523) +0x0924 no-reattach -# Citizen CT-S4000 (Issue #5823) +# Citizen CT-S4000 (Apple #5823) 0x2730 0x2008 unidir delay-close + +# All Arkscan label printers (Apple #5867) +0x2d84 unidir no-reattach + +# HP DesignJet 130 (Apple #5838) +0x03f0 0x0314 no-reattach diff -Nru cups-2.3.3op2/backend/snmp.c cups-2.4.1op1/backend/snmp.c --- cups-2.3.3op2/backend/snmp.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/snmp.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * SNMP discovery backend for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2014 by Apple Inc. * Copyright © 2006-2007 by Easy Software Products, all rights reserved. * @@ -295,7 +296,12 @@ addr, addrname, uri ? uri : "(null)", id ? id : "(null)", make_and_model ? make_and_model : "(null)"); - temp = calloc(1, sizeof(snmp_cache_t)); + if ((temp = calloc(1, sizeof(snmp_cache_t))) == NULL) + { + perror("DEBUG: Unable to allocate cache entry"); + return; + } + memcpy(&(temp->address), addr, sizeof(temp->address)); temp->addrname = strdup(addrname); @@ -424,7 +430,7 @@ #endif /* !HAVE_SIGSET && !HAVE_SIGACTION */ if (DebugLevel) - write(2, "DEBUG: ALARM!\n", 14); + backendMessage("DEBUG: ALARM!\n"); } @@ -613,22 +619,25 @@ return (NULL); for (addr = addrs, first = NULL, last = NULL; addr; addr = addr->ifa_next) + { if ((addr->ifa_flags & IFF_BROADCAST) && addr->ifa_broadaddr && addr->ifa_broadaddr->sa_family == AF_INET && (!ifname || !strcmp(ifname, addr->ifa_name))) { - current = calloc(1, sizeof(http_addrlist_t)); - - memcpy(&(current->addr), addr->ifa_broadaddr, - sizeof(struct sockaddr_in)); + if ((current = calloc(1, sizeof(http_addrlist_t))) != NULL) + { + memcpy(&(current->addr), addr->ifa_broadaddr, + sizeof(struct sockaddr_in)); + + if (!last) + first = current; + else + last->next = current; - if (!last) - first = current; - else - last->next = current; - - last = current; + last = current; + } } + } freeifaddrs(addrs); diff -Nru cups-2.3.3op2/backend/testbackend.c cups-2.4.1op1/backend/testbackend.c --- cups-2.3.3op2/backend/testbackend.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/testbackend.c 2022-01-27 11:11:42.000000000 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include "backend-private.h" /* @@ -395,7 +396,7 @@ data = ps_data; write(1, data, strlen(data)); - write(2, "DEBUG: START\n", 13); + backendMessage("DEBUG: START\n"); timeout = 60.0; while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), timeout)) > 0) @@ -403,7 +404,7 @@ write(2, buffer, (size_t)bytes); timeout = 5.0; } - write(2, "\nDEBUG: END\n", 12); + backendMessage("\nDEBUG: END\n"); } exit(0); diff -Nru cups-2.3.3op2/backend/usb-darwin.c cups-2.4.1op1/backend/usb-darwin.c --- cups-2.3.3op2/backend/usb-darwin.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/usb-darwin.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,5 +1,7 @@ /* - * Copyright 2005-2016 Apple Inc. All rights reserved. + * USB backend for macOS. + * + * Copyright © 2005-2021 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 @@ -288,11 +290,11 @@ #define IS_64BIT 1 #define IS_NOT_64BIT 0 -#if defined(__i386__) || defined(__x86_64__) +#if defined(__arm64e__) static pid_t child_pid; /* Child PID */ -static void run_legacy_backend(int argc, char *argv[], int fd) _CUPS_NORETURN; /* Starts child backend process running as a ppc executable */ -#endif /* __i386__ || __x86_64__ */ -static void sigterm_handler(int sig); /* SIGTERM handler */ +static void run_legacy_backend(int argc, char *argv[], int fd) _CUPS_NORETURN; /* Starts child backend process running as a x86_64 executable */ +static void sigterm_handler(int sig); /* SIGTERM handler */ +#endif /* __arm64e__ */ static void sigquit_handler(int sig, siginfo_t *si, void *unused) _CUPS_NORETURN; #ifdef PARSE_PS_ERRORS @@ -357,6 +359,8 @@ (void)uri; + (void)argc; + (void)argv; /* * Catch SIGQUIT to determine who is sending it... @@ -436,18 +440,18 @@ status = registry_open(&driverBundlePath); -#if defined(__i386__) || defined(__x86_64__) +#if defined(__arm64e__) /* * If we were unable to load the class drivers for this printer it's - * probably because they're ppc or i386. In this case try to run this - * backend as i386 or ppc executables so we can use them... + * probably because they're x86_64 (or older). In this case try to run this + * backend as x86_64 so we can use them... */ if (status == -2) { run_legacy_backend(argc, argv, print_fd); /* Never returns here */ } -#endif /* __i386__ || __x86_64__ */ +#endif /* __arm64e__ */ if (status == -2) { @@ -1510,12 +1514,11 @@ SInt32 score; kern_return_t kr; printer_interface_t interface; - HRESULT res; kr = IOCreatePlugInInterfaceForService(g.printer_obj, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score); if (kr == kIOReturnSuccess) { - if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) &interface)) == noErr) + if ((*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) &interface) == noErr) { *driverBundlePath = IORegistryEntryCreateCFProperty(g.printer_obj, kUSBClassDriverProperty, NULL, kNilOptions); @@ -1596,7 +1599,7 @@ /* This request takes the 0 based configuration index. IOKit returns a 1 based configuration index */ configurationIndex -= 1; - bzero(&request, sizeof(request)); + memset(&request, 0, sizeof(request)); request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBClass, kUSBInterface); request.bRequest = kUSBPrintClassGetDeviceID; @@ -1613,14 +1616,14 @@ if (actualLength > 2 && actualLength <= bufferLength - 2) { - ret = CFStringCreateWithBytes(NULL, (const UInt8 *) &request.pData[2], actualLength - 2, kCFStringEncodingUTF8, false); + 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); + ret = CFStringCreateWithBytes(NULL, (const UInt8 *)request.pData + 2, actualLength - 2, kCFStringEncodingUTF8, false); } } } @@ -1638,7 +1641,7 @@ IOUSBDevRequestTO request; IOUSBDeviceDescriptor desc; - bzero(&request, sizeof(request)); + memset(&request, 0, sizeof(request)); request.bmRequestType = USBmakebmRequestType( kUSBIn, kUSBStandard, kUSBDevice ); request.bRequest = kUSBRqGetDescriptor; @@ -1667,41 +1670,59 @@ CFStringAppendFormat(extras, NULL, CFSTR("MDL:%@;"), model); } - if (serial == NULL && desc.iSerialNumber != 0) + if (desc.iSerialNumber != 0) { - serial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish); - if (serial && CFStringGetLength(serial) > 0) - CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), serial); + // Always look at the USB serial number since some printers + // incorrectly include a bogus static serial number in their + // IEEE-1284 device ID string... + CFStringRef userial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish); + if (userial && CFStringGetLength(userial) > 0 && (serial == NULL || CFStringCompare(serial, userial, kCFCompareCaseInsensitive) != kCFCompareEqualTo)) + { + if (serial != NULL) + { + // 1284 serial number doesn't match USB serial number, so replace the existing SERN: in device ID + CFRange range = CFStringFind(ret, serial, 0); + CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret); + CFStringReplace(deviceIDString, range, userial); + CFRelease(ret); + ret = deviceIDString; + + CFRelease(serial); + } + else + { + // No 1284 serial number so add SERN: with USB serial number to device ID + CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), userial); + } + serial = userial; + } + else if (userial != NULL) + CFRelease(userial); } if (ret != NULL) { CFStringAppend(extras, ret); CFRelease(ret); - - ret = extras; - } - else - { - ret = extras; } + 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); + /* 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); + CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret); + CFRelease(ret); - ret = deviceIDString; - CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0); - } + ret = deviceIDString; + CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0); + } } if (manufacturer != NULL) @@ -1728,7 +1749,7 @@ UInt8 description[256]; // Max possible descriptor length IOUSBDevRequestTO request; - bzero(description, 2); + memset(description, 0, 2); request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice); request.bRequest = kUSBRqGetDescriptor; @@ -1742,7 +1763,7 @@ err = (*printer)->ControlRequestTO(printer, 0, &request); if (err != kIOReturnSuccess && err != kIOReturnOverrun) { - bzero(description, request.wLength); + memset(description, 0, 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 @@ -1775,7 +1796,7 @@ request.wValue = (kUSBStringDesc << 8) | index; request.wIndex = language; - bzero(description, length); + memset(description, 0, length); request.wLength = (UInt16)length; request.pData = &description; request.completionTimeout = 0; @@ -1791,7 +1812,7 @@ if ((description[0] & 1) != 0) description[0] &= 0xfe; - char buffer[258] = {}; + char buffer[258] = {0}; unsigned int maxLength = sizeof buffer; if (description[0] > 1) { @@ -2053,11 +2074,11 @@ } #pragma mark - -#if defined(__i386__) || defined(__x86_64__) +#if defined(__arm64e__) /*! * @function run_legacy_backend * - * @abstract Starts child backend process running as a ppc or i386 executable. + * @abstract Starts child backend process running as a x86_64 executable. * * @result Never returns; always calls exit(). * @@ -2076,18 +2097,14 @@ /* - * 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 - * mode to try again. If we don't have a ppc or i386 architecture we may be + * If we're running as ARM and couldn't load the class driver + * (because it's x86_64, i386 or ppc), then try to re-exec ourselves in x86_64 + * mode to try again. If we don't have that architecture we may be * running with the same architecture again so guard against this by setting * and testing an environment variable... */ -# ifdef __x86_64__ - usb_legacy_status = getenv("USB_I386_STATUS"); -# else - usb_legacy_status = getenv("USB_PPC_STATUS"); -# endif /* __x86_64__ */ + usb_legacy_status = getenv("USB_LEGACY_STATUS"); if (!usb_legacy_status) { @@ -2116,21 +2133,13 @@ * Set the environment variable... */ -# ifdef __x86_64__ - setenv("USB_I386_STATUS", "1", false); -# else - setenv("USB_PPC_STATUS", "1", false); -# endif /* __x86_64__ */ + setenv("USB_LEGACY_STATUS", "1", false); /* * Tell the kernel to use the specified CPU architecture... */ -# ifdef __x86_64__ - cpu_type_t cpu = CPU_TYPE_I386; -# else - cpu_type_t cpu = CPU_TYPE_POWERPC; -# endif /* __x86_64__ */ + cpu_type_t cpu = CPU_TYPE_X86_64; size_t ocount = 1; posix_spawnattr_t attrs; @@ -2139,11 +2148,7 @@ posix_spawnattr_setsigdefault(&attrs, &oldmask); if (posix_spawnattr_setbinpref_np(&attrs, 1, &cpu, &ocount) || ocount != 1) { -# ifdef __x86_64__ - perror("DEBUG: Unable to set binary preference to i386"); -# else - perror("DEBUG: Unable to set binary preference to ppc"); -# endif /* __x86_64__ */ + perror("DEBUG: Unable to set binary preference to X86_64"); _cupsLangPrintFilter(stderr, "ERROR", _("Unable to use legacy USB class driver.")); exit(CUPS_BACKEND_STOP); @@ -2217,8 +2222,6 @@ exit(exitstatus); } -#endif /* __i386__ || __x86_64__ */ - /* * 'sigterm_handler()' - SIGTERM handler. @@ -2227,7 +2230,6 @@ static void sigterm_handler(int sig) /* I - Signal */ { -#if defined(__i386__) || defined(__x86_64__) /* * If we started a child process pass the signal on to it... */ @@ -2249,12 +2251,12 @@ _exit(0); else { - write(2, "DEBUG: Child crashed.\n", 22); + backendMessage("DEBUG: Child crashed.\n"); _exit(CUPS_BACKEND_STOP); } } -#endif /* __i386__ || __x86_64__ */ } +#endif /* __arm64e__ */ /* diff -Nru cups-2.3.3op2/backend/usb-libusb.c cups-2.4.1op1/backend/usb-libusb.c --- cups-2.3.3op2/backend/usb-libusb.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/backend/usb-libusb.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * LIBUSB interface code for CUPS. * - * Copyright 2007-2019 by Apple Inc. + * Copyright © 2021 by OpenPrinting. + * Copyright © 2007-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. @@ -1259,9 +1260,10 @@ const char *mfg, /* Manufacturer */ *mdl, /* Model */ *des = NULL, /* Description */ - *sern; /* Serial number */ + *sern = NULL; /* Serial number */ size_t mfglen; /* Length of manufacturer string */ - char tempmfg[256], /* Temporary manufacturer string */ + char tempmdl[256], /* Temporary model string */ + tempmfg[256], /* Temporary manufacturer string */ tempsern[256], /* Temporary serial number string */ *tempptr; /* Pointer into temp string */ @@ -1272,33 +1274,61 @@ num_values = _cupsGet1284Values(device_id, &values); - if ((sern = cupsGetOption("SERIALNUMBER", num_values, values)) == NULL) - if ((sern = cupsGetOption("SERN", num_values, values)) == NULL) - if ((sern = cupsGetOption("SN", num_values, values)) == NULL && - ((libusb_get_device_descriptor(printer->device, &devdesc) >= 0) && - devdesc.iSerialNumber)) - { - /* - * Try getting the serial number from the device itself... - */ + memset(&devdesc, 0, sizeof(devdesc)); - int length = - libusb_get_string_descriptor_ascii(printer->handle, - devdesc.iSerialNumber, - (unsigned char *)tempsern, - sizeof(tempsern) - 1); - if (length > 0) - { - tempsern[length] = '\0'; - sern = tempsern; - } - } + if (libusb_get_device_descriptor(printer->device, &devdesc) >= 0 && devdesc.iSerialNumber) + { + // Try getting the serial number from the device itself... + int length = libusb_get_string_descriptor_ascii(printer->handle, devdesc.iSerialNumber, (unsigned char *)tempsern, sizeof(tempsern) - 1); + if (length > 0) + { + tempsern[length] = '\0'; + sern = tempsern; + + fprintf(stderr, "DEBUG2: iSerialNumber=\"%s\"\n", tempsern); + } + else + fputs("DEBUG2: iSerialNumber could not be read.\n", stderr); + } + else + fputs("DEBUG2: iSerialNumber is not present.\n", stderr); + +#if 0 + if (!sern) + { + // Fall back on serial number from IEEE-1284 device ID, which on some + // printers (Issue #170) is a bogus hardcoded number. + if ((sern = cupsGetOption("SERIALNUMBER", num_values, values)) == NULL) + if ((sern = cupsGetOption("SERN", num_values, values)) == NULL) + sern = cupsGetOption("SN", num_values, values); + } +#endif // 0 if ((mfg = cupsGetOption("MANUFACTURER", num_values, values)) == NULL) - mfg = cupsGetOption("MFG", num_values, values); + { + if ((mfg = cupsGetOption("MFG", num_values, values)) == NULL && devdesc.iManufacturer) + { + int length = libusb_get_string_descriptor_ascii(printer->handle, devdesc.iManufacturer, (unsigned char *)tempmfg, sizeof(tempmfg) - 1); + if (length > 0) + { + tempmfg[length] = '\0'; + mfg = tempmfg; + } + } + } if ((mdl = cupsGetOption("MODEL", num_values, values)) == NULL) - mdl = cupsGetOption("MDL", num_values, values); + { + if ((mdl = cupsGetOption("MDL", num_values, values)) == NULL && devdesc.iProduct) + { + int length = libusb_get_string_descriptor_ascii(printer->handle, devdesc.iProduct, (unsigned char *)tempmdl, sizeof(tempmdl) - 1); + if (length > 0) + { + tempmdl[length] = '\0'; + mdl = tempmdl; + } + } + } /* * To maintain compatibility with the original character device backend on @@ -1704,7 +1734,7 @@ readstatus = libusb_bulk_transfer(g.printer->handle, g.printer->read_endp, readbuffer, rbytes, - &rbytes, 250); + &rbytes, 60000); if (readstatus == LIBUSB_SUCCESS && rbytes > 0) { fprintf(stderr, "DEBUG: Read %d bytes of back-channel data...\n", (int)rbytes); @@ -1721,7 +1751,8 @@ * Make sure this loop executes no more than once every 250 miliseconds... */ - if ((g.wait_eof || !g.read_thread_stop)) + if ((readstatus != LIBUSB_SUCCESS || rbytes == 0) && + (g.wait_eof || !g.read_thread_stop)) usleep(250000); } while (g.wait_eof || !g.read_thread_stop); diff -Nru cups-2.3.3op2/berkeley/lpc.c cups-2.4.1op1/berkeley/lpc.c --- cups-2.3.3op2/berkeley/lpc.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/berkeley/lpc.c 2022-01-27 11:11:42.000000000 +0000 @@ -21,6 +21,7 @@ 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_prompt(const char *message); static void show_status(http_t *, const char *); @@ -59,7 +60,7 @@ * Do the command prompt thing... */ - _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no-newline version */ + show_prompt(_("lpc> ")); while (fgets(line, sizeof(line), stdin) != NULL) { /* @@ -87,7 +88,7 @@ * Nothing left, just show a prompt... */ - _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no newline version */ + show_prompt(_("lpc> ")); continue; } @@ -123,7 +124,7 @@ * Put another prompt out to the user... */ - _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no newline version */ + show_prompt(_("lpc> ")); } } @@ -200,6 +201,30 @@ } +/* + * 'show_prompt()' - Show a localized prompt message. + */ + +static void +show_prompt(const char *message) /* I - Message string to use */ +{ + ssize_t bytes; /* Number of bytes formatted */ + char output[8192]; /* Message buffer */ + cups_lang_t *lang = cupsLangDefault(); + /* Default language */ + + /* + * Transcode to the destination charset and write the prompt... + */ + + if ((bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)_cupsLangString(lang, message), sizeof(output), lang->encoding)) > 0) + { + fwrite(output, 1, (size_t)bytes, stdout); + fflush(stdout); + } +} + + /* * 'show_status()' - Show printers. */ diff -Nru cups-2.3.3op2/berkeley/lpq.c cups-2.4.1op1/berkeley/lpq.c --- cups-2.3.3op2/berkeley/lpq.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/berkeley/lpq.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * "lpq" command for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * @@ -77,14 +78,14 @@ switch (*opt) { case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); if (http) httpEncryption(http, HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'U' : /* Username */ diff -Nru cups-2.3.3op2/berkeley/lpr.c cups-2.4.1op1/berkeley/lpr.c --- cups-2.3.3op2/berkeley/lpr.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/berkeley/lpr.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * "lpr" command for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * @@ -68,11 +69,11 @@ switch (ch = *opt) { case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'U' : /* Username */ diff -Nru cups-2.3.3op2/berkeley/lprm.c cups-2.4.1op1/berkeley/lprm.c --- cups-2.3.3op2/berkeley/lprm.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/berkeley/lprm.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * "lprm" command for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * @@ -65,11 +66,11 @@ switch (*opt) { case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'P' : /* Cancel jobs on a printer */ diff -Nru cups-2.3.3op2/cgi-bin/admin.c cups-2.4.1op1/cgi-bin/admin.c --- cups-2.3.3op2/cgi-bin/admin.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cgi-bin/admin.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * Administration CGI for CUPS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -50,7 +51,6 @@ 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); /* @@ -619,6 +619,7 @@ *oldinfo; /* Old printer information */ const cgi_file_t *file; /* Uploaded file, if any */ const char *var; /* CGI variable */ + char *ppd_name = NULL; /* Pointer to PPD name */ char uri[HTTP_MAX_URI], /* Device or printer URI */ *uriptr, /* Pointer into URI */ evefile[1024] = ""; /* IPP Everywhere PPD file */ @@ -1124,12 +1125,10 @@ if (!file) { - var = cgiGetVariable("PPD_NAME"); - if (!strcmp(var, "everywhere")) - get_printer_ppd(cgiGetVariable("DEVICE_URI"), evefile, sizeof(evefile)); - else if (strcmp(var, "__no_change__")) + ppd_name = cgiGetVariable("PPD_NAME"); + if (strcmp(ppd_name, "__no_change__")) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name", - NULL, var); + NULL, ppd_name); } ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", @@ -1219,7 +1218,7 @@ cgiCopyTemplateLang("printer-modified.tmpl"); } - else + else if (ppd_name && (strcmp(ppd_name, "everywhere") == 0 || strstr(ppd_name, "driverless"))) { /* * Set the printer options... @@ -1229,6 +1228,16 @@ do_set_options(http, 0); return; } + else + { + /* + * If we don't have an everywhere model, show printer-added + * template with warning about drivers going away... + */ + + cgiStartHTML(title); + cgiCopyTemplateLang("printer-added.tmpl"); + } cgiEndHTML(); } @@ -1440,52 +1449,40 @@ * Settings *have* changed, so save the changes... */ - cupsFreeOptions(num_settings, settings); + int num_newsettings;/* New number of server settings */ + cups_option_t *newsettings; /* New server settings */ - num_settings = 0; - num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, - debug_logging, num_settings, &settings); - num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, - remote_admin, num_settings, &settings); - num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, - remote_any, num_settings, &settings); - num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, - share_printers, num_settings, &settings); - num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, - user_cancel_any, num_settings, &settings); + num_newsettings = 0; + num_newsettings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, debug_logging, num_newsettings, &newsettings); + num_newsettings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, remote_admin, num_newsettings, &newsettings); + num_newsettings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, remote_any, num_newsettings, &newsettings); + num_newsettings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, share_printers, num_newsettings, &newsettings); + num_newsettings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, user_cancel_any, num_newsettings, &newsettings); #ifdef HAVE_GSSAPI - num_settings = cupsAddOption("DefaultAuthType", default_auth_type, - num_settings, &settings); + num_newsettings = cupsAddOption("DefaultAuthType", default_auth_type, num_newsettings, &newsettings); #endif /* HAVE_GSSAPI */ if (advanced) { /* - * Add advanced settings... + * Add advanced newsettings... */ if (_cups_strcasecmp(browse_web_if, current_browse_web_if)) - num_settings = cupsAddOption("BrowseWebIF", browse_web_if, - num_settings, &settings); + num_newsettings = cupsAddOption("BrowseWebIF", browse_web_if, num_newsettings, &newsettings); if (_cups_strcasecmp(preserve_job_history, current_preserve_job_history)) - num_settings = cupsAddOption("PreserveJobHistory", - preserve_job_history, num_settings, - &settings); + num_newsettings = cupsAddOption("PreserveJobHistory", preserve_job_history, num_newsettings, &newsettings); if (_cups_strcasecmp(preserve_job_files, current_preserve_job_files)) - num_settings = cupsAddOption("PreserveJobFiles", preserve_job_files, - num_settings, &settings); + num_newsettings = cupsAddOption("PreserveJobFiles", preserve_job_files, num_newsettings, &newsettings); if (_cups_strcasecmp(max_clients, current_max_clients)) - num_settings = cupsAddOption("MaxClients", max_clients, num_settings, - &settings); + num_newsettings = cupsAddOption("MaxClients", max_clients, num_newsettings, &newsettings); if (_cups_strcasecmp(max_jobs, current_max_jobs)) - num_settings = cupsAddOption("MaxJobs", max_jobs, num_settings, - &settings); + num_newsettings = cupsAddOption("MaxJobs", max_jobs, num_newsettings, &newsettings); if (_cups_strcasecmp(max_log_size, current_max_log_size)) - num_settings = cupsAddOption("MaxLogSize", max_log_size, num_settings, - &settings); + num_newsettings = cupsAddOption("MaxLogSize", max_log_size, num_newsettings, &newsettings); } - if (!cupsAdminSetServerSettings(http, num_settings, settings)) + if (!cupsAdminSetServerSettings(http, num_newsettings, newsettings)) { if (cupsLastError() == IPP_NOT_AUTHORIZED) { @@ -1509,6 +1506,8 @@ cgiStartHTML(cgiText(_("Change Settings"))); cgiCopyTemplateLang("restart.tmpl"); } + + cupsFreeOptions(num_newsettings, newsettings); } else { @@ -2272,7 +2271,7 @@ ipp_t *request, /* IPP request */ *response; /* IPP response */ char uri[HTTP_MAX_URI]; /* Printer URI */ - const char *printer, /* Printer name (purge-jobs) */ + const char *printer, /* Printer name */ *is_class, /* Is a class? */ *users, /* List of users or groups */ *type; /* Allow/deny type */ @@ -2537,7 +2536,7 @@ const char *title; /* Page title */ ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI]; /* Printer URI */ - const char *printer, /* Printer name (purge-jobs) */ + const char *printer, /* Printer name */ *is_class; /* Is a class? */ @@ -3735,82 +3734,3 @@ else /* Points */ return (number); } - - -/* - * '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 */ - static const char * const pattrs[] = /* Printer attributes we need */ - { - "all", - "media-col-database" - }; - - - /* - * 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); - ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); - 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); -} diff -Nru cups-2.3.3op2/cgi-bin/ipp-var.c cups-2.4.1op1/cgi-bin/ipp-var.c --- cups-2.3.3op2/cgi-bin/ipp-var.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cgi-bin/ipp-var.c 2022-01-27 11:11:42.000000000 +0000 @@ -271,10 +271,7 @@ */ if ((user = getenv("REMOTE_USER")) == NULL) - { - puts("Status: 401\n"); - exit(0); - } + user = "guest"; /* * See if the user has already selected a new destination... diff -Nru cups-2.3.3op2/cgi-bin/jobs.c cups-2.4.1op1/cgi-bin/jobs.c --- cups-2.3.3op2/cgi-bin/jobs.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cgi-bin/jobs.c 2022-01-27 11:11:42.000000000 +0000 @@ -138,7 +138,7 @@ * * attributes-charset * attributes-natural-language - * job-uri or printer-uri (purge-jobs) + * job-uri * requesting-user-name */ diff -Nru cups-2.3.3op2/cgi-bin/template.c cups-2.4.1op1/cgi-bin/template.c --- cups-2.3.3op2/cgi-bin/template.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cgi-bin/template.c 2022-01-27 11:11:42.000000000 +0000 @@ -33,7 +33,6 @@ { FILE *in; /* Input file */ - fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out, tmpl ? tmpl : "(null)"); @@ -51,7 +50,7 @@ if ((in = fopen(tmpl, "r")) == NULL) { fprintf(stderr, "ERROR: Unable to open template file \"%s\" - %s\n", - tmpl ? tmpl : "(null)", strerror(errno)); + tmpl, strerror(errno)); return; } @@ -91,8 +90,6 @@ * Convert the language to a locale name... */ - locale[0] = '\0'; - if ((lang = getenv("LANG")) != NULL) { locale[0] = '/'; @@ -101,6 +98,10 @@ if ((locptr = strchr(locale, '.')) != NULL) *locptr = '\0'; /* Strip charset */ } + else + { + locale[0] = '\0'; + } fprintf(stderr, "DEBUG2: lang=\"%s\", locale=\"%s\"...\n", lang ? lang : "(null)", locale); diff -Nru cups-2.3.3op2/cgi-bin/var.c cups-2.4.1op1/cgi-bin/var.c --- cups-2.3.3op2/cgi-bin/var.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cgi-bin/var.c 2022-01-27 11:11:42.000000000 +0000 @@ -304,7 +304,7 @@ if (boundary) boundary += 9; - if (content_type && !strncmp(content_type, "multipart/form-data; ", 21)) + if (!strncmp(content_type, "multipart/form-data; ", 21)) { if (!cgi_initialize_multipart(boundary)) return (0); diff -Nru cups-2.3.3op2/conf/cgi.types cups-2.4.1op1/conf/cgi.types --- cups-2.3.3op2/conf/cgi.types 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/conf/cgi.types 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1 @@ +application/x-httpd-cgi cgi php diff -Nru cups-2.3.3op2/conf/cups-files.conf.in cups-2.4.1op1/conf/cups-files.conf.in --- cups-2.3.3op2/conf/cups-files.conf.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/conf/cups-files.conf.in 2022-01-27 11:11:42.000000000 +0000 @@ -49,12 +49,6 @@ # directive in cupsd.conf. ErrorLog @CUPS_LOGDIR@/error_log -# Location of fonts used by older print filters... -#FontPath @CUPS_FONTPATH@ - -# Location of LPD configuration -#LPDConfigFile @CUPS_DEFAULT_LPD_CONFIG_FILE@ - # Location of the file logging all pages printed by the scheduler and any # helper programs; may be the name "syslog". If not an absolute path, the value # of ServerRoot is used as the root directory. Also see the "PageLogFormat" @@ -81,9 +75,6 @@ # Location of other configuration files... #ServerRoot @CUPS_SERVERROOT@ -# Location of Samba configuration file... -#SMBConfigFile @CUPS_DEFAULT_SMB_CONFIG_FILE@ - # Location of scheduler state files... #StateDir @CUPS_STATEDIR@ diff -Nru cups-2.3.3op2/conf/cupsd.conf.in cups-2.4.1op1/conf/cupsd.conf.in --- cups-2.3.3op2/conf/cupsd.conf.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/conf/cupsd.conf.in 2022-01-27 11:11:42.000000000 +0000 @@ -19,7 +19,7 @@ @CUPS_LISTEN_DOMAINSOCKET@ # Show shared printers on the local network. -Browsing On +Browsing @CUPS_BROWSING@ BrowseLocalProtocols @CUPS_BROWSE_LOCAL_PROTOCOLS@ # Default authentication type, when authentication is required... @@ -28,6 +28,9 @@ # Web interface setting... WebInterface @CUPS_WEBIF@ +# Timeout after cupsd exits if idle (applied only if cupsd runs on-demand - with -l) +IdleExitTimeout @EXIT_TIMEOUT@ + # Restrict access to the server... Order allow,deny diff -Nru cups-2.3.3op2/config-scripts/cups-common.m4 cups-2.4.1op1/config-scripts/cups-common.m4 --- cups-2.3.3op2/config-scripts/cups-common.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-common.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ dnl dnl Common configuration stuff for CUPS. dnl +dnl Copyright © 2021-2022 by OpenPrinting. dnl Copyright © 2007-2019 by Apple Inc. dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved. dnl @@ -9,21 +10,22 @@ dnl dnl Set the name of the config header file... -AC_CONFIG_HEADER(config.h) +AC_CONFIG_HEADERS([config.h]) dnl Version number information... CUPS_VERSION="AC_PACKAGE_VERSION" -CUPS_REVISION="" +CUPS_API_VERSION="$(echo AC_PACKAGE_VERSION | awk -F. '{print $1 "." $2}')" CUPS_BUILD="cups-$CUPS_VERSION" -AC_ARG_WITH(cups_build, [ --with-cups-build set "cups-config --build" string ], - CUPS_BUILD="$withval") - -AC_SUBST(CUPS_VERSION) -AC_SUBST(CUPS_REVISION) -AC_SUBST(CUPS_BUILD) -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") +AC_ARG_WITH([cups_build], AS_HELP_STRING([--with-cups-build], [set "pkg-config --variable=build" string]), [ + CUPS_BUILD="$withval" +]) + +AC_SUBST([CUPS_API_VERSION]) +AC_SUBST([CUPS_BUILD]) +AC_SUBST([CUPS_VERSION]) +AC_DEFINE_UNQUOTED([CUPS_SVERSION], ["AC_PACKAGE_NAME v$CUPS_VERSION"], [Version number]) +AC_DEFINE_UNQUOTED([CUPS_MINIMAL], ["AC_PACKAGE_NAME/$CUPS_VERSION"], [Version for HTTP headers]) dnl Default compiler flags... CFLAGS="${CFLAGS:=}" @@ -33,263 +35,283 @@ dnl Checks for programs... AC_PROG_AWK -AC_PROG_CC(clang cc gcc) +AC_PROG_CC AC_PROG_CPP -AC_PROG_CXX(clang++ c++ g++) +AC_PROG_CXX AC_PROG_RANLIB -AC_PATH_PROG(AR,ar) -AC_PATH_PROG(CHMOD,chmod) -AC_PATH_PROG(GZIPPROG,gzip) -AC_MSG_CHECKING(for install-sh script) +AC_PATH_PROG([AR], [ar]) +AC_PATH_PROG([CHMOD], [chmod]) +AC_PATH_PROG([GZIPPROG], [gzip]) +AC_MSG_CHECKING([for install-sh script]) INSTALL="`pwd`/install-sh" -AC_SUBST(INSTALL) -AC_MSG_RESULT(using $INSTALL) -AC_PATH_PROG(LD,ld) -AC_PATH_PROG(LN,ln) -AC_PATH_PROG(MKDIR,mkdir) -AC_PATH_PROG(MV,mv) -AC_PATH_PROG(RM,rm) -AC_PATH_PROG(RMDIR,rmdir) -AC_PATH_PROG(SED,sed) -AC_PATH_PROG(XDGOPEN,xdg-open) - -if test "x$XDGOPEN" = x; then - CUPS_HTMLVIEW="htmlview" -else - CUPS_HTMLVIEW="$XDGOPEN" -fi -AC_SUBST(CUPS_HTMLVIEW) - -if test "x$AR" = x; then - AC_MSG_ERROR([Unable to find required library archive command.]) -fi -if test "x$CC" = x; then - AC_MSG_ERROR([Unable to find required C compiler command.]) -fi +AC_SUBST([INSTALL]) +AC_MSG_RESULT([using $INSTALL]) +AC_PATH_PROG([LD], [ld]) +AC_PATH_PROG([LN], [ln]) +AC_PATH_PROG([MKDIR], [mkdir]) +AC_PATH_PROG([MV], [mv]) +AC_PATH_PROG([RM], [rm]) +AC_PATH_PROG([RMDIR], [rmdir]) +AC_PATH_PROG([SED], [sed]) +AC_PATH_PROG([XDGOPEN], [xdg-open]) + +AS_IF([test "x$XDGOPEN" = x], [ + CUPS_HTMLVIEW="htmlview" +], [ + CUPS_HTMLVIEW="$XDGOPEN" +]) +AC_SUBST([CUPS_HTMLVIEW]) + +AS_IF([test "x$AR" = x], [ + AC_MSG_ERROR([Unable to find required library archive command.]) +]) +AS_IF([test "x$CC" = x], [ + AC_MSG_ERROR([Unable to find required C compiler command.]) +]) dnl Static library option... INSTALLSTATIC="" -AC_ARG_ENABLE(static, [ --enable-static install static libraries]) +AC_ARG_ENABLE([static], AS_HELP_STRING([--enable-static], [install static libraries])) -if test x$enable_static = xyes; then - echo Installing static libraries... - INSTALLSTATIC="installstatic" -fi +AS_IF([test x$enable_static = xyes], [ + AC_MSG_NOTICE([Installing static libraries...]) + INSTALLSTATIC="installstatic" +]) -AC_SUBST(INSTALLSTATIC) +AC_SUBST([INSTALLSTATIC]) dnl Check for pkg-config, which is used for some other tests later on... -AC_PATH_TOOL(PKGCONFIG, pkg-config) +AC_PATH_TOOL([PKGCONFIG], [pkg-config]) +PKGCONFIG_CFLAGS="" +PKGCONFIG_LIBS="" +PKGCONFIG_LIBS_STATIC="" +PKGCONFIG_REQUIRES="" +AC_SUBST([PKGCONFIG_CFLAGS]) +AC_SUBST([PKGCONFIG_LIBS]) +AC_SUBST([PKGCONFIG_LIBS_STATIC]) +AC_SUBST([PKGCONFIG_REQUIRES]) dnl Check for libraries... -AC_SEARCH_LIBS(abs, m, AC_DEFINE(HAVE_ABS)) -AC_SEARCH_LIBS(crypt, crypt) -AC_SEARCH_LIBS(fmod, m) -AC_SEARCH_LIBS(getspent, sec gen) +AC_SEARCH_LIBS([abs], [m], [AC_DEFINE(HAVE_ABS)]) +AC_SEARCH_LIBS([crypt], [crypt]) +AC_SEARCH_LIBS([fmod], [m]) +AC_SEARCH_LIBS([getspent], [sec gen]) LIBMALLOC="" -AC_ARG_ENABLE(mallinfo, [ --enable-mallinfo build with malloc debug logging]) +AC_ARG_ENABLE([mallinfo], AS_HELP_STRING([--enable-mallinfo], [build with malloc debug logging])) -if test x$enable_mallinfo = xyes; then - SAVELIBS="$LIBS" - LIBS="" - AC_SEARCH_LIBS(mallinfo, malloc, AC_DEFINE(HAVE_MALLINFO)) - LIBMALLOC="$LIBS" - LIBS="$SAVELIBS" -fi +AS_IF([test x$enable_mallinfo = xyes], [ + SAVELIBS="$LIBS" + LIBS="" + AC_SEARCH_LIBS([mallinfo], [malloc], [AC_DEFINE(HAVE_MALLINFO)]) + LIBMALLOC="$LIBS" + LIBS="$SAVELIBS" +]) -AC_SUBST(LIBMALLOC) +AC_SUBST([LIBMALLOC]) dnl Check for libpaper support... -AC_ARG_ENABLE(libpaper, [ --enable-libpaper build with libpaper support]) +AC_ARG_ENABLE([libpaper], AS_HELP_STRING([--enable-libpaper], [build with libpaper support])) -if test x$enable_libpaper = xyes; then - AC_CHECK_LIB(paper,systempapername, - AC_DEFINE(HAVE_LIBPAPER) - LIBPAPER="-lpaper", - LIBPAPER="") -else +AS_IF([test x$enable_libpaper = xyes], [ + AC_CHECK_LIB([paper], [systempapername], [ + AC_DEFINE([HAVE_LIBPAPER], [1], [Have paper library?]) + LIBPAPER="-lpaper" + ], [ LIBPAPER="" -fi -AC_SUBST(LIBPAPER) + ]) +], [ + LIBPAPER="" +]) +AC_SUBST([LIBPAPER]) dnl Checks for header files. -AC_HEADER_STDC -AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H)) -AC_CHECK_HEADER(crypt.h,AC_DEFINE(HAVE_CRYPT_H)) -AC_CHECK_HEADER(langinfo.h,AC_DEFINE(HAVE_LANGINFO_H)) -AC_CHECK_HEADER(malloc.h,AC_DEFINE(HAVE_MALLOC_H)) -AC_CHECK_HEADER(shadow.h,AC_DEFINE(HAVE_SHADOW_H)) -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(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([crypt.h], AC_DEFINE([HAVE_CRYPT_H], [1], [Have header?])) +AC_CHECK_HEADER([langinfo.h], AC_DEFINE([HAVE_LANGINFO_H], [1], [Have header?])) +AC_CHECK_HEADER([malloc.h], AC_DEFINE([HAVE_MALLOC_H], [1], [Have header?])) +AC_CHECK_HEADER([shadow.h], AC_DEFINE([HAVE_SHADOW_H], [1], [Have header?])) +AC_CHECK_HEADER([stdint.h], AC_DEFINE([HAVE_STDINT_H], [1], [Have header?])) +AC_CHECK_HEADER([sys/ioctl.h], AC_DEFINE([HAVE_SYS_IOCTL_H], [1], [Have header?])) +AC_CHECK_HEADER([sys/param.h], AC_DEFINE([HAVE_SYS_PARAM_H], [1], [Have header?])) +AC_CHECK_HEADER([sys/ucred.h], AC_DEFINE([HAVE_SYS_UCRED_H], [1], [Have header?])) dnl Checks for iconv.h and iconv_open -AC_CHECK_HEADER(iconv.h, - SAVELIBS="$LIBS" - LIBS="" - 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") +AC_CHECK_HEADER([iconv.h], [ + SAVELIBS="$LIBS" + LIBS="" + AC_SEARCH_LIBS([iconv_open], [iconv], [ + AC_DEFINE([HAVE_ICONV_H], [1], [Have header?]) + SAVELIBS="$SAVELIBS $LIBS" + ]) + AC_SEARCH_LIBS([libiconv_open], [iconv], [ + AC_DEFINE([HAVE_ICONV_H], [1], [Have header?]) + SAVELIBS="$SAVELIBS $LIBS" + ]) + LIBS="$SAVELIBS" +]) dnl Checks for statfs and its many headers... -AC_CHECK_HEADER(sys/mount.h,AC_DEFINE(HAVE_SYS_MOUNT_H)) -AC_CHECK_HEADER(sys/statfs.h,AC_DEFINE(HAVE_SYS_STATFS_H)) -AC_CHECK_HEADER(sys/statvfs.h,AC_DEFINE(HAVE_SYS_STATVFS_H)) -AC_CHECK_HEADER(sys/vfs.h,AC_DEFINE(HAVE_SYS_VFS_H)) -AC_CHECK_FUNCS(statfs statvfs) +AC_CHECK_HEADER([sys/mount.h], AC_DEFINE([HAVE_SYS_MOUNT_H], [1], [Have header?])) +AC_CHECK_HEADER([sys/statfs.h], AC_DEFINE([HAVE_SYS_STATFS_H], [1], [Have header?])) +AC_CHECK_HEADER([sys/statvfs.h], AC_DEFINE([HAVE_SYS_STATVFS_H], [1], [Have header?])) +AC_CHECK_HEADER([sys/vfs.h], AC_DEFINE([HAVE_SYS_VFS_H], [1], [Have header?])) +AC_CHECK_FUNCS([statfs statvfs]) dnl Checks for string functions. -AC_CHECK_FUNCS(strdup strlcat strlcpy) -if test "$host_os_name" = "hp-ux" -a "$host_os_version" = "1020"; then - echo Forcing snprintf emulation for HP-UX. -else - AC_CHECK_FUNCS(snprintf vsnprintf) -fi +dnl TODO: Remove strdup, snprintf, and vsnprintf checks since they are C99? +AC_CHECK_FUNCS([strdup snprintf vsnprintf]) +AC_CHECK_FUNCS([strlcat strlcpy]) dnl Check for random number functions... -AC_CHECK_FUNCS(random lrand48 arc4random) +AC_CHECK_FUNCS([random lrand48 arc4random]) dnl Check for geteuid function. -AC_CHECK_FUNCS(geteuid) +AC_CHECK_FUNCS([geteuid]) dnl Check for setpgid function. -AC_CHECK_FUNCS(setpgid) +AC_CHECK_FUNCS([setpgid]) dnl Check for vsyslog function. -AC_CHECK_FUNCS(vsyslog) +AC_CHECK_FUNCS([vsyslog]) dnl Checks for signal functions. -case "$host_os_name" in - linux* | gnu*) - # Do not use sigset on Linux or GNU HURD - ;; - *) - # Use sigset on other platforms, if available - AC_CHECK_FUNCS(sigset) - ;; -esac +AS_CASE(["$host_os_name"], [linux* | gnu*], [ + # Do not use sigset on Linux or GNU HURD +], [*], [ + # Use sigset on other platforms, if available + AC_CHECK_FUNCS([sigset]) +]) -AC_CHECK_FUNCS(sigaction) +AC_CHECK_FUNCS([sigaction]) dnl Checks for wait functions. -AC_CHECK_FUNCS(waitpid wait3) +AC_CHECK_FUNCS([waitpid wait3]) dnl Check for posix_spawn -AC_CHECK_FUNCS(posix_spawn) +AC_CHECK_FUNCS([posix_spawn]) dnl Check for getgrouplist -AC_CHECK_FUNCS(getgrouplist) +AC_CHECK_FUNCS([getgrouplist]) 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 ],[struct tm t; - int o = t.tm_gmtoff;], - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_TM_GMTOFF), - AC_MSG_RESULT(no)) +AC_MSG_CHECKING([for tm_gmtoff member in tm structure]) +AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[ + struct tm t; + int o = t.tm_gmtoff; + ]]) +], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_TM_GMTOFF], [1], [Have tm_gmtoff member in struct tm?]) +], [ + AC_MSG_RESULT([no]) +]) dnl See if the stat structure has the st_gen member... -AC_MSG_CHECKING(for st_gen member in stat structure) -AC_TRY_COMPILE([#include ],[struct stat t; - int o = t.st_gen;], - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_ST_GEN), - AC_MSG_RESULT(no)) +AC_MSG_CHECKING([for st_gen member in stat structure]) +AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[ + struct stat t; + int o = t.st_gen; + ]]) +], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_ST_GEN], [1], [Have st_gen member in struct stat?]) +], [ + AC_MSG_RESULT([no]) +]) dnl See if we have the removefile(3) function for securely removing files -AC_CHECK_FUNCS(removefile) +AC_CHECK_FUNCS([removefile]) dnl See if we have libusb... -AC_ARG_ENABLE(libusb, [ --enable-libusb use libusb for USB printing]) +AC_ARG_ENABLE([libusb], AS_HELP_STRING([--enable-libusb], [use libusb for USB printing])) LIBUSB="" USBQUIRKS="" -AC_SUBST(LIBUSB) -AC_SUBST(USBQUIRKS) +AC_SUBST([LIBUSB]) +AC_SUBST([USBQUIRKS]) -if test "x$PKGCONFIG" != x; then - if test x$enable_libusb != xno -a $host_os_name != darwin; then - AC_MSG_CHECKING(for libusb-1.0) - if $PKGCONFIG --exists libusb-1.0; then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_LIBUSB) - CFLAGS="$CFLAGS `$PKGCONFIG --cflags libusb-1.0`" - LIBUSB="`$PKGCONFIG --libs libusb-1.0`" - 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 - AC_MSG_ERROR(Need pkg-config to enable libusb support.) -fi +AS_IF([test "x$PKGCONFIG" != x], [ + AS_IF([test x$enable_libusb != xno -a $host_os_name != darwin], [ + AC_MSG_CHECKING([for libusb-1.0]) + AS_IF([$PKGCONFIG --exists libusb-1.0], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_LIBUSB], [1], [Have usb library?]) + CFLAGS="$CFLAGS $($PKGCONFIG --cflags libusb-1.0)" + LIBUSB="$($PKGCONFIG --libs libusb-1.0)" + USBQUIRKS="\$(DATADIR)/usb" + ], [ + AC_MSG_RESULT([no]) + AS_IF([test x$enable_libusb = xyes], [ + AC_MSG_ERROR([libusb required for --enable-libusb.]) + ]) + ]) + ]) +], [test x$enable_libusb = xyes], [ + AC_MSG_ERROR([Need pkg-config to enable libusb support.]) +]) dnl See if we have libwrap for TCP wrappers support... -AC_ARG_ENABLE(tcp_wrappers, [ --enable-tcp-wrappers use libwrap for TCP wrappers support]) +AC_ARG_ENABLE([tcp_wrappers], AS_HELP_STRING([--enable-tcp-wrappers], [use libwrap for TCP wrappers support])) LIBWRAP="" -AC_SUBST(LIBWRAP) +AC_SUBST([LIBWRAP]) -if test x$enable_tcp_wrappers = xyes; then - AC_CHECK_LIB(wrap, hosts_access,[ - AC_CHECK_HEADER(tcpd.h, - AC_DEFINE(HAVE_TCPD_H) - LIBWRAP="-lwrap")]) -fi +AS_IF([test x$enable_tcp_wrappers = xyes], [ + AC_CHECK_LIB([wrap], [hosts_access], [ + AC_CHECK_HEADER([tcpd.h], [ + AC_DEFINE([HAVE_TCPD_H], [1], [Have header?]) + LIBWRAP="-lwrap" + ]) + ]) +]) dnl ZLIB INSTALL_GZIP="" LIBZ="" -AC_CHECK_HEADER(zlib.h, - AC_CHECK_LIB(z, gzgets,[ - AC_DEFINE(HAVE_LIBZ) +AC_CHECK_HEADER([zlib.h], [ + AC_CHECK_LIB([z], [gzgets], [ + AC_DEFINE([HAVE_LIBZ], [1], [Have zlib library?]) LIBZ="-lz" LIBS="$LIBS -lz" - AC_CHECK_LIB(z, inflateCopy, AC_DEFINE(HAVE_INFLATECOPY)) - if test "x$GZIPPROG" != x; then - INSTALL_GZIP="-z" - fi])) -AC_SUBST(INSTALL_GZIP) -AC_SUBST(LIBZ) + AC_CHECK_LIB([z], [inflateCopy], [ + AC_DEFINE([HAVE_INFLATECOPY], [1], [Have inflateCopy function?]) + ]) + AS_IF([test "x$GZIPPROG" != x], [ + INSTALL_GZIP="-z" + ]) + ]) +]) +AC_SUBST([INSTALL_GZIP]) +AC_SUBST([LIBZ]) -dnl Flags for "ar" command... -case $host_os_name in - darwin* | *bsd*) - ARFLAGS="-rcv" - ;; - *) - ARFLAGS="crvs" - ;; -esac +PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC $LIBZ" -AC_SUBST(ARFLAGS) +dnl Flags for "ar" command... +AS_CASE([host_os_name], [darwin* | *bsd*], [ + ARFLAGS="-rcv" +], [*], [ + ARFLAGS="crvs" +]) +AC_SUBST([ARFLAGS]) dnl Prep libraries specifically for cupsd and backends... BACKLIBS="" SERVERLIBS="" -AC_SUBST(BACKLIBS) -AC_SUBST(SERVERLIBS) +AC_SUBST([BACKLIBS]) +AC_SUBST([SERVERLIBS]) dnl See if we have POSIX ACL support... SAVELIBS="$LIBS" LIBS="" -AC_ARG_ENABLE(acl, [ --enable-acl build with POSIX ACL support]) -if test "x$enable_acl" != xno; then - AC_SEARCH_LIBS(acl_init, acl, AC_DEFINE(HAVE_ACL_INIT)) - SERVERLIBS="$SERVERLIBS $LIBS" -fi +AC_ARG_ENABLE([acl], AS_HELP_STRING([--enable-acl], [build with POSIX ACL support])) +AS_IF([test "x$enable_acl" != xno], [ + AC_SEARCH_LIBS([acl_init], [acl], [ + AC_DEFINE([HAVE_ACL_INIT], [1], [Have acl_init function?]) + ]) + SERVERLIBS="$SERVERLIBS $LIBS" +]) LIBS="$SAVELIBS" dnl Check for DBUS support @@ -297,37 +319,40 @@ DBUS_NOTIFIER="" DBUS_NOTIFIERLIBS="" -AC_ARG_ENABLE(dbus, [ --disable-dbus build without DBUS support]) -AC_ARG_WITH(dbusdir, [ --with-dbusdir set DBUS configuration directory ], - DBUSDIR="$withval") - -if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$host_os_name" != xdarwin; then - AC_MSG_CHECKING(for DBUS) - if $PKGCONFIG --exists dbus-1; then - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_DBUS) - CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE" - SERVERLIBS="$SERVERLIBS `$PKGCONFIG --libs dbus-1`" - DBUS_NOTIFIER="dbus" - DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs dbus-1`" - SAVELIBS="$LIBS" - 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 -a "x$DBUSDIR" = x; then - DBUSDIR="/etc/dbus-1" - fi - else - AC_MSG_RESULT(no) - fi -fi - -AC_SUBST(DBUSDIR) -AC_SUBST(DBUS_NOTIFIER) -AC_SUBST(DBUS_NOTIFIERLIBS) +AC_ARG_ENABLE([dbus], AS_HELP_STRING([--disable-dbus], [build without DBUS support])) +AC_ARG_WITH([dbusdir], AS_HELP_STRING([--with-dbusdir], [set DBUS configuration directory]), [ + DBUSDIR="$withval" +]) + +AS_IF([test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$host_os_name" != xdarwin], [ + AC_MSG_CHECKING([for DBUS]) + AS_IF([$PKGCONFIG --exists dbus-1], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_DBUS], [1], [Have dbus library?]) + CFLAGS="$CFLAGS $($PKGCONFIG --cflags dbus-1) -DDBUS_API_SUBJECT_TO_CHANGE" + SERVERLIBS="$SERVERLIBS $($PKGCONFIG --libs dbus-1)" + DBUS_NOTIFIER="dbus" + DBUS_NOTIFIERLIBS="$($PKGCONFIG --libs dbus-1)" + SAVELIBS="$LIBS" + LIBS="$LIBS $DBUS_NOTIFIERLIBS" + AC_CHECK_FUNC([dbus_message_iter_init_append], [ + AC_DEFINE([HAVE_DBUS_MESSAGE_ITER_INIT_APPEND], [1], [Have dbus_message_iter_init_append function?]) + ]) + AC_CHECK_FUNC([dbus_threads_init_default], [ + AC_DEFINE([HAVE_DBUS_THREADS_INIT], [1], [Have dbus_threads_init_default function?]) + ]) + LIBS="$SAVELIBS" + AS_IF([test -d /etc/dbus-1 -a "x$DBUSDIR" = x], [ + DBUSDIR="/etc/dbus-1" + ]) + ], [ + AC_MSG_RESULT([no]) + ]) +]) + +AC_SUBST([DBUSDIR]) +AC_SUBST([DBUS_NOTIFIER]) +AC_SUBST([DBUS_NOTIFIERLIBS]) dnl Extra platform-specific libraries... CUPS_DEFAULT_PRINTOPERATOR_AUTH="@SYSTEM" @@ -335,96 +360,100 @@ CUPS_SYSTEM_AUTHKEY="" INSTALLXPC="" -case $host_os_name in - darwin*) - BACKLIBS="$BACKLIBS -framework IOKit" - SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices" - LIBS="-framework CoreFoundation -framework Security $LIBS" - - dnl Check for framework headers... - AC_CHECK_HEADER(ApplicationServices/ApplicationServices.h,AC_DEFINE(HAVE_APPLICATIONSERVICES_H)) - AC_CHECK_HEADER(CoreFoundation/CoreFoundation.h,AC_DEFINE(HAVE_COREFOUNDATION_H)) - - dnl Check for dynamic store function... - SAVELIBS="$LIBS" - LIBS="-framework SystemConfiguration $LIBS" - AC_CHECK_FUNCS(SCDynamicStoreCopyComputerName,[ - AC_DEFINE(HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME)],[ - LIBS="$SAVELIBS"]) - - dnl Check for the new membership functions in MacOSX 10.4... - AC_CHECK_HEADER(membership.h,AC_DEFINE(HAVE_MEMBERSHIP_H)) - AC_CHECK_FUNCS(mbr_uid_to_uuid) - - dnl Need header... - AC_CHECK_HEADER(dlfcn.h,AC_DEFINE(HAVE_DLFCN_H)) - - dnl Check for notify_post support - AC_CHECK_HEADER(notify.h,AC_DEFINE(HAVE_NOTIFY_H)) - AC_CHECK_FUNCS(notify_post) - - dnl Check for Authorization Services support - AC_ARG_WITH(adminkey, [ --with-adminkey set the default SystemAuthKey value], - default_adminkey="$withval", - default_adminkey="default") - AC_ARG_WITH(operkey, [ --with-operkey set the default operator @AUTHKEY value], - default_operkey="$withval", - default_operkey="default") - - AC_CHECK_HEADER(Security/Authorization.h, [ - AC_DEFINE(HAVE_AUTHORIZATION_H) - - if test "x$default_adminkey" != xdefault; then - CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey $default_adminkey" - CUPS_DEFAULT_SYSTEM_AUTHKEY="$default_adminkey" - else - CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.print.admin" - CUPS_DEFAULT_SYSTEM_AUTHKEY="system.print.admin" - fi - - if test "x$default_operkey" != xdefault; then - CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" - else - CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" - fi]) - - dnl Check for sandbox/Seatbelt support - if test $host_os_version -ge 100; then - AC_CHECK_HEADER(sandbox.h,AC_DEFINE(HAVE_SANDBOX_H)) - fi - if test $host_os_version -ge 110 -a $host_os_version -lt 120; then - # Broken public headers in 10.7.x... - AC_MSG_CHECKING(for sandbox/private.h presence) - if test -f /usr/local/include/sandbox/private.h; then - AC_MSG_RESULT(yes) - else - AC_MSG_RESULT(no) - AC_MSG_ERROR(Run 'sudo mkdir -p /usr/local/include/sandbox' and 'sudo touch /usr/local/include/sandbox/private.h' to build CUPS.) - fi - fi - - dnl Check for XPC support - AC_CHECK_HEADER(xpc/xpc.h, - AC_DEFINE(HAVE_XPC) - INSTALLXPC="install-xpc") - ;; -esac - -AC_SUBST(CUPS_DEFAULT_PRINTOPERATOR_AUTH) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTOPERATOR_AUTH, "$CUPS_DEFAULT_PRINTOPERATOR_AUTH") -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SYSTEM_AUTHKEY, "$CUPS_DEFAULT_SYSTEM_AUTHKEY") -AC_SUBST(CUPS_SYSTEM_AUTHKEY) -AC_SUBST(INSTALLXPC) +AS_CASE([$host_os_name], [darwin*], [ + BACKLIBS="$BACKLIBS -framework IOKit" + SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices" + LIBS="-framework CoreFoundation -framework Security $LIBS" + PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC -framework CoreFoundation -framework Security" + + dnl Check for framework headers... + AC_CHECK_HEADER([ApplicationServices/ApplicationServices.h], [ + AC_DEFINE([HAVE_APPLICATIONSERVICES_H], [1], [Have ?]) + ]) + AC_CHECK_HEADER([CoreFoundation/CoreFoundation.h], [ + AC_DEFINE([HAVE_COREFOUNDATION_H], [1], [Have ?]) + ]) + + dnl Check for dynamic store function... + SAVELIBS="$LIBS" + LIBS="-framework SystemConfiguration $LIBS" + AC_CHECK_FUNCS([SCDynamicStoreCopyComputerName], [ + AC_DEFINE([HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME], [1], [Have SCDynamicStoreCopyComputerName function?]) + ],[ + LIBS="$SAVELIBS" + ]) + + dnl Check for the new membership functions in MacOSX 10.4... + AC_CHECK_HEADER([membership.h], [ + AC_DEFINE([HAVE_MEMBERSHIP_H], [1], [Have ?]) + ]) + AC_CHECK_FUNCS([mbr_uid_to_uuid]) + + dnl Need header... + AC_CHECK_HEADER([dlfcn.h], [ + AC_DEFINE([HAVE_DLFCN_H], [1], [Have ?]) + ]) + + dnl Check for notify_post support + AC_CHECK_HEADER([notify.h], [ + AC_DEFINE([HAVE_NOTIFY_H], [1], [Have ?]) + ]) + AC_CHECK_FUNCS(notify_post) + + dnl Check for Authorization Services support + AC_ARG_WITH([adminkey], AS_HELP_STRING([--with-adminkey], [set the default SystemAuthKey value]), [ + default_adminkey="$withval" + ], [ + default_adminkey="default" + ]) + AC_ARG_WITH([operkey], AS_HELP_STRING([--with-operkey], [set the default operator @AUTHKEY value]), [ + default_operkey="$withval" + ], [ + default_operkey="default" + ]) + + AC_CHECK_HEADER([Security/Authorization.h], [ + AC_DEFINE([HAVE_AUTHORIZATION_H], [1], [Have ?]) + + AS_IF([test "x$default_adminkey" != xdefault], [ + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey $default_adminkey" + CUPS_DEFAULT_SYSTEM_AUTHKEY="$default_adminkey" + ], [ + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.print.admin" + CUPS_DEFAULT_SYSTEM_AUTHKEY="system.print.admin" + ]) + + AS_IF([test "x$default_operkey" != xdefault], [ + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" + ], [ + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" + ]) + ]) + + dnl Check for sandbox/Seatbelt support + AC_CHECK_HEADER([sandbox.h], [ + AC_DEFINE([HAVE_SANDBOX_H], [1], [Have ?]) + ]) + + dnl Check for XPC support + AC_CHECK_HEADER([xpc/xpc.h], [ + AC_DEFINE([HAVE_XPC], [1], [Have ?]) + INSTALLXPC="install-xpc" + ]) +]) + +AC_SUBST([CUPS_DEFAULT_PRINTOPERATOR_AUTH]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_PRINTOPERATOR_AUTH], ["$CUPS_DEFAULT_PRINTOPERATOR_AUTH"], [Default authorization for print operators?]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_SYSTEM_AUTHKEY], ["$CUPS_DEFAULT_SYSTEM_AUTHKEY"], [Default system authorization key for macOS?]) +AC_SUBST([CUPS_SYSTEM_AUTHKEY]) +AC_SUBST([INSTALLXPC]) dnl Check for build components COMPONENTS="all" -AC_ARG_WITH(components, [ --with-components set components to build: - - "all" (default) builds everything - - "core" builds libcups and ipptool - - "libcups" builds just libcups - - "libcupslite" builds just libcups without driver support], - COMPONENTS="$withval") +AC_ARG_WITH([components], AS_HELP_STRING([--with-components], [set components to build: "all" (default) builds everything, "core" builds libcups and ipptool, "libcups" builds just libcups, "libcupslite" builds just libcups without driver support]), [ + COMPONENTS="$withval" +]) cupsimagebase="cupsimage" IPPEVECOMMANDS="ippevepcl ippeveps" @@ -432,45 +461,33 @@ LIBHEADERS="\$(COREHEADERS) \$(DRIVERHEADERS)" LIBHEADERSPRIV="\$(COREHEADERSPRIV) \$(DRIVERHEADERSPRIV)" -case "$COMPONENTS" in - all) - BUILDDIRS="tools filter backend berkeley cgi-bin monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" - ;; - - core) - BUILDDIRS="tools examples locale" - ;; - - corelite) - AC_DEFINE(CUPS_LITE) - BUILDDIRS="tools examples locale" - cupsimagebase="" - LIBCUPSOBJS="\$(COREOBJS)" - LIBHEADERS="\$(COREHEADERS)" - LIBHEADERSPRIV="\$(COREHEADERSPRIV)" - ;; - - libcups) - BUILDDIRS="locale" - cupsimagebase="" - ;; - - libcupslite) - AC_DEFINE(CUPS_LITE) - BUILDDIRS="locale" - cupsimagebase="" - LIBCUPSOBJS="\$(COREOBJS)" - LIBHEADERS="\$(COREHEADERS)" - LIBHEADERSPRIV="\$(COREHEADERSPRIV)" - ;; - - *) - AC_MSG_ERROR([Bad build component "$COMPONENT" specified!]) - ;; -esac - -AC_SUBST(BUILDDIRS) -AC_SUBST(IPPEVECOMMANDS) -AC_SUBST(LIBCUPSOBJS) -AC_SUBST(LIBHEADERS) -AC_SUBST(LIBHEADERSPRIV) +AS_CASE(["$COMPONENTS"], [all], [ + BUILDDIRS="tools filter backend berkeley cgi-bin monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" +], [core], [ + BUILDDIRS="tools examples locale" +], [corelite], [ + AC_DEFINE([CUPS_LITE], [1], [Building CUPS without driver support?]) + BUILDDIRS="tools examples locale" + cupsimagebase="" + LIBCUPSOBJS="\$(COREOBJS)" + LIBHEADERS="\$(COREHEADERS)" + LIBHEADERSPRIV="\$(COREHEADERSPRIV)" +], [libcups], [ + BUILDDIRS="locale" + cupsimagebase="" +], [libcupslite], [ + AC_DEFINE([CUPS_LITE], [1], [Building CUPS without driver support?]) + BUILDDIRS="locale" + cupsimagebase="" + LIBCUPSOBJS="\$(COREOBJS)" + LIBHEADERS="\$(COREHEADERS)" + LIBHEADERSPRIV="\$(COREHEADERSPRIV)" +], [*], [ + AC_MSG_ERROR([Bad build component "$COMPONENT" specified.]) +]) + +AC_SUBST([BUILDDIRS]) +AC_SUBST([IPPEVECOMMANDS]) +AC_SUBST([LIBCUPSOBJS]) +AC_SUBST([LIBHEADERS]) +AC_SUBST([LIBHEADERSPRIV]) diff -Nru cups-2.3.3op2/config-scripts/cups-compiler.m4 cups-2.4.1op1/config-scripts/cups-compiler.m4 --- cups-2.3.3op2/config-scripts/cups-compiler.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-compiler.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ dnl -dnl Compiler stuff for CUPS. +dnl Compiler tests for CUPS. dnl -dnl Copyright 2007-2018 by Apple Inc. -dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. +dnl Copyright © 2021-2022 by OpenPrinting. +dnl Copyright © 2007-2018 by Apple Inc. +dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved. dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. dnl dnl Clear the debugging and non-shared library options unless the user asks @@ -12,214 +14,223 @@ INSTALL_STRIP="" AC_SUBST(INSTALL_STRIP) -AC_ARG_WITH(optim, [ --with-optim set optimization flags ], - OPTIM="$withval", - OPTIM="") -AC_SUBST(OPTIM) - -AC_ARG_ENABLE(debug, [ --enable-debug build with debugging symbols]) -AC_ARG_ENABLE(debug_guards, [ --enable-debug-guards build with memory allocation guards]) -AC_ARG_ENABLE(debug_printfs, [ --enable-debug-printfs build with CUPS_DEBUG_LOG support]) -AC_ARG_ENABLE(unit_tests, [ --enable-unit-tests build and run unit tests]) +AC_ARG_WITH([optim], AS_HELP_STRING([--with-optim], [set optimization flags]), [ + OPTIM="$withval" +], [ + OPTIM="" +]) +AC_SUBST([OPTIM]) + +AC_ARG_ENABLE([debug], AS_HELP_STRING([--enable-debug], [build with debugging symbols])) +AC_ARG_ENABLE([debug_guards], AS_HELP_STRING([--enable-debug-guards], [build with memory allocation guards])) +AC_ARG_ENABLE([debug_printfs], AS_HELP_STRING([--enable-debug-printfs], [build with CUPS_DEBUG_LOG support])) +AC_ARG_ENABLE([maintainer], AS_HELP_STRING([--enable-maintainer], [turn on maintainer mode (warnings as errors)])) +AC_ARG_ENABLE([unit_tests], AS_HELP_STRING([--enable-unit-tests], [build and run unit tests])) dnl For debugging, keep symbols, otherwise strip them... -if test x$enable_debug = xyes -a "x$OPTIM" = x; then - OPTIM="-g" -else - INSTALL_STRIP="-s" -fi +AS_IF([test x$enable_debug = xyes -a "x$OPTIM" = x], [ + OPTIM="-g" +], [ + INSTALL_STRIP="-s" +]) dnl Debug printfs can slow things down, so provide a separate option for that -if test x$enable_debug_printfs = xyes; then - CFLAGS="$CFLAGS -DDEBUG" - CXXFLAGS="$CXXFLAGS -DDEBUG" -fi +AS_IF([test x$enable_debug_printfs = xyes], [ + CFLAGS="$CFLAGS -DDEBUG" + CXXFLAGS="$CXXFLAGS -DDEBUG" +]) dnl Debug guards use an extra 4 bytes for some structures like strings in the dnl string pool, so provide a separate option for that -if test x$enable_debug_guards = xyes; then - CFLAGS="$CFLAGS -DDEBUG_GUARDS" - CXXFLAGS="$CXXFLAGS -DDEBUG_GUARDS" -fi +AS_IF([test x$enable_debug_guards = xyes], [ + CFLAGS="$CFLAGS -DDEBUG_GUARDS" + CXXFLAGS="$CXXFLAGS -DDEBUG_GUARDS" +]) dnl Unit tests take up time during a compile... -if test x$enable_unit_tests = xyes; then - if test "$build" != "$host"; then - AC_MSG_ERROR([Sorry, cannot build unit tests when cross-compiling.]) - fi - - UNITTESTS="unittests" -else - UNITTESTS="" -fi -AC_SUBST(UNITTESTS) +AS_IF([test x$enable_unit_tests = xyes], [ + AS_IF([test "$build" != "$host"], [ + AC_MSG_ERROR([Sorry, cannot build unit tests when cross-compiling.]) + ]) + + UNITTESTS="unittests" +], [ + UNITTESTS="" +]) +AC_SUBST([UNITTESTS]) dnl Setup general architecture flags... -AC_ARG_WITH(archflags, [ --with-archflags set default architecture flags ]) -AC_ARG_WITH(ldarchflags, [ --with-ldarchflags set program architecture flags ]) +AC_ARG_WITH([archflags], AS_HELP_STRING([--with-archflags], [set default architecture flags])) +AC_ARG_WITH([ldarchflags], AS_HELP_STRING([--with-ldarchflags], [set program architecture flags])) -if test -z "$with_archflags"; then - ARCHFLAGS="" -else - ARCHFLAGS="$with_archflags" -fi - -if test -z "$with_ldarchflags"; then - if test "$host_os_name" = darwin; then - # Only create Intel programs by default - LDARCHFLAGS="`echo $ARCHFLAGS | sed -e '1,$s/-arch ppc64//'`" - else - LDARCHFLAGS="$ARCHFLAGS" - fi -else - LDARCHFLAGS="$with_ldarchflags" -fi +AS_IF([test -z "$with_archflags"], [ + ARCHFLAGS="" +], [ + ARCHFLAGS="$with_archflags" +]) + +AS_IF([test -z "$with_ldarchflags"], [ + LDARCHFLAGS="$ARCHFLAGS" +], [ + LDARCHFLAGS="$with_ldarchflags" +]) -AC_SUBST(ARCHFLAGS) -AC_SUBST(LDARCHFLAGS) +AC_SUBST([ARCHFLAGS]) +AC_SUBST([LDARCHFLAGS]) dnl Read-only data/program support on Linux... -AC_ARG_ENABLE(relro, [ --enable-relro build with the GCC relro option]) +AC_ARG_ENABLE([relro], AS_HELP_STRING([--enable-relro], [build with the relro option])) dnl Clang/GCC address sanitizer... -AC_ARG_ENABLE(sanitizer, [ --enable-sanitizer build with AddressSanitizer]) +AC_ARG_ENABLE([sanitizer], AS_HELP_STRING([--enable-sanitizer], [build with AddressSanitizer])) dnl Update compiler options... CXXLIBS="${CXXLIBS:=}" -AC_SUBST(CXXLIBS) +AC_SUBST([CXXLIBS]) PIEFLAGS="" -AC_SUBST(PIEFLAGS) +AC_SUBST([PIEFLAGS]) RELROFLAGS="" -AC_SUBST(RELROFLAGS) +AC_SUBST([RELROFLAGS]) WARNING_OPTIONS="" -AC_SUBST(WARNING_OPTIONS) +AC_SUBST([WARNING_OPTIONS]) -if test -n "$GCC"; then - # Add GCC-specific compiler options... +AS_IF([test -n "$GCC"], [ + # Add GCC/Clang compiler options... - # Address sanitizer is a useful tool to use when developing/debugging - # code but adds about 2x overhead... - if test x$enable_sanitizer = xyes; then - # Use -fsanitize=address with debugging... - OPTIM="$OPTIM -g -fsanitize=address" - else - # Otherwise use the Fortify enhancements to catch any unbounded - # string operations... - CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" - CXXFLAGS="$CXXFLAGS -D_FORTIFY_SOURCE=2" - fi - - # Default optimization options... - if test -z "$OPTIM"; then - # Default to optimize-for-size and debug - OPTIM="-Os -g" - fi - - # Generate position-independent code as needed... - 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(whether compiler supports -fstack-protector) + # Address sanitizer is a useful tool to use when developing/debugging + # code but adds about 2x overhead... + AS_IF([test x$enable_sanitizer = xyes], [ + # Use -fsanitize=address with debugging... + OPTIM="$OPTIM -g -fsanitize=address" + ], [ + # Otherwise use the Fortify enhancements to catch any unbounded + # string operations... + CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" + CXXFLAGS="$CXXFLAGS -D_FORTIFY_SOURCE=2" + ]) + + # Default optimization options... + AS_IF([test -z "$OPTIM"], [ + # Default to optimize-for-size and debug + OPTIM="-Os -g" + ]) + + # Generate position-independent code as needed... + AS_IF([test $PICFLAG = 1], [ + OPTIM="-fPIC $OPTIM" + ]) + + # The -fstack-protector-strong and -fstack-protector options are 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. + # First check for -fstack-protector-strong, then for -fstack-protector... + AC_MSG_CHECKING([whether compiler supports -fstack-protector-strong]) + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fstack-protector-strong" + AC_LINK_IFELSE([AC_LANG_PROGRAM()], [ + OPTIM="$OPTIM -fstack-protector-strong" + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + AC_MSG_CHECKING([whether compiler supports -fstack-protector]) + CFLAGS="$OLDCFLAGS -fstack-protector" + AC_LINK_IFELSE([AC_LANG_PROGRAM()], [ + OPTIM="$OPTIM -fstack-protector" + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) + ]) + CFLAGS="$OLDCFLAGS" + + AS_IF([test "x$LSB_BUILD" != xy], [ + # 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" - CFLAGS="$CFLAGS -fstack-protector" - AC_TRY_LINK(,, - 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)) + AS_CASE(["$host_os_name"], [darwin*], [ + CFLAGS="$CFLAGS -fPIE -Wl,-pie" + AC_LINK_IFELSE([AC_LANG_PROGRAM()], [ + PIEFLAGS="-fPIE -Wl,-pie" + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) + ], [*], [ + CFLAGS="$CFLAGS -fPIE -pie" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ + PIEFLAGS="-fPIE -pie" + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) + ]) CFLAGS="$OLDCFLAGS" + ]) - 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 "$host_os_name" in - darwin*) - CFLAGS="$CFLAGS -fPIE -Wl,-pie" - AC_TRY_COMPILE(,,[ - PIEFLAGS="-fPIE -Wl,-pie" - AC_MSG_RESULT(yes)], - AC_MSG_RESULT(no)) - ;; - - *) - CFLAGS="$CFLAGS -fPIE -pie" - AC_TRY_COMPILE(,,[ - PIEFLAGS="-fPIE -pie" - AC_MSG_RESULT(yes)], - AC_MSG_RESULT(no)) - ;; - esac - CFLAGS="$OLDCFLAGS" - fi - - # Add useful warning options for tracking down problems... - WARNING_OPTIONS="-Wall -Wno-format-y2k -Wunused -Wno-unused-result -Wsign-conversion -Wno-deprecated-declarations" - - # Test GCC version for certain warning flags since -Werror - # doesn't trigger... - gccversion=`$CC --version | head -1 | awk '{print $NF}'` - case "$gccversion" in - 7.* | 8.* | 9.* | 10.* | 11.* | 12.*) - WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-tautological-compare" - ;; - esac - - # Additional warning options for development testing... -# if test -d .git; then -# WARNING_OPTIONS="-Werror -Wno-error=deprecated-declarations $WARNING_OPTIONS" -# fi -else - # Add vendor-specific compiler options... - case $host_os_name in - sunos*) - # Solaris - if test -z "$OPTIM"; then - OPTIM="-xO2" - fi - - if test $PICFLAG = 1; then - OPTIM="-KPIC $OPTIM" - fi - ;; - *) - # Running some other operating system; inform the user - # they should contribute the necessary options via - # Github... - echo "Building CUPS with default compiler optimizations; contact the CUPS developers on Github" - echo "(https://github.com/apple/cups/issues) with the uname and compiler options needed for" - echo "your platform, or set the CFLAGS and LDFLAGS environment variables before running" - echo "configure." - ;; - esac -fi + dnl Show all standard warnings + unused variables when compiling... + WARNING_OPTIONS="-Wall -Wunused" + + dnl Drop some not-useful/unreliable warnings... + for warning in char-subscripts deprecated-declarations format-truncation format-y2k switch unused-result; do + AC_MSG_CHECKING([whether compiler supports -Wno-$warning]) + + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wno-$warning -Werror" + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [ + AC_MSG_RESULT(yes) + WARNING_OPTIONS="$WARNING_OPTIONS -Wno-$warning" + ], [ + AC_MSG_RESULT(no) + ]) + + CFLAGS="$OLDCFLAGS" + done + + dnl Maintainer mode enables -Werror... + AS_IF([test x$enable_maintainer = xyes], [ + WARNING_OPTIONS="$WARNING_OPTIONS -Werror" + ]) +], [ + # Add vendor-specific compiler options... + AS_CASE([$host_os_name], [sunos*], [ + # Solaris + AS_IF([test -z "$OPTIM"], [ + OPTIM="-xO2" + ]) + + AS_IF([test $PICFLAG = 1], [ + OPTIM="-KPIC $OPTIM" + ]) + ], [*], [ + # Running some other operating system; inform the user + # they should contribute the necessary options via + # Github... + echo "Building CUPS with default compiler optimizations." + echo "Contact the OpenPrinting CUPS developers on Github with the uname and compiler" + echo "options needed for your platform, or set the CFLAGS and LDFLAGS environment" + echo "variables before running configure." + echo "" + echo "https://github.com/openprinting/cups" + ]) +]) # Add general compiler options per platform... -case $host_os_name in - linux*) - # glibc 2.8 and higher breaks peer credentials unless you - # define _GNU_SOURCE... - OPTIM="$OPTIM -D_GNU_SOURCE" - - # 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,-z,now" - fi - ;; -esac +AS_CASE([$host_os_name], [linux*], [ + # glibc 2.8 and higher breaks peer credentials unless you + # define _GNU_SOURCE... + OPTIM="$OPTIM -D_GNU_SOURCE" + + # The -z relro option is provided by the Linux linker command to + # make relocatable data read-only. + AS_IF([test x$enable_relro = xyes], [ + RELROFLAGS="-Wl,-z,relro,-z,now" + ]) +]) diff -Nru cups-2.3.3op2/config-scripts/cups-container.m4 cups-2.4.1op1/config-scripts/cups-container.m4 --- cups-2.3.3op2/config-scripts/cups-container.m4 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-container.m4 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,58 @@ +dnl +dnl Support for packaging CUPS in different kinds of containers. +dnl +dnl Copyright © 2021 by OpenPrinting +dnl +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. +dnl + +dnl Specify a container mode +CONTAINER="none" + +AC_ARG_WITH([container], AS_HELP_STRING([--with-container=...], [configure to use in container (none, snap)]), [ + CONTAINER="$withval" +]) + +AS_CASE(["$CONTAINER"], [none], [ + # No container in use +], [snap], [ + # Building as a snap + AC_DEFINE([CUPS_SNAP], [1], [Building as a snap (snapcraft.io)?]) +], [*], [ + AC_MSG_ERROR([Unsupported container '$CONTAINER' specified.]) +]) + + +dnl Supporting libraries for different containers... +APPARMORLIBS="" +SNAPDGLIBLIBS="" +AC_SUBST([APPARMORLIBS]) +AC_SUBST([SNAPDGLIBLIBS]) + +AS_IF([test "x$PKGCONFIG" != x], [ + AC_MSG_CHECKING([for libapparmor]) + AS_IF([$PKGCONFIG --exists libapparmor], [ + AC_MSG_RESULT([yes]) + + CFLAGS="$CFLAGS $($PKGCONFIG --cflags libapparmor)" + APPARMORLIBS="$($PKGCONFIG --libs libapparmor)" + AC_DEFINE([HAVE_LIBAPPARMOR], [1], [Have the apparmor library?]) + + AC_MSG_CHECKING([for libsnapd-glib]) + AS_IF([$PKGCONFIG --exists snapd-glib glib-2.0 gio-2.0], [ + AC_MSG_RESULT([yes]) + CFLAGS="$CFLAGS $($PKGCONFIG --cflags snapd-glib glib-2.0 gio-2.0)" + SNAPDGLIBLIBS="$($PKGCONFIG --libs snapd-glib glib-2.0 gio-2.0)" + AC_DEFINE([HAVE_LIBSNAPDGLIB], [1], [Have the snapd-glib library?]) + SAVELIBS="$LIBS" + LIBS="$SNAPDGLIBLIBS $LIBS" + AC_CHECK_FUNC([snapd_client_run_snapctl2_sync], [ + AC_DEFINE([HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC], [1], [Have the snapd_client_run_snapctl2_sync function?]) + ]) + LIBS="$SAVELIBS" + ], [ + AC_MSG_RESULT([no]) + ]) + ]) +]) diff -Nru cups-2.3.3op2/config-scripts/cups-defaults.m4 cups-2.4.1op1/config-scripts/cups-defaults.m4 --- cups-2.3.3op2/config-scripts/cups-defaults.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-defaults.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ dnl dnl Default cupsd configuration settings for CUPS. dnl +dnl Copyright © 2021-2022 by OpenPrinting. dnl Copyright © 2007-2018 by Apple Inc. dnl Copyright © 2006-2007 by Easy Software Products, all rights reserved. dnl @@ -8,118 +9,125 @@ dnl information. dnl +dnl Set a default systemd WantedBy directive +SYSTEMD_WANTED_BY="printer.target" + dnl Default languages... -LANGUAGES="`ls -1 locale/cups_*.po 2>/dev/null | sed -e '1,$s/locale\/cups_//' -e '1,$s/\.po//' | tr '\n' ' '`" +LANGUAGES="$(ls -1 locale/cups_*.po 2>/dev/null | sed -e '1,$s/locale\/cups_//' -e '1,$s/\.po//' | tr '\n' ' ')" -AC_ARG_WITH(languages, [ --with-languages set installed languages, default=all ],[ - case "$withval" in - none | no) LANGUAGES="" ;; - all) ;; - *) LANGUAGES="$withval" ;; - esac]) -AC_SUBST(LANGUAGES) +AC_ARG_WITH([languages], AS_HELP_STRING([--with-languages], [set installed languages, default=all]), [ + AS_CASE(["$withval"], [none | no], [ + LANGUAGES="" + ], [all], [ + ], [*], [ + LANGUAGES="$withval" + ]) +]) +AC_SUBST([LANGUAGES]) dnl macOS bundle-based localization support -AC_ARG_WITH(bundledir, [ --with-bundledir set localization bundle directory ], - CUPS_BUNDLEDIR="$withval",[ - if test "x$host_os_name" = xdarwin -a $host_os_version -ge 100; then - CUPS_BUNDLEDIR="/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" - LANGUAGES="" - else - CUPS_BUNDLEDIR="" - fi]) - -AC_SUBST(CUPS_BUNDLEDIR) -if test "x$CUPS_BUNDLEDIR" != x; then - AC_DEFINE_UNQUOTED(CUPS_BUNDLEDIR, "$CUPS_BUNDLEDIR") -fi - -AC_ARG_WITH(bundlelang, [ --with-bundlelang set localization bundle base language (English or en) ], - cups_bundlelang="$withval",[ - if test $host_os_version -ge 190; then - cups_bundlelang="en" - else - cups_bundlelang="English" - fi]) - -if test "x$cups_bundlelang" != x -a "x$CUPS_BUNDLEDIR" != x; then - CUPS_RESOURCEDIR="$CUPS_BUNDLEDIR/Resources/$cups_bundlelang.lproj" -else - CUPS_RESOURCEDIR="" -fi -AC_SUBST(CUPS_RESOURCEDIR) +AC_ARG_WITH([bundledir], AS_HELP_STRING([--with-bundledir], [set localization bundle directory]), [ + CUPS_BUNDLEDIR="$withval" +], [ + AS_IF([test "x$host_os_name" = xdarwin -a $host_os_version -ge 100], [ + CUPS_BUNDLEDIR="/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" + LANGUAGES="" + ], [ + CUPS_BUNDLEDIR="" + ]) +]) + +AC_SUBST([CUPS_BUNDLEDIR]) +AS_IF([test "x$CUPS_BUNDLEDIR" != x], [ + AC_DEFINE_UNQUOTED([CUPS_BUNDLEDIR], ["$CUPS_BUNDLEDIR"], [macOS bundle directory.]) +]) + +AC_ARG_WITH([bundlelang], AS_HELP_STRING([--with-bundlelang], [set localization bundle base language (English or en)]), [ + cups_bundlelang="$withval" +], [ + AS_IF([test $host_os_version -ge 190], [ + cups_bundlelang="en" + ], [ + cups_bundlelang="English" + ]) +]) + +AS_IF([test "x$cups_bundlelang" != x -a "x$CUPS_BUNDLEDIR" != x], [ + CUPS_RESOURCEDIR="$CUPS_BUNDLEDIR/Resources/$cups_bundlelang.lproj" +], [ + CUPS_RESOURCEDIR="" +]) +AC_SUBST([CUPS_RESOURCEDIR]) dnl Default executable file permissions -AC_ARG_WITH(exe_file_perm, [ --with-exe-file-perm set default executable permissions value, default=0555], - CUPS_EXE_FILE_PERM="$withval", - [case "$host_os_name" in - linux* | gnu* | *-gnu) - CUPS_EXE_FILE_PERM="755" - ;; - *) - CUPS_EXE_FILE_PERM="555" - ;; - esac]) -AC_SUBST(CUPS_EXE_FILE_PERM) +AC_ARG_WITH([exe_file_perm], AS_HELP_STRING([--with-exe-file-perm], [set default executable permissions value, default=0755]), [ + CUPS_EXE_FILE_PERM="$withval" +], [ + CUPS_EXE_FILE_PERM="755" +]) +AC_SUBST([CUPS_EXE_FILE_PERM]) dnl Default ConfigFilePerm -AC_ARG_WITH(config_file_perm, [ --with-config-file-perm set default ConfigFilePerm value, default=0640], - CUPS_CONFIG_FILE_PERM="$withval", - [if test "x$host_os_name" = xdarwin; then - CUPS_CONFIG_FILE_PERM="644" - else - CUPS_CONFIG_FILE_PERM="640" - fi]) -AC_SUBST(CUPS_CONFIG_FILE_PERM) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_CONFIG_FILE_PERM, 0$CUPS_CONFIG_FILE_PERM) +AC_ARG_WITH([config_file_perm], AS_HELP_STRING([--with-config-file-perm], [set default ConfigFilePerm value, default=0640]), [ + CUPS_CONFIG_FILE_PERM="$withval" +], [ + CUPS_CONFIG_FILE_PERM="640" +]) +AC_SUBST([CUPS_CONFIG_FILE_PERM]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_CONFIG_FILE_PERM], [0$CUPS_CONFIG_FILE_PERM], [Default ConfigFilePerm value.]) dnl Default permissions for cupsd -AC_ARG_WITH(cupsd_file_perm, [ --with-cupsd-file-perm set default cupsd permissions, default=0500], - CUPS_CUPSD_FILE_PERM="$withval", - [case "$host_os_name" in - linux* | gnu*) - CUPS_CUPSD_FILE_PERM="700" - ;; - *) - CUPS_CUPSD_FILE_PERM="500" - ;; - esac]) -AC_SUBST(CUPS_CUPSD_FILE_PERM) +AC_ARG_WITH([cupsd_file_perm], AS_HELP_STRING([--with-cupsd-file-perm], [set default cupsd permissions, default=0700]), [ + CUPS_CUPSD_FILE_PERM="$withval" +], [ + CUPS_CUPSD_FILE_PERM="700" +]) +AC_SUBST([CUPS_CUPSD_FILE_PERM]) dnl Default LogFilePerm -AC_ARG_WITH(log_file_perm, [ --with-log-file-perm set default LogFilePerm value, default=0644], - CUPS_LOG_FILE_PERM="$withval", - CUPS_LOG_FILE_PERM="644") -AC_SUBST(CUPS_LOG_FILE_PERM) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LOG_FILE_PERM, 0$CUPS_LOG_FILE_PERM) +AC_ARG_WITH([log_file_perm], AS_HELP_STRING([--with-log-file-perm], [set default LogFilePerm value, default=0644]), [ + CUPS_LOG_FILE_PERM="$withval" +], [ + CUPS_LOG_FILE_PERM="644" +]) +AC_SUBST([CUPS_LOG_FILE_PERM]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_LOG_FILE_PERM], [0$CUPS_LOG_FILE_PERM], [Default LogFilePerm value.]) dnl Default MaxLogSize -AC_ARG_WITH(max_log_size, [ --with-max-log-size set default MaxLogSize value, default=1m], - CUPS_MAX_LOG_SIZE="$withval", - CUPS_MAX_LOG_SIZE="1m") -AC_SUBST(CUPS_MAX_LOG_SIZE) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_MAX_LOG_SIZE, "$CUPS_MAX_LOG_SIZE") +AC_ARG_WITH([max_log_size], AS_HELP_STRING([--with-max-log-size], [set default MaxLogSize value, default=1m]), [ + CUPS_MAX_LOG_SIZE="$withval" +], [ + CUPS_MAX_LOG_SIZE="1m" +]) +AC_SUBST([CUPS_MAX_LOG_SIZE]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_MAX_LOG_SIZE], ["$CUPS_MAX_LOG_SIZE"], [Default MaxLogSize value.]) dnl Default ErrorPolicy -AC_ARG_WITH(error_policy, [ --with-error-policy set default ErrorPolicy value, default=stop-printer], - CUPS_ERROR_POLICY="$withval", - CUPS_ERROR_POLICY="stop-printer") -AC_SUBST(CUPS_ERROR_POLICY) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_ERROR_POLICY, "$CUPS_ERROR_POLICY") +AC_ARG_WITH([error_policy], AS_HELP_STRING([--with-error-policy], [set default ErrorPolicy value, default=stop-printer]), [ + CUPS_ERROR_POLICY="$withval" +], [ + CUPS_ERROR_POLICY="stop-printer" +]) +AC_SUBST([CUPS_ERROR_POLICY]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_ERROR_POLICY], ["$CUPS_ERROR_POLICY"], [Default ErrorPolicy value.]) dnl Default FatalErrors -AC_ARG_WITH(fatal_errors, [ --with-fatal-errors set default FatalErrors value, default=config], - CUPS_FATAL_ERRORS="$withval", - CUPS_FATAL_ERRORS="config") -AC_SUBST(CUPS_FATAL_ERRORS) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_FATAL_ERRORS, "$CUPS_FATAL_ERRORS") +AC_ARG_WITH([fatal_errors], AS_HELP_STRING([--with-fatal-errors], [set default FatalErrors value, default=config]), [ + CUPS_FATAL_ERRORS="$withval" +], [ + CUPS_FATAL_ERRORS="config" +]) +AC_SUBST([CUPS_FATAL_ERRORS]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_FATAL_ERRORS], ["$CUPS_FATAL_ERRORS"], [Default FatalErrors value.]) dnl Default LogLevel -AC_ARG_WITH(log_level, [ --with-log-level set default LogLevel value, default=warn], - CUPS_LOG_LEVEL="$withval", - CUPS_LOG_LEVEL="warn") -AC_SUBST(CUPS_LOG_LEVEL) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LOG_LEVEL, "$CUPS_LOG_LEVEL") +AC_ARG_WITH([log_level], AS_HELP_STRING([--with-log-level], [set default LogLevel value, default=warn]), [ + CUPS_LOG_LEVEL="$withval" +], [ + CUPS_LOG_LEVEL="warn" +]) +AC_SUBST([CUPS_LOG_LEVEL]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_LOG_LEVEL], ["$CUPS_LOG_LEVEL"], [Default LogLevel value.]) dnl Default AccessLogLevel AC_ARG_WITH(access_log_level, [ --with-access-log-level set default AccessLogLevel value, default=none], @@ -129,335 +137,322 @@ 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) +AC_ARG_ENABLE([page_logging], AS_HELP_STRING([--enable-page-logging], [enable page_log by default])) +AS_IF([test "x$enable_page_logging" = xyes], [ + CUPS_PAGE_LOG_FORMAT="" +], [ + CUPS_PAGE_LOG_FORMAT="PageLogFormat" +]) +AC_SUBST([CUPS_PAGE_LOG_FORMAT]) dnl Default SyncOnClose -AC_ARG_ENABLE(sync_on_close, [ --enable-sync-on-close enable SyncOnClose (off by default)]) -if test "x$enable_sync_on_close" = xyes; then - CUPS_SYNC_ON_CLOSE="Yes" - AC_DEFINE(CUPS_DEFAULT_SYNC_ON_CLOSE) -else - CUPS_SYNC_ON_CLOSE="No" -fi -AC_SUBST(CUPS_SYNC_ON_CLOSE) +AC_ARG_ENABLE([sync_on_close], AS_HELP_STRING([--enable-sync-on-close], [enable SyncOnClose (off by default)])) +AS_IF([test "x$enable_sync_on_close" = xyes], [ + CUPS_SYNC_ON_CLOSE="Yes" + AC_DEFINE([CUPS_DEFAULT_SYNC_ON_CLOSE], [1], [Enable SyncOnClose by default?]) +], [ + CUPS_SYNC_ON_CLOSE="No" +]) +AC_SUBST([CUPS_SYNC_ON_CLOSE]) dnl Default Browsing -AC_ARG_ENABLE(browsing, [ --disable-browsing disable Browsing by default]) -if test "x$enable_browsing" = xno; then - CUPS_BROWSING="No" - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSING, 0) -else - CUPS_BROWSING="Yes" - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSING, 1) -fi -AC_SUBST(CUPS_BROWSING) +AC_ARG_ENABLE([browsing], AS_HELP_STRING([--disable-browsing], [disable Browsing by default])) +AS_IF([test "x$enable_browsing" = xno], [ + CUPS_BROWSING="No" + AC_DEFINE_UNQUOTED([CUPS_DEFAULT_BROWSING], [0], [Enable Browsing by default?]) +], [ + CUPS_BROWSING="Yes" + AC_DEFINE_UNQUOTED([CUPS_DEFAULT_BROWSING], [1], [Enable Browsing by default?]) +]) +AC_SUBST([CUPS_BROWSING]) dnl Default BrowseLocalProtocols -AC_ARG_WITH(local_protocols, [ --with-local-protocols set default BrowseLocalProtocols, default=""], - default_local_protocols="$withval", - default_local_protocols="default") - -if test x$with_local_protocols != xno; then - if test "x$default_local_protocols" = "xdefault"; then - if test "x$DNSSD_BACKEND" != "x"; then - CUPS_BROWSE_LOCAL_PROTOCOLS="dnssd" - else - CUPS_BROWSE_LOCAL_PROTOCOLS="" - fi - else - CUPS_BROWSE_LOCAL_PROTOCOLS="$default_local_protocols" - fi -else - CUPS_BROWSE_LOCAL_PROTOCOLS="" -fi - -AC_SUBST(CUPS_BROWSE_LOCAL_PROTOCOLS) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS, - "$CUPS_BROWSE_LOCAL_PROTOCOLS") +AC_ARG_WITH([local_protocols], AS_HELP_STRING([--with-local-protocols], [set default BrowseLocalProtocols, default=""]), [ + default_local_protocols="$withval" +], [ + default_local_protocols="default" +]) + +AS_IF([test x$with_local_protocols != xno], [ + AS_IF([test "x$default_local_protocols" = "xdefault"], [ + AS_IF([test "x$DNSSD_BACKEND" != "x"], [ + CUPS_BROWSE_LOCAL_PROTOCOLS="dnssd" + ], [ + CUPS_BROWSE_LOCAL_PROTOCOLS="" + ]) + ], [ + CUPS_BROWSE_LOCAL_PROTOCOLS="$default_local_protocols" + ]) +], [ + CUPS_BROWSE_LOCAL_PROTOCOLS="" +]) + +AC_SUBST([CUPS_BROWSE_LOCAL_PROTOCOLS]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS], ["$CUPS_BROWSE_LOCAL_PROTOCOLS"], [Default BrowseLocalProtocols value.]) dnl Default DefaultShared -AC_ARG_ENABLE(default_shared, [ --disable-default-shared - disable DefaultShared by default]) -if test "x$enable_default_shared" = xno; then - CUPS_DEFAULT_SHARED="No" - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_DEFAULT_SHARED, 0) -else - CUPS_DEFAULT_SHARED="Yes" - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_DEFAULT_SHARED, 1) -fi -AC_SUBST(CUPS_DEFAULT_SHARED) +AC_ARG_ENABLE([default_shared], AS_HELP_STRING([--disable-default-shared], [disable DefaultShared by default])) +AS_IF([test "x$enable_default_shared" = xno], [ + CUPS_DEFAULT_SHARED="No" + AC_DEFINE_UNQUOTED([CUPS_DEFAULT_DEFAULT_SHARED], [0], [Default DefaultShared value.]) +], [ + CUPS_DEFAULT_SHARED="Yes" + AC_DEFINE_UNQUOTED([CUPS_DEFAULT_DEFAULT_SHARED], [1], [Default DefaultShared value.]) +]) +AC_SUBST([CUPS_DEFAULT_SHARED]) dnl Determine the correct username and group for this OS... -AC_ARG_WITH(cups_user, [ --with-cups-user set default user for CUPS], - CUPS_USER="$withval", - AC_MSG_CHECKING(for default print user) - if test x$host_os_name = xdarwin; then - if test x`id -u _lp 2>/dev/null` = x; then - CUPS_USER="lp"; - else - CUPS_USER="_lp"; - fi - AC_MSG_RESULT($CUPS_USER) - elif test -f /etc/passwd; then - CUPS_USER="" - for user in lp lpd guest daemon nobody; do - if test "`grep \^${user}: /etc/passwd`" != ""; then - CUPS_USER="$user" - AC_MSG_RESULT($user) - break; - fi - done - - if test x$CUPS_USER = x; then - CUPS_USER="nobody" - AC_MSG_RESULT(not found, using "$CUPS_USER") - fi - else - CUPS_USER="nobody" - AC_MSG_RESULT(no password file, using "$CUPS_USER") - fi) - -if test "x$CUPS_USER" = "xroot" -o "x$CUPS_USER" = "x0"; then - AC_MSG_ERROR([The default user for CUPS cannot be root!]) -fi - -AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS], - CUPS_GROUP="$withval", - AC_MSG_CHECKING(for default print group) - if test x$host_os_name = xdarwin; then - if test x`id -g _lp 2>/dev/null` = x; then - CUPS_GROUP="lp"; - else - CUPS_GROUP="_lp"; - fi - AC_MSG_RESULT($CUPS_GROUP) - elif test -f /etc/group; then - GROUP_LIST="_lp lp nobody" - CUPS_GROUP="" - for group in $GROUP_LIST; do - if test "`grep \^${group}: /etc/group`" != ""; then - CUPS_GROUP="$group" - AC_MSG_RESULT($group) - break; - fi - done - - if test x$CUPS_GROUP = x; then - CUPS_GROUP="nobody" - AC_MSG_RESULT(not found, using "$CUPS_GROUP") - fi - else - CUPS_GROUP="nobody" - AC_MSG_RESULT(no group file, using "$CUPS_GROUP") - fi) - -if test "x$CUPS_GROUP" = "xroot" -o "x$CUPS_GROUP" = "xwheel" -o "x$CUPS_GROUP" = "x0"; then - AC_MSG_ERROR([The default group for CUPS cannot be root!]) -fi - -AC_ARG_WITH(system_groups, [ --with-system-groups set default system groups for CUPS], - CUPS_SYSTEM_GROUPS="$withval", - if test x$host_os_name = xdarwin; then - CUPS_SYSTEM_GROUPS="admin" - else - AC_MSG_CHECKING(for default system groups) - if test -f /etc/group; then - CUPS_SYSTEM_GROUPS="" - GROUP_LIST="lpadmin sys system root wheel" - for group in $GROUP_LIST; do - if test "`grep \^${group}: /etc/group`" != ""; then - if test "x$CUPS_SYSTEM_GROUPS" = x; then - CUPS_SYSTEM_GROUPS="$group" - else - CUPS_SYSTEM_GROUPS="$CUPS_SYSTEM_GROUPS $group" - fi - fi - done - - if test "x$CUPS_SYSTEM_GROUPS" = x; then - CUPS_SYSTEM_GROUPS="$GROUP_LIST" - AC_MSG_RESULT(no groups found, using "$CUPS_SYSTEM_GROUPS") - else - AC_MSG_RESULT("$CUPS_SYSTEM_GROUPS") - fi - else - CUPS_SYSTEM_GROUPS="$GROUP_LIST" - AC_MSG_RESULT(no group file, using "$CUPS_SYSTEM_GROUPS") - fi - fi) +AC_ARG_WITH([cups_user], AS_HELP_STRING([--with-cups-user], [set default user for CUPS]), [ + CUPS_USER="$withval" +], [ + AC_MSG_CHECKING([for default print user]) + AS_IF([test x$host_os_name = xdarwin], [ + AS_IF([test "x$(id -u _lp 2>/dev/null)" = x], [ + CUPS_USER="lp" + ], [ + CUPS_USER="_lp" + ]) + AC_MSG_RESULT([$CUPS_USER]) + ], [test -f /etc/passwd], [ + CUPS_USER="" + for user in lp lpd guest daemon nobody; do + AS_IF([test "$(grep \^${user}: /etc/passwd)" != ""], [ + CUPS_USER="$user" + AC_MSG_RESULT([$user]) + break + ]) + done + + AS_IF([test x$CUPS_USER = x], [ + CUPS_USER="nobody" + AC_MSG_RESULT([not found, using "$CUPS_USER"]) + ]) + ], [ + CUPS_USER="nobody" + AC_MSG_RESULT([no password file, using "$CUPS_USER"]) + ]) +]) + +AS_IF([test "x$CUPS_USER" = "xroot" -o "x$CUPS_USER" = "x0"], [ + AC_MSG_ERROR([The default user for CUPS cannot be root.]) +]) + +AC_ARG_WITH([cups_group], AS_HELP_STRING([--with-cups-group], [set default group for CUPS]), [ + CUPS_GROUP="$withval" +], [ + AC_MSG_CHECKING([for default print group]) + AS_IF([test x$host_os_name = xdarwin], [ + AS_IF([test "x$(id -g _lp 2>/dev/null)" = x], [ + CUPS_GROUP="lp" + ], [ + CUPS_GROUP="_lp" + ]) + AC_MSG_RESULT([$CUPS_GROUP]) + ], [test -f /etc/group], [ + GROUP_LIST="_lp lp nobody" + CUPS_GROUP="" + for group in $GROUP_LIST; do + AS_IF([test "$(grep \^${group}: /etc/group)" != ""], [ + CUPS_GROUP="$group" + AC_MSG_RESULT([$group]) + break + ]) + done + + AS_IF([test x$CUPS_GROUP = x], [ + CUPS_GROUP="nobody" + AC_MSG_RESULT([not found, using "$CUPS_GROUP"]) + ]) + ], [ + CUPS_GROUP="nobody" + AC_MSG_RESULT([no group file, using "$CUPS_GROUP"]) + ]) +]) + +AS_IF([test "x$CUPS_GROUP" = "xroot" -o "x$CUPS_GROUP" = "xwheel" -o "x$CUPS_GROUP" = "x0"], [ + AC_MSG_ERROR([The default group for CUPS cannot be root.]) +]) + +AC_ARG_WITH([system_groups], AS_HELP_STRING([--with-system-groups], [set default system groups for CUPS]), [ + CUPS_SYSTEM_GROUPS="$withval" +], [ + AS_IF([test x$host_os_name = xdarwin], [ + CUPS_SYSTEM_GROUPS="admin" + ], [ + AC_MSG_CHECKING([for default system groups]) + AS_IF([test -f /etc/group], [ + CUPS_SYSTEM_GROUPS="" + GROUP_LIST="lpadmin sys system root wheel" + for group in $GROUP_LIST; do + AS_IF([test "$(grep \^${group}: /etc/group)" != ""], [ + AS_IF([test "x$CUPS_SYSTEM_GROUPS" = x], [ + CUPS_SYSTEM_GROUPS="$group" + ], [ + CUPS_SYSTEM_GROUPS="$CUPS_SYSTEM_GROUPS $group" + ]) + ]) + done + + AS_IF([test "x$CUPS_SYSTEM_GROUPS" = x], [ + CUPS_SYSTEM_GROUPS="$GROUP_LIST" + AC_MSG_RESULT([no groups found, using "$CUPS_SYSTEM_GROUPS"]) + ], [ + AC_MSG_RESULT(["$CUPS_SYSTEM_GROUPS"]) + ]) + ], [ + CUPS_SYSTEM_GROUPS="$GROUP_LIST" + AC_MSG_RESULT([no group file, using "$CUPS_SYSTEM_GROUPS"]) + ]) + ]) +]) -CUPS_PRIMARY_SYSTEM_GROUP="`echo $CUPS_SYSTEM_GROUPS | awk '{print $1}'`" +CUPS_PRIMARY_SYSTEM_GROUP="$(echo $CUPS_SYSTEM_GROUPS | awk '{print $1}')" for group in $CUPS_SYSTEM_GROUPS; do - if test "x$CUPS_GROUP" = "x$group"; then - AC_MSG_ERROR([The default system groups cannot contain the default CUPS group!]) - fi + AS_IF([test "x$CUPS_GROUP" = "x$group"], [ + AC_MSG_ERROR([The default system groups cannot contain the default CUPS group.]) + ]) done -AC_SUBST(CUPS_USER) -AC_SUBST(CUPS_GROUP) -AC_SUBST(CUPS_SYSTEM_GROUPS) -AC_SUBST(CUPS_PRIMARY_SYSTEM_GROUP) - -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USER, "$CUPS_USER") -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GROUP, "$CUPS_GROUP") -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SYSTEM_GROUPS, "$CUPS_SYSTEM_GROUPS") +AC_SUBST([CUPS_USER]) +AC_SUBST([CUPS_GROUP]) +AC_SUBST([CUPS_SYSTEM_GROUPS]) +AC_SUBST([CUPS_PRIMARY_SYSTEM_GROUP]) + +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_USER], ["$CUPS_USER"], [Default User value.]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_GROUP], ["$CUPS_GROUP"], [Default Group value.]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_SYSTEM_GROUPS], ["$CUPS_SYSTEM_GROUPS"], [Default SystemGroup value(s).]) + dnl Default printcap file... -AC_ARG_WITH(printcap, [ --with-printcap set default printcap file], - default_printcap="$withval", - default_printcap="default") - -if test x$default_printcap != xno; then - if test "x$default_printcap" = "xdefault"; then - case $host_os_name in - darwin*) - if test $host_os_version -ge 90; then - CUPS_DEFAULT_PRINTCAP="/Library/Preferences/org.cups.printers.plist" - else - CUPS_DEFAULT_PRINTCAP="/etc/printcap" - fi - ;; - sunos*) - CUPS_DEFAULT_PRINTCAP="/etc/printers.conf" - ;; - *) - CUPS_DEFAULT_PRINTCAP="/etc/printcap" - ;; - esac - else - CUPS_DEFAULT_PRINTCAP="$default_printcap" - fi -else - CUPS_DEFAULT_PRINTCAP="" -fi - -AC_SUBST(CUPS_DEFAULT_PRINTCAP) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTCAP, "$CUPS_DEFAULT_PRINTCAP") - -dnl Default LPD config file... -AC_ARG_WITH(lpdconfigfile, [ --with-lpdconfigfile set default LPDConfigFile URI], - default_lpdconfigfile="$withval", - default_lpdconfigfile="default") - -if test x$default_lpdconfigfile != xno; then - if test "x$default_lpdconfigfile" = "xdefault"; then - case $host_os_name in - darwin*) - CUPS_DEFAULT_LPD_CONFIG_FILE="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" - ;; - *) - if test "x$XINETD" != x; then - CUPS_DEFAULT_LPD_CONFIG_FILE="xinetd://$XINETD/cups-lpd" - else - CUPS_DEFAULT_LPD_CONFIG_FILE="" - fi - ;; - esac - else - CUPS_DEFAULT_LPD_CONFIG_FILE="$default_lpdconfigfile" - fi -else - CUPS_DEFAULT_LPD_CONFIG_FILE="" -fi - -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LPD_CONFIG_FILE, "$CUPS_DEFAULT_LPD_CONFIG_FILE") -AC_SUBST(CUPS_DEFAULT_LPD_CONFIG_FILE) - -dnl Default SMB config file... -AC_ARG_WITH(smbconfigfile, [ --with-smbconfigfile set default SMBConfigFile URI], - default_smbconfigfile="$withval", - default_smbconfigfile="default") - -if test x$default_smbconfigfile != xno; then - if test "x$default_smbconfigfile" = "xdefault"; then - if test -f /etc/smb.conf; then - CUPS_DEFAULT_SMB_CONFIG_FILE="samba:///etc/smb.conf" - else - CUPS_DEFAULT_SMB_CONFIG_FILE="" - fi - else - CUPS_DEFAULT_SMB_CONFIG_FILE="$default_smbconfigfile" - fi -else - CUPS_DEFAULT_SMB_CONFIG_FILE="" -fi +AC_ARG_WITH([printcap], AS_HELP_STRING([--with-printcap], [set default printcap file]), [ + default_printcap="$withval" +], [ + default_printcap="default" +]) + +AS_IF([test x$default_printcap != xno], [ + AS_IF([test "x$default_printcap" = "xdefault"], [ + AS_CASE([$host_os_name], [darwin*], [ + CUPS_DEFAULT_PRINTCAP="/Library/Preferences/org.cups.printers.plist" + ], [sunos*], [ + CUPS_DEFAULT_PRINTCAP="/etc/printers.conf" + ], [*], [ + CUPS_DEFAULT_PRINTCAP="/etc/printcap" + ]) + ], [ + CUPS_DEFAULT_PRINTCAP="$default_printcap" + ]) +], [ + CUPS_DEFAULT_PRINTCAP="" +]) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SMB_CONFIG_FILE, "$CUPS_DEFAULT_SMB_CONFIG_FILE") -AC_SUBST(CUPS_DEFAULT_SMB_CONFIG_FILE) +AC_SUBST([CUPS_DEFAULT_PRINTCAP]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_PRINTCAP], ["$CUPS_DEFAULT_PRINTCAP"], [Default Printcap value.]) dnl Default MaxCopies value... -AC_ARG_WITH(max-copies, [ --with-max-copies set default max copies value, default=9999 ], - CUPS_MAX_COPIES="$withval", - CUPS_MAX_COPIES="9999") +AC_ARG_WITH([max_copies], AS_HELP_STRING([--with-max-copies], [set default max copies value, default=9999]), [ + CUPS_MAX_COPIES="$withval" +], [ + CUPS_MAX_COPIES="9999" +]) -AC_SUBST(CUPS_MAX_COPIES) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_MAX_COPIES, $CUPS_MAX_COPIES) +AC_SUBST([CUPS_MAX_COPIES]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_MAX_COPIES], [$CUPS_MAX_COPIES], [Default MaxCopies value.]) dnl Default raw printing state -AC_ARG_ENABLE(raw_printing, [ --disable-raw-printing do not allow raw printing by default]) -if test "x$enable_raw_printing" != xno; then - DEFAULT_RAW_PRINTING="" -else - DEFAULT_RAW_PRINTING="#" -fi -AC_SUBST(DEFAULT_RAW_PRINTING) +AC_ARG_ENABLE([raw_printing], AS_HELP_STRING([--disable-raw-printing], [do not allow raw printing by default])) +AS_IF([test "x$enable_raw_printing" != xno], [ + DEFAULT_RAW_PRINTING="" +], [ + DEFAULT_RAW_PRINTING="#" +]) +AC_SUBST([DEFAULT_RAW_PRINTING]) dnl Default SNMP options... -AC_ARG_WITH(snmp-address, [ --with-snmp-address set SNMP query address, default=auto ], - if test "x$withval" = x; then - CUPS_SNMP_ADDRESS="" - else - CUPS_SNMP_ADDRESS="Address $withval" - fi, - if test "x$host_os_name" = xdarwin; then - CUPS_SNMP_ADDRESS="" - else - CUPS_SNMP_ADDRESS="Address @LOCAL" - fi) - -AC_ARG_WITH(snmp-community, [ --with-snmp-community set SNMP community, default=public ], - CUPS_SNMP_COMMUNITY="Community $withval", - CUPS_SNMP_COMMUNITY="Community public") +AC_ARG_WITH([snmp_address], AS_HELP_STRING([--with-snmp-address], [set SNMP query address, default=auto]), [ + AS_IF([test "x$withval" = x], [ + CUPS_SNMP_ADDRESS="" + ], [ + CUPS_SNMP_ADDRESS="Address $withval" + ]) +], [ + AS_IF([test "x$host_os_name" = xdarwin], [ + CUPS_SNMP_ADDRESS="" + ], [ + CUPS_SNMP_ADDRESS="Address @LOCAL" + ]) +]) + +AC_ARG_WITH([snmp_community], AS_HELP_STRING([--with-snmp-community], [set SNMP community, default=public]), [ + CUPS_SNMP_COMMUNITY="Community $withval" +], [ + CUPS_SNMP_COMMUNITY="Community public" +]) -AC_SUBST(CUPS_SNMP_ADDRESS) -AC_SUBST(CUPS_SNMP_COMMUNITY) +AC_SUBST([CUPS_SNMP_ADDRESS]) +AC_SUBST([CUPS_SNMP_COMMUNITY]) dnl New default port definition for IPP... -AC_ARG_WITH(ipp-port, [ --with-ipp-port set port number for IPP, default=631 ], - DEFAULT_IPP_PORT="$withval", - DEFAULT_IPP_PORT="631") +AC_ARG_WITH([ipp_port], AS_HELP_STRING([--with-ipp-port], [set port number for IPP, default=631]), [ + DEFAULT_IPP_PORT="$withval" +], [ + DEFAULT_IPP_PORT="631" +]) -AC_SUBST(DEFAULT_IPP_PORT) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT) +AC_SUBST([DEFAULT_IPP_PORT]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_IPP_PORT], [$DEFAULT_IPP_PORT], [Default IPP port number.]) dnl Web interface... -AC_ARG_ENABLE(webif, [ --enable-webif enable the web interface by default, default=no for macOS]) -case "x$enable_webif" in - xno) - CUPS_WEBIF=No - CUPS_DEFAULT_WEBIF=0 - ;; - xyes) - CUPS_WEBIF=Yes - CUPS_DEFAULT_WEBIF=1 - ;; - *) - if test $host_os_name = darwin; then - CUPS_WEBIF=No - CUPS_DEFAULT_WEBIF=0 - else - CUPS_WEBIF=Yes - CUPS_DEFAULT_WEBIF=1 - fi - ;; -esac - -AC_SUBST(CUPS_WEBIF) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_WEBIF, $CUPS_DEFAULT_WEBIF) +AC_ARG_ENABLE([webif], AS_HELP_STRING([--enable-webif], [enable the web interface by default, default=no for macOS])) +AS_CASE(["x$enable_webif"], [xno], [ + CUPS_WEBIF=No + CUPS_DEFAULT_WEBIF=0 +], [xyes], [ + CUPS_WEBIF=Yes + CUPS_DEFAULT_WEBIF=1 +], [*], [ + AS_IF([test $host_os_name = darwin], [ + CUPS_WEBIF=No + CUPS_DEFAULT_WEBIF=0 + ], [ + CUPS_WEBIF=Yes + CUPS_DEFAULT_WEBIF=1 + ]) +]) + +AC_SUBST([CUPS_WEBIF]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_WEBIF], [$CUPS_DEFAULT_WEBIF], [Default WebInterface value.]) + +AS_IF([test $CUPS_WEBIF = Yes || test $CUPS_BROWSING = Yes], [ + SYSTEMD_WANTED_BY="$SYSTEMD_WANTED_BY multi-user.target"], [ + ]) +AC_SUBST([SYSTEMD_WANTED_BY]) + +dnl Set default value of IdleExitTimeout +AC_ARG_WITH([idle_exit_timeout], AS_HELP_STRING([--with-idle-exit-timeout], [set the default value for IdleExitTimeout, default=60]), [ + AS_IF([test "x$withval" = "xno"], [ + EXIT_TIMEOUT=0 + ], [ + EXIT_TIMEOUT=$withval + ]) +], [ + EXIT_TIMEOUT=60 +]) + +AC_SUBST([EXIT_TIMEOUT]) + +dnl set TimeoutStartSec for cups.service +dnl - if used as --without-*, it sets TimeoutStartSec to infinity +AC_ARG_WITH([systemd-timeoutstartsec], + AS_HELP_STRING([--with-systemd-timeoutstartsec], + [set TimeoutStartSec value in cups.service, default=default value in systemd]), [ + AS_IF([ test "x$withval" = "xno" ], [ + TIMEOUTSTARTSEC="TimeoutStartSec=infinity" + ], [ + TIMEOUTSTARTSEC="TimeoutStartSec=$withval" + ]) +], [ + TIMEOUTSTARTSEC="" +]) +AC_SUBST([TIMEOUTSTARTSEC]) diff -Nru cups-2.3.3op2/config-scripts/cups-directories.m4 cups-2.4.1op1/config-scripts/cups-directories.m4 --- cups-2.3.3op2/config-scripts/cups-directories.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-directories.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,9 @@ dnl dnl Directory stuff for CUPS. dnl -dnl Copyright 2007-2017 by Apple Inc. -dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. +dnl Copyright © 2021-2022 by OpenPrinting. +dnl Copyright © 2007-2017 by Apple Inc. +dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved. dnl dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. dnl @@ -10,295 +11,265 @@ AC_PREFIX_DEFAULT(/) dnl Fix "prefix" variable if it hasn't been specified... -if test "$prefix" = "NONE"; then - prefix="/" -fi +AS_IF([test "$prefix" = "NONE"], [ + prefix="/" +]) dnl Fix "exec_prefix" variable if it hasn't been specified... -if test "$exec_prefix" = "NONE"; then - if test "$prefix" = "/"; then - exec_prefix="/usr" - else - exec_prefix="$prefix" - fi -fi +AS_IF([test "$exec_prefix" = "NONE"], [ + AS_IF([test "$prefix" = "/"], [ + exec_prefix="/usr" + ], [ + exec_prefix="$prefix" + ]) +]) dnl Fix "bindir" variable... -if test "$bindir" = "\${exec_prefix}/bin"; then - bindir="$exec_prefix/bin" -fi +AS_IF([test "$bindir" = "\${exec_prefix}/bin"], [ + bindir="$exec_prefix/bin" +]) -AC_DEFINE_UNQUOTED(CUPS_BINDIR, "$bindir") +AC_DEFINE_UNQUOTED([CUPS_BINDIR], ["$bindir"], [Location of CUPS user programs.]) dnl Fix "sbindir" variable... -if test "$sbindir" = "\${exec_prefix}/sbin"; then - sbindir="$exec_prefix/sbin" -fi - -AC_DEFINE_UNQUOTED(CUPS_SBINDIR, "$sbindir") - -dnl Fix "sharedstatedir" variable if it hasn't been specified... -if test "$sharedstatedir" = "\${prefix}/com" -a "$prefix" = "/"; then - sharedstatedir="/usr/com" -fi +AS_IF([test "$sbindir" = "\${exec_prefix}/sbin"], [ + sbindir="$exec_prefix/sbin" +]) + +AC_DEFINE_UNQUOTED([CUPS_SBINDIR], ["$sbindir"], [Location of CUPS admin programs.]) dnl Fix "datarootdir" variable if it hasn't been specified... -if test "$datarootdir" = "\${prefix}/share"; then - if test "$prefix" = "/"; then - datarootdir="/usr/share" - else - datarootdir="$prefix/share" - fi -fi +AS_IF([test "$datarootdir" = "\${prefix}/share"], [ + AS_IF([test "$prefix" = "/"], [ + datarootdir="/usr/share" + ], [ + datarootdir="$prefix/share" + ]) +]) dnl Fix "datadir" variable if it hasn't been specified... -if test "$datadir" = "\${prefix}/share"; then - if test "$prefix" = "/"; then - datadir="/usr/share" - else - datadir="$prefix/share" - fi -elif test "$datadir" = "\${datarootdir}"; then - datadir="$datarootdir" -fi +AS_IF([test "$datadir" = "\${prefix}/share"], [ + AS_IF([test "$prefix" = "/"], [ + datadir="/usr/share" + ], [ + datadir="$prefix/share" + ]) +], [test "$datadir" = "\${datarootdir}"], [ + datadir="$datarootdir" +]) dnl Fix "includedir" variable if it hasn't been specified... -if test "$includedir" = "\${prefix}/include" -a "$prefix" = "/"; then - includedir="/usr/include" -fi +AS_IF([test "$includedir" = "\${prefix}/include" -a "$prefix" = "/"], [ + includedir="/usr/include" +]) +AS_IF([test "$includedir" != "/usr/include"], [ + PKGCONFIG_CFLAGS="$PKGCONFIG_CFLAGS -I$includedir" +]) dnl Fix "localstatedir" variable if it hasn't been specified... -if test "$localstatedir" = "\${prefix}/var"; then - if test "$prefix" = "/"; then - if test "$host_os_name" = darwin; then - localstatedir="/private/var" - else - localstatedir="/var" - fi - else - localstatedir="$prefix/var" - fi -fi +AS_IF([test "$localstatedir" = "\${prefix}/var"], [ + AS_IF([test "$prefix" = "/"], [ + AS_IF([test "$host_os_name" = darwin], [ + localstatedir="/private/var" + ], [ + localstatedir="/var" + ]) + ], [ + localstatedir="$prefix/var" + ]) +]) dnl Fix "sysconfdir" variable if it hasn't been specified... -if test "$sysconfdir" = "\${prefix}/etc"; then - if test "$prefix" = "/"; then - if test "$host_os_name" = darwin; then - sysconfdir="/private/etc" - else - sysconfdir="/etc" - fi - else - sysconfdir="$prefix/etc" - fi -fi +AS_IF([test "$sysconfdir" = "\${prefix}/etc"], [ + AS_IF([test "$prefix" = "/"], [ + AS_IF([test "$host_os_name" = darwin], [ + sysconfdir="/private/etc" + ], [ + sysconfdir="/etc" + ]) + ], [ + sysconfdir="$prefix/etc" + ]) +]) dnl Fix "libdir" variable... -if test "$libdir" = "\${exec_prefix}/lib"; then - case "$host_os_name" in - linux*) - if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then - libdir="$exec_prefix/lib64" - fi - ;; - esac -fi - -dnl Setup private include directory... -AC_ARG_WITH(privateinclude, [ --with-privateinclude set path for private include files, default=none],privateinclude="$withval",privateinclude="") -if test "x$privateinclude" != x -a "x$privateinclude" != xnone; then - PRIVATEINCLUDE="$privateinclude/cups" -else - privateinclude="" - PRIVATEINCLUDE="" -fi -AC_SUBST(privateinclude) -AC_SUBST(PRIVATEINCLUDE) - -dnl LPD sharing support... -AC_ARG_WITH(lpdconfig, [ --with-lpdconfig set URI for LPD config file], - LPDCONFIG="$withval", LPDCONFIG="") - -if test "x$LPDCONFIG" = x; then - if test -f /System/Library/LaunchDaemons/org.cups.cups-lpd.plist; then - LPDCONFIG="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" - elif test "x$XINETD" != x; then - LPDCONFIG="xinetd://$XINETD/cups-lpd" - fi -fi - -if test "x$LPDCONFIG" = xoff; then - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LPD_CONFIG, "") -else - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LPD_CONFIG, "$LPDCONFIG") -fi - -dnl SMB sharing support... -AC_ARG_WITH(smbconfig, [ --with-smbconfig set URI for Samba config file], - SMBCONFIG="$withval", SMBCONFIG="") - -if test "x$SMBCONFIG" = x; then - if test -f /System/Library/LaunchDaemons/smbd.plist; then - SMBCONFIG="launchd:///System/Library/LaunchDaemons/smbd.plist" - else - for dir in /etc /etc/samba /usr/local/etc; do - if test -f $dir/smb.conf; then - SMBCONFIG="samba://$dir/smb.conf" - break - fi - done - fi -fi - -if test "x$SMBCONFIG" = xoff; then - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SMB_CONFIG, "") -else - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SMB_CONFIG, "$SMBCONFIG") -fi +AS_IF([test "$libdir" = "\${exec_prefix}/lib"], [ + AS_CASE(["$host_os_name"], [linux*], [ + AS_IF([test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot], [ + libdir="$exec_prefix/lib64" + ], [ + libdir="$exec_prefix/lib" + ]) + ], [*], [ + libdir="$exec_prefix/lib" + ]) +]) +AS_IF([test "$libdir" = "/usr/lib"], [ + PKGCONFIG_LIBS="-lcups" +], [ + PKGCONFIG_LIBS="-L$libdir -lcups" +]) dnl Setup default locations... # Cache data... -AC_ARG_WITH(cachedir, [ --with-cachedir set path for cache files],cachedir="$withval",cachedir="") - -if test x$cachedir = x; then - if test "x$host_os_name" = xdarwin; then - CUPS_CACHEDIR="$localstatedir/spool/cups/cache" - else - CUPS_CACHEDIR="$localstatedir/cache/cups" - fi -else - CUPS_CACHEDIR="$cachedir" -fi -AC_DEFINE_UNQUOTED(CUPS_CACHEDIR, "$CUPS_CACHEDIR") -AC_SUBST(CUPS_CACHEDIR) +AC_ARG_WITH([cachedir], AS_HELP_STRING([--with-cachedir], [set path for cache files]), [ + cachedir="$withval" +], [ + cachedir="" +]) + +AS_IF([test x$cachedir = x], [ + AS_IF([test "x$host_os_name" = xdarwin], [ + CUPS_CACHEDIR="$localstatedir/spool/cups/cache" + ], [ + CUPS_CACHEDIR="$localstatedir/cache/cups" + ]) +], [ + CUPS_CACHEDIR="$cachedir" +]) +AC_DEFINE_UNQUOTED([CUPS_CACHEDIR], ["$CUPS_CACHEDIR"], [Location of cache files.]) +AC_SUBST([CUPS_CACHEDIR]) # Data files CUPS_DATADIR="$datadir/cups" -AC_DEFINE_UNQUOTED(CUPS_DATADIR, "$datadir/cups") -AC_SUBST(CUPS_DATADIR) +AC_DEFINE_UNQUOTED([CUPS_DATADIR], ["$datadir/cups"], [Location of data files.]) +AC_SUBST([CUPS_DATADIR]) # Icon directory -AC_ARG_WITH(icondir, [ --with-icondir set path for application icons],icondir="$withval",icondir="") +AC_ARG_WITH([icondir], AS_HELP_STRING([--with-icondir], [set path for application icons]), [ + icondir="$withval" +], [ + icondir="" +]) + +AS_IF([test "x$icondir" = x], [ + ICONDIR="/usr/share/icons" +], [ + ICONDIR="$icondir" +]) -if test "x$icondir" = x -a -d /usr/share/icons; then - ICONDIR="/usr/share/icons" -else - ICONDIR="$icondir" -fi - -AC_SUBST(ICONDIR) +AC_SUBST([ICONDIR]) # Menu directory -AC_ARG_WITH(menudir, [ --with-menudir set path for application menus],menudir="$withval",menudir="") - -if test "x$menudir" = x -a -d /usr/share/applications; then - MENUDIR="/usr/share/applications" -else - MENUDIR="$menudir" -fi +AC_ARG_WITH([menudir], AS_HELP_STRING([--with-menudir], [set path for application menus]), [ + menudir="$withval" +], [ + menudir="" +]) + +AS_IF([test "x$menudir" = x], [ + MENUDIR="/usr/share/applications" +], [ + MENUDIR="$menudir" +]) -AC_SUBST(MENUDIR) +AC_SUBST([MENUDIR]) # Documentation files -AC_ARG_WITH(docdir, [ --with-docdir set path for documentation],docdir="$withval",docdir="") +AC_ARG_WITH([docdir], AS_HELP_STRING([--with-docdir], [set path for documentation]), [ + docdir="$withval" +], [ + docdir="" +]) + +AS_IF([test x$docdir = x], [ + CUPS_DOCROOT="$datadir/doc/cups" + docdir="$datadir/doc/cups" +], [ + CUPS_DOCROOT="$docdir" +]) -if test x$docdir = x; then - CUPS_DOCROOT="$datadir/doc/cups" - docdir="$datadir/doc/cups" -else - CUPS_DOCROOT="$docdir" -fi - -AC_DEFINE_UNQUOTED(CUPS_DOCROOT, "$docdir") -AC_SUBST(CUPS_DOCROOT) - -# Fonts -AC_ARG_WITH(fontpath, [ --with-fontpath set font path for pstoraster],fontpath="$withval",fontpath="") - -if test "x$fontpath" = "x"; then - CUPS_FONTPATH="$datadir/cups/fonts" -else - CUPS_FONTPATH="$fontpath" -fi - -AC_SUBST(CUPS_FONTPATH) -AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$CUPS_FONTPATH") +AC_DEFINE_UNQUOTED([CUPS_DOCROOT], ["$docdir"], [Location of documentation files.]) +AC_SUBST([CUPS_DOCROOT]) # Locale data -if test "$localedir" = "\${datarootdir}/locale"; then - case "$host_os_name" in - linux* | gnu* | *bsd* | darwin*) - CUPS_LOCALEDIR="$datarootdir/locale" - ;; - - *) - # This is the standard System V location... - CUPS_LOCALEDIR="$exec_prefix/lib/locale" - ;; - esac -else - CUPS_LOCALEDIR="$localedir" -fi +AS_IF([test "$localedir" = "\${datarootdir}/locale"], [ + AS_CASE(["$host_os_name"], [linux* | gnu* | *bsd* | darwin*], [ + CUPS_LOCALEDIR="$datarootdir/locale" + ], [*], [ + # This is the standard System V location... + CUPS_LOCALEDIR="$exec_prefix/lib/locale" + ]) +], [ + CUPS_LOCALEDIR="$localedir" +]) + +AC_DEFINE_UNQUOTED([CUPS_LOCALEDIR], ["$CUPS_LOCALEDIR"], [Location of localization files.]) +AC_SUBST([CUPS_LOCALEDIR]) + + +# cups.pc file... +AC_ARG_WITH([pkgconfpath], AS_HELP_STRING([--with-pkgconfpath], [set path for cups.pc file]), [ + pkgconfpath="$withval" +], [ + pkgconfpath="" +]) + +AS_IF([test x$pkgconfpath = x], [ + CUPS_PKGCONFPATH="$exec_prefix/lib/pkgconfig" +], [ + CUPS_PKGCONFPATH="$pkgconfpath" +]) +AC_DEFINE_UNQUOTED([CUPS_PKGCONFPATH], ["$CUPS_PKGCONFPATH"], [Location of cups.pc file.]) +AC_SUBST([CUPS_PKGCONFPATH]) -AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$CUPS_LOCALEDIR") -AC_SUBST(CUPS_LOCALEDIR) -# Log files... -AC_ARG_WITH(logdir, [ --with-logdir set path for log files],logdir="$withval",logdir="") -if test x$logdir = x; then - CUPS_LOGDIR="$localstatedir/log/cups" - AC_DEFINE_UNQUOTED(CUPS_LOGDIR, "$localstatedir/log/cups") -else - CUPS_LOGDIR="$logdir" -fi -AC_DEFINE_UNQUOTED(CUPS_LOGDIR, "$CUPS_LOGDIR") -AC_SUBST(CUPS_LOGDIR) +# Log files... +AC_ARG_WITH([logdir], AS_HELP_STRING([--with-logdir], [set path for log files]), [ + logdir="$withval" +], [ + logdir="" +]) + +AS_IF([test x$logdir = x], [ + CUPS_LOGDIR="$localstatedir/log/cups" +], [ + CUPS_LOGDIR="$logdir" +]) +AC_DEFINE_UNQUOTED([CUPS_LOGDIR], ["$CUPS_LOGDIR"], [Location of log files.]) +AC_SUBST([CUPS_LOGDIR]) # Longer-term spool data CUPS_REQUESTS="$localstatedir/spool/cups" -AC_DEFINE_UNQUOTED(CUPS_REQUESTS, "$localstatedir/spool/cups") -AC_SUBST(CUPS_REQUESTS) +AC_DEFINE_UNQUOTED([CUPS_REQUESTS], ["$localstatedir/spool/cups"], [Location of spool directory.]) +AC_SUBST([CUPS_REQUESTS]) # Server executables... -case "$host_os_name" in - *-gnu) - # GNUs - INSTALL_SYSV="install-sysv" - CUPS_SERVERBIN="$exec_prefix/lib/cups" - ;; - *bsd* | darwin*) - # *BSD and Darwin (macOS) - INSTALL_SYSV="" - CUPS_SERVERBIN="$exec_prefix/libexec/cups" - ;; - *) - # All others - INSTALL_SYSV="install-sysv" - CUPS_SERVERBIN="$exec_prefix/lib/cups" - ;; -esac - -AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$CUPS_SERVERBIN") -AC_SUBST(CUPS_SERVERBIN) -AC_SUBST(INSTALL_SYSV) +AS_CASE(["$host_os_name"], [*-gnu], [ + # GNUs + INSTALL_SYSV="install-sysv" + CUPS_SERVERBIN="$exec_prefix/lib/cups" +], [*bsd* | darwin*], [ + # *BSD and Darwin (macOS) + INSTALL_SYSV="" + CUPS_SERVERBIN="$exec_prefix/libexec/cups" +], [*], [ + # All others + INSTALL_SYSV="install-sysv" + CUPS_SERVERBIN="$exec_prefix/lib/cups" +]) + +AC_DEFINE_UNQUOTED([CUPS_SERVERBIN], ["$CUPS_SERVERBIN"], [Location of server programs.]) +AC_SUBST([CUPS_SERVERBIN]) +AC_SUBST([INSTALL_SYSV]) # Configuration files CUPS_SERVERROOT="$sysconfdir/cups" -AC_DEFINE_UNQUOTED(CUPS_SERVERROOT, "$sysconfdir/cups") -AC_SUBST(CUPS_SERVERROOT) +AC_DEFINE_UNQUOTED([CUPS_SERVERROOT], ["$sysconfdir/cups"], [Location of server configuration files.]) +AC_SUBST([CUPS_SERVERROOT]) # Transient run-time state -AC_ARG_WITH(rundir, [ --with-rundir set transient run-time state directory],CUPS_STATEDIR="$withval",[ - case "$host_os_name" in - darwin*) - # Darwin (macOS) - CUPS_STATEDIR="$CUPS_SERVERROOT" - ;; - *) - # All others - CUPS_STATEDIR="$localstatedir/run/cups" - ;; - esac]) -AC_DEFINE_UNQUOTED(CUPS_STATEDIR, "$CUPS_STATEDIR") -AC_SUBST(CUPS_STATEDIR) +AC_ARG_WITH([rundir], AS_HELP_STRING([--with-rundir], [set transient run-time state directory]), [ + CUPS_STATEDIR="$withval" +], [ + AS_CASE(["$host_os_name"], [darwin*], [ + # Darwin (macOS) + CUPS_STATEDIR="$CUPS_SERVERROOT" + ], [*], [ + # All others + CUPS_STATEDIR="$localstatedir/run/cups" + ]) +]) +AC_DEFINE_UNQUOTED([CUPS_STATEDIR], ["$CUPS_STATEDIR"], [Location of transient state files.]) +AC_SUBST([CUPS_STATEDIR]) diff -Nru cups-2.3.3op2/config-scripts/cups-dnssd.m4 cups-2.4.1op1/config-scripts/cups-dnssd.m4 --- cups-2.3.3op2/config-scripts/cups-dnssd.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-dnssd.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,76 +1,105 @@ dnl dnl DNS Service Discovery (aka Bonjour) stuff for CUPS. dnl +dnl Copyright © 2021-2022 by OpenPrinting. dnl Copyright © 2007-2019 by Apple Inc. dnl dnl Licensed under Apache License v2.0. See the file "LICENSE" for more dnl information. dnl -AC_ARG_ENABLE(avahi, [ --disable-avahi disable DNS Service Discovery support using Avahi]) -AC_ARG_ENABLE(dnssd, [ --disable-dnssd disable DNS Service Discovery support using mDNSResponder]) -AC_ARG_WITH(dnssd-libs, [ --with-dnssd-libs set directory for DNS Service Discovery library], - LDFLAGS="-L$withval $LDFLAGS" - DSOFLAGS="-L$withval $DSOFLAGS",) -AC_ARG_WITH(dnssd-includes, [ --with-dnssd-includes set directory for DNS Service Discovery includes], - CFLAGS="-I$withval $CFLAGS" - CPPFLAGS="-I$withval $CPPFLAGS",) +AC_ARG_WITH([dnssd], AS_HELP_STRING([--with-dnssd=...], [enable DNS Service Discovery support (avahi, mdnsresponder, no, yes)])) +AS_IF([test x$with_dnssd = x], [ + with_dnssd="yes" +], [test "$with_dnssd" != avahi -a "$with_dnssd" != mdnsresponder -a "$with_dnssd" != no -a "$with_dnssd" != yes], [ + AC_MSG_ERROR([Unsupported --with-dnssd value "$with_dnssd".]) +]) +AC_ARG_WITH([dnssd_libs], AS_HELP_STRING([--with-dnssd-libs], [set directory for DNS Service Discovery library]), [ + LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS" +]) +AC_ARG_WITH([dnssd_includes], AS_HELP_STRING([--with-dnssd-includes], [set directory for DNS Service Discovery header files]), [ + CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS" +]) DNSSDLIBS="" DNSSD_BACKEND="" IPPFIND_BIN="" IPPFIND_MAN="" -if test "x$PKGCONFIG" != x -a x$enable_avahi != xno -a x$host_os_name != 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`" +dnl First try using mDNSResponder... +AS_IF([test $with_dnssd = yes -o $with_dnssd = mdnsresponder], [ + AC_CHECK_HEADER([dns_sd.h], [ + AS_CASE(["$host_os_name"], [darwin*], [ + # Darwin and macOS... + with_dnssd="mdnsresponder" + AC_DEFINE([HAVE_DNSSD], [1], [Have DNS-SD support?]) + AC_DEFINE([HAVE_MDNSRESPONDER], [1], [Have mDNSResponder library?]) + DNSSD_BACKEND="dnssd" + IPPFIND_BIN="ippfind" + IPPFIND_MAN="ippfind.1" + ], [*], [ + # All others... + AC_MSG_CHECKING([for current version of dns_sd library]) + SAVELIBS="$LIBS" + LIBS="$LIBS -ldns_sd" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[ + int constant = kDNSServiceFlagsShareConnection; + unsigned char txtRecord[100]; + uint8_t valueLen; + TXTRecordGetValuePtr(sizeof(txtRecord), txtRecord, "value", &valueLen); + ]]) + ], [ + AC_MSG_RESULT([yes]) + with_dnssd="mdnsresponder" + AC_DEFINE([HAVE_DNSSD], [1], [Have DNS-SD support?]) + AC_DEFINE([HAVE_MDNSRESPONDER], [1], [Have mDNSResponder library?]) + DNSSDLIBS="-ldns_sd" DNSSD_BACKEND="dnssd" IPPFIND_BIN="ippfind" IPPFIND_MAN="ippfind.1" - AC_DEFINE(HAVE_AVAHI) - else - AC_MSG_RESULT(no) - fi -fi + PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC $DNSSDLIBS" + ], [ + AC_MSG_RESULT([no]) + AS_IF([test $with_dnssd = mdnsresponder], [ + AC_MSG_ERROR([--with-dnssd=mdnsresponder specified but dns_sd library not present.]) + ]) + ]) + LIBS="$SAVELIBS" + ]) + ]) +]) -if test "x$DNSSD_BACKEND" = x -a x$enable_dnssd != xno; then - AC_CHECK_HEADER(dns_sd.h, [ - case "$host_os_name" in - darwin*) - # Darwin and macOS... - AC_DEFINE(HAVE_DNSSD) - DNSSD_BACKEND="dnssd" - IPPFIND_BIN="ippfind" - IPPFIND_MAN="ippfind.1" - ;; - *) - # All others... - AC_MSG_CHECKING(for current version of dns_sd library) - SAVELIBS="$LIBS" - LIBS="$LIBS -ldns_sd" - AC_TRY_COMPILE([#include ], - [int constant = kDNSServiceFlagsShareConnection; - unsigned char txtRecord[100]; - uint8_t valueLen; - TXTRecordGetValuePtr(sizeof(txtRecord), - txtRecord, "value", &valueLen);], - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_DNSSD) - DNSSDLIBS="-ldns_sd" - DNSSD_BACKEND="dnssd" - IPPFIND_BIN="ippfind" - IPPFIND_MAN="ippfind.1", - AC_MSG_RESULT(no)) - LIBS="$SAVELIBS" - ;; - esac +dnl Then try Avahi... +AS_IF([test $with_dnssd = avahi -o $with_dnssd = yes], [ + AS_IF([test "x$PKGCONFIG" = x], [ + AS_IF([test $with_dnssd = avahi], [ + AC_MSG_ERROR([Avahi requires pkg-config.]) + ]) + ], [ + AC_MSG_CHECKING([for Avahi client]) + AS_IF([$PKGCONFIG --exists avahi-client], [ + AC_MSG_RESULT([yes]) + CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`" + DNSSDLIBS="`$PKGCONFIG --libs avahi-client`" + DNSSD_BACKEND="dnssd" + IPPFIND_BIN="ippfind" + IPPFIND_MAN="ippfind.1" + PKGCONFIG_REQUIRES="$PKGCONFIG_REQUIRES avahi-client" + AC_DEFINE([HAVE_AVAHI], [1], [Have Avahi client library?]) + AC_DEFINE([HAVE_DNSSD], [1], [Have DNS-SD support?]) + ], [ + AC_MSG_RESULT([no]) + AS_IF([test $with_dnssd = avahi], [ + AC_MSG_ERROR([--with-dnssd=avahi specified but Avahi client not present.]) + ]) ]) -fi + ]) +]) -AC_SUBST(DNSSDLIBS) -AC_SUBST(DNSSD_BACKEND) -AC_SUBST(IPPFIND_BIN) -AC_SUBST(IPPFIND_MAN) +AC_SUBST([DNSSDLIBS]) +AC_SUBST([DNSSD_BACKEND]) +AC_SUBST([IPPFIND_BIN]) +AC_SUBST([IPPFIND_MAN]) diff -Nru cups-2.3.3op2/config-scripts/cups-gssapi.m4 cups-2.4.1op1/config-scripts/cups-gssapi.m4 --- cups-2.3.3op2/config-scripts/cups-gssapi.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-gssapi.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,123 +1,136 @@ dnl dnl GSSAPI/Kerberos library detection for CUPS. dnl -dnl Copyright 2007-2017 by Apple Inc. -dnl Copyright 2006-2007 by Easy Software Products. +dnl Copyright © 2021-2022 by OpenPrinting. +dnl Copyright @ 2007-2017 by Apple Inc. +dnl Copyright @ 2006-2007 by Easy Software Products. dnl dnl This file contains Kerberos support code, copyright 2006 by dnl Jelmer Vernooij. dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. dnl -AC_ARG_ENABLE(gssapi, [ --disable-gssapi disable GSSAPI support]) +AC_ARG_ENABLE([gssapi], AS_HELP_STRING([--enable-gssapi], [enable (deprecated) GSSAPI/Kerberos support])) LIBGSSAPI="" -AC_SUBST(LIBGSSAPI) +AC_SUBST([LIBGSSAPI]) -if test x$enable_gssapi != xno; then - AC_PATH_TOOL(KRB5CONFIG, krb5-config) - if test "x$KRB5CONFIG" != x; then - case "$host_os_name" in - darwin) - # macOS weak-links to the Kerberos framework... - LIBGSSAPI="-weak_framework Kerberos" - AC_MSG_CHECKING(for GSS framework) - if test -d /System/Library/Frameworks/GSS.framework; then - AC_MSG_RESULT(yes) - LIBGSSAPI="$LIBGSSAPI -weak_framework GSS" - else - AC_MSG_RESULT(no) - fi - ;; - sunos*) - # Solaris has a non-standard krb5-config, don't use it! - AC_CHECK_LIB(gss, gss_display_status, - AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) - CFLAGS="`$KRB5CONFIG --cflags` $CFLAGS" - CPPFLAGS="`$KRB5CONFIG --cflags` $CPPFLAGS" - LIBGSSAPI="-lgss `$KRB5CONFIG --libs`") - ;; - *) - # Other platforms just ask for GSSAPI - CFLAGS="`$KRB5CONFIG --cflags gssapi` $CFLAGS" - CPPFLAGS="`$KRB5CONFIG --cflags gssapi` $CPPFLAGS" - LIBGSSAPI="`$KRB5CONFIG --libs gssapi`" - ;; - esac - AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) - else - # Check for vendor-specific implementations... - case "$host_os_name" in - hp-ux*) - AC_CHECK_LIB(gss, gss_display_status, - AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) - LIBGSSAPI="-lgss -lgssapi_krb5") - ;; - sunos*) - AC_CHECK_LIB(gss, gss_display_status, - AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) - LIBGSSAPI="-lgss") - ;; - esac - fi - - 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 - 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)) - fi - - SAVELIBS="$LIBS" - LIBS="$LIBS $LIBGSSAPI" - - AC_CHECK_FUNC(__ApplePrivate_gss_acquire_cred_ex_f, - AC_DEFINE(HAVE_GSS_ACQUIRE_CRED_EX_F)) - - AC_MSG_CHECKING(for GSS_C_NT_HOSTBASED_SERVICE) - if test x$ac_cv_header_gssapi_gssapi_h = xyes; then - AC_TRY_COMPILE([ #include ], - [ gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ], - AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE) - AC_MSG_RESULT(yes), - AC_MSG_RESULT(no)) - elif test x$ac_cv_header_gss_gssapi_h = xyes; then - AC_TRY_COMPILE([ #include ], - [ gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ], - AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE) - AC_MSG_RESULT(yes), - AC_MSG_RESULT(no)) - else - AC_TRY_COMPILE([ #include ], - [ gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ], - AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE) - AC_MSG_RESULT(yes), - AC_MSG_RESULT(no)) - fi - - LIBS="$SAVELIBS" - fi -fi +AS_IF([test x$enable_gssapi = xyes], [ + AC_PATH_TOOL([KRB5CONFIG], [krb5-config]) + AS_CASE(["$host_os_name"], [darwin*], [ + # macOS weak-links to the Kerberos framework... + AC_DEFINE([HAVE_GSSAPI], [1], [Is GSSAPI available?]) + LIBGSSAPI="-weak_framework Kerberos" + AC_MSG_CHECKING([for GSS framework]) + AS_IF([test -d /System/Library/Frameworks/GSS.framework], [ + AC_MSG_RESULT([yes]) + LIBGSSAPI="$LIBGSSAPI -weak_framework GSS" + ], [ + AC_MSG_RESULT([no]) + ]) + ], [sunos*], [ + # Solaris has a non-standard krb5-config, don't use it! + SAVELIBS="$LIBS" + AC_CHECK_LIB([gss], [gss_display_status], [ + AC_DEFINE([HAVE_GSSAPI], [1], [Is GSSAPI available?]) + AS_IF([test "x$KRB5CONFIG" != x], [ + CFLAGS="$($KRB5CONFIG --cflags) $CFLAGS" + CPPFLAGS="$($KRB5CONFIG --cflags) $CPPFLAGS" + LIBGSSAPI="-lgss $($KRB5CONFIG --libs)" + ], [ + LIBGSSAPI="-lgss" + ]) + ], [ + AC_MSG_ERROR([--enable-gssapi specified but GSSAPI library cannot be found.]) + ]) + LIBS="$SAVELIBS" + ], [*], [ + # Other platforms just ask for GSSAPI + AS_IF([test "x$KRB5CONFIG" = x], [ + AC_MSG_ERROR([--enable-gssapi specified but krb5-config cannot be found.]) + ], [ + AC_DEFINE([HAVE_GSSAPI], [1], [Is GSSAPI available?]) + CFLAGS="$($KRB5CONFIG --cflags gssapi) $CFLAGS" + CPPFLAGS="$($KRB5CONFIG --cflags gssapi) $CPPFLAGS" + LIBGSSAPI="$($KRB5CONFIG --libs gssapi)" + ]) + ]) + + AC_CHECK_HEADER([krb5.h], [AC_DEFINE([HAVE_KRB5_H], [1], [Have header?])]) + AS_IF([test -d /System/Library/Frameworks/GSS.framework], [ + AC_CHECK_HEADER([GSS/gssapi.h], [AC_DEFINE([HAVE_GSS_GSSAPI_H], [1], [Have header?])]) + AC_CHECK_HEADER([GSS/gssapi_generic.h], [AC_DEFINE([HAVE_GSS_GSSAPI_GENERIC_H], [1], [Have header?])]) + AC_CHECK_HEADER([GSS/gssapi_spi.h], [AC_DEFINE([HAVE_GSS_GSSAPI_SPI_H], [1], [Have header?])]) + ], [ + AC_CHECK_HEADER([gssapi.h], [AC_DEFINE([HAVE_GSSAPI_H], [1], [Have header?])]) + AC_CHECK_HEADER([gssapi/gssapi.h], [AC_DEFINE([HAVE_GSSAPI_GSSAPI_H], [1], [Have header?])]) + ]) + + SAVELIBS="$LIBS" + LIBS="$LIBS $LIBGSSAPI" + PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC $LIBGSSAPI" + + AC_CHECK_FUNC([__ApplePrivate_gss_acquire_cred_ex_f], [ + AC_DEFINE([HAVE_GSS_ACQUIRE_CRED_EX_F], [1], [Have __ApplePrivate_gss_acquire_cred_ex_f function?]) + ]) + + AC_MSG_CHECKING([for GSS_C_NT_HOSTBASED_SERVICE]) + AS_IF([test x$ac_cv_header_gssapi_gssapi_h = xyes], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[ + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ]]) + ], [ + AC_DEFINE([HAVE_GSS_C_NT_HOSTBASED_SERVICE], [1], [Have GSS_C_NT_HOSTBASED_SERVICE?]) + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) + ], [test x$ac_cv_header_gss_gssapi_h = xyes], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[ + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ]]) + ], [ + AC_DEFINE([HAVE_GSS_C_NT_HOSTBASED_SERVICE], [1], [Have GSS_C_NT_HOSTBASED_SERVICE?]) + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) + ], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[ + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ]]) + ], [ + AC_DEFINE([HAVE_GSS_C_NT_HOSTBASED_SERVICE], [1], [Have GSS_C_NT_HOSTBASED_SERVICE?]) + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) + ]) + + LIBS="$SAVELIBS" +]) dnl Default GSS service name... -AC_ARG_WITH(gssservicename, [ --with-gssservicename set default gss service name], - default_gssservicename="$withval", - default_gssservicename="default") - -if test x$default_gssservicename != xno; then - if test "x$default_gssservicename" = "xdefault"; then - CUPS_DEFAULT_GSSSERVICENAME="host" - else - CUPS_DEFAULT_GSSSERVICENAME="$default_gssservicename" - fi -else - CUPS_DEFAULT_GSSSERVICENAME="" -fi +AC_ARG_WITH([gssservicename], AS_HELP_STRING([--with-gssservicename], [set default gss service name]), [ + default_gssservicename="$withval" +], [ + default_gssservicename="default" +]) + +AS_IF([test x$default_gssservicename != xno], [ + AS_IF([test "x$default_gssservicename" = "xdefault"], [ + CUPS_DEFAULT_GSSSERVICENAME="host" + ], [ + CUPS_DEFAULT_GSSSERVICENAME="$default_gssservicename" + ]) +], [ + CUPS_DEFAULT_GSSSERVICENAME="" +]) -AC_SUBST(CUPS_DEFAULT_GSSSERVICENAME) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GSSSERVICENAME, "$CUPS_DEFAULT_GSSSERVICENAME") +AC_SUBST([CUPS_DEFAULT_GSSSERVICENAME]) +AC_DEFINE_UNQUOTED([CUPS_DEFAULT_GSSSERVICENAME], ["$CUPS_DEFAULT_GSSSERVICENAME"], [Default GSSServiceName value.]) diff -Nru cups-2.3.3op2/config-scripts/cups-largefile.m4 cups-2.4.1op1/config-scripts/cups-largefile.m4 --- cups-2.3.3op2/config-scripts/cups-largefile.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-largefile.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ dnl dnl Large file support stuff for CUPS. dnl -dnl Copyright 2007-2011 by Apple Inc. -dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl Copyright © 2021 by OpenPrinting. +dnl Copyright © 2007-2011 by Apple Inc. +dnl Copyright © 1997-2005 by Easy Software Products, all rights reserved. dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. dnl dnl Check for largefile support... @@ -12,31 +14,38 @@ dnl Define largefile options as needed... LARGEFILE="" -if test x$enable_largefile != xno; then - LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" +AS_IF([test x$enable_largefile != xno], [ + LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" - if test x$ac_cv_sys_large_files = x1; then - LARGEFILE="$LARGEFILE -D_LARGE_FILES" - fi - - if test x$ac_cv_sys_file_offset_bits = x64; then - LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" - fi -fi -AC_SUBST(LARGEFILE) + AS_IF([test x$ac_cv_sys_large_files = x1], [ + LARGEFILE="$LARGEFILE -D_LARGE_FILES" + ]) + + AS_IF([test x$ac_cv_sys_file_offset_bits = x64], [ + LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" + ]) +]) +AC_SUBST([LARGEFILE]) dnl Check for "long long" support... -AC_CACHE_CHECK(for long long int, ac_cv_c_long_long, - [if test "$GCC" = yes; then - ac_cv_c_long_long=yes - else - AC_TRY_COMPILE(,[long long int i;], - ac_cv_c_long_long=yes, - ac_cv_c_long_long=no) - fi]) - -if test $ac_cv_c_long_long = yes; then - AC_DEFINE(HAVE_LONG_LONG) -fi - -AC_CHECK_FUNC(strtoll, AC_DEFINE(HAVE_STRTOLL)) +AC_CACHE_CHECK([for long long int], [ac_cv_c_long_long], [ + AS_IF([test "$GCC" = yes], [ + ac_cv_c_long_long="yes" + ], [ + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ ]], [[long long int i;]]) + ], [ + ac_cv_c_long_long="yes" + ], [ + ac_cv_c_long_long="no" + ]) + ]) +]) + +AS_IF([test $ac_cv_c_long_long = yes], [ + AC_DEFINE([HAVE_LONG_LONG], [1], [Does the compiler support the long long type?]) +]) + +AC_CHECK_FUNC([strtoll], [ + AC_DEFINE([HAVE_STRTOLL], [1], [Do we have the strtoll function?]) +]) diff -Nru cups-2.3.3op2/config-scripts/cups-libtool.m4 cups-2.4.1op1/config-scripts/cups-libtool.m4 --- cups-2.3.3op2/config-scripts/cups-libtool.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-libtool.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,60 +1,60 @@ dnl dnl Libtool stuff for CUPS. dnl -dnl Copyright 2007-2018 by Apple Inc. -dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl Copyright © 2021-2022 by OpenPrinting. +dnl Copyright © 2007-2018 by Apple Inc. +dnl Copyright © 1997-2005 by Easy Software Products, all rights reserved. dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. dnl -AC_ARG_ENABLE(libtool_unsupported, [ --enable-libtool-unsupported=/path/to/libtool - build with libtool (UNSUPPORTED!)], - [if test x$enable_libtool_unsupported != xno; then - if test x$enable_libtool_unsupported == xyes; then - AC_MSG_ERROR([Use --enable-libtool-unsupported=/path/to/libtool.]) - fi - LIBTOOL="$enable_libtool_unsupported" - enable_shared=no - echo "WARNING: libtool is not supported or endorsed by Apple Inc." - echo " WE DO NOT PROVIDE SUPPORT FOR LIBTOOL PROBLEMS." - else - LIBTOOL="" - fi]) - -if test x$LIBTOOL != x; then - DSO="\$(LIBTOOL) --mode=link --tag=CC ${CC}" - DSOXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" - - LD_CC="\$(LIBTOOL) --mode=link --tag=CC ${CC}" - LD_CXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" - - LIBCUPS="libcups.la" - LIBCUPSSTATIC="libcups.la" - LIBCUPSCGI="libcupscgi.la" - LIBCUPSIMAGE="libcupsimage.la" - LIBCUPSMIME="libcupsmime.la" - LIBCUPSPPDC="libcupsppdc.la" - - LIBTOOL_CC="\$(LIBTOOL) --mode=compile --tag=CC" - LIBTOOL_CXX="\$(LIBTOOL) --mode=compile --tag=CXX" - LIBTOOL_INSTALL="\$(LIBTOOL) --mode=install" - - LINKCUPS="../cups/\$(LIBCUPS)" - LINKCUPSIMAGE="../cups/\$(LIBCUPSIMAGE)" - -else - LD_CC="\$(CC)" - LD_CXX="\$(CXX)" - - LIBTOOL_CC="" - LIBTOOL_CXX="" - LIBTOOL_INSTALL="" -fi - -AC_SUBST(LD_CC) -AC_SUBST(LD_CXX) - -AC_SUBST(LIBTOOL) -AC_SUBST(LIBTOOL_CC) -AC_SUBST(LIBTOOL_CXX) -AC_SUBST(LIBTOOL_INSTALL) +AC_ARG_ENABLE([libtool_unsupported], AS_HELP_STRING([--enable-libtool-unsupported=/path/to/libtool], [build with libtool (UNSUPPORTED)]), [ + AS_IF([test x$enable_libtool_unsupported != xno], [ + AS_IF([test x$enable_libtool_unsupported = xyes], [ + AC_MSG_ERROR([Use --enable-libtool-unsupported=/path/to/libtool.]) + ]) + LIBTOOL="$enable_libtool_unsupported" + enable_shared="no" + AC_MSG_WARN([WARNING: libtool is not supported.]) + ], [ + LIBTOOL="" + ]) +]) + +AS_IF([test x$LIBTOOL != x], [ + DSO="\$(LIBTOOL) --mode=link --tag=CC ${CC}" + DSOXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" + + LD_CC="\$(LIBTOOL) --mode=link --tag=CC ${CC}" + LD_CXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" + + LIBCUPS="libcups.la" + LIBCUPSSTATIC="libcups.la" + LIBCUPSCGI="libcupscgi.la" + LIBCUPSIMAGE="libcupsimage.la" + LIBCUPSMIME="libcupsmime.la" + LIBCUPSPPDC="libcupsppdc.la" + + LIBTOOL_CC="\$(LIBTOOL) --mode=compile --tag=CC" + LIBTOOL_CXX="\$(LIBTOOL) --mode=compile --tag=CXX" + LIBTOOL_INSTALL="\$(LIBTOOL) --mode=install" + + LINKCUPS="../cups/\$(LIBCUPS)" + LINKCUPSIMAGE="../cups/\$(LIBCUPSIMAGE)" +], [ + LD_CC="\$(CC)" + LD_CXX="\$(CXX)" + + LIBTOOL_CC="" + LIBTOOL_CXX="" + LIBTOOL_INSTALL="" +]) + +AC_SUBST([LD_CC]) +AC_SUBST([LD_CXX]) + +AC_SUBST([LIBTOOL]) +AC_SUBST([LIBTOOL_CC]) +AC_SUBST([LIBTOOL_CXX]) +AC_SUBST([LIBTOOL_INSTALL]) diff -Nru cups-2.3.3op2/config-scripts/cups-manpages.m4 cups-2.4.1op1/config-scripts/cups-manpages.m4 --- cups-2.3.3op2/config-scripts/cups-manpages.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-manpages.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ dnl dnl Manpage stuff for CUPS. dnl +dnl Copyright © 2021-2022 by OpenPrinting. dnl Copyright © 2007-2019 by Apple Inc. dnl Copyright © 1997-2006 by Easy Software Products, all rights reserved. dnl @@ -9,21 +10,19 @@ dnl dnl Fix "mandir" variable... -if test "$mandir" = "\${datarootdir}/man" -a "$prefix" = "/"; then - # New GNU "standards" break previous ones, so make sure we use - # the right default location for the operating system... - mandir="\${prefix}/man" -fi +AS_IF([test "$mandir" = "\${datarootdir}/man" -a "$prefix" = "/"], [ + # New GNU "standards" break previous ones, so make sure we use + # the right default location for the operating system... + mandir="\${prefix}/man" +]) -if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then - case "$host_os_name" in - darwin* | linux* | gnu* | *bsd*) - # Darwin, macOS, Linux, GNU HURD, and *BSD - mandir="/usr/share/man" - ;; - *) - # All others - mandir="/usr/man" - ;; - esac -fi +AS_IF([test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"], [ + AS_CASE(["$host_os_name"], [darwin* | linux* | gnu* | *bsd*], [ + # Darwin, macOS, Linux, GNU HURD, and *BSD + mandir="/usr/share/man" + ], [*], [ + # All others + mandir="/usr/man" + + ]) +]) diff -Nru cups-2.3.3op2/config-scripts/cups-network.m4 cups-2.4.1op1/config-scripts/cups-network.m4 --- cups-2.3.3op2/config-scripts/cups-network.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-network.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,66 +1,87 @@ dnl dnl Networking stuff for CUPS. dnl -dnl Copyright 2007-2016 by Apple Inc. -dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl Copyright © 2021 by OpenPrinting. +dnl Copyright © 2007-2016 by Apple Inc. +dnl Copyright © 1997-2005 by Easy Software Products, all rights reserved. dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. dnl -AC_CHECK_HEADER(resolv.h,AC_DEFINE(HAVE_RESOLV_H),,[ -#include -#include -#include -#include -#include ]) -AC_SEARCH_LIBS(socket, socket) -AC_SEARCH_LIBS(gethostbyaddr, nsl) -AC_SEARCH_LIBS(getifaddrs, nsl, AC_DEFINE(HAVE_GETIFADDRS)) -AC_SEARCH_LIBS(hstrerror, nsl socket resolv, AC_DEFINE(HAVE_HSTRERROR)) -AC_SEARCH_LIBS(rresvport_af, nsl, AC_DEFINE(HAVE_RRESVPORT_AF)) -AC_SEARCH_LIBS(__res_init, resolv bind, AC_DEFINE(HAVE_RES_INIT), - AC_SEARCH_LIBS(res_9_init, resolv bind, AC_DEFINE(HAVE_RES_INIT), - AC_SEARCH_LIBS(res_init, resolv bind, AC_DEFINE(HAVE_RES_INIT)))) - -# Tru64 5.1b leaks file descriptors with these functions; disable until -# we can come up with a test for this... -if test "$host_os_name" != "osf1"; then - AC_SEARCH_LIBS(getaddrinfo, nsl, AC_DEFINE(HAVE_GETADDRINFO)) - AC_SEARCH_LIBS(getnameinfo, nsl, AC_DEFINE(HAVE_GETNAMEINFO)) -fi - -AC_CHECK_MEMBER(struct sockaddr.sa_len,,, [#include ]) -AC_CHECK_HEADER(sys/sockio.h, AC_DEFINE(HAVE_SYS_SOCKIO_H)) +AC_CHECK_HEADER([resolv.h], [ + AC_DEFINE([HAVE_RESOLV_H], [1], [Have the header?]) +], [ +], [ + #include + #include + #include + #include + #include +]) +AC_SEARCH_LIBS([socket], [socket]) +AC_SEARCH_LIBS([gethostbyaddr], [nsl]) +AC_SEARCH_LIBS([getifaddrs], [nsl], [ + AC_DEFINE([HAVE_GETIFADDRS], [1], [Have the getifaddrs function?]) +]) +AC_SEARCH_LIBS([hstrerror], [nsl socket resolv], [ + AC_DEFINE([HAVE_HSTRERROR], [1], [Have the hstrerror function?]) +]) +AC_SEARCH_LIBS([rresvport_af], [nsl], [ + AC_DEFINE([HAVE_RRESVPORT_AF], [1], [Have the rresvport_af function?]) +]) +AC_SEARCH_LIBS([__res_init], [resolv bind], [ + AC_DEFINE([HAVE_RES_INIT], [1], [Have res_init function?]) +], [ + AC_SEARCH_LIBS([res_9_init], [resolv bind], [ + AC_DEFINE([HAVE_RES_INIT], [1], [Have res_init function?]) + ], [ + AC_SEARCH_LIBS([res_init], [resolv bind], [ + AC_DEFINE([HAVE_RES_INIT], [1], [Have res_init function?]) + ]) + ]) +]) + +AC_SEARCH_LIBS([getaddrinfo], [nsl], [ + AC_DEFINE([HAVE_GETADDRINFO], [1], [Have the getaddrinfo function?]) +]) +AC_SEARCH_LIBS([getnameinfo], [nsl], [ + AC_DEFINE([HAVE_GETNAMEINFO], [1], [Have the getnameinfo function?]) +]) + +AC_CHECK_MEMBER([struct sockaddr.sa_len],,, [#include ]) +AC_CHECK_HEADER([sys/sockio.h], [ + AC_DEFINE([HAVE_SYS_SOCKIO_H], [1], [Have header?]) +]) +dnl Domain socket support... CUPS_DEFAULT_DOMAINSOCKET="" -dnl Domain socket support... -AC_ARG_WITH(domainsocket, [ --with-domainsocket set unix domain socket name], - default_domainsocket="$withval", - default_domainsocket="") - -if test x$enable_domainsocket != xno -a x$default_domainsocket != xno; then - if test "x$default_domainsocket" = x; then - case "$host_os_name" in - darwin*) - # Darwin and macOS do their own thing... - CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd" - ;; - *) - # All others use FHS standard... - CUPS_DEFAULT_DOMAINSOCKET="$CUPS_STATEDIR/cups.sock" - ;; - esac - else - CUPS_DEFAULT_DOMAINSOCKET="$default_domainsocket" - fi - - CUPS_LISTEN_DOMAINSOCKET="Listen $CUPS_DEFAULT_DOMAINSOCKET" - - AC_DEFINE_UNQUOTED(CUPS_DEFAULT_DOMAINSOCKET, "$CUPS_DEFAULT_DOMAINSOCKET") -else - CUPS_LISTEN_DOMAINSOCKET="" -fi +AC_ARG_WITH([domainsocket], AS_HELP_STRING([--with-domainsocket], [set unix domain socket name]), [ + default_domainsocket="$withval" +], [ + default_domainsocket="" +]) + +AS_IF([test x$enable_domainsocket != xno -a x$default_domainsocket != xno], [ + AS_IF([test "x$default_domainsocket" = x], [ + AS_CASE(["$host_os_name"], [darwin*], [ + # Darwin and macOS do their own thing... + CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd" + ], [*], [ + # All others use FHS standard... + CUPS_DEFAULT_DOMAINSOCKET="$CUPS_STATEDIR/cups.sock" + ]) + ], [ + CUPS_DEFAULT_DOMAINSOCKET="$default_domainsocket" + ]) + + CUPS_LISTEN_DOMAINSOCKET="Listen $CUPS_DEFAULT_DOMAINSOCKET" + + AC_DEFINE_UNQUOTED([CUPS_DEFAULT_DOMAINSOCKET], ["$CUPS_DEFAULT_DOMAINSOCKET"], [Domain socket path.]) +], [ + CUPS_LISTEN_DOMAINSOCKET="" +]) -AC_SUBST(CUPS_DEFAULT_DOMAINSOCKET) -AC_SUBST(CUPS_LISTEN_DOMAINSOCKET) +AC_SUBST([CUPS_DEFAULT_DOMAINSOCKET]) +AC_SUBST([CUPS_LISTEN_DOMAINSOCKET]) diff -Nru cups-2.3.3op2/config-scripts/cups-opsys.m4 cups-2.4.1op1/config-scripts/cups-opsys.m4 --- cups-2.3.3op2/config-scripts/cups-opsys.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-opsys.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ dnl dnl Operating system stuff for CUPS. dnl +dnl Copyright © 2021-2022 by OpenPrinting. dnl Copyright © 2007-2019 by Apple Inc. dnl Copyright © 1997-2006 by Easy Software Products, all rights reserved. dnl @@ -12,21 +13,21 @@ AC_CANONICAL_BUILD AC_CANONICAL_HOST -[host_os_name=`echo $host_os | sed -e '1,$s/[0-9.]*$//g'`] -[host_os_version=`echo $host_os | sed -e '1,$s/^[^0-9.]*//g' | awk -F. '{print $1 $2}'`] +[host_os_name="$(echo $host_os | sed -e '1,$s/[0-9.]*$//g')"] +[host_os_version="$(echo $host_os | sed -e '1,$s/^[^0-9.]*//g' | awk -F. '{print $1 $2}')"] # Linux often does not yield an OS version we can use... -if test "x$host_os_version" = x; then - host_os_version="0" -fi +AS_IF([test "x$host_os_version" = x], [ + host_os_version="0" +]) dnl Determine whether we are cross-compiling... -if test "$build" = "$host"; then - # No, build local targets - LOCALTARGET="local" -else - # Yes, don't build local targets - LOCALTARGET="" -fi -AC_SUBST(LOCALTARGET) +AS_IF([test "$build" = "$host"], [ + # No, build local targets + LOCALTARGET="local" +], [ + # Yes, don't build local targets + LOCALTARGET="" +]) +AC_SUBST([LOCALTARGET]) -AC_PATH_PROGS(CODE_SIGN, codesign true) +AC_PATH_PROGS([CODE_SIGN], [codesign true]) diff -Nru cups-2.3.3op2/config-scripts/cups-pam.m4 cups-2.4.1op1/config-scripts/cups-pam.m4 --- cups-2.3.3op2/config-scripts/cups-pam.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-pam.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,14 +1,16 @@ dnl dnl PAM stuff for CUPS. dnl -dnl Copyright 2007-2017 by Apple Inc. -dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl Copyright © 2021 by OpenPrinting. +dnl Copyright © 2007-2017 by Apple Inc. +dnl Copyright © 1997-2005 by Easy Software Products, all rights reserved. dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. dnl -AC_ARG_ENABLE(pam, [ --disable-pam disable PAM support]) -AC_ARG_WITH(pam_module, [ --with-pam-module set the PAM module to use]) +AC_ARG_ENABLE([pam], AS_HELP_STRING([--disable-pam], [disable PAM support])) +AC_ARG_WITH([pam_module], AS_HELP_STRING([--with-pam-module], [set the PAM module to use])) PAMDIR="" PAMFILE="pam.std" @@ -16,84 +18,85 @@ PAMMOD="pam_unknown.so" PAMMODAUTH="pam_unknown.so" -if test x$enable_pam != xno; then - SAVELIBS="$LIBS" +AS_IF([test x$enable_pam != xno], [ + SAVELIBS="$LIBS" - AC_CHECK_LIB(dl,dlopen) - AC_CHECK_LIB(pam,pam_start) - AC_CHECK_LIB(pam,pam_set_item,AC_DEFINE(HAVE_PAM_SET_ITEM)) - AC_CHECK_LIB(pam,pam_setcred,AC_DEFINE(HAVE_PAM_SETCRED)) - AC_CHECK_HEADER(security/pam_appl.h) - if test x$ac_cv_header_security_pam_appl_h != xyes; then - AC_CHECK_HEADER(pam/pam_appl.h, - AC_DEFINE(HAVE_PAM_PAM_APPL_H)) - fi - - if test x$ac_cv_lib_pam_pam_start != xno; then - # Set the necessary libraries for PAM... - if test x$ac_cv_lib_dl_dlopen != xno; then - PAMLIBS="-lpam -ldl" - else - PAMLIBS="-lpam" - fi - - # Find the PAM configuration directory, if any... - for dir in /private/etc/pam.d /etc/pam.d; do - if test -d $dir; then - PAMDIR=$dir - break; - fi - done - fi - - LIBS="$SAVELIBS" - - case "$host_os_name" in - darwin*) - # Darwin/macOS - if test "x$with_pam_module" != x; then - PAMFILE="pam.$with_pam_module" - elif test -f /usr/lib/pam/pam_opendirectory.so.2; then - PAMFILE="pam.opendirectory" - else - PAMFILE="pam.securityserver" - fi - ;; - - *) - # All others; this test might need to be updated - # as Linux distributors move things around... - if test "x$with_pam_module" != x; then - PAMMOD="pam_${with_pam_module}.so" - elif test -f /etc/pam.d/common-auth; then - PAMFILE="pam.common" - else - moddir="" - for dir in /lib/security /lib64/security /lib/x86_64-linux-gnu/security /var/lib/pam; do - if test -d $dir; then - moddir=$dir - break; - fi - done - - if test -f $moddir/pam_unix2.so; then - PAMMOD="pam_unix2.so" - elif test -f $moddir/pam_unix.so; then - PAMMOD="pam_unix.so" - fi - fi - - if test "x$PAMMOD" = xpam_unix.so; then - PAMMODAUTH="$PAMMOD shadow nodelay" - else - PAMMODAUTH="$PAMMOD nodelay" - fi - ;; - esac -fi - -AC_SUBST(PAMDIR) -AC_SUBST(PAMFILE) -AC_SUBST(PAMLIBS) -AC_SUBST(PAMMOD) -AC_SUBST(PAMMODAUTH) + AC_CHECK_LIB([dl], [dlopen]) + AC_CHECK_LIB([pam], [pam_start]) + AC_CHECK_LIB([pam], [pam_set_item], [ + AC_DEFINE([HAVE_PAM_SET_ITEM], [1], [Have pam_set_item function?]) + ]) + AC_CHECK_LIB([pam], [pam_setcred], [ + AC_DEFINE([HAVE_PAM_SETCRED], [1], [Have pam_setcred function?]) + ]) + AC_CHECK_HEADER([security/pam_appl.h]) + AS_IF([test x$ac_cv_header_security_pam_appl_h != xyes], [ + AC_CHECK_HEADER([pam/pam_appl.h], [ + AC_DEFINE([HAVE_PAM_PAM_APPL_H], [1], [Have header?]) + ]) + ]) + + AS_IF([test x$ac_cv_lib_pam_pam_start != xno], [ + # Set the necessary libraries for PAM... + AS_IF([test x$ac_cv_lib_dl_dlopen != xno], [ + PAMLIBS="-lpam -ldl" + ], [ + PAMLIBS="-lpam" + ]) + + # Find the PAM configuration directory, if any... + for dir in /private/etc/pam.d /etc/pam.d; do + AS_IF([test -d $dir], [ + PAMDIR="$dir" + break; + ]) + done + ]) + + LIBS="$SAVELIBS" + + AS_CASE(["$host_os_name"], [darwin*], [ + # Darwin/macOS + AS_IF([test "x$with_pam_module" != x], [ + PAMFILE="pam.$with_pam_module" + ], [test -f /usr/lib/pam/pam_opendirectory.so.2], [ + PAMFILE="pam.opendirectory" + ], [ + PAMFILE="pam.securityserver" + ]) + ], [*], [ + # All others; this test might need to be updated + # as Linux distributors move things around... + AS_IF([test "x$with_pam_module" != x], [ + PAMMOD="pam_${with_pam_module}.so" + ], [test -f /etc/pam.d/common-auth], [ + PAMFILE="pam.common" + ], [ + moddir="" + for dir in /lib/security /lib64/security /lib/x86_64-linux-gnu/security /var/lib/pam; do + AS_IF([test -d $dir], [ + moddir="$dir" + break; + ]) + done + + AS_IF([test -f $moddir/pam_unix2.so], [ + PAMMOD="pam_unix2.so" + ], [test -f $moddir/pam_unix.so], [ + PAMMOD="pam_unix.so" + ]) + ]) + + AS_IF([test "x$PAMMOD" = xpam_unix.so], [ + PAMMODAUTH="$PAMMOD shadow nodelay" + ], [ + PAMMODAUTH="$PAMMOD nodelay" + ]) + ]) +]) + +AC_SUBST([PAMDIR]) +AC_SUBST([PAMFILE]) +AC_SUBST([PAMLIBS]) +AC_SUBST([PAMMOD]) +AC_SUBST([PAMMODAUTH]) diff -Nru cups-2.3.3op2/config-scripts/cups-poll.m4 cups-2.4.1op1/config-scripts/cups-poll.m4 --- cups-2.3.3op2/config-scripts/cups-poll.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-poll.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,20 @@ dnl dnl Select/poll stuff for CUPS. dnl -dnl Copyright 2007-2011 by Apple Inc. -dnl Copyright 2006 by Easy Software Products, all rights reserved. +dnl Copyright © 2021-2022 by OpenPrinting. +dnl Copyright © 2007-2011 by Apple Inc. +dnl Copyright © 2006 by Easy Software Products, all rights reserved. dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. dnl -AC_CHECK_FUNC(poll, AC_DEFINE(HAVE_POLL)) -AC_CHECK_FUNC(epoll_create, AC_DEFINE(HAVE_EPOLL)) -AC_CHECK_FUNC(kqueue, AC_DEFINE(HAVE_KQUEUE)) +AC_CHECK_FUNC([poll], [ + AC_DEFINE([HAVE_POLL], [1], [Have poll function?]) +]) +AC_CHECK_FUNC([epoll_create], [ + AC_DEFINE([HAVE_EPOLL], [1], [Have epoll function?]) +]) +AC_CHECK_FUNC([kqueue], [ + AC_DEFINE([HAVE_KQUEUE], [1], [Have kqueue function?]) +]) diff -Nru cups-2.3.3op2/config-scripts/cups-sharedlibs.m4 cups-2.4.1op1/config-scripts/cups-sharedlibs.m4 --- cups-2.3.3op2/config-scripts/cups-sharedlibs.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-sharedlibs.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ dnl dnl Shared library support for CUPS. dnl +dnl Copyright © 2021 by OpenPrinting. dnl Copyright © 2007-2018 by Apple Inc. dnl Copyright © 1997-2005 by Easy Software Products, all rights reserved. dnl @@ -8,119 +9,109 @@ dnl information. dnl -PICFLAG=1 +PICFLAG="1" DSOFLAGS="${DSOFLAGS:=}" -AC_ARG_ENABLE(shared, [ --disable-shared do not create shared libraries]) +AC_ARG_ENABLE([shared], AS_HELP_STRING([--disable-shared], [do not create shared libraries])) cupsbase="cups" LIBCUPSBASE="lib$cupsbase" LIBCUPSIMAGE="" LIBCUPSSTATIC="lib$cupsbase.a" -if test x$enable_shared != xno; then - case "$host_os_name" in - sunos*) - LIBCUPS="lib$cupsbase.so.2" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.so.2" - fi - DSO="\$(CC)" - DSOXX="\$(CXX)" - DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G" - ;; - linux* | gnu* | *bsd*) - LIBCUPS="lib$cupsbase.so.2" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.so.2" - fi - DSO="\$(CC)" - DSOXX="\$(CXX)" - DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" - ;; - darwin*) - LIBCUPS="lib$cupsbase.2.dylib" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.2.dylib" - fi - DSO="\$(CC)" - DSOXX="\$(CXX)" - DSOFLAGS="$DSOFLAGS -Wl,-no_warn_inits -dynamiclib -single_module -lc" - ;; - *) - echo "Warning: shared libraries may not be supported. Trying -shared" - echo " option with compiler." - LIBCUPS="lib$cupsbase.so.2" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.so.2" - fi - DSO="\$(CC)" - DSOXX="\$(CXX)" - DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" - ;; - esac -else - PICFLAG=0 - LIBCUPS="lib$cupsbase.a" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.a" - fi - DSO=":" - DSOXX=":" -fi - -AC_SUBST(DSO) -AC_SUBST(DSOXX) -AC_SUBST(DSOFLAGS) -AC_SUBST(LIBCUPS) -AC_SUBST(LIBCUPSBASE) -AC_SUBST(LIBCUPSIMAGE) -AC_SUBST(LIBCUPSSTATIC) - -if test x$enable_shared = xno; then - LINKCUPS="../cups/lib$cupsbase.a \$(LIBS)" - EXTLINKCUPS="-lcups \$LIBS" -else - LINKCUPS="-L../cups -l${cupsbase}" - EXTLINKCUPS="-lcups" -fi +AS_IF([test x$enable_shared != xno], [ + AS_CASE(["$host_os_name"], [sunos*], [ + LIBCUPS="lib$cupsbase.so.2" + AS_IF([test "x$cupsimagebase" != x], [ + LIBCUPSIMAGE="lib$cupsimagebase.so.2" + ]) + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G" + ], [linux* | gnu* | *bsd*], [ + LIBCUPS="lib$cupsbase.so.2" + AS_IF([test "x$cupsimagebase" != x], [ + LIBCUPSIMAGE="lib$cupsimagebase.so.2" + ]) + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" + ], [darwin*], [ + LIBCUPS="lib$cupsbase.2.dylib" + AS_IF([test "x$cupsimagebase" != x], [ + LIBCUPSIMAGE="lib$cupsimagebase.2.dylib" + ]) + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-no_warn_inits -dynamiclib -single_module -lc" + ], [*], [ + AC_MSG_NOTICE([Warning: Shared libraries may not work, trying -shared option.]) + LIBCUPS="lib$cupsbase.so.2" + AS_IF([test "x$cupsimagebase" != x], [ + LIBCUPSIMAGE="lib$cupsimagebase.so.2" + ]) + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" + ]) +], [ + PICFLAG=0 + LIBCUPS="lib$cupsbase.a" + AS_IF([test "x$cupsimagebase" != x], [ + LIBCUPSIMAGE="lib$cupsimagebase.a" + ]) + DSO=":" + DSOXX=":" +]) + +AC_SUBST([DSO]) +AC_SUBST([DSOXX]) +AC_SUBST([DSOFLAGS]) +AC_SUBST([LIBCUPS]) +AC_SUBST([LIBCUPSBASE]) +AC_SUBST([LIBCUPSIMAGE]) +AC_SUBST([LIBCUPSSTATIC]) + +AS_IF([test x$enable_shared = xno], [ + LINKCUPS="../cups/lib$cupsbase.a \$(LIBS)" + EXTLINKCUPS="-lcups \$LIBS" +], [ + LINKCUPS="-L../cups -l${cupsbase}" + EXTLINKCUPS="-lcups" +]) -AC_SUBST(EXTLINKCUPS) -AC_SUBST(LINKCUPS) +AC_SUBST([EXTLINKCUPS]) +AC_SUBST([LINKCUPS]) dnl Update libraries for DSOs... EXPORT_LDFLAGS="" -if test "$DSO" != ":"; then - # Tell the run-time linkers where to find a DSO. Some platforms - # need this option, even when the library is installed in a - # standard location... - case $host_os_name in - sunos*) - # Solaris... - if test $exec_prefix != /usr; then - DSOFLAGS="-R$libdir $DSOFLAGS" - LDFLAGS="$LDFLAGS -R$libdir" - EXPORT_LDFLAGS="-R$libdir" - fi - ;; - *bsd*) - # *BSD... - if test $exec_prefix != /usr; then - DSOFLAGS="-Wl,-R$libdir $DSOFLAGS" - LDFLAGS="$LDFLAGS -Wl,-R$libdir" - EXPORT_LDFLAGS="-Wl,-R$libdir" - fi - ;; - linux* | gnu*) - # Linux, and HURD... - if test $exec_prefix != /usr; then - DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS" - LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir" - EXPORT_LDFLAGS="-Wl,-rpath,$libdir" - fi - ;; - esac -fi +AS_IF([test "$DSO" != ":"], [ + # Tell the run-time linkers where to find a DSO. Some platforms + # need this option, even when the library is installed in a + # standard location... + AS_CASE([$host_os_name], [sunos*], [ + # Solaris... + AS_IF([test $exec_prefix != /usr], [ + DSOFLAGS="-R$libdir $DSOFLAGS" + LDFLAGS="$LDFLAGS -R$libdir" + EXPORT_LDFLAGS="-R$libdir" + ]) + ], [*bsd*], [ + # *BSD... + AS_IF([test $exec_prefix != /usr], [ + DSOFLAGS="-Wl,-R$libdir $DSOFLAGS" + LDFLAGS="$LDFLAGS -Wl,-R$libdir" + EXPORT_LDFLAGS="-Wl,-R$libdir" + ]) + ], [linux* | gnu*], [ + # Linux, and HURD... + AS_IF([test $exec_prefix != /usr], [ + DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS" + LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir" + EXPORT_LDFLAGS="-Wl,-rpath,$libdir" + ]) + ]) +]) -AC_SUBST(EXPORT_LDFLAGS) +AC_SUBST([EXPORT_LDFLAGS]) diff -Nru cups-2.3.3op2/config-scripts/cups-ssl.m4 cups-2.4.1op1/config-scripts/cups-ssl.m4 --- cups-2.3.3op2/config-scripts/cups-ssl.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-ssl.m4 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -dnl -dnl TLS stuff for CUPS. -dnl -dnl Copyright 2007-2019 by Apple Inc. -dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. -dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. -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]) - -SSLFLAGS="" -SSLLIBS="" -have_ssl=0 -CUPS_SERVERKEYCHAIN="" - -if test x$enable_ssl != xno; then - dnl Look for CDSA... - if test $have_ssl = 0 -a "x$enable_cdsassl" != "xno"; then - if test $host_os_name = darwin; then - AC_CHECK_HEADER(Security/SecureTransport.h, [ - have_ssl=1 - AC_DEFINE(HAVE_SSL) - AC_DEFINE(HAVE_CDSASSL) - CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain" - - dnl Check for the various security headers... - AC_CHECK_HEADER(Security/SecCertificate.h, - AC_DEFINE(HAVE_SECCERTIFICATE_H)) - AC_CHECK_HEADER(Security/SecItem.h, - AC_DEFINE(HAVE_SECITEM_H)) - AC_CHECK_HEADER(Security/SecPolicy.h, - AC_DEFINE(HAVE_SECPOLICY_H))]) - 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_TOOL(LIBGNUTLSCONFIG,libgnutls-config) - if $PKGCONFIG --exists gnutls; then - have_ssl=1 - SSLLIBS=`$PKGCONFIG --libs gnutls` - SSLFLAGS=`$PKGCONFIG --cflags gnutls` - AC_DEFINE(HAVE_SSL) - AC_DEFINE(HAVE_GNUTLS) - elif test "x$LIBGNUTLSCONFIG" != x; then - have_ssl=1 - SSLLIBS=`$LIBGNUTLSCONFIG --libs` - SSLFLAGS=`$LIBGNUTLSCONFIG --cflags` - AC_DEFINE(HAVE_SSL) - AC_DEFINE(HAVE_GNUTLS) - fi - - if test $have_ssl = 1; then - CUPS_SERVERKEYCHAIN="ssl" - - SAVELIBS="$LIBS" - 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 - -IPPALIASES="http" -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; then - AC_MSG_ERROR([Unable to enable SSL support.]) -fi - -AC_SUBST(CUPS_SERVERKEYCHAIN) -AC_SUBST(IPPALIASES) -AC_SUBST(SSLFLAGS) -AC_SUBST(SSLLIBS) - -EXPORT_SSLLIBS="$SSLLIBS" -AC_SUBST(EXPORT_SSLLIBS) diff -Nru cups-2.3.3op2/config-scripts/cups-startup.m4 cups-2.4.1op1/config-scripts/cups-startup.m4 --- cups-2.3.3op2/config-scripts/cups-startup.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-startup.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,183 +1,221 @@ dnl dnl Launch-on-demand/startup stuff for CUPS. dnl -dnl Copyright 2007-2017 by Apple Inc. -dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl Copyright © 2021 by OpenPrinting. +dnl Copyright © 2007-2017 by Apple Inc. +dnl Copyright © 1997-2005 by Easy Software Products, all rights reserved. dnl -dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. dnl ONDEMANDFLAGS="" ONDEMANDLIBS="" -AC_SUBST(ONDEMANDFLAGS) -AC_SUBST(ONDEMANDLIBS) +AC_SUBST([ONDEMANDFLAGS]) +AC_SUBST([ONDEMANDLIBS]) + +AC_ARG_WITH([ondemand], AS_HELP_STRING([--with-ondemand=...], [Specify the on-demand launch interface (launchd, systemd, upstart)])) + +AS_IF([test "x$with_ondemand" = x], [ + AS_IF([test $host_os_name = darwin], [ + with_ondemand="launchd" + ], [ + with_ondemand="yes" + ]) +], [test "x$with_ondemand" = xyes -a $host_os_name = darwin], [ + with_ondemand="launchd" +], [test "x$with_ondemand" != xno -a "x$with_ondemand" != xsystemd -a "x$with_ondemand" != xupstart -a "x$with_ondemand" != xyes], [ + AC_MSG_ERROR([Unknown --with-ondemand value "$with_ondemand" specified.]) +]) dnl Launchd is used on macOS/Darwin... -AC_ARG_ENABLE(launchd, [ --disable-launchd disable launchd support]) LAUNCHD_DIR="" -AC_SUBST(LAUNCHD_DIR) +AC_SUBST([LAUNCHD_DIR]) -if test x$enable_launchd != xno; then - AC_CHECK_FUNC(launch_activate_socket, [ - AC_DEFINE(HAVE_LAUNCHD) - AC_DEFINE(HAVE_ONDEMAND)]) - AC_CHECK_HEADER(launch.h, AC_DEFINE(HAVE_LAUNCH_H)) - - if test "$host_os_name" = darwin; then - LAUNCHD_DIR="/System/Library/LaunchDaemons" - # liblaunch is already part of libSystem - fi -fi +AS_IF([test $with_ondemand = launchd], [ + AC_CHECK_FUNC([launch_activate_socket], [ + AC_DEFINE([HAVE_LAUNCHD], [1], [Have launchd support?]) + AC_DEFINE([HAVE_ONDEMAND], [1], [Have on-demand launch support?]) + with_ondemand="launchd" + ], [ + AS_IF([test $with_ondemand = launchd], [ + AC_MSG_ERROR([Need launch_activate_socket/liblaunch for launchd support.]) + ]) + ]) + AC_CHECK_HEADER([launch.h], [ + AC_DEFINE([HAVE_LAUNCH_H], [1], [Have header?]) + ]) + + AS_IF([test $host_os_name = darwin], [ + LAUNCHD_DIR="/System/Library/LaunchDaemons" + # liblaunch is already part of libSystem + ]) +]) 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_DEFINE(HAVE_ONDEMAND) - 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 Upstart is also used on Linux (e.g., Chrome OS) -AC_ARG_ENABLE(upstart, [ --enable-upstart enable upstart support]) -if test "x$enable_upstart" = "xyes"; then - if test "x$have_systemd" = "xyes"; then - AC_MSG_ERROR(Cannot support both systemd and upstart.) - fi - AC_DEFINE(HAVE_UPSTART) - AC_DEFINE(HAVE_ONDEMAND) -fi +AC_ARG_WITH([systemd], AS_HELP_STRING([--with-systemd], [set directory for systemd service files]), [ + SYSTEMD_DIR="$withval" +], [ + SYSTEMD_DIR="" +]) +AC_SUBST([SYSTEMD_DIR]) + +AS_IF([test $with_ondemand = systemd -o $with_ondemand = yes], [ + AS_IF([test "x$PKGCONFIG" = x], [ + AS_IF([test $with_ondemand = systemd], [ + AC_MSG_ERROR([Need pkg-config to enable systemd support.]) + ]) + ], [ + AC_MSG_CHECKING([for libsystemd]) + have_systemd="no" + AS_IF([$PKGCONFIG --exists libsystemd], [ + AC_MSG_RESULT([yes]) + have_systemd="yes" + with_ondemand="systemd" + ONDEMANDFLAGS="$($PKGCONFIG --cflags libsystemd)" + ONDEMANDLIBS="$($PKGCONFIG --libs libsystemd)" + ], [$PKGCONFIG --exists libsystemd-daemon], [ + AC_MSG_RESULT([yes - legacy]) + have_systemd="yes" + with_ondemand="systemd" + ONDEMANDFLAGS="$($PKGCONFIG --cflags libsystemd-daemon)" + ONDEMANDLIBS="$($PKGCONFIG --libs libsystemd-daemon)" + + AS_IF([$PKGCONFIG --exists libsystemd-journal], [ + ONDEMANDFLAGS="$ONDEMANDFLAGS $($PKGCONFIG --cflags libsystemd-journal)" + ONDEMANDLIBS="$ONDEMANDLIBS $($PKGCONFIG --libs libsystemd-journal)" + ]) + ], [ + AC_MSG_RESULT([no]) + ]) + + AS_IF([test $have_systemd = yes], [ + AC_DEFINE([HAVE_SYSTEMD], [1], [Have systemd support?]) + AC_DEFINE([HAVE_ONDEMAND], [1], [Have on-demand launch support?]) + AC_CHECK_HEADER([systemd/sd-journal.h], [ + AC_DEFINE([HAVE_SYSTEMD_SD_JOURNAL_H], [1], [Have header?]) + ]) + AS_IF([test "x$SYSTEMD_DIR" = x], [ + SYSTEMD_DIR="$($PKGCONFIG --variable=systemdsystemunitdir systemd)" + ]) + ]) + ]) +]) + +dnl Upstart is also used on Linux (e.g., ChromeOS) +AS_IF([test $with_ondemand = upstart], [ + AC_DEFINE([HAVE_UPSTART]. [1], [Have upstart support?]) + AC_DEFINE([HAVE_ONDEMAND], [1], [Have on-demand launch support?]) +]) dnl Solaris uses smf -SMFMANIFESTDIR="" -AC_SUBST(SMFMANIFESTDIR) -AC_ARG_WITH(smfmanifestdir, [ --with-smfmanifestdir set path for Solaris SMF manifest],SMFMANIFESTDIR="$withval") +AC_ARG_WITH([smfmanifestdir], AS_HELP_STRING([--with-smfmanifestdir], [set path for Solaris SMF manifest]), [ + SMFMANIFESTDIR="$withval" +], [ + SMFMANIFESTDIR="" +]) +AC_SUBST([SMFMANIFESTDIR]) 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 "$host_os_name" in - linux* | gnu*) - # Linux - rcstart="81" - ;; - - sunos*) - # Solaris - rcstart="81" - ;; - - *) - # Others - rcstart="99" - ;; - esac -fi - -if test "x$rcstop" = x; then - case "$host_os_name" in - linux* | gnu*) - # Linux - rcstop="36" - ;; - - *) - # Others - rcstop="00" - ;; - esac -fi +AC_ARG_WITH([rcdir], AS_HELP_STRING([--with-rcdir], [set path for rc scripts]), [ + rcdir="$withval" +], [ + rcdir="" +]) +AC_ARG_WITH([rclevels], AS_HELP_STRING([--with-rclevels], [set run levels for rc scripts]), [ + rclevels="$withval" +], [ + rclevels="2 3 5" +]) +AC_ARG_WITH([rcstart], AS_HELP_STRING([--with-rcstart], [set start number for rc scripts]), [ + rcstart="$withval" +], [ + rcstart="" +]) +AC_ARG_WITH([rcstop], AS_HELP_STRING([--with-rcstop], [set stop number for rc scripts]), [ + rcstop="$withval" +], [ + rcstop="" +]) + +AS_IF([test "x$rcdir" = x], [ + AS_IF([test "x$LAUNCHD_DIR" = x -a "x$SYSTEMD_DIR" = x -a "x$SMFMANIFESTDIR" = x], [ + # Fall back on "init", the original service startup interface... + AS_IF([test -d /sbin/init.d], [ + # SuSE + rcdir="/sbin/init.d" + ], [test -d /etc/init.d], [ + # Others + rcdir="/etc" + ], [ + # RedHat, NetBSD + rcdir="/etc/rc.d" + ]) + ], [ + rcdir="no" + ]) +]) + +AS_IF([test "x$rcstart" = x], [ + AS_CASE(["$host_os_name"], [linux* | gnu*], [ + # Linux + rcstart="81" + ], [sunos*], [ + # Solaris + rcstart="81" + ], [*], [ + # Others + rcstart="99" + ]) +]) + +AS_IF([test "x$rcstop" = x], [ + AS_CASE(["$host_os_name"], [linux* | gnu*], [ + # Linux + rcstop="36" + ], [*], [ + # Others + rcstop="00" + ]) +]) 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 +AC_SUBST([INITDIR]) +AC_SUBST([INITDDIR]) +AC_SUBST([RCLEVELS]) +AC_SUBST([RCSTART]) +AC_SUBST([RCSTOP]) + +AS_IF([test "x$rcdir" != xno], [ + AS_IF([test "x$rclevels" = x], [ + INITDDIR="$rcdir" + ], [ + INITDIR="$rcdir" + ]) +]) dnl Xinetd support... -AC_ARG_WITH(xinetd, [ --with-xinetd set path for xinetd config files],xinetd="$withval",xinetd="") +AC_ARG_WITH([xinetd], AS_HELP_STRING([--with-xinetd], [set path for xinetd config files]), [ + xinetd="$withval" +], [ + xinetd="" +]) XINETD="" -AC_SUBST(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 +AS_IF([test "x$xinetd" = x], [ + AS_IF([test ! -x /sbin/launchd], [ + for dir in /etc/xinetd.d /usr/local/etc/xinetd.d; do + AS_IF([test -d $dir], [ + XINETD="$dir" + break + ]) + done + ]) +], [test "x$xinetd" != xno], [ + XINETD="$xinetd" +]) diff -Nru cups-2.3.3op2/config-scripts/cups-threads.m4 cups-2.4.1op1/config-scripts/cups-threads.m4 --- cups-2.3.3op2/config-scripts/cups-threads.m4 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-threads.m4 2022-01-27 11:11:42.000000000 +0000 @@ -1,44 +1,51 @@ dnl dnl Threading stuff for CUPS. dnl -dnl Copyright 2007-2017 by Apple Inc. -dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl Copyright © 2021 by OpenPrinting. +dnl Copyright © 2007-2017 by Apple Inc. +dnl Copyright © 1997-2005 by Easy Software Products, all rights reserved. dnl dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. dnl -AC_ARG_ENABLE(threads, [ --disable-threads disable multi-threading support]) - -have_pthread=no +have_pthread="no" PTHREAD_FLAGS="" +AC_SUBST([PTHREAD_FLAGS]) -if test "x$enable_threads" != xno; then - AC_CHECK_HEADER(pthread.h, AC_DEFINE(HAVE_PTHREAD_H)) - - if test x$ac_cv_header_pthread_h = xyes; then - dnl Check various threading options for the platforms we support - for flag in -lpthreads -lpthread -pthread; do - AC_MSG_CHECKING([for pthread_create using $flag]) - SAVELIBS="$LIBS" - LIBS="$flag $LIBS" - AC_TRY_LINK([#include ], - [pthread_create(0, 0, 0, 0);], - have_pthread=yes, - LIBS="$SAVELIBS") - AC_MSG_RESULT([$have_pthread]) - - if test $have_pthread = yes; then - PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" - - # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to - # be POSIX-compliant... :( - if test $host_os_name = sunos; then - PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" - fi - break - fi - done - fi -fi - -AC_SUBST(PTHREAD_FLAGS) +AC_CHECK_HEADER([pthread.h], [ + AC_DEFINE([HAVE_PTHREAD_H], [1], [Do we have the header?]) +]) + +AS_IF([test x$ac_cv_header_pthread_h = xyes], [ + dnl Check various threading options for the platforms we support + for flag in -lpthreads -lpthread -pthread; do + AC_MSG_CHECKING([for pthread_create using $flag]) + SAVELIBS="$LIBS" + LIBS="$flag $LIBS" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[ + pthread_create(0, 0, 0, 0); + ]]) + ], [ + have_pthread="yes" + ], [ + LIBS="$SAVELIBS" + ]) + AC_MSG_RESULT([$have_pthread]) + + AS_IF([test $have_pthread = yes], [ + PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" + + # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to be POSIX- + # compliant... :( + AS_IF([test $host_os_name = sunos], [ + PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" + ]) + break + ]) + done +]) + +AS_IF([test $have_pthread = no], [ + AC_MSG_ERROR([CUPS requires threading support.]) +]) diff -Nru cups-2.3.3op2/config-scripts/cups-tls.m4 cups-2.4.1op1/config-scripts/cups-tls.m4 --- cups-2.3.3op2/config-scripts/cups-tls.m4 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/config-scripts/cups-tls.m4 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,111 @@ +dnl +dnl TLS stuff for CUPS. +dnl +dnl Copyright © 2021-2022 by OpenPrinting. +dnl Copyright © 2007-2019 by Apple Inc. +dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved. +dnl +dnl Licensed under Apache License v2.0. See the file "LICENSE" for more +dnl information. +dnl + +AC_ARG_WITH([tls], AS_HELP_STRING([--with-tls=...], [use cdsa (macOS) or gnutls for TLS support])) +AS_IF([test "x$with_tls" = x], [ + with_tls="yes" +], [test "$with_tls" != cdsa -a "$with_tls" != gnutls -a "$with_tls" != no -a "$with_tls" != yes], [ + AC_MSG_ERROR([Unsupported --with-tls value "$with_tls" specified.]) +]) + +TLSFLAGS="" +TLSLIBS="" +have_tls="0" +CUPS_SERVERKEYCHAIN="" + +dnl First try using CSDA SSL (macOS)... +AS_IF([test $with_tls = yes -o $with_tls = cdsa], [ + dnl Look for CDSA... + AS_IF([test $host_os_name = darwin], [ + AC_CHECK_HEADER([Security/SecureTransport.h], [ + have_tls="1" + with_tls="cdsa" + AC_DEFINE([HAVE_TLS], [1], [Do we support TLS?]) + AC_DEFINE([HAVE_CDSASSL], [1], [Do we have the macOS SecureTransport API?]) + CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain" + + dnl Check for the various security headers... + AC_CHECK_HEADER([Security/SecCertificate.h], [ + AC_DEFINE([HAVE_SECCERTIFICATE_H], [1], [Have the header?]) + ]) + AC_CHECK_HEADER([Security/SecItem.h], [ + AC_DEFINE([HAVE_SECITEM_H], [1], [Have the header?]) + ]) + AC_CHECK_HEADER([Security/SecPolicy.h], [ + AC_DEFINE([HAVE_SECPOLICY_H], [1], [Have the , , and/or ? - */ - -#undef HAVE_STRING_H -#undef HAVE_STRINGS_H -#undef HAVE_BSTRING_H - - -/* * Do we have the long long type? */ @@ -311,10 +293,10 @@ * Which encryption libraries do we have? */ +#undef HAVE_TLS #undef HAVE_CDSASSL #undef HAVE_GNUTLS #undef HAVE_SSPISSL -#undef HAVE_SSL /* @@ -356,14 +338,21 @@ /* - * Do we have mDNSResponder for DNS Service Discovery (aka Bonjour)? + * Do we have DNS Service Discovery (aka Bonjour) support? */ #undef HAVE_DNSSD /* - * Do we have Avahi for DNS Service Discovery (aka Bonjour)? + * Do we have mDNSResponder for DNS-SD? + */ + +#undef HAVE_MDNSRESPONDER + + +/* + * Do we have Avahi for DNS-SD? */ #undef HAVE_AVAHI @@ -693,4 +682,33 @@ # endif /* __GNUC__ || __STDC_VERSION__ */ #endif /* !HAVE_ABS && !abs */ + +/* + * Building as a snap (snapcraft.io)? + */ + +#undef CUPS_SNAP + + +/* + * Have the apparmor library? + */ + +#undef HAVE_LIBAPPARMOR + + +/* + * Have the snapd-glib library? + */ + +#undef HAVE_LIBSNAPDGLIB + + +/* + * Have the snapd_client_run_snapctl2_sync function? + */ + +#undef HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC + + #endif /* !_CUPS_CONFIG_H_ */ diff -Nru cups-2.3.3op2/configure cups-2.4.1op1/configure --- cups-2.3.3op2/configure 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/configure 2022-01-27 11:11:42.000000000 +0000 @@ -1,11 +1,12 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.70 for CUPS 2.3.3op2. +# Generated by GNU Autoconf 2.71 for CUPS 2.4.1. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2017, 2020 Free Software Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. # # # This configure script is free software; the Free Software Foundation @@ -181,8 +182,7 @@ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes @@ -610,10 +610,10 @@ # Identity of this package. PACKAGE_NAME='CUPS' PACKAGE_TARNAME='cups' -PACKAGE_VERSION='2.3.3op2' -PACKAGE_STRING='CUPS 2.3.3op2' +PACKAGE_VERSION='2.4.1' +PACKAGE_STRING='CUPS 2.4.1' PACKAGE_BUGREPORT='https://github.com/openprinting/cups/issues' -PACKAGE_URL='https://openprinting.github.io/' +PACKAGE_URL='https://openprinting.github.io/cups' # Factoring default headers for most tests. ac_includes_default="\ @@ -652,14 +652,15 @@ LIBOBJS UNINSTALL_LANGUAGES INSTALL_LANGUAGES +TIMEOUTSTARTSEC +EXIT_TIMEOUT +SYSTEMD_WANTED_BY CUPS_WEBIF DEFAULT_IPP_PORT CUPS_SNMP_COMMUNITY CUPS_SNMP_ADDRESS DEFAULT_RAW_PRINTING CUPS_MAX_COPIES -CUPS_DEFAULT_SMB_CONFIG_FILE -CUPS_DEFAULT_LPD_CONFIG_FILE CUPS_DEFAULT_PRINTCAP CUPS_PRIMARY_SYSTEM_GROUP CUPS_SYSTEM_GROUPS @@ -693,6 +694,8 @@ LAUNCHD_DIR ONDEMANDLIBS ONDEMANDFLAGS +SNAPDGLIBLIBS +APPARMORLIBS IPPFIND_MAN IPPFIND_BIN DNSSD_BACKEND @@ -703,9 +706,9 @@ PAMLIBS PAMFILE PAMDIR -EXPORT_SSLLIBS -SSLLIBS -SSLFLAGS +EXPORT_TLSLIBS +TLSLIBS +TLSFLAGS IPPALIASES CUPS_SERVERKEYCHAIN LIBGNUTLSCONFIG @@ -746,15 +749,13 @@ CUPS_SERVERBIN CUPS_REQUESTS CUPS_LOGDIR +CUPS_PKGCONFPATH CUPS_LOCALEDIR -CUPS_FONTPATH CUPS_DOCROOT MENUDIR ICONDIR CUPS_DATADIR CUPS_CACHEDIR -PRIVATEINCLUDE -privateinclude LIBHEADERSPRIV LIBHEADERS LIBCUPSOBJS @@ -774,10 +775,12 @@ LIBWRAP USBQUIRKS LIBUSB -EGREP -GREP LIBPAPER LIBMALLOC +PKGCONFIG_REQUIRES +PKGCONFIG_LIBS_STATIC +PKGCONFIG_LIBS +PKGCONFIG_CFLAGS PKGCONFIG INSTALLSTATIC CUPS_HTMLVIEW @@ -806,9 +809,9 @@ CFLAGS CC AWK -CUPS_BUILD -CUPS_REVISION CUPS_VERSION +CUPS_BUILD +CUPS_API_VERSION CODE_SIGN LOCALTARGET host_os @@ -873,14 +876,11 @@ with_adminkey with_operkey with_components -with_privateinclude -with_lpdconfig -with_smbconfig with_cachedir with_icondir with_menudir with_docdir -with_fontpath +with_pkgconfpath with_logdir with_rundir enable_shared @@ -889,6 +889,7 @@ enable_debug enable_debug_guards enable_debug_printfs +enable_maintainer enable_unit_tests with_archflags with_ldarchflags @@ -897,21 +898,16 @@ with_domainsocket enable_gssapi with_gssservicename -enable_threads -enable_ssl -enable_cdsassl -enable_gnutls +with_tls enable_pam with_pam_module enable_largefile -enable_avahi -enable_dnssd +with_dnssd with_dnssd_libs with_dnssd_includes -enable_launchd -enable_systemd +with_container +with_ondemand with_systemd -enable_upstart with_smfmanifestdir with_rcdir with_rclevels @@ -939,14 +935,14 @@ with_cups_group with_system_groups with_printcap -with_lpdconfigfile -with_smbconfigfile with_max_copies enable_raw_printing with_snmp_address with_snmp_community with_ipp_port enable_webif +with_idle_exit_timeout +with_systemd_timeoutstartsec ' ac_precious_vars='build_alias host_alias @@ -1508,7 +1504,7 @@ # 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 CUPS 2.3.3op2 to adapt to many kinds of systems. +\`configure' configures CUPS 2.4.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1574,7 +1570,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of CUPS 2.3.3op2:";; + short | recursive ) echo "Configuration of CUPS 2.4.1:";; esac cat <<\_ACEOF @@ -1591,53 +1587,42 @@ --disable-dbus build without DBUS support --disable-shared do not create shared libraries --enable-libtool-unsupported=/path/to/libtool - build with libtool (UNSUPPORTED!) + build with libtool (UNSUPPORTED) --enable-debug build with debugging symbols --enable-debug-guards build with memory allocation guards --enable-debug-printfs build with CUPS_DEBUG_LOG support + --enable-maintainer turn on maintainer mode (warnings as errors) --enable-unit-tests build and run unit tests - --enable-relro build with the GCC relro option + --enable-relro build with the relro option --enable-sanitizer build with AddressSanitizer - --disable-gssapi disable GSSAPI support - --disable-threads disable multi-threading support - --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-gssapi enable (deprecated) GSSAPI/Kerberos support --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-upstart enable upstart support --enable-page-logging enable page_log by default --enable-sync-on-close enable SyncOnClose (off by default) --disable-browsing disable Browsing by default --disable-default-shared - disable DefaultShared by default + disable DefaultShared by default --disable-raw-printing do not allow raw printing by default - --enable-webif enable the web interface by default, default=no for macOS + --enable-webif enable the web interface by default, default=no for + macOS Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-cups-build set "cups-config --build" string + --with-cups-build set "pkg-config --variable=build" string --with-dbusdir set DBUS configuration directory --with-adminkey set the default SystemAuthKey value --with-operkey set the default operator @AUTHKEY value - --with-components set components to build: - - "all" (default) builds everything - - "core" builds libcups and ipptool - - "libcups" builds just libcups - - "libcupslite" builds just libcups without driver support - --with-privateinclude set path for private include files, default=none - --with-lpdconfig set URI for LPD config file - --with-smbconfig set URI for Samba config file + --with-components set components to build: "all" (default) builds + everything, "core" builds libcups and ipptool, + "libcups" builds just libcups, "libcupslite" builds + just libcups without driver support --with-cachedir set path for cache files --with-icondir set path for application icons --with-menudir set path for application menus --with-docdir set path for documentation - --with-fontpath set font path for pstoraster + --with-pkgconfpath set path for cups.pc file --with-logdir set path for log files --with-rundir set transient run-time state directory --with-optim set optimization flags @@ -1645,9 +1630,15 @@ --with-ldarchflags set program architecture flags --with-domainsocket set unix domain socket name --with-gssservicename set default gss service name + --with-tls=... use cdsa (macOS) or gnutls for TLS support --with-pam-module set the PAM module to use + --with-dnssd=... enable DNS Service Discovery support (avahi, + mdnsresponder, no, yes) --with-dnssd-libs set directory for DNS Service Discovery library - --with-dnssd-includes set directory for DNS Service Discovery includes + --with-dnssd-includes set directory for DNS Service Discovery header files + --with-container=... configure to use in container (none, snap) + --with-ondemand=... Specify the on-demand launch interface (launchd, + systemd, upstart) --with-systemd set directory for systemd service files --with-smfmanifestdir set path for Solaris SMF manifest --with-rcdir set path for rc scripts @@ -1657,10 +1648,12 @@ --with-xinetd set path for xinetd config files --with-languages set installed languages, default=all --with-bundledir set localization bundle directory - --with-bundlelang set localization bundle base language (English or en) - --with-exe-file-perm set default executable permissions value, default=0555 + --with-bundlelang set localization bundle base language (English or + en) + --with-exe-file-perm set default executable permissions value, + default=0755 --with-config-file-perm set default ConfigFilePerm value, default=0640 - --with-cupsd-file-perm set default cupsd permissions, default=0500 + --with-cupsd-file-perm set default cupsd permissions, default=0700 --with-log-file-perm set default LogFilePerm value, default=0644 --with-max-log-size set default MaxLogSize value, default=1m --with-error-policy set default ErrorPolicy value, default=stop-printer @@ -1672,12 +1665,16 @@ --with-cups-group set default group for CUPS --with-system-groups set default system groups for CUPS --with-printcap set default printcap file - --with-lpdconfigfile set default LPDConfigFile URI - --with-smbconfigfile set default SMBConfigFile URI --with-max-copies set default max copies value, default=9999 --with-snmp-address set SNMP query address, default=auto --with-snmp-community set SNMP community, default=public --with-ipp-port set port number for IPP, default=631 + --with-idle-exit-timeout + set the default value for IdleExitTimeout, + default=60 + --with-systemd-timeoutstartsec + set TimeoutStartSec value in cups.service, + default=default value in systemd Some influential environment variables: CC C compiler command @@ -1695,7 +1692,7 @@ it to find libraries and programs with nonstandard names/locations. Report bugs to . -CUPS home page: . +CUPS home page: . _ACEOF ac_status=$? fi @@ -1759,10 +1756,10 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -CUPS configure 2.3.3op2 -generated by GNU Autoconf 2.70 +CUPS configure 2.4.1 +generated by GNU Autoconf 2.71 -Copyright (C) 2020 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -2114,8 +2111,8 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by CUPS $as_me 2.3.3op2, which was -generated by GNU Autoconf 2.70. Invocation command line was +It was created by CUPS $as_me 2.4.1, which was +generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3090,6 +3087,8 @@ + + # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 @@ -3164,19 +3163,27 @@ -host_os_name=`echo $host_os | sed -e '1,$s/[0-9.]*$//g'` -host_os_version=`echo $host_os | sed -e '1,$s/^[^0-9.]*//g' | awk -F. '{print $1 $2}'` +host_os_name="$(echo $host_os | sed -e '1,$s/[0-9.]*$//g')" +host_os_version="$(echo $host_os | sed -e '1,$s/^[^0-9.]*//g' | awk -F. '{print $1 $2}')" # Linux often does not yield an OS version we can use... -if test "x$host_os_version" = x; then - host_os_version="0" +if test "x$host_os_version" = x +then : + + host_os_version="0" + fi -if test "$build" = "$host"; then - # No, build local targets - LOCALTARGET="local" -else - # Yes, don't build local targets - LOCALTARGET="" +if test "$build" = "$host" +then : + + # No, build local targets + LOCALTARGET="local" + +else $as_nop + + # Yes, don't build local targets + LOCALTARGET="" + fi @@ -3235,24 +3242,28 @@ ac_config_headers="$ac_config_headers config.h" -CUPS_VERSION="2.3.3op2" -CUPS_REVISION="" +CUPS_VERSION="2.4.1" +CUPS_API_VERSION="$(echo 2.4.1 | awk -F. '{print $1 "." $2}')" CUPS_BUILD="cups-$CUPS_VERSION" # Check whether --with-cups_build was given. if test ${with_cups_build+y} then : - withval=$with_cups_build; CUPS_BUILD="$withval" + withval=$with_cups_build; + CUPS_BUILD="$withval" + fi -printf "%s\n" "#define CUPS_SVERSION \"CUPS v$CUPS_VERSION$CUPS_REVISION\"" >>confdefs.h -printf "%s\n" "#define CUPS_MINIMAL \"CUPS/$CUPS_VERSION$CUPS_REVISION\"" >>confdefs.h +printf "%s\n" "#define CUPS_SVERSION \"CUPS v$CUPS_VERSION\"" >>confdefs.h + + +printf "%s\n" "#define CUPS_MINIMAL \"CUPS/$CUPS_VERSION\"" >>confdefs.h CFLAGS="${CFLAGS:=}" @@ -3322,7 +3333,217 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then - for ac_prog in clang cc gcc + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 @@ -3371,7 +3592,7 @@ fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in clang cc gcc + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -3431,6 +3652,112 @@ fi fi +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} @@ -3840,7 +4167,10 @@ CFLAGS= fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : @@ -3864,28 +4194,28 @@ done rm -f conftest.$ac_ext CC=$ac_save_CC - fi -# AC_CACHE_VAL -ac_prog_cc_stdc_options= -case "x$ac_cv_prog_cc_c11" in #( - x) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } ;; #( - xno) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } ;; #( - *) : - ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c11" - CC="$CC$ac_prog_cc_stdc_options" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 -printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c11" != xno + +if test "x$ac_cv_prog_cc_c11" = xno then : - ac_prog_cc_stdc=c11 - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} @@ -3896,9 +4226,9 @@ ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$ac_c_conftest_c89_program +$ac_c_conftest_c99_program _ACEOF -for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99 +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" @@ -3910,28 +4240,28 @@ done rm -f conftest.$ac_ext CC=$ac_save_CC - fi -# AC_CACHE_VAL -ac_prog_cc_stdc_options= -case "x$ac_cv_prog_cc_c99" in #( - x) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } ;; #( - xno) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } ;; #( - *) : - ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c99" - CC="$CC$ac_prog_cc_stdc_options" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 -printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c99" != xno + +if test "x$ac_cv_prog_cc_c99" = xno then : - ac_prog_cc_stdc=c99 - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} @@ -3944,8 +4274,7 @@ /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" @@ -3957,34 +4286,25 @@ done rm -f conftest.$ac_ext CC=$ac_save_CC - fi -# AC_CACHE_VAL -ac_prog_cc_stdc_options= -case "x$ac_cv_prog_cc_c89" in #( - x) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } ;; #( - xno) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } ;; #( - *) : - ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c89" - CC="$CC$ac_prog_cc_stdc_options" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno + +if test "x$ac_cv_prog_cc_c89" = xno then : - ac_prog_cc_stdc=c89 - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } else $as_nop - ac_prog_cc_stdc=no - ac_cv_prog_cc_stdc=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" fi - + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 fi - fi ac_ext=c @@ -4141,7 +4461,7 @@ CXX=$CCC else if test -n "$ac_tool_prefix"; then - for ac_prog in clang++ c++ g++ + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 @@ -4190,7 +4510,7 @@ fi if test -z "$CXX"; then ac_ct_CXX=$CXX - for ac_prog in clang++ c++ g++ + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -4400,19 +4720,22 @@ CXXFLAGS= fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } -if test ${ac_cv_prog_cxx_cxx11+y} +if test ${ac_cv_prog_cxx_11+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cxx_cxx11=no + ac_cv_prog_cxx_11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF -for ac_arg in '' -std=gnu++11 -std=c++11 -std=gnu++0x -std=c++0x -qlanglvl=extended0x -AA +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" @@ -4424,36 +4747,35 @@ done rm -f conftest.$ac_ext CXX=$ac_save_CXX - fi -# AC_CACHE_VAL -ac_prog_cxx_stdcxx_options= -case "x$ac_cv_prog_cxx_cxx11" in #( - x) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } ;; #( - xno) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } ;; #( - *) : - ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_cxx11" - CXX=$CXX$ac_prog_cxx_stdcxx_options - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 -printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } ;; -esac -if test "x$ac_cv_prog_cxx_cxx11" != xno + +if test "x$ac_cv_prog_cxx_cxx11" = xno then : - ac_prog_cxx_stdcxx=cxx11 - ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 - ac_cv_prog_cxx_cxx98=$ac_cv_prog_cxx_cxx11 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } -if test ${ac_cv_prog_cxx_cxx98+y} +if test ${ac_cv_prog_cxx_98+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cxx_cxx98=no + ac_cv_prog_cxx_98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4471,32 +4793,25 @@ done rm -f conftest.$ac_ext CXX=$ac_save_CXX - fi -# AC_CACHE_VAL -ac_prog_cxx_stdcxx_options= -case "x$ac_cv_prog_cxx_cxx98" in #( - x) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } ;; #( - xno) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } ;; #( - *) : - ac_prog_cxx_stdcxx_options=" $ac_cv_prog_cxx_cxx98" - CXX=$CXX$ac_prog_cxx_stdcxx_options - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 -printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } ;; -esac -if test "x$ac_cv_prog_cxx_cxx98" != xno + +if test "x$ac_cv_prog_cxx_cxx98" = xno then : - ac_prog_cxx_stdcxx=cxx98 - ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } else $as_nop - ac_prog_cxx_stdcxx=no - ac_cv_prog_cxx_stdcxx=no + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 fi - fi ac_ext=c @@ -5109,18 +5424,29 @@ -if test "x$XDGOPEN" = x; then - CUPS_HTMLVIEW="htmlview" -else - CUPS_HTMLVIEW="$XDGOPEN" +if test "x$XDGOPEN" = x +then : + + CUPS_HTMLVIEW="htmlview" + +else $as_nop + + CUPS_HTMLVIEW="$XDGOPEN" + fi -if test "x$AR" = x; then - as_fn_error $? "Unable to find required library archive command." "$LINENO" 5 +if test "x$AR" = x +then : + + as_fn_error $? "Unable to find required library archive command." "$LINENO" 5 + fi -if test "x$CC" = x; then - as_fn_error $? "Unable to find required C compiler command." "$LINENO" 5 +if test "x$CC" = x +then : + + as_fn_error $? "Unable to find required C compiler command." "$LINENO" 5 + fi INSTALLSTATIC="" @@ -5131,9 +5457,13 @@ fi -if test x$enable_static = xyes; then - echo Installing static libraries... - INSTALLSTATIC="installstatic" +if test x$enable_static = xyes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Installing static libraries..." >&5 +printf "%s\n" "$as_me: Installing static libraries..." >&6;} + INSTALLSTATIC="installstatic" + fi @@ -5246,6 +5576,14 @@ PKGCONFIG="$ac_cv_path_PKGCONFIG" fi +PKGCONFIG_CFLAGS="" +PKGCONFIG_LIBS="" +PKGCONFIG_LIBS_STATIC="" +PKGCONFIG_REQUIRES="" + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing abs" >&5 @@ -5494,10 +5832,12 @@ fi -if test x$enable_mallinfo = xyes; then - SAVELIBS="$LIBS" - LIBS="" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing mallinfo" >&5 +if test x$enable_mallinfo = xyes +then : + + SAVELIBS="$LIBS" + LIBS="" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing mallinfo" >&5 printf %s "checking for library containing mallinfo... " >&6; } if test ${ac_cv_search_mallinfo+y} then : @@ -5557,8 +5897,9 @@ fi - LIBMALLOC="$LIBS" - LIBS="$SAVELIBS" + LIBMALLOC="$LIBS" + LIBS="$SAVELIBS" + fi @@ -5570,8 +5911,10 @@ fi -if test x$enable_libpaper = xyes; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for systempapername in -lpaper" >&5 +if test x$enable_libpaper = xyes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for systempapername in -lpaper" >&5 printf %s "checking for systempapername in -lpaper... " >&6; } if test ${ac_cv_lib_paper_systempapername+y} then : @@ -5608,15 +5951,23 @@ printf "%s\n" "$ac_cv_lib_paper_systempapername" >&6; } if test "x$ac_cv_lib_paper_systempapername" = xyes then : - printf "%s\n" "#define HAVE_LIBPAPER 1" >>confdefs.h - LIBPAPER="-lpaper" + +printf "%s\n" "#define HAVE_LIBPAPER 1" >>confdefs.h + + LIBPAPER="-lpaper" + else $as_nop - LIBPAPER="" -fi -else LIBPAPER="" + +fi + + +else $as_nop + + LIBPAPER="" + fi @@ -5649,233 +6000,67 @@ printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -printf %s "checking for grep that handles long lines and -e... " >&6; } -if test ${ac_cv_path_GREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in grep ggrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -printf "%s\n" "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -# Autoupdate added the next two lines to ensure that your configure -# script's behavior did not change. They are probably safe to remove. - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -printf %s "checking for egrep... " >&6; } -if test ${ac_cv_path_EGREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in egrep - do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - printf %s 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - printf "%s\n" 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -printf "%s\n" "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - - -ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" -if test "x$ac_cv_header_stdlib_h" = xyes -then : - printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h - -fi - ac_fn_c_check_header_compile "$LINENO" "crypt.h" "ac_cv_header_crypt_h" "$ac_includes_default" if test "x$ac_cv_header_crypt_h" = xyes then : - printf "%s\n" "#define HAVE_CRYPT_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_CRYPT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" if test "x$ac_cv_header_langinfo_h" = xyes then : - printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes then : - printf "%s\n" "#define HAVE_MALLOC_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_MALLOC_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "shadow.h" "ac_cv_header_shadow_h" "$ac_includes_default" if test "x$ac_cv_header_shadow_h" = xyes then : - printf "%s\n" "#define HAVE_SHADOW_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SHADOW_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes then : - printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h - -fi - -ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" -if test "x$ac_cv_header_string_h" = xyes -then : - printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h - -fi - -ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" -if test "x$ac_cv_header_strings_h" = xyes -then : - printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h - -fi -ac_fn_c_check_header_compile "$LINENO" "bstring.h" "ac_cv_header_bstring_h" "$ac_includes_default" -if test "x$ac_cv_header_bstring_h" = xyes -then : - printf "%s\n" "#define HAVE_BSTRING_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" if test "x$ac_cv_header_sys_ioctl_h" = xyes then : - printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes then : - printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/ucred.h" "ac_cv_header_sys_ucred_h" "$ac_includes_default" if test "x$ac_cv_header_sys_ucred_h" = xyes then : - printf "%s\n" "#define HAVE_SYS_UCRED_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SYS_UCRED_H 1" >>confdefs.h fi @@ -5883,9 +6068,10 @@ ac_fn_c_check_header_compile "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default" if test "x$ac_cv_header_iconv_h" = xyes then : - SAVELIBS="$LIBS" - LIBS="" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing iconv_open" >&5 + + SAVELIBS="$LIBS" + LIBS="" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing iconv_open" >&5 printf %s "checking for library containing iconv_open... " >&6; } if test ${ac_cv_search_iconv_open+y} then : @@ -5941,12 +6127,15 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_ICONV_H 1" >>confdefs.h - SAVELIBS="$SAVELIBS $LIBS" + +printf "%s\n" "#define HAVE_ICONV_H 1" >>confdefs.h + + SAVELIBS="$SAVELIBS $LIBS" + fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing libiconv_open" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing libiconv_open" >&5 printf %s "checking for library containing libiconv_open... " >&6; } if test ${ac_cv_search_libiconv_open+y} then : @@ -6002,40 +6191,48 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_ICONV_H 1" >>confdefs.h - SAVELIBS="$SAVELIBS $LIBS" + +printf "%s\n" "#define HAVE_ICONV_H 1" >>confdefs.h + + SAVELIBS="$SAVELIBS $LIBS" + fi - LIBS="$SAVELIBS" + LIBS="$SAVELIBS" + fi ac_fn_c_check_header_compile "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "$ac_includes_default" if test "x$ac_cv_header_sys_mount_h" = xyes then : - printf "%s\n" "#define HAVE_SYS_MOUNT_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SYS_MOUNT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/statfs.h" "ac_cv_header_sys_statfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_statfs_h" = xyes then : - printf "%s\n" "#define HAVE_SYS_STATFS_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SYS_STATFS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/statvfs.h" "ac_cv_header_sys_statvfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_statvfs_h" = xyes then : - printf "%s\n" "#define HAVE_SYS_STATVFS_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SYS_STATVFS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/vfs.h" "ac_cv_header_sys_vfs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_vfs_h" = xyes then : - printf "%s\n" "#define HAVE_SYS_VFS_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SYS_VFS_H 1" >>confdefs.h fi @@ -6059,36 +6256,32 @@ printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat" -if test "x$ac_cv_func_strlcat" = xyes +ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" +if test "x$ac_cv_func_snprintf" = xyes then : - printf "%s\n" "#define HAVE_STRLCAT 1" >>confdefs.h + printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" -if test "x$ac_cv_func_strlcpy" = xyes +ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" +if test "x$ac_cv_func_vsnprintf" = xyes then : - printf "%s\n" "#define HAVE_STRLCPY 1" >>confdefs.h + printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h fi -if test "$host_os_name" = "hp-ux" -a "$host_os_version" = "1020"; then - echo Forcing snprintf emulation for HP-UX. -else - ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" -if test "x$ac_cv_func_snprintf" = xyes +ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat" +if test "x$ac_cv_func_strlcat" = xyes then : - printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h + printf "%s\n" "#define HAVE_STRLCAT 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" -if test "x$ac_cv_func_vsnprintf" = xyes +ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" +if test "x$ac_cv_func_strlcpy" = xyes then : - printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h + printf "%s\n" "#define HAVE_STRLCPY 1" >>confdefs.h fi -fi ac_fn_c_check_func "$LINENO" "random" "ac_cv_func_random" if test "x$ac_cv_func_random" = xyes @@ -6134,20 +6327,24 @@ fi -case "$host_os_name" in - linux* | gnu*) - # Do not use sigset on Linux or GNU HURD - ;; - *) - # Use sigset on other platforms, if available - ac_fn_c_check_func "$LINENO" "sigset" "ac_cv_func_sigset" +case "$host_os_name" in #( + linux* | gnu*) : + + # Do not use sigset on Linux or GNU HURD + ;; #( + *) : + + # Use sigset on other platforms, if available + ac_fn_c_check_func "$LINENO" "sigset" "ac_cv_func_sigset" if test "x$ac_cv_func_sigset" = xyes then : printf "%s\n" "#define HAVE_SIGSET 1" >>confdefs.h fi - ;; + ;; #( + *) : + ;; esac ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" @@ -6192,25 +6389,34 @@ printf %s "checking for tm_gmtoff member in tm structure... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + + #include int main (void) { -struct tm t; + + struct tm t; int o = t.tm_gmtoff; + ; return 0; } + _ACEOF if ac_fn_c_try_compile "$LINENO" then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } - printf "%s\n" "#define HAVE_TM_GMTOFF 1" >>confdefs.h + +printf "%s\n" "#define HAVE_TM_GMTOFF 1" >>confdefs.h + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -6218,25 +6424,34 @@ printf %s "checking for st_gen member in stat structure... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + + #include int main (void) { -struct stat t; + + struct stat t; int o = t.st_gen; + ; return 0; } + _ACEOF if ac_fn_c_try_compile "$LINENO" then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } - printf "%s\n" "#define HAVE_ST_GEN 1" >>confdefs.h + +printf "%s\n" "#define HAVE_ST_GEN 1" >>confdefs.h + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -6260,28 +6475,46 @@ -if test "x$PKGCONFIG" != x; then - if test x$enable_libusb != xno -a $host_os_name != darwin; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libusb-1.0" >&5 +if test "x$PKGCONFIG" != x +then : + + if test x$enable_libusb != xno -a $host_os_name != darwin +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libusb-1.0" >&5 printf %s "checking for libusb-1.0... " >&6; } - if $PKGCONFIG --exists libusb-1.0; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + if $PKGCONFIG --exists libusb-1.0 +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } - printf "%s\n" "#define HAVE_LIBUSB 1" >>confdefs.h - CFLAGS="$CFLAGS `$PKGCONFIG --cflags libusb-1.0`" - LIBUSB="`$PKGCONFIG --libs libusb-1.0`" - USBQUIRKS="\$(DATADIR)/usb" - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "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 - as_fn_error $? "Need pkg-config to enable libusb support." "$LINENO" 5 +printf "%s\n" "#define HAVE_LIBUSB 1" >>confdefs.h + + CFLAGS="$CFLAGS $($PKGCONFIG --cflags libusb-1.0)" + LIBUSB="$($PKGCONFIG --libs libusb-1.0)" + USBQUIRKS="\$(DATADIR)/usb" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 : + + as_fn_error $? "Need pkg-config to enable libusb support." "$LINENO" 5 + fi # Check whether --enable-tcp_wrappers was given. @@ -6294,8 +6527,10 @@ LIBWRAP="" -if test x$enable_tcp_wrappers = xyes; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for hosts_access in -lwrap" >&5 +if test x$enable_tcp_wrappers = xyes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for hosts_access in -lwrap" >&5 printf %s "checking for hosts_access in -lwrap... " >&6; } if test ${ac_cv_lib_wrap_hosts_access+y} then : @@ -6333,16 +6568,21 @@ if test "x$ac_cv_lib_wrap_hosts_access" = xyes then : - ac_fn_c_check_header_compile "$LINENO" "tcpd.h" "ac_cv_header_tcpd_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "tcpd.h" "ac_cv_header_tcpd_h" "$ac_includes_default" if test "x$ac_cv_header_tcpd_h" = xyes then : - printf "%s\n" "#define HAVE_TCPD_H 1" >>confdefs.h - LIBWRAP="-lwrap" + +printf "%s\n" "#define HAVE_TCPD_H 1" >>confdefs.h + + LIBWRAP="-lwrap" + fi + fi + fi INSTALL_GZIP="" @@ -6350,7 +6590,8 @@ ac_fn_c_check_header_compile "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5 printf %s "checking for gzgets in -lz... " >&6; } if test ${ac_cv_lib_z_gzgets+y} then : @@ -6388,7 +6629,8 @@ if test "x$ac_cv_lib_z_gzgets" = xyes then : - printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h + +printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h LIBZ="-lz" LIBS="$LIBS -lz" @@ -6429,30 +6671,43 @@ printf "%s\n" "$ac_cv_lib_z_inflateCopy" >&6; } if test "x$ac_cv_lib_z_inflateCopy" = xyes then : - printf "%s\n" "#define HAVE_INFLATECOPY 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_INFLATECOPY 1" >>confdefs.h + fi - if test "x$GZIPPROG" != x; then - INSTALL_GZIP="-z" - fi + if test "x$GZIPPROG" != x +then : + + INSTALL_GZIP="-z" + fi fi +fi -case $host_os_name in - darwin* | *bsd*) - ARFLAGS="-rcv" - ;; - *) - ARFLAGS="crvs" - ;; -esac +PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC $LIBZ" + +case host_os_name in #( + darwin* | *bsd*) : + + ARFLAGS="-rcv" + ;; #( + *) : + + ARFLAGS="crvs" + ;; #( + *) : + ;; +esac + BACKLIBS="" SERVERLIBS="" @@ -6467,8 +6722,10 @@ enableval=$enable_acl; fi -if test "x$enable_acl" != xno; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing acl_init" >&5 +if test "x$enable_acl" != xno +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing acl_init" >&5 printf %s "checking for library containing acl_init... " >&6; } if test ${ac_cv_search_acl_init+y} then : @@ -6524,11 +6781,15 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_ACL_INIT 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_ACL_INIT 1" >>confdefs.h + fi - SERVERLIBS="$SERVERLIBS $LIBS" + SERVERLIBS="$SERVERLIBS $LIBS" + fi LIBS="$SAVELIBS" @@ -6546,46 +6807,66 @@ # Check whether --with-dbusdir was given. if test ${with_dbusdir+y} then : - withval=$with_dbusdir; DBUSDIR="$withval" + withval=$with_dbusdir; + DBUSDIR="$withval" + fi -if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$host_os_name" != xdarwin; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5 +if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$host_os_name" != xdarwin +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5 printf %s "checking for DBUS... " >&6; } - if $PKGCONFIG --exists dbus-1; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + if $PKGCONFIG --exists dbus-1 +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } - printf "%s\n" "#define HAVE_DBUS 1" >>confdefs.h - CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE" - SERVERLIBS="$SERVERLIBS `$PKGCONFIG --libs dbus-1`" - DBUS_NOTIFIER="dbus" - DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs dbus-1`" - SAVELIBS="$LIBS" - LIBS="$LIBS $DBUS_NOTIFIERLIBS" - ac_fn_c_check_func "$LINENO" "dbus_message_iter_init_append" "ac_cv_func_dbus_message_iter_init_append" +printf "%s\n" "#define HAVE_DBUS 1" >>confdefs.h + + CFLAGS="$CFLAGS $($PKGCONFIG --cflags dbus-1) -DDBUS_API_SUBJECT_TO_CHANGE" + SERVERLIBS="$SERVERLIBS $($PKGCONFIG --libs dbus-1)" + DBUS_NOTIFIER="dbus" + DBUS_NOTIFIERLIBS="$($PKGCONFIG --libs dbus-1)" + SAVELIBS="$LIBS" + LIBS="$LIBS $DBUS_NOTIFIERLIBS" + ac_fn_c_check_func "$LINENO" "dbus_message_iter_init_append" "ac_cv_func_dbus_message_iter_init_append" if test "x$ac_cv_func_dbus_message_iter_init_append" = xyes then : - printf "%s\n" "#define HAVE_DBUS_MESSAGE_ITER_INIT_APPEND 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_DBUS_MESSAGE_ITER_INIT_APPEND 1" >>confdefs.h + 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 + ac_fn_c_check_func "$LINENO" "dbus_threads_init_default" "ac_cv_func_dbus_threads_init_default" +if test "x$ac_cv_func_dbus_threads_init_default" = xyes then : - printf "%s\n" "#define HAVE_DBUS_THREADS_INIT 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_DBUS_THREADS_INIT 1" >>confdefs.h + fi - LIBS="$SAVELIBS" - if test -d /etc/dbus-1 -a "x$DBUSDIR" = x; then - DBUSDIR="/etc/dbus-1" - fi - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + LIBS="$SAVELIBS" + if test -d /etc/dbus-1 -a "x$DBUSDIR" = x +then : + + DBUSDIR="/etc/dbus-1" + +fi + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } - fi + +fi + fi @@ -6597,29 +6878,37 @@ CUPS_SYSTEM_AUTHKEY="" INSTALLXPC="" -case $host_os_name in - darwin*) - BACKLIBS="$BACKLIBS -framework IOKit" - SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices" - LIBS="-framework CoreFoundation -framework Security $LIBS" +case $host_os_name in #( + darwin*) : - ac_fn_c_check_header_compile "$LINENO" "ApplicationServices/ApplicationServices.h" "ac_cv_header_ApplicationServices_ApplicationServices_h" "$ac_includes_default" + BACKLIBS="$BACKLIBS -framework IOKit" + SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices" + LIBS="-framework CoreFoundation -framework Security $LIBS" + PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC -framework CoreFoundation -framework Security" + + ac_fn_c_check_header_compile "$LINENO" "ApplicationServices/ApplicationServices.h" "ac_cv_header_ApplicationServices_ApplicationServices_h" "$ac_includes_default" if test "x$ac_cv_header_ApplicationServices_ApplicationServices_h" = xyes then : - printf "%s\n" "#define HAVE_APPLICATIONSERVICES_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_APPLICATIONSERVICES_H 1" >>confdefs.h + fi - ac_fn_c_check_header_compile "$LINENO" "CoreFoundation/CoreFoundation.h" "ac_cv_header_CoreFoundation_CoreFoundation_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "CoreFoundation/CoreFoundation.h" "ac_cv_header_CoreFoundation_CoreFoundation_h" "$ac_includes_default" if test "x$ac_cv_header_CoreFoundation_CoreFoundation_h" = xyes then : - printf "%s\n" "#define HAVE_COREFOUNDATION_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_COREFOUNDATION_H 1" >>confdefs.h + fi - SAVELIBS="$LIBS" - LIBS="-framework SystemConfiguration $LIBS" + SAVELIBS="$LIBS" + LIBS="-framework SystemConfiguration $LIBS" for ac_func in SCDynamicStoreCopyComputerName do : @@ -6628,23 +6917,29 @@ then : printf "%s\n" "#define HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME 1" >>confdefs.h - printf "%s\n" "#define HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME 1" >>confdefs.h + +printf "%s\n" "#define HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME 1" >>confdefs.h + else $as_nop - LIBS="$SAVELIBS" + LIBS="$SAVELIBS" + fi done - ac_fn_c_check_header_compile "$LINENO" "membership.h" "ac_cv_header_membership_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "membership.h" "ac_cv_header_membership_h" "$ac_includes_default" if test "x$ac_cv_header_membership_h" = xyes then : - printf "%s\n" "#define HAVE_MEMBERSHIP_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_MEMBERSHIP_H 1" >>confdefs.h + fi - ac_fn_c_check_func "$LINENO" "mbr_uid_to_uuid" "ac_cv_func_mbr_uid_to_uuid" + ac_fn_c_check_func "$LINENO" "mbr_uid_to_uuid" "ac_cv_func_mbr_uid_to_uuid" if test "x$ac_cv_func_mbr_uid_to_uuid" = xyes then : printf "%s\n" "#define HAVE_MBR_UID_TO_UUID 1" >>confdefs.h @@ -6652,22 +6947,28 @@ fi - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes then : - printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h + fi - ac_fn_c_check_header_compile "$LINENO" "notify.h" "ac_cv_header_notify_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "notify.h" "ac_cv_header_notify_h" "$ac_includes_default" if test "x$ac_cv_header_notify_h" = xyes then : - printf "%s\n" "#define HAVE_NOTIFY_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_NOTIFY_H 1" >>confdefs.h + fi - ac_fn_c_check_func "$LINENO" "notify_post" "ac_cv_func_notify_post" + ac_fn_c_check_func "$LINENO" "notify_post" "ac_cv_func_notify_post" if test "x$ac_cv_func_notify_post" = xyes then : printf "%s\n" "#define HAVE_NOTIFY_POST 1" >>confdefs.h @@ -6679,81 +6980,96 @@ # Check whether --with-adminkey was given. if test ${with_adminkey+y} then : - withval=$with_adminkey; default_adminkey="$withval" + withval=$with_adminkey; + default_adminkey="$withval" + else $as_nop - default_adminkey="default" + + default_adminkey="default" + fi # Check whether --with-operkey was given. if test ${with_operkey+y} then : - withval=$with_operkey; default_operkey="$withval" + withval=$with_operkey; + default_operkey="$withval" + else $as_nop - default_operkey="default" + + default_operkey="default" + fi - ac_fn_c_check_header_compile "$LINENO" "Security/Authorization.h" "ac_cv_header_Security_Authorization_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "Security/Authorization.h" "ac_cv_header_Security_Authorization_h" "$ac_includes_default" if test "x$ac_cv_header_Security_Authorization_h" = xyes then : - printf "%s\n" "#define HAVE_AUTHORIZATION_H 1" >>confdefs.h +printf "%s\n" "#define HAVE_AUTHORIZATION_H 1" >>confdefs.h + + + if test "x$default_adminkey" != xdefault +then : + + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey $default_adminkey" + CUPS_DEFAULT_SYSTEM_AUTHKEY="$default_adminkey" + +else $as_nop + + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.print.admin" + CUPS_DEFAULT_SYSTEM_AUTHKEY="system.print.admin" + +fi + + if test "x$default_operkey" != xdefault +then : + + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" + +else $as_nop + + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" - if test "x$default_adminkey" != xdefault; then - CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey $default_adminkey" - CUPS_DEFAULT_SYSTEM_AUTHKEY="$default_adminkey" - else - CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.print.admin" - CUPS_DEFAULT_SYSTEM_AUTHKEY="system.print.admin" - fi +fi - if test "x$default_operkey" != xdefault; then - CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" - else - CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" - fi fi - if test $host_os_version -ge 100; then - ac_fn_c_check_header_compile "$LINENO" "sandbox.h" "ac_cv_header_sandbox_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "sandbox.h" "ac_cv_header_sandbox_h" "$ac_includes_default" if test "x$ac_cv_header_sandbox_h" = xyes then : - printf "%s\n" "#define HAVE_SANDBOX_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_SANDBOX_H 1" >>confdefs.h + fi - fi - if test $host_os_version -ge 110 -a $host_os_version -lt 120; then - # Broken public headers in 10.7.x... - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sandbox/private.h presence" >&5 -printf %s "checking for sandbox/private.h presence... " >&6; } - if test -f /usr/local/include/sandbox/private.h; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - as_fn_error $? "Run 'sudo mkdir -p /usr/local/include/sandbox' and 'sudo touch /usr/local/include/sandbox/private.h' to build CUPS." "$LINENO" 5 - fi - fi - ac_fn_c_check_header_compile "$LINENO" "xpc/xpc.h" "ac_cv_header_xpc_xpc_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "xpc/xpc.h" "ac_cv_header_xpc_xpc_h" "$ac_includes_default" if test "x$ac_cv_header_xpc_xpc_h" = xyes then : - printf "%s\n" "#define HAVE_XPC 1" >>confdefs.h - INSTALLXPC="install-xpc" + +printf "%s\n" "#define HAVE_XPC 1" >>confdefs.h + + INSTALLXPC="install-xpc" + fi - ;; + ;; #( + *) : + ;; esac + printf "%s\n" "#define CUPS_DEFAULT_PRINTOPERATOR_AUTH \"$CUPS_DEFAULT_PRINTOPERATOR_AUTH\"" >>confdefs.h + printf "%s\n" "#define CUPS_DEFAULT_SYSTEM_AUTHKEY \"$CUPS_DEFAULT_SYSTEM_AUTHKEY\"" >>confdefs.h @@ -6765,7 +7081,9 @@ # Check whether --with-components was given. if test ${with_components+y} then : - withval=$with_components; COMPONENTS="$withval" + withval=$with_components; + COMPONENTS="$withval" + fi @@ -6775,212 +7093,238 @@ LIBHEADERS="\$(COREHEADERS) \$(DRIVERHEADERS)" LIBHEADERSPRIV="\$(COREHEADERSPRIV) \$(DRIVERHEADERSPRIV)" -case "$COMPONENTS" in - all) - BUILDDIRS="tools filter backend berkeley cgi-bin monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" - ;; +case "$COMPONENTS" in #( + all) : - core) - BUILDDIRS="tools examples locale" - ;; + BUILDDIRS="tools filter backend berkeley cgi-bin monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" + ;; #( + core) : + + BUILDDIRS="tools examples locale" + ;; #( + corelite) : + + +printf "%s\n" "#define CUPS_LITE 1" >>confdefs.h + + BUILDDIRS="tools examples locale" + cupsimagebase="" + LIBCUPSOBJS="\$(COREOBJS)" + LIBHEADERS="\$(COREHEADERS)" + LIBHEADERSPRIV="\$(COREHEADERSPRIV)" + ;; #( + libcups) : + + BUILDDIRS="locale" + cupsimagebase="" + ;; #( + libcupslite) : + + +printf "%s\n" "#define CUPS_LITE 1" >>confdefs.h + + BUILDDIRS="locale" + cupsimagebase="" + LIBCUPSOBJS="\$(COREOBJS)" + LIBHEADERS="\$(COREHEADERS)" + LIBHEADERSPRIV="\$(COREHEADERSPRIV)" + ;; #( + *) : - corelite) - printf "%s\n" "#define CUPS_LITE 1" >>confdefs.h + as_fn_error $? "Bad build component \"$COMPONENT\" specified." "$LINENO" 5 + ;; #( + *) : + ;; +esac - BUILDDIRS="tools examples locale" - cupsimagebase="" - LIBCUPSOBJS="\$(COREOBJS)" - LIBHEADERS="\$(COREHEADERS)" - LIBHEADERSPRIV="\$(COREHEADERSPRIV)" - ;; - libcups) - BUILDDIRS="locale" - cupsimagebase="" - ;; - libcupslite) - printf "%s\n" "#define CUPS_LITE 1" >>confdefs.h - BUILDDIRS="locale" - cupsimagebase="" - LIBCUPSOBJS="\$(COREOBJS)" - LIBHEADERS="\$(COREHEADERS)" - LIBHEADERSPRIV="\$(COREHEADERSPRIV)" - ;; - *) - as_fn_error $? "Bad build component \"$COMPONENT\" specified!" "$LINENO" 5 - ;; -esac +if test "$prefix" = "NONE" +then : + prefix="/" +fi +if test "$exec_prefix" = "NONE" +then : + if test "$prefix" = "/" +then : + + exec_prefix="/usr" + +else $as_nop + + exec_prefix="$prefix" -if test "$prefix" = "NONE"; then - prefix="/" fi -if test "$exec_prefix" = "NONE"; then - if test "$prefix" = "/"; then - exec_prefix="/usr" - else - exec_prefix="$prefix" - fi fi -if test "$bindir" = "\${exec_prefix}/bin"; then - bindir="$exec_prefix/bin" +if test "$bindir" = "\${exec_prefix}/bin" +then : + + bindir="$exec_prefix/bin" + fi + printf "%s\n" "#define CUPS_BINDIR \"$bindir\"" >>confdefs.h -if test "$sbindir" = "\${exec_prefix}/sbin"; then - sbindir="$exec_prefix/sbin" +if test "$sbindir" = "\${exec_prefix}/sbin" +then : + + sbindir="$exec_prefix/sbin" + fi + printf "%s\n" "#define CUPS_SBINDIR \"$sbindir\"" >>confdefs.h -if test "$sharedstatedir" = "\${prefix}/com" -a "$prefix" = "/"; then - sharedstatedir="/usr/com" -fi +if test "$datarootdir" = "\${prefix}/share" +then : + + if test "$prefix" = "/" +then : + + datarootdir="/usr/share" + +else $as_nop + + datarootdir="$prefix/share" -if test "$datarootdir" = "\${prefix}/share"; then - if test "$prefix" = "/"; then - datarootdir="/usr/share" - else - datarootdir="$prefix/share" - fi fi -if test "$datadir" = "\${prefix}/share"; then - if test "$prefix" = "/"; then - datadir="/usr/share" - else - datadir="$prefix/share" - fi -elif test "$datadir" = "\${datarootdir}"; then - datadir="$datarootdir" fi -if test "$includedir" = "\${prefix}/include" -a "$prefix" = "/"; then - includedir="/usr/include" +if test "$datadir" = "\${prefix}/share" +then : + + if test "$prefix" = "/" +then : + + datadir="/usr/share" + +else $as_nop + + datadir="$prefix/share" + fi -if test "$localstatedir" = "\${prefix}/var"; then - if test "$prefix" = "/"; then - if test "$host_os_name" = darwin; then - localstatedir="/private/var" - else - localstatedir="/var" - fi - else - localstatedir="$prefix/var" - fi +elif test "$datadir" = "\${datarootdir}" +then : + + datadir="$datarootdir" + fi -if test "$sysconfdir" = "\${prefix}/etc"; then - if test "$prefix" = "/"; then - if test "$host_os_name" = darwin; then - sysconfdir="/private/etc" - else - sysconfdir="/etc" - fi - else - sysconfdir="$prefix/etc" - fi +if test "$includedir" = "\${prefix}/include" -a "$prefix" = "/" +then : + + includedir="/usr/include" + fi +if test "$includedir" != "/usr/include" +then : + + PKGCONFIG_CFLAGS="$PKGCONFIG_CFLAGS -I$includedir" -if test "$libdir" = "\${exec_prefix}/lib"; then - case "$host_os_name" in - linux*) - if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then - libdir="$exec_prefix/lib64" - fi - ;; - esac fi +if test "$localstatedir" = "\${prefix}/var" +then : + + if test "$prefix" = "/" +then : -# Check whether --with-privateinclude was given. -if test ${with_privateinclude+y} + if test "$host_os_name" = darwin then : - withval=$with_privateinclude; privateinclude="$withval" + + localstatedir="/private/var" + else $as_nop - privateinclude="" + + localstatedir="/var" + fi -if test "x$privateinclude" != x -a "x$privateinclude" != xnone; then - PRIVATEINCLUDE="$privateinclude/cups" -else - privateinclude="" - PRIVATEINCLUDE="" +else $as_nop + + localstatedir="$prefix/var" + fi +fi +if test "$sysconfdir" = "\${prefix}/etc" +then : + if test "$prefix" = "/" +then : -# Check whether --with-lpdconfig was given. -if test ${with_lpdconfig+y} + if test "$host_os_name" = darwin then : - withval=$with_lpdconfig; LPDCONFIG="$withval" + + sysconfdir="/private/etc" + else $as_nop - LPDCONFIG="" -fi + sysconfdir="/etc" -if test "x$LPDCONFIG" = x; then - if test -f /System/Library/LaunchDaemons/org.cups.cups-lpd.plist; then - LPDCONFIG="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" - elif test "x$XINETD" != x; then - LPDCONFIG="xinetd://$XINETD/cups-lpd" - fi fi -if test "x$LPDCONFIG" = xoff; then - printf "%s\n" "#define CUPS_DEFAULT_LPD_CONFIG \"\"" >>confdefs.h +else $as_nop -else - printf "%s\n" "#define CUPS_DEFAULT_LPD_CONFIG \"$LPDCONFIG\"" >>confdefs.h + sysconfdir="$prefix/etc" + +fi fi +if test "$libdir" = "\${exec_prefix}/lib" +then : + + case "$host_os_name" in #( + linux*) : -# Check whether --with-smbconfig was given. -if test ${with_smbconfig+y} + if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot then : - withval=$with_smbconfig; SMBCONFIG="$withval" + + libdir="$exec_prefix/lib64" + else $as_nop - SMBCONFIG="" + + libdir="$exec_prefix/lib" + fi + ;; #( + *) : + libdir="$exec_prefix/lib" + ;; #( + *) : + ;; +esac -if test "x$SMBCONFIG" = x; then - if test -f /System/Library/LaunchDaemons/smbd.plist; then - SMBCONFIG="launchd:///System/Library/LaunchDaemons/smbd.plist" - else - for dir in /etc /etc/samba /usr/local/etc; do - if test -f $dir/smb.conf; then - SMBCONFIG="samba://$dir/smb.conf" - break - fi - done - fi fi +if test "$libdir" = "/usr/lib" +then : -if test "x$SMBCONFIG" = xoff; then - printf "%s\n" "#define CUPS_DEFAULT_SMB_CONFIG \"\"" >>confdefs.h + PKGCONFIG_LIBS="-lcups" -else - printf "%s\n" "#define CUPS_DEFAULT_SMB_CONFIG \"$SMBCONFIG\"" >>confdefs.h +else $as_nop + + PKGCONFIG_LIBS="-L$libdir -lcups" fi @@ -6989,27 +7333,43 @@ # Check whether --with-cachedir was given. if test ${with_cachedir+y} then : - withval=$with_cachedir; cachedir="$withval" + withval=$with_cachedir; + cachedir="$withval" + else $as_nop - cachedir="" + + cachedir="" + fi -if test x$cachedir = x; then - if test "x$host_os_name" = xdarwin; then - CUPS_CACHEDIR="$localstatedir/spool/cups/cache" - else - CUPS_CACHEDIR="$localstatedir/cache/cups" - fi -else - CUPS_CACHEDIR="$cachedir" +if test x$cachedir = x +then : + + if test "x$host_os_name" = xdarwin +then : + + CUPS_CACHEDIR="$localstatedir/spool/cups/cache" + +else $as_nop + + CUPS_CACHEDIR="$localstatedir/cache/cups" + +fi + +else $as_nop + + CUPS_CACHEDIR="$cachedir" + fi + printf "%s\n" "#define CUPS_CACHEDIR \"$CUPS_CACHEDIR\"" >>confdefs.h # Data files CUPS_DATADIR="$datadir/cups" + printf "%s\n" "#define CUPS_DATADIR \"$datadir/cups\"" >>confdefs.h @@ -7019,16 +7379,25 @@ # Check whether --with-icondir was given. if test ${with_icondir+y} then : - withval=$with_icondir; icondir="$withval" + withval=$with_icondir; + icondir="$withval" + else $as_nop - icondir="" + + icondir="" + fi -if test "x$icondir" = x -a -d /usr/share/icons; then - ICONDIR="/usr/share/icons" -else - ICONDIR="$icondir" +if test "x$icondir" = x +then : + + ICONDIR="/usr/share/icons" + +else $as_nop + + ICONDIR="$icondir" + fi @@ -7038,16 +7407,25 @@ # Check whether --with-menudir was given. if test ${with_menudir+y} then : - withval=$with_menudir; menudir="$withval" + withval=$with_menudir; + menudir="$withval" + else $as_nop - menudir="" + + menudir="" + fi -if test "x$menudir" = x -a -d /usr/share/applications; then - MENUDIR="/usr/share/applications" -else - MENUDIR="$menudir" +if test "x$menudir" = x +then : + + MENUDIR="/usr/share/applications" + +else $as_nop + + MENUDIR="$menudir" + fi @@ -7057,61 +7435,92 @@ # Check whether --with-docdir was given. if test ${with_docdir+y} then : - withval=$with_docdir; docdir="$withval" + withval=$with_docdir; + docdir="$withval" + else $as_nop - docdir="" + + docdir="" + fi -if test x$docdir = x; then - CUPS_DOCROOT="$datadir/doc/cups" - docdir="$datadir/doc/cups" -else - CUPS_DOCROOT="$docdir" +if test x$docdir = x +then : + + CUPS_DOCROOT="$datadir/doc/cups" + docdir="$datadir/doc/cups" + +else $as_nop + + CUPS_DOCROOT="$docdir" + fi -printf "%s\n" "#define CUPS_DOCROOT \"$docdir\"" >>confdefs.h +printf "%s\n" "#define CUPS_DOCROOT \"$docdir\"" >>confdefs.h -# Fonts -# Check whether --with-fontpath was given. -if test ${with_fontpath+y} +# Locale data +if test "$localedir" = "\${datarootdir}/locale" then : - withval=$with_fontpath; fontpath="$withval" + + case "$host_os_name" in #( + linux* | gnu* | *bsd* | darwin*) : + + CUPS_LOCALEDIR="$datarootdir/locale" + ;; #( + *) : + + # This is the standard System V location... + CUPS_LOCALEDIR="$exec_prefix/lib/locale" + ;; #( + *) : + ;; +esac + else $as_nop - fontpath="" + + CUPS_LOCALEDIR="$localedir" + fi -if test "x$fontpath" = "x"; then - CUPS_FONTPATH="$datadir/cups/fonts" -else - CUPS_FONTPATH="$fontpath" +printf "%s\n" "#define CUPS_LOCALEDIR \"$CUPS_LOCALEDIR\"" >>confdefs.h + + + + +# cups.pc file... + +# Check whether --with-pkgconfpath was given. +if test ${with_pkgconfpath+y} +then : + withval=$with_pkgconfpath; + pkgconfpath="$withval" + +else $as_nop + + pkgconfpath="" + fi -printf "%s\n" "#define CUPS_FONTPATH \"$CUPS_FONTPATH\"" >>confdefs.h +if test x$pkgconfpath = x +then : + + CUPS_PKGCONFPATH="$exec_prefix/lib/pkgconfig" +else $as_nop + + CUPS_PKGCONFPATH="$pkgconfpath" -# Locale data -if test "$localedir" = "\${datarootdir}/locale"; then - case "$host_os_name" in - linux* | gnu* | *bsd* | darwin*) - CUPS_LOCALEDIR="$datarootdir/locale" - ;; - - *) - # This is the standard System V location... - CUPS_LOCALEDIR="$exec_prefix/lib/locale" - ;; - esac -else - CUPS_LOCALEDIR="$localedir" fi -printf "%s\n" "#define CUPS_LOCALEDIR \"$CUPS_LOCALEDIR\"" >>confdefs.h +printf "%s\n" "#define CUPS_PKGCONFPATH \"$CUPS_PKGCONFPATH\"" >>confdefs.h + + @@ -7120,48 +7529,63 @@ # Check whether --with-logdir was given. if test ${with_logdir+y} then : - withval=$with_logdir; logdir="$withval" + withval=$with_logdir; + logdir="$withval" + else $as_nop - logdir="" + + logdir="" + fi -if test x$logdir = x; then - CUPS_LOGDIR="$localstatedir/log/cups" - printf "%s\n" "#define CUPS_LOGDIR \"$localstatedir/log/cups\"" >>confdefs.h +if test x$logdir = x +then : + + CUPS_LOGDIR="$localstatedir/log/cups" + +else $as_nop + + CUPS_LOGDIR="$logdir" -else - CUPS_LOGDIR="$logdir" fi + printf "%s\n" "#define CUPS_LOGDIR \"$CUPS_LOGDIR\"" >>confdefs.h # Longer-term spool data CUPS_REQUESTS="$localstatedir/spool/cups" + printf "%s\n" "#define CUPS_REQUESTS \"$localstatedir/spool/cups\"" >>confdefs.h # Server executables... -case "$host_os_name" in - *-gnu) - # GNUs - INSTALL_SYSV="install-sysv" - CUPS_SERVERBIN="$exec_prefix/lib/cups" - ;; - *bsd* | darwin*) - # *BSD and Darwin (macOS) - INSTALL_SYSV="" - CUPS_SERVERBIN="$exec_prefix/libexec/cups" - ;; - *) - # All others - INSTALL_SYSV="install-sysv" - CUPS_SERVERBIN="$exec_prefix/lib/cups" - ;; +case "$host_os_name" in #( + *-gnu) : + + # GNUs + INSTALL_SYSV="install-sysv" + CUPS_SERVERBIN="$exec_prefix/lib/cups" + ;; #( + *bsd* | darwin*) : + + # *BSD and Darwin (macOS) + INSTALL_SYSV="" + CUPS_SERVERBIN="$exec_prefix/libexec/cups" + ;; #( + *) : + + # All others + INSTALL_SYSV="install-sysv" + CUPS_SERVERBIN="$exec_prefix/lib/cups" + ;; #( + *) : + ;; esac + printf "%s\n" "#define CUPS_SERVERBIN \"$CUPS_SERVERBIN\"" >>confdefs.h @@ -7169,6 +7593,7 @@ # Configuration files CUPS_SERVERROOT="$sysconfdir/cups" + printf "%s\n" "#define CUPS_SERVERROOT \"$sysconfdir/cups\"" >>confdefs.h @@ -7178,48 +7603,66 @@ # Check whether --with-rundir was given. if test ${with_rundir+y} then : - withval=$with_rundir; CUPS_STATEDIR="$withval" + withval=$with_rundir; + CUPS_STATEDIR="$withval" + else $as_nop - case "$host_os_name" in - darwin*) - # Darwin (macOS) - CUPS_STATEDIR="$CUPS_SERVERROOT" - ;; - *) - # All others - CUPS_STATEDIR="$localstatedir/run/cups" - ;; - esac + case "$host_os_name" in #( + darwin*) : + + # Darwin (macOS) + CUPS_STATEDIR="$CUPS_SERVERROOT" + ;; #( + *) : + + # All others + CUPS_STATEDIR="$localstatedir/run/cups" + ;; #( + *) : + ;; +esac + fi + printf "%s\n" "#define CUPS_STATEDIR \"$CUPS_STATEDIR\"" >>confdefs.h -if test "$mandir" = "\${datarootdir}/man" -a "$prefix" = "/"; then - # New GNU "standards" break previous ones, so make sure we use - # the right default location for the operating system... - mandir="\${prefix}/man" -fi - -if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then - case "$host_os_name" in - darwin* | linux* | gnu* | *bsd*) - # Darwin, macOS, Linux, GNU HURD, and *BSD - mandir="/usr/share/man" - ;; - *) - # All others - mandir="/usr/man" - ;; - esac +if test "$mandir" = "\${datarootdir}/man" -a "$prefix" = "/" +then : + + # New GNU "standards" break previous ones, so make sure we use + # the right default location for the operating system... + mandir="\${prefix}/man" + fi +if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/" +then : + + case "$host_os_name" in #( + darwin* | linux* | gnu* | *bsd*) : + + # Darwin, macOS, Linux, GNU HURD, and *BSD + mandir="/usr/share/man" + ;; #( + *) : + + # All others + mandir="/usr/man" + + ;; #( + *) : + ;; +esac + +fi -PICFLAG=1 +PICFLAG="1" DSOFLAGS="${DSOFLAGS:=}" # Check whether --enable-shared was given. @@ -7234,71 +7677,102 @@ LIBCUPSIMAGE="" LIBCUPSSTATIC="lib$cupsbase.a" -if test x$enable_shared != xno; then - case "$host_os_name" in - sunos*) - LIBCUPS="lib$cupsbase.so.2" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.so.2" - fi - DSO="\$(CC)" - DSOXX="\$(CXX)" - DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G" - ;; - linux* | gnu* | *bsd*) - LIBCUPS="lib$cupsbase.so.2" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.so.2" - fi - DSO="\$(CC)" - DSOXX="\$(CXX)" - DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" - ;; - darwin*) - LIBCUPS="lib$cupsbase.2.dylib" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.2.dylib" - fi - DSO="\$(CC)" - DSOXX="\$(CXX)" - DSOFLAGS="$DSOFLAGS -Wl,-no_warn_inits -dynamiclib -single_module -lc" - ;; - *) - echo "Warning: shared libraries may not be supported. Trying -shared" - echo " option with compiler." - LIBCUPS="lib$cupsbase.so.2" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.so.2" - fi - DSO="\$(CC)" - DSOXX="\$(CXX)" - DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" - ;; - esac -else - PICFLAG=0 - LIBCUPS="lib$cupsbase.a" - if test "x$cupsimagebase" != x; then - LIBCUPSIMAGE="lib$cupsimagebase.a" - fi - DSO=":" - DSOXX=":" +if test x$enable_shared != xno +then : + + case "$host_os_name" in #( + sunos*) : + + LIBCUPS="lib$cupsbase.so.2" + if test "x$cupsimagebase" != x +then : + + LIBCUPSIMAGE="lib$cupsimagebase.so.2" + +fi + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G" + ;; #( + linux* | gnu* | *bsd*) : + + LIBCUPS="lib$cupsbase.so.2" + if test "x$cupsimagebase" != x +then : + + LIBCUPSIMAGE="lib$cupsimagebase.so.2" + fi + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" + ;; #( + darwin*) : + LIBCUPS="lib$cupsbase.2.dylib" + if test "x$cupsimagebase" != x +then : + LIBCUPSIMAGE="lib$cupsimagebase.2.dylib" +fi + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-no_warn_inits -dynamiclib -single_module -lc" + ;; #( + *) : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Warning: Shared libraries may not work, trying -shared option." >&5 +printf "%s\n" "$as_me: Warning: Shared libraries may not work, trying -shared option." >&6;} + LIBCUPS="lib$cupsbase.so.2" + if test "x$cupsimagebase" != x +then : + LIBCUPSIMAGE="lib$cupsimagebase.so.2" +fi + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared" + ;; #( + *) : + ;; +esac +else $as_nop + PICFLAG=0 + LIBCUPS="lib$cupsbase.a" + if test "x$cupsimagebase" != x +then : + + LIBCUPSIMAGE="lib$cupsimagebase.a" + +fi + DSO=":" + DSOXX=":" + +fi + + + + + + + + + +if test x$enable_shared = xno +then : + + LINKCUPS="../cups/lib$cupsbase.a \$(LIBS)" + EXTLINKCUPS="-lcups \$LIBS" + +else $as_nop + + LINKCUPS="-L../cups -l${cupsbase}" + EXTLINKCUPS="-lcups" -if test x$enable_shared = xno; then - LINKCUPS="../cups/lib$cupsbase.a \$(LIBS)" - EXTLINKCUPS="-lcups \$LIBS" -else - LINKCUPS="-L../cups -l${cupsbase}" - EXTLINKCUPS="-lcups" fi @@ -7306,36 +7780,53 @@ EXPORT_LDFLAGS="" -if test "$DSO" != ":"; then - # Tell the run-time linkers where to find a DSO. Some platforms - # need this option, even when the library is installed in a - # standard location... - case $host_os_name in - sunos*) - # Solaris... - if test $exec_prefix != /usr; then - DSOFLAGS="-R$libdir $DSOFLAGS" - LDFLAGS="$LDFLAGS -R$libdir" - EXPORT_LDFLAGS="-R$libdir" - fi - ;; - *bsd*) - # *BSD... - if test $exec_prefix != /usr; then - DSOFLAGS="-Wl,-R$libdir $DSOFLAGS" - LDFLAGS="$LDFLAGS -Wl,-R$libdir" - EXPORT_LDFLAGS="-Wl,-R$libdir" - fi - ;; - linux* | gnu*) - # Linux, and HURD... - if test $exec_prefix != /usr; then - DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS" - LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir" - EXPORT_LDFLAGS="-Wl,-rpath,$libdir" - fi - ;; - esac +if test "$DSO" != ":" +then : + + # Tell the run-time linkers where to find a DSO. Some platforms + # need this option, even when the library is installed in a + # standard location... + case $host_os_name in #( + sunos*) : + + # Solaris... + if test $exec_prefix != /usr +then : + + DSOFLAGS="-R$libdir $DSOFLAGS" + LDFLAGS="$LDFLAGS -R$libdir" + EXPORT_LDFLAGS="-R$libdir" + +fi + ;; #( + *bsd*) : + + # *BSD... + if test $exec_prefix != /usr +then : + + DSOFLAGS="-Wl,-R$libdir $DSOFLAGS" + LDFLAGS="$LDFLAGS -Wl,-R$libdir" + EXPORT_LDFLAGS="-Wl,-R$libdir" + +fi + ;; #( + linux* | gnu*) : + + # Linux, and HURD... + if test $exec_prefix != /usr +then : + + DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS" + LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir" + EXPORT_LDFLAGS="-Wl,-rpath,$libdir" + +fi + ;; #( + *) : + ;; +esac + fi @@ -7344,48 +7835,62 @@ # Check whether --enable-libtool_unsupported was given. if test ${enable_libtool_unsupported+y} then : - enableval=$enable_libtool_unsupported; if test x$enable_libtool_unsupported != xno; then - if test x$enable_libtool_unsupported == xyes; then - as_fn_error $? "Use --enable-libtool-unsupported=/path/to/libtool." "$LINENO" 5 - fi - LIBTOOL="$enable_libtool_unsupported" - enable_shared=no - echo "WARNING: libtool is not supported or endorsed by Apple Inc." - echo " WE DO NOT PROVIDE SUPPORT FOR LIBTOOL PROBLEMS." - else - LIBTOOL="" - fi + enableval=$enable_libtool_unsupported; + if test x$enable_libtool_unsupported != xno +then : + + if test x$enable_libtool_unsupported = xyes +then : + + as_fn_error $? "Use --enable-libtool-unsupported=/path/to/libtool." "$LINENO" 5 + fi + LIBTOOL="$enable_libtool_unsupported" + enable_shared="no" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: WARNING: libtool is not supported." >&5 +printf "%s\n" "$as_me: WARNING: WARNING: libtool is not supported." >&2;} + +else $as_nop + + LIBTOOL="" + +fi + +fi + + +if test x$LIBTOOL != x +then : + DSO="\$(LIBTOOL) --mode=link --tag=CC ${CC}" + DSOXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" + + LD_CC="\$(LIBTOOL) --mode=link --tag=CC ${CC}" + LD_CXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" + + LIBCUPS="libcups.la" + LIBCUPSSTATIC="libcups.la" + LIBCUPSCGI="libcupscgi.la" + LIBCUPSIMAGE="libcupsimage.la" + LIBCUPSMIME="libcupsmime.la" + LIBCUPSPPDC="libcupsppdc.la" + + LIBTOOL_CC="\$(LIBTOOL) --mode=compile --tag=CC" + LIBTOOL_CXX="\$(LIBTOOL) --mode=compile --tag=CXX" + LIBTOOL_INSTALL="\$(LIBTOOL) --mode=install" + + LINKCUPS="../cups/\$(LIBCUPS)" + LINKCUPSIMAGE="../cups/\$(LIBCUPSIMAGE)" + +else $as_nop + + LD_CC="\$(CC)" + LD_CXX="\$(CXX)" + + LIBTOOL_CC="" + LIBTOOL_CXX="" + LIBTOOL_INSTALL="" -if test x$LIBTOOL != x; then - DSO="\$(LIBTOOL) --mode=link --tag=CC ${CC}" - DSOXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" - - LD_CC="\$(LIBTOOL) --mode=link --tag=CC ${CC}" - LD_CXX="\$(LIBTOOL) --mode=link --tag=CXX ${CXX}" - - LIBCUPS="libcups.la" - LIBCUPSSTATIC="libcups.la" - LIBCUPSCGI="libcupscgi.la" - LIBCUPSIMAGE="libcupsimage.la" - LIBCUPSMIME="libcupsmime.la" - LIBCUPSPPDC="libcupsppdc.la" - - LIBTOOL_CC="\$(LIBTOOL) --mode=compile --tag=CC" - LIBTOOL_CXX="\$(LIBTOOL) --mode=compile --tag=CXX" - LIBTOOL_INSTALL="\$(LIBTOOL) --mode=install" - - LINKCUPS="../cups/\$(LIBCUPS)" - LINKCUPSIMAGE="../cups/\$(LIBCUPSIMAGE)" - -else - LD_CC="\$(CC)" - LD_CXX="\$(CXX)" - - LIBTOOL_CC="" - LIBTOOL_CXX="" - LIBTOOL_INSTALL="" fi @@ -7404,9 +7909,13 @@ # Check whether --with-optim was given. if test ${with_optim+y} then : - withval=$with_optim; OPTIM="$withval" + withval=$with_optim; + OPTIM="$withval" + else $as_nop - OPTIM="" + + OPTIM="" + fi @@ -7429,6 +7938,12 @@ enableval=$enable_debug_printfs; fi +# Check whether --enable-maintainer was given. +if test ${enable_maintainer+y} +then : + enableval=$enable_maintainer; +fi + # Check whether --enable-unit_tests was given. if test ${enable_unit_tests+y} then : @@ -7436,30 +7951,49 @@ fi -if test x$enable_debug = xyes -a "x$OPTIM" = x; then - OPTIM="-g" -else - INSTALL_STRIP="-s" +if test x$enable_debug = xyes -a "x$OPTIM" = x +then : + + OPTIM="-g" + +else $as_nop + + INSTALL_STRIP="-s" + fi -if test x$enable_debug_printfs = xyes; then - CFLAGS="$CFLAGS -DDEBUG" - CXXFLAGS="$CXXFLAGS -DDEBUG" +if test x$enable_debug_printfs = xyes +then : + + CFLAGS="$CFLAGS -DDEBUG" + CXXFLAGS="$CXXFLAGS -DDEBUG" + fi -if test x$enable_debug_guards = xyes; then - CFLAGS="$CFLAGS -DDEBUG_GUARDS" - CXXFLAGS="$CXXFLAGS -DDEBUG_GUARDS" +if test x$enable_debug_guards = xyes +then : + + CFLAGS="$CFLAGS -DDEBUG_GUARDS" + CXXFLAGS="$CXXFLAGS -DDEBUG_GUARDS" + fi -if test x$enable_unit_tests = xyes; then - if test "$build" != "$host"; then - as_fn_error $? "Sorry, cannot build unit tests when cross-compiling." "$LINENO" 5 - fi +if test x$enable_unit_tests = xyes +then : + + if test "$build" != "$host" +then : + + as_fn_error $? "Sorry, cannot build unit tests when cross-compiling." "$LINENO" 5 + +fi + + UNITTESTS="unittests" + +else $as_nop + + UNITTESTS="" - UNITTESTS="unittests" -else - UNITTESTS="" fi @@ -7478,21 +8012,26 @@ fi -if test -z "$with_archflags"; then - ARCHFLAGS="" -else - ARCHFLAGS="$with_archflags" +if test -z "$with_archflags" +then : + + ARCHFLAGS="" + +else $as_nop + + ARCHFLAGS="$with_archflags" + fi -if test -z "$with_ldarchflags"; then - if test "$host_os_name" = darwin; then - # Only create Intel programs by default - LDARCHFLAGS="`echo $ARCHFLAGS | sed -e '1,$s/-arch ppc64//'`" - else - LDARCHFLAGS="$ARCHFLAGS" - fi -else - LDARCHFLAGS="$with_ldarchflags" +if test -z "$with_ldarchflags" +then : + + LDARCHFLAGS="$ARCHFLAGS" + +else $as_nop + + LDARCHFLAGS="$with_ldarchflags" + fi @@ -7524,39 +8063,78 @@ WARNING_OPTIONS="" -if test -n "$GCC"; then - # Add GCC-specific compiler options... +if test -n "$GCC" +then : - # Address sanitizer is a useful tool to use when developing/debugging - # code but adds about 2x overhead... - if test x$enable_sanitizer = xyes; then - # Use -fsanitize=address with debugging... - OPTIM="$OPTIM -g -fsanitize=address" - else - # Otherwise use the Fortify enhancements to catch any unbounded - # string operations... - CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" - CXXFLAGS="$CXXFLAGS -D_FORTIFY_SOURCE=2" - fi + # Add GCC/Clang compiler options... - # Default optimization options... - if test -z "$OPTIM"; then - # Default to optimize-for-size and debug - OPTIM="-Os -g" - fi + # Address sanitizer is a useful tool to use when developing/debugging + # code but adds about 2x overhead... + if test x$enable_sanitizer = xyes +then : - # Generate position-independent code as needed... - if test $PICFLAG = 1; then - OPTIM="-fPIC $OPTIM" - fi + # Use -fsanitize=address with debugging... + OPTIM="$OPTIM -g -fsanitize=address" + +else $as_nop + + # Otherwise use the Fortify enhancements to catch any unbounded + # string operations... + CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" + CXXFLAGS="$CXXFLAGS -D_FORTIFY_SOURCE=2" + +fi + + # Default optimization options... + if test -z "$OPTIM" +then : + + # Default to optimize-for-size and debug + OPTIM="-Os -g" + +fi + + # Generate position-independent code as needed... + 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. + # The -fstack-protector-strong and -fstack-protector options are 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. + # First check for -fstack-protector-strong, then for -fstack-protector... + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fstack-protector-strong" >&5 +printf %s "checking whether compiler supports -fstack-protector-strong... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fstack-protector-strong" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + OPTIM="$OPTIM -fstack-protector-strong" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fstack-protector" >&5 printf %s "checking whether compiler supports -fstack-protector... " >&6; } - OLDCFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -fstack-protector" + CFLAGS="$OLDCFLAGS -fstack-protector" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -7570,35 +8148,71 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : - 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 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + + OPTIM="$OPTIM -fstack-protector" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - CFLAGS="$OLDCFLAGS" - 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... - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fPIE" >&5 +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" + + 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... + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fPIE" >&5 printf %s "checking whether compiler supports -fPIE... " >&6; } - OLDCFLAGS="$CFLAGS" - case "$host_os_name" in - darwin*) - CFLAGS="$CFLAGS -fPIE -Wl,-pie" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + OLDCFLAGS="$CFLAGS" + case "$host_os_name" in #( + darwin*) : + + CFLAGS="$CFLAGS -fPIE -Wl,-pie" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + PIEFLAGS="-fPIE -Wl,-pie" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ;; #( + *) : + + CFLAGS="$CFLAGS -fPIE -pie" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -7612,19 +8226,35 @@ if ac_fn_c_try_compile "$LINENO" then : - PIEFLAGS="-fPIE -Wl,-pie" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + PIEFLAGS="-fPIE -pie" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ;; + ;; #( + *) : + ;; +esac + CFLAGS="$OLDCFLAGS" + +fi + + WARNING_OPTIONS="-Wall -Wunused" + + for warning in char-subscripts deprecated-declarations format-truncation format-y2k switch unused-result; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-$warning" >&5 +printf %s "checking whether compiler supports -Wno-$warning... " >&6; } + + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wno-$warning -Werror" - *) - CFLAGS="$CFLAGS -fPIE -pie" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -7638,87 +8268,103 @@ if ac_fn_c_try_compile "$LINENO" then : - PIEFLAGS="-fPIE -pie" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } + WARNING_OPTIONS="$WARNING_OPTIONS -Wno-$warning" + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ;; - esac - CFLAGS="$OLDCFLAGS" - fi - # Add useful warning options for tracking down problems... - WARNING_OPTIONS="-Wall -Wno-format-y2k -Wunused -Wno-unused-result -Wsign-conversion -Wno-deprecated-declarations" + CFLAGS="$OLDCFLAGS" + done - # Test GCC version for certain warning flags since -Werror - # doesn't trigger... - gccversion=`$CC --version | head -1 | awk '{print $NF}'` - case "$gccversion" in - 7.* | 8.* | 9.* | 10.* | 11.* | 12.*) - WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-tautological-compare" - ;; - esac + if test x$enable_maintainer = xyes +then : + + WARNING_OPTIONS="$WARNING_OPTIONS -Werror" - # Additional warning options for development testing... -# if test -d .git; then -# WARNING_OPTIONS="-Werror -Wno-error=deprecated-declarations $WARNING_OPTIONS" -# fi -else - # Add vendor-specific compiler options... - case $host_os_name in - sunos*) - # Solaris - if test -z "$OPTIM"; then - OPTIM="-xO2" - fi - - if test $PICFLAG = 1; then - OPTIM="-KPIC $OPTIM" - fi - ;; - *) - # Running some other operating system; inform the user - # they should contribute the necessary options via - # Github... - echo "Building CUPS with default compiler optimizations; contact the CUPS developers on Github" - echo "(https://github.com/apple/cups/issues) with the uname and compiler options needed for" - echo "your platform, or set the CFLAGS and LDFLAGS environment variables before running" - echo "configure." - ;; - esac fi -# Add general compiler options per platform... -case $host_os_name in - linux*) - # glibc 2.8 and higher breaks peer credentials unless you - # define _GNU_SOURCE... - OPTIM="$OPTIM -D_GNU_SOURCE" - - # 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,-z,now" - fi - ;; +else $as_nop + + # Add vendor-specific compiler options... + case $host_os_name in #( + sunos*) : + + # Solaris + if test -z "$OPTIM" +then : + + OPTIM="-xO2" + +fi + + if test $PICFLAG = 1 +then : + + OPTIM="-KPIC $OPTIM" + +fi + ;; #( + *) : + + # Running some other operating system; inform the user + # they should contribute the necessary options via + # Github... + echo "Building CUPS with default compiler optimizations." + echo "Contact the OpenPrinting CUPS developers on Github with the uname and compiler" + echo "options needed for your platform, or set the CFLAGS and LDFLAGS environment" + echo "variables before running configure." + echo "" + echo "https://github.com/openprinting/cups" + ;; #( + *) : + ;; esac +fi + +# Add general compiler options per platform... +case $host_os_name in #( + linux*) : + + # glibc 2.8 and higher breaks peer credentials unless you + # define _GNU_SOURCE... + OPTIM="$OPTIM -D_GNU_SOURCE" + + # 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,-z,now" + +fi + ;; #( + *) : + ;; +esac ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" " -#include -#include -#include -#include -#include + #include + #include + #include + #include + #include + " if test "x$ac_cv_header_resolv_h" = xyes then : - printf "%s\n" "#define HAVE_RESOLV_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_RESOLV_H 1" >>confdefs.h + fi @@ -7896,7 +8542,10 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_GETIFADDRS 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_GETIFADDRS 1" >>confdefs.h + fi @@ -7956,7 +8605,10 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_HSTRERROR 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_HSTRERROR 1" >>confdefs.h + fi @@ -8016,7 +8668,10 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_RRESVPORT_AF 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_RRESVPORT_AF 1" >>confdefs.h + fi @@ -8076,10 +8731,14 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_RES_INIT 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_RES_INIT 1" >>confdefs.h + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing res_9_init" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing res_9_init" >&5 printf %s "checking for library containing res_9_init... " >&6; } if test ${ac_cv_search_res_9_init+y} then : @@ -8135,10 +8794,14 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_RES_INIT 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_RES_INIT 1" >>confdefs.h + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing res_init" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing res_init" >&5 printf %s "checking for library containing res_init... " >&6; } if test ${ac_cv_search_res_init+y} then : @@ -8194,19 +8857,21 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_RES_INIT 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_RES_INIT 1" >>confdefs.h + fi + fi + fi -# Tru64 5.1b leaks file descriptors with these functions; disable until -# we can come up with a test for this... -if test "$host_os_name" != "osf1"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getaddrinfo" >&5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getaddrinfo" >&5 printf %s "checking for library containing getaddrinfo... " >&6; } if test ${ac_cv_search_getaddrinfo+y} then : @@ -8262,11 +8927,14 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_GETADDRINFO 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_GETADDRINFO 1" >>confdefs.h + fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getnameinfo" >&5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getnameinfo" >&5 printf %s "checking for library containing getnameinfo... " >&6; } if test ${ac_cv_search_getnameinfo+y} then : @@ -8322,12 +8990,14 @@ if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - printf "%s\n" "#define HAVE_GETNAMEINFO 1" >>confdefs.h -fi + +printf "%s\n" "#define HAVE_GETNAMEINFO 1" >>confdefs.h + fi + ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#include " if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes @@ -8338,7 +9008,10 @@ ac_fn_c_check_header_compile "$LINENO" "sys/sockio.h" "ac_cv_header_sys_sockio_h" "$ac_includes_default" if test "x$ac_cv_header_sys_sockio_h" = xyes then : - printf "%s\n" "#define HAVE_SYS_SOCKIO_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_SYS_SOCKIO_H 1" >>confdefs.h + fi @@ -8349,34 +9022,53 @@ # Check whether --with-domainsocket was given. if test ${with_domainsocket+y} then : - withval=$with_domainsocket; default_domainsocket="$withval" + withval=$with_domainsocket; + default_domainsocket="$withval" + else $as_nop - default_domainsocket="" + + default_domainsocket="" + fi -if test x$enable_domainsocket != xno -a x$default_domainsocket != xno; then - if test "x$default_domainsocket" = x; then - case "$host_os_name" in - darwin*) - # Darwin and macOS do their own thing... - CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd" - ;; - *) - # All others use FHS standard... - CUPS_DEFAULT_DOMAINSOCKET="$CUPS_STATEDIR/cups.sock" - ;; - esac - else - CUPS_DEFAULT_DOMAINSOCKET="$default_domainsocket" - fi +if test x$enable_domainsocket != xno -a x$default_domainsocket != xno +then : - CUPS_LISTEN_DOMAINSOCKET="Listen $CUPS_DEFAULT_DOMAINSOCKET" + if test "x$default_domainsocket" = x +then : - printf "%s\n" "#define CUPS_DEFAULT_DOMAINSOCKET \"$CUPS_DEFAULT_DOMAINSOCKET\"" >>confdefs.h + case "$host_os_name" in #( + darwin*) : + + # Darwin and macOS do their own thing... + CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd" + ;; #( + *) : + + # All others use FHS standard... + CUPS_DEFAULT_DOMAINSOCKET="$CUPS_STATEDIR/cups.sock" + ;; #( + *) : + ;; +esac + +else $as_nop + + CUPS_DEFAULT_DOMAINSOCKET="$default_domainsocket" + +fi + + CUPS_LISTEN_DOMAINSOCKET="Listen $CUPS_DEFAULT_DOMAINSOCKET" + + +printf "%s\n" "#define CUPS_DEFAULT_DOMAINSOCKET \"$CUPS_DEFAULT_DOMAINSOCKET\"" >>confdefs.h + + +else $as_nop + + CUPS_LISTEN_DOMAINSOCKET="" -else - CUPS_LISTEN_DOMAINSOCKET="" fi @@ -8386,21 +9078,30 @@ ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" if test "x$ac_cv_func_poll" = xyes then : - printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h + fi ac_fn_c_check_func "$LINENO" "epoll_create" "ac_cv_func_epoll_create" if test "x$ac_cv_func_epoll_create" = xyes then : - printf "%s\n" "#define HAVE_EPOLL 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_EPOLL 1" >>confdefs.h + fi ac_fn_c_check_func "$LINENO" "kqueue" "ac_cv_func_kqueue" if test "x$ac_cv_func_kqueue" = xyes then : - printf "%s\n" "#define HAVE_KQUEUE 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_KQUEUE 1" >>confdefs.h + fi @@ -8416,8 +9117,10 @@ LIBGSSAPI="" -if test x$enable_gssapi != xno; then - if test -n "$ac_tool_prefix"; then +if test x$enable_gssapi = xyes +then : + + 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -8525,85 +9228,35 @@ KRB5CONFIG="$ac_cv_path_KRB5CONFIG" fi - if test "x$KRB5CONFIG" != x; then - case "$host_os_name" in - darwin) - # macOS weak-links to the Kerberos framework... - LIBGSSAPI="-weak_framework Kerberos" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GSS framework" >&5 + case "$host_os_name" in #( + darwin*) : + + # macOS weak-links to the Kerberos framework... + +printf "%s\n" "#define HAVE_GSSAPI 1" >>confdefs.h + + LIBGSSAPI="-weak_framework Kerberos" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GSS framework" >&5 printf %s "checking for GSS framework... " >&6; } - if test -d /System/Library/Frameworks/GSS.framework; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - LIBGSSAPI="$LIBGSSAPI -weak_framework GSS" - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - fi - ;; - sunos*) - # Solaris has a non-standard krb5-config, don't use it! - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 -printf %s "checking for gss_display_status in -lgss... " >&6; } -if test ${ac_cv_lib_gss_gss_display_status+y} + if test -d /System/Library/Frameworks/GSS.framework then : - printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS -LIBS="-lgss $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. */ -char gss_display_status (); -int -main (void) -{ -return gss_display_status (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_cv_lib_gss_gss_display_status=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + LIBGSSAPI="$LIBGSSAPI -weak_framework GSS" + else $as_nop - ac_cv_lib_gss_gss_display_status=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_display_status" >&5 -printf "%s\n" "$ac_cv_lib_gss_gss_display_status" >&6; } -if test "x$ac_cv_lib_gss_gss_display_status" = xyes -then : -printf "%s\n" "#define HAVE_GSSAPI 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } - CFLAGS="`$KRB5CONFIG --cflags` $CFLAGS" - CPPFLAGS="`$KRB5CONFIG --cflags` $CPPFLAGS" - LIBGSSAPI="-lgss `$KRB5CONFIG --libs`" fi + ;; #( + sunos*) : - ;; - *) - # Other platforms just ask for GSSAPI - CFLAGS="`$KRB5CONFIG --cflags gssapi` $CFLAGS" - CPPFLAGS="`$KRB5CONFIG --cflags gssapi` $CPPFLAGS" - LIBGSSAPI="`$KRB5CONFIG --libs gssapi`" - ;; - esac - -printf "%s\n" "#define HAVE_GSSAPI 1" >>confdefs.h - - else - # Check for vendor-specific implementations... - case "$host_os_name" in - hp-ux*) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 + # Solaris has a non-standard krb5-config, don't use it! + SAVELIBS="$LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 printf %s "checking for gss_display_status in -lgss... " >&6; } if test ${ac_cv_lib_gss_gss_display_status+y} then : @@ -8641,350 +9294,449 @@ if test "x$ac_cv_lib_gss_gss_display_status" = xyes then : -printf "%s\n" "#define HAVE_GSSAPI 1" >>confdefs.h - LIBGSSAPI="-lgss -lgssapi_krb5" -fi +printf "%s\n" "#define HAVE_GSSAPI 1" >>confdefs.h - ;; - sunos*) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 -printf %s "checking for gss_display_status in -lgss... " >&6; } -if test ${ac_cv_lib_gss_gss_display_status+y} + if test "x$KRB5CONFIG" != x then : - printf %s "(cached) " >&6 -else $as_nop - ac_check_lib_save_LIBS=$LIBS -LIBS="-lgss $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. */ -char gss_display_status (); -int -main (void) -{ -return gss_display_status (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_cv_lib_gss_gss_display_status=yes + CFLAGS="$($KRB5CONFIG --cflags) $CFLAGS" + CPPFLAGS="$($KRB5CONFIG --cflags) $CPPFLAGS" + LIBGSSAPI="-lgss $($KRB5CONFIG --libs)" + else $as_nop - ac_cv_lib_gss_gss_display_status=no + + LIBGSSAPI="-lgss" + fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS + +else $as_nop + + as_fn_error $? "--enable-gssapi specified but GSSAPI library cannot be found." "$LINENO" 5 + fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_display_status" >&5 -printf "%s\n" "$ac_cv_lib_gss_gss_display_status" >&6; } -if test "x$ac_cv_lib_gss_gss_display_status" = xyes + + LIBS="$SAVELIBS" + ;; #( + *) : + + # Other platforms just ask for GSSAPI + if test "x$KRB5CONFIG" = x then : + as_fn_error $? "--enable-gssapi specified but krb5-config cannot be found." "$LINENO" 5 + +else $as_nop + + printf "%s\n" "#define HAVE_GSSAPI 1" >>confdefs.h - LIBGSSAPI="-lgss" -fi + CFLAGS="$($KRB5CONFIG --cflags gssapi) $CFLAGS" + CPPFLAGS="$($KRB5CONFIG --cflags gssapi) $CPPFLAGS" + LIBGSSAPI="$($KRB5CONFIG --libs gssapi)" - ;; - esac - fi +fi + ;; #( + *) : + ;; +esac - if test "x$LIBGSSAPI" != x; then - ac_fn_c_check_header_compile "$LINENO" "krb5.h" "ac_cv_header_krb5_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "krb5.h" "ac_cv_header_krb5_h" "$ac_includes_default" if test "x$ac_cv_header_krb5_h" = xyes then : - printf "%s\n" "#define HAVE_KRB5_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_KRB5_H 1" >>confdefs.h fi - if test -d /System/Library/Frameworks/GSS.framework; then - ac_fn_c_check_header_compile "$LINENO" "GSS/gssapi.h" "ac_cv_header_GSS_gssapi_h" "$ac_includes_default" + if test -d /System/Library/Frameworks/GSS.framework +then : + + ac_fn_c_check_header_compile "$LINENO" "GSS/gssapi.h" "ac_cv_header_GSS_gssapi_h" "$ac_includes_default" if test "x$ac_cv_header_GSS_gssapi_h" = xyes then : - printf "%s\n" "#define HAVE_GSS_GSSAPI_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_GSS_GSSAPI_H 1" >>confdefs.h fi - ac_fn_c_check_header_compile "$LINENO" "GSS/gssapi_generic.h" "ac_cv_header_GSS_gssapi_generic_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$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 : - printf "%s\n" "#define HAVE_GSS_GSSAPI_GENERIC_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_GSS_GSSAPI_GENERIC_H 1" >>confdefs.h fi - ac_fn_c_check_header_compile "$LINENO" "GSS/gssapi_spi.h" "ac_cv_header_GSS_gssapi_spi_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$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 : - printf "%s\n" "#define HAVE_GSS_GSSAPI_SPI_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_GSS_GSSAPI_SPI_H 1" >>confdefs.h fi - else - ac_fn_c_check_header_compile "$LINENO" "gssapi.h" "ac_cv_header_gssapi_h" "$ac_includes_default" + +else $as_nop + + ac_fn_c_check_header_compile "$LINENO" "gssapi.h" "ac_cv_header_gssapi_h" "$ac_includes_default" if test "x$ac_cv_header_gssapi_h" = xyes then : - printf "%s\n" "#define HAVE_GSSAPI_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_GSSAPI_H 1" >>confdefs.h fi - ac_fn_c_check_header_compile "$LINENO" "gssapi/gssapi.h" "ac_cv_header_gssapi_gssapi_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "gssapi/gssapi.h" "ac_cv_header_gssapi_gssapi_h" "$ac_includes_default" if test "x$ac_cv_header_gssapi_gssapi_h" = xyes then : - printf "%s\n" "#define HAVE_GSSAPI_GSSAPI_H 1" >>confdefs.h + +printf "%s\n" "#define HAVE_GSSAPI_GSSAPI_H 1" >>confdefs.h fi - fi - SAVELIBS="$LIBS" - LIBS="$LIBS $LIBGSSAPI" +fi + + SAVELIBS="$LIBS" + LIBS="$LIBS $LIBGSSAPI" + PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC $LIBGSSAPI" - ac_fn_c_check_func "$LINENO" "__ApplePrivate_gss_acquire_cred_ex_f" "ac_cv_func___ApplePrivate_gss_acquire_cred_ex_f" + ac_fn_c_check_func "$LINENO" "__ApplePrivate_gss_acquire_cred_ex_f" "ac_cv_func___ApplePrivate_gss_acquire_cred_ex_f" if test "x$ac_cv_func___ApplePrivate_gss_acquire_cred_ex_f" = xyes then : - printf "%s\n" "#define HAVE_GSS_ACQUIRE_CRED_EX_F 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_GSS_ACQUIRE_CRED_EX_F 1" >>confdefs.h + fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GSS_C_NT_HOSTBASED_SERVICE" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GSS_C_NT_HOSTBASED_SERVICE" >&5 printf %s "checking for GSS_C_NT_HOSTBASED_SERVICE... " >&6; } - if test x$ac_cv_header_gssapi_gssapi_h = xyes; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + if test x$ac_cv_header_gssapi_gssapi_h = xyes +then : + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include + + #include int main (void) { - gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ; return 0; } + _ACEOF if ac_fn_c_try_compile "$LINENO" then : - printf "%s\n" "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + +printf "%s\n" "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - elif test x$ac_cv_header_gss_gssapi_h = xyes; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + +elif test x$ac_cv_header_gss_gssapi_h = xyes +then : + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include + + #include int main (void) { - gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ; return 0; } + _ACEOF if ac_fn_c_try_compile "$LINENO" then : - printf "%s\n" "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + +printf "%s\n" "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include + + #include int main (void) { - gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ; return 0; } + _ACEOF if ac_fn_c_try_compile "$LINENO" then : - printf "%s\n" "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + +printf "%s\n" "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - fi - LIBS="$SAVELIBS" - fi +fi + + LIBS="$SAVELIBS" + fi # Check whether --with-gssservicename was given. if test ${with_gssservicename+y} then : - withval=$with_gssservicename; default_gssservicename="$withval" + withval=$with_gssservicename; + default_gssservicename="$withval" + else $as_nop - default_gssservicename="default" -fi + default_gssservicename="default" -if test x$default_gssservicename != xno; then - if test "x$default_gssservicename" = "xdefault"; then - CUPS_DEFAULT_GSSSERVICENAME="host" - else - CUPS_DEFAULT_GSSSERVICENAME="$default_gssservicename" - fi -else - CUPS_DEFAULT_GSSSERVICENAME="" fi -printf "%s\n" "#define CUPS_DEFAULT_GSSSERVICENAME \"$CUPS_DEFAULT_GSSSERVICENAME\"" >>confdefs.h +if test x$default_gssservicename != xno +then : + if test "x$default_gssservicename" = "xdefault" +then : + CUPS_DEFAULT_GSSSERVICENAME="host" + +else $as_nop + + CUPS_DEFAULT_GSSSERVICENAME="$default_gssservicename" -# Check whether --enable-threads was given. -if test ${enable_threads+y} -then : - enableval=$enable_threads; fi +else $as_nop + + CUPS_DEFAULT_GSSSERVICENAME="" -have_pthread=no +fi + + + +printf "%s\n" "#define CUPS_DEFAULT_GSSSERVICENAME \"$CUPS_DEFAULT_GSSSERVICENAME\"" >>confdefs.h + + + +have_pthread="no" PTHREAD_FLAGS="" -if test "x$enable_threads" != xno; then - ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" + +ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes then : - printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h + fi - if test x$ac_cv_header_pthread_h = xyes; then - for flag in -lpthreads -lpthread -pthread; do - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create using $flag" >&5 +if test x$ac_cv_header_pthread_h = xyes +then : + + for flag in -lpthreads -lpthread -pthread; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create using $flag" >&5 printf %s "checking for pthread_create using $flag... " >&6; } - SAVELIBS="$LIBS" - LIBS="$flag $LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + SAVELIBS="$LIBS" + LIBS="$flag $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + + #include int main (void) { -pthread_create(0, 0, 0, 0); + + pthread_create(0, 0, 0, 0); + ; return 0; } + _ACEOF if ac_fn_c_try_link "$LINENO" then : - have_pthread=yes + + have_pthread="yes" + else $as_nop - LIBS="$SAVELIBS" + + LIBS="$SAVELIBS" + fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_pthread" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_pthread" >&5 printf "%s\n" "$have_pthread" >&6; } - if test $have_pthread = yes; then - PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" + if test $have_pthread = yes +then : - # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to - # be POSIX-compliant... :( - if test $host_os_name = sunos; then - PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" - fi - break - fi - done - fi -fi + PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" + # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to be POSIX- + # compliant... :( + if test $host_os_name = sunos +then : + PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" +fi + break + +fi + done -# Check whether --enable-ssl was given. -if test ${enable_ssl+y} -then : - enableval=$enable_ssl; fi -# Check whether --enable-cdsassl was given. -if test ${enable_cdsassl+y} +if test $have_pthread = no then : - enableval=$enable_cdsassl; + + as_fn_error $? "CUPS requires threading support." "$LINENO" 5 + fi -# Check whether --enable-gnutls was given. -if test ${enable_gnutls+y} + + +# Check whether --with-tls was given. +if test ${with_tls+y} then : - enableval=$enable_gnutls; + withval=$with_tls; fi +if test "x$with_tls" = x +then : + + with_tls="yes" + +elif test "$with_tls" != cdsa -a "$with_tls" != gnutls -a "$with_tls" != no -a "$with_tls" != yes +then : + + as_fn_error $? "Unsupported --with-tls value \"$with_tls\" specified." "$LINENO" 5 -SSLFLAGS="" -SSLLIBS="" -have_ssl=0 +fi + +TLSFLAGS="" +TLSLIBS="" +have_tls="0" CUPS_SERVERKEYCHAIN="" -if test x$enable_ssl != xno; then - if test $have_ssl = 0 -a "x$enable_cdsassl" != "xno"; then - if test $host_os_name = darwin; then - ac_fn_c_check_header_compile "$LINENO" "Security/SecureTransport.h" "ac_cv_header_Security_SecureTransport_h" "$ac_includes_default" +if test $with_tls = yes -o $with_tls = cdsa +then : + + if test $host_os_name = darwin +then : + + ac_fn_c_check_header_compile "$LINENO" "Security/SecureTransport.h" "ac_cv_header_Security_SecureTransport_h" "$ac_includes_default" if test "x$ac_cv_header_Security_SecureTransport_h" = xyes then : - have_ssl=1 - printf "%s\n" "#define HAVE_SSL 1" >>confdefs.h + have_tls="1" + with_tls="cdsa" + +printf "%s\n" "#define HAVE_TLS 1" >>confdefs.h - printf "%s\n" "#define HAVE_CDSASSL 1" >>confdefs.h - CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain" +printf "%s\n" "#define HAVE_CDSASSL 1" >>confdefs.h - ac_fn_c_check_header_compile "$LINENO" "Security/SecCertificate.h" "ac_cv_header_Security_SecCertificate_h" "$ac_includes_default" + CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain" + + ac_fn_c_check_header_compile "$LINENO" "Security/SecCertificate.h" "ac_cv_header_Security_SecCertificate_h" "$ac_includes_default" if test "x$ac_cv_header_Security_SecCertificate_h" = xyes then : - printf "%s\n" "#define HAVE_SECCERTIFICATE_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_SECCERTIFICATE_H 1" >>confdefs.h + fi - ac_fn_c_check_header_compile "$LINENO" "Security/SecItem.h" "ac_cv_header_Security_SecItem_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "Security/SecItem.h" "ac_cv_header_Security_SecItem_h" "$ac_includes_default" if test "x$ac_cv_header_Security_SecItem_h" = xyes then : - printf "%s\n" "#define HAVE_SECITEM_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_SECITEM_H 1" >>confdefs.h + fi - ac_fn_c_check_header_compile "$LINENO" "Security/SecPolicy.h" "ac_cv_header_Security_SecPolicy_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "Security/SecPolicy.h" "ac_cv_header_Security_SecPolicy_h" "$ac_includes_default" if test "x$ac_cv_header_Security_SecPolicy_h" = xyes then : - printf "%s\n" "#define HAVE_SECPOLICY_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_SECPOLICY_H 1" >>confdefs.h + fi + fi - fi - fi - if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then - if test -n "$ac_tool_prefix"; then +elif test $with_tls = cdsa +then : + + as_fn_error $? "--with-tls=cdsa is not compatible with your host operating system." "$LINENO" 5 + +fi + +fi + +if test $with_tls = yes -o $with_tls = gnutls +then : + + 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -9092,57 +9844,106 @@ LIBGNUTLSCONFIG="$ac_cv_path_LIBGNUTLSCONFIG" fi - if $PKGCONFIG --exists gnutls; then - have_ssl=1 - SSLLIBS=`$PKGCONFIG --libs gnutls` - SSLFLAGS=`$PKGCONFIG --cflags gnutls` - printf "%s\n" "#define HAVE_SSL 1" >>confdefs.h - - printf "%s\n" "#define HAVE_GNUTLS 1" >>confdefs.h - - elif test "x$LIBGNUTLSCONFIG" != x; then - have_ssl=1 - SSLLIBS=`$LIBGNUTLSCONFIG --libs` - SSLFLAGS=`$LIBGNUTLSCONFIG --cflags` - printf "%s\n" "#define HAVE_SSL 1" >>confdefs.h + if test "x$PKGCONFIG" != x +then : - printf "%s\n" "#define HAVE_GNUTLS 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gnutls package" >&5 +printf %s "checking for gnutls package... " >&6; } + if $PKGCONFIG --exists gnutls +then : - fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + have_tls="1" + with_tls="gnutls" + TLSLIBS="$($PKGCONFIG --libs gnutls)" + TLSFLAGS="$($PKGCONFIG --cflags gnutls)" + PKGCONFIG_REQUIRES="$PKGCONFIG_REQUIRES gnutls" - if test $have_ssl = 1; then - CUPS_SERVERKEYCHAIN="ssl" +printf "%s\n" "#define HAVE_TLS 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" + +printf "%s\n" "#define HAVE_GNUTLS 1" >>confdefs.h + + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi + +fi + if test $have_tls = 0 -a "x$LIBGNUTLSCONFIG" != x +then : + + have_tls="1" + with_tls="gnutls" + TLSLIBS="$($LIBGNUTLSCONFIG --libs)" + TLSFLAGS="$($LIBGNUTLSCONFIG --cflags)" + PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC $TLSLIBS" + +printf "%s\n" "#define HAVE_TLS 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_GNUTLS 1" >>confdefs.h + + +fi + + if test $have_tls = 1 +then : + + CUPS_SERVERKEYCHAIN="ssl" + + SAVELIBS="$LIBS" + LIBS="$LIBS $TLSLIBS" + 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 : - printf "%s\n" "#define HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION 1" >>confdefs.h + fi - ac_fn_c_check_func "$LINENO" "gnutls_priority_set_direct" "ac_cv_func_gnutls_priority_set_direct" + 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 : - printf "%s\n" "#define HAVE_GNUTLS_PRIORITY_SET_DIRECT 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_GNUTLS_PRIORITY_SET_DIRECT 1" >>confdefs.h + + +fi + + LIBS="$SAVELIBS" + +elif test $with_tls = gnutls +then : + + as_fn_error $? "--with-tls=gnutls was specified but the GNU TLS library was not found." "$LINENO" 5 fi - LIBS="$SAVELIBS" - fi - fi fi IPPALIASES="http" -if test $have_ssl = 1; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Using SSLLIBS=\"$SSLLIBS\"" >&5 -printf "%s\n" " Using SSLLIBS=\"$SSLLIBS\"" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Using SSLFLAGS=\"$SSLFLAGS\"" >&5 -printf "%s\n" " Using SSLFLAGS=\"$SSLFLAGS\"" >&6; } +if test $have_tls = 1 +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Using TLSLIBS=\"$TLSLIBS\"" >&5 +printf "%s\n" "$as_me: Using TLSLIBS=\"$TLSLIBS\"" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Using TLSFLAGS=\"$TLSFLAGS\"" >&5 +printf "%s\n" "$as_me: Using TLSFLAGS=\"$TLSFLAGS\"" >&6;} IPPALIASES="http https ipps" -elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes; then - as_fn_error $? "Unable to enable SSL support." "$LINENO" 5 + +elif test $with_tls = yes +then : + + as_fn_error $? "--with-tls=yes was specified but no compatible TLS libraries could be found." "$LINENO" 5 + fi @@ -9150,7 +9951,7 @@ -EXPORT_SSLLIBS="$SSLLIBS" +EXPORT_TLSLIBS="$TLSLIBS" @@ -9174,10 +9975,12 @@ PAMMOD="pam_unknown.so" PAMMODAUTH="pam_unknown.so" -if test x$enable_pam != xno; then - SAVELIBS="$LIBS" +if test x$enable_pam != xno +then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 + SAVELIBS="$LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : @@ -9220,7 +10023,7 @@ fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pam_start in -lpam" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pam_start in -lpam" >&5 printf %s "checking for pam_start in -lpam... " >&6; } if test ${ac_cv_lib_pam_pam_start+y} then : @@ -9263,7 +10066,7 @@ fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pam_set_item in -lpam" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pam_set_item in -lpam" >&5 printf %s "checking for pam_set_item in -lpam... " >&6; } if test ${ac_cv_lib_pam_pam_set_item+y} then : @@ -9300,11 +10103,14 @@ printf "%s\n" "$ac_cv_lib_pam_pam_set_item" >&6; } if test "x$ac_cv_lib_pam_pam_set_item" = xyes then : - printf "%s\n" "#define HAVE_PAM_SET_ITEM 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_PAM_SET_ITEM 1" >>confdefs.h + fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pam_setcred in -lpam" >&5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pam_setcred in -lpam" >&5 printf %s "checking for pam_setcred in -lpam... " >&6; } if test ${ac_cv_lib_pam_pam_setcred+y} then : @@ -9341,87 +10147,141 @@ printf "%s\n" "$ac_cv_lib_pam_pam_setcred" >&6; } if test "x$ac_cv_lib_pam_pam_setcred" = xyes then : - printf "%s\n" "#define HAVE_PAM_SETCRED 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_PAM_SETCRED 1" >>confdefs.h + fi - ac_fn_c_check_header_compile "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default" if test "x$ac_cv_header_security_pam_appl_h" = xyes then : fi - if test x$ac_cv_header_security_pam_appl_h != xyes; then - ac_fn_c_check_header_compile "$LINENO" "pam/pam_appl.h" "ac_cv_header_pam_pam_appl_h" "$ac_includes_default" + if test x$ac_cv_header_security_pam_appl_h != xyes +then : + + ac_fn_c_check_header_compile "$LINENO" "pam/pam_appl.h" "ac_cv_header_pam_pam_appl_h" "$ac_includes_default" if test "x$ac_cv_header_pam_pam_appl_h" = xyes then : - printf "%s\n" "#define HAVE_PAM_PAM_APPL_H 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_PAM_PAM_APPL_H 1" >>confdefs.h + fi - fi - if test x$ac_cv_lib_pam_pam_start != xno; then - # Set the necessary libraries for PAM... - if test x$ac_cv_lib_dl_dlopen != xno; then - PAMLIBS="-lpam -ldl" - else - PAMLIBS="-lpam" - fi - - # Find the PAM configuration directory, if any... - for dir in /private/etc/pam.d /etc/pam.d; do - if test -d $dir; then - PAMDIR=$dir - break; - fi - done - fi +fi - LIBS="$SAVELIBS" + if test x$ac_cv_lib_pam_pam_start != xno +then : + + # Set the necessary libraries for PAM... + if test x$ac_cv_lib_dl_dlopen != xno +then : + + PAMLIBS="-lpam -ldl" + +else $as_nop + + PAMLIBS="-lpam" + +fi + + # Find the PAM configuration directory, if any... + for dir in /private/etc/pam.d /etc/pam.d; do + if test -d $dir +then : + + PAMDIR="$dir" + break; + +fi + done + +fi + + LIBS="$SAVELIBS" + + case "$host_os_name" in #( + darwin*) : + + # Darwin/macOS + if test "x$with_pam_module" != x +then : + + PAMFILE="pam.$with_pam_module" + +elif test -f /usr/lib/pam/pam_opendirectory.so.2 +then : + + PAMFILE="pam.opendirectory" + +else $as_nop + + PAMFILE="pam.securityserver" + +fi + ;; #( + *) : + + # All others; this test might need to be updated + # as Linux distributors move things around... + if test "x$with_pam_module" != x +then : + + PAMMOD="pam_${with_pam_module}.so" + +elif test -f /etc/pam.d/common-auth +then : + + PAMFILE="pam.common" + +else $as_nop + + moddir="" + for dir in /lib/security /lib64/security /lib/x86_64-linux-gnu/security /var/lib/pam; do + if test -d $dir +then : + + moddir="$dir" + break; + +fi + done + + if test -f $moddir/pam_unix2.so +then : + + PAMMOD="pam_unix2.so" + +elif test -f $moddir/pam_unix.so +then : + + PAMMOD="pam_unix.so" + +fi + +fi + + if test "x$PAMMOD" = xpam_unix.so +then : + + PAMMODAUTH="$PAMMOD shadow nodelay" + +else $as_nop + + PAMMODAUTH="$PAMMOD nodelay" + +fi + ;; #( + *) : + ;; +esac - case "$host_os_name" in - darwin*) - # Darwin/macOS - if test "x$with_pam_module" != x; then - PAMFILE="pam.$with_pam_module" - elif test -f /usr/lib/pam/pam_opendirectory.so.2; then - PAMFILE="pam.opendirectory" - else - PAMFILE="pam.securityserver" - fi - ;; - - *) - # All others; this test might need to be updated - # as Linux distributors move things around... - if test "x$with_pam_module" != x; then - PAMMOD="pam_${with_pam_module}.so" - elif test -f /etc/pam.d/common-auth; then - PAMFILE="pam.common" - else - moddir="" - for dir in /lib/security /lib64/security /lib/x86_64-linux-gnu/security /var/lib/pam; do - if test -d $dir; then - moddir=$dir - break; - fi - done - - if test -f $moddir/pam_unix2.so; then - PAMMOD="pam_unix2.so" - elif test -f $moddir/pam_unix.so; then - PAMMOD="pam_unix.so" - fi - fi - - if test "x$PAMMOD" = xpam_unix.so; then - PAMMODAUTH="$PAMMOD shadow nodelay" - else - PAMMODAUTH="$PAMMOD nodelay" - fi - ;; - esac fi @@ -9637,16 +10497,25 @@ LARGEFILE="" -if test x$enable_largefile != xno; then - LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" +if test x$enable_largefile != xno +then : - if test x$ac_cv_sys_large_files = x1; then - LARGEFILE="$LARGEFILE -D_LARGE_FILES" - fi + LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" + + if test x$ac_cv_sys_large_files = x1 +then : + + LARGEFILE="$LARGEFILE -D_LARGE_FILES" + +fi + + if test x$ac_cv_sys_file_offset_bits = x64 +then : + + LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" + +fi - if test x$ac_cv_sys_file_offset_bits = x64; then - LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" - fi fi @@ -9656,12 +10525,18 @@ then : printf %s "(cached) " >&6 else $as_nop - if test "$GCC" = yes; then - ac_cv_c_long_long=yes - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + if test "$GCC" = yes +then : + + ac_cv_c_long_long="yes" + +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + int main (void) { @@ -9669,59 +10544,83 @@ ; return 0; } + _ACEOF if ac_fn_c_try_compile "$LINENO" then : - ac_cv_c_long_long=yes + + ac_cv_c_long_long="yes" + else $as_nop - ac_cv_c_long_long=no + + ac_cv_c_long_long="no" + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - fi + +fi + fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_long_long" >&5 printf "%s\n" "$ac_cv_c_long_long" >&6; } -if test $ac_cv_c_long_long = yes; then - printf "%s\n" "#define HAVE_LONG_LONG 1" >>confdefs.h +if test $ac_cv_c_long_long = yes +then : + + +printf "%s\n" "#define HAVE_LONG_LONG 1" >>confdefs.h + fi ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" if test "x$ac_cv_func_strtoll" = xyes then : - printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h + fi -# Check whether --enable-avahi was given. -if test ${enable_avahi+y} + +# Check whether --with-dnssd was given. +if test ${with_dnssd+y} then : - enableval=$enable_avahi; + withval=$with_dnssd; fi -# Check whether --enable-dnssd was given. -if test ${enable_dnssd+y} +if test x$with_dnssd = x then : - enableval=$enable_dnssd; -fi + with_dnssd="yes" + +elif test "$with_dnssd" != avahi -a "$with_dnssd" != mdnsresponder -a "$with_dnssd" != no -a "$with_dnssd" != yes +then : + + as_fn_error $? "Unsupported --with-dnssd value \"$with_dnssd\"." "$LINENO" 5 + +fi -# Check whether --with-dnssd-libs was given. +# Check whether --with-dnssd_libs was given. if test ${with_dnssd_libs+y} then : - withval=$with_dnssd_libs; LDFLAGS="-L$withval $LDFLAGS" - DSOFLAGS="-L$withval $DSOFLAGS" + withval=$with_dnssd_libs; + LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS" + fi -# Check whether --with-dnssd-includes was given. +# Check whether --with-dnssd_includes was given. if test ${with_dnssd_includes+y} then : - withval=$with_dnssd_includes; CFLAGS="-I$withval $CFLAGS" - CPPFLAGS="-I$withval $CPPFLAGS" + withval=$with_dnssd_includes; + CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS" + fi @@ -9730,87 +10629,244 @@ IPPFIND_BIN="" IPPFIND_MAN="" -if test "x$PKGCONFIG" != x -a x$enable_avahi != xno -a x$host_os_name != xdarwin; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Avahi" >&5 -printf %s "checking for Avahi... " >&6; } - if $PKGCONFIG --exists avahi-client; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`" - DNSSDLIBS="`$PKGCONFIG --libs avahi-client`" - DNSSD_BACKEND="dnssd" - IPPFIND_BIN="ippfind" - IPPFIND_MAN="ippfind.1" - printf "%s\n" "#define HAVE_AVAHI 1" >>confdefs.h - - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - fi -fi +if test $with_dnssd = yes -o $with_dnssd = mdnsresponder +then : -if test "x$DNSSD_BACKEND" = x -a x$enable_dnssd != xno; then - ac_fn_c_check_header_compile "$LINENO" "dns_sd.h" "ac_cv_header_dns_sd_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "dns_sd.h" "ac_cv_header_dns_sd_h" "$ac_includes_default" if test "x$ac_cv_header_dns_sd_h" = xyes then : - case "$host_os_name" in - darwin*) - # Darwin and macOS... - printf "%s\n" "#define HAVE_DNSSD 1" >>confdefs.h - - DNSSD_BACKEND="dnssd" - IPPFIND_BIN="ippfind" - IPPFIND_MAN="ippfind.1" - ;; - *) - # All others... - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for current version of dns_sd library" >&5 + case "$host_os_name" in #( + darwin*) : + + # Darwin and macOS... + with_dnssd="mdnsresponder" + +printf "%s\n" "#define HAVE_DNSSD 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_MDNSRESPONDER 1" >>confdefs.h + + DNSSD_BACKEND="dnssd" + IPPFIND_BIN="ippfind" + IPPFIND_MAN="ippfind.1" + ;; #( + *) : + + # All others... + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for current version of dns_sd library" >&5 printf %s "checking for current version of dns_sd library... " >&6; } - SAVELIBS="$LIBS" - LIBS="$LIBS -ldns_sd" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + SAVELIBS="$LIBS" + LIBS="$LIBS -ldns_sd" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + + #include int main (void) { -int constant = kDNSServiceFlagsShareConnection; - unsigned char txtRecord[100]; - uint8_t valueLen; - TXTRecordGetValuePtr(sizeof(txtRecord), - txtRecord, "value", &valueLen); + + int constant = kDNSServiceFlagsShareConnection; + unsigned char txtRecord[100]; + uint8_t valueLen; + TXTRecordGetValuePtr(sizeof(txtRecord), txtRecord, "value", &valueLen); + ; return 0; } + _ACEOF if ac_fn_c_try_compile "$LINENO" then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } - printf "%s\n" "#define HAVE_DNSSD 1" >>confdefs.h + with_dnssd="mdnsresponder" + +printf "%s\n" "#define HAVE_DNSSD 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_MDNSRESPONDER 1" >>confdefs.h + + DNSSDLIBS="-ldns_sd" + DNSSD_BACKEND="dnssd" + IPPFIND_BIN="ippfind" + IPPFIND_MAN="ippfind.1" + PKGCONFIG_LIBS_STATIC="$PKGCONFIG_LIBS_STATIC $DNSSDLIBS" - DNSSDLIBS="-ldns_sd" - DNSSD_BACKEND="dnssd" - IPPFIND_BIN="ippfind" - IPPFIND_MAN="ippfind.1" else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } + if test $with_dnssd = mdnsresponder +then : + + as_fn_error $? "--with-dnssd=mdnsresponder specified but dns_sd library not present." "$LINENO" 5 + +fi + fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - LIBS="$SAVELIBS" - ;; - esac + LIBS="$SAVELIBS" + ;; #( + *) : + ;; +esac + +fi + + +fi + +if test $with_dnssd = avahi -o $with_dnssd = yes +then : + + if test "x$PKGCONFIG" = x +then : + + if test $with_dnssd = avahi +then : + + as_fn_error $? "Avahi requires pkg-config." "$LINENO" 5 fi +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Avahi client" >&5 +printf %s "checking for Avahi client... " >&6; } + if $PKGCONFIG --exists avahi-client +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`" + DNSSDLIBS="`$PKGCONFIG --libs avahi-client`" + DNSSD_BACKEND="dnssd" + IPPFIND_BIN="ippfind" + IPPFIND_MAN="ippfind.1" + PKGCONFIG_REQUIRES="$PKGCONFIG_REQUIRES avahi-client" + +printf "%s\n" "#define HAVE_AVAHI 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_DNSSD 1" >>confdefs.h + + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + if test $with_dnssd = avahi +then : + + as_fn_error $? "--with-dnssd=avahi specified but Avahi client not present." "$LINENO" 5 + +fi + +fi + +fi + +fi + + + + + + + +CONTAINER="none" + + +# Check whether --with-container was given. +if test ${with_container+y} +then : + withval=$with_container; + CONTAINER="$withval" + +fi + + +case "$CONTAINER" in #( + none) : + + # No container in use + ;; #( + snap) : + + # Building as a snap + +printf "%s\n" "#define CUPS_SNAP 1" >>confdefs.h + + ;; #( + *) : + + as_fn_error $? "Unsupported container '$CONTAINER' specified." "$LINENO" 5 + ;; #( + *) : + ;; +esac + + +APPARMORLIBS="" +SNAPDGLIBLIBS="" + + + +if test "x$PKGCONFIG" != x +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libapparmor" >&5 +printf %s "checking for libapparmor... " >&6; } + if $PKGCONFIG --exists libapparmor +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + CFLAGS="$CFLAGS $($PKGCONFIG --cflags libapparmor)" + APPARMORLIBS="$($PKGCONFIG --libs libapparmor)" + +printf "%s\n" "#define HAVE_LIBAPPARMOR 1" >>confdefs.h + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsnapd-glib" >&5 +printf %s "checking for libsnapd-glib... " >&6; } + if $PKGCONFIG --exists snapd-glib glib-2.0 gio-2.0 +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + CFLAGS="$CFLAGS $($PKGCONFIG --cflags snapd-glib glib-2.0 gio-2.0)" + SNAPDGLIBLIBS="$($PKGCONFIG --libs snapd-glib glib-2.0 gio-2.0)" + +printf "%s\n" "#define HAVE_LIBSNAPDGLIB 1" >>confdefs.h + + SAVELIBS="$LIBS" + LIBS="$SNAPDGLIBLIBS $LIBS" + ac_fn_c_check_func "$LINENO" "snapd_client_run_snapctl2_sync" "ac_cv_func_snapd_client_run_snapctl2_sync" +if test "x$ac_cv_func_snapd_client_run_snapctl2_sync" = xyes +then : + + +printf "%s\n" "#define HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC 1" >>confdefs.h + + fi + LIBS="$SAVELIBS" + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +fi +fi ONDEMANDFLAGS="" @@ -9818,219 +10874,346 @@ -# Check whether --enable-launchd was given. -if test ${enable_launchd+y} + +# Check whether --with-ondemand was given. +if test ${with_ondemand+y} +then : + withval=$with_ondemand; +fi + + +if test "x$with_ondemand" = x +then : + + if test $host_os_name = darwin +then : + + with_ondemand="launchd" + +else $as_nop + + with_ondemand="yes" + +fi + +elif test "x$with_ondemand" = xyes -a $host_os_name = darwin +then : + + with_ondemand="launchd" + +elif test "x$with_ondemand" != xno -a "x$with_ondemand" != xsystemd -a "x$with_ondemand" != xupstart -a "x$with_ondemand" != xyes then : - enableval=$enable_launchd; + + as_fn_error $? "Unknown --with-ondemand value \"$with_ondemand\" specified." "$LINENO" 5 + fi LAUNCHD_DIR="" -if test x$enable_launchd != xno; then - ac_fn_c_check_func "$LINENO" "launch_activate_socket" "ac_cv_func_launch_activate_socket" +if test $with_ondemand = launchd +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 : - printf "%s\n" "#define HAVE_LAUNCHD 1" >>confdefs.h - printf "%s\n" "#define HAVE_ONDEMAND 1" >>confdefs.h +printf "%s\n" "#define HAVE_LAUNCHD 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_ONDEMAND 1" >>confdefs.h + + with_ondemand="launchd" + +else $as_nop + + if test $with_ondemand = launchd +then : + + as_fn_error $? "Need launch_activate_socket/liblaunch for launchd support." "$LINENO" 5 + +fi fi - ac_fn_c_check_header_compile "$LINENO" "launch.h" "ac_cv_header_launch_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$LINENO" "launch.h" "ac_cv_header_launch_h" "$ac_includes_default" if test "x$ac_cv_header_launch_h" = xyes then : - printf "%s\n" "#define HAVE_LAUNCH_H 1" >>confdefs.h -fi + +printf "%s\n" "#define HAVE_LAUNCH_H 1" >>confdefs.h - if test "$host_os_name" = darwin; then - LAUNCHD_DIR="/System/Library/LaunchDaemons" - # liblaunch is already part of libSystem - fi fi -# Check whether --enable-systemd was given. -if test ${enable_systemd+y} + + if test $host_os_name = darwin then : - enableval=$enable_systemd; + + LAUNCHD_DIR="/System/Library/LaunchDaemons" + # liblaunch is already part of libSystem + +fi + fi # Check whether --with-systemd was given. if test ${with_systemd+y} then : - withval=$with_systemd; SYSTEMD_DIR="$withval" + withval=$with_systemd; + SYSTEMD_DIR="$withval" + else $as_nop - SYSTEMD_DIR="" + + 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 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsystemd" >&5 +if test $with_ondemand = systemd -o $with_ondemand = yes +then : + + if test "x$PKGCONFIG" = x +then : + + if test $with_ondemand = systemd +then : + + as_fn_error $? "Need pkg-config to enable systemd support." "$LINENO" 5 + +fi + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libsystemd" >&5 printf %s "checking for libsystemd... " >&6; } - if $PKGCONFIG --exists libsystemd; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + have_systemd="no" + if $PKGCONFIG --exists libsystemd +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } - have_systemd=yes - ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd` - ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd` - elif $PKGCONFIG --exists libsystemd-daemon; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes - legacy" >&5 + have_systemd="yes" + with_ondemand="systemd" + ONDEMANDFLAGS="$($PKGCONFIG --cflags libsystemd)" + ONDEMANDLIBS="$($PKGCONFIG --libs libsystemd)" + +elif $PKGCONFIG --exists libsystemd-daemon +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes - legacy" >&5 printf "%s\n" "yes - legacy" >&6; } - have_systemd=yes - ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd-daemon` - ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd-daemon` + have_systemd="yes" + with_ondemand="systemd" + 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 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 + if $PKGCONFIG --exists libsystemd-journal +then : + + ONDEMANDFLAGS="$ONDEMANDFLAGS $($PKGCONFIG --cflags libsystemd-journal)" + ONDEMANDLIBS="$ONDEMANDLIBS $($PKGCONFIG --libs libsystemd-journal)" + +fi + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } - fi - if test $have_systemd = yes; then - printf "%s\n" "#define HAVE_SYSTEMD 1" >>confdefs.h +fi + + if test $have_systemd = yes +then : + + +printf "%s\n" "#define HAVE_SYSTEMD 1" >>confdefs.h + - printf "%s\n" "#define HAVE_ONDEMAND 1" >>confdefs.h +printf "%s\n" "#define HAVE_ONDEMAND 1" >>confdefs.h - ac_fn_c_check_header_compile "$LINENO" "systemd/sd-journal.h" "ac_cv_header_systemd_sd_journal_h" "$ac_includes_default" + ac_fn_c_check_header_compile "$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 : - printf "%s\n" "#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 +printf "%s\n" "#define HAVE_SYSTEMD_SD_JOURNAL_H 1" >>confdefs.h + + fi -# Check whether --enable-upstart was given. -if test ${enable_upstart+y} + if test "x$SYSTEMD_DIR" = x then : - enableval=$enable_upstart; + + SYSTEMD_DIR="$($PKGCONFIG --variable=systemdsystemunitdir systemd)" + fi -if test "x$enable_upstart" = "xyes"; then - if test "x$have_systemd" = "xyes"; then - as_fn_error $? "Cannot support both systemd and upstart." "$LINENO" 5 - fi - printf "%s\n" "#define HAVE_UPSTART 1" >>confdefs.h +fi - printf "%s\n" "#define HAVE_ONDEMAND 1" >>confdefs.h +fi fi -SMFMANIFESTDIR="" +if test $with_ondemand = upstart +then : + + printf "%s\n" "#define HAVE_UPSTART. 1 Have upstart support?" >>confdefs.h + + +printf "%s\n" "#define HAVE_ONDEMAND 1" >>confdefs.h + + +fi # Check whether --with-smfmanifestdir was given. if test ${with_smfmanifestdir+y} then : - withval=$with_smfmanifestdir; SMFMANIFESTDIR="$withval" + withval=$with_smfmanifestdir; + SMFMANIFESTDIR="$withval" + +else $as_nop + + SMFMANIFESTDIR="" + fi + # Check whether --with-rcdir was given. if test ${with_rcdir+y} then : - withval=$with_rcdir; rcdir="$withval" + withval=$with_rcdir; + rcdir="$withval" + else $as_nop - rcdir="" + + rcdir="" + fi # Check whether --with-rclevels was given. if test ${with_rclevels+y} then : - withval=$with_rclevels; rclevels="$withval" + withval=$with_rclevels; + rclevels="$withval" + else $as_nop - rclevels="2 3 5" + + rclevels="2 3 5" + fi # Check whether --with-rcstart was given. if test ${with_rcstart+y} then : - withval=$with_rcstart; rcstart="$withval" + withval=$with_rcstart; + rcstart="$withval" + else $as_nop - rcstart="" + + rcstart="" + fi # Check whether --with-rcstop was given. if test ${with_rcstop+y} then : - withval=$with_rcstop; rcstop="$withval" + withval=$with_rcstop; + rcstop="$withval" + else $as_nop - rcstop="" + + 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 +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 $as_nop + + # RedHat, NetBSD + rcdir="/etc/rc.d" + fi -if test "x$rcstart" = x; then - case "$host_os_name" in - linux* | gnu*) - # Linux - rcstart="81" - ;; - - sunos*) - # Solaris - rcstart="81" - ;; - - *) - # Others - rcstart="99" - ;; - esac +else $as_nop + + rcdir="no" + fi -if test "x$rcstop" = x; then - case "$host_os_name" in - linux* | gnu*) - # Linux - rcstop="36" - ;; - - *) - # Others - rcstop="00" - ;; - esac +fi + +if test "x$rcstart" = x +then : + + case "$host_os_name" in #( + linux* | gnu*) : + + # Linux + rcstart="81" + ;; #( + sunos*) : + + # Solaris + rcstart="81" + ;; #( + *) : + + # Others + rcstart="99" + ;; #( + *) : + ;; +esac + +fi + +if test "x$rcstop" = x +then : + + case "$host_os_name" in #( + linux* | gnu*) : + + # Linux + rcstop="36" + ;; #( + *) : + + # Others + rcstop="00" + ;; #( + *) : + ;; +esac + fi INITDIR="" @@ -10044,52 +11227,89 @@ -if test "x$rcdir" != xno; then - if test "x$rclevels" = x; then - INITDDIR="$rcdir" - else - INITDIR="$rcdir" - fi +if test "x$rcdir" != xno +then : + + if test "x$rclevels" = x +then : + + INITDDIR="$rcdir" + +else $as_nop + + INITDIR="$rcdir" + +fi + fi # Check whether --with-xinetd was given. if test ${with_xinetd+y} then : - withval=$with_xinetd; xinetd="$withval" + withval=$with_xinetd; + xinetd="$withval" + else $as_nop - xinetd="" + + 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" +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 -LANGUAGES="`ls -1 locale/cups_*.po 2>/dev/null | sed -e '1,$s/locale\/cups_//' -e '1,$s/\.po//' | tr '\n' ' '`" +SYSTEMD_WANTED_BY="printer.target" + +LANGUAGES="$(ls -1 locale/cups_*.po 2>/dev/null | sed -e '1,$s/locale\/cups_//' -e '1,$s/\.po//' | tr '\n' ' ')" # Check whether --with-languages was given. if test ${with_languages+y} then : withval=$with_languages; - case "$withval" in - none | no) LANGUAGES="" ;; - all) ;; - *) LANGUAGES="$withval" ;; - esac + case "$withval" in #( + none | no) : + + LANGUAGES="" + ;; #( + all) : + + ;; #( + *) : + + LANGUAGES="$withval" + ;; #( + *) : + ;; +esac + fi @@ -10098,21 +11318,33 @@ # Check whether --with-bundledir was given. if test ${with_bundledir+y} then : - withval=$with_bundledir; CUPS_BUNDLEDIR="$withval" + withval=$with_bundledir; + CUPS_BUNDLEDIR="$withval" + else $as_nop - if test "x$host_os_name" = xdarwin -a $host_os_version -ge 100; then - CUPS_BUNDLEDIR="/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" - LANGUAGES="" - else - CUPS_BUNDLEDIR="" - fi + if test "x$host_os_name" = xdarwin -a $host_os_version -ge 100 +then : + + CUPS_BUNDLEDIR="/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" + LANGUAGES="" + +else $as_nop + + CUPS_BUNDLEDIR="" + +fi + fi -if test "x$CUPS_BUNDLEDIR" != x; then - printf "%s\n" "#define CUPS_BUNDLEDIR \"$CUPS_BUNDLEDIR\"" >>confdefs.h +if test "x$CUPS_BUNDLEDIR" != x +then : + + +printf "%s\n" "#define CUPS_BUNDLEDIR \"$CUPS_BUNDLEDIR\"" >>confdefs.h + fi @@ -10120,21 +11352,34 @@ # Check whether --with-bundlelang was given. if test ${with_bundlelang+y} then : - withval=$with_bundlelang; cups_bundlelang="$withval" + withval=$with_bundlelang; + cups_bundlelang="$withval" + else $as_nop - if test $host_os_version -ge 190; then - cups_bundlelang="en" - else - cups_bundlelang="English" - fi + if test $host_os_version -ge 190 +then : + + cups_bundlelang="en" + +else $as_nop + + cups_bundlelang="English" + fi +fi + + +if test "x$cups_bundlelang" != x -a "x$CUPS_BUNDLEDIR" != x +then : + + CUPS_RESOURCEDIR="$CUPS_BUNDLEDIR/Resources/$cups_bundlelang.lproj" + +else $as_nop + + CUPS_RESOURCEDIR="" -if test "x$cups_bundlelang" != x -a "x$CUPS_BUNDLEDIR" != x; then - CUPS_RESOURCEDIR="$CUPS_BUNDLEDIR/Resources/$cups_bundlelang.lproj" -else - CUPS_RESOURCEDIR="" fi @@ -10142,16 +11387,13 @@ # Check whether --with-exe_file_perm was given. if test ${with_exe_file_perm+y} then : - withval=$with_exe_file_perm; CUPS_EXE_FILE_PERM="$withval" + withval=$with_exe_file_perm; + CUPS_EXE_FILE_PERM="$withval" + else $as_nop - case "$host_os_name" in - linux* | gnu* | *-gnu) - CUPS_EXE_FILE_PERM="755" - ;; - *) - CUPS_EXE_FILE_PERM="555" - ;; - esac + + CUPS_EXE_FILE_PERM="755" + fi @@ -10160,16 +11402,17 @@ # Check whether --with-config_file_perm was given. if test ${with_config_file_perm+y} then : - withval=$with_config_file_perm; CUPS_CONFIG_FILE_PERM="$withval" + withval=$with_config_file_perm; + CUPS_CONFIG_FILE_PERM="$withval" + else $as_nop - if test "x$host_os_name" = xdarwin; then - CUPS_CONFIG_FILE_PERM="644" - else - CUPS_CONFIG_FILE_PERM="640" - fi + + CUPS_CONFIG_FILE_PERM="640" + fi + printf "%s\n" "#define CUPS_DEFAULT_CONFIG_FILE_PERM 0$CUPS_CONFIG_FILE_PERM" >>confdefs.h @@ -10177,16 +11420,13 @@ # Check whether --with-cupsd_file_perm was given. if test ${with_cupsd_file_perm+y} then : - withval=$with_cupsd_file_perm; CUPS_CUPSD_FILE_PERM="$withval" + withval=$with_cupsd_file_perm; + CUPS_CUPSD_FILE_PERM="$withval" + else $as_nop - case "$host_os_name" in - linux* | gnu*) - CUPS_CUPSD_FILE_PERM="700" - ;; - *) - CUPS_CUPSD_FILE_PERM="500" - ;; - esac + + CUPS_CUPSD_FILE_PERM="700" + fi @@ -10195,12 +11435,17 @@ # Check whether --with-log_file_perm was given. if test ${with_log_file_perm+y} then : - withval=$with_log_file_perm; CUPS_LOG_FILE_PERM="$withval" + withval=$with_log_file_perm; + CUPS_LOG_FILE_PERM="$withval" + else $as_nop - CUPS_LOG_FILE_PERM="644" + + CUPS_LOG_FILE_PERM="644" + fi + printf "%s\n" "#define CUPS_DEFAULT_LOG_FILE_PERM 0$CUPS_LOG_FILE_PERM" >>confdefs.h @@ -10208,12 +11453,17 @@ # Check whether --with-max_log_size was given. if test ${with_max_log_size+y} then : - withval=$with_max_log_size; CUPS_MAX_LOG_SIZE="$withval" + withval=$with_max_log_size; + CUPS_MAX_LOG_SIZE="$withval" + else $as_nop - CUPS_MAX_LOG_SIZE="1m" + + CUPS_MAX_LOG_SIZE="1m" + fi + printf "%s\n" "#define CUPS_DEFAULT_MAX_LOG_SIZE \"$CUPS_MAX_LOG_SIZE\"" >>confdefs.h @@ -10221,12 +11471,17 @@ # Check whether --with-error_policy was given. if test ${with_error_policy+y} then : - withval=$with_error_policy; CUPS_ERROR_POLICY="$withval" + withval=$with_error_policy; + CUPS_ERROR_POLICY="$withval" + else $as_nop - CUPS_ERROR_POLICY="stop-printer" + + CUPS_ERROR_POLICY="stop-printer" + fi + printf "%s\n" "#define CUPS_DEFAULT_ERROR_POLICY \"$CUPS_ERROR_POLICY\"" >>confdefs.h @@ -10234,12 +11489,17 @@ # Check whether --with-fatal_errors was given. if test ${with_fatal_errors+y} then : - withval=$with_fatal_errors; CUPS_FATAL_ERRORS="$withval" + withval=$with_fatal_errors; + CUPS_FATAL_ERRORS="$withval" + else $as_nop - CUPS_FATAL_ERRORS="config" + + CUPS_FATAL_ERRORS="config" + fi + printf "%s\n" "#define CUPS_DEFAULT_FATAL_ERRORS \"$CUPS_FATAL_ERRORS\"" >>confdefs.h @@ -10247,12 +11507,17 @@ # Check whether --with-log_level was given. if test ${with_log_level+y} then : - withval=$with_log_level; CUPS_LOG_LEVEL="$withval" + withval=$with_log_level; + CUPS_LOG_LEVEL="$withval" + else $as_nop - CUPS_LOG_LEVEL="warn" + + CUPS_LOG_LEVEL="warn" + fi + printf "%s\n" "#define CUPS_DEFAULT_LOG_LEVEL \"$CUPS_LOG_LEVEL\"" >>confdefs.h @@ -10275,10 +11540,15 @@ enableval=$enable_page_logging; fi -if test "x$enable_page_logging" = xyes; then - CUPS_PAGE_LOG_FORMAT="" -else - CUPS_PAGE_LOG_FORMAT="PageLogFormat" +if test "x$enable_page_logging" = xyes +then : + + CUPS_PAGE_LOG_FORMAT="" + +else $as_nop + + CUPS_PAGE_LOG_FORMAT="PageLogFormat" + fi @@ -10288,12 +11558,18 @@ enableval=$enable_sync_on_close; fi -if test "x$enable_sync_on_close" = xyes; then - CUPS_SYNC_ON_CLOSE="Yes" - printf "%s\n" "#define CUPS_DEFAULT_SYNC_ON_CLOSE 1" >>confdefs.h +if test "x$enable_sync_on_close" = xyes +then : + + CUPS_SYNC_ON_CLOSE="Yes" + +printf "%s\n" "#define CUPS_DEFAULT_SYNC_ON_CLOSE 1" >>confdefs.h + + +else $as_nop + + CUPS_SYNC_ON_CLOSE="No" -else - CUPS_SYNC_ON_CLOSE="No" fi @@ -10303,13 +11579,20 @@ enableval=$enable_browsing; fi -if test "x$enable_browsing" = xno; then - CUPS_BROWSING="No" - printf "%s\n" "#define CUPS_DEFAULT_BROWSING 0" >>confdefs.h +if test "x$enable_browsing" = xno +then : + + CUPS_BROWSING="No" + +printf "%s\n" "#define CUPS_DEFAULT_BROWSING 0" >>confdefs.h + + +else $as_nop + + CUPS_BROWSING="Yes" + +printf "%s\n" "#define CUPS_DEFAULT_BROWSING 1" >>confdefs.h -else - CUPS_BROWSING="Yes" - printf "%s\n" "#define CUPS_DEFAULT_BROWSING 1" >>confdefs.h fi @@ -10318,26 +11601,46 @@ # Check whether --with-local_protocols was given. if test ${with_local_protocols+y} then : - withval=$with_local_protocols; default_local_protocols="$withval" + withval=$with_local_protocols; + default_local_protocols="$withval" + else $as_nop - default_local_protocols="default" + + default_local_protocols="default" + fi -if test x$with_local_protocols != xno; then - if test "x$default_local_protocols" = "xdefault"; then - if test "x$DNSSD_BACKEND" != "x"; then - CUPS_BROWSE_LOCAL_PROTOCOLS="dnssd" - else - CUPS_BROWSE_LOCAL_PROTOCOLS="" - fi - else - CUPS_BROWSE_LOCAL_PROTOCOLS="$default_local_protocols" - fi -else - CUPS_BROWSE_LOCAL_PROTOCOLS="" +if test x$with_local_protocols != xno +then : + + if test "x$default_local_protocols" = "xdefault" +then : + + if test "x$DNSSD_BACKEND" != "x" +then : + + CUPS_BROWSE_LOCAL_PROTOCOLS="dnssd" + +else $as_nop + + CUPS_BROWSE_LOCAL_PROTOCOLS="" + fi +else $as_nop + + CUPS_BROWSE_LOCAL_PROTOCOLS="$default_local_protocols" + +fi + +else $as_nop + + CUPS_BROWSE_LOCAL_PROTOCOLS="" + +fi + + printf "%s\n" "#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS \"$CUPS_BROWSE_LOCAL_PROTOCOLS\"" >>confdefs.h @@ -10348,13 +11651,20 @@ enableval=$enable_default_shared; fi -if test "x$enable_default_shared" = xno; then - CUPS_DEFAULT_SHARED="No" - printf "%s\n" "#define CUPS_DEFAULT_DEFAULT_SHARED 0" >>confdefs.h +if test "x$enable_default_shared" = xno +then : + + CUPS_DEFAULT_SHARED="No" + +printf "%s\n" "#define CUPS_DEFAULT_DEFAULT_SHARED 0" >>confdefs.h + + +else $as_nop + + CUPS_DEFAULT_SHARED="Yes" + +printf "%s\n" "#define CUPS_DEFAULT_DEFAULT_SHARED 1" >>confdefs.h -else - CUPS_DEFAULT_SHARED="Yes" - printf "%s\n" "#define CUPS_DEFAULT_DEFAULT_SHARED 1" >>confdefs.h fi @@ -10363,138 +11673,220 @@ # Check whether --with-cups_user was given. if test ${with_cups_user+y} then : - withval=$with_cups_user; CUPS_USER="$withval" + withval=$with_cups_user; + CUPS_USER="$withval" + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for default print user" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for default print user" >&5 printf %s "checking for default print user... " >&6; } - if test x$host_os_name = xdarwin; then - if test x`id -u _lp 2>/dev/null` = x; then - CUPS_USER="lp"; - else - CUPS_USER="_lp"; - fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUPS_USER" >&5 + if test x$host_os_name = xdarwin +then : + + if test "x$(id -u _lp 2>/dev/null)" = x +then : + + CUPS_USER="lp" + +else $as_nop + + CUPS_USER="_lp" + +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUPS_USER" >&5 printf "%s\n" "$CUPS_USER" >&6; } - elif test -f /etc/passwd; then - CUPS_USER="" - for user in lp lpd guest daemon nobody; do - if test "`grep \^${user}: /etc/passwd`" != ""; then - CUPS_USER="$user" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $user" >&5 + +elif test -f /etc/passwd +then : + + CUPS_USER="" + for user in lp lpd guest daemon nobody; do + if test "$(grep \^${user}: /etc/passwd)" != "" +then : + + CUPS_USER="$user" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $user" >&5 printf "%s\n" "$user" >&6; } - break; - fi - done - - if test x$CUPS_USER = x; then - CUPS_USER="nobody" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -printf "%s\n" "not found" >&6; } - fi - else - CUPS_USER="nobody" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no password file" >&5 -printf "%s\n" "no password file" >&6; } - fi + break + +fi + done + + if test x$CUPS_USER = x +then : + + CUPS_USER="nobody" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found, using \"$CUPS_USER\"" >&5 +printf "%s\n" "not found, using \"$CUPS_USER\"" >&6; } + +fi + +else $as_nop + + CUPS_USER="nobody" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no password file, using \"$CUPS_USER\"" >&5 +printf "%s\n" "no password file, using \"$CUPS_USER\"" >&6; } + +fi + fi -if test "x$CUPS_USER" = "xroot" -o "x$CUPS_USER" = "x0"; then - as_fn_error $? "The default user for CUPS cannot be root!" "$LINENO" 5 +if test "x$CUPS_USER" = "xroot" -o "x$CUPS_USER" = "x0" +then : + + as_fn_error $? "The default user for CUPS cannot be root." "$LINENO" 5 + fi # Check whether --with-cups_group was given. if test ${with_cups_group+y} then : - withval=$with_cups_group; CUPS_GROUP="$withval" + withval=$with_cups_group; + CUPS_GROUP="$withval" + else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for default print group" >&5 + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for default print group" >&5 printf %s "checking for default print group... " >&6; } - if test x$host_os_name = xdarwin; then - if test x`id -g _lp 2>/dev/null` = x; then - CUPS_GROUP="lp"; - else - CUPS_GROUP="_lp"; - fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUPS_GROUP" >&5 + if test x$host_os_name = xdarwin +then : + + if test "x$(id -g _lp 2>/dev/null)" = x +then : + + CUPS_GROUP="lp" + +else $as_nop + + CUPS_GROUP="_lp" + +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CUPS_GROUP" >&5 printf "%s\n" "$CUPS_GROUP" >&6; } - elif test -f /etc/group; then - GROUP_LIST="_lp lp nobody" - CUPS_GROUP="" - for group in $GROUP_LIST; do - if test "`grep \^${group}: /etc/group`" != ""; then - CUPS_GROUP="$group" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $group" >&5 + +elif test -f /etc/group +then : + + GROUP_LIST="_lp lp nobody" + CUPS_GROUP="" + for group in $GROUP_LIST; do + if test "$(grep \^${group}: /etc/group)" != "" +then : + + CUPS_GROUP="$group" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $group" >&5 printf "%s\n" "$group" >&6; } - break; - fi - done - - if test x$CUPS_GROUP = x; then - CUPS_GROUP="nobody" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -printf "%s\n" "not found" >&6; } - fi - else - CUPS_GROUP="nobody" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no group file" >&5 -printf "%s\n" "no group file" >&6; } - fi + break + +fi + done + + if test x$CUPS_GROUP = x +then : + + CUPS_GROUP="nobody" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found, using \"$CUPS_GROUP\"" >&5 +printf "%s\n" "not found, using \"$CUPS_GROUP\"" >&6; } + +fi + +else $as_nop + + CUPS_GROUP="nobody" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no group file, using \"$CUPS_GROUP\"" >&5 +printf "%s\n" "no group file, using \"$CUPS_GROUP\"" >&6; } + +fi + fi -if test "x$CUPS_GROUP" = "xroot" -o "x$CUPS_GROUP" = "xwheel" -o "x$CUPS_GROUP" = "x0"; then - as_fn_error $? "The default group for CUPS cannot be root!" "$LINENO" 5 +if test "x$CUPS_GROUP" = "xroot" -o "x$CUPS_GROUP" = "xwheel" -o "x$CUPS_GROUP" = "x0" +then : + + as_fn_error $? "The default group for CUPS cannot be root." "$LINENO" 5 + fi # Check whether --with-system_groups was given. if test ${with_system_groups+y} then : - withval=$with_system_groups; CUPS_SYSTEM_GROUPS="$withval" + withval=$with_system_groups; + CUPS_SYSTEM_GROUPS="$withval" + else $as_nop - if test x$host_os_name = xdarwin; then - CUPS_SYSTEM_GROUPS="admin" - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for default system groups" >&5 + + if test x$host_os_name = xdarwin +then : + + CUPS_SYSTEM_GROUPS="admin" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for default system groups" >&5 printf %s "checking for default system groups... " >&6; } - if test -f /etc/group; then - CUPS_SYSTEM_GROUPS="" - GROUP_LIST="lpadmin sys system root wheel" - for group in $GROUP_LIST; do - if test "`grep \^${group}: /etc/group`" != ""; then - if test "x$CUPS_SYSTEM_GROUPS" = x; then - CUPS_SYSTEM_GROUPS="$group" - else - CUPS_SYSTEM_GROUPS="$CUPS_SYSTEM_GROUPS $group" - fi - fi - done - - if test "x$CUPS_SYSTEM_GROUPS" = x; then - CUPS_SYSTEM_GROUPS="$GROUP_LIST" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no groups found" >&5 -printf "%s\n" "no groups found" >&6; } - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"$CUPS_SYSTEM_GROUPS\"" >&5 + if test -f /etc/group +then : + + CUPS_SYSTEM_GROUPS="" + GROUP_LIST="lpadmin sys system root wheel" + for group in $GROUP_LIST; do + if test "$(grep \^${group}: /etc/group)" != "" +then : + + if test "x$CUPS_SYSTEM_GROUPS" = x +then : + + CUPS_SYSTEM_GROUPS="$group" + +else $as_nop + + CUPS_SYSTEM_GROUPS="$CUPS_SYSTEM_GROUPS $group" + +fi + +fi + done + + if test "x$CUPS_SYSTEM_GROUPS" = x +then : + + CUPS_SYSTEM_GROUPS="$GROUP_LIST" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no groups found, using \"$CUPS_SYSTEM_GROUPS\"" >&5 +printf "%s\n" "no groups found, using \"$CUPS_SYSTEM_GROUPS\"" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"$CUPS_SYSTEM_GROUPS\"" >&5 printf "%s\n" "\"$CUPS_SYSTEM_GROUPS\"" >&6; } - fi - else - CUPS_SYSTEM_GROUPS="$GROUP_LIST" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no group file" >&5 -printf "%s\n" "no group file" >&6; } - fi - fi + fi +else $as_nop -CUPS_PRIMARY_SYSTEM_GROUP="`echo $CUPS_SYSTEM_GROUPS | awk '{print $1}'`" + CUPS_SYSTEM_GROUPS="$GROUP_LIST" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no group file, using \"$CUPS_SYSTEM_GROUPS\"" >&5 +printf "%s\n" "no group file, using \"$CUPS_SYSTEM_GROUPS\"" >&6; } + +fi + +fi + +fi + + +CUPS_PRIMARY_SYSTEM_GROUP="$(echo $CUPS_SYSTEM_GROUPS | awk '{print $1}')" for group in $CUPS_SYSTEM_GROUPS; do - if test "x$CUPS_GROUP" = "x$group"; then - as_fn_error $? "The default system groups cannot contain the default CUPS group!" "$LINENO" 5 - fi + if test "x$CUPS_GROUP" = "x$group" +then : + + as_fn_error $? "The default system groups cannot contain the default CUPS group." "$LINENO" 5 + +fi done @@ -10502,125 +11894,87 @@ + printf "%s\n" "#define CUPS_DEFAULT_USER \"$CUPS_USER\"" >>confdefs.h + printf "%s\n" "#define CUPS_DEFAULT_GROUP \"$CUPS_GROUP\"" >>confdefs.h + printf "%s\n" "#define CUPS_DEFAULT_SYSTEM_GROUPS \"$CUPS_SYSTEM_GROUPS\"" >>confdefs.h + # Check whether --with-printcap was given. if test ${with_printcap+y} then : - withval=$with_printcap; default_printcap="$withval" + withval=$with_printcap; + default_printcap="$withval" + else $as_nop - default_printcap="default" -fi + default_printcap="default" -if test x$default_printcap != xno; then - if test "x$default_printcap" = "xdefault"; then - case $host_os_name in - darwin*) - if test $host_os_version -ge 90; then - CUPS_DEFAULT_PRINTCAP="/Library/Preferences/org.cups.printers.plist" - else - CUPS_DEFAULT_PRINTCAP="/etc/printcap" - fi - ;; - sunos*) - CUPS_DEFAULT_PRINTCAP="/etc/printers.conf" - ;; - *) - CUPS_DEFAULT_PRINTCAP="/etc/printcap" - ;; - esac - else - CUPS_DEFAULT_PRINTCAP="$default_printcap" - fi -else - CUPS_DEFAULT_PRINTCAP="" fi -printf "%s\n" "#define CUPS_DEFAULT_PRINTCAP \"$CUPS_DEFAULT_PRINTCAP\"" >>confdefs.h - - +if test x$default_printcap != xno +then : -# Check whether --with-lpdconfigfile was given. -if test ${with_lpdconfigfile+y} + if test "x$default_printcap" = "xdefault" then : - withval=$with_lpdconfigfile; default_lpdconfigfile="$withval" -else $as_nop - default_lpdconfigfile="default" -fi + case $host_os_name in #( + darwin*) : -if test x$default_lpdconfigfile != xno; then - if test "x$default_lpdconfigfile" = "xdefault"; then - case $host_os_name in - darwin*) - CUPS_DEFAULT_LPD_CONFIG_FILE="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" - ;; - *) - if test "x$XINETD" != x; then - CUPS_DEFAULT_LPD_CONFIG_FILE="xinetd://$XINETD/cups-lpd" - else - CUPS_DEFAULT_LPD_CONFIG_FILE="" - fi - ;; - esac - else - CUPS_DEFAULT_LPD_CONFIG_FILE="$default_lpdconfigfile" - fi -else - CUPS_DEFAULT_LPD_CONFIG_FILE="" -fi + CUPS_DEFAULT_PRINTCAP="/Library/Preferences/org.cups.printers.plist" + ;; #( + sunos*) : -printf "%s\n" "#define CUPS_DEFAULT_LPD_CONFIG_FILE \"$CUPS_DEFAULT_LPD_CONFIG_FILE\"" >>confdefs.h + CUPS_DEFAULT_PRINTCAP="/etc/printers.conf" + ;; #( + *) : + CUPS_DEFAULT_PRINTCAP="/etc/printcap" + ;; #( + *) : + ;; +esac +else $as_nop + CUPS_DEFAULT_PRINTCAP="$default_printcap" -# Check whether --with-smbconfigfile was given. -if test ${with_smbconfigfile+y} -then : - withval=$with_smbconfigfile; default_smbconfigfile="$withval" -else $as_nop - default_smbconfigfile="default" fi +else $as_nop + + CUPS_DEFAULT_PRINTCAP="" -if test x$default_smbconfigfile != xno; then - if test "x$default_smbconfigfile" = "xdefault"; then - if test -f /etc/smb.conf; then - CUPS_DEFAULT_SMB_CONFIG_FILE="samba:///etc/smb.conf" - else - CUPS_DEFAULT_SMB_CONFIG_FILE="" - fi - else - CUPS_DEFAULT_SMB_CONFIG_FILE="$default_smbconfigfile" - fi -else - CUPS_DEFAULT_SMB_CONFIG_FILE="" fi -printf "%s\n" "#define CUPS_DEFAULT_SMB_CONFIG_FILE \"$CUPS_DEFAULT_SMB_CONFIG_FILE\"" >>confdefs.h +printf "%s\n" "#define CUPS_DEFAULT_PRINTCAP \"$CUPS_DEFAULT_PRINTCAP\"" >>confdefs.h + -# Check whether --with-max-copies was given. +# Check whether --with-max_copies was given. if test ${with_max_copies+y} then : - withval=$with_max_copies; CUPS_MAX_COPIES="$withval" + withval=$with_max_copies; + CUPS_MAX_COPIES="$withval" + else $as_nop - CUPS_MAX_COPIES="9999" + + CUPS_MAX_COPIES="9999" + fi + printf "%s\n" "#define CUPS_DEFAULT_MAX_COPIES $CUPS_MAX_COPIES" >>confdefs.h @@ -10630,38 +11984,61 @@ enableval=$enable_raw_printing; fi -if test "x$enable_raw_printing" != xno; then - DEFAULT_RAW_PRINTING="" -else - DEFAULT_RAW_PRINTING="#" +if test "x$enable_raw_printing" != xno +then : + + DEFAULT_RAW_PRINTING="" + +else $as_nop + + DEFAULT_RAW_PRINTING="#" + fi -# Check whether --with-snmp-address was given. +# Check whether --with-snmp_address was given. if test ${with_snmp_address+y} then : - withval=$with_snmp_address; if test "x$withval" = x; then - CUPS_SNMP_ADDRESS="" - else - CUPS_SNMP_ADDRESS="Address $withval" - fi + withval=$with_snmp_address; + if test "x$withval" = x +then : + + CUPS_SNMP_ADDRESS="" + else $as_nop - if test "x$host_os_name" = xdarwin; then - CUPS_SNMP_ADDRESS="" - else - CUPS_SNMP_ADDRESS="Address @LOCAL" - fi + + CUPS_SNMP_ADDRESS="Address $withval" + fi +else $as_nop + + if test "x$host_os_name" = xdarwin +then : + + CUPS_SNMP_ADDRESS="" + +else $as_nop + CUPS_SNMP_ADDRESS="Address @LOCAL" -# Check whether --with-snmp-community was given. +fi + +fi + + + +# Check whether --with-snmp_community was given. if test ${with_snmp_community+y} then : - withval=$with_snmp_community; CUPS_SNMP_COMMUNITY="Community $withval" + withval=$with_snmp_community; + CUPS_SNMP_COMMUNITY="Community $withval" + else $as_nop - CUPS_SNMP_COMMUNITY="Community public" + + CUPS_SNMP_COMMUNITY="Community public" + fi @@ -10669,16 +12046,21 @@ -# Check whether --with-ipp-port was given. +# Check whether --with-ipp_port was given. if test ${with_ipp_port+y} then : - withval=$with_ipp_port; DEFAULT_IPP_PORT="$withval" + withval=$with_ipp_port; + DEFAULT_IPP_PORT="$withval" + else $as_nop - DEFAULT_IPP_PORT="631" + + DEFAULT_IPP_PORT="631" + fi + printf "%s\n" "#define CUPS_DEFAULT_IPP_PORT $DEFAULT_IPP_PORT" >>confdefs.h @@ -10688,55 +12070,134 @@ enableval=$enable_webif; fi -case "x$enable_webif" in - xno) - CUPS_WEBIF=No - CUPS_DEFAULT_WEBIF=0 - ;; - xyes) - CUPS_WEBIF=Yes - CUPS_DEFAULT_WEBIF=1 - ;; - *) - if test $host_os_name = darwin; then - CUPS_WEBIF=No - CUPS_DEFAULT_WEBIF=0 - else - CUPS_WEBIF=Yes - CUPS_DEFAULT_WEBIF=1 - fi - ;; +case "x$enable_webif" in #( + xno) : + + CUPS_WEBIF=No + CUPS_DEFAULT_WEBIF=0 + ;; #( + xyes) : + + CUPS_WEBIF=Yes + CUPS_DEFAULT_WEBIF=1 + ;; #( + *) : + + if test $host_os_name = darwin +then : + + CUPS_WEBIF=No + CUPS_DEFAULT_WEBIF=0 + +else $as_nop + + CUPS_WEBIF=Yes + CUPS_DEFAULT_WEBIF=1 + +fi + ;; #( + *) : + ;; esac + printf "%s\n" "#define CUPS_DEFAULT_WEBIF $CUPS_DEFAULT_WEBIF" >>confdefs.h +if test $CUPS_WEBIF = Yes || test $CUPS_BROWSING = Yes +then : + + SYSTEMD_WANTED_BY="$SYSTEMD_WANTED_BY multi-user.target" +fi + + + +# Check whether --with-idle_exit_timeout was given. +if test ${with_idle_exit_timeout+y} +then : + withval=$with_idle_exit_timeout; + if test "x$withval" = "xno" +then : + + EXIT_TIMEOUT=0 + +else $as_nop + + EXIT_TIMEOUT=$withval + +fi + +else $as_nop + + EXIT_TIMEOUT=60 + +fi + + + + + +# Check whether --with-systemd-timeoutstartsec was given. +if test ${with_systemd_timeoutstartsec+y} +then : + withval=$with_systemd_timeoutstartsec; + if test "x$withval" = "xno" +then : + + TIMEOUTSTARTSEC="TimeoutStartSec=infinity" + +else $as_nop + + TIMEOUTSTARTSEC="TimeoutStartSec=$withval" + +fi + +else $as_nop + + TIMEOUTSTARTSEC="" + +fi + + + INSTALL_LANGUAGES="" UNINSTALL_LANGUAGES="" LANGFILES="" -if test "x$LANGUAGES" != x; then - INSTALL_LANGUAGES="install-languages" - UNINSTALL_LANGUAGES="uninstall-languages" - for lang in $LANGUAGES; do - if test -f doc/$lang/index.html.in; then - LANGFILES="$LANGFILES doc/$lang/index.html" - fi - - if test -f templates/$lang/header.tmpl.in; then - LANGFILES="$LANGFILES templates/$lang/header.tmpl" - fi - done -elif test "x$CUPS_BUNDLEDIR" != x; then - INSTALL_LANGUAGES="install-langbundle" - UNINSTALL_LANGUAGES="uninstall-langbundle" +if test "x$LANGUAGES" != x +then : + + INSTALL_LANGUAGES="install-languages" + UNINSTALL_LANGUAGES="uninstall-languages" + for lang in $LANGUAGES; do + if test -f doc/$lang/index.html.in +then : + + LANGFILES="$LANGFILES doc/$lang/index.html" + +fi + + if test -f templates/$lang/header.tmpl.in +then : + + LANGFILES="$LANGFILES templates/$lang/header.tmpl" + +fi + done + +elif test "x$CUPS_BUNDLEDIR" != x +then : + + INSTALL_LANGUAGES="install-langbundle" + UNINSTALL_LANGUAGES="uninstall-langbundle" + 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 desktop/cups.desktop doc/index.html scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist scheduler/cups-lpdAT.service scheduler/cups.path scheduler/cups.service scheduler/cups.socket 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.pc cups-config desktop/cups.desktop doc/index.html scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist scheduler/cups-lpdAT.service scheduler/cups.path scheduler/cups.service scheduler/cups.socket templates/header.tmpl packaging/cups.list $LANGFILES" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -11237,8 +12698,8 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by CUPS $as_me 2.3.3op2, which was -generated by GNU Autoconf 2.70. Invocation command line was +This file was extended by CUPS $as_me 2.4.1, which was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -11294,7 +12755,7 @@ $config_headers Report bugs to . -CUPS home page: ." +CUPS home page: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` @@ -11302,11 +12763,11 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -CUPS config.status 2.3.3op2 -configured by $0, generated by GNU Autoconf 2.70, +CUPS config.status 2.4.1 +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2020 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -11431,6 +12892,7 @@ "conf/mime.convs") CONFIG_FILES="$CONFIG_FILES conf/mime.convs" ;; "conf/pam.std") CONFIG_FILES="$CONFIG_FILES conf/pam.std" ;; "conf/snmp.conf") CONFIG_FILES="$CONFIG_FILES conf/snmp.conf" ;; + "cups.pc") CONFIG_FILES="$CONFIG_FILES cups.pc" ;; "cups-config") CONFIG_FILES="$CONFIG_FILES cups-config" ;; "desktop/cups.desktop") CONFIG_FILES="$CONFIG_FILES desktop/cups.desktop" ;; "doc/index.html") CONFIG_FILES="$CONFIG_FILES doc/index.html" ;; diff -Nru cups-2.3.3op2/configure.ac cups-2.4.1op1/configure.ac --- cups-2.3.3op2/configure.ac 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/configure.ac 2022-01-27 11:11:42.000000000 +0000 @@ -1,82 +1,95 @@ dnl dnl Configuration script for CUPS. dnl -dnl Copyright © 2020-2021 by Michael R Sweet -dnl Copyright © 2007-2019 by Apple Inc. +dnl Copyright © 2020-2022 by OpenPrinting +dnl Copyright © 2007-2020 by Apple Inc. dnl Copyright © 1997-2007 by Easy Software Products, all rights reserved. dnl dnl Licensed under Apache License v2.0. See the file "LICENSE" for more dnl information. dnl -dnl We need at least autoconf 2.60... -AC_PREREQ(2.60) +dnl We need at least autoconf 2.71... +AC_PREREQ([2.71]) dnl Package name and version... -AC_INIT([CUPS], [2.3.3op2], [https://github.com/openprinting/cups/issues], [cups], [https://openprinting.github.io/]) +AC_INIT([CUPS],[2.4.1],[https://github.com/openprinting/cups/issues],[cups],[https://openprinting.github.io/cups]) +dnl This line is provided to ensure that you don't run the autoheader program +dnl against this project. Doing so is completely unsupported and WILL cause +dnl problems! +AH_TOP([#error "Somebody ran autoheader on this project which is unsupported and WILL cause problems."]) + +dnl Include configure tests for different areas... sinclude(config-scripts/cups-opsys.m4) sinclude(config-scripts/cups-common.m4) sinclude(config-scripts/cups-directories.m4) sinclude(config-scripts/cups-manpages.m4) - sinclude(config-scripts/cups-sharedlibs.m4) sinclude(config-scripts/cups-libtool.m4) sinclude(config-scripts/cups-compiler.m4) - sinclude(config-scripts/cups-network.m4) sinclude(config-scripts/cups-poll.m4) sinclude(config-scripts/cups-gssapi.m4) sinclude(config-scripts/cups-threads.m4) -sinclude(config-scripts/cups-ssl.m4) +sinclude(config-scripts/cups-tls.m4) sinclude(config-scripts/cups-pam.m4) sinclude(config-scripts/cups-largefile.m4) sinclude(config-scripts/cups-dnssd.m4) +sinclude(config-scripts/cups-container.m4) sinclude(config-scripts/cups-startup.m4) sinclude(config-scripts/cups-defaults.m4) +dnl See what languages are available and make sure we generate the localization +dnl files as needed... INSTALL_LANGUAGES="" UNINSTALL_LANGUAGES="" LANGFILES="" -if test "x$LANGUAGES" != x; then - INSTALL_LANGUAGES="install-languages" - UNINSTALL_LANGUAGES="uninstall-languages" - for lang in $LANGUAGES; do - if test -f doc/$lang/index.html.in; then - LANGFILES="$LANGFILES doc/$lang/index.html" - fi - - if test -f templates/$lang/header.tmpl.in; then - LANGFILES="$LANGFILES templates/$lang/header.tmpl" - fi - done -elif test "x$CUPS_BUNDLEDIR" != x; then - INSTALL_LANGUAGES="install-langbundle" - UNINSTALL_LANGUAGES="uninstall-langbundle" -fi - -AC_SUBST(INSTALL_LANGUAGES) -AC_SUBST(UNINSTALL_LANGUAGES) - -AC_OUTPUT(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 - scheduler/cups-lpd.xinetd - scheduler/cups.sh - scheduler/cups.xml - scheduler/org.cups.cups-lpd.plist - scheduler/cups-lpdAT.service - scheduler/cups.path - scheduler/cups.service - scheduler/cups.socket - templates/header.tmpl - packaging/cups.list - $LANGFILES) +AS_IF([test "x$LANGUAGES" != x], [ + INSTALL_LANGUAGES="install-languages" + UNINSTALL_LANGUAGES="uninstall-languages" + for lang in $LANGUAGES; do + AS_IF([test -f doc/$lang/index.html.in], [ + LANGFILES="$LANGFILES doc/$lang/index.html" + ]) + + AS_IF([test -f templates/$lang/header.tmpl.in], [ + LANGFILES="$LANGFILES templates/$lang/header.tmpl" + ]) + done +], [test "x$CUPS_BUNDLEDIR" != x], [ + INSTALL_LANGUAGES="install-langbundle" + UNINSTALL_LANGUAGES="uninstall-langbundle" +]) + +AC_SUBST([INSTALL_LANGUAGES]) +AC_SUBST([UNINSTALL_LANGUAGES]) + +dnl Provide autoconf with a list of files to generate and output them... +AC_CONFIG_FILES([ + Makedefs + conf/cups-files.conf + conf/cupsd.conf + conf/mime.convs + conf/pam.std + conf/snmp.conf + cups.pc + cups-config + desktop/cups.desktop + doc/index.html + scheduler/cups-lpd.xinetd + scheduler/cups.sh + scheduler/cups.xml + scheduler/org.cups.cups-lpd.plist + scheduler/cups-lpdAT.service + scheduler/cups.path + scheduler/cups.service + scheduler/cups.socket + templates/header.tmpl + packaging/cups.list + $LANGFILES +]) +AC_OUTPUT +dnl Make sure cups-config script is executable chmod +x cups-config diff -Nru cups-2.3.3op2/cups/Makefile cups-2.4.1op1/cups/Makefile --- cups-2.3.3op2/cups/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ # # Library Makefile for CUPS. # -# Copyright © 2007-2019 by Apple Inc. +# Copyright © 2021-2022 by OpenPrinting. +# Copyright © 2007-2021 by Apple Inc. # Copyright © 1997-2006 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -86,6 +87,7 @@ raster-stubs.o TESTOBJS = \ + fuzzipp.o \ rasterbench.o \ testadmin.o \ testarray.o \ @@ -225,7 +227,7 @@ # clean: - $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) + $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) fuzzipp $(RM) libcups.so libcups.dylib $(RM) libcupsimage.so libcupsimage.dylib @@ -277,13 +279,6 @@ for file in $(HEADERS); do \ $(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \ done - if test "x$(privateinclude)" != x; then \ - echo Installing private header files into $(PRIVATEINCLUDE)...; \ - $(INSTALL_DIR) -m 755 $(PRIVATEINCLUDE); \ - for file in $(HEADERSPRIV); do \ - $(INSTALL_DATA) $$file $(PRIVATEINCLUDE)/$$file; \ - done; \ - fi # @@ -353,12 +348,6 @@ $(RM) $(INCLUDEDIR)/cups/$$file; \ done -$(RMDIR) $(INCLUDEDIR)/cups - if test "x$(privateinclude)" != x; then \ - for file in $(HEADERSPRIV); do \ - $(RM) $(PRIVATEINCLUDE)/cups/$$file; \ - done - $(RMDIR) $(PRIVATEINCLUDE)/cups; \ - fi # @@ -476,6 +465,18 @@ # +# fuzzipp (dependency on static CUPS library is intentional) +# + +fuzzipp: fuzzipp.o $(LIBCUPSSTATIC) + echo Linking $@... + $(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ fuzzipp.o $(LINKCUPSSTATIC) + $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ + echo Fuzzing IPP API... + ./fuzzipp + + +# # rasterbench (dependency on static CUPS library is intentional) # @@ -641,6 +642,8 @@ $(LN) ../../$$po locale/$$lang; \ done echo Running language API tests... + echo ls -al locale + ls -al locale LOCALEDIR=locale ./testlang @@ -727,33 +730,29 @@ # apihelp: - echo Generating CUPS API help files... + echo "Generating CUPS Programming Manual..." $(RM) cupspm.xml codedoc --section "Programming" --body cupspm.md \ cupspm.xml \ - auth.c cups.h dest*.c encode.c http.h http*.c ipp.h ipp*.c \ - options.c tls-darwin.c usersys.c util.c \ + array.[ch] auth.c cups.h dest*.c dir.[ch] encode.c file.[ch] \ + http.h http*.c ipp.h ipp*.c options.c pwg.[ch] \ + raster.h raster-stubs.c tls-darwin.c usersys.c util.c \ --coverimage cupspm.png \ --epub ../doc/help/cupspm.epub codedoc --section "Programming" --body cupspm.md \ cupspm.xml > ../doc/help/cupspm.html $(RM) cupspm.xml + echo "Generating Administration APIs help..." codedoc --section "Programming" --title "Administration APIs" \ - --css ../doc/cups-printable.css \ --header api-admin.header --body api-admin.shtml \ adminutil.c adminutil.h getdevices.c >../doc/help/api-admin.html + echo "Generating PPD API (deprecated) help..." codedoc --section "Programming" --title "PPD API (DEPRECATED)" \ - --css ../doc/cups-printable.css \ --header api-ppd.header --body api-ppd.shtml \ ppd.h ppd-*.c raster-interstub.c >../doc/help/api-ppd.html - codedoc --section "Programming" --title "Raster API" \ - --css ../doc/cups-printable.css \ - --header api-raster.header --body api-raster.shtml \ - ../cups/raster.h raster-stubs.c \ - >../doc/help/api-raster.html + echo "Generating Filter and Backend Programming help..." codedoc --section "Programming" \ --title "Filter and Backend Programming" \ - --css ../doc/cups-printable.css \ --header api-filter.header --body api-filter.shtml \ backchannel.c backend.h backend.c sidechannel.c sidechannel.h \ >../doc/help/api-filter.html diff -Nru cups-2.3.3op2/cups/adminutil.c cups-2.4.1op1/cups/adminutil.c --- cups-2.3.3op2/cups/adminutil.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/adminutil.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Administration utility API definitions for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 2001-2007 by Easy Software Products. * @@ -263,18 +264,17 @@ ) remote_access = 1; } - else if (!_cups_strcasecmp(line, "Browsing")) + else if (!_cups_strcasecmp(line, "Browsing") && value) { browsing = !_cups_strcasecmp(value, "yes") || !_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "true"); } - else if (!_cups_strcasecmp(line, "LogLevel")) + else if (!_cups_strcasecmp(line, "LogLevel") && value) { debug_logging = !_cups_strncasecmp(value, "debug", 5); } - else if (!_cups_strcasecmp(line, " 0 ? "all" : "@LOCAL"); + { + if (remote_any >= 0) + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); + else + cupsFilePrintf(temp, " Allow %s\n", old_remote_any > 0 ? "all" : "@LOCAL"); + } } else if (in_conf_location && remote_admin >= 0) { @@ -862,8 +866,12 @@ cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin) - cupsFilePrintf(temp, " Allow %s\n", - remote_any > 0 ? "all" : "@LOCAL"); + { + if (remote_any >= 0) + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); + else + cupsFilePrintf(temp, " Allow %s\n", old_remote_any > 0 ? "all" : "@LOCAL"); + } } else if (in_log_location && remote_admin >= 0) { @@ -879,8 +887,12 @@ cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin) - cupsFilePrintf(temp, " Allow %s\n", - remote_any > 0 ? "all" : "@LOCAL"); + { + if (remote_any >= 0) + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); + else + cupsFilePrintf(temp, " Allow %s\n", old_remote_any > 0 ? "all" : "@LOCAL"); + } } else if (in_root_location && (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0)) @@ -902,8 +914,12 @@ cupsFilePuts(temp, " Order allow,deny\n"); if (remote_admin > 0 || remote_any > 0 || share_printers > 0) - cupsFilePrintf(temp, " Allow %s\n", - remote_any > 0 ? "all" : "@LOCAL"); + { + if (remote_any >= 0) + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); + else + cupsFilePrintf(temp, " Allow %s\n", old_remote_any > 0 ? "all" : "@LOCAL"); + } } in_admin_location = 0; diff -Nru cups-2.3.3op2/cups/auth.c cups-2.4.1op1/cups/auth.c --- cups-2.3.3op2/cups/auth.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/auth.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,15 @@ /* * Authentication functions for CUPS. * - * Copyright 2007-2019 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products. + * Copyright © 2021 by OpenPrinting. + * Copyright © 2007-2019 by Apple Inc. + * Copyright © 1997-2007 by Easy Software Products. * * This file contains Kerberos support code, copyright 2006 by * Jelmer Vernooij. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -90,6 +92,7 @@ # define cups_gss_printf(major, minor, message) # endif /* DEBUG */ #endif /* HAVE_GSSAPI */ +static int cups_is_local_connection(http_t *http); static int cups_local_auth(http_t *http); @@ -114,7 +117,7 @@ char scheme[256], /* Scheme name */ prompt[1024]; /* Prompt for user */ int localauth; /* Local authentication result */ - _cups_globals_t *cg; /* Global data */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ DEBUG_printf(("cupsDoAuthentication(http=%p, method=\"%s\", resource=\"%s\")", (void *)http, method, resource)); @@ -174,10 +177,10 @@ DEBUG_printf(("2cupsDoAuthentication: Trying scheme \"%s\"...", scheme)); #ifdef HAVE_GSSAPI - if (!_cups_strcasecmp(scheme, "Negotiate")) + if (!_cups_strcasecmp(scheme, "Negotiate") && !cups_is_local_connection(http)) { /* - * Kerberos authentication... + * Kerberos authentication to remote server... */ int gss_status; /* Auth status */ @@ -201,7 +204,38 @@ } else #endif /* HAVE_GSSAPI */ - if (_cups_strcasecmp(scheme, "Basic") && _cups_strcasecmp(scheme, "Digest")) + if (!_cups_strcasecmp(scheme, "Bearer")) + { + // OAuth 2.0 (Bearer) authentication... + const char *bearer = NULL; /* Bearer token string, if any */ + + if (cg->oauth_cb) + { + // Try callback... + char scope[HTTP_MAX_VALUE]; /* scope="xyz" string */ + + cups_auth_param(schemedata, "realm", http->realm, sizeof(http->realm)); + + if (cups_auth_param(schemedata, "scope", scope, sizeof(scope))) + bearer = (cg->oauth_cb)(http, http->realm, scope, resource, cg->oauth_data); + else + bearer = (cg->oauth_cb)(http, http->realm, NULL, resource, cg->oauth_data); + } + + if (bearer) + { + // Use this access token... + httpSetAuthString(http, "Bearer", bearer); + break; + } + else + { + // No access token, try the next scheme... + DEBUG_puts("2cupsDoAuthentication: No OAuth access token to provide."); + continue; + } + } + else if (_cups_strcasecmp(scheme, "Basic") && _cups_strcasecmp(scheme, "Digest") && _cups_strcasecmp(scheme, "Negotiate")) { /* * Other schemes not yet supported... @@ -215,7 +249,7 @@ * See if we should retry the current username:password... */ - if ((http->digest_tries > 1 || !http->userpass[0]) && (!_cups_strcasecmp(scheme, "Basic") || (!_cups_strcasecmp(scheme, "Digest")))) + if (http->digest_tries > 1 || !http->userpass[0]) { /* * Nope - get a new password from the user... @@ -224,8 +258,6 @@ char default_username[HTTP_MAX_VALUE]; /* Default username */ - cg = _cupsGlobals(); - if (!cg->lang_default) cg->lang_default = cupsLangDefault(); @@ -295,7 +327,7 @@ } } - if (http->authstring) + if (http->authstring && http->authstring[0]) { DEBUG_printf(("1cupsDoAuthentication: authstring=\"%s\".", http->authstring)); @@ -327,10 +359,6 @@ gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER; /* Output token */ - - (void)method; - (void)resource; - # ifdef __APPLE__ /* * If the weak-linked GSSAPI/Kerberos library is not present, don't try @@ -447,6 +475,9 @@ } } } +# else + (void)method; + (void)resource; # endif /* HAVE_GSS_ACQUIRED_CRED_EX_F */ if (major_status == GSS_S_NO_CRED) @@ -729,9 +760,10 @@ * Skip quoted value... */ - www_authenticate ++; - while (*www_authenticate && *www_authenticate != '\"') + + do www_authenticate ++; + while (*www_authenticate && *www_authenticate != '\"'); } } @@ -916,6 +948,14 @@ # endif /* DEBUG */ #endif /* HAVE_GSSAPI */ +static int /* O - 0 if not a local connection */ + /* 1 if local connection */ +cups_is_local_connection(http_t *http) /* I - HTTP connection to server */ +{ + if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0) + return 0; + return 1; +} /* * 'cups_local_auth()' - Get the local authorization certificate if @@ -958,7 +998,7 @@ * See if we are accessing localhost... */ - if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0) + if (!cups_is_local_connection(http)) { DEBUG_puts("8cups_local_auth: Not a local connection!"); return (1); @@ -1032,11 +1072,6 @@ } # endif /* HAVE_AUTHORIZATION_H */ -# ifdef HAVE_GSSAPI - if (cups_auth_find(www_auth, "Negotiate")) - return (1); -# endif /* HAVE_GSSAPI */ - # if defined(SO_PEERCRED) && defined(AF_LOCAL) /* * See if we can authenticate using the peer credentials provided over a @@ -1052,12 +1087,14 @@ * Verify that the current cupsUser() matches the current UID... */ - struct passwd *pwd; /* Password information */ + struct passwd pwd; /* Password information */ + struct passwd *result; /* Auxiliary pointer */ const char *username; /* Current username */ username = cupsUser(); - if ((pwd = getpwnam(username)) != NULL && pwd->pw_uid == getuid()) + getpwnam_r(username, &pwd, cg->pw_buf, PW_BUF_SIZE, &result); + if (result && pwd.pw_uid == getuid()) { httpSetAuthString(http, "PeerCred", username); diff -Nru cups-2.3.3op2/cups/cups-private.h cups-2.4.1op1/cups/cups-private.h --- cups-2.3.3op2/cups/cups-private.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/cups-private.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Private definitions for CUPS. * + * Copyright © 2021 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -84,6 +85,11 @@ *cups_statedir, /* CUPS_STATEDIR environment var */ *home, /* HOME environment var */ *localedir; /* LOCALDIR environment var */ +#ifndef _WIN32 +#define PW_BUF_SIZE 16384 /* As per glibc manual page */ + char pw_buf[PW_BUF_SIZE]; + /* Big buffer for struct passwd buffers */ +#endif /* adminutil.c */ time_t cupsd_update; /* Last time we got or set cupsd.conf */ @@ -172,6 +178,8 @@ server[256], /* Server address */ servername[256],/* Server hostname */ password[128]; /* Password for default callback */ + cups_oauth_cb_t oauth_cb; /* OAuth callback */ + void *oauth_data; /* OAuth user data */ cups_password_cb2_t password_cb; /* Password callback */ void *password_data; /* Password user data */ http_tls_credentials_t tls_credentials; diff -Nru cups-2.3.3op2/cups/cups.h cups-2.4.1op1/cups/cups.h --- cups-2.3.3op2/cups/cups.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/cups.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * API definitions for CUPS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021 by OpenPrinting. + * Copyright © 2007-2020 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -19,8 +20,8 @@ # if defined(_WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) # define __CUPS_SSIZE_T_DEFINED # include -/* Windows does not support the ssize_t type, so map it to long... */ -typedef long ssize_t; /* @private@ */ +/* Windows does not support the ssize_t type, so map it to __int64... */ +typedef __int64 ssize_t; /* @private@ */ # endif /* _WIN32 && !__CUPS_SSIZE_T_DEFINED */ # include "file.h" @@ -42,10 +43,10 @@ * Constants... */ -# define CUPS_VERSION 2.0303 +# define CUPS_VERSION 2.0401 # define CUPS_VERSION_MAJOR 2 -# define CUPS_VERSION_MINOR 3 -# define CUPS_VERSION_PATCH 3 +# define CUPS_VERSION_MINOR 4 +# define CUPS_VERSION_PATCH 1 # define CUPS_BC_FD 3 /* Back-channel file descriptor for @@ -309,6 +310,9 @@ * @exclude all@ */ # endif /* __BLOCKS__ */ +typedef const char *(*cups_oauth_cb_t)(http_t *http, const char *realm, const char *scope, const char *resource, void *user_data); + /* OAuth callback @since CUPS 2.4@ */ + typedef const char *(*cups_password_cb_t)(const char *prompt); /* Password callback @exclude all@ */ @@ -604,6 +608,10 @@ extern int cupsAddDestMediaOptions(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size, int num_options, cups_option_t **options) _CUPS_API_2_3; extern ipp_attribute_t *cupsEncodeOption(ipp_t *ipp, ipp_tag_t group_tag, const char *name, const char *value) _CUPS_API_2_3; +/* New in CUPS 2.4 */ +extern void cupsSetOAuthCB(cups_oauth_cb_t cb, void *data) _CUPS_API_2_4; + + # ifdef __cplusplus } # endif /* __cplusplus */ diff -Nru cups-2.3.3op2/cups/cupspm.md cups-2.4.1op1/cups/cupspm.md --- cups-2.3.3op2/cups/cupspm.md 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/cupspm.md 2022-01-27 11:11:42.000000000 +0000 @@ -1,11 +1,11 @@ --- title: CUPS Programming Manual author: Michael R Sweet -copyright: Copyright © 2007-2019 by Apple Inc. All Rights Reserved. -version: 2.3.3 +copyright: Copyright © 2021-2022 by OpenPrinting. All Rights Reserved. +version: 2.4.0 ... -> Please [file issues on Github](https://github.com/apple/cups/issues) to +> Please [file issues on Github](https://github.com/openprinting/cups/issues) to > provide feedback on this document. @@ -46,8 +46,9 @@ > > CUPS printer drivers necessarily depend on specific file formats and certain > implementation details of the CUPS software. Please consult the Postscript -> and raster printer driver developer documentation on -> [CUPS.org](https://www.cups.org/documentation.html) for more information. +> and raster printer driver developer documentation on the +> [OpenPrinting CUPS web site](https://openprinting.github.io/cups) for more +> information. ## Terms Used in This Document @@ -261,7 +262,7 @@ * return... */ - cupsFreeDests(user_data.num_dests, user_dasta.dests); + cupsFreeDests(user_data.num_dests, user_data.dests); *dests = NULL; diff -Nru cups-2.3.3op2/cups/dest-localization.c cups-2.4.1op1/cups/dest-localization.c --- cups-2.3.3op2/cups/dest-localization.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/dest-localization.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,9 +1,10 @@ /* * Destination localization support for CUPS. * - * Copyright 2012-2017 by Apple Inc. + * Copyright © 2012-2017 by Apple Inc. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* diff -Nru cups-2.3.3op2/cups/dest-options.c cups-2.4.1op1/cups/dest-options.c --- cups-2.3.3op2/cups/dest-options.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/dest-options.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Destination option/media support for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2012-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -2512,32 +2513,27 @@ } } - if (best) - { - /* - * Return the matching size... - */ - - if (best->key) - strlcpy(size->media, best->key, sizeof(size->media)); - else if (best->size_name) - strlcpy(size->media, best->size_name, sizeof(size->media)); - else if (pwg && pwg->pwg) - strlcpy(size->media, pwg->pwg, sizeof(size->media)); - else - strlcpy(size->media, "unknown", sizeof(size->media)); + /* + * Return the matching size... + */ - size->width = best->width; - size->length = best->length; - size->bottom = best->bottom; - size->left = best->left; - size->right = best->right; - size->top = best->top; + if (best->key) + strlcpy(size->media, best->key, sizeof(size->media)); + else if (best->size_name) + strlcpy(size->media, best->size_name, sizeof(size->media)); + else if (pwg->pwg) + strlcpy(size->media, pwg->pwg, sizeof(size->media)); + else + strlcpy(size->media, "unknown", sizeof(size->media)); - return (1); - } + size->width = best->width; + size->length = best->length; + size->bottom = best->bottom; + size->left = best->left; + size->right = best->right; + size->top = best->top; - return (0); + return (1); } diff -Nru cups-2.3.3op2/cups/dest.c cups-2.4.1op1/cups/dest.c --- cups-2.3.3op2/cups/dest.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/dest.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * User-defined destination (and option) support for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * @@ -24,9 +25,9 @@ # include #endif /* HAVE_POLL */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER # include -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI # include @@ -56,19 +57,19 @@ # define kUseLastPrinter CFSTR("UseLastPrinter") #endif /* __APPLE__ */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD # define _CUPS_DNSSD_GET_DESTS 250 /* Milliseconds for cupsGetDests */ # define _CUPS_DNSSD_MAXTIME 50 /* Milliseconds for maximum quantum of time */ #else # define _CUPS_DNSSD_GET_DESTS 0 /* Milliseconds for cupsGetDests */ -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ /* * Types... */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD typedef enum _cups_dnssd_state_e /* Enumerated device state */ { _CUPS_DNSSD_NEW, @@ -81,14 +82,14 @@ typedef struct _cups_dnssd_data_s /* Enumeration data */ { -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER DNSServiceRef main_ref; /* Main service reference */ # else /* HAVE_AVAHI */ AvahiSimplePoll *simple_poll; /* Polling interface */ AvahiClient *client; /* Client information */ int got_data; /* Did we get data? */ int browsers; /* How many browsers are running? */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ cups_dest_cb_t cb; /* Callback */ void *user_data; /* User data pointer */ cups_ptype_t type, /* Printer type filter */ @@ -103,11 +104,11 @@ typedef struct _cups_dnssd_device_s /* Enumerated device */ { _cups_dnssd_state_t state; /* State of device listing */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER DNSServiceRef ref; /* Service reference for query */ # else /* HAVE_AVAHI */ AvahiRecordBrowser *ref; /* Browser for query */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ char *fullName, /* Full name */ *regtype, /* Registration type */ *domain; /* Domain name */ @@ -159,8 +160,8 @@ cups_dest_t *dest); #endif /* __BLOCKS__ */ static int cups_compare_dests(cups_dest_t *a, cups_dest_t *b); -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) -# ifdef HAVE_DNSSD +#ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER static void cups_dnssd_browse_cb(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, @@ -182,7 +183,7 @@ static void cups_dnssd_client_cb(AvahiClient *client, AvahiClientState state, void *context); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ static int cups_dnssd_compare_devices(_cups_dnssd_device_t *a, _cups_dnssd_device_t *b); static void cups_dnssd_free_device(_cups_dnssd_device_t *device, @@ -192,7 +193,7 @@ const char *serviceName, const char *regtype, const char *replyDomain); -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER static void cups_dnssd_query_cb(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, @@ -214,7 +215,7 @@ size_t rdlen, AvahiLookupResultFlags flags, void *context); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ static const char *cups_dnssd_resolve(cups_dest_t *dest, const char *uri, int msec, int *cancel, cups_dest_cb_t cb, void *user_data); @@ -222,7 +223,7 @@ static void cups_dnssd_unquote(char *dst, const char *src, size_t dstsize); static int cups_elapsed(struct timeval *t); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ static int cups_enum_dests(http_t *http, unsigned flags, int msec, int *cancel, cups_ptype_t type, cups_ptype_t mask, cups_dest_cb_t cb, void *user_data); static int cups_find_dest(const char *name, const char *instance, int num_dests, cups_dest_t *dests, int prev, @@ -271,7 +272,11 @@ if (!cupsGetDest(name, instance, num_dests, *dests)) { if (instance && !cupsGetDest(name, NULL, num_dests, *dests)) - return (num_dests); + { + // Add destination first... + if (!cups_add_dest(name, NULL, &num_dests, dests)) + return (num_dests); + } if ((dest = cups_add_dest(name, instance, &num_dests, dests)) == NULL) return (num_dests); @@ -634,20 +639,20 @@ { if ((uri = cupsGetOption("device-uri", dest->num_options, dest->options)) != NULL) { -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD if (strstr(uri, "._tcp")) uri = cups_dnssd_resolve(dest, uri, msec, cancel, cb, user_data); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ } } else if ((uri = cupsGetOption("printer-uri-supported", dest->num_options, dest->options)) == NULL) { if ((uri = cupsGetOption("device-uri", dest->num_options, dest->options)) != NULL) { -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD if (strstr(uri, "._tcp")) uri = cups_dnssd_resolve(dest, uri, msec, cancel, cb, user_data); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ } if (uri) @@ -1136,8 +1141,8 @@ DEBUG_printf(("1_cupsGetDestResource: device-uri=\"%s\", printer-uri-supported=\"%s\".", device_uri, printer_uri)); -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) - if (((flags & CUPS_DEST_FLAGS_DEVICE) || !printer_uri) && strstr(device_uri, "._tcp")) +#ifdef HAVE_DNSSD + if (((flags & CUPS_DEST_FLAGS_DEVICE) || !printer_uri) && device_uri && strstr(device_uri, "._tcp")) { if ((device_uri = cups_dnssd_resolve(dest, device_uri, 5000, NULL, NULL, NULL)) != NULL) { @@ -1155,7 +1160,7 @@ return (NULL); } } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ if (flags & CUPS_DEST_FLAGS_DEVICE) { @@ -1785,7 +1790,11 @@ * No default in the environment, try the user's lpoptions files... */ +#if _WIN32 + snprintf(filename, sizeof(filename), "%s/AppData/Local/cups/lpoptions", cg->home); +#else snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home); +#endif // _WIN32 dest_name = cups_get_default(filename, defname, sizeof(defname), &instance); @@ -1896,7 +1905,11 @@ if (cg->home) { +#if _WIN32 + snprintf(filename, sizeof(filename), "%s/AppData/Local/cups/lpoptions", cg->home); +#else snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home); +#endif // _WIN32 cups_get_dests(filename, dest_name, instance, 0, 1, 1, &dest); } @@ -2073,11 +2086,19 @@ * Create ~/.cups subdirectory... */ +#if _WIN32 + snprintf(filename, sizeof(filename), "%s/AppData/Local/cups", cg->home); +#else snprintf(filename, sizeof(filename), "%s/.cups", cg->home); +#endif // _WIN32 if (access(filename, 0)) mkdir(filename, 0700); +#if _WIN32 + snprintf(filename, sizeof(filename), "%s/AppData/Local/cups/lpoptions", cg->home); +#else snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home); +#endif // _WIN32 } /* @@ -2554,8 +2575,8 @@ } -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) -# ifdef HAVE_DNSSD +#ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER /* * 'cups_dnssd_browse_cb()' - Browse for printers. */ @@ -2678,7 +2699,7 @@ avahi_simple_poll_quit(data->simple_poll); } } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ /* @@ -2705,13 +2726,13 @@ { DEBUG_printf(("5cups_dnssd_free_device(device=%p(%s), data=%p)", (void *)device, device->dest.name, (void *)data)); -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER if (device->ref) DNSServiceRefDeallocate(device->ref); # else /* HAVE_AVAHI */ if (device->ref) avahi_record_browser_free(device->ref); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ _cupsStrFree(device->domain); _cupsStrFree(device->fullName); @@ -2810,7 +2831,9 @@ !strcmp(regtype, "_ipps._tcp") ? "IPPS" : "IPP", replyDomain)); - device = calloc(sizeof(_cups_dnssd_device_t), 1); + if ((device = calloc(sizeof(_cups_dnssd_device_t), 1)) == NULL) + return (NULL); + device->dest.name = _cupsStrAlloc(name); device->domain = _cupsStrAlloc(replyDomain); device->regtype = _cupsStrAlloc(regtype); @@ -2824,22 +2847,22 @@ * Set the "full name" of this service, which is used for queries... */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain); # else /* HAVE_AVAHI */ avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName, regtype, replyDomain); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ _cupsStrFree(device->fullName); device->fullName = _cupsStrAlloc(fullName); if (device->ref) { -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER DNSServiceRefDeallocate(device->ref); # else /* HAVE_AVAHI */ avahi_record_browser_free(device->ref); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ device->ref = 0; } @@ -2907,7 +2930,7 @@ static void cups_dnssd_query_cb( -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER DNSServiceRef sdRef, /* I - Service reference */ DNSServiceFlags flags, /* I - Data flags */ uint32_t interfaceIndex, /* I - Interface */ @@ -2930,7 +2953,7 @@ const void *rdata, /* I - TXT record */ size_t rdlen, /* I - Length of TXT record */ AvahiLookupResultFlags flags, /* I - Flags */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ void *context) /* I - Enumeration data */ { # if defined(DEBUG) && defined(HAVE_AVAHI) @@ -2946,7 +2969,7 @@ *device; /* Device */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER DEBUG_printf(("5cups_dnssd_query_cb(sdRef=%p, flags=%x, interfaceIndex=%d, errorCode=%d, fullName=\"%s\", rrtype=%u, rrclass=%u, rdlen=%u, rdata=%p, ttl=%u, context=%p)", (void *)sdRef, flags, interfaceIndex, errorCode, fullName, rrtype, rrclass, rdlen, rdata, ttl, context)); /* @@ -2970,7 +2993,7 @@ return; } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ /* * Lookup the service in the devices array. @@ -3338,10 +3361,8 @@ *dst = '\0'; } -#endif /* HAVE_DNSSD */ -#if defined(HAVE_AVAHI) || defined(HAVE_DNSSD) /* * 'cups_elapsed()' - Return the elapsed time in milliseconds. */ @@ -3361,7 +3382,7 @@ return (msecs); } -#endif /* HAVE_AVAHI || HAVE_DNSSD */ +#endif /* HAVE_DNSSD */ /* @@ -3379,26 +3400,26 @@ cups_dest_cb_t cb, /* I - Callback function */ void *user_data) /* I - User data */ { - int i, j, /* Looping vars */ + int i, j, k, /* Looping vars */ num_dests; /* Number of destinations */ cups_dest_t *dests = NULL, /* Destinations */ *dest; /* Current destination */ cups_option_t *option; /* Current option */ const char *user_default; /* Default printer from environment */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD int count, /* Number of queries started */ completed, /* Number of completed queries */ remaining; /* Remainder of timeout */ struct timeval curtime; /* Current time */ _cups_dnssd_data_t data; /* Data for callback */ _cups_dnssd_device_t *device; /* Current device */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER int nfds, /* Number of files responded */ main_fd; /* File descriptor for lookups */ DNSServiceRef ipp_ref = NULL; /* IPP browser */ -# ifdef HAVE_SSL +# ifdef HAVE_TLS DNSServiceRef ipps_ref = NULL; /* IPPS browser */ -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ # ifdef HAVE_POLL struct pollfd pfd; /* Polling data */ # else @@ -3408,13 +3429,13 @@ # else /* HAVE_AVAHI */ int error; /* Error value */ AvahiServiceBrowser *ipp_ref = NULL; /* IPP browser */ -# ifdef HAVE_SSL +# ifdef HAVE_TLS AvahiServiceBrowser *ipps_ref = NULL; /* IPPS browser */ -# endif /* HAVE_SSL */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_TLS */ +# endif /* HAVE_MDNSRESPONDER */ #else _cups_getdata_t data; /* Data for callback */ -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ char filename[1024]; /* Local lpoptions file */ _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ @@ -3446,7 +3467,11 @@ if (cg->home) { +#if _WIN32 + snprintf(filename, sizeof(filename), "%s/AppData/Local/cups/lpoptions", cg->home); +#else snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home); +#endif // _WIN32 data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests); } @@ -3486,13 +3511,13 @@ * Get ready to enumerate... */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD 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); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ if (!(mask & CUPS_PRINTER_DISCOVERED) || !(type & CUPS_PRINTER_DISCOVERED)) { @@ -3520,24 +3545,38 @@ i --, dest ++) { cups_dest_t *user_dest; /* Destination from lpoptions */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD const char *device_uri; /* Device URI */ -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ - if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL) + if ((user_dest = cupsGetDest(dest->name, NULL, data.num_dests, data.dests)) != NULL) { /* - * Apply user defaults to this destination... + * Apply user defaults to this destination for all instances... */ - for (j = user_dest->num_options, option = user_dest->options; j > 0; j --, option ++) - dest->num_options = cupsAddOption(option->name, option->value, dest->num_options, &dest->options); - } + for (j = user_dest - data.dests; j < data.num_dests; j ++, user_dest ++) + { + if (_cups_strcasecmp(user_dest->name, dest->name)) + { + j = data.num_dests; + break; + } + + for (k = dest->num_options, option = dest->options; k > 0; k --, option ++) + user_dest->num_options = cupsAddOption(option->name, option->value, user_dest->num_options, &user_dest->options); - if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE, dest)) + if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE, user_dest)) + break; + } + + if (j < data.num_dests) + break; + } + else if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE, dest)) break; -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD if (!dest->instance && (device_uri = cupsGetOption("device-uri", dest->num_options, dest->options)) != NULL && !strncmp(device_uri, "dnssd://", 8)) { /* @@ -3569,7 +3608,7 @@ } } } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ } cupsFreeDests(num_dests, dests); @@ -3585,19 +3624,20 @@ if ((mask & CUPS_PRINTER_DISCOVERED) && !(type & CUPS_PRINTER_DISCOVERED)) goto enum_finished; -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD /* * Get Bonjour-shared printers... */ gettimeofday(&curtime, NULL); -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER if (DNSServiceCreateConnection(&data.main_ref) != kDNSServiceErr_NoError) { DEBUG_puts("1cups_enum_dests: Unable to create service browser, returning 0."); cupsFreeDests(data.num_dests, data.dests); + cupsArrayDelete(data.devices); return (0); } @@ -3611,11 +3651,12 @@ DNSServiceRefDeallocate(data.main_ref); cupsFreeDests(data.num_dests, data.dests); + cupsArrayDelete(data.devices); return (0); } -# ifdef HAVE_SSL +# ifdef HAVE_TLS ipps_ref = data.main_ref; if (DNSServiceBrowse(&ipps_ref, kDNSServiceFlagsShareConnection, 0, "_ipps._tcp", NULL, (DNSServiceBrowseReply)cups_dnssd_browse_cb, &data) != kDNSServiceErr_NoError) { @@ -3623,10 +3664,11 @@ DNSServiceRefDeallocate(data.main_ref); cupsFreeDests(data.num_dests, data.dests); + cupsArrayDelete(data.devices); return (0); } -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ # else /* HAVE_AVAHI */ if ((data.simple_poll = avahi_simple_poll_new()) == NULL) @@ -3634,6 +3676,7 @@ DEBUG_puts("1cups_enum_dests: Unable to create Avahi poll, returning 0."); cupsFreeDests(data.num_dests, data.dests); + cupsArrayDelete(data.devices); return (0); } @@ -3649,6 +3692,7 @@ avahi_simple_poll_free(data.simple_poll); cupsFreeDests(data.num_dests, data.dests); + cupsArrayDelete(data.devices); return (0); } @@ -3662,11 +3706,12 @@ avahi_simple_poll_free(data.simple_poll); cupsFreeDests(data.num_dests, data.dests); + cupsArrayDelete(data.devices); return (0); } -# ifdef HAVE_SSL +# ifdef HAVE_TLS data.browsers ++; if ((ipps_ref = avahi_service_browser_new(data.client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_ipps._tcp", NULL, 0, cups_dnssd_browse_cb, &data)) == NULL) { @@ -3677,11 +3722,12 @@ avahi_simple_poll_free(data.simple_poll); cupsFreeDests(data.num_dests, data.dests); + cupsArrayDelete(data.devices); return (0); } -# endif /* HAVE_SSL */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_TLS */ +# endif /* HAVE_MDNSRESPONDER */ if (msec < 0) remaining = INT_MAX; @@ -3698,7 +3744,7 @@ cups_elapsed(&curtime); -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER # ifdef HAVE_POLL pfd.fd = main_fd; pfd.events = POLLIN; @@ -3734,7 +3780,7 @@ } DEBUG_printf(("1cups_enum_dests: got_data=%d", data.got_data)); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ remaining -= cups_elapsed(&curtime); @@ -3753,7 +3799,7 @@ { DEBUG_printf(("1cups_enum_dests: Querying '%s'.", device->fullName)); -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER device->ref = data.main_ref; if (DNSServiceQueryRecord(&(device->ref), kDNSServiceFlagsShareConnection, 0, device->fullName, kDNSServiceType_TXT, kDNSServiceClass_IN, (DNSServiceQueryRecordReply)cups_dnssd_query_cb, &data) == kDNSServiceErr_NoError) @@ -3780,7 +3826,7 @@ DEBUG_printf(("1cups_enum_dests: Query failed: %s", avahi_strerror(avahi_client_errno(data.client)))); } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } else if (device->ref && device->state == _CUPS_DNSSD_PENDING) { @@ -3797,25 +3843,45 @@ if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL) { /* - * Apply user defaults to this destination... + * Apply user defaults to this destination for all instances... */ - for (j = user_dest->num_options, option = user_dest->options; j > 0; j --, option ++) - dest->num_options = cupsAddOption(option->name, option->value, dest->num_options, &dest->options); - } + for (j = user_dest - data.dests; j < data.num_dests; j ++, user_dest ++) + { + if (_cups_strcasecmp(user_dest->name, dest->name)) + { + j = data.num_dests; + break; + } - if (!strcasecmp(dest->name, data.def_name) && !data.def_instance) - { - DEBUG_printf(("1cups_enum_dests: Setting is_default on discovered \"%s\".", dest->name)); - dest->is_default = 1; + for (k = dest->num_options, option = dest->options; k > 0; k --, option ++) + user_dest->num_options = cupsAddOption(option->name, option->value, user_dest->num_options, &user_dest->options); + + if (!(*cb)(user_data, CUPS_DEST_FLAGS_NONE, user_dest)) + break; + } + + if (j < data.num_dests) + { + remaining = -1; + break; + } } + else + { + if (!strcasecmp(dest->name, data.def_name) && !data.def_instance) + { + DEBUG_printf(("1cups_enum_dests: Setting is_default on discovered \"%s\".", dest->name)); + dest->is_default = 1; + } - DEBUG_printf(("1cups_enum_dests: Add callback for \"%s\".", device->dest.name)); - if (!(*cb)(user_data, CUPS_DEST_FLAGS_NONE, dest)) - { - remaining = -1; - break; - } + DEBUG_printf(("1cups_enum_dests: Add callback for \"%s\".", device->dest.name)); + if (!(*cb)(user_data, CUPS_DEST_FLAGS_NONE, dest)) + { + remaining = -1; + break; + } + } } device->state = _CUPS_DNSSD_ACTIVE; @@ -3834,7 +3900,7 @@ break; # endif /* HAVE_AVAHI */ } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ /* * Return... @@ -3844,17 +3910,17 @@ cupsFreeDests(data.num_dests, data.dests); -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD cupsArrayDelete(data.devices); -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER if (ipp_ref) DNSServiceRefDeallocate(ipp_ref); -# ifdef HAVE_SSL +# ifdef HAVE_TLS if (ipps_ref) DNSServiceRefDeallocate(ipps_ref); -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ if (data.main_ref) DNSServiceRefDeallocate(data.main_ref); @@ -3862,17 +3928,17 @@ # else /* HAVE_AVAHI */ if (ipp_ref) avahi_service_browser_free(ipp_ref); -# ifdef HAVE_SSL +# ifdef HAVE_TLS if (ipps_ref) avahi_service_browser_free(ipps_ref); -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ if (data.client) avahi_client_free(data.client); if (data.simple_poll) avahi_simple_poll_free(data.simple_poll); -# endif /* HAVE_DNSSD */ -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +# endif /* HAVE_MDNSRESPONDER */ +#endif /* HAVE_DNSSD */ DEBUG_puts("1cups_enum_dests: Returning 1."); @@ -4186,7 +4252,7 @@ * Out of memory! */ - DEBUG_puts("9cups_get_dests: Out of memory!"); + DEBUG_puts("9cups_get_dests: Could not find destination after adding, must be out of memory."); break; } } @@ -4369,5 +4435,13 @@ *nameptr++ = '_'; } + /* + * Remove an underscore if it is the last character and isn't the only + * character in the name... + */ + + if (nameptr > (name + 1) && nameptr[-1] == '_') + nameptr --; + *nameptr = '\0'; } diff -Nru cups-2.3.3op2/cups/dir.c cups-2.4.1op1/cups/dir.c --- cups-2.3.3op2/cups/dir.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/dir.c 2022-01-27 11:11:42.000000000 +0000 @@ -3,10 +3,11 @@ * * This set of APIs abstracts enumeration of directory entries. * - * Copyright 2007-2017 by Apple Inc. - * Copyright 1997-2005 by Easy Software Products, all rights reserved. + * Copyright © 2007-2021 by Apple Inc. + * Copyright © 1997-2005 by Easy Software Products, all rights reserved. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -122,7 +123,7 @@ dp->dir = INVALID_HANDLE_VALUE; - strlcpy(dp->directory, directory, sizeof(dp->directory)); + snprintf(dp->directory, sizeof(dp->directory), "%s\\*", directory); /* * Return the new directory structure... @@ -169,6 +170,16 @@ return (NULL); /* + * Loop until we have something other than "." or ".."... + */ + + while (!strcmp(entry.cFileName, ".") || !strcmp(entry.cFileName, "..")) + { + if (!FindNextFileA(dp->dir, &entry)) + return (NULL); + } + + /* * Copy the name over and convert the file information... */ diff -Nru cups-2.3.3op2/cups/encode.c cups-2.4.1op1/cups/encode.c --- cups-2.3.3op2/cups/encode.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/encode.c 2022-01-27 11:11:42.000000000 +0000 @@ -655,6 +655,7 @@ ippSetCollection(ipp, &attr, i, collection); cupsEncodeOptions2(collection, num_cols, cols, IPP_TAG_JOB); cupsFreeOptions(num_cols, cols); + ippDelete(collection); break; default : diff -Nru cups-2.3.3op2/cups/file.c cups-2.4.1op1/cups/file.c --- cups-2.3.3op2/cups/file.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/file.c 2022-01-27 11:11:42.000000000 +0000 @@ -6,6 +6,7 @@ * our own file functions allows us to provide transparent support of * different line endings, gzip'd print files, PPD files, etc. * + * Copyright © 2021 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -32,7 +33,6 @@ */ struct _cups_file_s /**** CUPS file structure... ****/ - { int fd; /* File descriptor */ char mode, /* Mode ('r' or 'w') */ @@ -1263,8 +1263,12 @@ * Initialize the compressor... */ - deflateInit2(&(fp->stream), mode[1] - '0', Z_DEFLATED, -15, 8, - Z_DEFAULT_STRATEGY); + if (deflateInit2(&(fp->stream), mode[1] - '0', Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY) < Z_OK) + { + close(fd); + free(fp); + return (NULL); + } fp->stream.next_out = fp->cbuf; fp->stream.avail_out = sizeof(fp->cbuf); @@ -1722,11 +1726,12 @@ */ DEBUG_printf(("cupsFileRewind(fp=%p)", (void *)fp)); - DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); if (!fp || fp->mode != 'r') return (-1); + DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + /* * Handle special cases... */ @@ -1794,8 +1799,6 @@ DEBUG_printf(("cupsFileSeek(fp=%p, pos=" CUPS_LLFMT ")", (void *)fp, CUPS_LLCAST pos)); - DEBUG_printf(("2cupsFileSeek: fp->pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); - DEBUG_printf(("2cupsFileSeek: fp->ptr=%p, fp->end=%p", (void *)fp->ptr, (void *)fp->end)); /* * Range check input... @@ -1804,6 +1807,9 @@ if (!fp || pos < 0 || fp->mode != 'r') return (-1); + DEBUG_printf(("2cupsFileSeek: fp->pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + DEBUG_printf(("2cupsFileSeek: fp->ptr=%p, fp->end=%p", (void *)fp->ptr, (void *)fp->end)); + /* * Handle special cases... */ @@ -2155,6 +2161,9 @@ const char *buf, /* I - Buffer */ size_t bytes) /* I - Number bytes */ { + int status; /* Deflate status */ + + DEBUG_printf(("7cups_compress(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)fp, (void *)buf, CUPS_LLCAST bytes)); /* @@ -2188,7 +2197,8 @@ fp->stream.avail_out = sizeof(fp->cbuf); } - deflate(&(fp->stream), Z_NO_FLUSH); + if ((status = deflate(&(fp->stream), Z_NO_FLUSH)) < Z_OK && status != Z_BUF_ERROR) + return (-1); } return ((ssize_t)bytes); diff -Nru cups-2.3.3op2/cups/fuzzipp.c cups-2.4.1op1/cups/fuzzipp.c --- cups-2.3.3op2/cups/fuzzipp.c 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/cups/fuzzipp.c 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,352 @@ +/* + * IPP fuzzing program for CUPS. + * + * Copyright © 2007-2021 by Apple Inc. + * Copyright © 1997-2005 by Easy Software Products. + * + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. + */ + +/* + * Include necessary headers... + */ + +#include "file.h" +#include "string-private.h" +#include "ipp-private.h" +#include +#include +#ifdef _WIN32 +# include +#else +# include +# include +#endif /* _WIN32 */ + + +/* + * Local types... + */ + +typedef struct _ippdata_t // Data +{ + size_t wused, // Bytes used + wsize; // Max size of buffer + ipp_uchar_t *wbuffer; // Buffer +} _ippdata_t; + + + + +/* + * Local functions... + */ + +void fuzzdata(_ippdata_t *data); +void hex_dump(ipp_uchar_t *buffer, size_t bytes); +ssize_t write_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes); + + +/* + * 'main()' - Main entry. + */ + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + ipp_state_t state; // State + cups_file_t *fp; // File pointer + ipp_t *request; // Request + + + if (argc == 1) + { + // Generate a Print-Job request with all common attribute types... + int i; // Looping var + char filename[256]; // Test filename + const char *fuzz_args[3]; // Arguments for sub-process + pid_t fuzz_pid; // Sub-process ID + int fuzz_status; // Exit status + ipp_t *media_col, // media-col collection + *media_size; // media-size collection + _ippdata_t data; // IPP buffer + ipp_uchar_t buffer[262144]; // Write buffer data + + request = ippNewRequest(IPP_OP_PRINT_JOB); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/foo"); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, "john-doe"); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, "Test Job"); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, "application/pdf"); + ippAddOctetString(request, IPP_TAG_OPERATION, "job-password", "8675309", 7); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "job-password-encryption", NULL, "none"); + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "print-color-mode", NULL, "color"); + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", IPP_QUALITY_HIGH); + ippAddResolution(request, IPP_TAG_JOB, "printer-resolution", 1200, 1200, IPP_RES_PER_INCH); + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", 42); + ippAddBoolean(request, IPP_TAG_JOB, "some-boolean-option", 1); + ippAddString(request, IPP_TAG_JOB, IPP_TAG_URISCHEME, "some-uri-scheme", NULL, "mailto"); + ippAddString(request, IPP_TAG_JOB, IPP_TAG_NAMELANG, "some-name-with-language", "es-MX", "Jose"); + ippAddString(request, IPP_TAG_JOB, IPP_TAG_TEXTLANG, "some-text-with-language", "es-MX", "¡Hola el mundo!"); + ippAddRange(request, IPP_TAG_JOB, "page-ranges", 1, 50); + ippAddDate(request, IPP_TAG_JOB, "job-hold-until-time", ippTimeToDate(time(NULL) + 3600)); + ippAddString(request, IPP_TAG_JOB, IPP_TAG_TEXT, "job-message-to-operator", NULL, "This is a test job."); + + media_col = ippNew(); + media_size = ippNew(); + ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", 21590); + ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", 27940); + ippAddCollection(media_col, IPP_TAG_JOB, "media-size", media_size); + ippDelete(media_size); + ippAddString(media_col, IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-color", NULL, "blue"); + ippAddString(media_col, IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-type", NULL, "stationery"); + + ippAddCollection(request, IPP_TAG_JOB, "media-col", media_col); + ippDelete(media_col); + + data.wused = 0; + data.wsize = sizeof(buffer); + data.wbuffer = buffer; + + while ((state = ippWriteIO(&data, (ipp_iocb_t)write_cb, 1, NULL, request)) != IPP_STATE_DATA) + { + if (state == IPP_STATE_ERROR) + break; + } + + if (state != IPP_STATE_DATA) + { + puts("Failed to create base IPP message."); + return (1); + } + + ippDelete(request); + + // Now iterate 1000 times and test the fuzzed request... + for (i = 0; i < 1000; i ++) + { + fuzzdata(&data); + + snprintf(filename, sizeof(filename), "fuzz-%03d.ipp", i); + if ((fp = cupsFileOpen(filename, "w")) == NULL) + { + perror(filename); + return (1); + } + + cupsFileWrite(fp, (char *)buffer, data.wused); + cupsFileClose(fp); + + printf("%s: ", filename); + fflush(stdout); + + fuzz_args[0] = argv[0]; + fuzz_args[1] = filename; + fuzz_args[2] = NULL; + + if (posix_spawn(&fuzz_pid, argv[0], NULL, NULL, (char * const *)fuzz_args, NULL)) + { + puts("FAIL"); + perror(argv[0]); + unlink(filename); + return (1); + } + + while (waitpid(fuzz_pid, &fuzz_status, 0) < 0) + { + if (errno != EINTR && errno != EAGAIN) + { + puts("FAIL"); + perror(argv[0]); + unlink(filename); + return (1); + } + } + + if (fuzz_status) + { + puts("FAIL"); + hex_dump(buffer, data.wused); + unlink(filename); + return (1); + } + + puts("PASS"); + unlink(filename); + } + } + else + { + // Read an IPP file... + cups_file_t *fp; // File pointer + + if ((fp = cupsFileOpen(argv[1], "r")) == NULL) + { + perror(argv[1]); + return (1); + } + + request = ippNew(); + do + { + state = ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, request); + } + while (state == IPP_STATE_ATTRIBUTE); + + cupsFileClose(fp); + + fp = cupsFileOpen("/dev/null", "w"); + + ippSetState(request, IPP_STATE_IDLE); + + do + { + state = ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, request); + } + while (state == IPP_STATE_ATTRIBUTE); + + cupsFileClose(fp); + ippDelete(request); + } + + return (0); +} + + +// +// 'fuzzdata()' - Mutate a buffer for fuzzing purposes... +// + +void +fuzzdata(_ippdata_t *data) // I - Data buffer +{ + int i, // Looping vars + pos, // Position in buffer + pos2, // Second position in buffer + len; // Number of bytes + ipp_uchar_t temp[16]; // Temporary buffer + + + // Mutate a few times... + for (i = 0; i < 32; i ++) + { + // Each cycle replace or swap bytes + switch ((len = CUPS_RAND() & 7)) + { + case 0 : + case 1 : + case 2 : + case 3 : + case 4 : + case 5 : + case 6 : + // Replace bytes + len ++; + pos = CUPS_RAND() % (data->wused - len); + while (len > 0) + { + data->wbuffer[pos ++] = CUPS_RAND(); + len --; + } + break; + + case 7 : + // Swap bytes + len = (CUPS_RAND() & 7) + 1; + pos = CUPS_RAND() % (data->wused - len); + pos2 = CUPS_RAND() % (data->wused - len); + memmove(temp, data->wbuffer + pos, len); + memmove(data->wbuffer + pos, data->wbuffer + pos2, len); + memmove(data->wbuffer + pos2, temp, len); + break; + } + } +} + + +// +// 'hex_dump()' - Produce a hex dump of a buffer. +// + +void +hex_dump(ipp_uchar_t *buffer, // I - Buffer to dump + size_t bytes) // I - Number of bytes +{ + size_t i, j; // Looping vars + int ch; // Current ASCII char + + + /* + * Show lines of 16 bytes at a time... + */ + + for (i = 0; i < bytes; i += 16) + { + /* + * Show the offset... + */ + + printf("%04x ", (unsigned)i); + + /* + * Then up to 16 bytes in hex... + */ + + for (j = 0; j < 16; j ++) + if ((i + j) < bytes) + printf(" %02x", buffer[i + j]); + else + printf(" "); + + /* + * Then the ASCII representation of the bytes... + */ + + putchar(' '); + putchar(' '); + + for (j = 0; j < 16 && (i + j) < bytes; j ++) + { + ch = buffer[i + j] & 127; + + if (ch < ' ' || ch == 127) + putchar('.'); + else + putchar(ch); + } + + putchar('\n'); + } +} + + +/* + * 'write_cb()' - Write data into a buffer. + */ + +ssize_t /* O - Number of bytes written */ +write_cb(_ippdata_t *data, /* I - Data */ + ipp_uchar_t *buffer, /* I - Buffer to write */ + size_t bytes) /* I - Number of bytes to write */ +{ + size_t count; /* Number of bytes */ + + + /* + * Loop until all bytes are written... + */ + + if ((count = data->wsize - data->wused) > bytes) + count = bytes; + + memcpy(data->wbuffer + data->wused, buffer, count); + data->wused += count; + + /* + * Return the number of bytes written... + */ + + return ((ssize_t)count); +} diff -Nru cups-2.3.3op2/cups/getdevices.c cups-2.4.1op1/cups/getdevices.c --- cups-2.3.3op2/cups/getdevices.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/getdevices.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,9 +1,11 @@ /* * cupsGetDevices implementation for CUPS. * - * Copyright 2008-2016 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2008-2016 by Apple Inc. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -129,7 +131,7 @@ } } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* @@ -141,7 +143,7 @@ if (!httpReconnect2(http, 30000, NULL)) httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } } while (status == HTTP_STATUS_UNAUTHORIZED || @@ -246,20 +248,14 @@ httpBlocking(http, blocking); httpFlush(http); - if (status == HTTP_STATUS_ERROR) - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(http->error), 0); - else - { - attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT); + attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT); - DEBUG_printf(("cupsGetDevices: status-code=%s, status-message=\"%s\"", - ippErrorString(response->request.status.status_code), - attr ? attr->values[0].string.text : "")); - - _cupsSetError(response->request.status.status_code, - attr ? attr->values[0].string.text : - ippErrorString(response->request.status.status_code), 0); - } + DEBUG_printf(("cupsGetDevices: status-code=%s, status-message=\"%s\"", + ippErrorString(response->request.status.status_code), + attr ? attr->values[0].string.text : "")); + + _cupsSetError(response->request.status.status_code, + attr ? attr->values[0].string.text : ippErrorString(response->request.status.status_code), 0); ippDelete(response); diff -Nru cups-2.3.3op2/cups/getifaddrs-internal.h cups-2.4.1op1/cups/getifaddrs-internal.h --- cups-2.3.3op2/cups/getifaddrs-internal.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/getifaddrs-internal.h 2022-01-27 11:11:42.000000000 +0000 @@ -16,6 +16,7 @@ */ # include "config.h" +# include "versioning.h" # ifdef _WIN32 # define _WINSOCK_DEPRECATED_NO_WARNINGS 1 # include diff -Nru cups-2.3.3op2/cups/getputfile.c cups-2.4.1op1/cups/getputfile.c --- cups-2.3.3op2/cups/getputfile.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/getputfile.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,9 @@ /* * Get/put file functions for CUPS. * - * Copyright 2007-2018 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2018 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. @@ -156,7 +157,7 @@ continue; } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ @@ -175,7 +176,7 @@ /* Try again, this time with encryption enabled... */ continue; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED); @@ -465,7 +466,7 @@ continue; } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ @@ -484,7 +485,7 @@ /* Try again, this time with encryption enabled... */ continue; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED || (status == HTTP_STATUS_ERROR && retries < 2)); diff -Nru cups-2.3.3op2/cups/globals.c cups-2.4.1op1/cups/globals.c --- cups-2.3.3op2/cups/globals.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/globals.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Global variable access routines for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -273,7 +274,7 @@ if ((cg->localedir = getenv("LOCALEDIR")) == NULL) cg->localedir = localedir; - cg->home = getenv("HOME"); + cg->home = getenv("USERPROFILE"); #else # ifdef HAVE_GETEUID @@ -324,10 +325,12 @@ if (!cg->home) { - struct passwd *pw; /* User info */ + struct passwd pw; /* User info */ + struct passwd *result; /* Auxiliary pointer */ - if ((pw = getpwuid(getuid())) != NULL) - cg->home = _cupsStrAlloc(pw->pw_dir); + getpwuid_r(getuid(), &pw, cg->pw_buf, PW_BUF_SIZE, &result); + if (result) + cg->home = _cupsStrAlloc(pw.pw_dir); } #endif /* _WIN32 */ @@ -362,9 +365,9 @@ httpClose(cg->http); -#ifdef HAVE_SSL +#ifdef HAVE_TLS _httpFreeCredentials(cg->tls_credentials); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ cupsFileClose(cg->stdio_files[0]); cupsFileClose(cg->stdio_files[1]); diff -Nru cups-2.3.3op2/cups/hash.c cups-2.4.1op1/cups/hash.c --- cups-2.3.3op2/cups/hash.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/hash.c 2022-01-27 11:11:42.000000000 +0000 @@ -12,11 +12,15 @@ */ #include "cups-private.h" +#include "debug-internal.h" #ifdef __APPLE__ # include #elif defined(HAVE_GNUTLS) # include # include "md5-internal.h" +#elif _WIN32 +# include +# include #else # include "md5-internal.h" #endif /* __APPLE__ */ @@ -85,6 +89,7 @@ return (CC_SHA1_DIGEST_LENGTH); } +# ifdef CC_SHA224_DIGEST_LENGTH else if (!strcmp(algorithm, "sha2-224")) { CC_SHA256_CTX ctx; /* SHA-224 context */ @@ -98,6 +103,7 @@ return (CC_SHA224_DIGEST_LENGTH); } +# endif /* CC_SHA224_DIGEST_LENGTH */ else if (!strcmp(algorithm, "sha2-256")) { CC_SHA256_CTX ctx; /* SHA-256 context */ @@ -137,6 +143,7 @@ return (CC_SHA512_DIGEST_LENGTH); } +# ifdef CC_SHA224_DIGEST_LENGTH else if (!strcmp(algorithm, "sha2-512_224")) { CC_SHA512_CTX ctx; /* SHA-512 context */ @@ -158,6 +165,7 @@ return (CC_SHA224_DIGEST_LENGTH); } +# endif /* CC_SHA224_DIGEST_LENGTH */ else if (!strcmp(algorithm, "sha2-512_256")) { CC_SHA512_CTX ctx; /* SHA-512 context */ @@ -250,9 +258,101 @@ return ((ssize_t)gnutls_hash_get_len(alg)); } +#elif _WIN32 + // Use Windows CNG APIs to perform hashing... + BCRYPT_ALG_HANDLE alg; // Algorithm handle + LPCWSTR algid = NULL; // Algorithm ID + ssize_t hashlen; // Hash length + NTSTATUS status; // Status of hash + unsigned char temp[64]; // Temporary hash buffer + size_t tempsize = 0; // Truncate to this size? + + + if (!strcmp(algorithm, "md5")) + { + algid = BCRYPT_MD5_ALGORITHM; + hashlen = 16; + } + else if (!strcmp(algorithm, "sha")) + { + algid = BCRYPT_SHA1_ALGORITHM; + hashlen = 20; + } + else if (!strcmp(algorithm, "sha2-256")) + { + algid = BCRYPT_SHA256_ALGORITHM; + hashlen = 32; + } + else if (!strcmp(algorithm, "sha2-384")) + { + algid = BCRYPT_SHA384_ALGORITHM; + hashlen = 48; + } + else if (!strcmp(algorithm, "sha2-512")) + { + algid = BCRYPT_SHA512_ALGORITHM; + hashlen = 64; + } + else if (!strcmp(algorithm, "sha2-512_224")) + { + algid = BCRYPT_SHA512_ALGORITHM; + hashlen = tempsize = 28; + } + else if (!strcmp(algorithm, "sha2-512_256")) + { + algid = BCRYPT_SHA512_ALGORITHM; + hashlen = tempsize = 32; + } + + if (algid) + { + if (hashsize < (size_t)hashlen) + goto too_small; + + if ((status = BCryptOpenAlgorithmProvider(&alg, algid, NULL, 0)) < 0) + { + DEBUG_printf(("2cupsHashData: BCryptOpenAlgorithmProvider returned %d.", status)); + + if (status == STATUS_INVALID_PARAMETER) + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad algorithm parameter."), 1); + else + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to access cryptographic provider."), 1); + + return (-1); + } + + if (tempsize > 0) + { + // Do a truncated SHA2-512 hash... + status = BCryptHash(alg, NULL, 0, (PUCHAR)data, (ULONG)datalen, temp, sizeof(temp)); + memcpy(hash, temp, hashlen); + } + else + { + // Hash directly to buffer... + status = BCryptHash(alg, NULL, 0, (PUCHAR)data, (ULONG)datalen, hash, (ULONG)hashlen); + } + + BCryptCloseAlgorithmProvider(alg, 0); + + if (status < 0) + { + DEBUG_printf(("2cupsHashData: BCryptHash returned %d.", status)); + + if (status == STATUS_INVALID_PARAMETER) + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad hashing parameter."), 1); + else + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Hashing failed."), 1); + + return (-1); + } + + return (hashlen); + } + #else /* - * No hash support beyond MD5 without CommonCrypto or GNU TLS... + * No hash support beyond MD5 without CommonCrypto, GNU TLS, or CNG... */ if (!strcmp(algorithm, "md5")) diff -Nru cups-2.3.3op2/cups/http-addr.c cups-2.4.1op1/cups/http-addr.c --- cups-2.3.3op2/cups/http-addr.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/http-addr.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,8 @@ /* * HTTP address routines for CUPS. * - * Copyright 2007-2019 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * Copyright © 2007-2021 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. @@ -170,6 +170,12 @@ return (-1); /* + * Make sure the network stack is initialized... + */ + + httpInitialize(); + + /* * Create the socket and set options... */ diff -Nru cups-2.3.3op2/cups/http-addrlist.c cups-2.4.1op1/cups/http-addrlist.c --- cups-2.3.3op2/cups/http-addrlist.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/http-addrlist.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,9 @@ /* * HTTP address list routines for CUPS. * - * Copyright 2007-2018 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2021 by Apple Inc. + * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. @@ -100,6 +101,8 @@ if (cancel && *cancel) return (NULL); + httpInitialize(); + if (msec <= 0) msec = INT_MAX; @@ -337,6 +340,18 @@ else if (FD_ISSET(fds[i], &error_set)) # endif /* HAVE_POLL */ { +# ifdef __sun + // Solaris incorrectly returns errors when you poll() a socket that is + // still connecting. This check prevents us from removing the socket + // from the pool if the "error" is EINPROGRESS... + int sockerr; // Current error on socket + socklen_t socklen = sizeof(sockerr); + // Size of error variable + + if (!getsockopt(fds[i], SOL_SOCKET, SO_ERROR, &sockerr, &socklen) && (!sockerr || sockerr == EINPROGRESS)) + continue; // Not an error +# endif // __sun + /* * Error on socket, remove from the "pool"... */ @@ -486,6 +501,9 @@ http_addrlist_t *first, /* First address in list */ *addr, /* Current address in list */ *temp; /* New address */ + char ipv6[64], /* IPv6 address */ + *ipv6zone; /* Pointer to zone separator */ + int ipv6len; /* Length of IPv6 address */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ @@ -504,6 +522,8 @@ family == AF_INET ? "INET" : "???", service); #endif /* DEBUG */ + httpInitialize(); + #ifdef HAVE_RES_INIT /* * STR #2920: Initialize resolver after failure in cups-polld @@ -553,9 +573,6 @@ struct addrinfo hints, /* Address lookup hints */ *results, /* Address lookup results */ *current; /* Current result */ - char ipv6[64], /* IPv6 address */ - *ipv6zone; /* Pointer to zone separator */ - int ipv6len; /* Length of IPv6 address */ int error; /* getaddrinfo() error */ diff -Nru cups-2.3.3op2/cups/http-support.c cups-2.4.1op1/cups/http-support.c --- cups-2.3.3op2/cups/http-support.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/http-support.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * HTTP support routines for CUPS. * - * Copyright © 2020 by Michael R Sweet + * Copyright © 2020-2022 by OpenPrinting * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -15,7 +15,7 @@ #include "cups-private.h" #include "debug-internal.h" -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER # include # ifdef _WIN32 # include @@ -29,7 +29,7 @@ # include # include # include -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ /* @@ -110,7 +110,7 @@ static char *http_copy_encode(char *dst, const char *src, char *dstend, const char *reserved, const char *term, int encode); -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER static void DNSSD_API http_resolve_cb(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, @@ -120,7 +120,7 @@ uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI static void http_client_cb(AvahiClient *client, @@ -1430,6 +1430,12 @@ * Use old RFC 2069 Digest method... */ + if (cg->digestoptions == _CUPS_DIGESTOPTIONS_DENYMD5) + { + DEBUG_puts("3_httpSetDigestAuthString: MD5 Digest is disabled."); + return (0); + } + /* H(A1) = H(username:realm:password) */ snprintf(temp, sizeof(temp), "%s:%s:%s", username, http->realm, password); hashsize = (size_t)cupsHashData("md5", (unsigned char *)temp, strlen(temp), hash, sizeof(hash)); @@ -1770,14 +1776,14 @@ if (strstr(hostname, "._tcp")) { -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD char *regtype, /* Pointer to type 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 +# ifdef HAVE_MDNSRESPONDER DNSServiceRef ref, /* DNS-SD master service reference */ domainref = NULL,/* DNS-SD service reference for domain */ ippref = NULL, /* DNS-SD service reference for network IPP */ @@ -1793,7 +1799,7 @@ # elif defined(HAVE_AVAHI) AvahiClient *client; /* Client information */ int error; /* Status */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ if (options & _HTTP_RESOLVE_STDERR) fprintf(stderr, "DEBUG: Resolving \"%s\"...\n", hostname); @@ -1857,7 +1863,7 @@ uri = NULL; -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER if (DNSServiceCreateConnection(&ref) == kDNSServiceErr_NoError) { uint32_t myinterface = kDNSServiceInterfaceIndexAny; @@ -2080,7 +2086,7 @@ avahi_simple_poll_free(uribuf.poll); } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ if (options & _HTTP_RESOLVE_STDERR) { @@ -2096,13 +2102,13 @@ } } -#else /* HAVE_DNSSD || HAVE_AVAHI */ +#else /* !HAVE_DNSSD */ /* * No DNS-SD support... */ uri = NULL; -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ if ((options & _HTTP_RESOLVE_STDERR) && !uri) _cupsLangPrintFilter(stderr, "INFO", _("Unable to find printer.")); @@ -2274,7 +2280,7 @@ } -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER /* * 'http_resolve_cb()' - Build a device URI for the given service name. */ @@ -2565,15 +2571,6 @@ * Figure out the scheme from the full name... */ - if (strstr(type, "_ipp.")) - scheme = "ipp"; - else if (strstr(type, "_printer.")) - scheme = "lpd"; - else if (strstr(type, "_pdl-datastream.")) - scheme = "socket"; - else - scheme = "riousbprint"; - if (!strncmp(type, "_ipps.", 6) || !strncmp(type, "_ipp-tls.", 9)) scheme = "ipps"; else if (!strncmp(type, "_ipp.", 5) || !strncmp(type, "_fax-ipp.", 9)) @@ -2722,4 +2719,4 @@ avahi_simple_poll_quit(uribuf->poll); } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ diff -Nru cups-2.3.3op2/cups/http.c cups-2.4.1op1/cups/http.c --- cups-2.3.3op2/cups/http.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/http.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * HTTP routines for CUPS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * This file contains Kerberos support code, copyright 2006 by @@ -65,9 +66,9 @@ static void http_set_timeout(int fd, double timeout); static void http_set_wait(http_t *http); -#ifdef HAVE_SSL +#ifdef HAVE_TLS static int http_tls_upgrade(http_t *http); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* @@ -106,7 +107,19 @@ "Accept-Encoding", "Allow", "Server", - "Authentication-Info" + "Authentication-Info", + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Origin", + "Access-Control-Expose-Headers", + "Access-Control-Max-Age", + "Access-Control-Request-Headers", + "Access-Control-Request-Method", + "Optional-WWW-Authenticate", + "Origin", + "OSCORE", + "Strict-Transport-Security" }; @@ -506,10 +519,10 @@ void _httpDisconnect(http_t *http) /* I - HTTP connection */ { -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->tls) _httpTLSStop(http); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ httpAddrClose(NULL, http->fd); @@ -527,7 +540,7 @@ { DEBUG_printf(("httpEncryption(http=%p, e=%d)", (void *)http, e)); -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (!http) return (0); @@ -559,7 +572,7 @@ return (-1); else return (0); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } @@ -654,10 +667,10 @@ http->state = HTTP_STATE_WAITING; -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->tls) _httpTLSStop(http); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ httpAddrClose(NULL, http->fd); @@ -1009,7 +1022,7 @@ off_t remaining; /* Remaining length */ - DEBUG_printf(("2httpGetLength2(http=%p), state=%s", (void *)http, httpStateString(http->state))); + DEBUG_printf(("2httpGetLength2(http=%p), state=%s", (void *)http, http ? httpStateString(http->state) : "NONE")); if (!http) return (-1); @@ -1086,10 +1099,10 @@ return (0); else if (http->used > 0) return ((size_t)http->used); -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (http->tls) return (_httpTLSPending(http)); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ return (0); } @@ -1528,9 +1541,9 @@ # endif /* !SO_NOSIGPIPE */ #endif /* _WIN32 */ -# ifdef HAVE_SSL +# ifdef HAVE_TLS _httpTLSInitialize(); -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ initialized = 1; _cupsGlobalUnlock(); @@ -1940,9 +1953,9 @@ #ifdef HAVE_LIBZ - DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ") coding=%d data_encoding=%d data_remaining=" CUPS_LLFMT, (void *)http, (void *)buffer, CUPS_LLCAST length, http->coding, http->data_encoding, CUPS_LLCAST http->data_remaining)); + DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ") coding=%d data_encoding=%d data_remaining=" CUPS_LLFMT, (void *)http, (void *)buffer, CUPS_LLCAST length, http ? http->coding : 0, http ? http->data_encoding : 0, CUPS_LLCAST (http ? http->data_remaining : -1))); #else - DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ") data_encoding=%d data_remaining=" CUPS_LLFMT, (void *)http, (void *)buffer, CUPS_LLCAST length, http->data_encoding, CUPS_LLCAST http->data_remaining)); + DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ") data_encoding=%d data_remaining=" CUPS_LLFMT, (void *)http, (void *)buffer, CUPS_LLCAST length, http ? http->data_encoding : 0, CUPS_LLCAST (http ? http->data_remaining : -1))); #endif /* HAVE_LIBZ */ if (http == NULL || buffer == NULL) @@ -2337,13 +2350,13 @@ return (-1); } -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->tls) { DEBUG_puts("2httpReconnect2: Shutting down SSL/TLS..."); _httpTLSStop(http); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Close any previously open socket... @@ -2411,7 +2424,7 @@ http->hostaddr = &(addr->addr); http->error = 0; -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->encryption == HTTP_ENCRYPTION_ALWAYS) { /* @@ -2421,13 +2434,14 @@ if (_httpTLSStart(http) != 0) { httpAddrClose(NULL, http->fd); + http->fd = -1; return (-1); } } else if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls_upgrade) return (http_tls_upgrade(http)); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ DEBUG_printf(("1httpReconnect2: Connected to %s:%d...", httpAddrString(http->hostaddr, temp, sizeof(temp)), @@ -2513,11 +2527,11 @@ if (!http || cupsArrayCount(credentials) < 1) return (-1); -#ifdef HAVE_SSL +#ifdef HAVE_TLS _httpFreeCredentials(http->tls_credentials); http->tls_credentials = _httpCreateCredentials(credentials); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ return (http->tls_credentials ? 0 : -1); } @@ -2702,10 +2716,10 @@ if (!http || http->fd < 0) return; -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->tls) _httpTLSStop(http); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ #ifdef _WIN32 shutdown(http->fd, SD_RECEIVE); /* Microsoft-ism... */ @@ -2780,12 +2794,13 @@ if (http->status < HTTP_STATUS_BAD_REQUEST) http->digest_tries = 0; -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->status == HTTP_STATUS_SWITCHING_PROTOCOLS && !http->tls) { if (_httpTLSStart(http) != 0) { httpAddrClose(NULL, http->fd); + http->fd = -1; *status = http->status = HTTP_STATUS_ERROR; return (0); @@ -2794,7 +2809,7 @@ *status = HTTP_STATUS_CONTINUE; return (0); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ if (http_set_length(http) < 0) { @@ -3003,13 +3018,13 @@ * Check the SSL/TLS buffers for data first... */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->tls && _httpTLSPending(http)) { DEBUG_puts("5_httpWait: Return 1 since there is pending TLS data."); return (1); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Then try doing a select() or poll() to poll the socket... @@ -3375,7 +3390,7 @@ httpSetField(http, HTTP_FIELD_KEEP_ALIVE, "timeout=10"); } -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (status == HTTP_STATUS_UPGRADE_REQUIRED || status == HTTP_STATUS_SWITCHING_PROTOCOLS) { @@ -3388,7 +3403,7 @@ if (!http->fields[HTTP_FIELD_CONTENT_LENGTH]) httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, "0"); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ if (!http->fields[HTTP_FIELD_SERVER]) httpSetField(http, HTTP_FIELD_SERVER, http->default_fields[HTTP_FIELD_SERVER] ? http->default_fields[HTTP_FIELD_SERVER] : CUPS_MINIMAL); @@ -3553,7 +3568,9 @@ const char *value, /* I - Value string */ int append) /* I - Append value? */ { - char temp[1024]; /* Temporary value string */ + char temp[1024], /* Temporary value string */ + combined[HTTP_MAX_VALUE]; + /* Combined value string */ size_t fieldlen, /* Length of existing value */ valuelen, /* Length of value string */ total; /* Total length of string */ @@ -3610,7 +3627,8 @@ if (!valuelen) { - http->_fields[field][0] = '\0'; + if (field < HTTP_FIELD_ACCEPT_ENCODING) + http->_fields[field][0] = '\0'; return; } @@ -3634,9 +3652,6 @@ if (fieldlen) { - char combined[HTTP_MAX_VALUE]; - /* Combined value string */ - snprintf(combined, sizeof(combined), "%s, %s", http->_fields[field], value); value = combined; } @@ -3650,21 +3665,21 @@ * Expand the field value... */ - char *combined; /* New value string */ + char *mcombined; /* New value string */ if (http->fields[field] == http->_fields[field]) { - if ((combined = malloc(total + 1)) != NULL) + if ((mcombined = malloc(total + 1)) != NULL) { - http->fields[field] = combined; - snprintf(combined, total + 1, "%s, %s", http->_fields[field], value); + http->fields[field] = mcombined; + snprintf(mcombined, total + 1, "%s, %s", http->_fields[field], value); } } - else if ((combined = realloc(http->fields[field], total + 1)) != NULL) + else if ((mcombined = realloc(http->fields[field], total + 1)) != NULL) { - http->fields[field] = combined; - strlcat(combined, ", ", total + 1); - strlcat(combined, value, total + 1); + http->fields[field] = mcombined; + strlcat(mcombined, ", ", total + 1); + strlcat(mcombined, value, total + 1); } } else @@ -4027,9 +4042,9 @@ if (_cups_debug_fd < 0 || _cups_debug_level < 6) return; - DEBUG_printf(("6%s: %d bytes:", prefix, bytes)); + DEBUG_printf(("9%s: %d bytes:", prefix, bytes)); - snprintf(line, sizeof(line), "6%s: ", prefix); + snprintf(line, sizeof(line), "9%s: ", prefix); start = line + strlen(line); for (i = 0; i < bytes; i += 16) @@ -4079,7 +4094,7 @@ ssize_t bytes; /* Bytes read */ - DEBUG_printf(("http_read(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); + DEBUG_printf(("7http_read(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); if (!http->blocking || http->timeout_value > 0.0) { @@ -4088,20 +4103,20 @@ if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) continue; - DEBUG_puts("2http_read: Timeout."); + DEBUG_puts("8http_read: Timeout."); return (0); } } - DEBUG_printf(("2http_read: Reading %d bytes into buffer.", (int)length)); + DEBUG_printf(("8http_read: Reading %d bytes into buffer.", (int)length)); do { -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->tls) bytes = _httpTLSRead(http, buffer, (int)length); else -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ bytes = recv(http->fd, buffer, length, 0); if (bytes < 0) @@ -4122,7 +4137,7 @@ } } #else - DEBUG_printf(("2http_read: %s", strerror(errno))); + DEBUG_printf(("8http_read: %s", strerror(errno))); if (errno == EWOULDBLOCK || errno == EAGAIN) { @@ -4147,28 +4162,13 @@ } while (bytes < 0); - DEBUG_printf(("2http_read: Read " CUPS_LLFMT " bytes into buffer.", - CUPS_LLCAST bytes)); + DEBUG_printf(("8http_read: Read " CUPS_LLFMT " bytes into buffer.", CUPS_LLCAST bytes)); #ifdef DEBUG if (bytes > 0) http_debug_hex("http_read", buffer, (int)bytes); + else #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) + if (bytes == 0) { http->error = EPIPE; return (0); @@ -4192,7 +4192,7 @@ ssize_t bytes; /* Bytes read */ - DEBUG_printf(("http_read_buffered(http=%p, buffer=%p, length=" CUPS_LLFMT ") used=%d", (void *)http, (void *)buffer, CUPS_LLCAST length, http->used)); + DEBUG_printf(("7http_read_buffered(http=%p, buffer=%p, length=" CUPS_LLFMT ") used=%d", (void *)http, (void *)buffer, CUPS_LLCAST length, http->used)); if (http->used > 0) { @@ -4201,7 +4201,7 @@ else bytes = (ssize_t)length; - DEBUG_printf(("2http_read: Grabbing %d bytes from input buffer.", + DEBUG_printf(("8http_read: Grabbing %d bytes from input buffer.", (int)bytes)); memcpy(buffer, http->buffer, (size_t)bytes); @@ -4229,7 +4229,7 @@ char *buffer, /* I - Buffer */ size_t length) /* I - Maximum bytes to read */ { - DEBUG_printf(("http_read_chunk(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); + DEBUG_printf(("7http_read_chunk(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); if (http->data_remaining <= 0) { @@ -4237,16 +4237,16 @@ if (!httpGets(len, sizeof(len), http)) { - DEBUG_puts("1http_read_chunk: Could not get chunk length."); + DEBUG_puts("8http_read_chunk: Could not get chunk length."); return (0); } if (!len[0]) { - DEBUG_puts("1http_read_chunk: Blank chunk length, trying again..."); + DEBUG_puts("8http_read_chunk: Blank chunk length, trying again..."); if (!httpGets(len, sizeof(len), http)) { - DEBUG_puts("1http_read_chunk: Could not get chunk length."); + DEBUG_puts("8http_read_chunk: Could not get chunk length."); return (0); } } @@ -4255,12 +4255,12 @@ if (http->data_remaining < 0) { - DEBUG_printf(("1http_read_chunk: Negative chunk length \"%s\" (" + DEBUG_printf(("8http_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 ")", + DEBUG_printf(("8http_read_chunk: Got chunk length \"%s\" (" CUPS_LLFMT ")", len, CUPS_LLCAST http->data_remaining)); if (http->data_remaining == 0) @@ -4273,7 +4273,7 @@ } } - DEBUG_printf(("2http_read_chunk: data_remaining=" CUPS_LLFMT, + DEBUG_printf(("8http_read_chunk: data_remaining=" CUPS_LLFMT, CUPS_LLCAST http->data_remaining)); if (http->data_remaining <= 0) @@ -4384,13 +4384,13 @@ http->status = HTTP_STATUS_CONTINUE; -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls) { httpSetField(http, HTTP_FIELD_CONNECTION, "Upgrade"); httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0"); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ if (httpPrintf(http, "%s %s HTTP/1.1\r\n", codes[request], buf) < 1) { @@ -4399,14 +4399,19 @@ } for (i = 0; i < HTTP_FIELD_MAX; i ++) + { if ((value = httpGetField(http, i)) != NULL && *value) { DEBUG_printf(("5http_send: %s: %s", http_fields[i], value)); if (i == HTTP_FIELD_HOST) { - if (httpPrintf(http, "Host: %s:%d\r\n", value, - httpAddrPort(http->hostaddr)) < 1) + // Issue #185: Use "localhost" for the loopback addresses to work + // around an Avahi bug... + if (httpAddrLocalhost(http->hostaddr)) + value = "localhost"; + + if (httpPrintf(http, "Host: %s:%d\r\n", value, httpAddrPort(http->hostaddr)) < 1) { http->status = HTTP_STATUS_ERROR; return (-1); @@ -4418,6 +4423,7 @@ return (-1); } } + } if (http->cookie) if (httpPrintf(http, "Cookie: $Version=0; %s\r\n", http->cookie) < 1) @@ -4480,7 +4486,7 @@ off_t remaining; /* Remainder */ - DEBUG_printf(("http_set_length(http=%p) mode=%d state=%s", (void *)http, http->mode, httpStateString(http->state))); + DEBUG_printf(("4http_set_length(http=%p) mode=%d state=%s", (void *)http, http->mode, httpStateString(http->state))); if ((remaining = httpGetLength2(http)) >= 0) { @@ -4490,25 +4496,22 @@ http->state != HTTP_STATE_POST && http->state != HTTP_STATE_POST_SEND) { - DEBUG_puts("1http_set_length: Not setting data_encoding/remaining."); + DEBUG_puts("5http_set_length: Not setting data_encoding/remaining."); return (remaining); } if (!_cups_strcasecmp(httpGetField(http, HTTP_FIELD_TRANSFER_ENCODING), "chunked")) { - DEBUG_puts("1http_set_length: Setting data_encoding to " - "HTTP_ENCODING_CHUNKED."); + DEBUG_puts("5http_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."); + DEBUG_puts("5http_set_length: Setting data_encoding to HTTP_ENCODING_LENGTH."); http->data_encoding = HTTP_ENCODING_LENGTH; } - DEBUG_printf(("1http_set_length: Setting data_remaining to " CUPS_LLFMT ".", - CUPS_LLCAST remaining)); + DEBUG_printf(("5http_set_length: Setting data_remaining to " CUPS_LLFMT ".", CUPS_LLCAST remaining)); http->data_remaining = remaining; if (remaining <= INT_MAX) @@ -4566,7 +4569,7 @@ } -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * 'http_tls_upgrade()' - Force upgrade to TLS encryption. */ @@ -4578,7 +4581,7 @@ http_t myhttp; /* Local copy of HTTP data */ - DEBUG_printf(("7http_tls_upgrade(%p)", (void *)http)); + DEBUG_printf(("4http_tls_upgrade(%p)", (void *)http)); /* * Flush the connection to make sure any previous "Upgrade" message @@ -4624,6 +4627,7 @@ * Restore the HTTP request data... */ + httpClearFields(http); memcpy(http->_fields, myhttp._fields, sizeof(http->_fields)); memcpy(http->fields, myhttp.fields, sizeof(http->fields)); @@ -4644,7 +4648,7 @@ * Server does not support HTTP upgrade... */ - DEBUG_puts("8http_tls_upgrade: Server does not support HTTP upgrade!"); + DEBUG_puts("5http_tls_upgrade: Server does not support HTTP upgrade!"); _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, _("Encryption is not supported."), 1); httpAddrClose(NULL, http->fd); @@ -4656,7 +4660,7 @@ else return (ret); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* @@ -4672,13 +4676,13 @@ bytes; /* Bytes sent */ - DEBUG_printf(("2http_write(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); + DEBUG_printf(("7http_write(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length)); http->error = 0; tbytes = 0; while (length > 0) { - DEBUG_printf(("3http_write: About to write %d bytes.", (int)length)); + DEBUG_printf(("8http_write: About to write %d bytes.", (int)length)); if (http->timeout_value > 0.0) { @@ -4737,15 +4741,14 @@ while (nfds <= 0); } -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (http->tls) bytes = _httpTLSWrite(http, buffer, (int)length); else -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ bytes = send(http->fd, buffer, length, 0); - DEBUG_printf(("3http_write: Write of " CUPS_LLFMT " bytes returned " - CUPS_LLFMT ".", CUPS_LLCAST length, CUPS_LLCAST bytes)); + DEBUG_printf(("8http_write: Write of " CUPS_LLFMT " bytes returned " CUPS_LLFMT ".", CUPS_LLCAST length, CUPS_LLCAST bytes)); if (bytes < 0) { @@ -4785,8 +4788,7 @@ } #endif /* _WIN32 */ - DEBUG_printf(("3http_write: error writing data (%s).", - strerror(http->error))); + DEBUG_printf(("8http_write: error writing data (%s).", strerror(http->error))); return (-1); } @@ -4800,7 +4802,7 @@ http_debug_hex("http_write", buffer - tbytes, (int)tbytes); #endif /* DEBUG */ - DEBUG_printf(("3http_write: Returning " CUPS_LLFMT ".", CUPS_LLCAST tbytes)); + DEBUG_printf(("8http_write: Returning " CUPS_LLFMT ".", CUPS_LLCAST tbytes)); return (tbytes); } diff -Nru cups-2.3.3op2/cups/http.h cups-2.4.1op1/cups/http.h --- cups-2.3.3op2/cups/http.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/http.h 2022-01-27 11:11:42.000000000 +0000 @@ -23,8 +23,8 @@ # ifdef _WIN32 # ifndef __CUPS_SSIZE_T_DEFINED # define __CUPS_SSIZE_T_DEFINED -/* Windows does not support the ssize_t type, so map it to off_t... */ -typedef off_t ssize_t; /* @private@ */ +/* Windows does not support the ssize_t type, so map it to __int64... */ +typedef __int64 ssize_t; /* @private@ */ # endif /* !__CUPS_SSIZE_T_DEFINED */ # include # include @@ -176,7 +176,26 @@ HTTP_FIELD_ACCEPT_ENCODING, /* Accepting-Encoding field @since CUPS 1.7/macOS 10.9@ */ HTTP_FIELD_ALLOW, /* Allow field @since CUPS 1.7/macOS 10.9@ */ HTTP_FIELD_SERVER, /* Server field @since CUPS 1.7/macOS 10.9@ */ - HTTP_FIELD_AUTHENTICATION_INFO, /* Authentication-Info field (@since CUPS 2.2.9) */ + HTTP_FIELD_AUTHENTICATION_INFO, /* Authentication-Info field @since CUPS 2.2.9@ */ + HTTP_FIELD_ACCESS_CONTROL_ALLOW_CREDENTIALS, + /* CORS/Fetch Access-Control-Allow-Cresdentials field @since CUPS 2.4@ */ + HTTP_FIELD_ACCESS_CONTROL_ALLOW_HEADERS, + /* CORS/Fetch Access-Control-Allow-Headers field @since CUPS 2.4@ */ + HTTP_FIELD_ACCESS_CONTROL_ALLOW_METHODS, + /* CORS/Fetch Access-Control-Allow-Methods field @since CUPS 2.4@ */ + HTTP_FIELD_ACCESS_CONTROL_ALLOW_ORIGIN, + /* CORS/Fetch Access-Control-Allow-Origin field @since CUPS 2.4@ */ + HTTP_FIELD_ACCESS_CONTROL_EXPOSE_HEADERS, + /* CORS/Fetch Access-Control-Expose-Headers field @since CUPS 2.4@ */ + HTTP_FIELD_ACCESS_CONTROL_MAX_AGE, /* CORS/Fetch Access-Control-Max-Age field @since CUPS 2.4@ */ + HTTP_FIELD_ACCESS_CONTROL_REQUEST_HEADERS, + /* CORS/Fetch Access-Control-Request-Headers field @since CUPS 2.4@ */ + HTTP_FIELD_ACCESS_CONTROL_REQUEST_METHOD, + /* CORS/Fetch Access-Control-Request-Method field @since CUPS 2.4@ */ + HTTP_FIELD_OPTIONAL_WWW_AUTHENTICATE, /* RFC 8053 Optional-WWW-Authenticate field @since CUPS 2.4@ */ + HTTP_FIELD_ORIGIN, /* RFC 6454 Origin field @since CUPS 2.4@ */ + HTTP_FIELD_OSCORE, /* RFC 8613 OSCORE field @since CUPS 2.4@ */ + HTTP_FIELD_STRICT_TRANSPORT_SECURITY, /* HSTS Strict-Transport-Security field @since CUPS 2.4@ */ HTTP_FIELD_MAX /* Maximum field index */ } http_field_t; @@ -346,7 +365,7 @@ 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_UNKNOWN /* Credentials are unknown/new */ } http_trust_t; typedef enum http_uri_status_e /**** URI separation status @since CUPS 1.2@ ****/ diff -Nru cups-2.3.3op2/cups/ipp-file.c cups-2.4.1op1/cups/ipp-file.c --- cups-2.3.3op2/cups/ipp-file.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/ipp-file.c 2022-01-27 11:11:42.000000000 +0000 @@ -303,10 +303,7 @@ * Start of quoted text or regular expression... */ - if (ch == '<') - quote = '>'; - else - quote = ch; + quote = ch; DEBUG_printf(("1_ippFileReadToken: Start of quoted string, quote=%c, pos=%ld", quote, (long)cupsFileTell(f->fp))); } @@ -571,12 +568,10 @@ { case IPP_TAG_BOOLEAN : return (ippSetBoolean(ipp, attr, element, !_cups_strcasecmp(value, "true"))); - break; case IPP_TAG_ENUM : case IPP_TAG_INTEGER : return (ippSetInteger(ipp, attr, element, (int)strtol(value, NULL, 0))); - break; case IPP_TAG_DATE : { @@ -690,7 +685,6 @@ return (ippSetDate(ipp, attr, element, date)); } - break; case IPP_TAG_RESOLUTION : { @@ -718,7 +712,6 @@ else return (ippSetResolution(ipp, attr, element, (ipp_res_t)0, xres, yres)); } - break; case IPP_TAG_RANGE : { @@ -733,7 +726,6 @@ return (ippSetRange(ipp, attr, element, lower, upper)); } - break; case IPP_TAG_STRING : valuelen = strlen(value); @@ -774,7 +766,6 @@ } else return (ippSetOctetString(ipp, attr, element, value, (int)valuelen)); - break; case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : @@ -787,7 +778,6 @@ case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : return (ippSetString(ipp, attr, element, value)); - break; case IPP_TAG_BEGIN_COLLECTION : { @@ -808,14 +798,11 @@ return (status); } - break; default : report_error(f, v, user_data, "Unsupported value on line %d of \"%s\".", f->linenum, f->filename); return (0); } - - return (1); } diff -Nru cups-2.3.3op2/cups/ipp-support.c cups-2.4.1op1/cups/ipp-support.c --- cups-2.3.3op2/cups/ipp-support.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/ipp-support.c 2022-01-27 11:11:42.000000000 +0000 @@ -1640,6 +1640,7 @@ "document-format-default", "document-format-details-default", "document-format-details-supported", + "document-format-preferred", /* AirPrint extension */ "document-format-supported", "document-format-varying-attributes", "document-format-version-default", @@ -1692,6 +1693,7 @@ "marker-types", /* CUPS extension */ "member-names", /* CUPS extension */ "member-uris", /* CUPS extension */ + "mopria-certified", /* Mopria extension */ "multiple-destination-uris-supported",/* IPP FaxOut */ "multiple-document-jobs-supported", "multiple-operation-time-out", @@ -1769,6 +1771,8 @@ "printer-up-time", "printer-uri-supported", "printer-uuid", + "printer-wifi-ssid", /* AirPrint extension */ + "printer-wifi-state", /* AirPrint extension */ "printer-xri-supported", "pwg-raster-document-resolution-supported", "pwg-raster-document-sheet-back", diff -Nru cups-2.3.3op2/cups/ipp.c cups-2.4.1op1/cups/ipp.c --- cups-2.3.3op2/cups/ipp.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/ipp.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * Internet Printing Protocol functions for CUPS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -2868,7 +2868,7 @@ /* Small string buffer */ *bufptr, /* Pointer into buffer */ *bufend; /* End of buffer */ - ipp_attribute_t *attr; /* Current attribute */ + ipp_attribute_t *attr = NULL; /* Current attribute */ ipp_tag_t tag; /* Current tag */ ipp_tag_t value_tag; /* Current value tag */ _ipp_value_t *value; /* Current value */ @@ -2901,8 +2901,7 @@ if ((*cb)(src, buffer, 8) < 8) { DEBUG_puts("1ippReadIO: Unable to read header."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } /* @@ -2940,8 +2939,7 @@ if ((*cb)(src, buffer, 1) < 1) { DEBUG_puts("1ippReadIO: Callback returned EOF/error"); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } DEBUG_printf(("2ippReadIO: ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev)); @@ -2960,8 +2958,7 @@ if ((*cb)(src, buffer, 4) < 4) { DEBUG_puts("1ippReadIO: Callback returned EOF/error"); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } tag = (ipp_tag_t)((((((buffer[0] << 8) | buffer[1]) << 8) | @@ -2975,8 +2972,7 @@ _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_STATE_ERROR); + goto rollback; } } @@ -2995,8 +2991,7 @@ { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1); DEBUG_printf(("1ippReadIO: bad tag 0x%02x.", tag)); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } else if (tag < IPP_TAG_UNSUPPORTED_VALUE) { @@ -3004,13 +2999,20 @@ * Group tag... Set the current group and continue... */ - if (ipp->curtag == tag) + if (parent) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1); + DEBUG_printf(("1ippReadIO: bad tag 0x%02x.", tag)); + goto rollback; + } + else if (ipp->curtag == tag) ipp->prev = ippAddSeparator(ipp); else if (ipp->current) ipp->prev = ipp->current; ipp->curtag = tag; ipp->current = NULL; + attr = NULL; DEBUG_printf(("2ippReadIO: group tag=%x(%s), ipp->prev=%p", tag, ippTagString(tag), (void *)ipp->prev)); continue; } @@ -3025,8 +3027,7 @@ if ((*cb)(src, buffer, 2) < 2) { DEBUG_puts("1ippReadIO: unable to read name length."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } n = (buffer[0] << 8) | buffer[1]; @@ -3035,8 +3036,7 @@ { _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_STATE_ERROR); + goto rollback; } DEBUG_printf(("2ippReadIO: name length=%d", n)); @@ -3045,7 +3045,7 @@ { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid named IPP attribute in collection."), 1); DEBUG_puts("1ippReadIO: bad attribute name in collection."); - return (IPP_STATE_ERROR); + goto rollback; } else if (n == 0 && tag != IPP_TAG_MEMBERNAME && tag != IPP_TAG_END_COLLECTION) { @@ -3057,8 +3057,7 @@ { _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_STATE_ERROR); + goto rollback; } attr = ipp->current; @@ -3097,8 +3096,7 @@ DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag))); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } if (value_tag != tag) @@ -3124,8 +3122,7 @@ DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag))); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } if (value_tag == IPP_TAG_INTEGER && tag == IPP_TAG_RANGE) @@ -3147,8 +3144,7 @@ DEBUG_printf(("1ippReadIO: value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag))); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } /* @@ -3156,10 +3152,7 @@ */ if ((value = ipp_set_value(ipp, &attr, attr->num_values)) == NULL) - { - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); - } + goto rollback; } else if (tag == IPP_TAG_MEMBERNAME) { @@ -3171,8 +3164,13 @@ { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member name is not empty."), 1); DEBUG_puts("1ippReadIO: member name not empty."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; + } + else if (!parent) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member attribute outside of collection."), 1); + DEBUG_puts("1ippReadIO: member attribute outside of collection."); + goto rollback; } if (ipp->current) @@ -3183,8 +3181,7 @@ { _cupsSetHTTPError(HTTP_STATUS_ERROR); DEBUG_puts("1ippReadIO: unable to allocate attribute."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } DEBUG_printf(("2ippReadIO: membername, ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev)); @@ -3200,8 +3197,7 @@ if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: unable to read name."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } buffer[n] = '\0'; @@ -3214,8 +3210,7 @@ { _cupsSetHTTPError(HTTP_STATUS_ERROR); DEBUG_puts("1ippReadIO: unable to allocate attribute."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } DEBUG_printf(("2ippReadIO: name=\"%s\", ipp->current=%p, ipp->prev=%p", buffer, (void *)ipp->current, (void *)ipp->prev)); @@ -3231,8 +3226,7 @@ if ((*cb)(src, buffer, 2) < 2) { DEBUG_puts("1ippReadIO: unable to read value length."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } n = (buffer[0] << 8) | buffer[1]; @@ -3243,8 +3237,7 @@ _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_STATE_ERROR); + goto rollback; } switch (tag) @@ -3260,15 +3253,13 @@ _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_STATE_ERROR); + goto rollback; } if ((*cb)(src, buffer, 4) < 4) { DEBUG_puts("1ippReadIO: Unable to read integer value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } n = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) | @@ -3286,15 +3277,13 @@ _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_STATE_ERROR); + goto rollback; } if ((*cb)(src, buffer, 1) < 1) { DEBUG_puts("1ippReadIO: Unable to read boolean value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } value->boolean = (char)buffer[0]; @@ -3335,8 +3324,7 @@ if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: unable to read string value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } } @@ -3350,15 +3338,13 @@ { _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_STATE_ERROR); + goto rollback; } if ((*cb)(src, value->date, 11) < 11) { DEBUG_puts("1ippReadIO: Unable to read date value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } break; @@ -3368,15 +3354,13 @@ _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_STATE_ERROR); + goto rollback; } if ((*cb)(src, buffer, 9) < 9) { DEBUG_puts("1ippReadIO: Unable to read resolution value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } value->resolution.xres = @@ -3396,15 +3380,13 @@ _("IPP rangeOfInteger value not 8 bytes."), 1); DEBUG_printf(("1ippReadIO: bad rangeOfInteger value length " "%d.", n)); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } if ((*cb)(src, buffer, 8) < 8) { DEBUG_puts("1ippReadIO: Unable to read range value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } value->range.lower = @@ -3429,16 +3411,14 @@ "minimum 4 bytes."), 1); DEBUG_printf(("1ippReadIO: bad stringWithLanguage value " "length %d.", n)); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: Unable to read string w/language " "value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } bufptr = buffer; @@ -3462,8 +3442,7 @@ _("IPP language length overflows value."), 1); DEBUG_printf(("1ippReadIO: bad language value length %d.", n)); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } else if (n >= IPP_MAX_LANGUAGE) { @@ -3471,8 +3450,7 @@ _("IPP language length too large."), 1); DEBUG_printf(("1ippReadIO: bad language value length %d.", n)); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } memcpy(string, bufptr + 2, (size_t)n); @@ -3488,8 +3466,7 @@ _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_STATE_ERROR); + goto rollback; } bufptr[2 + n] = '\0'; @@ -3509,30 +3486,28 @@ _("IPP begCollection value not 0 bytes."), 1); DEBUG_puts("1ippReadIO: begCollection tag with value length " "> 0."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_STATE_ERROR) { DEBUG_puts("1ippReadIO: Unable to read collection value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } break; case IPP_TAG_END_COLLECTION : - _cupsBufferRelease((char *)buffer); - if (n > 0) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP endCollection value not 0 bytes."), 1); DEBUG_puts("1ippReadIO: endCollection tag with value length " "> 0."); - return (IPP_STATE_ERROR); + goto rollback; } + _cupsBufferRelease((char *)buffer); + DEBUG_puts("1ippReadIO: endCollection tag..."); return (ipp->state = IPP_STATE_DATA); @@ -3547,22 +3522,19 @@ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP memberName with no attribute."), 1); DEBUG_puts("1ippReadIO: Member name without attribute."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } else if (n == 0) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP memberName value is empty."), 1); DEBUG_puts("1ippReadIO: Empty member name value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } else if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: Unable to read member name value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } buffer[n] = '\0'; @@ -3587,8 +3559,7 @@ _("IPP octetString length too large."), 1); DEBUG_printf(("1ippReadIO: bad octetString value length %d.", n)); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } value->unknown.length = n; @@ -3599,15 +3570,13 @@ { _cupsSetHTTPError(HTTP_STATUS_ERROR); DEBUG_puts("1ippReadIO: Unable to allocate value"); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } if ((*cb)(src, value->unknown.data, (size_t)n) < n) { DEBUG_puts("1ippReadIO: Unable to read unsupported value."); - _cupsBufferRelease((char *)buffer); - return (IPP_STATE_ERROR); + goto rollback; } } else @@ -3635,6 +3604,17 @@ _cupsBufferRelease((char *)buffer); return (ipp->state); + + // If we get here, there was an error that required us to roll back the last + // attribute read in order to keep the IPP message valid... + rollback: + + _cupsBufferRelease((char *)buffer); + + if (attr) + ippDeleteAttribute(ipp, attr); + + return (IPP_STATE_ERROR); } diff -Nru cups-2.3.3op2/cups/language.c cups-2.4.1op1/cups/language.c --- cups-2.3.3op2/cups/language.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/language.c 2022-01-27 11:11:42.000000000 +0000 @@ -70,7 +70,7 @@ "unknown", "unknown", "cp932", "cp936", "cp949", "cp950", - "cp1361", "unknown", + "cp1361", "bg18030", "unknown", "unknown", "unknown", "unknown", "unknown", "unknown", @@ -478,7 +478,7 @@ "", "", "", "", "CP932", "CP936", "CP949", "CP950", - "CP1361", "", "", "", + "CP1361", "GB18030", "", "", "", "", "", "", "", "", "", "", "", "", "", "", diff -Nru cups-2.3.3op2/cups/language.h cups-2.4.1op1/cups/language.h --- cups-2.3.3op2/cups/language.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/language.h 2022-01-27 11:11:42.000000000 +0000 @@ -66,6 +66,7 @@ CUPS_WINDOWS_949, /* Korean KS C5601-1992 */ CUPS_WINDOWS_950, /* Traditional Chinese Big Five */ CUPS_WINDOWS_1361, /* Korean Johab */ + CUPS_BG18030, /* Chinese GB 18030 @since CUPS 2.4.0@ */ CUPS_ENCODING_DBCS_END = 127, /* End of double-byte encodings @private@ */ CUPS_EUC_CN, /* EUC Simplified Chinese */ diff -Nru cups-2.3.3op2/cups/libcups2.def cups-2.4.1op1/cups/libcups2.def --- cups-2.3.3op2/cups/libcups2.def 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/libcups2.def 2022-01-27 11:11:42.000000000 +0000 @@ -71,14 +71,12 @@ _cupsUserDefault _cups_gettimeofday _cups_safe_vsnprintf -_cups_snprintf _cups_strcasecmp _cups_strcpy _cups_strcpy _cups_strlcat _cups_strlcpy _cups_strncasecmp -_cups_vsnprintf _httpAddrSetPort _httpCreateCredentials _httpDecodeURI diff -Nru cups-2.3.3op2/cups/md5passwd.c cups-2.4.1op1/cups/md5passwd.c --- cups-2.3.3op2/cups/md5passwd.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/md5passwd.c 2022-01-27 11:11:42.000000000 +0000 @@ -19,6 +19,9 @@ /* * 'httpMD5()' - Compute the MD5 sum of the username:group:password. * + * The function was used for HTTP Digest authentication. Since CUPS 2.4.0 + * it produces an empty string. Please use @link cupsDoAuthentication@ instead. + * * @deprecated@ */ @@ -28,22 +31,13 @@ const char *passwd, /* I - Password string */ char md5[33]) /* O - MD5 string */ { - unsigned char sum[16]; /* Sum data */ - char line[256]; /* Line to sum */ - - - /* - * Compute the MD5 sum of the user name, group name, and password. - */ + (void)username; + (void)realm; + (void)passwd; - snprintf(line, sizeof(line), "%s:%s:%s", username, realm, passwd); - cupsHashData("md5", (unsigned char *)line, strlen(line), sum, sizeof(sum)); + md5[0] = '\0'; - /* - * Return the sum... - */ - - return ((char *)cupsHashString(sum, sizeof(sum), md5, 33)); + return (NULL); } @@ -52,6 +46,9 @@ * with the server-supplied nonce value, method, and * request-uri. * + * The function was used for HTTP Digest authentication. Since CUPS 2.4.0 + * it produces an empty string. Please use @link cupsDoAuthentication@ instead. + * * @deprecated@ */ @@ -61,35 +58,22 @@ const char *resource, /* I - Resource path */ char md5[33]) /* IO - MD5 sum */ { - unsigned char sum[16]; /* Sum data */ - char line[1024]; /* Line of data */ - char a2[33]; /* Hash of method and resource */ - + (void)nonce; + (void)method; + (void)resource; - /* - * First compute the MD5 sum of the method and resource... - */ + md5[0] = '\0'; - snprintf(line, sizeof(line), "%s:%s", method, resource); - cupsHashData("md5", (unsigned char *)line, strlen(line), sum, sizeof(sum)); - cupsHashString(sum, sizeof(sum), a2, sizeof(a2)); - - /* - * Then combine A1 (MD5 of username, realm, and password) with the nonce - * and A2 (method + resource) values to get the final MD5 sum for the - * request... - */ - - snprintf(line, sizeof(line), "%s:%s:%s", md5, nonce, a2); - cupsHashData("md5", (unsigned char *)line, strlen(line), sum, sizeof(sum)); - - return ((char *)cupsHashString(sum, sizeof(sum), md5, 33)); + return (NULL); } /* * 'httpMD5String()' - Convert an MD5 sum to a character string. * + * The function was used for HTTP Digest authentication. Since CUPS 2.4.0 + * it produces an empty string. Please use @link cupsDoAuthentication@ instead. + * * @deprecated@ */ @@ -98,5 +82,9 @@ char md5[33]) /* O - MD5 sum in hex */ { - return ((char *)cupsHashString(sum, 16, md5, 33)); + (void)sum; + + md5[0] = '\0'; + + return (NULL); } diff -Nru cups-2.3.3op2/cups/options.c cups-2.4.1op1/cups/options.c --- cups-2.3.3op2/cups/options.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/options.c 2022-01-27 11:11:42.000000000 +0000 @@ -603,16 +603,15 @@ if (ptr < (value + sizeof(value) - 1)) *ptr++ = *device_id; - if (!*device_id) - break; - while (ptr > value && _cups_isspace(ptr[-1])) ptr --; *ptr = '\0'; - device_id ++; - num_values = cupsAddOption(key, value, num_values, values); + + if (!*device_id) + break; + device_id ++; } return (num_values); diff -Nru cups-2.3.3op2/cups/ppd-cache.c cups-2.4.1op1/cups/ppd-cache.c --- cups-2.3.3op2/cups/ppd-cache.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/ppd-cache.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * PPD cache implementation for CUPS. * - * Copyright © 2010-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2010-2021 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. @@ -28,6 +29,7 @@ * Local functions... */ +static int cups_connect(http_t **http, const char *url, char *resource, size_t ressize); static int cups_get_url(http_t **http, const char *url, char *name, size_t namesize); static void pwg_add_finishing(cups_array_t *finishings, ipp_finishings_t template, const char *name, const char *value); static void pwg_add_message(cups_array_t *a, const char *msg, const char *str); @@ -78,8 +80,11 @@ int num_finishings = 0, /* Number of finishing values */ finishings[10]; /* Finishing enum values */ ppd_choice_t *choice; /* Marked choice */ - int finishings_copies = copies; + int finishings_copies = copies, /* Number of copies for finishings */ + job_pages = 0, /* job-pages value */ + number_up = 1; /* number-up value */ + const char *value; /* Option value */ /* @@ -365,6 +370,34 @@ * Map finishing options... */ + if (copies != finishings_copies) + { + // Figure out the proper job-pages-per-set value... + if ((value = cupsGetOption("job-pages", num_options, options)) == NULL) + value = cupsGetOption("com.apple.print.PrintSettings.PMTotalBeginPages..n.", num_options, options); + + if (value) + { + if ((job_pages = atoi(value)) < 1) + job_pages = 1; + } + + // Adjust for number-up + if ((value = cupsGetOption("number-up", num_options, options)) != NULL) + { + if ((number_up = atoi(value)) < 1) + number_up = 1; + } + + job_pages = (job_pages + number_up - 1) / number_up; + + // When duplex printing, raster data will include an extra (blank) page to + // make the total number of pages even. Make sure this is reflected in the + // page count... + if ((job_pages & 1) && (keyword = cupsGetOption("sides", num_options, options)) != NULL && strcmp(keyword, "one-sided")) + job_pages ++; + } + if ((finishing_template = cupsGetOption("cupsFinishingTemplate", num_options, options)) == NULL) finishing_template = cupsGetOption("finishing-template", num_options, options); @@ -376,13 +409,13 @@ ippAddCollection(request, IPP_TAG_JOB, "finishings-col", fin_col); ippDelete(fin_col); - if (copies != finishings_copies && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL) + if (copies != finishings_copies && job_pages > 0) { /* * Send job-pages-per-set attribute to apply finishings correctly... */ - ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / finishings_copies); + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", job_pages); } } else @@ -392,13 +425,13 @@ { ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings", num_finishings, finishings); - if (copies != finishings_copies && (keyword = cupsGetOption("job-impressions", num_options, options)) != NULL) + if (copies != finishings_copies && job_pages > 0) { /* * Send job-pages-per-set attribute to apply finishings correctly... */ - ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", atoi(keyword) / finishings_copies); + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-pages-per-set", job_pages); } } } @@ -2056,7 +2089,7 @@ for (i = 0; i < pc->num_bins; i ++) - if (!_cups_strcasecmp(output_bin, pc->bins[i].ppd)) + if (!_cups_strcasecmp(output_bin, pc->bins[i].ppd) || !_cups_strcasecmp(output_bin, pc->bins[i].pwg)) return (pc->bins[i].pwg); return (NULL); @@ -2743,7 +2776,7 @@ return (NULL); for (i = pc->num_sources, source = pc->sources; i > 0; i --, source ++) - if (!_cups_strcasecmp(input_slot, source->ppd)) + if (!_cups_strcasecmp(input_slot, source->ppd) || !_cups_strcasecmp(input_slot, source->pwg)) return (source->pwg); return (NULL); @@ -2772,7 +2805,7 @@ return (NULL); for (i = pc->num_types, type = pc->types; i > 0; i --, type ++) - if (!_cups_strcasecmp(media_type, type->ppd)) + if (!_cups_strcasecmp(media_type, type->ppd) || !_cups_strcasecmp(media_type, type->pwg)) return (type->pwg); return (NULL); @@ -3015,12 +3048,30 @@ char * /* O - PPD filename or @code 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 */ + ipp_t *supported) /* I - Get-Printer-Attributes response */ +{ + return (_ppdCreateFromIPP2(buffer, bufsize, supported, cupsLangDefault())); +} + + +/* + * '_ppdCreateFromIPP()' - Create a PPD file describing the capabilities + * of an IPP printer. + */ + + +char * +_ppdCreateFromIPP2( + char *buffer, /* I - Filename buffer */ + size_t bufsize, /* I - Size of filename buffer */ + ipp_t *supported, /* I - Get-Printer-Attributes response */ + cups_lang_t *lang) /* I - Language */ { cups_file_t *fp; /* PPD file */ cups_array_t *sizes; /* Media sizes supported by printer */ cups_size_t *size; /* Current media size */ ipp_attribute_t *attr, /* xxx-supported */ + *lang_supp, /* printer-strings-languages-supported */ *defattr, /* xxx-default */ *quality, /* print-quality-supported */ *x_dim, *y_dim; /* Media dimensions */ @@ -3048,11 +3099,11 @@ int xres, yres; /* Resolution values */ int resolutions[1000]; /* Array of resolution indices */ + int have_qdraft = 0,/* Have draft quality? */ + have_qhigh = 0; /* Have high quality? */ char msgid[256]; /* Message identifier (attr.value) */ const char *keyword, /* Keyword value */ *msgstr; /* Localized string */ - cups_lang_t *lang = cupsLangDefault(); - /* Localization info */ cups_array_t *strings = NULL;/* Printer strings file */ struct lconv *loc = localeconv(); /* Locale data */ @@ -3073,7 +3124,7 @@ return (NULL); } - if (!response) + if (!supported) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No IPP attributes."), 1); return (NULL); @@ -3103,13 +3154,12 @@ cupsFilePuts(fp, "*FileSystem: False\n"); cupsFilePuts(fp, "*PCFileName: \"ippeve.ppd\"\n"); - if ((attr = ippFindAttribute(response, "printer-make-and-model", IPP_TAG_TEXT)) != NULL) + if ((attr = ippFindAttribute(supported, "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)) + if (!_cups_strncasecmp(make, "Hewlett Packard ", 16) || !_cups_strncasecmp(make, "Hewlett-Packard ", 16)) { model = make + 16; strlcpy(make, "HP", sizeof(make)); @@ -3125,33 +3175,85 @@ cupsFilePrintf(fp, "*NickName: \"%s - IPP Everywhere\"\n", model); cupsFilePrintf(fp, "*ShortNickName: \"%s - IPP Everywhere\"\n", model); - if ((attr = ippFindAttribute(response, "color-supported", IPP_TAG_BOOLEAN)) != NULL && ippGetBoolean(attr, 0)) + if ((attr = ippFindAttribute(supported, "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); +#ifdef __APPLE__ + cupsFilePrintf(fp, "*APAirPrint: True\n"); +#endif // __APPLE__ cupsFilePuts(fp, "*cupsSNMPSupplies: False\n"); - cupsFilePrintf(fp, "*cupsLanguages: \"%s\"\n", lang->language); + cupsFilePrintf(fp, "*cupsLanguages: \"%s", lang->language); + if ((lang_supp = ippFindAttribute(supported, "printer-strings-languages-supported", IPP_TAG_LANGUAGE)) != NULL) + { + for (i = 0, count = ippGetCount(lang_supp); i < count; i ++) + { + keyword = ippGetString(lang_supp, i, NULL); + + if (strcmp(keyword, lang->language)) + cupsFilePrintf(fp, " %s", keyword); + } + } + cupsFilePuts(fp, "\"\n"); - if ((attr = ippFindAttribute(response, "printer-more-info", IPP_TAG_URI)) != NULL) + if ((attr = ippFindAttribute(supported, "printer-more-info", IPP_TAG_URI)) != NULL) cupsFilePrintf(fp, "*APSupplies: \"%s\"\n", ippGetString(attr, 0, NULL)); - if ((attr = ippFindAttribute(response, "printer-charge-info-uri", IPP_TAG_URI)) != NULL) + if ((attr = ippFindAttribute(supported, "printer-charge-info-uri", IPP_TAG_URI)) != NULL) cupsFilePrintf(fp, "*cupsChargeInfoURI: \"%s\"\n", ippGetString(attr, 0, NULL)); - if ((attr = ippFindAttribute(response, "printer-strings-uri", IPP_TAG_URI)) != NULL) + if ((attr = ippFindAttribute(supported, "printer-strings-uri", IPP_TAG_URI)) != NULL) { http_t *http = NULL; /* Connection to printer */ char stringsfile[1024]; /* Temporary strings file */ if (cups_get_url(&http, ippGetString(attr, 0, NULL), stringsfile, sizeof(stringsfile))) { + const char *printer_uri = ippGetString(ippFindAttribute(supported, "printer-uri-supported", IPP_TAG_URI), 0, NULL); + // Printer URI + char resource[256]; // Resource path + ipp_t *request, // Get-Printer-Attributes request + *response; // Response to request + + /* + * Load strings and save the URL for clients using the destination API + * instead of this PPD file... + */ + cupsFilePrintf(fp, "*cupsStringsURI: \"%s\"\n", ippGetString(attr, 0, NULL)); strings = _cupsMessageLoad(stringsfile, _CUPS_MESSAGE_STRINGS | _CUPS_MESSAGE_UNQUOTE); unlink(stringsfile); + + if (lang_supp && printer_uri && cups_connect(&http, printer_uri, resource, sizeof(resource))) + { + /* + * Loop through all of the languages and save their URIs... + */ + + for (i = 0, count = ippGetCount(lang_supp); i < count; i ++) + { + keyword = ippGetString(lang_supp, i, NULL); + + request = ippNew(); + ippSetOperation(request, IPP_OP_GET_PRINTER_ATTRIBUTES); + ippSetRequestId(request, i + 1); + ippAddString(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_CHARSET), "attributes-charset", NULL, "utf-8"); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, keyword); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, printer_uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "requested-attributes", NULL, "printer-strings-uri"); + + response = cupsDoRequest(http, request, resource); + + if ((attr = ippFindAttribute(response, "printer-strings-uri", IPP_TAG_URI)) != NULL) + { + cupsFilePrintf(fp, "*cupsStringsURI %s: \"%s\"\n", keyword, ippGetString(attr, 0, NULL)); + } + } + } } if (http) @@ -3162,22 +3264,61 @@ * Accounting... */ - if (ippGetBoolean(ippFindAttribute(response, "job-account-id-supported", IPP_TAG_BOOLEAN), 0)) + if (ippGetBoolean(ippFindAttribute(supported, "job-account-id-supported", IPP_TAG_BOOLEAN), 0)) cupsFilePuts(fp, "*cupsJobAccountId: True\n"); - if (ippGetBoolean(ippFindAttribute(response, "job-accounting-user-id-supported", IPP_TAG_BOOLEAN), 0)) + if (ippGetBoolean(ippFindAttribute(supported, "job-accounting-user-id-supported", IPP_TAG_BOOLEAN), 0)) cupsFilePuts(fp, "*cupsJobAccountingUserId: True\n"); + if ((attr = ippFindAttribute(supported, "printer-privacy-policy-uri", IPP_TAG_URI)) != NULL) + cupsFilePrintf(fp, "*cupsPrivacyURI: \"%s\"\n", ippGetString(attr, 0, NULL)); + + if ((attr = ippFindAttribute(supported, "printer-mandatory-job-attributes", IPP_TAG_KEYWORD)) != NULL) + { + char prefix = '\"'; // Prefix for string + + cupsFilePuts(fp, "*cupsMandatory: \""); + for (i = 0, count = ippGetCount(attr); i < count; i ++) + { + keyword = ippGetString(attr, i, NULL); + + if (strcmp(keyword, "attributes-charset") && strcmp(keyword, "attributes-natural-language") && strcmp(keyword, "printer-uri")) + { + cupsFilePrintf(fp, "%c%s", prefix, keyword); + prefix = ','; + } + } + cupsFilePuts(fp, "\"\n"); + } + + if ((attr = ippFindAttribute(supported, "printer-requested-job-attributes", IPP_TAG_KEYWORD)) != NULL) + { + char prefix = '\"'; // Prefix for string + + cupsFilePuts(fp, "*cupsRequested: \""); + for (i = 0, count = ippGetCount(attr); i < count; i ++) + { + keyword = ippGetString(attr, i, NULL); + + if (strcmp(keyword, "attributes-charset") && strcmp(keyword, "attributes-natural-language") && strcmp(keyword, "printer-uri")) + { + cupsFilePrintf(fp, "%c%s", prefix, keyword); + prefix = ','; + } + } + cupsFilePuts(fp, "\"\n"); + } + /* * Password/PIN printing... */ - if ((attr = ippFindAttribute(response, "job-password-supported", IPP_TAG_INTEGER)) != NULL) + if ((attr = ippFindAttribute(supported, "job-password-supported", IPP_TAG_INTEGER)) != NULL) { char pattern[33]; /* Password pattern */ int maxlen = ippGetInteger(attr, 0); /* Maximum length */ - const char *repertoire = ippGetString(ippFindAttribute(response, "job-password-repertoire-configured", IPP_TAG_KEYWORD), 0, NULL); + const char *repertoire = ippGetString(ippFindAttribute(supported, "job-password-repertoire-configured", IPP_TAG_KEYWORD), 0, NULL); /* Type of password */ if (maxlen > (int)(sizeof(pattern) - 1)) @@ -3207,7 +3348,7 @@ * Filters... */ - if ((attr = ippFindAttribute(response, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL) + if ((attr = ippFindAttribute(supported, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL) { is_apple = ippContainsString(attr, "image/urf"); is_pdf = ippContainsString(attr, "application/pdf"); @@ -3244,7 +3385,7 @@ * PageSize/PageRegion/ImageableArea/PaperDimension */ - if ((attr = ippFindAttribute(response, "media-bottom-margin-supported", IPP_TAG_INTEGER)) != NULL) + if ((attr = ippFindAttribute(supported, "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) @@ -3253,7 +3394,7 @@ else bottom = 1270; - if ((attr = ippFindAttribute(response, "media-left-margin-supported", IPP_TAG_INTEGER)) != NULL) + if ((attr = ippFindAttribute(supported, "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) @@ -3262,7 +3403,7 @@ else left = 635; - if ((attr = ippFindAttribute(response, "media-right-margin-supported", IPP_TAG_INTEGER)) != NULL) + if ((attr = ippFindAttribute(supported, "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) @@ -3271,7 +3412,7 @@ else right = 635; - if ((attr = ippFindAttribute(response, "media-top-margin-supported", IPP_TAG_INTEGER)) != NULL) + if ((attr = ippFindAttribute(supported, "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) @@ -3280,7 +3421,7 @@ else top = 1270; - if ((defattr = ippFindAttribute(response, "media-col-default", IPP_TAG_BEGIN_COLLECTION)) != NULL) + if ((defattr = ippFindAttribute(supported, "media-col-default", IPP_TAG_BEGIN_COLLECTION)) != NULL) { if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-size", IPP_TAG_BEGIN_COLLECTION)) != NULL) { @@ -3296,14 +3437,14 @@ else strlcpy(ppdname, "Unknown", sizeof(ppdname)); } - else if ((pwg = pwgMediaForPWG(ippGetString(ippFindAttribute(response, "media-default", IPP_TAG_ZERO), 0, NULL))) != NULL) + else if ((pwg = pwgMediaForPWG(ippGetString(ippFindAttribute(supported, "media-default", IPP_TAG_ZERO), 0, NULL))) != NULL) strlcpy(ppdname, pwg->ppd, sizeof(ppdname)); else strlcpy(ppdname, "Unknown", sizeof(ppdname)); sizes = cupsArrayNew3((cups_array_func_t)pwg_compare_sizes, NULL, NULL, 0, (cups_acopy_func_t)pwg_copy_size, (cups_afree_func_t)free); - if ((attr = ippFindAttribute(response, "media-col-database", IPP_TAG_BEGIN_COLLECTION)) != NULL) + if ((attr = ippFindAttribute(supported, "media-col-database", IPP_TAG_BEGIN_COLLECTION)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { @@ -3379,7 +3520,7 @@ } } - if ((max_width == 0 || max_length == 0) && (attr = ippFindAttribute(response, "media-size-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) + if ((max_width == 0 || max_length == 0) && (attr = ippFindAttribute(supported, "media-size-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) { /* * Some printers don't list custom size support in media-col-database... @@ -3422,7 +3563,7 @@ } } } - else if ((attr = ippFindAttribute(response, "media-size-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) + else if ((attr = ippFindAttribute(supported, "media-size-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { @@ -3480,7 +3621,7 @@ } } } - else if ((attr = ippFindAttribute(response, "media-supported", IPP_TAG_ZERO)) != NULL) + else if ((attr = ippFindAttribute(supported, "media-supported", IPP_TAG_ZERO)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { @@ -3624,7 +3765,7 @@ else ppdname[0] = '\0'; - if ((attr = ippFindAttribute(response, "media-source-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) + if ((attr = ippFindAttribute(supported, "media-source-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) { int have_default = ppdname[0] != '\0'; /* Do we have a default InputSlot? */ @@ -3687,7 +3828,7 @@ if (have_default) cupsFilePrintf(fp, "*DefaultInputSlot: %s\n", ppdname); - for (i = 0, count = ippGetCount(attr); i < count; i ++) + for (i = 0; i < count; i ++) { keyword = ippGetString(attr, i, NULL); @@ -3700,8 +3841,13 @@ if (!strcmp(sources[j], keyword)) { snprintf(msgid, sizeof(msgid), "media-source.%s", keyword); + + if ((msgstr = _cupsLangString(lang, msgid)) == msgid || !strcmp(msgid, msgstr)) + if ((msgstr = _cupsMessageLookup(strings, msgid)) == msgid) + msgstr = keyword; + cupsFilePrintf(fp, "*InputSlot %s: \"<>setpagedevice\"\n", ppdname, j); - cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, _cupsLangString(lang, msgid)); + cupsFilePrintf(fp, "*%s.InputSlot %s/%s: \"\"\n", lang->language, ppdname, msgstr); break; } } @@ -3717,7 +3863,7 @@ else strlcpy(ppdname, "Unknown", sizeof(ppdname)); - if ((attr = ippFindAttribute(response, "media-type-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) + if ((attr = ippFindAttribute(supported, "media-type-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 1) { cupsFilePrintf(fp, "*OpenUI *MediaType: PickOne\n" "*OrderDependency: 10 AnySetup *MediaType\n" @@ -3740,19 +3886,208 @@ } /* + * cupsPrintQuality and DefaultResolution... + */ + + quality = ippFindAttribute(supported, "print-quality-supported", IPP_TAG_ENUM); + + if ((attr = ippFindAttribute(supported, "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... + */ + + goto bad_ppd; + } + else + { + /* + * Generate print qualities based on low and high DPIs... + */ + + cupsFilePrintf(fp, "*DefaultResolution: %ddpi\n", lowdpi); + + cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" + "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" + "*%s.Translation cupsPrintQuality/%s: \"\"\n" + "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); + if ((lowdpi & 1) == 0) + { + cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", lowdpi, lowdpi / 2, lang->language, _cupsLangString(lang, _("Draft"))); + have_qdraft = 1; + } + else if (ippContainsInteger(quality, IPP_QUALITY_DRAFT)) + { + cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", lowdpi, lowdpi, lang->language, _cupsLangString(lang, _("Draft"))); + have_qdraft = 1; + } + + cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n*%s.cupsPrintQuality Normal/%s: \"\"\n", lowdpi, lowdpi, lang->language, _cupsLangString(lang, _("Normal"))); + + if (hidpi > lowdpi || ippContainsInteger(quality, IPP_QUALITY_HIGH)) + { + cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n*%s.cupsPrintQuality High/%s: \"\"\n", hidpi, hidpi, lang->language, _cupsLangString(lang, _("High"))); + have_qhigh = 1; + } + + cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); + } + } + else if ((attr = ippFindAttribute(supported, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL) + { + /* + * Make a sorted list of resolutions. + */ + + count = ippGetCount(attr); + if (count > (int)(sizeof(resolutions) / sizeof(resolutions[0]))) + count = (int)(sizeof(resolutions) / sizeof(resolutions[0])); + + resolutions[0] = 0; /* Not in loop to silence Clang static analyzer... */ + for (i = 1; i < count; i ++) + resolutions[i] = i; + + for (i = 0; i < (count - 1); i ++) + { + for (j = i + 1; j < count; j ++) + { + int ix, iy, /* First X and Y resolution */ + jx, jy, /* Second X and Y resolution */ + temp; /* Swap variable */ + ipp_res_t units; /* Resolution units */ + + ix = ippGetResolution(attr, resolutions[i], &iy, &units); + jx = ippGetResolution(attr, resolutions[j], &jy, &units); + + if (ix > jx || (ix == jx && iy > jy)) + { + /* + * Swap these two resolutions... + */ + + temp = resolutions[i]; + resolutions[i] = resolutions[j]; + resolutions[j] = temp; + } + } + } + + /* + * Generate print quality options... + */ + + pwg_ppdize_resolution(attr, resolutions[count / 2], &xres, &yres, ppdname, sizeof(ppdname)); + cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname); + + cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" + "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" + "*%s.Translation cupsPrintQuality/%s: \"\"\n" + "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); + if (count > 2 || ippContainsInteger(quality, IPP_QUALITY_DRAFT)) + { + pwg_ppdize_resolution(attr, resolutions[0], &xres, &yres, NULL, 0); + cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n", xres, yres); + cupsFilePrintf(fp, "*%s.cupsPrintQuality Draft/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Draft"))); + have_qdraft = 1; + } + + pwg_ppdize_resolution(attr, resolutions[count / 2], &xres, &yres, NULL, 0); + cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n", xres, yres); + cupsFilePrintf(fp, "*%s.cupsPrintQuality Normal/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Normal"))); + + if (count > 1 || ippContainsInteger(quality, IPP_QUALITY_HIGH)) + { + pwg_ppdize_resolution(attr, resolutions[count - 1], &xres, &yres, NULL, 0); + cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n", xres, yres); + cupsFilePrintf(fp, "*%s.cupsPrintQuality High/%s: \"\"\n", lang->language, _cupsLangString(lang, _("High"))); + have_qhigh = 1; + } + + cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); + } + else if (is_apple || is_pwg) + goto bad_ppd; + else + { + if ((attr = ippFindAttribute(supported, "printer-resolution-default", IPP_TAG_RESOLUTION)) != NULL) + { + pwg_ppdize_resolution(attr, 0, &xres, &yres, ppdname, sizeof(ppdname)); + } + else + { + xres = yres = 300; + strlcpy(ppdname, "300dpi", sizeof(ppdname)); + } + + cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname); + + cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" + "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" + "*%s.Translation cupsPrintQuality/%s: \"\"\n" + "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); + if (ippContainsInteger(quality, IPP_QUALITY_DRAFT)) + { + cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("Draft"))); + have_qdraft = 1; + } + + cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n*%s.cupsPrintQuality Normal/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("Normal"))); + + if (ippContainsInteger(quality, IPP_QUALITY_HIGH)) + { + cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n*%s.cupsPrintQuality High/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("High"))); + have_qhigh = 1; + } + cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); + } + + /* * ColorModel... */ - if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) == NULL) - if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL) - if ((attr = ippFindAttribute(response, "print-color-mode-supported", IPP_TAG_KEYWORD)) == NULL) - attr = ippFindAttribute(response, "output-mode-supported", IPP_TAG_KEYWORD); + if ((defattr = ippFindAttribute(supported, "print-color-mode-default", IPP_TAG_KEYWORD)) == NULL) + defattr = ippFindAttribute(supported, "output-mode-default", IPP_TAG_KEYWORD); + + if ((attr = ippFindAttribute(supported, "urf-supported", IPP_TAG_KEYWORD)) == NULL) + if ((attr = ippFindAttribute(supported, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL) + if ((attr = ippFindAttribute(supported, "print-color-mode-supported", IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(supported, "output-mode-supported", IPP_TAG_KEYWORD); if (attr) { int wrote_color = 0; const char *default_color = NULL; /* Default */ + if ((keyword = ippGetString(defattr, 0, NULL)) != NULL) + { + if (!strcmp(keyword, "bi-level")) + default_color = "FastGray"; + else if (!strcmp(keyword, "monochrome") || !strcmp(keyword, "auto-monochrome")) + default_color = "Gray"; + else + default_color = "RGB"; + } + cupsFilePrintf(fp, "*%% ColorModel from %s\n", ippGetName(attr)); for (i = 0, count = ippGetCount(attr); i < count; i ++) @@ -3777,7 +4112,7 @@ PRINTF_COLOROPTION("Gray", _("Grayscale"), CUPS_CSPACE_SW, 8) - if (!default_color || !strcmp(default_color, "FastGray")) + if (!default_color || (!defattr && !strcmp(default_color, "FastGray"))) default_color = "Gray"; } else if (!strcasecmp(keyword, "sgray_16") || !strcmp(keyword, "W8-16")) @@ -3788,7 +4123,7 @@ { PRINTF_COLOROPTION("Gray", _("Grayscale"), CUPS_CSPACE_SW, 8) - if (!default_color || !strcmp(default_color, "FastGray")) + if (!default_color || (!defattr && !strcmp(default_color, "FastGray"))) default_color = "Gray"; } @@ -3800,7 +4135,8 @@ PRINTF_COLOROPTION("RGB", _("Color"), CUPS_CSPACE_SRGB, 8) - default_color = "RGB"; + if (!default_color) + default_color = "RGB"; // Apparently some printers only advertise color support, so make sure // we also do grayscale for these printers... @@ -3867,13 +4203,53 @@ cupsFilePrintf(fp, "*DefaultColorModel: %s\n", default_color); if (wrote_color) cupsFilePuts(fp, "*CloseUI: *ColorModel\n"); + + if (default_color) + { + // Standard presets for color mode and quality... + if (have_qdraft) + cupsFilePuts(fp, + "*APPrinterPreset Gray_with_Paper_Auto-Detect_-_Draft/Draft B&W: \"\n" + " *cupsPrintQuality Draft *ColorModel Gray\n" + " com.apple.print.preset.graphicsType General\n" + " com.apple.print.preset.quality low\n" + " com.apple.print.preset.media-front-coating autodetect\n" + " com.apple.print.preset.output-mode monochrome\"\n" + "*End\n"); + cupsFilePuts(fp, + "*APPrinterPreset Gray_with_Paper_Auto-Detect/Black and White: \"\n" + " *cupsPrintQuality Normal *ColorModel Gray\n" + " com.apple.print.preset.graphicsType General\n" + " com.apple.print.preset.quality mid\n" + " com.apple.print.preset.media-front-coating autodetect\n" + " com.apple.print.preset.output-mode monochrome\"\n" + "*End\n"); + if (strcmp(default_color, "Gray")) + cupsFilePuts(fp, + "*APPrinterPreset Color_with_Paper_Auto-Detect/Color: \"\n" + " *cupsPrintQuality Normal *ColorModel RGB\n" + " com.apple.print.preset.graphicsType General\n" + " com.apple.print.preset.quality mid\n" + " com.apple.print.preset.media-front-coating autodetect\n" + " com.apple.print.preset.output-mode color\"\n" + "*End\n"); + if (!strcmp(default_color, "AdobeRGB") || have_qhigh) + cupsFilePrintf(fp, + "*APPrinterPreset Photo_with_Paper_Auto-Detect/Photo: \"\n" + " *cupsPrintQuality %s *ColorModel %s\n" + " com.apple.print.preset.graphicsType Photo\n" + " com.apple.print.preset.quality %s\n" + " com.apple.print.preset.media-front-coating autodetect\n" + " com.apple.print.preset.output-mode color\"\n" + "*End\n", have_qhigh ? "High" : "Normal", default_color, have_qhigh ? "high" : "mid"); + } } /* * Duplex... */ - if ((attr = ippFindAttribute(response, "sides-supported", IPP_TAG_KEYWORD)) != NULL && ippContainsString(attr, "two-sided-long-edge")) + if ((attr = ippFindAttribute(supported, "sides-supported", IPP_TAG_KEYWORD)) != NULL && ippContainsString(attr, "two-sided-long-edge")) { cupsFilePrintf(fp, "*OpenUI *Duplex: PickOne\n" "*OrderDependency: 10 AnySetup *Duplex\n" @@ -3887,7 +4263,7 @@ "*%s.Duplex DuplexTumble/%s: \"\"\n" "*CloseUI: *Duplex\n", lang->language, _cupsLangString(lang, _("2-Sided Printing")), lang->language, _cupsLangString(lang, _("Off (1-Sided)")), lang->language, _cupsLangString(lang, _("Long-Edge (Portrait)")), lang->language, _cupsLangString(lang, _("Short-Edge (Landscape)"))); - if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL) + if ((attr = ippFindAttribute(supported, "urf-supported", IPP_TAG_KEYWORD)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { @@ -3916,7 +4292,7 @@ } } } - else if ((attr = ippFindAttribute(response, "pwg-raster-document-sheet-back", IPP_TAG_KEYWORD)) != NULL) + else if ((attr = ippFindAttribute(supported, "pwg-raster-document-sheet-back", IPP_TAG_KEYWORD)) != NULL) { keyword = ippGetString(attr, 0, NULL); @@ -3935,14 +4311,14 @@ * Output bin... */ - if ((attr = ippFindAttribute(response, "output-bin-default", IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(supported, "output-bin-default", IPP_TAG_ZERO)) != NULL) pwg_ppdize_name(ippGetString(attr, 0, NULL), ppdname, sizeof(ppdname)); else strlcpy(ppdname, "Unknown", sizeof(ppdname)); - if ((attr = ippFindAttribute(response, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 0) + if ((attr = ippFindAttribute(supported, "output-bin-supported", IPP_TAG_ZERO)) != NULL && (count = ippGetCount(attr)) > 0) { - ipp_attribute_t *trays = ippFindAttribute(response, "printer-output-tray", IPP_TAG_STRING); + ipp_attribute_t *trays = ippFindAttribute(supported, "printer-output-tray", IPP_TAG_STRING); /* printer-output-tray attribute, if any */ const char *tray_ptr; /* printer-output-tray value */ int tray_len; /* Len of printer-output-tray value */ @@ -3996,7 +4372,7 @@ * Finishing options... */ - if ((attr = ippFindAttribute(response, "finishings-supported", IPP_TAG_ENUM)) != NULL) + if ((attr = ippFindAttribute(supported, "finishings-supported", IPP_TAG_ENUM)) != NULL) { int value; /* Enum value */ const char *ppd_keyword; /* PPD keyword for enum */ @@ -4364,7 +4740,7 @@ cupsArrayDelete(names); } - if ((attr = ippFindAttribute(response, "finishings-col-database", IPP_TAG_BEGIN_COLLECTION)) != NULL) + if ((attr = ippFindAttribute(supported, "finishings-col-database", IPP_TAG_BEGIN_COLLECTION)) != NULL) { ipp_t *finishing_col; /* Current finishing collection */ ipp_attribute_t *finishing_attr; /* Current finishing member attribute */ @@ -4438,168 +4814,10 @@ cupsArrayDelete(fin_options); /* - * cupsPrintQuality and DefaultResolution... - */ - - quality = ippFindAttribute(response, "print-quality-supported", IPP_TAG_ENUM); - - 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... - */ - - goto bad_ppd; - } - else - { - /* - * Generate print qualities based on low and high DPIs... - */ - - cupsFilePrintf(fp, "*DefaultResolution: %ddpi\n", lowdpi); - - cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" - "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" - "*%s.Translation cupsPrintQuality/%s: \"\"\n" - "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); - if ((lowdpi & 1) == 0) - cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", lowdpi, lowdpi / 2, lang->language, _cupsLangString(lang, _("Draft"))); - else if (ippContainsInteger(quality, IPP_QUALITY_DRAFT)) - cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", lowdpi, lowdpi, lang->language, _cupsLangString(lang, _("Draft"))); - - cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n*%s.cupsPrintQuality Normal/%s: \"\"\n", lowdpi, lowdpi, lang->language, _cupsLangString(lang, _("Normal"))); - - if (hidpi > lowdpi || ippContainsInteger(quality, IPP_QUALITY_HIGH)) - cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n*%s.cupsPrintQuality High/%s: \"\"\n", hidpi, hidpi, lang->language, _cupsLangString(lang, _("High"))); - cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); - } - } - else if ((attr = ippFindAttribute(response, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL) - { - /* - * Make a sorted list of resolutions. - */ - - count = ippGetCount(attr); - if (count > (int)(sizeof(resolutions) / sizeof(resolutions[0]))) - count = (int)(sizeof(resolutions) / sizeof(resolutions[0])); - - resolutions[0] = 0; /* Not in loop to silence Clang static analyzer... */ - for (i = 1; i < count; i ++) - resolutions[i] = i; - - for (i = 0; i < (count - 1); i ++) - { - for (j = i + 1; j < count; j ++) - { - int ix, iy, /* First X and Y resolution */ - jx, jy, /* Second X and Y resolution */ - temp; /* Swap variable */ - ipp_res_t units; /* Resolution units */ - - ix = ippGetResolution(attr, resolutions[i], &iy, &units); - jx = ippGetResolution(attr, resolutions[j], &jy, &units); - - if (ix > jx || (ix == jx && iy > jy)) - { - /* - * Swap these two resolutions... - */ - - temp = resolutions[i]; - resolutions[i] = resolutions[j]; - resolutions[j] = temp; - } - } - } - - /* - * Generate print quality options... - */ - - pwg_ppdize_resolution(attr, resolutions[count / 2], &xres, &yres, ppdname, sizeof(ppdname)); - cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname); - - cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" - "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" - "*%s.Translation cupsPrintQuality/%s: \"\"\n" - "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); - if (count > 2 || ippContainsInteger(quality, IPP_QUALITY_DRAFT)) - { - pwg_ppdize_resolution(attr, resolutions[0], &xres, &yres, NULL, 0); - cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n", xres, yres); - cupsFilePrintf(fp, "*%s.cupsPrintQuality Draft/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Draft"))); - } - - pwg_ppdize_resolution(attr, resolutions[count / 2], &xres, &yres, NULL, 0); - cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n", xres, yres); - cupsFilePrintf(fp, "*%s.cupsPrintQuality Normal/%s: \"\"\n", lang->language, _cupsLangString(lang, _("Normal"))); - - if (count > 1 || ippContainsInteger(quality, IPP_QUALITY_HIGH)) - { - pwg_ppdize_resolution(attr, resolutions[count - 1], &xres, &yres, NULL, 0); - cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n", xres, yres); - cupsFilePrintf(fp, "*%s.cupsPrintQuality High/%s: \"\"\n", lang->language, _cupsLangString(lang, _("High"))); - } - - cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); - } - else if (is_apple || is_pwg) - goto bad_ppd; - else - { - if ((attr = ippFindAttribute(response, "printer-resolution-default", IPP_TAG_RESOLUTION)) != NULL) - { - pwg_ppdize_resolution(attr, 0, &xres, &yres, ppdname, sizeof(ppdname)); - } - else - { - xres = yres = 300; - strlcpy(ppdname, "300dpi", sizeof(ppdname)); - } - - cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname); - - cupsFilePrintf(fp, "*OpenUI *cupsPrintQuality: PickOne\n" - "*OrderDependency: 10 AnySetup *cupsPrintQuality\n" - "*%s.Translation cupsPrintQuality/%s: \"\"\n" - "*DefaultcupsPrintQuality: Normal\n", lang->language, _cupsLangString(lang, _("Print Quality"))); - if (ippContainsInteger(quality, IPP_QUALITY_DRAFT)) - cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<>setpagedevice\"\n*%s.cupsPrintQuality Draft/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("Draft"))); - - cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<>setpagedevice\"\n*%s.cupsPrintQuality Normal/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("Normal"))); - - if (ippContainsInteger(quality, IPP_QUALITY_HIGH)) - cupsFilePrintf(fp, "*cupsPrintQuality High: \"<>setpagedevice\"\n*%s.cupsPrintQuality High/%s: \"\"\n", xres, yres, lang->language, _cupsLangString(lang, _("High"))); - cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n"); - } - - /* * Presets... */ - if ((attr = ippFindAttribute(response, "job-presets-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) + if ((attr = ippFindAttribute(supported, "job-presets-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL) { for (i = 0, count = ippGetCount(attr); i < count; i ++) { @@ -4919,41 +5137,59 @@ /* - * 'cups_get_url()' - Get a copy of the file at the given URL. + * 'cups_connect()' - Connect to a URL and get the resource path. */ static int /* O - 1 on success, 0 on failure */ -cups_get_url(http_t **http, /* IO - Current HTTP connection */ - const char *url, /* I - URL to get */ - char *name, /* I - Temporary filename */ - size_t namesize) /* I - Size of temporary filename buffer */ +cups_connect(http_t **http, /* IO - Current HTTP connection */ + const char *url, /* I - URL to connect */ + char *resource, /* I - Resource path buffer */ + size_t ressize) /* I - Size of resource path buffer */ { char scheme[32], /* URL scheme */ userpass[256], /* URL username:password */ host[256], /* URL host */ - curhost[256], /* Current host */ - resource[256]; /* URL resource */ + curhost[256]; /* Current host */ int port; /* URL port */ http_encryption_t encryption; /* Type of encryption to use */ - http_status_t status; /* Status of GET request */ - int fd; /* Temporary file */ - if (httpSeparateURI(HTTP_URI_CODING_ALL, url, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) + // Separate the URI... + if (httpSeparateURI(HTTP_URI_CODING_ALL, url, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, ressize) < HTTP_URI_STATUS_OK) return (0); - if (port == 443 || !strcmp(scheme, "https")) + // Use encryption as needed.. + if (port == 443 || !strcmp(scheme, "https") || !strcmp(scheme, "ipps")) encryption = HTTP_ENCRYPTION_ALWAYS; else encryption = HTTP_ENCRYPTION_IF_REQUESTED; - if (!*http || strcasecmp(host, httpGetHostname(*http, curhost, sizeof(curhost))) || httpAddrPort(httpGetAddress(*http)) != port) + if (!*http || strcasecmp(host, httpGetHostname(*http, curhost, sizeof(curhost))) || httpAddrPort(httpGetAddress(*http)) != port || httpIsEncrypted(*http) != (encryption == HTTP_ENCRYPTION_ALWAYS)) { httpClose(*http); *http = httpConnect2(host, port, NULL, AF_UNSPEC, encryption, 1, 5000, NULL); } - if (!*http) + return (*http != NULL); +} + + +/* + * 'cups_get_url()' - Get a copy of the file at the given URL. + */ + +static int /* O - 1 on success, 0 on failure */ +cups_get_url(http_t **http, /* IO - Current HTTP connection */ + const char *url, /* I - URL to get */ + char *name, /* I - Temporary filename */ + size_t namesize) /* I - Size of temporary filename buffer */ +{ + char resource[256]; /* URL resource */ + http_status_t status; /* Status of GET request */ + int fd; /* Temporary file */ + + + if (!cups_connect(http, url, resource, sizeof(resource))) return (0); if ((fd = cupsTempFd(name, (int)namesize)) < 0) diff -Nru cups-2.3.3op2/cups/ppd-private.h cups-2.4.1op1/cups/ppd-private.h --- cups-2.3.3op2/cups/ppd-private.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/ppd-private.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Private PPD definitions for CUPS. * + * Copyright © 2021 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -35,7 +36,7 @@ * Constants... */ -# define _PPD_CACHE_VERSION 9 /* Version number in cache file */ +# define _PPD_CACHE_VERSION 10 /* Version number in cache file */ /* @@ -188,6 +189,7 @@ extern int _ppdCacheWriteFile(_ppd_cache_t *pc, const char *filename, ipp_t *attrs) _CUPS_PRIVATE; extern char *_ppdCreateFromIPP(char *buffer, size_t bufsize, ipp_t *response) _CUPS_PRIVATE; +extern char *_ppdCreateFromIPP2(char *buffer, size_t bufsize, ipp_t *response, cups_lang_t *lang) _CUPS_PRIVATE; extern void _ppdFreeLanguages(cups_array_t *languages) _CUPS_PRIVATE; extern cups_encoding_t _ppdGetEncoding(const char *name) _CUPS_PRIVATE; extern cups_array_t *_ppdGetLanguages(ppd_file_t *ppd) _CUPS_PRIVATE; diff -Nru cups-2.3.3op2/cups/ppd-util.c cups-2.4.1op1/cups/ppd-util.c --- cups-2.3.3op2/cups/ppd-util.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/ppd-util.c 2022-01-27 11:11:42.000000000 +0000 @@ -226,17 +226,21 @@ * per-process TMPDIR value. */ +#ifdef _CS_DARWIN_USER_TEMP_DIR char tmppath[1024]; /* Temporary directory */ +#endif /* _CS_DARWIN_USER_TEMP_DIR */ if ((tmpdir = getenv("TMPDIR")) != NULL && access(tmpdir, W_OK)) tmpdir = NULL; if (!tmpdir) { +#ifdef _CS_DARWIN_USER_TEMP_DIR if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmppath, sizeof(tmppath))) tmpdir = tmppath; else - tmpdir = "/private/tmp"; /* This should never happen */ +#endif /* _CS_DARWIN_USER_TEMP_DIR */ + tmpdir = "/private/tmp"; /* OS X 10.4 and earlier */ } #else /* diff -Nru cups-2.3.3op2/cups/ppd.c cups-2.4.1op1/cups/ppd.c --- cups-2.3.3op2/cups/ppd.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/ppd.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * PPD file routines for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -125,6 +126,7 @@ free(ppd->lang_encoding); free(ppd->nickname); free(ppd->patches); + free(ppd->emulations); free(ppd->jcl_begin); free(ppd->jcl_end); free(ppd->jcl_ps); @@ -871,15 +873,15 @@ ppd_decode(ppd->jcl_ps); /* Decode quoted string */ } else if (!strcmp(keyword, "AccurateScreensSupport")) - ppd->accurate_screens = !strcmp(string, "True"); + ppd->accurate_screens = !strcasecmp(string, "True"); else if (!strcmp(keyword, "ColorDevice")) - ppd->color_device = !strcmp(string, "True"); + ppd->color_device = !strcasecmp(string, "True"); else if (!strcmp(keyword, "ContoneOnly")) - ppd->contone_only = !strcmp(string, "True"); + ppd->contone_only = !strcasecmp(string, "True"); else if (!strcmp(keyword, "cupsFlipDuplex")) - ppd->flip_duplex = !strcmp(string, "True"); + ppd->flip_duplex = !strcasecmp(string, "True"); else if (!strcmp(keyword, "cupsManualCopies")) - ppd->manual_copies = !strcmp(string, "True"); + ppd->manual_copies = !strcasecmp(string, "True"); else if (!strcmp(keyword, "cupsModelNumber")) ppd->model_number = atoi(string); else if (!strcmp(keyword, "cupsColorProfile")) @@ -2391,8 +2393,16 @@ * Copy data over... */ + if (!_cups_strcasecmp(spec, "custom") || !_cups_strncasecmp(spec, "custom.", 7)) + { + temp->spec[0] = '_'; + strlcpy(temp->spec + 1, spec, sizeof(temp->spec) - 1); + } + else { + strlcpy(temp->spec, spec, sizeof(temp->spec)); + } + strlcpy(temp->name, name, sizeof(temp->name)); - strlcpy(temp->spec, spec, sizeof(temp->spec)); strlcpy(temp->text, text, sizeof(temp->text)); temp->value = (char *)value; diff -Nru cups-2.3.3op2/cups/pwg-media.c cups-2.4.1op1/cups/pwg-media.c --- cups-2.3.3op2/cups/pwg-media.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/pwg-media.c 2022-01-27 11:11:42.000000000 +0000 @@ -448,13 +448,13 @@ size->width = x_dimension->values[0].integer; size->length = y_dimension->values[0].integer; } - else if (!x_dimension) + else if (!x_dimension) /* x_dimension is missing */ { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing x-dimension in media-size."), 1); return (0); } - else if (!y_dimension) + else /* y_dimension must be missing */ { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing y-dimension in media-size."), 1); diff -Nru cups-2.3.3op2/cups/request.c cups-2.4.1op1/cups/request.c --- cups-2.3.3op2/cups/request.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/request.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * IPP utilities for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -425,7 +427,7 @@ http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED; } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* @@ -437,7 +439,7 @@ if (!httpReconnect2(http, 30000, NULL)) httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } if (response) @@ -628,7 +630,7 @@ return (HTTP_STATUS_ERROR); } -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * See if we have an auth-info attribute and are communicating over * a non-local link. If so, encrypt the link so that we can pass @@ -642,7 +644,7 @@ DEBUG_puts("1cupsSendRequest: Unable to encrypt connection."); return (HTTP_STATUS_SERVICE_UNAVAILABLE); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Reconnect if the last response had a "Connection: close"... @@ -833,7 +835,7 @@ } break; -#ifdef HAVE_SSL +#ifdef HAVE_TLS case HTTP_STATUS_UPGRADE_REQUIRED : /* * Flush any error message, reconnect, and then upgrade with @@ -856,7 +858,7 @@ return (HTTP_STATUS_SERVICE_UNAVAILABLE); } break; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ case HTTP_STATUS_EXPECTATION_FAILED : /* diff -Nru cups-2.3.3op2/cups/sidechannel.h cups-2.4.1op1/cups/sidechannel.h --- cups-2.3.3op2/cups/sidechannel.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/sidechannel.h 2022-01-27 11:11:42.000000000 +0000 @@ -19,8 +19,8 @@ # if defined(_WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) # define __CUPS_SSIZE_T_DEFINED # include -/* Windows does not support the ssize_t type, so map it to long... */ -typedef long ssize_t; /* @private@ */ +/* Windows does not support the ssize_t type, so map it to __int64... */ +typedef __int64 ssize_t; /* @private@ */ # endif /* _WIN32 && !__CUPS_SSIZE_T_DEFINED */ diff -Nru cups-2.3.3op2/cups/snprintf.c cups-2.4.1op1/cups/snprintf.c --- cups-2.3.3op2/cups/snprintf.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/snprintf.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * snprintf functions for CUPS. * - * Copyright © 2021 by Michael R Sweet + * Copyright © 2021-2022 by OpenPrinting * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * @@ -323,7 +323,8 @@ * Nul-terminate the string and return the number of characters needed. */ - *bufptr = '\0'; + if (bufptr && bufptr < bufend) + *bufptr = '\0'; return (bytes); } diff -Nru cups-2.3.3op2/cups/string-private.h cups-2.4.1op1/cups/string-private.h --- cups-2.3.3op2/cups/string-private.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/string-private.h 2022-01-27 11:11:42.000000000 +0000 @@ -19,6 +19,7 @@ # include # include # include +# include # include # include # include @@ -26,23 +27,12 @@ # include -# ifdef HAVE_STRING_H -# include -# endif /* HAVE_STRING_H */ - -# ifdef HAVE_STRINGS_H -# include -# endif /* HAVE_STRINGS_H */ - -# ifdef HAVE_BSTRING_H -# include -# endif /* HAVE_BSTRING_H */ # if defined(_WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) # define __CUPS_SSIZE_T_DEFINED # include -/* Windows does not support the ssize_t type, so map it to long... */ -typedef long ssize_t; /* @private@ */ +/* Windows does not support the ssize_t type, so map it to __int64... */ +typedef __int64 ssize_t; /* @private@ */ # endif /* _WIN32 && !__CUPS_SSIZE_T_DEFINED */ diff -Nru cups-2.3.3op2/cups/tempfile.c cups-2.4.1op1/cups/tempfile.c --- cups-2.3.3op2/cups/tempfile.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/tempfile.c 2022-01-27 11:11:42.000000000 +0000 @@ -38,9 +38,9 @@ int fd; /* File descriptor for temp file */ int tries; /* Number of tries */ const char *tmpdir; /* TMPDIR environment var */ -#if defined(__APPLE__) || defined(_WIN32) +#if (defined(__APPLE__) && defined(_CS_DARWIN_USER_TEMP_DIR)) || defined(_WIN32) char tmppath[1024]; /* Temporary directory */ -#endif /* __APPLE__ || _WIN32 */ +#endif /* (__APPLE__ && _CS_DARWIN_USER_TEMP_DIR) || _WIN32 */ #ifdef _WIN32 DWORD curtime; /* Current time */ #else @@ -72,10 +72,12 @@ if (!tmpdir) { +#ifdef _CS_DARWIN_USER_TEMP_DIR if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmppath, sizeof(tmppath))) tmpdir = tmppath; else - tmpdir = "/private/tmp"; /* This should never happen */ +#endif /* _CS_DARWIN_USER_TEMP_DIR */ + tmpdir = "/private/tmp"; /* OS X 10.4 and earlier */ } #else diff -Nru cups-2.3.3op2/cups/testclient.c cups-2.4.1op1/cups/testclient.c --- cups-2.3.3op2/cups/testclient.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/testclient.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * Simulated client test program for CUPS. * - * Copyright © 2020 by Michael R Sweet + * Copyright © 2020-2022 by OpenPrinting * Copyright © 2017-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -85,9 +85,7 @@ { int i; /* Looping var */ const char *opt; /* Current option */ - int num_clients = 0,/* Number of clients to simulate */ - clients_started = 0; - /* Number of clients that have been started */ + int num_clients = 0;/* Number of clients to simulate */ char scheme[32], /* URI scheme */ userpass[256], /* Username:password */ hostname[256], /* Hostname */ @@ -242,7 +240,7 @@ data.hostname = hostname; data.resource = resource; - while (clients_started < num_clients) + while (client_count < num_clients) { _cupsMutexLock(&client_mutex); if (client_count < MAX_CLIENTS) @@ -859,33 +857,47 @@ * Create a job and wait for completion... */ - request = ippNewRequest(IPP_OP_CREATE_JOB); - ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, ldata.uri); - ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); + do + { + request = ippNewRequest(IPP_OP_CREATE_JOB); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, ldata.uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); - if ((name = strrchr(ldata.docfile, '/')) != NULL) - name ++; - else - name = ldata.docfile; + if ((name = strrchr(ldata.docfile, '/')) != NULL) + name ++; + else + name = ldata.docfile; - ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, name); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, name); - if (verbosity) - show_attributes("Create-Job request", 1, request); + if (verbosity) + show_attributes("Create-Job request", 1, request); - response = cupsDoRequest(http, request, ldata.resource); + response = cupsDoRequest(http, request, ldata.resource); - if (verbosity) - show_attributes("Create-Job response", 0, response); + if (verbosity) + show_attributes("Create-Job response", 0, response); - if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE) - { - printf("Unable to create print job: %s\n", cupsLastErrorString()); + if (cupsLastError() == IPP_STATUS_ERROR_BUSY) + { + puts("Printer is busy - retrying in 5 seconds..."); + sleep(5); + ippDelete(response); + response = NULL; + } + else if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE) + { + printf("Unable to create print job: %s\n", cupsLastErrorString()); - ldata.job_state = IPP_JSTATE_ABORTED; + ldata.job_state = IPP_JSTATE_ABORTED; + ippDelete(response); + response = NULL; + } + } + while (cupsLastError() == IPP_STATUS_ERROR_BUSY); + if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE) goto cleanup; - } if ((attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) == NULL) { diff -Nru cups-2.3.3op2/cups/testfile.c cups-2.4.1op1/cups/testfile.c --- cups-2.3.3op2/cups/testfile.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/testfile.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* - * File test program for CUPS. + * File/directory test program for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * @@ -15,6 +16,7 @@ #include "string-private.h" #include "debug-private.h" #include "file.h" +#include "dir.h" #include #include #ifdef _WIN32 @@ -43,6 +45,7 @@ char *argv[]) /* I - Command-line arguments */ { int status; /* Exit status */ + int i; /* Looping var */ char filename[1024]; /* Filename buffer */ cups_file_t *fp; /* File pointer */ #ifndef _WIN32 @@ -181,6 +184,101 @@ } /* + * Test directory functions... + */ + + fputs("\nCreating test directory \"test.d\"...\n", stdout); + fputs("mkdir(test.d): ", stdout); + if (mkdir("test.d", 0777)) + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + else + { + int num_files; // Number of files seen + cups_dir_t *dir; // Directory pointer + cups_dentry_t *dent; // Directory entry + + puts("PASS"); + + fputs("cupsDirOpen(test.d): ", stdout); + if ((dir = cupsDirOpen("test.d")) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + else + { + puts("PASS"); + fputs("cupsDirRead: ", stdout); + if ((dent = cupsDirRead(dir)) != NULL) + { + printf("FAIL (Got '%s', expected NULL)\n", dent->filename); + status ++; + } + else + puts("PASS"); + + cupsDirClose(dir); + } + + // Create some files... + for (i = 0; i < 10; i ++) + { + snprintf(filename, sizeof(filename), "test.d/testfile%d.txt", i); + printf("cupsFileOpen(%s): ", filename); + if ((fp = cupsFileOpen(filename, "w")) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + break; + } + else + { + puts("PASS"); + cupsFilePuts(fp, "This is a test.\n"); + cupsFileClose(fp); + } + } + + if (i >= 10) + { + fputs("cupsDirOpen(test.d): ", stdout); + if ((dir = cupsDirOpen("test.d")) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + else + { + puts("PASS"); + fputs("cupsDirRead: ", stdout); + for (num_files = 0; (dent = cupsDirRead(dir)) != NULL; num_files ++) + printf("%s ", dent->filename); + if (num_files != 10) + { + printf("FAIL (Got %d files, expected 10)\n", num_files); + status ++; + } + else + puts("PASS"); + + cupsDirClose(dir); + } + } + + // Cleanup + for (i = 0; i < 10; i ++) + { + snprintf(filename, sizeof(filename), "test.d/testfile%d.txt", i); + unlink(filename); + } + + rmdir("test.d"); + } + + /* * Summarize the results and return... */ diff -Nru cups-2.3.3op2/cups/testhttp.c cups-2.4.1op1/cups/testhttp.c --- cups-2.3.3op2/cups/testhttp.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/testhttp.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * HTTP test program for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * @@ -780,7 +781,7 @@ continue; } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ @@ -799,7 +800,7 @@ /* Try again, this time with encryption enabled... */ continue; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED); @@ -882,7 +883,7 @@ continue; } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (status == HTTP_STATUS_UPGRADE_REQUIRED) { /* Flush any error message... */ @@ -901,7 +902,7 @@ /* Try again, this time with encryption enabled... */ continue; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED); diff -Nru cups-2.3.3op2/cups/testi18n.c cups-2.4.1op1/cups/testi18n.c --- cups-2.3.3op2/cups/testi18n.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/testi18n.c 2022-01-27 11:11:42.000000000 +0000 @@ -167,6 +167,7 @@ if (encoding == CUPS_AUTO_ENCODING) { fprintf(stderr, "%s: Unknown character set!\n", argv[2]); + fclose(fp); return (1); } @@ -175,6 +176,7 @@ if (cupsCharsetToUTF8(utf8dest, line, sizeof(utf8dest), encoding) < 0) { fprintf(stderr, "%s: Unable to convert line: %s", argv[1], line); + fclose(fp); return (1); } diff -Nru cups-2.3.3op2/cups/testlang.c cups-2.4.1op1/cups/testlang.c --- cups-2.3.3op2/cups/testlang.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/testlang.c 2022-01-27 11:11:42.000000000 +0000 @@ -5,10 +5,12 @@ * * ./testlang [-l locale] [-p ppd] ["String to localize"] * - * Copyright 2007-2017 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2017 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -20,6 +22,7 @@ #ifdef __APPLE__ # include #endif /* __APPLE__ */ +#include /* @@ -27,6 +30,10 @@ */ static int show_ppd(const char *filename); +#ifdef __APPLE__ +static int test_apple(void); +#endif // __APPLE__ +static int test_language(const char *locale); static int test_string(cups_lang_t *language, const char *msgid); static void usage(void); @@ -39,23 +46,12 @@ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { - int i; /* Looping var */ - const char *opt; /* Current option */ - int errors = 0; /* Number of errors */ - int dotests = 1; /* Do standard tests? */ - cups_lang_t *language = NULL;/* Message catalog */ - cups_lang_t *language2 = NULL; - /* Message catalog (second time) */ - struct lconv *loc; /* Locale data */ - char buffer[1024]; /* String buffer */ - double number; /* Number */ - static const char * const tests[] = /* Test strings */ - { - "1", - "-1", - "3", - "5.125" - }; + int i; /* Looping var */ + const char *opt; /* Current option */ + int errors = 0; /* Number of errors */ + int dotests = 1; /* Do standard tests? */ + const char *lang = NULL; /* Single language test? */ + cups_lang_t *language = NULL; /* Message catalog */ /* @@ -86,11 +82,7 @@ return (1); } - language = cupsLangGet(argv[i]); - language2 = cupsLangGet(argv[i]); - - setenv("LANG", argv[i], 1); - setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1); + lang = argv[i]; break; case 'p' : @@ -101,12 +93,6 @@ return (1); } - if (!language) - { - language = cupsLangDefault(); - language2 = cupsLangDefault(); - } - dotests = 0; errors += show_ppd(argv[i]); break; @@ -121,165 +107,62 @@ else { if (!language) - { - language = cupsLangDefault(); - language2 = cupsLangDefault(); - } + language = cupsLangGet(lang); dotests = 0; errors += test_string(language, argv[i]); } } - if (!language) - { - language = cupsLangDefault(); - language2 = cupsLangDefault(); - } - - if (language != language2) - { - errors ++; - - puts("**** ERROR: Language cache did not work! ****"); - puts("First result from cupsLangGet:"); - } - - printf("Language = \"%s\"\n", language->language); - printf("Encoding = \"%s\"\n", _cupsEncodingName(language->encoding)); - if (dotests) { - errors += test_string(language, "No"); - errors += test_string(language, "Yes"); - - if (language != language2) + if (lang) { - puts("Second result from cupsLangGet:"); + /* + * Test a single language... + */ - printf("Language = \"%s\"\n", language2->language); - printf("Encoding = \"%s\"\n", _cupsEncodingName(language2->encoding)); - printf("No = \"%s\"\n", _cupsLangString(language2, "No")); - printf("Yes = \"%s\"\n", _cupsLangString(language2, "Yes")); + errors += test_language(lang); } - - loc = localeconv(); - - for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i ++) - { - number = _cupsStrScand(tests[i], NULL, loc); - - printf("_cupsStrScand(\"%s\") number=%f\n", tests[i], number); - - _cupsStrFormatd(buffer, buffer + sizeof(buffer), number, loc); - - printf("_cupsStrFormatd(%f) buffer=\"%s\"\n", number, buffer); - - if (strcmp(buffer, tests[i])) - { - errors ++; - puts("**** ERROR: Bad formatted number! ****"); - } - } - -#ifdef __APPLE__ - /* - * Test all possible language IDs for compatibility with _cupsAppleLocale... - */ - - CFIndex j, /* Looping var */ - num_locales; /* Number of locales */ - CFArrayRef locales; /* Locales */ - CFStringRef locale_id, /* Current locale ID */ - language_id; /* Current language ID */ - char locale_str[256], /* Locale ID C string */ - language_str[256], /* Language ID C string */ - *bufptr; /* Pointer to ".UTF-8" in POSIX locale */ - size_t buflen; /* Length of POSIX locale */ -# if TEST_COUNTRY_CODES - CFIndex k, /* Looping var */ - num_country_codes; /* Number of country codes */ - CFArrayRef country_codes; /* Country codes */ - CFStringRef country_code, /* Current country code */ - temp_id; /* Temporary language ID */ - char country_str[256]; /* Country code C string */ -# endif /* TEST_COUNTRY_CODES */ - - locales = CFLocaleCopyAvailableLocaleIdentifiers(); - num_locales = CFArrayGetCount(locales); - -# if TEST_COUNTRY_CODES - country_codes = CFLocaleCopyISOCountryCodes(); - num_country_codes = CFArrayGetCount(country_codes); -# endif /* TEST_COUNTRY_CODES */ - - printf("%d locales are available:\n", (int)num_locales); - - for (j = 0; j < num_locales; j ++) + else { - locale_id = CFArrayGetValueAtIndex(locales, j); - language_id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale_id); - - if (!locale_id || !CFStringGetCString(locale_id, locale_str, (CFIndex)sizeof(locale_str), kCFStringEncodingASCII)) - { - printf("%d: FAIL (unable to get locale ID string)\n", (int)j + 1); - errors ++; - continue; - } + /* + * Test all locales we find in LOCALEDIR... + */ - if (!language_id || !CFStringGetCString(language_id, language_str, (CFIndex)sizeof(language_str), kCFStringEncodingASCII)) - { - printf("%d %s: FAIL (unable to get language ID string)\n", (int)j + 1, locale_str); - errors ++; - continue; - } + cups_dir_t *dir; /* Locale directory */ + cups_dentry_t *dent; /* Directory entry */ - if (!_cupsAppleLocale(language_id, buffer, sizeof(buffer))) + if ((dir = cupsDirOpen(getenv("LOCALEDIR"))) != NULL) { - printf("%d %s(%s): FAIL (unable to convert language ID string to POSIX locale)\n", (int)j + 1, locale_str, language_str); - errors ++; - continue; + while ((dent = cupsDirRead(dir)) != NULL) + errors += test_language(dent->filename); } - - if ((bufptr = strstr(buffer, ".UTF-8")) != NULL) - buflen = (size_t)(bufptr - buffer); else - buflen = strlen(buffer); - - if ((language = cupsLangGet(buffer)) == NULL) { - printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\")\n", (int)j + 1, locale_str, language_str, buffer); - errors ++; - continue; + // No LOCALEDIR, just use the default language... + errors += test_language(NULL); } - if (strncasecmp(language->language, buffer, buflen)) - { - printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\", got \"%s\")\n", (int)j + 1, locale_str, language_str, buffer, language->language); - errors ++; - continue; - } - - printf("%d %s(%s): PASS (POSIX locale is \"%s\")\n", (int)j + 1, locale_str, language_str, buffer); + cupsDirClose(dir); } - CFRelease(locales); +#ifdef __APPLE__ + errors += test_apple(); +#endif // __APPLE__ -# if TEST_COUNTRY_CODES - CFRelease(country_codes); -# endif /* TEST_COUNTRY_CODES */ -#endif /* __APPLE__ */ + if (!errors) + puts("ALL TESTS PASSED"); } - if (errors == 0 && dotests) - puts("ALL TESTS PASSED"); - return (errors > 0); } /* * 'show_ppd()' - Show localized strings in a PPD file. + * + * TODO: Move this to the testppd program. */ static int /* O - Number of errors */ @@ -327,15 +210,237 @@ } +#ifdef __APPLE__ +/* + * 'test_apple()' - Test macOS locale handing... + */ + +static int /* O - Number of errors */ +test_apple(void) +{ + int errors = 0; /* Number of errors */ + CFIndex i, /* Looping var */ + num_locales; /* Number of locales */ + CFArrayRef locales; /* Locales */ + CFStringRef locale_id, /* Current locale ID */ + language_id; /* Current language ID */ + cups_lang_t *language = NULL; /* Message catalog */ + char locale_str[256], /* Locale ID C string */ + language_str[256], /* Language ID C string */ + buffer[1024], /* String buffer */ + *bufptr; /* Pointer to ".UTF-8" in POSIX locale */ + size_t buflen; /* Length of POSIX locale */ + + + /* + * Test all possible language IDs for compatibility with _cupsAppleLocale... + */ + + locales = CFLocaleCopyAvailableLocaleIdentifiers(); + num_locales = CFArrayGetCount(locales); + + printf("CFLocaleCopyAvailableLocaleIdentifiers: %d locales\n", (int)num_locales); + + for (i = 0; i < num_locales; i ++) + { + locale_id = CFArrayGetValueAtIndex(locales, i); + language_id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale_id); + + printf("CFStringGetCString(locale_id %d): ", (int)i); + if (!locale_id || !CFStringGetCString(locale_id, locale_str, (CFIndex)sizeof(locale_str), kCFStringEncodingASCII)) + { + puts("FAIL"); + errors ++; + continue; + } + else + printf("PASS (\"%s\")\n", locale_str); + + printf("CFStringGetCString(language_id %d): ", (int)i); + if (!language_id || !CFStringGetCString(language_id, language_str, (CFIndex)sizeof(language_str), kCFStringEncodingASCII)) + { + printf("%d %s: FAIL (unable to get language ID string)\n", (int)i + 1, locale_str); + errors ++; + continue; + } + else + printf("PASS (\"%s\")\n", language_str); + + printf("_cupsAppleLocale(\"%s\"): ", language_str); + if (!_cupsAppleLocale(language_id, buffer, sizeof(buffer))) + { + puts("FAIL"); + errors ++; + continue; + } + else + printf("PASS (\"%s\")\n", buffer); + + if ((bufptr = strstr(buffer, ".UTF-8")) != NULL) + buflen = (size_t)(bufptr - buffer); + else + buflen = strlen(buffer); + + printf("cupsLangGet(\"%s\"): ", buffer); + if ((language = cupsLangGet(buffer)) == NULL) + { + puts("FAIL"); + errors ++; + continue; + } + else if (strncasecmp(language->language, buffer, buflen)) + { + printf("FAIL (got \"%s\")\n", language->language); + errors ++; + continue; + } + else + puts("PASS"); + } + + CFRelease(locales); + + return (errors); +} +#endif // __APPLE__ + + +/* + * 'test_language()' - Test a specific language... + */ + +static int /* O - Number of errors */ +test_language(const char *lang) /* I - Locale language code, NULL for default */ +{ + int i; /* Looping var */ + int errors = 0; /* Number of errors */ + cups_lang_t *language = NULL, /* Message catalog */ + *language2 = NULL; /* Message catalog (second time) */ + struct lconv *loc; /* Locale data */ + char buffer[1024]; /* String buffer */ + double number; /* Number */ + static const char * const tests[] = /* Test strings */ + { + "1", + "-1", + "3", + "5.125" + }; + + + // Override the locale environment as needed... + if (lang) + { + // Test the specified locale code... + setenv("LANG", lang, 1); + setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1); + + printf("cupsLangGet(\"%s\"): ", lang); + if ((language = cupsLangGet(lang)) == NULL) + { + puts("FAIL"); + errors ++; + } + else if (strcasecmp(language->language, lang)) + { + printf("FAIL (got \"%s\")\n", language->language); + errors ++; + } + else + puts("PASS"); + + printf("cupsLangGet(\"%s\") again: ", lang); + if ((language2 = cupsLangGet(lang)) == NULL) + { + puts("FAIL"); + errors ++; + } + else if (strcasecmp(language2->language, lang)) + { + printf("FAIL (got \"%s\")\n", language2->language); + errors ++; + } + else if (language2 != language) + { + puts("FAIL (cache failure)"); + errors ++; + } + else + puts("PASS"); + } + else + { + // Test the default locale... + fputs("cupsLangDefault: ", stdout); + if ((language = cupsLangDefault()) == NULL) + { + puts("FAIL"); + errors ++; + } + else + puts("PASS"); + + fputs("cupsLangDefault again: ", stdout); + if ((language2 = cupsLangDefault()) == NULL) + { + puts("FAIL"); + errors ++; + } + else if (language2 != language) + { + puts("FAIL (cache failure)"); + errors ++; + } + else + puts("PASS"); + } + + printf("language->language: \"%s\"\n", language->language); + printf("_cupsEncodingName(language): \"%s\"\n", _cupsEncodingName(language->encoding)); + + errors += test_string(language, "No"); + errors += test_string(language, "Yes"); + + if (language != language2) + { + printf("language2->language: \"%s\"\n", language2->language); + printf("_cupsEncodingName(language2): \"%s\"\n", _cupsEncodingName(language2->encoding)); + } + + loc = localeconv(); + + for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i ++) + { + number = _cupsStrScand(tests[i], NULL, loc); + + printf("_cupsStrScand(\"%s\"): %f\n", tests[i], number); + + _cupsStrFormatd(buffer, buffer + sizeof(buffer), number, loc); + + printf("_cupsStrFormatd(%f): ", number); + + if (strcmp(buffer, tests[i])) + { + errors ++; + printf("FAIL (got \"%s\")\n", buffer); + } + else + puts("PASS"); + } + + return (errors); +} + + /* * 'test_string()' - Test the localization of a string. */ -static int /* O - 1 on failure, 0 on success */ -test_string(cups_lang_t *language, /* I - Language */ - const char *msgid) /* I - Message */ +static int /* O - 1 on failure, 0 on success */ +test_string(cups_lang_t *language, /* I - Language */ + const char *msgid) /* I - Message */ { - const char *msgstr; /* Localized string */ + const char *msgstr; /* Localized string */ /* @@ -345,19 +450,20 @@ * For any other locale, the string pointers should be different. */ + printf("_cupsLangString(\"%s\"): ", msgid); msgstr = _cupsLangString(language, msgid); if (strcmp(language->language, "C") && msgid == msgstr) { - printf("%-8s = \"%s\" (FAIL - no message catalog loaded)\n", msgid, msgstr); + puts("FAIL (no message catalog loaded)"); return (1); } else if (!strcmp(language->language, "C") && msgid != msgstr) { - printf("%-8s = \"%s\" (FAIL - POSIX locale is localized)\n", msgid, msgstr); + puts("FAIL (POSIX locale is localized)"); return (1); } - printf("%-8s = \"%s\" (PASS)\n", msgid, msgstr); + printf("PASS (\"%s\")\n", msgstr); return (0); } @@ -370,5 +476,7 @@ static void usage(void) { - puts("./testlang [-l locale] [-p ppd] [\"String to localize\"]"); + puts("Usage: ./testlang [-l locale] [-p ppd] [\"String to localize\"]"); + puts(""); + puts("If no arguments are specified, all locales are tested."); } diff -Nru cups-2.3.3op2/cups/thread.c cups-2.4.1op1/cups/thread.c --- cups-2.3.3op2/cups/thread.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/thread.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Threading primitives for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2009-2018 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -62,10 +63,10 @@ abstime.tv_sec ++; }; - pthread_cond_timedwait(cond, mutex, &abstime); + (void)pthread_cond_timedwait(cond, mutex, &abstime); } else - pthread_cond_wait(cond, mutex); + (void)pthread_cond_wait(cond, mutex); } diff -Nru cups-2.3.3op2/cups/tls-darwin.c cups-2.4.1op1/cups/tls-darwin.c --- cups-2.3.3op2/cups/tls-darwin.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/tls-darwin.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * TLS support code for CUPS on macOS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -291,7 +292,7 @@ else tls_selfsigned = ident; - _cupsMutexLock(&tls_mutex); + _cupsMutexUnlock(&tls_mutex); # if 0 /* Someday perhaps SecItemCopyMatching will work for identities, at which point */ CFTypeRef itemKeys[] = { kSecClass, kSecAttrLabel, kSecValueRef }; @@ -1157,8 +1158,7 @@ error = SSLRead(http->tls, buf, (size_t)len, &processed); - DEBUG_printf(("6_httpTLSRead: error=%d, processed=%d", (int)error, - (int)processed)); + DEBUG_printf(("5_httpTLSRead: error=%d, processed=%d", (int)error, (int)processed)); switch (error) { case 0 : @@ -1473,14 +1473,12 @@ { error = SSLSetSessionOption(http->tls, kSSLSessionOptionBreakOnCertRequested, true); - DEBUG_printf(("4_httpTLSStart: kSSLSessionOptionBreakOnCertRequested, " - "error=%d", (int)error)); + 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)); + DEBUG_printf(("4_httpTLSStart: http_cdsa_set_credentials, error=%d", (int)error)); } } else if (!error) @@ -1649,8 +1647,7 @@ httpFreeCredentials(credentials); } - DEBUG_printf(("4_httpTLSStart: Server certificate callback " - "returned %d.", (int)error)); + DEBUG_printf(("4_httpTLSStart: Server certificate callback returned %d.", (int)error)); } break; @@ -1692,8 +1689,7 @@ error = (cg->client_cert_cb)(http, http->tls, names, cg->client_cert_data); - DEBUG_printf(("4_httpTLSStart: Client certificate callback " - "returned %d.", (int)error)); + DEBUG_printf(("4_httpTLSStart: Client certificate callback returned %d.", (int)error)); } httpFreeCredentials(names); @@ -1701,38 +1697,31 @@ break; case errSSLUnknownRootCert : - message = _("Unable to establish a secure connection to host " - "(untrusted certificate)."); + 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)."); + 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)."); + 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)."); + 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)."); + 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)."); + 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)."); + message = _("Unable to establish a secure connection to host (peer dropped connection before responding)."); break; default : @@ -1812,7 +1801,7 @@ size_t processed; /* Number of bytes processed */ - DEBUG_printf(("2_httpTLSWrite(http=%p, buf=%p, len=%d)", (void *)http, (void *)buf, len)); + DEBUG_printf(("4_httpTLSWrite(http=%p, buf=%p, len=%d)", (void *)http, (void *)buf, len)); error = SSLWrite(http->tls, buf, (size_t)len, &processed); @@ -1848,7 +1837,7 @@ break; } - DEBUG_printf(("3_httpTLSWrite: Returning %d.", (int)result)); + DEBUG_printf(("5_httpTLSWrite: Returning %d.", (int)result)); return ((int)result); } diff -Nru cups-2.3.3op2/cups/tls-gnutls.c cups-2.4.1op1/cups/tls-gnutls.c --- cups-2.3.3op2/cups/tls-gnutls.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/tls-gnutls.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * TLS support code for CUPS using GNU TLS. * - * Copyright © 2020 by Michael R Sweet + * Copyright © 2020-2022 by OpenPrinting * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -660,7 +660,7 @@ if (!buffer) return (0); - if (buffer && bufsize > 0) + if (bufsize > 0) *buffer = '\0'; if ((first = (http_credential_t *)cupsArrayFirst(credentials)) != NULL && @@ -1120,7 +1120,7 @@ ssize_t bytes; /* Bytes read */ - DEBUG_printf(("6http_gnutls_read(ptr=%p, data=%p, length=%d)", ptr, data, (int)length)); + DEBUG_printf(("5http_gnutls_read(ptr=%p, data=%p, length=%d)", ptr, data, (int)length)); http = (http_t *)ptr; @@ -1141,7 +1141,7 @@ } bytes = recv(http->fd, data, length, 0); - DEBUG_printf(("6http_gnutls_read: bytes=%d", (int)bytes)); + DEBUG_printf(("5http_gnutls_read: bytes=%d", (int)bytes)); return (bytes); } @@ -1159,10 +1159,10 @@ ssize_t bytes; /* Bytes written */ - DEBUG_printf(("6http_gnutls_write(ptr=%p, data=%p, length=%d)", ptr, data, + DEBUG_printf(("5http_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)); + DEBUG_printf(("5http_gnutls_write: bytes=%d", (int)bytes)); return (bytes); } @@ -1517,8 +1517,7 @@ DEBUG_printf(("4_httpTLSStart: Using certificate \"%s\" and private key \"%s\".", crtfile, keyfile)); - if (!status) - status = gnutls_certificate_set_x509_key_file(*credentials, crtfile, keyfile, GNUTLS_X509_FMT_PEM); + status = gnutls_certificate_set_x509_key_file(*credentials, crtfile, keyfile, GNUTLS_X509_FMT_PEM); } if (!status) @@ -1696,7 +1695,7 @@ ssize_t result; /* Return value */ - DEBUG_printf(("2http_write_ssl(http=%p, buf=%p, len=%d)", http, buf, len)); + DEBUG_printf(("5_httpTLSWrite(http=%p, buf=%p, len=%d)", http, buf, len)); result = gnutls_record_send(http->tls, buf, (size_t)len); @@ -1724,7 +1723,7 @@ result = -1; } - DEBUG_printf(("3http_write_ssl: Returning %d.", (int)result)); + DEBUG_printf(("5_httpTLSWrite: Returning %d.", (int)result)); return ((int)result); } diff -Nru cups-2.3.3op2/cups/tls-sspi.c cups-2.4.1op1/cups/tls-sspi.c --- cups-2.3.3op2/cups/tls-sspi.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/tls-sspi.c 2022-01-27 11:11:42.000000000 +0000 @@ -683,9 +683,15 @@ _httpTLSPending(http_t *http) /* I - HTTP connection */ { if (http->tls) - return (http->tls->readBufferUsed); + { + DEBUG_printf(("4_httpTLSPending: Returning %d.", http->tls->readBufferUsed + http->tls->decryptBufferUsed)); + return (http->tls->readBufferUsed + http->tls->decryptBufferUsed); + } else + { + DEBUG_puts("4_httpTLSPending: Returning 0."); return (0); + } } @@ -752,13 +758,13 @@ if (sspi->decryptBufferLength >= 262144) { WSASetLastError(E_OUTOFMEMORY); - DEBUG_puts("_httpTLSRead: Decryption buffer too large (>256k)"); + DEBUG_puts("5_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)); + DEBUG_printf(("5_httpTLSRead: Unable to allocate %d byte decryption buffer.", sspi->decryptBufferLength + 4096)); WSASetLastError(E_OUTOFMEMORY); return (-1); } @@ -766,7 +772,7 @@ sspi->decryptBufferLength += 4096; sspi->decryptBuffer = temp; - DEBUG_printf(("_httpTLSRead: Resized decryption buffer to %d bytes.", sspi->decryptBufferLength)); + DEBUG_printf(("5_httpTLSRead: Resized decryption buffer to %d bytes.", sspi->decryptBufferLength)); } buffers[0].pvBuffer = sspi->decryptBuffer; @@ -857,7 +863,7 @@ if ((temp = realloc(sspi->readBuffer, sspi->readBufferUsed + bytesToSave)) == NULL) { - DEBUG_printf(("_httpTLSRead: Unable to allocate %d bytes.", sspi->readBufferUsed + bytesToSave)); + DEBUG_printf(("5_httpTLSRead: Unable to allocate %d bytes.", sspi->readBufferUsed + bytesToSave)); WSASetLastError(E_OUTOFMEMORY); return (-1); } @@ -875,7 +881,7 @@ } else { - DEBUG_puts("_httpTLSRead: Unable to find data buffer."); + DEBUG_puts("5_httpTLSRead: Unable to find data buffer."); WSASetLastError(WSASYSCALLFAILURE); return (-1); } @@ -1002,6 +1008,8 @@ } } +// fprintf(stderr, "_httpTLSStart: Using hostname '%s'.\n", hostname); + return (http_sspi_server(http, hostname)); } } @@ -1084,7 +1092,7 @@ if ((cbData == SOCKET_ERROR) || (cbData == 0)) { status = WSAGetLastError(); - DEBUG_printf(("_httpTLSStop: sending close notify failed: %d", status)); + DEBUG_printf(("4_httpTLSStop: sending close notify failed: %d", status)); } else { @@ -1094,12 +1102,12 @@ } else { - DEBUG_printf(("_httpTLSStop: AcceptSecurityContext failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), status))); + DEBUG_printf(("4_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))); + DEBUG_printf(("4_httpTLSStop: ApplyControlToken failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), status))); } } @@ -1135,7 +1143,7 @@ if ((temp = (BYTE *)realloc(sspi->writeBuffer, bufferLen)) == NULL) { - DEBUG_printf(("_httpTLSWrite: Unable to allocate buffer of %d bytes.", bufferLen)); + DEBUG_printf(("5_httpTLSWrite: Unable to allocate buffer of %d bytes.", bufferLen)); WSASetLastError(E_OUTOFMEMORY); return (-1); } @@ -1186,7 +1194,7 @@ if (FAILED(scRet)) { - DEBUG_printf(("_httpTLSWrite: EncryptMessage failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); + DEBUG_printf(("5_httpTLSWrite: EncryptMessage failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), scRet))); WSASetLastError(WSASYSCALLFAILURE); return (-1); } @@ -1201,7 +1209,7 @@ if (num <= 0) { - DEBUG_printf(("_httpTLSWrite: send failed: %ld", WSAGetLastError())); + DEBUG_printf(("5_httpTLSWrite: send failed: %ld", WSAGetLastError())); return (num); } @@ -1321,7 +1329,6 @@ 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 */ @@ -1652,7 +1659,7 @@ http_credential_t *cred) /* I - Credential */ { if (cred) - return (CertCreateCertificateContext(X509_ASN_ENCODING, cred->data, cred->datalen)); + return (CertCreateCertificateContext(X509_ASN_ENCODING, cred->data, (DWORD)cred->datalen)); else return (NULL); } @@ -1695,7 +1702,7 @@ } } - 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"); + store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_NO_CRYPT_RELEASE_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, L"MY"); if (!store) { @@ -1907,17 +1914,19 @@ 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()))); +// fprintf(stderr, "5http_sspi_make_credentials: CryptAcquireContext failed: %s\n", 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"); + store = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, hProv, CERT_SYSTEM_STORE_CURRENT_USER | 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()))); +// fprintf(stderr, "5http_sspi_make_credentials: CertOpenSystemStore failed: %s\n", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())); ok = FALSE; goto cleanup; } @@ -1927,6 +1936,7 @@ if (!CertStrToNameA(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()))); +// fprintf(stderr, "5http_sspi_make_credentials: CertStrToName failed: %s\n", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())); ok = FALSE; goto cleanup; } @@ -1936,6 +1946,7 @@ if (!p) { DEBUG_printf(("5http_sspi_make_credentials: malloc failed for %d bytes", dwSize)); +// fprintf(stderr, "5http_sspi_make_credentials: malloc failed for %d bytes\n", dwSize); ok = FALSE; goto cleanup; } @@ -1943,17 +1954,22 @@ if (!CertStrToNameA(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()))); +// fprintf(stderr, "5http_sspi_make_credentials: CertStrToName failed: %s\n", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())); ok = FALSE; goto cleanup; } + sib.cbData = dwSize; + sib.pbData = p; + /* * Create a private key and self-signed certificate... */ - if (!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey)) + if (!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE | RSA1024BIT_KEY, &hKey)) { DEBUG_printf(("5http_sspi_make_credentials: CryptGenKey failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); +// fprintf(stderr, "5http_sspi_make_credentials: CryptGenKey failed: %s\n", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())); ok = FALSE; goto cleanup; } @@ -1977,6 +1993,7 @@ if (!createdContext) { DEBUG_printf(("5http_sspi_make_credentials: CertCreateSelfSignCertificate failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError()))); +// fprintf(stderr, "5http_sspi_make_credentials: CertCreateSelfSignCertificate failed: %s\n", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())); ok = FALSE; goto cleanup; } @@ -1989,6 +2006,7 @@ 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()))); +// fprintf(stderr, "5http_sspi_make_credentials: CertAddCertificateContextToStore failed: %s\n", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())); ok = FALSE; goto cleanup; } @@ -2003,6 +2021,7 @@ 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()))); +// fprintf(stderr, "5http_sspi_make_credentials: CertSetCertificateContextProperty failed: %s\n", http_sspi_strerror(sspi->error, sizeof(sspi->error), GetLastError())); ok = FALSE; goto cleanup; } @@ -2025,6 +2044,7 @@ if (Status != SEC_E_OK) { DEBUG_printf(("5http_sspi_make_credentials: AcquireCredentialsHandle failed: %s", http_sspi_strerror(sspi->error, sizeof(sspi->error), Status))); +// fprintf(stderr, "5http_sspi_make_credentials: AcquireCredentialsHandle failed: %s\n", http_sspi_strerror(sspi->error, sizeof(sspi->error), Status)); ok = FALSE; goto cleanup; } @@ -2065,7 +2085,7 @@ 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 */ + _http_sspi_t *sspi = http->tls; /* SSPI data */ char common_name[512]; /* Common name for cert */ DWORD dwSSPIFlags; /* SSL connection attributes we want */ DWORD dwSSPIOutFlags; /* SSL connection attributes we got */ @@ -2100,6 +2120,9 @@ 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)) { +// char temp[8192]; + +// fprintf(stderr, "Unable to create credentials for '%s': %s\n", common_name, http_sspi_strerror(temp, sizeof(temp), GetLastError())); DEBUG_puts("5http_sspi_server: Unable to get server credentials."); return (-1); } @@ -2291,7 +2314,7 @@ size_t bufsize, /* I - Size of buffer */ DWORD code) /* I - Error code */ { - if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, 0, buffer, bufsize, NULL)) + if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, 0, buffer, (DWORD)bufsize, NULL)) { /* * Strip trailing CR + LF... @@ -2379,7 +2402,7 @@ { status = GetLastError(); - DEBUG_printf(("CertGetCertificateChain returned: %s", http_sspi_strerror(error, sizeof(error), status))); + DEBUG_printf(("5http_sspi_verify: CertGetCertificateChain returned: %s", http_sspi_strerror(error, sizeof(error), status))); LocalFree(commonNameUnicode); return (status); @@ -2406,7 +2429,7 @@ { status = GetLastError(); - DEBUG_printf(("CertVerifyCertificateChainPolicy returned %s", http_sspi_strerror(error, sizeof(error), status))); + DEBUG_printf(("5http_sspi_verify: CertVerifyCertificateChainPolicy returned %s", http_sspi_strerror(error, sizeof(error), status))); } else if (policyStatus.dwError) status = policyStatus.dwError; diff -Nru cups-2.3.3op2/cups/tls.c cups-2.4.1op1/cups/tls.c --- cups-2.3.3op2/cups/tls.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/tls.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,15 @@ /* * TLS routines for CUPS. * - * Copyright 2007-2014 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting. + * 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. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -34,7 +36,7 @@ * Include platform-specific TLS code... */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS # ifdef HAVE_GNUTLS # include "tls-gnutls.c" # elif defined(HAVE_CDSASSL) @@ -97,4 +99,4 @@ (void)common_name; return (-1); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ diff -Nru cups-2.3.3op2/cups/tlscheck.c cups-2.4.1op1/cups/tlscheck.c --- cups-2.3.3op2/cups/tlscheck.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/tlscheck.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * TLS check program for CUPS. * - * Copyright 2007-2017 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2017 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -14,7 +16,7 @@ #include "cups-private.h" -#ifndef HAVE_SSL +#ifndef HAVE_TLS int main(void) { puts("Sorry, no TLS support compiled in."); return (1); } #else @@ -22,7 +24,7 @@ * Local functions... */ -static void usage(void); +static void usage(void) _CUPS_NORETURN; /* @@ -780,4 +782,4 @@ exit(1); } -#endif /* !HAVE_SSL */ +#endif /* !HAVE_TLS */ diff -Nru cups-2.3.3op2/cups/usersys.c cups-2.4.1op1/cups/usersys.c --- cups-2.3.3op2/cups/usersys.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/usersys.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,9 @@ /* * User, system, and password routines for CUPS. * - * Copyright 2007-2019 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2019 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. @@ -67,11 +68,11 @@ { _cups_digestoptions_t digestoptions; /* DigestOptions values */ _cups_uatokens_t uatokens; /* UserAgentTokens values */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS int ssl_options, /* SSLOptions values */ ssl_min_version,/* Minimum SSL/TLS version */ ssl_max_version;/* Maximum SSL/TLS version */ -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ int trust_first, /* Trust on first use? */ any_root, /* Allow any (e.g., self-signed) root */ expired_certs, /* Allow expired certs */ @@ -92,7 +93,9 @@ */ #ifdef __APPLE__ +# ifdef HAVE_TLS static int cups_apple_get_boolean(CFStringRef key, int *value); +# endif /* HAVE_TLS */ static int cups_apple_get_string(CFStringRef key, char *value, size_t valsize); #endif /* __APPLE__ */ static int cups_boolean_value(const char *value); @@ -106,9 +109,9 @@ static void cups_set_gss_service_name(_cups_client_conf_t *cc, const char *value); #endif /* HAVE_GSSAPI */ static void cups_set_server_name(_cups_client_conf_t *cc, const char *value); -#ifdef HAVE_SSL +#ifdef HAVE_TLS static void cups_set_ssl_options(_cups_client_conf_t *cc, const char *value); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ static void cups_set_uatokens(_cups_client_conf_t *cc, const char *value); static void cups_set_user(_cups_client_conf_t *cc, const char *value); @@ -271,10 +274,10 @@ if (cupsArrayCount(credentials) < 1) return (-1); -#ifdef HAVE_SSL +#ifdef HAVE_TLS _httpFreeCredentials(cg->tls_credentials); cg->tls_credentials = _httpCreateCredentials(credentials); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ return (cg->tls_credentials ? 0 : -1); } @@ -307,6 +310,43 @@ /* + * 'cupsSetOAuthCB()' - Set the OAuth 2.0 callback for CUPS. + * + * This function sets the OAuth 2.0 callback for the various CUPS APIs that + * send HTTP requests. Pass @code NULL@ to restore the default (console-based) + * callback. + * + * The OAuth callback receives the HTTP connection, realm name, scope name (if + * any), resource path, and the "user_data" pointer for each request that + * requires an OAuth access token. The function then returns either the Bearer + * token string or `NULL` if no authorization could be obtained. + * + * Beyond reusing the Bearer token for subsequent requests on the same HTTP + * connection, no caching of the token is done by the CUPS library. The + * callback can determine whether to refresh a cached token by examining any + * existing token returned by the @link httpGetAuthString@ function. + * + * Note: The current OAuth callback is tracked separately for each thread in a + * program. Multi-threaded programs that override the callback need to do so in + * each thread for the same callback to be used. + * + * @since CUPS 2.4@ + */ + +void +cupsSetOAuthCB( + cups_oauth_cb_t cb, /* I - Callback function */ + void *user_data) /* I - User data pointer */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + cg->oauth_cb = cb; + cg->oauth_data = user_data; +} + + +/* * 'cupsSetPasswordCB()' - Set the password callback for CUPS. * * Pass @code NULL@ to restore the default (console) password callback, which @@ -1002,7 +1042,12 @@ * Look for ~/.cups/client.conf... */ +#if _WIN32 + snprintf(filename, sizeof(filename), "%s/AppData/Local/cups/client.conf", cg->home); +#else snprintf(filename, sizeof(filename), "%s/.cups/client.conf", cg->home); +#endif // _WIN32 + if ((fp = cupsFileOpen(filename, "r")) != NULL) { cups_read_client_conf(fp, &cc); @@ -1047,13 +1092,14 @@ if (cg->validate_certs < 0) cg->validate_certs = cc.validate_certs; -#ifdef HAVE_SSL +#ifdef HAVE_TLS _httpTLSSetOptions(cc.ssl_options | _HTTP_TLS_SET_DEFAULT, cc.ssl_min_version, cc.ssl_max_version); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } #ifdef __APPLE__ +# ifdef HAVE_TLS /* * 'cups_apple_get_boolean()' - Get a boolean setting from the CUPS preferences. */ @@ -1074,6 +1120,7 @@ return ((int)bval_set); } +# endif /* HAVE_TLS */ /* @@ -1209,9 +1256,10 @@ * Try the USER environment variable as the default username... */ - const char *envuser = getenv("USER"); - /* Default username */ - struct passwd *pw = NULL; /* Account information */ + const char *envuser = getenv("USER"); /* Default username */ + struct passwd pw; /* Account information */ + struct passwd *result = NULL; /* Auxiliary pointer */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ if (envuser) { @@ -1220,16 +1268,16 @@ * override things... This makes sure that printing after doing su * or sudo records the correct username. */ - - if ((pw = getpwnam(envuser)) != NULL && pw->pw_uid != getuid()) - pw = NULL; + getpwnam_r(envuser, &pw, cg->pw_buf, PW_BUF_SIZE, &result); + if (result && pw.pw_uid != getuid()) + result = NULL; } - if (!pw) - pw = getpwuid(getuid()); + if (!result) + getpwuid_r(getuid(), &pw, cg->pw_buf, PW_BUF_SIZE, &result); - if (pw) - strlcpy(cc->user, pw->pw_name, sizeof(cc->user)); + if (result) + strlcpy(cc->user, pw.pw_name, sizeof(cc->user)); else #endif /* _WIN32 */ { @@ -1266,10 +1314,10 @@ cups_set_user(cc, "mobile"); #endif /* __APPLE__ && !TARGET_OS_OSX */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cc->ssl_min_version = _HTTP_TLS_1_0; cc->ssl_max_version = _HTTP_TLS_MAX; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ cc->encryption = (http_encryption_t)-1; cc->trust_first = -1; cc->any_root = -1; @@ -1283,7 +1331,7 @@ #if defined(__APPLE__) char sval[1024]; /* String value */ -# ifdef HAVE_SSL +# ifdef HAVE_TLS int bval; /* Boolean value */ if (cups_apple_get_boolean(kAllowAnyRootKey, &bval)) @@ -1319,7 +1367,7 @@ if (cups_apple_get_boolean(kValidateCertsKey, &bval)) cc->validate_certs = bval; -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ if (cups_apple_get_string(kDigestOptionsKey, sval, sizeof(sval))) cups_set_digestoptions(cc, sval); @@ -1383,10 +1431,10 @@ else if (!_cups_strcasecmp(line, "GSSServiceName") && value) cups_set_gss_service_name(cc, value); #endif /* HAVE_GSSAPI */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (!_cups_strcasecmp(line, "SSLOptions") && value) cups_set_ssl_options(cc, value); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } } @@ -1480,7 +1528,7 @@ * 'cups_set_ssl_options()' - Set the SSLOptions value. */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS static void cups_set_ssl_options( _cups_client_conf_t *cc, /* I - client.conf values */ @@ -1553,7 +1601,7 @@ DEBUG_printf(("4cups_set_ssl_options(cc=%p, value=\"%s\") options=%x, min_version=%d, max_version=%d", (void *)cc, value, options, min_version, max_version)); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* diff -Nru cups-2.3.3op2/cups/versioning.h cups-2.4.1op1/cups/versioning.h --- cups-2.3.3op2/cups/versioning.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups/versioning.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * API versioning definitions for CUPS. * + * Copyright © 2021 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -37,9 +38,19 @@ * available... */ -# ifdef __APPLE__ -# include -# endif /* __APPLE__ */ +# if defined(__APPLE__) && defined(__has_include) +# if __has_include() +# include +# define _CUPS_API_AVAILABLE(...) API_AVAILABLE(__VA_ARGS__) +# define _CUPS_API_DEPRECATED(...) API_DEPRECATED(__VA_ARGS__) +# else +# define _CUPS_API_AVAILABLE(...) +# define _CUPS_API_DEPRECATED(...) +# endif /* __has_include() */ +# else +# define _CUPS_API_AVAILABLE(...) +# define _CUPS_API_DEPRECATED(...) +# endif /* __APPLE__ && __has_include */ # ifdef __has_extension /* Clang */ # define _CUPS_HAS_DEPRECATED @@ -105,20 +116,21 @@ * libcups_static target in the Xcode project supports building on iOS 11.0 and * later. */ -# define _CUPS_API_1_1_19 API_AVAILABLE(macos(10.3), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_1_1_20 API_AVAILABLE(macos(10.4), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_1_1_21 API_AVAILABLE(macos(10.4), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_1_2 API_AVAILABLE(macos(10.5), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_1_3 API_AVAILABLE(macos(10.5), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_1_4 API_AVAILABLE(macos(10.6), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_1_5 API_AVAILABLE(macos(10.7), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_1_6 API_AVAILABLE(macos(10.8), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_1_7 API_AVAILABLE(macos(10.9), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_2_0 API_AVAILABLE(macos(10.10), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_2_2 API_AVAILABLE(macos(10.12), ios(11.0)) _CUPS_PUBLIC -# define _CUPS_API_2_2_4 API_AVAILABLE(macos(10.13), ios(12.0)) _CUPS_PUBLIC -# define _CUPS_API_2_2_7 API_AVAILABLE(macos(10.14), ios(13.0)) _CUPS_PUBLIC -# define _CUPS_API_2_3 API_AVAILABLE(macos(10.14), ios(13.0)) _CUPS_PUBLIC +# define _CUPS_API_1_1_19 _CUPS_API_AVAILABLE(macos(10.3), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_1_1_20 _CUPS_API_AVAILABLE(macos(10.4), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_1_1_21 _CUPS_API_AVAILABLE(macos(10.4), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_1_2 _CUPS_API_AVAILABLE(macos(10.5), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_1_3 _CUPS_API_AVAILABLE(macos(10.5), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_1_4 _CUPS_API_AVAILABLE(macos(10.6), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_1_5 _CUPS_API_AVAILABLE(macos(10.7), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_1_6 _CUPS_API_AVAILABLE(macos(10.8), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_1_7 _CUPS_API_AVAILABLE(macos(10.9), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_2_0 _CUPS_API_AVAILABLE(macos(10.10), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_2_2 _CUPS_API_AVAILABLE(macos(10.12), ios(11.0)) _CUPS_PUBLIC +# define _CUPS_API_2_2_4 _CUPS_API_AVAILABLE(macos(10.13), ios(12.0)) _CUPS_PUBLIC +# define _CUPS_API_2_2_7 _CUPS_API_AVAILABLE(macos(10.14), ios(13.0)) _CUPS_PUBLIC +# define _CUPS_API_2_3 _CUPS_API_AVAILABLE(macos(10.14), ios(13.0)) _CUPS_PUBLIC +# define _CUPS_API_2_4 _CUPS_PUBLIC # else # define _CUPS_API_1_1_19 _CUPS_PUBLIC # define _CUPS_API_1_1_20 _CUPS_PUBLIC @@ -134,6 +146,7 @@ # define _CUPS_API_2_2_4 _CUPS_PUBLIC # define _CUPS_API_2_2_7 _CUPS_PUBLIC # define _CUPS_API_2_3 _CUPS_PUBLIC +# define _CUPS_API_2_4 _CUPS_PUBLIC # endif /* __APPLE__ && !_CUPS_SOURCE */ @@ -164,10 +177,10 @@ */ # define _CUPS_DEPRECATED __attribute__ ((unavailable)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_MSG(m) __attribute__ ((unavailable(m))) _CUPS_PUBLIC -# define _CUPS_DEPRECATED_1_2_MSG(m) API_DEPRECATED(m, macos(10.2,10.5), ios(11.0,11.0)) _CUPS_PUBLIC -# define _CUPS_DEPRECATED_1_6_MSG(m) API_DEPRECATED(m, macos(10.2,10.8), ios(11.0,11.0)) _CUPS_PUBLIC -# define _CUPS_DEPRECATED_1_7_MSG(m) API_DEPRECATED(m, macos(10.2,10.9), ios(11.0,11.0)) _CUPS_PUBLIC -# define _CUPS_DEPRECATED_2_2_MSG(m) API_DEPRECATED(m, macos(10.2,10.12), ios(11.0,11.0)) _CUPS_PUBLIC +# define _CUPS_DEPRECATED_1_2_MSG(m) _CUPS_API_DEPRECATED(m, macos(10.2,10.5), ios(11.0,11.0)) _CUPS_PUBLIC +# define _CUPS_DEPRECATED_1_6_MSG(m) _CUPS_API_DEPRECATED(m, macos(10.2,10.8), ios(11.0,11.0)) _CUPS_PUBLIC +# define _CUPS_DEPRECATED_1_7_MSG(m) _CUPS_API_DEPRECATED(m, macos(10.2,10.9), ios(11.0,11.0)) _CUPS_PUBLIC +# define _CUPS_DEPRECATED_2_2_MSG(m) _CUPS_API_DEPRECATED(m, macos(10.2,10.12), ios(11.0,11.0)) _CUPS_PUBLIC # elif defined(__APPLE__) /* @@ -175,10 +188,10 @@ */ # define _CUPS_DEPRECATED __attribute__ ((deprecated)) _CUPS_PUBLIC # define _CUPS_DEPRECATED_MSG(m) __attribute__ ((deprecated(m))) _CUPS_PUBLIC -# define _CUPS_DEPRECATED_1_2_MSG(m) API_DEPRECATED(m, macos(10.2,10.5), ios(11.0,11.0)) _CUPS_PUBLIC -# define _CUPS_DEPRECATED_1_6_MSG(m) API_DEPRECATED(m, macos(10.2,10.8), ios(11.0,11.0)) _CUPS_PUBLIC -# define _CUPS_DEPRECATED_1_7_MSG(m) API_DEPRECATED(m, macos(10.2,10.9), ios(11.0,11.0)) _CUPS_PUBLIC -# define _CUPS_DEPRECATED_2_2_MSG(m) API_DEPRECATED(m, macos(10.2,10.12), ios(11.0,11.0)) _CUPS_PUBLIC +# define _CUPS_DEPRECATED_1_2_MSG(m) _CUPS_API_DEPRECATED(m, macos(10.2,10.5), ios(11.0,11.0)) _CUPS_PUBLIC +# define _CUPS_DEPRECATED_1_6_MSG(m) _CUPS_API_DEPRECATED(m, macos(10.2,10.8), ios(11.0,11.0)) _CUPS_PUBLIC +# define _CUPS_DEPRECATED_1_7_MSG(m) _CUPS_API_DEPRECATED(m, macos(10.2,10.9), ios(11.0,11.0)) _CUPS_PUBLIC +# define _CUPS_DEPRECATED_2_2_MSG(m) _CUPS_API_DEPRECATED(m, macos(10.2,10.12), ios(11.0,11.0)) _CUPS_PUBLIC # elif defined(_CUPS_HAS_UNAVAILABLE_WITH_MESSAGE) && defined(_CUPS_NO_DEPRECATED) /* diff -Nru cups-2.3.3op2/cups-config.in cups-2.4.1op1/cups-config.in --- cups-2.3.3op2/cups-config.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/cups-config.in 2022-01-27 11:11:42.000000000 +0000 @@ -2,6 +2,7 @@ # # CUPS configuration utility. # +# Copyright © 2021-2022 by OpenPrinting. # Copyright © 2007-2019 by Apple Inc. # Copyright © 2001-2006 by Easy Software Products, all rights reserved. # @@ -10,7 +11,7 @@ # VERSION="@CUPS_VERSION@" -APIVERSION="2.3" +APIVERSION="@CUPS_API_VERSION@" BUILD="@CUPS_BUILD@" prefix=@prefix@ @@ -29,7 +30,7 @@ # flags for compiler and linker... CFLAGS="" LDFLAGS="@EXPORT_LDFLAGS@" -LIBS="@LIBGSSAPI@ @DNSSDLIBS@ @EXPORT_SSLLIBS@ @LIBZ@ @LIBS@" +LIBS="@LIBGSSAPI@ @DNSSDLIBS@ @EXPORT_TLSLIBS@ @LIBZ@ @LIBS@" # Check for local invocation... selfdir=`dirname $0` @@ -49,7 +50,7 @@ fi -usage () +usage() { echo "Usage: cups-config --api-version" echo " cups-config --build" @@ -61,6 +62,9 @@ echo " cups-config --serverbin" echo " cups-config --serverroot" echo " cups-config --version" + echo "" + echo "Note: The cups-config utility is deprecated and will be removed in a future" + echo " version of CUPS. Use the pkg-config utility instead." exit $1 } diff -Nru cups-2.3.3op2/cups.pc.in cups-2.4.1op1/cups.pc.in --- cups-2.3.3op2/cups.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/cups.pc.in 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,29 @@ +# +# CUPS pkg-config file +# +# Copyright © 2021-2022 by OpenPrinting. +# +# Licensed under Apache License v2.0. See the file "LICENSE" for more +# information. +# + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +includedir=@includedir@ +libdir=@libdir@ + +cups_api_version="@CUPS_API_VERSION@" +cups_build="@CUPS_BUILD@" +cups_datadir=@CUPS_DATADIR@ +cups_serverbin=@CUPS_SERVERBIN@ +cups_serverroot=@CUPS_SERVERROOT@ + +Name: CUPS +Description: CUPS API Library +Version: @CUPS_VERSION@ +URL: https://openprinting.github.io/cups/ +Cflags: @PKGCONFIG_CFLAGS@ +Libs: @PKGCONFIG_LIBS@ + +Requires.private: @PKGCONFIG_REQUIRES@ +Libs.private: @PKGCONFIG_LIBS_STATIC@ diff -Nru cups-2.3.3op2/debian/changelog cups-2.4.1op1/debian/changelog --- cups-2.3.3op2/debian/changelog 2021-09-10 17:20:00.000000000 +0000 +++ cups-2.4.1op1/debian/changelog 2023-09-15 11:19:58.000000000 +0000 @@ -1,3 +1,128 @@ +cups (2.4.1op1-1ubuntu4.7) jammy-security; urgency=medium + + * SECURITY UPDATE: Postscript parsing heap overflow + - debian/patches/CVE-2023-4504.patch: properly check for end of buffer + in cups/raster-interpret.c. + - CVE-2023-4504 + + -- Marc Deslauriers Fri, 15 Sep 2023 07:19:58 -0400 + +cups (2.4.1op1-1ubuntu4.6) jammy-security; urgency=medium + + * SECURITY UPDATE: recently printed documents authentication issue + - debian/patches/CVE-2023-32360.patch: require authentication for + CUPS-Get-Document in conf/cupsd.conf.in. + - CVE-2023-32360 + + -- Marc Deslauriers Mon, 11 Sep 2023 12:29:43 -0400 + +cups (2.4.1op1-1ubuntu4.5) jammy; urgency=medium + + * Fixes to assure color printing on color printers by default or on request + (LP: #1971242) + - check-colormodel-also-for-cmyk.patch: Take into account that on some + printers the ColorModel option's choice for color printing is CMYK and + not RGB. + - dont-override-color-settings-from-print-dialog.patch: Prioritize + the ColorModel PPD file option over the print-color-mode IPP + attribute. + + -- Till Kamppeter Sat, 24 Jun 2023 17:20:00 +0200 + +cups (2.4.1op1-1ubuntu4.4) jammy-security; urgency=medium + + * SECURITY UPDATE: use-after-free in cupsdAcceptClient() + - debian/patches/CVE-2023-34241.patch: log result of httpGetHostname + BEFORE closing the connection in scheduler/client.c. + - CVE-2023-34241 + * This package does _not_ contain the changes from 2.4.1op1-1ubuntu4.3 in + jammy-proposed. + + -- Marc Deslauriers Tue, 13 Jun 2023 08:17:22 -0400 + +cups (2.4.1op1-1ubuntu4.2) jammy-security; urgency=medium + + * SECURITY UPDATE: DoS via buffer overflow in format_log_line + - debian/patches/CVE-2023-32324.patch: check _cups_strlcpy size in + cups/string.c. + - CVE-2023-32324 + + -- Marc Deslauriers Thu, 25 May 2023 08:42:49 -0400 + +cups (2.4.1op1-1ubuntu4.1) jammy-security; urgency=medium + + * SECURITY UPDATE: Local authorization cert bypass + - debian/patches/CVE-2022-26691-1.patch: fix string comparison in + scheduler/cert.c. + - debian/patches/CVE-2022-26691-2.patch: fix the comment in + scheduler/cert.c. + - CVE-2022-26691 + + -- Marc Deslauriers Fri, 27 May 2022 07:53:01 -0400 + +cups (2.4.1op1-1ubuntu4) jammy; urgency=low + + * Fixed PPD file auto-generation when a print queue is created with + a DNS-SD-service-name-based URI and "-m everywhere" backporting the + fix from upstream (Upstream issue #340, #343). + + -- Till Kamppeter Sat, 19 Mar 2022 00:07:00 +0100 + +cups (2.4.1op1-1ubuntu3) jammy; urgency=low + + * Fixed crasher in the patch for temporary queues for local services + in the previous release. Updated the patch and the upstream pull + request (LP: #1965112, Upstream pull request #353). + + -- Till Kamppeter Wed, 16 Mar 2022 18:24:08 +0100 + +cups (2.4.1op1-1ubuntu2) jammy; urgency=low + + * Fixed printing on temporary CUPS queues for local services, like + IPP-over-USB or Printer Applications. Especially when printing from + the GTK print dialog printing on such queues did not work (Upstream + pull request #353). + + -- Till Kamppeter Mon, 14 Mar 2022 09:13:08 +0100 + +cups (2.4.1op1-1ubuntu1) jammy; urgency=low + + * Merge from Debian unstable. Remaining changes: + - Added "--enable-snapped-clients" to the "./configure" options to use + the correct Snap mediation mode for an unsnapped cupsd, like provided + by this package. + - Build CUPS with "SystemGroup lpadmin root" in cups-files.conf by + default, as CUPS always worked this way but the new patch for + supporting the "cups-control" interface of Snaps does not allow + implicit permission to everything for root any more. + - In the AppArmor profile allow CUPS to access (/var)/run/snapd.socket + to allow cupsd to determine which interfaces a snapped client + is plugging. + - Build-depend on libapparmor-dev, libsnapd-glib-dev, needed for + Snap mediation. + - Added fully automatic generation of PPD option setting presets to + be applied depending on the settings of the job IPP attributes + "print-color-mode", "print-quality", and "print-content-optimize". + This allows easy control of any printer with only standard IPP + attributes, as for example from a phone (functionality overtaken + from cups-filters, mot (yet) upstream in CUPS). + * Updated 9100-ppd-cache-add-auto-presets.patch + + -- Till Kamppeter Tue, 22 Feb 2022 12:28:08 +0100 + +cups (2.4.1op1-1) unstable; urgency=medium + + * new upstream release + * debian/patches/*: update and rebase + * debian/control: add myself to Uploaders: + * debian/copyright: remove unused BSD-3 license + * exlucde some newly generated files + * update symbols files + * move back to gbp based workflow + (git debrebase and dgit do not work in my world) + + -- Thorsten Alteholz Sun, 20 Feb 2022 20:08:09 +0100 + cups (2.3.3op2-7ubuntu2) impish; urgency=low * Updated patch for auto-generation of PPD presets to patch proposed diff -Nru cups-2.3.3op2/debian/control cups-2.4.1op1/debian/control --- cups-2.3.3op2/debian/control 2021-09-06 15:47:48.000000000 +0000 +++ cups-2.4.1op1/debian/control 2022-05-27 11:53:01.000000000 +0000 @@ -1,7 +1,9 @@ Source: cups -Maintainer: Debian Printing Team +Maintainer: Ubuntu Developers +XSBC-Original-Maintainer: Debian Printing Team Uploaders: Till Kamppeter , + Thorsten Alteholz , Section: net Priority: optional Build-Depends: diff -Nru cups-2.3.3op2/debian/copyright cups-2.4.1op1/debian/copyright --- cups-2.3.3op2/debian/copyright 2021-09-06 15:47:48.000000000 +0000 +++ cups-2.4.1op1/debian/copyright 2022-02-22 03:50:02.000000000 +0000 @@ -122,34 +122,6 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -License: BSD-3-clause - This software is Copyright (c) 2019 by foo. - This is free software, licensed under: - The (three-clause) BSD License - The BSD License - 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. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of foo nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - 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 HOLDER 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. - License: Zlib The zlib License . diff -Nru cups-2.3.3op2/debian/libcups2.symbols cups-2.4.1op1/debian/libcups2.symbols --- cups-2.3.3op2/debian/libcups2.symbols 2021-09-06 15:47:48.000000000 +0000 +++ cups-2.4.1op1/debian/libcups2.symbols 2022-02-22 03:50:01.000000000 +0000 @@ -179,6 +179,7 @@ cupsSetDests2@Base 1.4.0 cupsSetDests@Base 1.4.0 cupsSetEncryption@Base 1.4.0 + cupsSetOAuthCB@Base 2.4.1op1 cupsSetPasswordCB2@Base 1.4.0 cupsSetPasswordCB@Base 1.4.0 cupsSetServer@Base 1.4.0 diff -Nru cups-2.3.3op2/debian/not-installed cups-2.4.1op1/debian/not-installed --- cups-2.3.3op2/debian/not-installed 2021-09-06 15:47:48.000000000 +0000 +++ cups-2.4.1op1/debian/not-installed 2022-02-22 03:50:01.000000000 +0000 @@ -41,3 +41,6 @@ usr/share/man/fr/man5/*.5 usr/share/man/fr/man7/*.7 usr/share/man/fr/man8/*.8 +# +# temporary exclude +usr/lib/pkgconfig/cups.pc diff -Nru cups-2.3.3op2/debian/patches/0001-backend-usb-libusb.c-Use-60s-timeout-for-reading-at-.patch cups-2.4.1op1/debian/patches/0001-backend-usb-libusb.c-Use-60s-timeout-for-reading-at-.patch --- cups-2.3.3op2/debian/patches/0001-backend-usb-libusb.c-Use-60s-timeout-for-reading-at-.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0001-backend-usb-libusb.c-Use-60s-timeout-for-reading-at-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -From: Zdenek Dohnal -Date: Tue, 13 Apr 2021 15:44:14 +0200 -Subject: backend/usb-libusb.c: Use 60s timeout for reading at backchannel - -Some older models malfunction if timeout is too short. - -Origin: upstream, https://github.com/OpenPrinting/cups/pull/174 -Bug: https://github.com/OpenPrinting/cups/issues/160 -Bug-Debian: https://bugs.debian.org/989073 ---- - backend/usb-libusb.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/backend/usb-libusb.c b/backend/usb-libusb.c -index d6b0eb4..fbb0d9d 100644 ---- a/backend/usb-libusb.c -+++ b/backend/usb-libusb.c -@@ -1704,7 +1704,7 @@ static void *read_thread(void *reference) - readstatus = libusb_bulk_transfer(g.printer->handle, - g.printer->read_endp, - readbuffer, rbytes, -- &rbytes, 250); -+ &rbytes, 60000); - if (readstatus == LIBUSB_SUCCESS && rbytes > 0) - { - fprintf(stderr, "DEBUG: Read %d bytes of back-channel data...\n", (int)rbytes); diff -Nru cups-2.3.3op2/debian/patches/0002-backend-usb-libusb.c-Revert-enforcing-read-limits.patch cups-2.4.1op1/debian/patches/0002-backend-usb-libusb.c-Revert-enforcing-read-limits.patch --- cups-2.3.3op2/debian/patches/0002-backend-usb-libusb.c-Revert-enforcing-read-limits.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0002-backend-usb-libusb.c-Revert-enforcing-read-limits.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -From: Zdenek Dohnal -Date: Tue, 13 Apr 2021 15:47:37 +0200 -Subject: backend/usb-libusb.c: Revert enforcing read limits - -This commit reverts the change introduced by 2.2.12 [1] - its -implementation caused a regression with Lexmark filters. - -[1] https://github.com/apple/cups/commit/35e927f83529cd9b4bc37bcd418c50e307fced35 - -Origin: upstream, https://github.com/OpenPrinting/cups/pull/174 -Bug: https://github.com/OpenPrinting/cups/issues/72 ---- - backend/usb-libusb.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/backend/usb-libusb.c b/backend/usb-libusb.c -index fbb0d9d..89b5182 100644 ---- a/backend/usb-libusb.c -+++ b/backend/usb-libusb.c -@@ -1721,7 +1721,8 @@ static void *read_thread(void *reference) - * Make sure this loop executes no more than once every 250 miliseconds... - */ - -- if ((g.wait_eof || !g.read_thread_stop)) -+ if ((readstatus != LIBUSB_SUCCESS || rbytes == 0) && -+ (g.wait_eof || !g.read_thread_stop)) - usleep(250000); - } - while (g.wait_eof || !g.read_thread_stop); diff -Nru cups-2.3.3op2/debian/patches/0003-Update-testlang-to-test-all-locales-Issue-85.patch cups-2.4.1op1/debian/patches/0003-Update-testlang-to-test-all-locales-Issue-85.patch --- cups-2.3.3op2/debian/patches/0003-Update-testlang-to-test-all-locales-Issue-85.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0003-Update-testlang-to-test-all-locales-Issue-85.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,573 +0,0 @@ -From: Michael R Sweet -Date: Mon, 1 Mar 2021 07:26:58 -0500 -Subject: Update testlang to test all locales (Issue #85) - -Also refactored the locale test code into a separate function, updated the -output to be consistent with the other unit tests, and split out the macOS -language identifier tests. Still need to move the PPD tests to the testppd -program. ---- - cups/testlang.c | 442 +++++++++++++++++++++++++++++++++++--------------------- - 1 file changed, 275 insertions(+), 167 deletions(-) - -diff --git a/cups/testlang.c b/cups/testlang.c -index 613ae32..057de84 100644 ---- a/cups/testlang.c -+++ b/cups/testlang.c -@@ -5,10 +5,12 @@ - * - * ./testlang [-l locale] [-p ppd] ["String to localize"] - * -- * Copyright 2007-2017 by Apple Inc. -- * Copyright 1997-2006 by Easy Software Products. -+ * Copyright © 2021 by OpenPrinting. -+ * Copyright © 2007-2017 by Apple Inc. -+ * Copyright © 1997-2006 by Easy Software Products. - * -- * Licensed under Apache License v2.0. See the file "LICENSE" for more information. -+ * Licensed under Apache License v2.0. See the file "LICENSE" for more -+ * information. - */ - - /* -@@ -20,6 +22,7 @@ - #ifdef __APPLE__ - # include - #endif /* __APPLE__ */ -+#include - - - /* -@@ -27,6 +30,10 @@ - */ - - static int show_ppd(const char *filename); -+#ifdef __APPLE__ -+static int test_apple(void); -+#endif // __APPLE__ -+static int test_language(const char *locale); - static int test_string(cups_lang_t *language, const char *msgid); - static void usage(void); - -@@ -39,23 +46,12 @@ int /* O - Exit status */ - main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ - { -- int i; /* Looping var */ -- const char *opt; /* Current option */ -- int errors = 0; /* Number of errors */ -- int dotests = 1; /* Do standard tests? */ -- cups_lang_t *language = NULL;/* Message catalog */ -- cups_lang_t *language2 = NULL; -- /* Message catalog (second time) */ -- struct lconv *loc; /* Locale data */ -- char buffer[1024]; /* String buffer */ -- double number; /* Number */ -- static const char * const tests[] = /* Test strings */ -- { -- "1", -- "-1", -- "3", -- "5.125" -- }; -+ int i; /* Looping var */ -+ const char *opt; /* Current option */ -+ int errors = 0; /* Number of errors */ -+ int dotests = 1; /* Do standard tests? */ -+ const char *lang; /* Single language test? */ -+ cups_lang_t *language = NULL; /* Message catalog */ - - - /* -@@ -86,11 +82,7 @@ main(int argc, /* I - Number of command-line arguments */ - return (1); - } - -- language = cupsLangGet(argv[i]); -- language2 = cupsLangGet(argv[i]); -- -- setenv("LANG", argv[i], 1); -- setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1); -+ lang = argv[i]; - break; - - case 'p' : -@@ -101,12 +93,6 @@ main(int argc, /* I - Number of command-line arguments */ - return (1); - } - -- if (!language) -- { -- language = cupsLangDefault(); -- language2 = cupsLangDefault(); -- } -- - dotests = 0; - errors += show_ppd(argv[i]); - break; -@@ -121,165 +107,62 @@ main(int argc, /* I - Number of command-line arguments */ - else - { - if (!language) -- { -- language = cupsLangDefault(); -- language2 = cupsLangDefault(); -- } -+ language = cupsLangGet(lang); - - dotests = 0; - errors += test_string(language, argv[i]); - } - } - -- if (!language) -- { -- language = cupsLangDefault(); -- language2 = cupsLangDefault(); -- } -- -- if (language != language2) -- { -- errors ++; -- -- puts("**** ERROR: Language cache did not work! ****"); -- puts("First result from cupsLangGet:"); -- } -- -- printf("Language = \"%s\"\n", language->language); -- printf("Encoding = \"%s\"\n", _cupsEncodingName(language->encoding)); -- - if (dotests) - { -- errors += test_string(language, "No"); -- errors += test_string(language, "Yes"); -- -- if (language != language2) -+ if (lang) - { -- puts("Second result from cupsLangGet:"); -+ /* -+ * Test a single language... -+ */ - -- printf("Language = \"%s\"\n", language2->language); -- printf("Encoding = \"%s\"\n", _cupsEncodingName(language2->encoding)); -- printf("No = \"%s\"\n", _cupsLangString(language2, "No")); -- printf("Yes = \"%s\"\n", _cupsLangString(language2, "Yes")); -+ errors += test_language(lang); - } -- -- loc = localeconv(); -- -- for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i ++) -- { -- number = _cupsStrScand(tests[i], NULL, loc); -- -- printf("_cupsStrScand(\"%s\") number=%f\n", tests[i], number); -- -- _cupsStrFormatd(buffer, buffer + sizeof(buffer), number, loc); -- -- printf("_cupsStrFormatd(%f) buffer=\"%s\"\n", number, buffer); -- -- if (strcmp(buffer, tests[i])) -- { -- errors ++; -- puts("**** ERROR: Bad formatted number! ****"); -- } -- } -- --#ifdef __APPLE__ -- /* -- * Test all possible language IDs for compatibility with _cupsAppleLocale... -- */ -- -- CFIndex j, /* Looping var */ -- num_locales; /* Number of locales */ -- CFArrayRef locales; /* Locales */ -- CFStringRef locale_id, /* Current locale ID */ -- language_id; /* Current language ID */ -- char locale_str[256], /* Locale ID C string */ -- language_str[256], /* Language ID C string */ -- *bufptr; /* Pointer to ".UTF-8" in POSIX locale */ -- size_t buflen; /* Length of POSIX locale */ --# if TEST_COUNTRY_CODES -- CFIndex k, /* Looping var */ -- num_country_codes; /* Number of country codes */ -- CFArrayRef country_codes; /* Country codes */ -- CFStringRef country_code, /* Current country code */ -- temp_id; /* Temporary language ID */ -- char country_str[256]; /* Country code C string */ --# endif /* TEST_COUNTRY_CODES */ -- -- locales = CFLocaleCopyAvailableLocaleIdentifiers(); -- num_locales = CFArrayGetCount(locales); -- --# if TEST_COUNTRY_CODES -- country_codes = CFLocaleCopyISOCountryCodes(); -- num_country_codes = CFArrayGetCount(country_codes); --# endif /* TEST_COUNTRY_CODES */ -- -- printf("%d locales are available:\n", (int)num_locales); -- -- for (j = 0; j < num_locales; j ++) -+ else - { -- locale_id = CFArrayGetValueAtIndex(locales, j); -- language_id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale_id); -+ /* -+ * Test all locales we find in LOCALEDIR... -+ */ - -- if (!locale_id || !CFStringGetCString(locale_id, locale_str, (CFIndex)sizeof(locale_str), kCFStringEncodingASCII)) -- { -- printf("%d: FAIL (unable to get locale ID string)\n", (int)j + 1); -- errors ++; -- continue; -- } -+ cups_dir_t *dir; /* Locale directory */ -+ cups_dentry_t *dent; /* Directory entry */ - -- if (!language_id || !CFStringGetCString(language_id, language_str, (CFIndex)sizeof(language_str), kCFStringEncodingASCII)) -+ if ((dir = cupsDirOpen(getenv("LOCALEDIR"))) != NULL) - { -- printf("%d %s: FAIL (unable to get language ID string)\n", (int)j + 1, locale_str); -- errors ++; -- continue; -+ while ((dent = cupsDirRead(dir)) != NULL) -+ errors += test_language(dent->filename); - } -- -- if (!_cupsAppleLocale(language_id, buffer, sizeof(buffer))) -- { -- printf("%d %s(%s): FAIL (unable to convert language ID string to POSIX locale)\n", (int)j + 1, locale_str, language_str); -- errors ++; -- continue; -- } -- -- if ((bufptr = strstr(buffer, ".UTF-8")) != NULL) -- buflen = (size_t)(bufptr - buffer); - else -- buflen = strlen(buffer); -- -- if ((language = cupsLangGet(buffer)) == NULL) -- { -- printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\")\n", (int)j + 1, locale_str, language_str, buffer); -- errors ++; -- continue; -- } -- -- if (strncasecmp(language->language, buffer, buflen)) - { -- printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\", got \"%s\")\n", (int)j + 1, locale_str, language_str, buffer, language->language); -- errors ++; -- continue; -+ // No LOCALEDIR, just use the default language... -+ errors += test_language(NULL); - } - -- printf("%d %s(%s): PASS (POSIX locale is \"%s\")\n", (int)j + 1, locale_str, language_str, buffer); -+ cupsDirClose(dir); - } - -- CFRelease(locales); -+#ifdef __APPLE__ -+ errors += test_apple(); -+#endif // __APPLE__ - --# if TEST_COUNTRY_CODES -- CFRelease(country_codes); --# endif /* TEST_COUNTRY_CODES */ --#endif /* __APPLE__ */ -+ if (!errors) -+ puts("ALL TESTS PASSED"); - } - -- if (errors == 0 && dotests) -- puts("ALL TESTS PASSED"); -- - return (errors > 0); - } - - - /* - * 'show_ppd()' - Show localized strings in a PPD file. -+ * -+ * TODO: Move this to the testppd program. - */ - - static int /* O - Number of errors */ -@@ -327,15 +210,237 @@ show_ppd(const char *filename) /* I - Filename */ - } - - -+#ifdef __APPLE__ -+/* -+ * 'test_apple()' - Test macOS locale handing... -+ */ -+ -+static int /* O - Number of errors */ -+test_apple(void) -+{ -+ int errors = 0; /* Number of errors */ -+ CFIndex i, /* Looping var */ -+ num_locales; /* Number of locales */ -+ CFArrayRef locales; /* Locales */ -+ CFStringRef locale_id, /* Current locale ID */ -+ language_id; /* Current language ID */ -+ cups_lang_t *language = NULL; /* Message catalog */ -+ char locale_str[256], /* Locale ID C string */ -+ language_str[256], /* Language ID C string */ -+ buffer[1024], /* String buffer */ -+ *bufptr; /* Pointer to ".UTF-8" in POSIX locale */ -+ size_t buflen; /* Length of POSIX locale */ -+ -+ -+ /* -+ * Test all possible language IDs for compatibility with _cupsAppleLocale... -+ */ -+ -+ locales = CFLocaleCopyAvailableLocaleIdentifiers(); -+ num_locales = CFArrayGetCount(locales); -+ -+ printf("CFLocaleCopyAvailableLocaleIdentifiers: %d locales\n", (int)num_locales); -+ -+ for (i = 0; i < num_locales; i ++) -+ { -+ locale_id = CFArrayGetValueAtIndex(locales, i); -+ language_id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale_id); -+ -+ printf("CFStringGetCString(locale_id %d): ", (int)i); -+ if (!locale_id || !CFStringGetCString(locale_id, locale_str, (CFIndex)sizeof(locale_str), kCFStringEncodingASCII)) -+ { -+ puts("FAIL"); -+ errors ++; -+ continue; -+ } -+ else -+ printf("PASS (\"%s\")\n", locale_str); -+ -+ printf("CFStringGetCString(language_id %d): ", (int)i); -+ if (!language_id || !CFStringGetCString(language_id, language_str, (CFIndex)sizeof(language_str), kCFStringEncodingASCII)) -+ { -+ printf("%d %s: FAIL (unable to get language ID string)\n", (int)i + 1, locale_str); -+ errors ++; -+ continue; -+ } -+ else -+ printf("PASS (\"%s\")\n", language_str); -+ -+ printf("_cupsAppleLocale(\"%s\"): ", language_str); -+ if (!_cupsAppleLocale(language_id, buffer, sizeof(buffer))) -+ { -+ puts("FAIL"); -+ errors ++; -+ continue; -+ } -+ else -+ printf("PASS (\"%s\")\n", buffer); -+ -+ if ((bufptr = strstr(buffer, ".UTF-8")) != NULL) -+ buflen = (size_t)(bufptr - buffer); -+ else -+ buflen = strlen(buffer); -+ -+ printf("cupsLangGet(\"%s\"): ", buffer); -+ if ((language = cupsLangGet(buffer)) == NULL) -+ { -+ puts("FAIL"); -+ errors ++; -+ continue; -+ } -+ else if (strncasecmp(language->language, buffer, buflen)) -+ { -+ printf("FAIL (got \"%s\")\n", language->language); -+ errors ++; -+ continue; -+ } -+ else -+ puts("PASS"); -+ } -+ -+ CFRelease(locales); -+ -+ return (errors); -+} -+#endif // __APPLE__ -+ -+ -+/* -+ * 'test_language()' - Test a specific language... -+ */ -+ -+static int /* O - Number of errors */ -+test_language(const char *lang) /* I - Locale language code, NULL for default */ -+{ -+ int i; /* Looping var */ -+ int errors = 0; /* Number of errors */ -+ cups_lang_t *language = NULL, /* Message catalog */ -+ *language2 = NULL; /* Message catalog (second time) */ -+ struct lconv *loc; /* Locale data */ -+ char buffer[1024]; /* String buffer */ -+ double number; /* Number */ -+ static const char * const tests[] = /* Test strings */ -+ { -+ "1", -+ "-1", -+ "3", -+ "5.125" -+ }; -+ -+ -+ // Override the locale environment as needed... -+ if (lang) -+ { -+ // Test the specified locale code... -+ setenv("LANG", lang, 1); -+ setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1); -+ -+ printf("cupsLangGet(\"%s\"): ", lang); -+ if ((language = cupsLangGet(lang)) == NULL) -+ { -+ puts("FAIL"); -+ errors ++; -+ } -+ else if (strcasecmp(language->language, lang)) -+ { -+ printf("FAIL (got \"%s\")\n", language->language); -+ errors ++; -+ } -+ else -+ puts("PASS"); -+ -+ printf("cupsLangGet(\"%s\") again: ", lang); -+ if ((language2 = cupsLangGet(lang)) == NULL) -+ { -+ puts("FAIL"); -+ errors ++; -+ } -+ else if (strcasecmp(language2->language, lang)) -+ { -+ printf("FAIL (got \"%s\")\n", language2->language); -+ errors ++; -+ } -+ else if (language2 != language) -+ { -+ puts("FAIL (cache failure)"); -+ errors ++; -+ } -+ else -+ puts("PASS"); -+ } -+ else -+ { -+ // Test the default locale... -+ fputs("cupsLangDefault: ", stdout); -+ if ((language = cupsLangDefault()) == NULL) -+ { -+ puts("FAIL"); -+ errors ++; -+ } -+ else -+ puts("PASS"); -+ -+ fputs("cupsLangDefault again: ", stdout); -+ if ((language2 = cupsLangDefault()) == NULL) -+ { -+ puts("FAIL"); -+ errors ++; -+ } -+ else if (language2 != language) -+ { -+ puts("FAIL (cache failure)"); -+ errors ++; -+ } -+ else -+ puts("PASS"); -+ } -+ -+ printf("language->language: \"%s\"\n", language->language); -+ printf("_cupsEncodingName(language): \"%s\"\n", _cupsEncodingName(language->encoding)); -+ -+ errors += test_string(language, "No"); -+ errors += test_string(language, "Yes"); -+ -+ if (language != language2) -+ { -+ printf("language2->language: \"%s\"\n", language2->language); -+ printf("_cupsEncodingName(language2): \"%s\"\n", _cupsEncodingName(language2->encoding)); -+ } -+ -+ loc = localeconv(); -+ -+ for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i ++) -+ { -+ number = _cupsStrScand(tests[i], NULL, loc); -+ -+ printf("_cupsStrScand(\"%s\"): %f\n", tests[i], number); -+ -+ _cupsStrFormatd(buffer, buffer + sizeof(buffer), number, loc); -+ -+ printf("_cupsStrFormatd(%f): ", number); -+ -+ if (strcmp(buffer, tests[i])) -+ { -+ errors ++; -+ printf("FAIL (got \"%s\")\n", buffer); -+ } -+ else -+ puts("PASS"); -+ } -+ -+ return (errors); -+} -+ -+ - /* - * 'test_string()' - Test the localization of a string. - */ - --static int /* O - 1 on failure, 0 on success */ --test_string(cups_lang_t *language, /* I - Language */ -- const char *msgid) /* I - Message */ -+static int /* O - 1 on failure, 0 on success */ -+test_string(cups_lang_t *language, /* I - Language */ -+ const char *msgid) /* I - Message */ - { -- const char *msgstr; /* Localized string */ -+ const char *msgstr; /* Localized string */ - - - /* -@@ -345,19 +450,20 @@ test_string(cups_lang_t *language, /* I - Language */ - * For any other locale, the string pointers should be different. - */ - -+ printf("_cupsLangString(\"%s\"): ", msgid); - msgstr = _cupsLangString(language, msgid); - if (strcmp(language->language, "C") && msgid == msgstr) - { -- printf("%-8s = \"%s\" (FAIL - no message catalog loaded)\n", msgid, msgstr); -+ puts("FAIL (no message catalog loaded)"); - return (1); - } - else if (!strcmp(language->language, "C") && msgid != msgstr) - { -- printf("%-8s = \"%s\" (FAIL - POSIX locale is localized)\n", msgid, msgstr); -+ puts("FAIL (POSIX locale is localized)"); - return (1); - } - -- printf("%-8s = \"%s\" (PASS)\n", msgid, msgstr); -+ printf("PASS (\"%s\")\n", msgstr); - - return (0); - } -@@ -370,5 +476,7 @@ test_string(cups_lang_t *language, /* I - Language */ - static void - usage(void) - { -- puts("./testlang [-l locale] [-p ppd] [\"String to localize\"]"); -+ puts("Usage: ./testlang [-l locale] [-p ppd] [\"String to localize\"]"); -+ puts(""); -+ puts("If no arguments are specified, all locales are tested."); - } diff -Nru cups-2.3.3op2/debian/patches/0004-Make-sure-lang-is-initializes.patch cups-2.4.1op1/debian/patches/0004-Make-sure-lang-is-initializes.patch --- cups-2.3.3op2/debian/patches/0004-Make-sure-lang-is-initializes.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0004-Make-sure-lang-is-initializes.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -From: Michael R Sweet -Date: Sat, 6 Mar 2021 16:16:42 -0500 -Subject: Make sure 'lang' is initializes. - ---- - cups/testlang.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/cups/testlang.c b/cups/testlang.c -index 057de84..3c83ca6 100644 ---- a/cups/testlang.c -+++ b/cups/testlang.c -@@ -50,7 +50,7 @@ main(int argc, /* I - Number of command-line arguments */ - const char *opt; /* Current option */ - int errors = 0; /* Number of errors */ - int dotests = 1; /* Do standard tests? */ -- const char *lang; /* Single language test? */ -+ const char *lang = NULL; /* Single language test? */ - cups_lang_t *language = NULL; /* Message catalog */ - - diff -Nru cups-2.3.3op2/debian/patches/0005-Let-cups.1-point-to-client.conf.5-not-client.conf.7.patch cups-2.4.1op1/debian/patches/0005-Let-cups.1-point-to-client.conf.5-not-client.conf.7.patch --- cups-2.3.3op2/debian/patches/0005-Let-cups.1-point-to-client.conf.5-not-client.conf.7.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0005-Let-cups.1-point-to-client.conf.5-not-client.conf.7.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -From: Didier Raboud -Date: Fri, 12 Feb 2021 13:47:22 +0100 -Subject: Let cups.1 point to client.conf.5, not client.conf.7 - -Bug: https://github.com/OpenPrinting/cups/pull/92 -Closes: #982303 ---- - man/cups.1 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/man/cups.1 b/man/cups.1 -index 706620d..751ad9a 100644 ---- a/man/cups.1 -+++ b/man/cups.1 -@@ -125,7 +125,7 @@ Printers that do not support IPP can be supported using applications such as - .BR ippeveprinter (1). - .SH SEE ALSO - .BR cancel (1), --.BR client.conf (7), -+.BR client.conf (5), - .BR cupsctl (8), - .BR cupsd (8), - .BR lp (1), diff -Nru cups-2.3.3op2/debian/patches/0006-Apple-AirPrint-support.patch cups-2.4.1op1/debian/patches/0006-Apple-AirPrint-support.patch --- cups-2.3.3op2/debian/patches/0006-Apple-AirPrint-support.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0006-Apple-AirPrint-support.patch 2022-02-22 03:50:02.000000000 +0000 @@ -10,9 +10,6 @@ --- conf/mime.convs.in | 3 +++ conf/mime.types | 3 +++ - scheduler/conf.c | 2 +- - scheduler/dirsvc.c | 6 ++++++ - scheduler/printers.c | 4 +++- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/conf/mime.convs.in b/conf/mime.convs.in @@ -43,48 +40,3 @@ ######################################################################## # # Text files... -diff --git a/scheduler/conf.c b/scheduler/conf.c -index 74531a8..bfd1b0b 100644 ---- a/scheduler/conf.c -+++ b/scheduler/conf.c -@@ -750,7 +750,7 @@ cupsdReadConfiguration(void) - DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED; - - #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) -- cupsdSetString(&DNSSDSubTypes, "_cups,_print"); -+ cupsdSetString(&DNSSDSubTypes, "_cups,_print,_universal"); - cupsdClearString(&DNSSDHostName); - #endif /* HAVE_DNSSD || HAVE_AVAHI */ - -diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c -index ddd3701..fb2a305 100644 ---- a/scheduler/dirsvc.c -+++ b/scheduler/dirsvc.c -@@ -440,6 +440,12 @@ dnssdBuildTxtRecord( - keyvalue[count ][0] = "pdl"; - keyvalue[count++][1] = p->pdl ? p->pdl : "application/postscript"; - -+ /* iOS 6 does not accept this printer as AirPrint printer if there is -+ no URF txt record or "URF=none", "DM3" is the minimum needed found -+ by try and error */ -+ keyvalue[count ][0] = "URF"; -+ keyvalue[count++][1] = "DM3"; -+ - if (get_auth_info_required(p, air_str, sizeof(air_str))) - { - keyvalue[count ][0] = "air"; -diff --git a/scheduler/printers.c b/scheduler/printers.c -index 7e9a9f2..3e00874 100644 ---- a/scheduler/printers.c -+++ b/scheduler/printers.c -@@ -3733,7 +3733,9 @@ add_printer_formats(cupsd_printer_t *p) /* I - Printer */ - } - else if (!_cups_strcasecmp(type->super, "image")) - { -- if (!_cups_strcasecmp(type->type, "jpeg")) -+ if (!_cups_strcasecmp(type->type, "urf")) -+ strlcat(pdl, "image/urf,", sizeof(pdl)); -+ else if (!_cups_strcasecmp(type->type, "jpeg")) - strlcat(pdl, "image/jpeg,", sizeof(pdl)); - else if (!_cups_strcasecmp(type->type, "png")) - strlcat(pdl, "image/png,", sizeof(pdl)); diff -Nru cups-2.3.3op2/debian/patches/0007-Keep-foomatic-PPDs-recommended-stanzas-in-NickNames.patch cups-2.4.1op1/debian/patches/0007-Keep-foomatic-PPDs-recommended-stanzas-in-NickNames.patch --- cups-2.3.3op2/debian/patches/0007-Keep-foomatic-PPDs-recommended-stanzas-in-NickNames.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0007-Keep-foomatic-PPDs-recommended-stanzas-in-NickNames.patch 2022-02-22 03:50:02.000000000 +0000 @@ -3,15 +3,16 @@ Subject: Keep foomatic PPDs "(recommended)" stanzas in NickNames Bug-Upstream: https://github.com/OpenPrinting/cups/pull/33 +Forwarded: yes --- scheduler/cups-driverd.cxx | 10 ---------- 1 file changed, 10 deletions(-) -diff --git a/scheduler/cups-driverd.cxx b/scheduler/cups-driverd.cxx -index 85516eb..874eb3c 100644 ---- a/scheduler/cups-driverd.cxx -+++ b/scheduler/cups-driverd.cxx -@@ -240,7 +240,6 @@ add_ppd(const char *filename, /* I - PPD filename */ +Index: cups/scheduler/cups-driverd.cxx +=================================================================== +--- cups.orig/scheduler/cups-driverd.cxx 2022-02-20 07:05:12.833613156 +0000 ++++ cups/scheduler/cups-driverd.cxx 2022-02-20 07:05:12.825612607 +0000 +@@ -241,7 +241,6 @@ const char *scheme) /* I - PPD scheme */ { ppd_info_t *ppd; /* PPD */ @@ -19,11 +20,10 @@ /* -@@ -278,15 +277,6 @@ add_ppd(const char *filename, /* I - PPD filename */ - strlcpy(ppd->record.device_id, device_id, sizeof(ppd->record.device_id)); +@@ -280,15 +279,6 @@ strlcpy(ppd->record.scheme, scheme, sizeof(ppd->record.scheme)); -- /* + /* - * Strip confusing (and often wrong) "recommended" suffix added by - * Foomatic drivers... - */ @@ -32,6 +32,7 @@ - " (recommended)")) != NULL) - *recommended = '\0'; - - /* +- /* * Add the PPD to the PPD arrays... */ + diff -Nru cups-2.3.3op2/debian/patches/0008-Debian-Set-LogFileGroup-to-adm.patch cups-2.4.1op1/debian/patches/0008-Debian-Set-LogFileGroup-to-adm.patch --- cups-2.3.3op2/debian/patches/0008-Debian-Set-LogFileGroup-to-adm.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0008-Debian-Set-LogFileGroup-to-adm.patch 2022-02-22 03:50:02.000000000 +0000 @@ -2,6 +2,7 @@ Date: Tue, 9 Aug 2016 18:11:38 +0200 Subject: Debian: Set LogFileGroup to adm +Forwarded: not-needed --- conf/cups-files.conf.in | 4 ++++ 1 file changed, 4 insertions(+) diff -Nru cups-2.3.3op2/debian/patches/0009-Debian-Move-cupsd.conf.default-from-SERVERROOT-to-DA.patch cups-2.4.1op1/debian/patches/0009-Debian-Move-cupsd.conf.default-from-SERVERROOT-to-DA.patch --- cups-2.3.3op2/debian/patches/0009-Debian-Move-cupsd.conf.default-from-SERVERROOT-to-DA.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0009-Debian-Move-cupsd.conf.default-from-SERVERROOT-to-DA.patch 2022-02-22 03:50:02.000000000 +0000 @@ -11,11 +11,11 @@ conf/Makefile | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) -diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c -index c648938..5ff7501 100644 ---- a/cgi-bin/admin.c -+++ b/cgi-bin/admin.c -@@ -1636,6 +1636,7 @@ do_config_server(http_t *http) /* I - HTTP connection */ +Index: cups/cgi-bin/admin.c +=================================================================== +--- cups.orig/cgi-bin/admin.c 2022-02-20 07:05:20.762157072 +0000 ++++ cups/cgi-bin/admin.c 2022-02-20 07:05:20.754156523 +0000 +@@ -1635,6 +1635,7 @@ int ch; /* Character from file */ char filename[1024]; /* Filename */ const char *server_root; /* Location of config files */ @@ -23,7 +23,7 @@ /* -@@ -1719,7 +1720,10 @@ do_config_server(http_t *http) /* I - HTTP connection */ +@@ -1718,7 +1719,10 @@ * well... */ @@ -35,11 +35,11 @@ if (!stat(filename, &info) && info.st_size < (1024 * 1024) && (cupsd = cupsFileOpen(filename, "r")) != NULL) -diff --git a/conf/Makefile b/conf/Makefile -index e249e60..42a123f 100644 ---- a/conf/Makefile -+++ b/conf/Makefile -@@ -70,7 +70,7 @@ install-data: +Index: cups/conf/Makefile +=================================================================== +--- cups.orig/conf/Makefile 2022-02-20 07:05:20.762157072 +0000 ++++ cups/conf/Makefile 2022-02-20 07:05:20.754156523 +0000 +@@ -70,7 +70,7 @@ else \ $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT) ; \ fi ; \ @@ -48,7 +48,7 @@ done $(INSTALL_DIR) -m 755 $(DATADIR)/mime for file in $(REPLACE); do \ -@@ -118,9 +118,10 @@ install-libs: +@@ -118,9 +118,10 @@ # uninstall: diff -Nru cups-2.3.3op2/debian/patches/0010-Debian-Do-not-alter-the-permissions-of-cupsd.conf-ev.patch cups-2.4.1op1/debian/patches/0010-Debian-Do-not-alter-the-permissions-of-cupsd.conf-ev.patch --- cups-2.3.3op2/debian/patches/0010-Debian-Do-not-alter-the-permissions-of-cupsd.conf-ev.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0010-Debian-Do-not-alter-the-permissions-of-cupsd.conf-ev.patch 2022-02-22 03:50:02.000000000 +0000 @@ -8,11 +8,11 @@ scheduler/conf.c | 2 ++ 1 file changed, 2 insertions(+) -diff --git a/scheduler/conf.c b/scheduler/conf.c -index bfd1b0b..c8cd5ea 100644 ---- a/scheduler/conf.c -+++ b/scheduler/conf.c -@@ -1140,10 +1140,12 @@ cupsdReadConfiguration(void) +Index: cups/scheduler/conf.c +=================================================================== +--- cups.orig/scheduler/conf.c 2022-02-20 07:05:27.618627438 +0000 ++++ cups/scheduler/conf.c 2022-02-20 07:05:27.606626616 +0000 +@@ -1132,10 +1132,12 @@ Group, 1, 1) < 0 || cupsdCheckPermissions(ServerRoot, "ssl", 0700, RunUser, Group, 1, 0) < 0 || diff -Nru cups-2.3.3op2/debian/patches/0011-Debian-Show-compile-command-lines.patch cups-2.4.1op1/debian/patches/0011-Debian-Show-compile-command-lines.patch --- cups-2.3.3op2/debian/patches/0011-Debian-Show-compile-command-lines.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0011-Debian-Show-compile-command-lines.patch 2022-02-22 03:50:02.000000000 +0000 @@ -2,6 +2,7 @@ Date: Tue, 9 Aug 2016 18:11:43 +0200 Subject: Debian: Show compile command lines +Forwarded: not-needed --- Makedefs.in | 1 - 1 file changed, 1 deletion(-) diff -Nru cups-2.3.3op2/debian/patches/0012-Debian-Use-dpkg-architecture-in-cups-config-to-make-.patch cups-2.4.1op1/debian/patches/0012-Debian-Use-dpkg-architecture-in-cups-config-to-make-.patch --- cups-2.3.3op2/debian/patches/0012-Debian-Use-dpkg-architecture-in-cups-config-to-make-.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0012-Debian-Use-dpkg-architecture-in-cups-config-to-make-.patch 2022-02-22 03:50:02.000000000 +0000 @@ -11,15 +11,16 @@ Bug-Debian: https://bugs.debian.org/727058 Bug-Debian: https://bugs.debian.org/730838 Bug-Debian: https://bugs.debian.org/751157 +Forwarded: not-needed --- cups-config.in | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) -diff --git a/cups-config.in b/cups-config.in -index 9dd094d..b073a07 100755 ---- a/cups-config.in -+++ b/cups-config.in -@@ -17,7 +17,7 @@ prefix=@prefix@ +Index: cups/cups-config.in +=================================================================== +--- cups.orig/cups-config.in 2022-02-20 23:49:50.896813619 +0000 ++++ cups/cups-config.in 2022-02-21 00:28:50.557319218 +0000 +@@ -18,7 +18,7 @@ exec_prefix=@exec_prefix@ bindir=@bindir@ includedir=@includedir@ @@ -28,17 +29,17 @@ datarootdir=@datadir@ datadir=@datadir@ sysconfdir=@sysconfdir@ -@@ -29,7 +29,8 @@ INSTALLSTATIC=@INSTALLSTATIC@ +@@ -30,7 +30,8 @@ # flags for compiler and linker... CFLAGS="" LDFLAGS="@EXPORT_LDFLAGS@" --LIBS="@LIBGSSAPI@ @DNSSDLIBS@ @EXPORT_SSLLIBS@ @LIBZ@ @LIBS@" +-LIBS="@LIBGSSAPI@ @DNSSDLIBS@ @EXPORT_TLSLIBS@ @LIBZ@ @LIBS@" +LIBGSSAPI=`[ ! -x /usr/bin/krb5-config ] || /usr/bin/krb5-config --libs` +LIBS="$LIBGSSAPI @DNSSDLIBS@ @EXPORT_SSLLIBS@ @LIBZ@ @LIBS@" # Check for local invocation... selfdir=`dirname $0` -@@ -43,7 +44,7 @@ else +@@ -44,7 +45,7 @@ CFLAGS="$CFLAGS -I$includedir" fi diff -Nru cups-2.3.3op2/debian/patches/0013-Debian-Build-mantohtml-with-the-build-architecture-c.patch cups-2.4.1op1/debian/patches/0013-Debian-Build-mantohtml-with-the-build-architecture-c.patch --- cups-2.3.3op2/debian/patches/0013-Debian-Build-mantohtml-with-the-build-architecture-c.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0013-Debian-Build-mantohtml-with-the-build-architecture-c.patch 2022-02-22 03:50:02.000000000 +0000 @@ -9,6 +9,7 @@ specific includes is thus needed. Bug-Debian: https://bugs.debian.org/837936 +Forwarded: not-needed --- Makedefs.in | 1 + configure.ac | 9 +++++++++ @@ -16,11 +17,11 @@ man/mantohtml.c | 15 ++++++++++----- 4 files changed, 22 insertions(+), 8 deletions(-) -diff --git a/Makedefs.in b/Makedefs.in -index 038bb94..291099c 100644 ---- a/Makedefs.in -+++ b/Makedefs.in -@@ -22,6 +22,7 @@ CUPS_VERSION = @CUPS_VERSION@ +Index: cups/Makedefs.in +=================================================================== +--- cups.orig/Makedefs.in 2022-02-21 04:35:06.386971790 +0000 ++++ cups/Makedefs.in 2022-02-21 04:35:06.378971241 +0000 +@@ -23,6 +23,7 @@ AR = @AR@ AWK = @AWK@ CC = @LIBTOOL_CC@ @CC@ @@ -28,19 +29,20 @@ CHMOD = @CHMOD@ CXX = @LIBTOOL_CXX@ @CXX@ DSO = @DSO@ -diff --git a/configure.ac b/configure.ac -index 93a4b97..b60b832 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -20,6 +20,15 @@ sinclude(config-scripts/cups-common.m4) +Index: cups/configure.ac +=================================================================== +--- cups.orig/configure.ac 2022-02-21 04:35:06.386971790 +0000 ++++ cups/configure.ac 2022-02-21 04:37:52.754384935 +0000 +@@ -25,6 +25,16 @@ + sinclude(config-scripts/cups-common.m4) sinclude(config-scripts/cups-directories.m4) sinclude(config-scripts/cups-manpages.m4) - ++ +AC_MSG_CHECKING([for build system compiler]) +if test "$cross_compiling" = yes; then -+ CC_FOR_BUILD=${CC_FOR_BUILD-cc} ++ CC_FOR_BUILD=${CC_FOR_BUILD-cc} +else -+ CC_FOR_BUILD=${CC} ++ CC_FOR_BUILD=${CC} +fi +AC_MSG_RESULT(${CC_FOR_BUILD}) +AC_SUBST(CC_FOR_BUILD) @@ -48,11 +50,11 @@ sinclude(config-scripts/cups-sharedlibs.m4) sinclude(config-scripts/cups-libtool.m4) sinclude(config-scripts/cups-compiler.m4) -diff --git a/man/Makefile b/man/Makefile -index 621fe60..e01591a 100644 ---- a/man/Makefile -+++ b/man/Makefile -@@ -222,6 +222,5 @@ html: $(MAN1) $(MAN5) $(MAN7) $(MAN8) mantohtml +Index: cups/man/Makefile +=================================================================== +--- cups.orig/man/Makefile 2022-02-21 04:35:06.386971790 +0000 ++++ cups/man/Makefile 2022-02-21 04:35:06.378971241 +0000 +@@ -222,6 +222,5 @@ ./mantohtml $$file >../doc/help/man-`basename $$file .8`.html; \ done @@ -61,10 +63,10 @@ - $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ +mantohtml: mantohtml.c + $(CC_FOR_BUILD) -o $@ $< -diff --git a/man/mantohtml.c b/man/mantohtml.c -index 2a9353a..6223f17 100644 ---- a/man/mantohtml.c -+++ b/man/mantohtml.c +Index: cups/man/mantohtml.c +=================================================================== +--- cups.orig/man/mantohtml.c 2022-02-21 04:35:06.386971790 +0000 ++++ cups/man/mantohtml.c 2022-02-21 04:35:06.378971241 +0000 @@ -11,8 +11,10 @@ * Include necessary headers. */ @@ -78,7 +80,7 @@ #include -@@ -811,7 +813,8 @@ main(int argc, /* I - Number of command-line args */ +@@ -811,7 +813,8 @@ * Anchor for HTML output... */ @@ -88,9 +90,9 @@ } else if (strncmp(line, ".\\\"", 3)) { -@@ -940,7 +943,8 @@ html_alternate(const char *s, /* I - String */ - manfile[1024], /* Man page filename */ - manurl[1024]; /* Man page URL */ +@@ -944,7 +947,8 @@ + manfile[1024], // Man page filename + manurl[1024]; // Man page URL - strlcpy(name, s, sizeof(name)); + strncpy(name, s, sizeof(name) - 1); @@ -98,13 +100,3 @@ if ((size_t)(end - s) < sizeof(name)) name[end - s] = '\0'; -@@ -1173,7 +1177,8 @@ html_fputs(const char *s, /* I - String */ - if (end[-1] == ',' || end[-1] == '.' || end[-1] == ')') - end --; - -- strlcpy(temp, s, sizeof(temp)); -+ strncpy(temp, s, sizeof(temp) - 1); -+ temp[sizeof(temp) - 1] = '\0'; - if ((size_t)(end -s) < sizeof(temp)) - temp[end - s] = '\0'; - diff -Nru cups-2.3.3op2/debian/patches/0014-Debian-Reproducibility-httpAddrGetHostname-test-fail.patch cups-2.4.1op1/debian/patches/0014-Debian-Reproducibility-httpAddrGetHostname-test-fail.patch --- cups-2.3.3op2/debian/patches/0014-Debian-Reproducibility-httpAddrGetHostname-test-fail.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0014-Debian-Reproducibility-httpAddrGetHostname-test-fail.patch 2022-02-22 03:50:02.000000000 +0000 @@ -3,15 +3,16 @@ Subject: Debian: Reproducibility: httpAddrGetHostname() test fails under reprotest; skip it +Forwarded: not-needed --- cups/testhttp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) -diff --git a/cups/testhttp.c b/cups/testhttp.c -index dfb767c..8cb87d6 100644 ---- a/cups/testhttp.c -+++ b/cups/testhttp.c -@@ -416,8 +416,7 @@ main(int argc, /* I - Number of command-line arguments */ +Index: cups/cups/testhttp.c +=================================================================== +--- cups.orig/cups/testhttp.c 2022-02-20 07:06:30.262924962 +0000 ++++ cups/cups/testhttp.c 2022-02-20 07:06:30.254924414 +0000 +@@ -417,8 +417,7 @@ } else { diff -Nru cups-2.3.3op2/debian/patches/0016-Debian-po4a-infrastructure-and-translations-for-manp.patch cups-2.4.1op1/debian/patches/0016-Debian-po4a-infrastructure-and-translations-for-manp.patch --- cups-2.3.3op2/debian/patches/0016-Debian-po4a-infrastructure-and-translations-for-manp.patch 2021-09-06 15:47:49.000000000 +0000 +++ cups-2.4.1op1/debian/patches/0016-Debian-po4a-infrastructure-and-translations-for-manp.patch 2022-02-22 03:50:02.000000000 +0000 @@ -8,6 +8,7 @@ Author: Nicolas François , Helge Kreutzmann Origin: vendor Bug-Debian: https://bugs.debian.org/478597 +Forwarded: not-needed --- man/Makefile | 17 +++- man/Makefile.l10n | 235 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff -Nru cups-2.3.3op2/debian/patches/9000-cupsd-cupsfilter-snap-support.patch cups-2.4.1op1/debian/patches/9000-cupsd-cupsfilter-snap-support.patch --- cups-2.3.3op2/debian/patches/9000-cupsd-cupsfilter-snap-support.patch 2021-08-17 17:20:26.000000000 +0000 +++ cups-2.4.1op1/debian/patches/9000-cupsd-cupsfilter-snap-support.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,1073 +0,0 @@ ---- a/config.h.in -+++ b/config.h.in -@@ -661,6 +661,20 @@ - #undef HAVE_SYS_STATVFS_H - #undef HAVE_SYS_VFS_H - -+/* -+ * Do we want Snap packaging support and have the needed libraries and -+ * utilities? -+ */ -+ -+#undef HAVE_APPARMOR -+#undef HAVE_SNAPDGLIB -+#undef HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC -+#undef HAVE_SNAPCTL_IS_CONNECTED -+#undef OUR_SNAP_NAME -+#undef SNAPCTL -+#undef CUPS_CONTROL_SLOT -+#undef SUPPORT_SNAPPED_CUPSD -+#undef SUPPORT_SNAPPED_CLIENTS - - /* - * Location of macOS localization bundle, if any. ---- /dev/null -+++ b/config-scripts/cups-snap.m4 -@@ -0,0 +1,106 @@ -+dnl -+dnl Support for packaging CUPS in a Snap and have it work with client Snaps. -+dnl -+dnl Copyright © 2021 by Till Kamppeter -+dnl Copyright © 2021 by OpenPrinting -+dnl -+dnl Licensed under Apache License v2.0. See the file "LICENSE" for more -+dnl information. -+dnl -+ -+# Snap packaging and Snap interaction support -+ -+AC_ARG_ENABLE(snapped_cupsd, [ --enable-snapped-cupsd enable support for packaging CUPS in a Snap]) -+AC_ARG_ENABLE(snapped_clients, [ --enable-snapped-clients enable support for CUPS controlling admin access from snapped clients]) -+AC_ARG_WITH([our-snap-name], AS_HELP_STRING([--with-our-snap-name], [Set name of the Snap we are snapped in, only needed with --enable-snapped-cupsd, default=cups]), [ -+ OUR_SNAP_NAME="$withval" -+], [ -+ OUR_SNAP_NAME="cups" -+]) -+AC_DEFINE_UNQUOTED([OUR_SNAP_NAME], ["$OUR_SNAP_NAME"], [Name of the Snap we are snapped in.]) -+AC_ARG_WITH(snapctl, [ --with-snapctl Set path for snapctl, only needed with --enable-snapped-cupsd, default=/usr/bin/snapctl], -+ SNAPCTL="$withval", SNAPCTL="/usr/bin/snapctl") -+AC_DEFINE_UNQUOTED(SNAPCTL, "$SNAPCTL") -+AC_ARG_WITH(cups_control_slot, [ --with-cups-control-slot Name for cups-control slot as defined in snapcraft.yaml, only needed with --enable-snapped-cupsd, default=cups-control], -+ CUPS_CONTROL_SLOT="$withval", CUPS_CONTROL_SLOT="cups-control") -+AC_DEFINE_UNQUOTED(CUPS_CONTROL_SLOT, "$CUPS_CONTROL_SLOT") -+ -+APPARMORLIBS="" -+SNAPDGLIBLIBS="" -+ENABLE_SNAPPED_CUPSD="NO" -+ENABLE_SNAPPED_CLIENTS="NO" -+ -+# Both --enable-snapped-cupsd and --enable-snapped-clients are about additional -+# access control for clients, allowing clients which are confined Snaps only -+# to do adminstrative tasks (create queues, delete someone else's jobs, ...) -+# if they plug the "cups-control" interface, so --enable-snapped-cupsd implies -+# --enable-snapped-clients. The difference is only the method how to determine -+# whether a client Snap is confined and plugs "cups-control". -+if test x$enable_snapped_cupsd == xyes; then -+ enable_snapped_clients=yes; -+fi -+ -+if test "x$PKGCONFIG" != x -a x$enable_snapped_clients == xyes; then -+ AC_MSG_CHECKING(for libapparmor) -+ if $PKGCONFIG --exists libapparmor; then -+ AC_MSG_RESULT(yes) -+ CFLAGS="$CFLAGS `$PKGCONFIG --cflags libapparmor`" -+ APPARMORLIBS="`$PKGCONFIG --libs libapparmor`" -+ AC_DEFINE(HAVE_APPARMOR) -+ AC_MSG_CHECKING(for libsnapd-glib) -+ if $PKGCONFIG --exists snapd-glib glib-2.0 gio-2.0; then -+ AC_MSG_RESULT(yes) -+ CFLAGS="$CFLAGS `$PKGCONFIG --cflags snapd-glib glib-2.0 gio-2.0`" -+ SNAPDGLIBLIBS="`$PKGCONFIG --libs snapd-glib glib-2.0 gio-2.0`" -+ AC_DEFINE(HAVE_SNAPDGLIB) -+ else -+ AC_MSG_RESULT(no) -+ fi -+ if test x$enable_snapped_cupsd == xyes; then -+ AC_CHECK_LIB(snapd-glib, snapd_client_run_snapctl2_sync, [ -+ AC_DEFINE(HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC) -+ AC_DEFINE(SUPPORT_SNAPPED_CUPSD) -+ AC_DEFINE(SUPPORT_SNAPPED_CLIENTS) -+ ENABLE_SNAPPED_CUPSD="YES" -+ ENABLE_SNAPPED_CLIENTS="YES" -+ ], [ -+ if test "x$SNAPDGLIBLIBS" != "x"; then -+ SNAPDGLIBLIBS="" -+ fi -+ AC_PATH_TOOL(SNAPCTL, snapctl) -+ AC_MSG_CHECKING(for "snapctl is-connected" support) -+ if test "x$SNAPCTL" != x && $SNAPCTL is-connected --help >/dev/null 2>&1; then -+ AC_MSG_RESULT(yes) -+ AC_DEFINE(HAVE_SNAPCTL_IS_CONNECTED) -+ AC_DEFINE(SUPPORT_SNAPPED_CUPSD) -+ AC_DEFINE(SUPPORT_SNAPPED_CLIENTS) -+ ENABLE_SNAPPED_CUPSD="YES" -+ ENABLE_SNAPPED_CLIENTS="YES" -+ else -+ AC_MSG_RESULT(no) -+ fi -+ ]) -+ else -+ if test "x$SNAPDGLIBLIBS" != "x"; then -+ AC_DEFINE(SUPPORT_SNAPPED_CLIENTS) -+ ENABLE_SNAPPED_CLIENTS="YES" -+ fi -+ fi -+ else -+ AC_MSG_RESULT(no) -+ fi -+fi -+ -+AC_MSG_CHECKING(for Snap support) -+if test "x$ENABLE_SNAPPED_CLIENTS" != "xNO"; then -+ if test "x$ENABLE_SNAPPED_CUPSD" != "xNO"; then -+ AC_MSG_RESULT(yes: cupsd + clients) -+ else -+ AC_MSG_RESULT(yes: clients only) -+ fi -+else -+ AC_MSG_RESULT(no) -+fi -+ -+AC_SUBST(APPARMORLIBS) -+AC_SUBST(SNAPDGLIBLIBS) ---- a/configure.ac -+++ b/configure.ac -@@ -41,6 +41,7 @@ - sinclude(config-scripts/cups-pam.m4) - sinclude(config-scripts/cups-largefile.m4) - sinclude(config-scripts/cups-dnssd.m4) -+sinclude(config-scripts/cups-snap.m4) - sinclude(config-scripts/cups-startup.m4) - sinclude(config-scripts/cups-defaults.m4) - ---- a/Makedefs.in -+++ b/Makedefs.in -@@ -172,6 +172,8 @@ - DNSSDLIBS = @DNSSDLIBS@ - IPPFIND_BIN = @IPPFIND_BIN@ - IPPFIND_MAN = @IPPFIND_MAN@ -+APPARMORLIBS = @APPARMORLIBS@ -+SNAPDGLIBLIBS = @SNAPDGLIBLIBS@ - LDFLAGS = @LDFLAGS@ - LINKCUPS = @LINKCUPS@ - LINKCUPSSTATIC = ../cups/$(LIBCUPSSTATIC) $(LIBS) ---- a/scheduler/auth.c -+++ b/scheduler/auth.c -@@ -51,6 +51,15 @@ - # endif - # define CUPSD_UCRED_UID(c) (c).uid - #endif /* HAVE_SYS_UCRED_H */ -+#ifdef SUPPORT_SNAPPED_CLIENTS -+# ifdef HAVE_APPARMOR -+# include -+# endif -+# ifdef HAVE_SNAPDGLIB -+# include -+# include -+# endif -+#endif /* SUPPORT_SNAPPED_CLIENTS */ - - - /* -@@ -1521,6 +1530,483 @@ - - - /* -+ * 'cupsdCheckAdminTask()' - Do additional checks on administrative tasks -+ */ -+ -+int /* O - 1 if admin task authorized */ -+cupsdCheckAdminTask(cupsd_client_t *con) /* I - Connection */ -+{ -+ int ret = 1; /* Return value */ -+ -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Administrative task"); -+ -+ /* -+ * If the client accesses locally via domain socket, find out whether it -+ * is a Snap. Grant access if it is not a Snap, if it is a classic Snap -+ * or if it is a confined Snap which plugs "cups-control", deny access -+ * if it is a confined Snap not plugging "cups-control" or if an error -+ * occurs in the process of finding this out. -+ */ -+ -+#if defined(AF_LOCAL) && defined(SUPPORT_SNAPPED_CLIENTS) -+ -+ /* -+ * Get the client's file descriptor and from this its AppArmor context -+ */ -+ -+ if (httpAddrFamily(con->http->hostaddr) == AF_LOCAL) -+ { -+ int peerfd; /* Peer's file descriptor */ -+ -+ peerfd = httpGetFd(con->http); -+ -+ if (peerfd < 0) -+ { -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Unable to get peer file descriptor of client connecting via domain socket"); -+ } -+ else -+ { -+ char *context = NULL; /* AppArmor profile name of client */ -+# undef CHECK_METHOD_FOUND -+# ifdef SUPPORT_SNAPPED_CUPSD -+ int status = 65535; /* Status of client Snap context check */ -+# if defined(HAVE_SNAPDGLIB) && defined(HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC) -+# define CHECK_METHOD_FOUND 1 -+ char *args[] = { "is-connected", "--apparmor-label", NULL, CUPS_CONTROL_SLOT, NULL }; /* snapctl arguments */ -+ SnapdClient *client = NULL; /* Data structure of snapd access */ -+ const char *cookie; /* snapd access cookie */ -+ GError *error = NULL; /* Glib error */ -+# else -+# ifdef HAVE_SNAPCTL_IS_CONNECTED -+# define CHECK_METHOD_FOUND 1 -+ char *args[] = { SNAPCTL, "is-connected", "--apparmor-label", NULL, CUPS_CONTROL_SLOT, NULL }; /* snapctl command line */ -+ int fds[2], /* Pipe file descriptors for stderr of -+ snapctl */ -+ nullfd; /* /dev/null file descriptor for stdout of -+ snapctl */ -+ pid_t pid; /* PID of snapctl */ -+ cups_file_t *snapctl_stderr; /* CUPS FP for stderr of snapctl */ -+ char buf[1024]; /* Buffer for snapctl's stderr output */ -+ int wstatus; /* Wait result of forked snapctl process */ -+# endif /* HAVE_SNAPCTL_IS_CONNECTED */ -+# endif /* HAVE_SNAPDGLIB && HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC */ -+# else -+# if !defined(SUPPORT_SNAPPED_CUPSD) && defined(HAVE_SNAPDGLIB) -+# define CHECK_METHOD_FOUND 1 -+ char *snap_name = NULL; /* Client Snap name */ -+ char *dot; /* Pointer to dot in AppArmor profile name */ -+ SnapdClient *snapd = NULL; /* Data structure of snapd access */ -+ GError *error = NULL; /* Glib error */ -+ SnapdSnap *snap = NULL; /* Data structure of client Snap */ -+ GPtrArray *plugs = NULL; /* Plug search result of client Snap */ -+# endif /* !SUPPORT_SNAPPED_CUPSD && HAVE_SNAPDGLIB */ -+# endif /* SUPPORT_SNAPPED_CUPSD */ -+ -+ -+# ifndef SUPPORT_SNAPPED_CUPSD -+ -+ /* If AppArmor is not enabled, then we can't identify the client */ -+ /* With cupsd running in a Snap, the "mount-observe" interface -+ needs to be plugged, therefore we do this only if not snapped. */ -+ if (!aa_is_enabled()) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: No AppArmor in use"); -+ goto snap_check_done; -+ } -+ -+# endif /* !SUPPORT_SNAPPED_CUPSD */ -+ -+ if (aa_getpeercon(peerfd, &context, NULL) < 0) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: AppArmor profile could not be retrieved for client process - Error: %s", strerror(errno)); -+ goto snap_check_done; -+ } else -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: AppArmor profile of client process: %s", context); -+ -+# ifdef OUR_SNAP_NAME -+ /* Is the client one of the utilities of our Snap? */ -+ if (!strncmp(context, "snap." OUR_SNAP_NAME ".", strlen(OUR_SNAP_NAME) + 6)) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client Snap is the same Snap we are running in, access granted"); -+ goto snap_check_done; -+ } -+# endif /* OUR_SNAP_NAME */ -+ -+# ifdef SUPPORT_SNAPPED_CUPSD -+ -+ /* -+ * Run -+ * -+ * snapctl is-connected --apparmor-label AA_CONTEXT CUPS_CONTROL_SLOT -+ * -+ * or an equivalent library function call using the -+ * snapd_client_run_snapctl2_sync() function of libsnapd-glib. -+ * -+ * Here AA_CONTEXT is the AppArmor profile name of the client, or -+ * "unconfined" for an unconfined client and CUPS_CONTROL_SLOT -+ * the name of the slot of the CUPS Snap to which clients plug -+ * with their cups-control plug in order to do administrative -+ * CUPS tasks. -+ * -+ * The exit status of the command/function call tells which type -+ * of client we have to do with: -+ * -+ * 0: The client is a confined Snap and plugs cups-control -+ * -> Grant access -+ * 1: The client is a confined Snap and does not plug cups-control -+ * -> Deny access -+ * 10: The client is a classic Snap -+ * -> Grant access -+ * 11: The client is not a Snap -+ * -> Grant access -+ * -+ * NOTE: This method only works if cupsd is running in a Snap -+ * providing a slot for the client's "cups-control" -+ * plug. Do not build CUPS with this method when intending -+ * to use it unsnapped, for example in a Debian or RPM -+ * package, or directly installed into your system. The -+ * errors of snapctl missing or snapctl/the function -+ * running without a Snap context will deny all -+ * administrative accesses! -+ * -+ * When running inside a Snap this method is preferred, as it does not -+ * require full access to the snapd under which cupsd is running. -+ */ -+ -+# if defined(HAVE_SNAPDGLIB) && defined(HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC) -+ -+ /* -+ * Use the snapd_client_run_snapctl2_sync() function of libsnapd-glib -+ */ -+ -+ /* Insert client Snap context in snapctl arguments */ -+ args[2] = context; -+ -+ /* Connect to snapd */ -+ client = snapd_client_new(); -+ if (!client) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Could not connect to snapd, permission denied"); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+ /* snapctl commands are sent over a this socket that is made -+ available within the snap sandbox */ -+ snapd_client_set_socket_path(client, "/run/snapd-snap.socket"); -+ -+ /* Take cookie from the environment if available */ -+ cookie = g_getenv("SNAP_COOKIE"); -+ if (!cookie) -+ { -+ cookie = ""; -+ cupsdLogMessage(CUPSD_LOG_WARN, "cupsdCheckAdminTask: No SNAP_COOKIE set in the Snap environment, client Snap context check may not work"); -+ } -+ -+ /* Do the client Snap context check */ -+ if (!snapd_client_run_snapctl2_sync(client, cookie, args, NULL, NULL, &status, NULL, &error)) { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client Snap context check error - %s", error->message); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+# else -+# ifdef HAVE_SNAPCTL_IS_CONNECTED -+ -+ /* -+ * Call the snapctl executable using execv() in a fork -+ */ -+ -+ /* Insert client Snap context in snapctl command line */ -+ args[3] = context; -+ -+ /* Create a pipe to catch stderr output from snapctl */ -+ if (pipe(fds)) -+ { -+ fds[0] = -1; -+ fds[1] = -1; -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Unable to establish stderr pipe for snapctl call - %s", strerror(errno)); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+ /* Set the "close on exec" flag on each end of the pipe... */ -+ if (fcntl(fds[0], F_SETFD, fcntl(fds[0], F_GETFD) | FD_CLOEXEC)) -+ { -+ close(fds[0]); -+ close(fds[1]); -+ fds[0] = -1; -+ fds[1] = -1; -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Unable to set \"close on exec\" flag on read end of the stderr pipe for snapctl call - %s", strerror(errno)); -+ ret = 0; -+ goto snap_check_done; -+ } -+ if (fcntl(fds[1], F_SETFD, fcntl(fds[1], F_GETFD) | FD_CLOEXEC)) -+ { -+ close(fds[0]); -+ close(fds[1]); -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Unable to set \"close on exec\" flag on write end of the stderr pipe for snapctl call - %s", strerror(errno)); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+ if ((pid = fork()) == 0) -+ { -+ /* Couple pipe with stderr of Ghostscript process */ -+ if (fds[1] >= 0) { -+ if (fds[1] != 2) { -+ if (dup2(fds[1], 2) < 0) { -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Unable to couple pipe with stderr of snapctl process - %s", strerror(errno)); -+ exit(100); -+ } -+ close(fds[1]); -+ } -+ close(fds[0]); -+ } else { -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Invalid pipe file descriptor to couple with stderr of snapctl process - %s", strerror(errno)); -+ exit(100); -+ } -+ -+ /* Send snapctl's stdout to the Nirwana, as snapctl is supposed to -+ not output anything here */ -+ if ((nullfd = open("/dev/null", O_RDWR)) > 2) -+ { -+ dup2(nullfd, 1); -+ close(nullfd); -+ } -+ else -+ close(nullfd); -+ fcntl(1, F_SETFL, O_NDELAY); -+ -+ /* Execute snapctl command line ... */ -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Running command: " SNAPCTL " is-connected --apparmor-label %s " CUPS_CONTROL_SLOT, context); -+ execv(SNAPCTL, args); -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Unable to launch snapctl: %s", strerror(errno)); -+ exit(100); -+ } -+ else if (pid < 0) -+ { -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Unable to fork for snapctl call - %s", strerror(errno)); -+ ret = 0; -+ goto snap_check_done; -+ } -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Started snapctl (PID %d)", pid); -+ -+ close(fds[1]); -+ -+ /* Read out stderr from snapctl */ -+ buf[0] = '\0'; -+ snapctl_stderr = cupsFileOpenFd(fds[0], "r"); -+ if (snapctl_stderr) -+ { -+ while (cupsFileGets(snapctl_stderr, buf, sizeof(buf)) && buf[0]) -+ { -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: Error message from snapctl: %s", buf); -+ ret = 0; -+ } -+ cupsFileClose(snapctl_stderr); -+ } -+ close(fds[0]); -+ -+ /* Wait for snapctl to finish */ -+ retry_wait: -+ if (waitpid (pid, &wstatus, 0) == -1) -+ { -+ if (errno == EINTR) -+ goto retry_wait; -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: snapctl (PID %d) stopped with an error - %s", pid, strerror(errno)); -+ ret = 0; -+ goto snap_check_done; -+ } -+ if (ret == 0) -+ goto snap_check_done; -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: snapctl (PID %d) exited with no errors.", pid); -+ -+ /* How did snapctl terminate */ -+ if (WIFEXITED(wstatus)) -+ { -+ /* Via regular exit */ -+ status = WEXITSTATUS(wstatus); -+ if (status == 100) -+ { -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: snapctl not executed"); -+ ret = 0; -+ goto snap_check_done; -+ } -+ } -+ else if (WIFSIGNALED(wstatus)) -+ { -+ /* Via signal */ -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: snapctl caught the signal %d", WTERMSIG(wstatus)); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+# endif /* HAVE_SNAPCTL_IS_CONNECTED */ -+# endif /* HAVE_SNAPDGLIB && HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC */ -+ -+ switch (status) -+ { -+ case 0 : -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client Snap connecting via \"cups-control\" interface, access granted"); -+ break; -+ case 1 : -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client Snap does not connect via \"cups-control\" interface, permission denied"); -+ ret = 0; -+ break; -+ case 10 : -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client Snap under classic confinement, access granted"); -+ break; -+ case 11 : -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client is not a Snap, access granted"); -+ break; -+ default : -+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdCheckAdminTask: snapctl exited with unknown status: %d", status); -+ ret = 0; -+ break; -+ } -+ -+ snap_check_done: -+ if (context) -+ free(context); -+# if defined(HAVE_SNAPDGLIB) && defined(HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC) -+ g_clear_object(&client); -+# endif /* HAVE_SNAPDGLIB && HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC */ -+ -+# else -+# if !defined(SUPPORT_SNAPPED_CUPSD) && defined(HAVE_SNAPDGLIB) -+ -+ /* -+ * If the client is a Snap, extract the client Snap's name from -+ * the AppArmor context and then query snapd to find out about the -+ * Snap's confinement type and whether it plugs cups-control. Grant -+ * access if -+ * -+ * - the client is not a Snap -+ * - the client is a classic Snap -+ * - the client is a confined Snap plugging "cups-control" -+ * -+ * We deny access if -+ * -+ * - the client is a confined Snap not plugging "cups-control" -+ * - an error occurs during the steps of this method -+ * -+ * NOTE: This method is only for use of cupsd when it is not -+ * packaged in a Snap. In a Snap one would need to plug the -+ * snapd-control interface, which gives full control on -+ * snapd, a high security risk. Therefore one will not get -+ * automatic connection of this interface granted in the -+ * Snap Store. This is the reason why the snapctl method -+ * (above) got created by the snapd developers. -+ * -+ * This is the preferred method to run CUPS unsnapped, as this is -+ * the only way to check Snap status on clients from an unsnapped -+ * cupsd. -+ */ -+ -+ /* If the AppArmor context does not begin with "snap.", then this -+ is not a snap */ -+ if (strncmp(context, "snap.", 5) != 0) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: AppArmor context not from a Snap"); -+ goto snap_check_done; -+ } -+ -+ dot = strchr(context + 5, '.'); -+ if (dot == NULL) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Malformed snapd AppArmor profile name: %s", context); -+ goto snap_check_done; -+ } -+ snap_name = strndup(context + 5, (size_t)(dot - context - 5)); -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client is the Snap %s", snap_name); -+ -+ /* Connect to snapd */ -+ snapd = snapd_client_new(); -+ if (!snapd) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Could not connect to snapd, permission denied"); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+ /* Check whether the client Snap is under classic confinement */ -+ snap = snapd_client_get_snap_sync(snapd, snap_name, NULL, &error); -+ if (!snap) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Could not obtain client Snap data: \"%s\", permission denied", error->message); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+ /* Snaps using classic confinement are granted access */ -+ if (snapd_snap_get_confinement(snap) == SNAPD_CONFINEMENT_CLASSIC) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client Snap under classic confinement, access granted"); -+ goto snap_check_done; -+ } -+ -+ /* Get list of interfaces to which the client Snap is plugging */ -+ if (!snapd_client_get_connections2_sync(snapd, SNAPD_GET_CONNECTIONS_FLAGS_NONE, snap_name, "cups-control", NULL, NULL, &plugs, NULL, NULL, &error)) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Could not obtain the client Snap's interface connections: \"%s\", permission denied", error->message); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+ if (plugs->len <= 0) -+ { -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client Snap does not connect via \"cups-control\" interface, permission denied"); -+ ret = 0; -+ goto snap_check_done; -+ } -+ -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Client Snap connecting via \"cups-control\" interface, access granted"); -+ -+ snap_check_done: -+ if (context) -+ free(context); -+ if (snap_name) -+ free(snap_name); -+ g_clear_object(&snapd); -+ g_clear_object(&snap); -+ if (plugs) -+ g_ptr_array_unref(plugs); -+ -+# endif /* !SUPPORT_SNAPPED_CUPSD && HAVE_SNAPDGLIB */ -+# endif /* SUPPORT_SNAPPED_CUPSD */ -+ -+# ifndef CHECK_METHOD_FOUND -+ -+ /* -+ * Issue warning if requirements for building Snap-related access control -+ * not fulfilled -+ */ -+ -+ cupsdLogMessage(CUPSD_LOG_WARN, "cupsdCheckAdminTask: Compiling problem: none of the three access control methods (libsnapd-glib snapd access, \"snapctl is-connected\", libsnapd-glib-based snapctl call) available, no Snap-related access control built!"); -+ -+ snap_check_done: -+ if (context) -+ free(context); -+ -+# endif /* !CHECK_METHOD_FOUND */ -+ -+ } -+ } -+ -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Access %s", ret == 1 ? "granted" : "denied"); -+ -+#else -+ -+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCheckAdminTask: Access granted (no extra checking)"); -+ -+#endif /* AF_LOCAL && SUPPORT_SNAPPED_CLIENTS */ -+ -+ return ret; -+} -+ -+ -+/* - * 'cupsdIsAuthorized()' - Check to see if the user is authorized... - */ - -@@ -1714,12 +2200,9 @@ - - /* - * OK, got a username. See if we need normal user access, or group -- * access... (root always matches) -+ * access... - */ - -- if (!strcmp(username, "root")) -- return (HTTP_OK); -- - /* - * Strip any @domain or @KDC from the username and owner... - */ -@@ -1749,6 +2232,21 @@ - else - pw = NULL; - -+ /* -+ * For matching user and group memberships below we will first go -+ * through all names except @SYSTEM to authorize the task as -+ * non-administrative, like printing or deleting one's own job, if this -+ * fails we will check whether we can authorize via the special name -+ * @SYSTEM, as an administrative task, like creating a print queue or -+ * deleting someone else's job. -+ * Note that tasks are considered as administrative by the policies -+ * in cupsd.conf, when they require the user or group @SYSTEM. -+ * We do this separation because if the client is a Snap connecting via -+ * domain socket, we need to additionally check whether it plugs to us -+ * through the "cups-control" interface which allows administration and -+ * not through the "cups" interface which allows only printing. -+ */ -+ - if (best->level == CUPSD_AUTH_USER) - { - /* -@@ -1779,8 +2277,15 @@ - { - if (!_cups_strncasecmp(name, "@AUTHKEY(", 9) && check_authref(con, name + 9)) - return (HTTP_OK); -- else if (!_cups_strcasecmp(name, "@SYSTEM") && SystemGroupAuthKey && -- check_authref(con, SystemGroupAuthKey)) -+ } -+ -+ for (name = (char *)cupsArrayFirst(best->names); -+ name; -+ name = (char *)cupsArrayNext(best->names)) -+ { -+ if (!_cups_strcasecmp(name, "@SYSTEM") && SystemGroupAuthKey && -+ check_authref(con, SystemGroupAuthKey) && -+ cupsdCheckAdminTask(con)) - return (HTTP_OK); - } - -@@ -1797,9 +2302,8 @@ - return (HTTP_OK); - else if (!_cups_strcasecmp(name, "@SYSTEM")) - { -- for (i = 0; i < NumSystemGroups; i ++) -- if (cupsdCheckGroup(username, pw, SystemGroups[i])) -- return (HTTP_OK); -+ /* Do @SYSTEM later, when every other entry fails */ -+ continue; - } - else if (name[0] == '@') - { -@@ -1810,6 +2314,19 @@ - return (HTTP_OK); - } - -+ for (name = (char *)cupsArrayFirst(best->names); -+ name; -+ name = (char *)cupsArrayNext(best->names)) -+ { -+ if (!_cups_strcasecmp(name, "@SYSTEM")) -+ { -+ for (i = 0; i < NumSystemGroups; i ++) -+ if (cupsdCheckGroup(username, pw, SystemGroups[i]) && -+ cupsdCheckAdminTask(con)) -+ return (HTTP_OK); -+ } -+ } -+ - return (con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED); - } - -@@ -1827,16 +2344,31 @@ - name; - name = (char *)cupsArrayNext(best->names)) - { -+ if (!_cups_strcasecmp(name, "@SYSTEM")) -+ { -+ /* Do @SYSTEM later, when every other entry fails */ -+ continue; -+ } -+ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking group \"%s\" membership...", name); - -+ if (cupsdCheckGroup(username, pw, name)) -+ return (HTTP_OK); -+ } -+ -+ for (name = (char *)cupsArrayFirst(best->names); -+ name; -+ name = (char *)cupsArrayNext(best->names)) -+ { - if (!_cups_strcasecmp(name, "@SYSTEM")) - { -+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking group \"%s\" membership...", name); -+ - for (i = 0; i < NumSystemGroups; i ++) -- if (cupsdCheckGroup(username, pw, SystemGroups[i])) -+ if (cupsdCheckGroup(username, pw, SystemGroups[i]) && -+ cupsdCheckAdminTask(con)) - return (HTTP_OK); - } -- else if (cupsdCheckGroup(username, pw, name)) -- return (HTTP_OK); - } - - /* ---- a/scheduler/cert.c -+++ b/scheduler/cert.c -@@ -83,7 +83,7 @@ - - if (pid == 0) - { --#ifdef HAVE_ACL_INIT -+#if defined(HAVE_ACL_INIT) && !defined(SUPPORT_SNAPPED_CUPSD) - acl_t acl; /* ACL information */ - acl_entry_t entry; /* ACL entry */ - acl_permset_t permset; /* Permissions */ -@@ -92,7 +92,7 @@ - # endif /* HAVE_MBR_UID_TO_UUID */ - static int acls_not_supported = 0; - /* Only warn once */ --#endif /* HAVE_ACL_INIT */ -+#endif /* HAVE_ACL_INIT && !SUPPORT_SNAPPED_CUPSD */ - - - /* -@@ -100,11 +100,18 @@ - */ - - fchmod(fd, 0440); -+ -+ /* ACLs do not work when cupsd is running in a Snap, and certificates -+ need root as group owner to be only accessible for CUPS and not the -+ unprivileged sub-processes */ -+#ifdef SUPPORT_SNAPPED_CUPSD -+ fchown(fd, RunUser, 0); -+#else - fchown(fd, RunUser, SystemGroupIDs[0]); - - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddCert: NumSystemGroups=%d", NumSystemGroups); - --#ifdef HAVE_ACL_INIT -+# ifdef HAVE_ACL_INIT - if (NumSystemGroups > 1) - { - /* -@@ -114,7 +121,7 @@ - - int j; /* Looping var */ - --# ifdef HAVE_MBR_UID_TO_UUID -+# ifdef HAVE_MBR_UID_TO_UUID - /* - * On macOS, ACLs use UUIDs instead of GIDs... - */ -@@ -143,7 +150,7 @@ - acl_set_permset(entry, permset); - } - --# else -+# else - /* - * POSIX ACLs need permissions for owner, group, other, and mask - * in addition to the rest of the system groups... -@@ -215,7 +222,7 @@ - cupsdLogMessage(CUPSD_LOG_ERROR, "ACL: %s", text); - acl_free(text); - } --# endif /* HAVE_MBR_UID_TO_UUID */ -+# endif /* HAVE_MBR_UID_TO_UUID */ - - if (acl_set_fd(fd, acl)) - { -@@ -230,7 +237,8 @@ - - acl_free(acl); - } --#endif /* HAVE_ACL_INIT */ -+# endif /* HAVE_ACL_INIT */ -+#endif /* SUPPORT_SNAPPED_CUPSD */ - - RootCertTime = time(NULL); - } ---- a/scheduler/conf.c -+++ b/scheduler/conf.c -@@ -1132,8 +1132,16 @@ - Group, 1, 1) < 0 || - cupsdCheckPermissions(StateDir, NULL, 0755, RunUser, - Group, 1, 1) < 0 || -+ /* Inside a Snap cupsd is running as root without CAP_DAC_OVERRIDE -+ capability, so certs directory has to be root.root-owned so that -+ cupsd can access but not its unprivileged sub-processes. */ -+#ifdef SUPPORT_SNAPPED_CUPSD -+ cupsdCheckPermissions(StateDir, "certs", 0711, RunUser, -+ 0, 1, 1) < 0 || -+#else - cupsdCheckPermissions(StateDir, "certs", RunUser ? 0711 : 0511, User, - SystemGroupIDs[0], 1, 1) < 0 || -+#endif /* SUPPORT_SNAPPED_CUPSD */ - cupsdCheckPermissions(ServerRoot, NULL, 0755, RunUser, - Group, 1, 0) < 0 || - cupsdCheckPermissions(ServerRoot, "ppd", 0755, RunUser, ---- a/scheduler/cups-exec.c -+++ b/scheduler/cups-exec.c -@@ -129,7 +129,11 @@ - if (setgid(gid)) - exit(errno + 100); - -+# ifdef SUPPORT_SNAPPED_CUPSD -+ if (setgroups(0, NULL)) -+# else - if (setgroups(1, &gid)) -+# endif /* SUPPORT_SNAPPED_CUPSD */ - exit(errno + 100); - - if (uid && setuid(uid)) ---- a/scheduler/cupsfilter.c -+++ b/scheduler/cupsfilter.c -@@ -921,7 +921,11 @@ - { - int i; /* Looping var */ - const char *argv[8], /* Command-line arguments */ -+#ifdef SUPPORT_SNAPPED_CUPSD -+ *envp[21], /* Environment variables */ -+#else - *envp[17], /* Environment variables */ -+#endif /* SUPPORT_SNAPPED_CUPSD */ - *temp; /* Temporary string */ - char *optstr, /* Filter options */ - content_type[1024], /* CONTENT_TYPE */ -@@ -929,9 +933,17 @@ - cups_fontpath[1024], /* CUPS_FONTPATH */ - cups_serverbin[1024], /* CUPS_SERVERBIN */ - cups_serverroot[1024], /* CUPS_SERVERROOT */ -+#ifdef SUPPORT_SNAPPED_CUPSD -+ fontconfig_file[1024], /* FONTCONFIG_FILE */ -+ fontconfig_path[1024], /* FONTCONFIG_PATH */ -+ fontconfig_sysroot[1024], /* FONTCONFIG_SYSROOT */ -+#endif /* SUPPORT_SNAPPED_CUPSD */ - final_content_type[1024] = "", - /* FINAL_CONTENT_TYPE */ - lang[1024], /* LANG */ -+#ifdef SUPPORT_SNAPPED_CUPSD -+ ld_library_path[2048], /* LD_LIBRARY_PATH */ -+#endif /* SUPPORT_SNAPPED_CUPSD */ - path[1024], /* PATH */ - ppd[1024], /* PPD */ - printer_info[255], /* PRINTER_INFO env variable */ -@@ -990,6 +1002,9 @@ - * Setup the filter environment and command-line... - */ - -+ /* If we are running confined in a Snap, also pass on fontconfig-related -+ environment variables and LD_LIBRARY_PATH */ -+ - optstr = escape_options(num_options, options); - - snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s", -@@ -1000,8 +1015,20 @@ - ServerBin); - snprintf(cups_serverroot, sizeof(cups_serverroot), "CUPS_SERVERROOT=%s", - ServerRoot); -+#ifdef SUPPORT_SNAPPED_CUPSD -+ snprintf(fontconfig_file, sizeof(fontconfig_file), "FONTCONFIG_FILE=%s", -+ getenv("FONTCONFIG_FILE")); -+ snprintf(fontconfig_path, sizeof(fontconfig_path), "FONTCONFIG_PATH=%s", -+ getenv("FONTCONFIG_PATH")); -+ snprintf(fontconfig_sysroot, sizeof(fontconfig_sysroot), -+ "FONTCONFIG_SYSROOT=%s", getenv("FONTCONFIG_SYSROOT")); -+#endif /* SUPPORT_SNAPPED_CUPSD */ - language = cupsLangDefault(); - snprintf(lang, sizeof(lang), "LANG=%s.UTF8", language->language); -+#ifdef SUPPORT_SNAPPED_CUPSD -+ snprintf(ld_library_path, sizeof(ld_library_path), "LD_LIBRARY_PATH=%s", -+ getenv("LD_LIBRARY_PATH")); -+#endif /* SUPPORT_SNAPPED_CUPSD */ - snprintf(path, sizeof(path), "PATH=%s", Path); - if (ppdfile) - snprintf(ppd, sizeof(ppd), "PPD=%s", ppdfile); -@@ -1073,6 +1100,26 @@ - envp[5] = cups_serverroot; - envp[6] = lang; - envp[7] = path; -+#ifdef SUPPORT_SNAPPED_CUPSD -+ envp[8] = ld_library_path; -+ envp[9] = ppd; -+ envp[10] = printer_info; -+ envp[11] = printer_location; -+ envp[12] = printer_name; -+ envp[13] = rip_max_cache; -+ envp[14] = userenv; -+ envp[15] = "CHARSET=utf-8"; -+ envp[16] = fontconfig_file; -+ envp[17] = fontconfig_path; -+ envp[18] = fontconfig_sysroot; -+ if (final_content_type[0]) -+ { -+ envp[19] = final_content_type; -+ envp[20] = NULL; -+ } -+ else -+ envp[19] = NULL; -+#else - envp[8] = ppd; - envp[9] = printer_info; - envp[10] = printer_location; -@@ -1087,6 +1134,7 @@ - } - else - envp[15] = NULL; -+#endif /* SUPPORT_SNAPPED_CUPSD */ - - for (i = 0; argv[i]; i ++) - fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); -@@ -1418,7 +1466,14 @@ - cupsFileClose(fp); - } - -+ /* Set the PATH environment variable for external executables, pass -+ through the PATH from the environment in which cupsd was called -+ if we are running confined in a Snap */ -+#ifdef SUPPORT_SNAPPED_CUPSD -+ snprintf(line, sizeof(line), "%s/filter:%s:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", ServerBin, getenv("PATH")); -+#else - snprintf(line, sizeof(line), "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", ServerBin); -+#endif /* SUPPORT_SNAPPED_CUPSD */ - set_string(&Path, line); - - return (0); ---- a/scheduler/env.c -+++ b/scheduler/env.c -@@ -114,11 +114,14 @@ - return; - - /* -- * Do not allow dynamic linker variables when running as root... -+ * Do not allow dynamic linker variables when running as root and -+ * not being confined in a Snap... - */ - -+#ifndef SUPPORT_SNAPPED_CUPSD - if (!RunUser && (!strncmp(name, "DYLD_", 5) || !strncmp(name, "LD_", 3))) - return; -+#endif /* !SUPPORT_SNAPPED_CUPSD */ - - /* - * See if this variable has already been defined... -@@ -208,9 +211,19 @@ - set_if_undefined("LD_LIBRARY_PATH", NULL); - set_if_undefined("LD_PRELOAD", NULL); - set_if_undefined("NLSPATH", NULL); -+ /* Only if cupsd is confined in a Snap we pass the PATH environment -+ variable on for external executables we call */ - if (find_env("PATH") < 0) -- cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR -- ":/bin:/usr/bin", ServerBin); -+ { -+#ifdef SUPPORT_SNAPPED_CUPSD -+ char *value; -+ if ((value = getenv("PATH")) != NULL) -+ cupsdSetEnvf("PATH", "%s/filter:%s", ServerBin, value); -+ else -+#endif /* SUPPORT_SNAPPED_CUPSD */ -+ cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR -+ ":/bin:/usr/bin", ServerBin); -+ } - set_if_undefined("SERVER_ADMIN", ServerAdmin); - set_if_undefined("SHLIB_PATH", NULL); - set_if_undefined("SOFTWARE", CUPS_MINIMAL); ---- a/scheduler/Makefile -+++ b/scheduler/Makefile -@@ -318,13 +318,15 @@ - echo Linking $@... - $(LD_CC) $(ALL_LDFLAGS) -o cupsd $(CUPSDOBJS) libcupsmime.a \ - $(PAMLIBS) $(LIBPAPER) $(LIBMALLOC) $(DNSSDLIBS) $(SERVERLIBS) \ -- $(ONDEMANDLIBS) $(LIBWRAP) $(LIBGSSAPI) $(COMMONLIBS) $(LINKCUPS) -+ $(ONDEMANDLIBS) $(LIBWRAP) $(LIBGSSAPI) $(COMMONLIBS) $(LINKCUPS) \ -+ $(APPARMORLIBS) $(SNAPDGLIBLIBS) - $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ - - cupsd-static: $(CUPSDOBJS) libcupsmime.a ../cups/$(LIBCUPSSTATIC) - echo Linking $@... - $(LD_CC) $(ALL_LDFLAGS) -o cupsd-static $(CUPSDOBJS) libcupsmime.a \ -- $(PAMLIBS) $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(ONDEMANDLIBS) \ $(LIBWRAP) $(LINKCUPSSTATIC) -+ $(PAMLIBS) $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(ONDEMANDLIBS) \ -+ $(LIBWRAP) $(APPARMORLIBS) $(SNAPDGLIBLIBS) $(LINKCUPSSTATIC) - $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ - - ---- a/scheduler/process.c -+++ b/scheduler/process.c -@@ -744,7 +744,11 @@ - if (!RunUser && setgid(Group)) - exit(errno + 100); - -+# ifdef SUPPORT_SNAPPED_CUPSD -+ if (!RunUser && setgroups(0, NULL)) -+# else - if (!RunUser && setgroups(1, &Group)) -+# endif /* SUPPORT_SNAPPED_CUPSD */ - exit(errno + 100); - - /* diff -Nru cups-2.3.3op2/debian/patches/9100-ppd-cache-add-auto-presets.patch cups-2.4.1op1/debian/patches/9100-ppd-cache-add-auto-presets.patch --- cups-2.3.3op2/debian/patches/9100-ppd-cache-add-auto-presets.patch 2021-09-10 17:17:28.000000000 +0000 +++ cups-2.4.1op1/debian/patches/9100-ppd-cache-add-auto-presets.patch 2022-02-22 11:28:08.000000000 +0000 @@ -1,23 +1,6 @@ ---- a/CHANGES.md -+++ b/CHANGES.md -@@ -1,6 +1,14 @@ - CHANGES - 2.3.3 - 2020-04-24 - ============================ - -+Changes in CUPS v2.4rc1 (Pending) -+--------------------------------- -+ -+ - Added support for CUPS running in a Snapcraft snap. -+ - Added PPD option preset auto-generation: For all 6 combinations of -+ print-color-mode and print-quality and also for the 5 settings of -+ print-content-optimize presets are auto-generated. -+ - Changes in CUPS v2.3.3 - ---------------------- - --- a/cups/ppd-cache.c +++ b/cups/ppd-cache.c -@@ -439,6 +439,8 @@ +@@ -472,6 +472,8 @@ _pwg_print_color_mode_t print_color_mode; /* Print color mode for preset */ _pwg_print_quality_t print_quality; /* Print quality for preset */ @@ -26,7 +9,7 @@ DEBUG_printf(("_ppdCacheCreateWithFile(filename=\"%s\")", filename)); -@@ -864,6 +866,28 @@ +@@ -897,6 +899,28 @@ cupsParseOptions(valueptr, 0, pc->presets[print_color_mode] + print_quality); } @@ -55,7 +38,7 @@ else if (!_cups_strcasecmp(line, "SidesOption")) pc->sides_option = strdup(value); else if (!_cups_strcasecmp(line, "Sides1Sided")) -@@ -991,6 +1015,7 @@ +@@ -1024,6 +1048,7 @@ *ppd_option; /* Other PPD option */ ppd_choice_t *choice; /* Current InputSlot/MediaType */ pwg_map_t *map; /* Current source/type map */ @@ -63,7 +46,7 @@ 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 */ -@@ -1401,6 +1426,10 @@ +@@ -1434,6 +1459,10 @@ if ((ppd_attr = ppdFindAttr(ppd, "APPrinterPreset", NULL)) != NULL) { /* @@ -74,7 +57,7 @@ * Copy and convert APPrinterPreset (output-mode + print-quality) data... */ -@@ -1500,114 +1529,133 @@ +@@ -1533,114 +1562,133 @@ _ppdParseOptions(ppd_attr->value, 0, pc->presets[pwg_print_color_mode] + pwg_print_quality, _PPD_PARSE_OPTIONS); @@ -292,7 +275,7 @@ /* * Copy and convert Duplex (sides) data... */ -@@ -1941,13 +1989,996 @@ +@@ -1974,13 +2022,996 @@ /* @@ -1290,7 +1273,7 @@ pwg_map_t *map; /* Current map */ pwg_size_t *size; /* Current size */ -@@ -2026,6 +3057,15 @@ +@@ -2059,6 +3090,15 @@ cupsArrayDelete(pc->strings); @@ -1306,7 +1289,7 @@ free(pc); } -@@ -2895,6 +3935,21 @@ +@@ -2928,6 +3968,21 @@ } /* @@ -1330,16 +1313,16 @@ --- a/cups/ppd-private.h +++ b/cups/ppd-private.h -@@ -35,7 +35,7 @@ +@@ -36,7 +36,7 @@ * Constants... */ --# define _PPD_CACHE_VERSION 9 /* Version number in cache file */ +-# define _PPD_CACHE_VERSION 10 /* Version number in cache file */ +# define _PPD_CACHE_VERSION 11 /* Version number in cache file */ /* -@@ -100,6 +100,16 @@ +@@ -101,6 +101,16 @@ _PWG_PRINT_QUALITY_MAX } _pwg_print_quality_t; @@ -1356,7 +1339,7 @@ typedef struct _pwg_finishings_s /**** PWG finishings mapping data ****/ { ipp_finishings_t value; /* finishings value */ -@@ -130,6 +140,11 @@ +@@ -131,6 +141,11 @@ /* Number of print-color-mode/print-quality options */ cups_option_t *presets[_PWG_PRINT_COLOR_MODE_MAX][_PWG_PRINT_QUALITY_MAX]; /* print-color-mode/print-quality options */ @@ -1368,7 +1351,7 @@ char *sides_option, /* PPD option for sides */ *sides_1sided, /* Choice for one-sided */ *sides_2sided_long, /* Choice for two-sided-long-edge */ -@@ -212,6 +227,8 @@ +@@ -214,6 +229,8 @@ extern const char *_pwgPageSizeForMedia(pwg_media_t *media, char *name, size_t namesize) _CUPS_PRIVATE; @@ -1379,7 +1362,7 @@ * C++ magic... --- a/cups/string-private.h +++ b/cups/string-private.h -@@ -160,6 +160,8 @@ +@@ -150,6 +150,8 @@ extern int _cups_strncasecmp(const char *, const char *, size_t n) _CUPS_PRIVATE; @@ -1429,7 +1412,7 @@ /* --- a/scheduler/job.c +++ b/scheduler/job.c -@@ -3640,9 +3640,13 @@ +@@ -3633,9 +3633,13 @@ cups_option_t *pwgppds, /* PWG->PPD options */ *pwgppd, /* Current PWG->PPD option */ *preset; /* Current preset option */ @@ -1445,7 +1428,7 @@ const char *ppd; /* PPD option choice */ int exact; /* Did we get an exact match? */ static char *options = NULL;/* Full list of options */ -@@ -3664,7 +3668,7 @@ +@@ -3657,7 +3661,7 @@ if (pc && !ippFindAttribute(job->attrs, "com.apple.print.DocumentTicket.PMSpoolFormat", IPP_TAG_ZERO) && !ippFindAttribute(job->attrs, "APPrinterPreset", IPP_TAG_ZERO) && @@ -1454,7 +1437,7 @@ { /* * Map print-color-mode and print-quality to a preset... -@@ -3726,6 +3730,12 @@ +@@ -3719,6 +3723,12 @@ } } @@ -1467,7 +1450,7 @@ if (pc->num_presets[print_color_mode][print_quality] > 0) { /* -@@ -3740,7 +3750,72 @@ +@@ -3733,7 +3743,72 @@ { if (!ippFindAttribute(job->attrs, preset->name, IPP_TAG_ZERO)) { diff -Nru cups-2.3.3op2/debian/patches/9110-create-local-printer-localhost-fix.patch cups-2.4.1op1/debian/patches/9110-create-local-printer-localhost-fix.patch --- cups-2.3.3op2/debian/patches/9110-create-local-printer-localhost-fix.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/9110-create-local-printer-localhost-fix.patch 2022-03-16 17:20:49.000000000 +0000 @@ -0,0 +1,87 @@ +--- a/scheduler/ipp.c ++++ b/scheduler/ipp.c +@@ -5424,6 +5424,11 @@ + *nameptr, /* Pointer into name */ + uri[1024]; /* printer-uri-supported value */ + const char *ptr; /* Pointer into attribute value */ ++ char scheme[HTTP_MAX_URI], /* Scheme portion of URI */ ++ userpass[HTTP_MAX_URI], /* Username portion of URI */ ++ host[HTTP_MAX_URI], /* Host portion of URI */ ++ resource[HTTP_MAX_URI]; /* Resource portion of URI */ ++ int port; /* Port portion of URI */ + + + /* +@@ -5487,6 +5492,13 @@ + + return; + } ++ ptr = ippGetString(device_uri, 0, NULL); ++ if (!ptr || !ptr[0]) ++ { ++ send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Attribute \"%s\" has empty value."), "device-uri"); ++ ++ return; ++ } + + printer_geo_location = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI); + printer_info = ippFindAttribute(con->request, "printer-info", IPP_TAG_TEXT); +@@ -5515,7 +5527,57 @@ + printer->shared = 0; + printer->temporary = 1; + +- cupsdSetDeviceURI(printer, ippGetString(device_uri, 0, NULL)); ++ /* ++ * Check device URI if it has the same hostname as we have, if so, replace ++ * the hostname by localhost. This way we assure that local-only services ++ * like ipp-usb or Printer Applications always work. ++ * ++ * When comparing our hostname with the one in the device URI, consider ++ * names with ¨.local(.)" suffix and names without suffix the same. ++ */ ++ ++#ifdef HAVE_DNSSD ++ if (DNSSDHostName) ++ nameptr = DNSSDHostName; ++ else ++#endif ++ if (ServerName) ++ nameptr = ServerName; ++ else ++ nameptr = NULL; ++ ++ if (nameptr) ++ { ++ int host_len, ++ server_name_len; ++ ++ httpSeparateURI(HTTP_URI_CODING_ALL, ptr, ++ scheme, sizeof(scheme), userpass, sizeof(userpass), host, ++ sizeof(host), &port, resource, sizeof(resource)); ++ ++ host_len = strlen(host); ++ if (strcmp(host + host_len - 6, ".local") == 0) ++ host_len -= 6; ++ if (strcmp(host + host_len - 7, ".local.") == 0) ++ host_len -= 7; ++ ++ server_name_len = strlen(nameptr); ++ if (strcmp(nameptr + server_name_len - 6, ".local") == 0) ++ server_name_len -= 6; ++ if (strcmp(nameptr + server_name_len - 7, ".local.") == 0) ++ server_name_len -= 7; ++ ++ if (host_len == server_name_len && strncmp(host, nameptr, host_len) == 0) ++ ptr = "localhost"; ++ else ++ ptr = host; ++ ++ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, userpass, ++ ptr, port, resource); ++ cupsdSetDeviceURI(printer, uri); ++ } ++ else ++ cupsdSetDeviceURI(printer, ptr); + + if (printer_geo_location) + cupsdSetString(&printer->geo_location, ippGetString(printer_geo_location, 0, NULL)); diff -Nru cups-2.3.3op2/debian/patches/9120-scheduler-ipp-c-resolve-mdns-uri.patch cups-2.4.1op1/debian/patches/9120-scheduler-ipp-c-resolve-mdns-uri.patch --- cups-2.3.3op2/debian/patches/9120-scheduler-ipp-c-resolve-mdns-uri.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/9120-scheduler-ipp-c-resolve-mdns-uri.patch 2022-03-18 22:57:49.000000000 +0000 @@ -0,0 +1,31 @@ +--- a/scheduler/ipp.c ++++ b/scheduler/ipp.c +@@ -5271,6 +5271,7 @@ + userpass[256], /* User:pass */ + host[256], /* Hostname */ + resource[1024], /* Resource path */ ++ uri[1024], /* Resolved URI, if needed */ + line[1024]; /* Line from PPD */ + int port; /* Port number */ + http_encryption_t encryption; /* Type of encryption to use */ +@@ -5292,6 +5293,20 @@ + + cupsdLogMessage(CUPSD_LOG_DEBUG, "%s: Generating PPD file from \"%s\"...", printer->name, printer->device_uri); + ++ ++ if (strstr(printer->device_uri, "._tcp")) ++ { ++ cupsdLogMessage(CUPSD_LOG_DEBUG2, "%s: Resolving mDNS URI \"%s\".", printer->name, printer->device_uri); ++ ++ if (!_httpResolveURI(printer->device_uri, uri, sizeof(uri), _HTTP_RESOLVE_DEFAULT, NULL, NULL)) ++ { ++ cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Couldn't resolve mDNS URI \"%s\".", printer->name, printer->device_uri); ++ return (NULL); ++ } ++ ++ printer->device_uri = uri; ++ } ++ + if (httpSeparateURI(HTTP_URI_CODING_ALL, printer->device_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Bad device URI \"%s\".", printer->name, printer->device_uri); diff -Nru cups-2.3.3op2/debian/patches/CVE-2022-26691-1.patch cups-2.4.1op1/debian/patches/CVE-2022-26691-1.patch --- cups-2.3.3op2/debian/patches/CVE-2022-26691-1.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/CVE-2022-26691-1.patch 2022-05-27 11:52:52.000000000 +0000 @@ -0,0 +1,44 @@ +From de4f8c196106033e4c372dce3e91b9d42b0b9444 Mon Sep 17 00:00:00 2001 +From: Zdenek Dohnal +Date: Thu, 26 May 2022 06:27:04 +0200 +Subject: [PATCH] scheduler/cert.c: Fix string comparison (fixes + CVE-2022-26691) + +The previous algorithm didn't expect the strings can have a different +length, so one string can be a substring of the other and such substring +was reported as equal to the longer string. +--- + CHANGES.md | 1 + + scheduler/cert.c | 9 ++++++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +#diff --git a/CHANGES.md b/CHANGES.md +#index b254bc57c..1fc8ab0ca 100644 +#--- a/CHANGES.md +#+++ b/CHANGES.md +#@@ -4,6 +4,7 @@ CHANGES - OpenPrinting CUPS 2.4.1 - 2022-01-27 +# Changes in CUPS v2.4.2 (TBA) +# ---------------------------- +# +#+- Fixed certificate strings comparison for Local authorization (CVE-2022-26691) +# - The `cupsFileOpen` function no longer opens files for append in read-write +# mode (Issue #291) +# - The cupsd daemon removed processing temporary queue (Issue #364) +diff --git a/scheduler/cert.c b/scheduler/cert.c +index b268bf1b2..9b65b96c9 100644 +--- a/scheduler/cert.c ++++ b/scheduler/cert.c +@@ -444,5 +444,12 @@ ctcompare(const char *a, /* I - First string */ + b ++; + } + +- return (result); ++ /* ++ * The while loop finishes when *a == '\0' or *b == '\0' ++ * so after the while loop either both *a and *b == '\0', ++ * or one points inside a string, so when we apply logical OR on *a, ++ * *b and result, we get a non-zero return value if the compared strings don't match. ++ */ ++ ++ return (result | *a | *b); + } diff -Nru cups-2.3.3op2/debian/patches/CVE-2022-26691-2.patch cups-2.4.1op1/debian/patches/CVE-2022-26691-2.patch --- cups-2.3.3op2/debian/patches/CVE-2022-26691-2.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/CVE-2022-26691-2.patch 2022-05-27 11:52:56.000000000 +0000 @@ -0,0 +1,22 @@ +From 411b6136f450a583ee08c3880fa09dbe837eb3f1 Mon Sep 17 00:00:00 2001 +From: Zdenek Dohnal +Date: Thu, 26 May 2022 09:28:20 +0200 +Subject: [PATCH] scheduler/cert.c: fix the comment + +--- + scheduler/cert.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scheduler/cert.c b/scheduler/cert.c +index 9b65b96c9..b08d9d93a 100644 +--- a/scheduler/cert.c ++++ b/scheduler/cert.c +@@ -447,7 +447,7 @@ ctcompare(const char *a, /* I - First string */ + /* + * The while loop finishes when *a == '\0' or *b == '\0' + * so after the while loop either both *a and *b == '\0', +- * or one points inside a string, so when we apply logical OR on *a, ++ * or one points inside a string, so when we apply bitwise OR on *a, + * *b and result, we get a non-zero return value if the compared strings don't match. + */ + diff -Nru cups-2.3.3op2/debian/patches/CVE-2023-32324.patch cups-2.4.1op1/debian/patches/CVE-2023-32324.patch --- cups-2.3.3op2/debian/patches/CVE-2023-32324.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/CVE-2023-32324.patch 2023-05-25 12:42:44.000000000 +0000 @@ -0,0 +1,29 @@ +From 5e3107e734f06d410a490e8bc923dc3119f17671 Mon Sep 17 00:00:00 2001 +From: Michael R Sweet +Date: Wed, 17 May 2023 12:59:57 -0400 +Subject: [PATCH] Consensus fix. + +--- + cups/string.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/cups/string.c ++++ b/cups/string.c +@@ -1,6 +1,7 @@ + /* + * String functions for CUPS. + * ++ * Copyright © 2023 by OpenPrinting. + * Copyright © 2007-2019 by Apple Inc. + * Copyright © 1997-2007 by Easy Software Products. + * +@@ -760,6 +761,9 @@ _cups_strlcpy(char *dst, /* O - D + size_t srclen; /* Length of source string */ + + ++ if (size == 0) ++ return (0); ++ + /* + * Figure out how much room is needed... + */ diff -Nru cups-2.3.3op2/debian/patches/CVE-2023-32360.patch cups-2.4.1op1/debian/patches/CVE-2023-32360.patch --- cups-2.3.3op2/debian/patches/CVE-2023-32360.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/CVE-2023-32360.patch 2023-09-11 16:29:38.000000000 +0000 @@ -0,0 +1,28 @@ +From a0c8b9c9556882f00c68b9727a95a1b6d1452913 Mon Sep 17 00:00:00 2001 +From: Michael R Sweet +Date: Tue, 6 Dec 2022 09:04:01 -0500 +Subject: [PATCH] Require authentication for CUPS-Get-Document. + +--- + conf/cupsd.conf.in | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/conf/cupsd.conf.in b/conf/cupsd.conf.in +index b258849078..a07536f3e4 100644 +--- a/conf/cupsd.conf.in ++++ b/conf/cupsd.conf.in +@@ -68,7 +68,13 @@ IdleExitTimeout @EXIT_TIMEOUT@ + Order deny,allow + + +- ++ ++ Require user @OWNER @SYSTEM ++ Order deny,allow ++ ++ ++ ++ AuthType Default + Require user @OWNER @SYSTEM + Order deny,allow + diff -Nru cups-2.3.3op2/debian/patches/CVE-2023-34241.patch cups-2.4.1op1/debian/patches/CVE-2023-34241.patch --- cups-2.3.3op2/debian/patches/CVE-2023-34241.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/CVE-2023-34241.patch 2023-06-13 12:17:17.000000000 +0000 @@ -0,0 +1,64 @@ +From ffd290b4ab247f82722927ba9b21358daa16dbf1 Mon Sep 17 00:00:00 2001 +From: Rose <83477269+AtariDreams@users.noreply.github.com> +Date: Thu, 1 Jun 2023 11:33:39 -0400 +Subject: [PATCH] Log result of httpGetHostname BEFORE closing the connection + +httpClose frees the memory of con->http. This is problematic because httpGetHostname then tries to access the memory it points to. + +We have to log the hostname first. +--- + scheduler/client.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +diff --git a/scheduler/client.c b/scheduler/client.c +index 91e441188..327473a4d 100644 +--- a/scheduler/client.c ++++ b/scheduler/client.c +@@ -193,13 +193,11 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ + /* + * Can't have an unresolved IP address with double-lookups enabled... + */ +- +- httpClose(con->http); +- + cupsdLogClient(con, CUPSD_LOG_WARN, +- "Name lookup failed - connection from %s closed!", ++ "Name lookup failed - closing connection from %s!", + httpGetHostname(con->http, NULL, 0)); + ++ httpClose(con->http); + free(con); + return; + } +@@ -235,11 +233,11 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ + * with double-lookups enabled... + */ + +- httpClose(con->http); +- + cupsdLogClient(con, CUPSD_LOG_WARN, +- "IP lookup failed - connection from %s closed!", ++ "IP lookup failed - closing connection from %s!", + httpGetHostname(con->http, NULL, 0)); ++ ++ httpClose(con->http); + free(con); + return; + } +@@ -256,11 +254,11 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ + + if (!hosts_access(&wrap_req)) + { +- httpClose(con->http); +- + cupsdLogClient(con, CUPSD_LOG_WARN, + "Connection from %s refused by /etc/hosts.allow and " + "/etc/hosts.deny rules.", httpGetHostname(con->http, NULL, 0)); ++ ++ httpClose(con->http); + free(con); + return; + } +-- +2.40.1 + diff -Nru cups-2.3.3op2/debian/patches/CVE-2023-4504.patch cups-2.4.1op1/debian/patches/CVE-2023-4504.patch --- cups-2.3.3op2/debian/patches/CVE-2023-4504.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/CVE-2023-4504.patch 2023-09-15 11:19:51.000000000 +0000 @@ -0,0 +1,36 @@ +From a9a7daa77699bd58001c25df8a61a8029a217ddf Mon Sep 17 00:00:00 2001 +From: Zdenek Dohnal +Date: Fri, 1 Sep 2023 16:47:29 +0200 +Subject: [PATCH] raster-interpret.c: Fix CVE-2023-4504 + +We didn't check for end of buffer if it looks there is an escaped +character - check for NULL terminator there and if found, return NULL +as return value and in `ptr`, because a lone backslash is not +a valid PostScript character. +--- + cups/raster-interpret.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +--- a/cups/raster-interpret.c ++++ b/cups/raster-interpret.c +@@ -1113,7 +1113,19 @@ scan_ps(_cups_ps_stack_t *st, /* I - S + + cur ++; + +- if (*cur == 'b') ++ /* ++ * Return NULL if we reached NULL terminator, a lone backslash ++ * is not a valid character in PostScript. ++ */ ++ ++ if (!*cur) ++ { ++ *ptr = NULL; ++ ++ return (NULL); ++ } ++ ++ if (*cur == 'b') + *valptr++ = '\b'; + else if (*cur == 'f') + *valptr++ = '\f'; diff -Nru cups-2.3.3op2/debian/patches/check-colormodel-also-for-cmyk.patch cups-2.4.1op1/debian/patches/check-colormodel-also-for-cmyk.patch --- cups-2.3.3op2/debian/patches/check-colormodel-also-for-cmyk.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/check-colormodel-also-for-cmyk.patch 2023-06-24 15:20:00.000000000 +0000 @@ -0,0 +1,11 @@ +--- a/scheduler/printers.c ++++ b/scheduler/printers.c +@@ -4501,7 +4501,7 @@ + ppd_option_t *color_model = ppdFindOption(ppd, "ColorModel"); + // ColorModel PPD option + +- if (color_model && strcmp(color_model->defchoice, "RGB")) ++ if (color_model && strcmp(color_model->defchoice, "RGB") && strcmp(color_model->defchoice, "CMYK")) + p->num_options = cupsAddOption("print-color-mode", "monochrome", p->num_options, &p->options); + } + } diff -Nru cups-2.3.3op2/debian/patches/dont-override-color-settings-from-print-dialog.patch cups-2.4.1op1/debian/patches/dont-override-color-settings-from-print-dialog.patch --- cups-2.3.3op2/debian/patches/dont-override-color-settings-from-print-dialog.patch 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/debian/patches/dont-override-color-settings-from-print-dialog.patch 2023-06-24 15:18:08.000000000 +0000 @@ -0,0 +1,65 @@ +--- a/cups/ppd-cache.c ++++ b/cups/ppd-cache.c +@@ -259,15 +259,46 @@ + + color_attr_name = print_color_mode_sup ? "print-color-mode" : "output-mode"; + +- if ((keyword = cupsGetOption("print-color-mode", num_options, options)) == NULL) ++ /* ++ * If we use PPD with standardized PPD option for color support - ColorModel, ++ * prefer it to don't break color/grayscale support for PPDs, either classic ++ * or the ones generated from IPP Get-Printer-Attributes response. ++ */ ++ ++ if ((keyword = cupsGetOption("ColorModel", num_options, options)) == NULL) + { ++ /* ++ * No ColorModel in options... ++ */ ++ + if ((choice = ppdFindMarkedChoice(ppd, "ColorModel")) != NULL) + { +- if (!_cups_strcasecmp(choice->choice, "Gray")) +- keyword = "monochrome"; ++ /* ++ * ColorModel is taken from PPD as its default option. ++ */ ++ ++ if (!strcmp(choice->choice, "Gray") || !strcmp(choice->choice, "FastGray") || !strcmp(choice->choice, "DeviceGray")) ++ keyword = "monochrome"; + else +- keyword = "color"; ++ keyword = "color"; + } ++ else ++ /* ++ * print-color-mode is a default option since 2.4.1, use it as a fallback if there is no ++ * ColorModel in options or PPD... ++ */ ++ keyword = cupsGetOption("print-color-mode", num_options, options); ++ } ++ else ++ { ++ /* ++ * ColorModel found in options... ++ */ ++ ++ if (!strcmp(keyword, "Gray") || !strcmp(keyword, "FastGray") || !strcmp(keyword, "DeviceGray")) ++ keyword = "monochrome"; ++ else ++ keyword = "color"; + } + + if (keyword && !strcmp(keyword, "monochrome")) +--- a/scheduler/ipp.c ++++ b/scheduler/ipp.c +@@ -2937,6 +2937,9 @@ + if (!strcmp(option->name, "print-quality") && ippFindAttribute(job->attrs, "cupsPrintQuality", IPP_TAG_NAME)) + continue; /* Don't override cupsPrintQuality */ + ++ if (!strcmp(option->name, "print-color-mode") && ippFindAttribute(job->attrs, "ColorModel", IPP_TAG_NAME)) ++ continue; /* Don't override ColorModel */ ++ + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Adding default %s=%s", option->name, option->value); + + num_options = cupsAddOption(option->name, option->value, num_options, &options); diff -Nru cups-2.3.3op2/debian/patches/series cups-2.4.1op1/debian/patches/series --- cups-2.3.3op2/debian/patches/series 2021-09-10 17:08:59.000000000 +0000 +++ cups-2.4.1op1/debian/patches/series 2023-09-15 11:19:51.000000000 +0000 @@ -1,8 +1,3 @@ -0001-backend-usb-libusb.c-Use-60s-timeout-for-reading-at-.patch -0002-backend-usb-libusb.c-Revert-enforcing-read-limits.patch -0003-Update-testlang-to-test-all-locales-Issue-85.patch -0004-Make-sure-lang-is-initializes.patch -0005-Let-cups.1-point-to-client.conf.5-not-client.conf.7.patch 0006-Apple-AirPrint-support.patch 0007-Keep-foomatic-PPDs-recommended-stanzas-in-NickNames.patch 0008-Debian-Set-LogFileGroup-to-adm.patch @@ -14,5 +9,14 @@ 0014-Debian-Reproducibility-httpAddrGetHostname-test-fail.patch 0015-Debian-Reproducibility-Do-not-run-stp-tests-as-root.patch 0016-Debian-po4a-infrastructure-and-translations-for-manp.patch -9000-cupsd-cupsfilter-snap-support.patch 9100-ppd-cache-add-auto-presets.patch +9110-create-local-printer-localhost-fix.patch +9120-scheduler-ipp-c-resolve-mdns-uri.patch +CVE-2022-26691-1.patch +CVE-2022-26691-2.patch +CVE-2023-32324.patch +CVE-2023-34241.patch +check-colormodel-also-for-cmyk.patch +dont-override-color-settings-from-print-dialog.patch +CVE-2023-32360.patch +CVE-2023-4504.patch diff -Nru cups-2.3.3op2/debian/upstream/signing-key.asc cups-2.4.1op1/debian/upstream/signing-key.asc --- cups-2.3.3op2/debian/upstream/signing-key.asc 2021-09-06 15:47:48.000000000 +0000 +++ cups-2.4.1op1/debian/upstream/signing-key.asc 2022-02-22 03:50:02.000000000 +0000 @@ -1,52 +1,14 @@ -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFplA9UBEACjPmClfkcn4YO05KHTyClVseJYVzGGHl+HLZGFPoadk2UKh3DD -UAoNruBMQS4xFd1MNFZfduCntLIoLEzwwHAWMhEB5O9FZZZrlwN2my4xlWdaX/Bg -FGhVsqGGp5C4n81996f1EmWJS+nTXHPQx0LJ5ahai6wuXJUhJwGHRVsJeVMYg9XZ -eJgz73scH4ISFAIRTfH2PqkBqKL51quUN6E/poSA1iggsPa0tg6klb+kUGvvMjGO -JUGg0L0lSwmJWbfbA6usD0ERSXA5h+TeSKTwuxTVYNTUpnVhSwfv5+wYHsoaeAiN -qbqbHw6TpJS5NvyClQLXE45Y1u/COlUvWA7/ThmRfP8LDgNXHQgdgOVv8eh/3Wos -zLfbw+wWFvaRCDZdzWBmUfJrS6K7dsABr6AQf5khqvazRv/Ma8ovNSd1WUUKTAm2 -O1/eOydFLJpNaiyYc+ETbjdD//hKtiSCf6sxER5uE0cKiWhMQeFGgesgzRYjSKCg -Pk4Elux8q61uWqqPNjngFgRYRDuD/4jvTdD4mQqp+ASUYl1eXliKVH9tYJB4tcQ8 -n7+szE+Czh7iSKvCCTV2VHfYASHYT79efDhtrmbB/Q2Vkoyuxl78PHKM0m/6hZze -+G1Cp4R3Ood/pOKlDrQdAWWlwOErZEu4pMSHoLJeuXfdFW7bAmEyKkoFZQARAQAB -tCtNaWNoYWVsIFIgU3dlZXQgPG1pY2hhZWwuci5zd2VldEBnbWFpbC5jb20+iQJU -BBMBCgA+FiEEhFRkZgtoaqs2VAtvmZVZoCeBWVUFAlplA9UCGwMFCQeGH4AFCwkI -BwMFFQoJCAsFFgIDAQACHgECF4AACgkQmZVZoCeBWVWyeQ//S3hfd0chikcg4m/r -EScY2cFL3WxIAexKcDmFOsKZG85fyJxQYQzaZ5zccXWye6t15Y06W4iglE1WFXGB -b3ZYgUev3iNZYjUHNaEB7GvSdtZ8e0RCbj/p/t2JEzU8c0KtGqbeyFXg3EMkGdad -TRh6y8BatGzAdq2aFbmIW5irfLf4BxUB3NnHs93cfkt7heHIN8S7VNViAK0gXdeL -yukHGG9wE0oRIp2Zln6WSnLFH9bdDFgl6lRa0KEQCgh75MsP+y5V0JMGwOtzV5hE -eH0Lz12xJx0MgHacFOwH1YUiVAPDH0Uk/uVuZRWRAdcU5rBQQN4jg8vJjc+25E2l -HpkoLKYPWWHcCG6yl2mVDjgnnM1hzqkbhftXiI0HrZuidM11sMPj0s1xSer/AOaY -SANNnv5CBxojD6M08KAMKk6HzcLILLdbqEjnWuGI8Yt8rT8YfwQBPZeGzfi/8ZMr -f7vM3wqrx+25kASo3luVw6M6YJmuPTwQrQ2HPI7EHDOuLB/o7B0RpUORVC8pHH/Y -aiRzOJghiLxUgi26d4XwwiXd7m1zatCcl6Or0AdVVhbKthQC33HbBTwW9hYXyeK+ -sssKaFundLPa3me+BqWTy5bSyc3spCWjK8Bsr5BoUV9mTX60UUsTDzI94DOei8+i -05ksTD5du5kk+tq4PWJWgNfUlOa5Ag0EWmUD1QEQANL89kasctOoEuleT0FlqpMh -1JwF1piS3ek1NjFBUBFxIBKoWnftxfaisanSStN5HDqs1mGCRtQ8/HOsSjjDufcM -7JSXe+IX2dKE85FrlNA5QmpFDf7cAkQqM4y/IbEsOI1f79zIKeS7i0l1oXUZ9bRn -dVUcZb52p3tjw1oTfo1QwKWsUq+93ontCsS1aGm5GLmHFJozoBbrk4+XOBNgsmbi -gcRnVopeCE99kdJTJc1YIndLtED3tDhzJJ/kqpQS9iDs6RNDs9FlYF7vlyD1i6yx -94WdE+xHJUdG4mCu0GxqQyCSmbU5A3SHOKSJ4NrNDNn+5e9Oh8WeK3x/Hn0WBVYg -Eyn4EEilHGhhzuFh7US+QX8AM2R21SrfU7rcbUQ+ZFCIhe5p8aT5MsUF8cztBjcu -IDKO9TirI3+OcEFRS0k1vOubXdRdeoxY89Ap9ssVxvGeJJcipmSVrTsxI3oqS/A9 -DNAgIXC0VeZGYfjq6bcFH0+klgJxaY3PuvCspe0XfFQyFMqNvfNFZD5ZAj5DMeOa -wfJMTjw1eHILZLWPYOBXgyIW7RvKrOks+my6+vyFeqNkWKLHxXW7Fu57I0JSlBR+ -Zef+s8hZdAju756e79mk4sMiT/2Pfsty1RBwi5JTF+r8A7p6l+ZqLVa5tr07L+Js -QF8+F2fcwGRuRdZsmYOnABEBAAGJAjwEGAEKACYWIQSEVGRmC2hqqzZUC2+ZlVmg -J4FZVQUCWmUD1QIbDAUJB4YfgAAKCRCZlVmgJ4FZVQiRD/4gf2L4CU+zjviH12FC -DZudGDOw4f6f2Q82Z0J45mtOmVUcoqVo5jzl+H1tR2D0XlV+LG7YpegMS06GvOMl -HG3e+0M5IGwhG/Lv0aq7TA4Hd13ZJaHQvieLXbQzelAE0bbn8QeKSMYrJfGzl0v7 -zZfBQt7L2t06HQKIkfJDAwFRiNs/EbvLHslOq7VDjoEqxFkRsL1Ie3efOb1ZejeS -b5smfaDJ94plO2Goaj1IHrngQhXu4v+PLqSYQgu4lRUmSOg7FAn/JpWHSsDRf1zf -EW/TyM4ctO05vS//mdMI4xR3D0RMvZieUOUUjjFk0xlWcvboroiZrlz7Xb64uvZw -XGA9iJ1j4IlsBmuE7L6Q61i/o7KR4DlLVMoOPYLpMwtVITWf7HDFiww37JaQutoA -eRvO/GLd7X7aDcB6XReGCYSeD1wczDap+fBkKQlNEctHizkIJG2PD0pNz9EUKeTa -xh0csb+548c/DccCSx62siNSi3WnQwvbbDUVNftGHfifa15d350072jb8LP57O20 -GzhdE+0raeg8GqqSeT1MApdInL3BMP+LQxuSpEnEQx9Nsu4bpuSplcTPUot+fNJb -uwg7uetsyqagUI6HSYwbPbmU2ELor+P2LP81Yexwkf/DE215mrIITXnr+dqL5+NG -nNLcOZRqTFo/oxx+IaRhSJ6adg== -=YD80 +mDMEYfKEjRYJKwYBBAHaRw8BAQdAJggn9NALyWqrgrFGPJ9RvPb7wYbskxKRKQcL +v+8Hpbq0QVpkZW5layBEb2huYWwgKFRoZSBvbGQgNEQ0MjI3RDcga2V5IHJldm9r +ZWQpIDx6ZG9obmFsQHJlZGhhdC5jb20+iJQEExYKADwWIQRwgqClCi6SZA84gODk +Ui3MmyRv9wUCYfKEjQIbAwULCQgHAgMiAgEGFQoJCAsCBBYCAwECHgcCF4AACgkQ +5FItzJskb/fbUQEAm6R78JoZSIOpu68gtUUp1qbfDdsfoQkbdyfws/myB6gA/A6/ +9QiIk50DNCmBTisZk5CFP51YNvwnyxafmE3cDn8GuDgEYfKEjRIKKwYBBAGXVQEF +AQEHQF6Qgj5UQqUdvqvnDqygQ6Vm59nRGHbPVDTwendtM5cCAwEIB4h4BBgWCgAg +FiEEcIKgpQoukmQPOIDg5FItzJskb/cFAmHyhI0CGwwACgkQ5FItzJskb/e2CwD/ +SyRi/I5Il5XY5VXEL/eBsnNvvtaO0T10V4/vBMiDb+sBAK3YmRl6WStfRiEvMXQv +OhMT+sEjx6ufQXkuPeXHvrgK +=vSEm -----END PGP PUBLIC KEY BLOCK----- Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/desktop/cups-128.png and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/desktop/cups-128.png differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/desktop/cups-16.png and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/desktop/cups-16.png differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/desktop/cups-256.png and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/desktop/cups-256.png differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/desktop/cups-32.png and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/desktop/cups-32.png differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/desktop/cups-512.png and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/desktop/cups-512.png differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/desktop/cups-64.png and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/desktop/cups-64.png differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/desktop/cups.icns and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/desktop/cups.icns differ diff -Nru cups-2.3.3op2/desktop/cups.svg cups-2.4.1op1/desktop/cups.svg --- cups-2.3.3op2/desktop/cups.svg 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/desktop/cups.svg 2022-01-27 11:11:42.000000000 +0000 @@ -1,533 +1,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - CUPS Icon - - - Michael Sweet - - - - - Apple Inc. - - - - - - - - - - - - - - - - - - - + + + + + + + + New Image + Michael Sweet + Copyright 2020 Michael Sweet + + image/svg+xml + en + + + + + Background + + + + + Logo + + + + + + Printer + + + + + + + + + + + diff -Nru cups-2.3.3op2/doc/Makefile cups-2.4.1op1/doc/Makefile --- cups-2.3.3op2/doc/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ # # Documentation makefile for CUPS. # +# Copyright © 2021-2022 by OpenPrinting. # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products. # @@ -21,14 +22,7 @@ index.html \ robots.txt WEBIMAGES = \ - images/color-wheel.png \ images/cups.png \ - images/cups-icon.png \ - images/generic.png \ - images/left.gif \ - images/right.gif \ - images/sel.gif \ - images/unsel.gif \ images/wait.gif HELPIMAGES = \ images/cups-block-diagram.png \ @@ -45,7 +39,6 @@ help/api-admin.html \ help/api-filter.html \ help/api-ppd.html \ - help/api-raster.html \ help/cgi.html \ help/cupspm.html \ help/encryption.html \ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/apple-touch-icon.opacity and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/apple-touch-icon.opacity differ diff -Nru cups-2.3.3op2/doc/cups-printable.css cups-2.4.1op1/doc/cups-printable.css --- cups-2.3.3op2/doc/cups-printable.css 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/cups-printable.css 2022-01-27 11:11:42.000000000 +0000 @@ -31,9 +31,7 @@ } pre.command, pre.example { - background: #eee; - margin: 0 36pt; - padding: 10px; + padding: 10px 20px; } p.compact { @@ -53,10 +51,6 @@ margin-left: 0; } -pre.man { - margin: 0; -} - pre.command em, pre.example em { font-family: lucida grande, geneva, helvetica, arial, sans-serif; } @@ -358,9 +352,10 @@ } p code, li code, p.code, pre, ul.code li { background: rgba(127,127,127,0.1); - border: thin dotted gray; + border-left: thin dotted gray; font-family: monospace; hyphens: manual; + margin: 18pt 0; -webkit-hyphens: manual; page-break-inside: avoid; } diff -Nru cups-2.3.3op2/doc/cups.css cups-2.4.1op1/doc/cups.css --- cups-2.3.3op2/doc/cups.css 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/cups.css 2022-01-27 11:11:42.000000000 +0000 @@ -141,9 +141,7 @@ } pre.command, pre.example { - background: #eee; - margin: 0 36pt; - padding: 10px; + padding: 10px 20px; } p.example { @@ -283,7 +281,7 @@ } div.table table { - border: solid thin #999999; + border: solid thin rgba(191,191,191,.3); border-collapse: collapse; border-spacing: 0; margin-left: auto; @@ -301,14 +299,14 @@ div.table table td { background: white; - border: solid thin #bbbbbb; + border: solid thin rgba(191,191,191,.45); padding: 5pt 10pt 0; } div.table table th { - background: #f0f0f0; + background: rgba(191,191,191,.15); border: none; - border-bottom: solid thin #999999; + border-bottom: solid thin rgba(191,191,191,.3); } div.figure table { @@ -396,9 +394,9 @@ table.list th { background: white; border-bottom: solid thin #cccccc; + border-right: 2px solid rgba(191,191,191,.45); color: #444444; - padding-top: 10pt; - padding-left: 5pt; + padding: 5px 10px 5px 12px; text-align: left; vertical-align: bottom; white-space: nowrap; @@ -409,17 +407,16 @@ } table.list td { - border-bottom: solid thin #eeeeee; - padding-top: 5pt; - padding-left: 5pt; + border-bottom: solid thin rgba(191,191,191,.45); + padding: 5px 2px 5px 10px; } table.list tr:nth-child(even) { - background: #f8f8f8; + background: rgba(191,191,191,0.15); } table.list tr:nth-child(odd) { - background: #f4f4f4; + background: rgba(191,191,191,0.3); } div.sidebar { @@ -454,8 +451,8 @@ } table.inset { - background: #f0f0f0; - border: thin solid #e0e0e0; + background: rgba(191,191,191,0.15); + border: thin solid rgba(191,191,191,0.3); margin-top: 1em; padding: 0; width: 100%; @@ -594,10 +591,10 @@ } p code, li code, p.code, pre, ul.code li { background: rgba(127,127,127,0.1); - border: thin dotted gray; + border-left: thin dotted gray; font-family: monospace; - font-size: 90%; hyphens: manual; + margin: 18pt 0; -webkit-hyphens: manual; page-break-inside: avoid; } @@ -636,25 +633,6 @@ ul.contents li ul.code, ul.contents li ul.subcontents { padding-left: 2em; } -table.list { - border-collapse: collapse; - width: 100%; -} -table.list tr:nth-child(even) { - background: rgba(127,127,127,0.1); -} -table.list th { - border-right: 2px solid gray; - font-family: monospace; - padding: 5px 10px 5px 2px; - text-align: right; - vertical-align: top; -} -table.list td { - padding: 5px 2px 5px 10px; - text-align: left; - vertical-align: top; -} /* iPhone/iPod touch overrides */ @media only screen and (min-device-width: 320px) and (max-device-width: 480px), @@ -721,3 +699,26 @@ display: none; } } + +/* Dark mode overrides */ +@media (prefers-color-scheme: dark) { + body { + background: black; + color: #ccc; + } + a:link, a:visited, table.list th a { + color: #6666ff; + } + a:link:hover, a:visited:hover, a:active, table.list th a { + color: #ff66ff; + } + hr { + color: #666; + } + div.table table td, table.list th { + background: black; + } + table.list th { + color: #666; + } +} diff -Nru cups-2.3.3op2/doc/da/index.html.in cups-2.4.1op1/doc/da/index.html.in --- cups-2.3.3op2/doc/da/index.html.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/da/index.html.in 2022-01-27 11:11:42.000000000 +0000 @@ -7,12 +7,12 @@ - Hjem - CUPS @CUPS_VERSION@@CUPS_REVISION@ + Hjem - CUPS @CUPS_VERSION@
    -
  • CUPS.org
  • +
  • OpenPrinting CUPS
  • Hjem
  • Administration
  • Klasser
  • @@ -24,14 +24,13 @@

    CUPS @CUPS_VERSION@

    -

    CUPS er det standardbaseret, open source-udskrivningssystem som er udviklet af Apple Inc. til macOS® og andre UNIX®-lignende styresystemer.

    +

    CUPS er det standardbaseret, open source-udskrivningssystem som er udviklet af OpenPrinting til Linux® og andre UNIX®-lignende styresystemer. CUPS uses IPP Everywhere™ to support printing to local and network printers

    CUPS for administratorer

    @@ -45,10 +44,9 @@

    CUPS for udviklere

    CUPS-programmeringsmanual

    Filter- og backendprogrammering

    -

    Udviklerforum

    - + diff -Nru cups-2.3.3op2/doc/de/index.html.in cups-2.4.1op1/doc/de/index.html.in --- cups-2.3.3op2/doc/de/index.html.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/de/index.html.in 2022-01-27 11:11:42.000000000 +0000 @@ -7,13 +7,13 @@ - Home - CUPS @CUPS_VERSION@@CUPS_REVISION@ + Startseite - CUPS @CUPS_VERSION@
    -

    CUPS @CUPS_VERSION@

    -

    CUPS basiert auf Standards, Open Source Drucksystem entwickelt durch Apple Inc. für macOS® und andere UNIX®-artige Betriebssysteme.

    +

    OpenPrinting CUPS @CUPS_VERSION@

    +

    CUPS basiert auf Standards, Open Source Drucksystem entwickelt durch OpenPrinting für Linux® und andere UNIX®-artige Betriebssysteme. CUPS benutzt IPP Everywhere™ zur Unterstützung lokaler und Netzwerkdrucker.

    CUPS für Administratoren

    @@ -45,10 +44,9 @@

    CUPS für Entwickler

    CUPS Programming Manual

    Filter und Backend Programmierung

    -

    Entwicklerforum

    - + diff -Nru cups-2.3.3op2/doc/es/index.html.in cups-2.4.1op1/doc/es/index.html.in --- cups-2.3.3op2/doc/es/index.html.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/es/index.html.in 2022-01-27 11:11:42.000000000 +0000 @@ -7,12 +7,12 @@ - Inicio - CUPS @CUPS_VERSION@@CUPS_REVISION@ + Inicio - CUPS @CUPS_VERSION@
      -
    • CUPS.org
    • +
    • OpenPrinting CUPS
    • Inicio
    • Administración
    • Clases
    • @@ -24,14 +24,13 @@

      CUPS @CUPS_VERSION@

      -

      CUPS es el sistema de impresión de código abierto basado en estándares desarrollado por Apple Inc. para macOS® y otros sistemas operativos tipo UNIX®.

      +

      CUPS es el sistema de impresión de código abierto basado en estándares desarrollado por OpenPrinting para macOS® y otros sistemas operativos tipo UNIX®. CUPS uses IPP Everywhere™ to support printing to local and network printers.

      - + diff -Nru cups-2.3.3op2/doc/fr/index.html.in cups-2.4.1op1/doc/fr/index.html.in --- cups-2.3.3op2/doc/fr/index.html.in 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/doc/fr/index.html.in 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,52 @@ + + + + + + + + + + Home - CUPS @CUPS_VERSION@ + + + +
      +
      +

      OpenPrinting CUPS @CUPS_VERSION@

      +

      Le système d'impression open source basé sur des normes, développé par OpenPrinting for Linux® and other Unix®-like operating systems. CUPS uses IPP Everywhere™ pour prendre en charge l'impression vers des imprimantes locales et de réseau.

      +
      + +
      + + + diff -Nru cups-2.3.3op2/doc/help/api-admin.html cups-2.4.1op1/doc/help/api-admin.html --- cups-2.3.3op2/doc/help/api-admin.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/api-admin.html 2022-01-27 11:11:42.000000000 +0000 @@ -1,386 +1,105 @@ - + - - Administration APIs - - - - - - - - - + + +
      - - Filter and Backend Programming - - - - - - - - - + + +
      - - PPD API (DEPRECATED) - - - - - - - - - + + +
      - - Raster API - - - - - - - - - - - -

      Raster API

      - -
      - - - - - - - - - - - - - - - - -
      Headercups/raster.h
      Library-lcups
      See AlsoProgramming: CUPS Programming Manual
      - Programming: PPD API
      - References: CUPS PPD Specification
      - -
      - - -

      Overview

      - -

      The CUPS raster API provides a standard interface for reading and writing -CUPS raster streams which are used for printing to raster printers. Because the -raster format is updated from time to time, it is important to use this API to -avoid incompatibilities with newer versions of CUPS.

      - -

      Two kinds of CUPS filters use the CUPS raster API - raster image processor -(RIP) filters such as pstoraster and cgpdftoraster -(macOS) that produce CUPS raster files and printer driver filters that -convert CUPS raster files into a format usable by the printer. Printer -driver filters are by far the most common.

      - -

      CUPS raster files (application/vnd.cups-raster) consists of -a stream of raster page descriptions produced by one of the RIP filters such as -pstoraster, imagetoraster, or -cgpdftoraster. CUPS raster files are referred to using the -cups_raster_t type and are -opened using the cupsRasterOpen -function. For example, to read raster data from the standard input, open -file descriptor 0:

      - -
      -#include <cups/raster.h>
      -
      -cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
      -
      - -

      Each page of data begins with a page dictionary structure called -cups_page_header2_t. This -structure contains the colorspace, bits per color, media size, media type, -hardware resolution, and so forth used for the page.

      - -
      Note: - -

      Do not confuse the colorspace in the page header with the PPD - ColorModel keyword. ColorModel refers to the general type of - color used for a device (Gray, RGB, CMYK, DeviceN) and is often used to - select a particular colorspace for the page header along with the associate - color profile. The page header colorspace (cupsColorSpace) describes - both the type and organization of the color data, for example KCMY (black - first) instead of CMYK and RGBA (RGB + alpha) instead of RGB.

      - -
      - -

      You read the page header using the -cupsRasterReadHeader2 -function:

      - -
      -#include <cups/raster.h>
      -
      -cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
      -cups_page_header2_t header;
      -
      -while (cupsRasterReadHeader2(ras, &header))
      -{
      -  /* setup this page */
      -
      -  /* read raster data */
      -
      -  /* finish this page */
      -}
      -
      - -

      After the page dictionary comes the page data which is a full-resolution, -possibly compressed bitmap representing the page in the printer's output -colorspace. You read uncompressed raster data using the -cupsRasterReadPixels -function. A for loop is normally used to read the page one line -at a time:

      - -
      -#include <cups/raster.h>
      -
      -cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
      -cups_page_header2_t header;
      -int page = 0;
      -int y;
      -char *buffer;
      -
      -while (cupsRasterReadHeader2(ras, &header))
      -{
      -  /* setup this page */
      -  page ++;
      -  fprintf(stderr, "PAGE: %d %d\n", page, header.NumCopies);
      -
      -  /* allocate memory for 1 line */
      -  buffer = malloc(header.cupsBytesPerLine);
      -
      -  /* read raster data */
      -  for (y = 0; y < header.cupsHeight; y ++)
      -  {
      -    if (cupsRasterReadPixels(ras, buffer, header.cupsBytesPerLine) == 0)
      -      break;
      -
      -    /* write raster data to printer on stdout */
      -  }
      -
      -  /* finish this page */
      -}
      -
      - -

      When you are done reading the raster data, call the -cupsRasterClose function to free -the memory used to read the raster file:

      - -
      -cups_raster_t *ras;
      -
      -cupsRasterClose(ras);
      -
      - - -

      Functions by Task

      - -

      Opening and Closing Raster Streams

      - - - -

      Reading Raster Streams

      - - - -

      Writing Raster Streams

      - - -

      Functions

      -

      cupsRasterClose

      -

      Close a raster stream.

      -

      -void cupsRasterClose(cups_raster_t *r);

      -

      Parameters

      - - - -
      rStream to close
      -

      Discussion

      -

      The file descriptor associated with the raster stream must be closed -separately as needed.

      -

       CUPS 1.3/macOS 10.5 cupsRasterErrorString

      -

      Return the last error from a raster function.

      -

      -const char *cupsRasterErrorString(void);

      -

      Return Value

      -

      Last error or NULL

      -

      Discussion

      -

      If there are no recent errors, NULL is returned. - -

      -

       CUPS 2.2/macOS 10.12 cupsRasterInitPWGHeader

      -

      Initialize a page header for PWG Raster output.

      -

      -int cupsRasterInitPWGHeader(cups_page_header2_t *h, pwg_media_t *media, const char *type, int xdpi, int ydpi, const char *sides, const char *sheet_back);

      -

      Parameters

      - - - - - - - - - - - - - - - -
      hPage header
      mediaPWG media information
      typePWG raster type string
      xdpiCross-feed direction (horizontal) resolution
      ydpiFeed direction (vertical) resolution
      sidesIPP "sides" option value
      sheet_backTransform for back side or NULL for none
      -

      Return Value

      -

      1 on success, 0 on failure

      -

      Discussion

      -

      The "media" argument specifies the media to use.
      -
      -The "type" argument specifies a "pwg-raster-document-type-supported" value -that controls the color space and bit depth of the raster data.
      -
      -The "xres" and "yres" arguments specify the raster resolution in dots per -inch.
      -
      -The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value -to apply for the back side of a page. Pass NULL for the front side. - -

      -

      cupsRasterOpen

      -

      Open a raster stream using a file descriptor.

      -

      -cups_raster_t *cupsRasterOpen(int fd, cups_mode_t mode);

      -

      Parameters

      - - - - - -
      fdFile descriptor
      modeMode - CUPS_RASTER_READ, -CUPS_RASTER_WRITE, -CUPS_RASTER_WRITE_COMPRESSED, -or CUPS_RASTER_WRITE_PWG
      -

      Return Value

      -

      New stream

      -

      Discussion

      -

      This function associates a raster stream with the given file descriptor. -For most printer driver filters, "fd" will be 0 (stdin). For most raster -image processor (RIP) filters that generate raster data, "fd" will be 1 -(stdout).
      -
      -When writing raster data, the CUPS_RASTER_WRITE, -CUPS_RASTER_WRITE_COMPRESS, or CUPS_RASTER_WRITE_PWG mode can -be used - compressed and PWG output is generally 25-50% smaller but adds a -100-300% execution time overhead.

      -

      cupsRasterOpenIO

      -

      Open a raster stream using a callback function.

      -

      -cups_raster_t *cupsRasterOpenIO(cups_raster_iocb_t iocb, void *ctx, cups_mode_t mode);

      -

      Parameters

      - - - - - - - -
      iocbRead/write callback
      ctxContext pointer for callback
      modeMode - CUPS_RASTER_READ, -CUPS_RASTER_WRITE, -CUPS_RASTER_WRITE_COMPRESSED, -or CUPS_RASTER_WRITE_PWG
      -

      Return Value

      -

      New stream

      -

      Discussion

      -

      This function associates a raster stream with the given callback function and -context pointer.
      -
      -When writing raster data, the CUPS_RASTER_WRITE, -CUPS_RASTER_WRITE_COMPRESS, or CUPS_RASTER_WRITE_PWG mode can -be used - compressed and PWG output is generally 25-50% smaller but adds a -100-300% execution time overhead.

      -

       DEPRECATED cupsRasterReadHeader

      -

      Read a raster page header and store it in a -version 1 page header structure.

      -

      -unsigned cupsRasterReadHeader(cups_raster_t *r, cups_page_header_t *h);

      -

      Parameters

      - - - - - -
      rRaster stream
      hPointer to header data
      -

      Return Value

      -

      1 on success, 0 on failure/end-of-file

      -

      Discussion

      -

      This function is deprecated. Use cupsRasterReadHeader2 instead.
      -
      -Version 1 page headers were used in CUPS 1.0 and 1.1 and contain a subset -of the version 2 page header data. This function handles reading version 2 -page headers and copying only the version 1 data into the provided buffer. - -

      -

       CUPS 1.2/macOS 10.5 cupsRasterReadHeader2

      -

      Read a raster page header and store it in a -version 2 page header structure.

      -

      -unsigned cupsRasterReadHeader2(cups_raster_t *r, cups_page_header2_t *h);

      -

      Parameters

      - - - - - -
      rRaster stream
      hPointer to header data
      -

      Return Value

      -

      1 on success, 0 on failure/end-of-file

      -

      cupsRasterReadPixels

      -

      Read raster pixels.

      -

      -unsigned cupsRasterReadPixels(cups_raster_t *r, unsigned char *p, unsigned len);

      -

      Parameters

      - - - - - - - -
      rRaster stream
      pPointer to pixel buffer
      lenNumber of bytes to read
      -

      Return Value

      -

      Number of bytes read

      -

      Discussion

      -

      For best performance, filters should read one or more whole lines. -The "cupsBytesPerLine" value from the page header can be used to allocate -the line buffer and as the number of bytes to read.

      -

       DEPRECATED cupsRasterWriteHeader

      -

      Write a raster page header from a version 1 page -header structure.

      -

      -unsigned cupsRasterWriteHeader(cups_raster_t *r, cups_page_header_t *h);

      -

      Parameters

      - - - - - -
      rRaster stream
      hRaster page header
      -

      Return Value

      -

      1 on success, 0 on failure

      -

      Discussion

      -

      This function is deprecated. Use cupsRasterWriteHeader2 instead. - -

      -

       CUPS 1.2/macOS 10.5 cupsRasterWriteHeader2

      -

      Write a raster page header from a version 2 -page header structure.

      -

      -unsigned cupsRasterWriteHeader2(cups_raster_t *r, cups_page_header2_t *h);

      -

      Parameters

      - - - - - -
      rRaster stream
      hRaster page header
      -

      Return Value

      -

      1 on success, 0 on failure

      -

      Discussion

      -

      The page header can be initialized using cupsRasterInitPWGHeader. - -

      -

      cupsRasterWritePixels

      -

      Write raster pixels.

      -

      -unsigned cupsRasterWritePixels(cups_raster_t *r, unsigned char *p, unsigned len);

      -

      Parameters

      - - - - - - - -
      rRaster stream
      pBytes to write
      lenNumber of bytes to write
      -

      Return Value

      -

      Number of bytes written

      -

      Discussion

      -

      For best performance, filters should write one or more whole lines. -The "cupsBytesPerLine" value from the page header can be used to allocate -the line buffer and as the number of bytes to write.

      -

      Data Types

      -

      cups_adv_t

      -

      AdvanceMedia attribute values

      -

      -typedef enum cups_adv_e cups_adv_t; -

      -

      cups_bool_t

      -

      Boolean type

      -

      -typedef enum cups_bool_e cups_bool_t; -

      -

      cups_cspace_t

      -

      cupsColorSpace attribute values

      -

      -typedef enum cups_cspace_e cups_cspace_t; -

      -

      cups_cut_t

      -

      CutMedia attribute values

      -

      -typedef enum cups_cut_e cups_cut_t; -

      -

      cups_edge_t

      -

      LeadingEdge attribute values

      -

      -typedef enum cups_edge_e cups_edge_t; -

      -

      cups_jog_t

      -

      Jog attribute values

      -

      -typedef enum cups_jog_e cups_jog_t; -

      -

      cups_mode_t

      -

      cupsRasterOpen modes

      -

      -typedef enum cups_mode_e cups_mode_t; -

      -

      cups_order_t

      -

      cupsColorOrder attribute values

      -

      -typedef enum cups_order_e cups_order_t; -

      -

      cups_orient_t

      -

      Orientation attribute values

      -

      -typedef enum cups_orient_e cups_orient_t; -

      -

       CUPS 1.2/macOS 10.5 cups_page_header2_t

      -

      Version 2 page header

      -

      -typedef struct cups_page_header2_s cups_page_header2_t; -

      -

       DEPRECATED cups_page_header_t

      -

      Version 1 page header

      -

      -typedef struct cups_page_header_s cups_page_header_t; -

      -

      cups_raster_iocb_t

      -

      cupsRasterOpenIO callback function

      -

      -typedef ssize_t (*cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t length); -

      -

      cups_raster_t

      -

      Raster stream data

      -

      -typedef struct _cups_raster_s cups_raster_t; -

      -

      Structures

      -

       CUPS 1.2/macOS 10.5 cups_page_header2_s

      -

      Version 2 page header

      -

      struct cups_page_header2_s {
      -    unsigned AdvanceDistance;
      -    cups_adv_t AdvanceMedia;
      -    cups_bool_t Collate;
      -    cups_cut_t CutMedia;
      -    cups_bool_t Duplex;
      -    unsigned HWResolution[2];
      -    unsigned ImagingBoundingBox[4];
      -    cups_bool_t InsertSheet;
      -    cups_jog_t Jog;
      -    cups_edge_t LeadingEdge;
      -    cups_bool_t ManualFeed;
      -    unsigned Margins[2];
      -    char MediaClass[64];
      -    char MediaColor[64];
      -    unsigned MediaPosition;
      -    char MediaType[64];
      -    unsigned MediaWeight;
      -    cups_bool_t MirrorPrint;
      -    cups_bool_t NegativePrint;
      -    unsigned NumCopies;
      -    cups_orient_t Orientation;
      -    cups_bool_t OutputFaceUp;
      -    char OutputType[64];
      -    unsigned PageSize[2];
      -    cups_bool_t Separations;
      -    cups_bool_t TraySwitch;
      -    cups_bool_t Tumble;
      -    unsigned cupsBitsPerColor;
      -    unsigned cupsBitsPerPixel;
      -    float cupsBorderlessScalingFactor;
      -    unsigned cupsBytesPerLine;
      -    cups_order_t cupsColorOrder;
      -    cups_cspace_t cupsColorSpace;
      -    unsigned cupsCompression;
      -    unsigned cupsHeight;
      -    float cupsImagingBBox[4];
      -    unsigned cupsInteger[16];
      -    char cupsMarkerType[64];
      -    unsigned cupsMediaType;
      -    unsigned cupsNumColors;
      -    char cupsPageSizeName[64];
      -    float cupsPageSize[2];
      -    float cupsReal[16];
      -    char cupsRenderingIntent[64];
      -    unsigned cupsRowCount;
      -    unsigned cupsRowFeed;
      -    unsigned cupsRowStep;
      -    char cupsString[16][64];
      -    unsigned cupsWidth;
      -};

      -

      Members

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      AdvanceDistance AdvanceDistance value in points
      AdvanceMedia AdvanceMedia value (cups_adv_t)
      Collate Collated copies value
      CutMedia CutMedia value (cups_cut_t)
      Duplex Duplexed (double-sided) value
      HWResolution[2] Resolution in dots-per-inch
      ImagingBoundingBox[4] Pixel region that is painted (points, left, bottom, right, top)
      InsertSheet InsertSheet value
      Jog Jog value (cups_jog_t)
      LeadingEdge LeadingEdge value (cups_edge_t)
      ManualFeed ManualFeed value
      Margins[2] Lower-lefthand margins in points
      MediaClass[64] MediaClass string
      MediaColor[64] MediaColor string
      MediaPosition MediaPosition value
      MediaType[64] MediaType string
      MediaWeight MediaWeight value in grams/m^2
      MirrorPrint MirrorPrint value
      NegativePrint NegativePrint value
      NumCopies Number of copies to produce
      Orientation Orientation value (cups_orient_t)
      OutputFaceUp OutputFaceUp value
      OutputType[64] OutputType string
      PageSize[2] Width and length of page in points
      Separations Separations value
      TraySwitch TraySwitch value
      Tumble Tumble value
      cupsBitsPerColor Number of bits for each color
      cupsBitsPerPixel Number of bits for each pixel
      cupsBorderlessScalingFactor  CUPS 1.2/macOS 10.5 Scaling that was applied to page data
      cupsBytesPerLine Number of bytes per line
      cupsColorOrder Order of colors
      cupsColorSpace True colorspace
      cupsCompression Device compression to use
      cupsHeight Height of page image in pixels
      cupsImagingBBox[4]  CUPS 1.2/macOS 10.5 Floating point ImagingBoundingBox -(scaling factor not applied, left, -bottom, right, top)
      cupsInteger[16]  CUPS 1.2/macOS 10.5 User-defined integer values
      cupsMarkerType[64]  CUPS 1.2/macOS 10.5 Ink/toner type
      cupsMediaType Media type code
      cupsNumColors  CUPS 1.2/macOS 10.5 Number of color compoents
      cupsPageSizeName[64]  CUPS 1.2/macOS 10.5 PageSize name
      cupsPageSize[2]  CUPS 1.2/macOS 10.5 Floating point PageSize (scaling * -factor not applied)
      cupsReal[16]  CUPS 1.2/macOS 10.5 User-defined floating-point values
      cupsRenderingIntent[64]  CUPS 1.2/macOS 10.5 Color rendering intent
      cupsRowCount Rows per band
      cupsRowFeed Feed between bands
      cupsRowStep Spacing between lines
      cupsString[16][64]  CUPS 1.2/macOS 10.5 User-defined string values
      cupsWidth Width of page image in pixels
      -

       DEPRECATED cups_page_header_s

      -

      Version 1 page header

      -

      struct cups_page_header_s {
      -    unsigned AdvanceDistance;
      -    cups_adv_t AdvanceMedia;
      -    cups_bool_t Collate;
      -    cups_cut_t CutMedia;
      -    cups_bool_t Duplex;
      -    unsigned HWResolution[2];
      -    unsigned ImagingBoundingBox[4];
      -    cups_bool_t InsertSheet;
      -    cups_jog_t Jog;
      -    cups_edge_t LeadingEdge;
      -    cups_bool_t ManualFeed;
      -    unsigned Margins[2];
      -    char MediaClass[64];
      -    char MediaColor[64];
      -    unsigned MediaPosition;
      -    char MediaType[64];
      -    unsigned MediaWeight;
      -    cups_bool_t MirrorPrint;
      -    cups_bool_t NegativePrint;
      -    unsigned NumCopies;
      -    cups_orient_t Orientation;
      -    cups_bool_t OutputFaceUp;
      -    char OutputType[64];
      -    unsigned PageSize[2];
      -    cups_bool_t Separations;
      -    cups_bool_t TraySwitch;
      -    cups_bool_t Tumble;
      -    unsigned cupsBitsPerColor;
      -    unsigned cupsBitsPerPixel;
      -    unsigned cupsBytesPerLine;
      -    cups_order_t cupsColorOrder;
      -    cups_cspace_t cupsColorSpace;
      -    unsigned cupsCompression;
      -    unsigned cupsHeight;
      -    unsigned cupsMediaType;
      -    unsigned cupsRowCount;
      -    unsigned cupsRowFeed;
      -    unsigned cupsRowStep;
      -    unsigned cupsWidth;
      -};

      -

      Members

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      AdvanceDistance AdvanceDistance value in points
      AdvanceMedia AdvanceMedia value (cups_adv_t)
      Collate Collated copies value
      CutMedia CutMedia value (cups_cut_t)
      Duplex Duplexed (double-sided) value
      HWResolution[2] Resolution in dots-per-inch
      ImagingBoundingBox[4] Pixel region that is painted (points, left, bottom, right, top)
      InsertSheet InsertSheet value
      Jog Jog value (cups_jog_t)
      LeadingEdge LeadingEdge value (cups_edge_t)
      ManualFeed ManualFeed value
      Margins[2] Lower-lefthand margins in points
      MediaClass[64] MediaClass string
      MediaColor[64] MediaColor string
      MediaPosition MediaPosition value
      MediaType[64] MediaType string
      MediaWeight MediaWeight value in grams/m^2
      MirrorPrint MirrorPrint value
      NegativePrint NegativePrint value
      NumCopies Number of copies to produce
      Orientation Orientation value (cups_orient_t)
      OutputFaceUp OutputFaceUp value
      OutputType[64] OutputType string
      PageSize[2] Width and length of page in points
      Separations Separations value
      TraySwitch TraySwitch value
      Tumble Tumble value
      cupsBitsPerColor Number of bits for each color
      cupsBitsPerPixel Number of bits for each pixel
      cupsBytesPerLine Number of bytes per line
      cupsColorOrder Order of colors
      cupsColorSpace True colorspace
      cupsCompression Device compression to use
      cupsHeight Height of page image in pixels
      cupsMediaType Media type code
      cupsRowCount Rows per band
      cupsRowFeed Feed between bands
      cupsRowStep Spacing between lines
      cupsWidth Width of page image in pixels
      -

      Constants

      -

      cups_adv_e

      -

      AdvanceMedia attribute values

      -

      Constants

      - - - - - - -
      CUPS_ADVANCE_FILE Advance the roll after this file
      CUPS_ADVANCE_JOB Advance the roll after this job
      CUPS_ADVANCE_NONE Never advance the roll
      CUPS_ADVANCE_PAGE Advance the roll after this page
      CUPS_ADVANCE_SET Advance the roll after this set
      -

      cups_bool_e

      -

      Boolean type

      -

      Constants

      - - - -
      CUPS_FALSE Logical false
      CUPS_TRUE Logical true
      -

      cups_cspace_e

      -

      cupsColorSpace attribute values

      -

      Constants

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      CUPS_CSPACE_ADOBERGB  CUPS 1.4.5  Red, green, blue (Adobe RGB)
      CUPS_CSPACE_CIELab  CUPS 1.1.19/macOS 10.3  CIE Lab
      CUPS_CSPACE_CIEXYZ  CUPS 1.1.19/macOS 10.3  CIE XYZ
      CUPS_CSPACE_CMY Cyan, magenta, yellow (DeviceCMY)
      CUPS_CSPACE_CMYK Cyan, magenta, yellow, black (DeviceCMYK)
      CUPS_CSPACE_DEVICE1  CUPS 1.4.5  DeviceN, 1 color
      CUPS_CSPACE_DEVICE2  CUPS 1.4.5  DeviceN, 2 colors
      CUPS_CSPACE_DEVICE3  CUPS 1.4.5  DeviceN, 3 colors
      CUPS_CSPACE_DEVICE4  CUPS 1.4.5  DeviceN, 4 colors
      CUPS_CSPACE_DEVICE5  CUPS 1.4.5  DeviceN, 5 colors
      CUPS_CSPACE_DEVICE6  CUPS 1.4.5  DeviceN, 6 colors
      CUPS_CSPACE_DEVICE7  CUPS 1.4.5  DeviceN, 7 colors
      CUPS_CSPACE_DEVICE8  CUPS 1.4.5  DeviceN, 8 colors
      CUPS_CSPACE_DEVICE9  CUPS 1.4.5  DeviceN, 9 colors
      CUPS_CSPACE_DEVICEA  CUPS 1.4.5  DeviceN, 10 colors
      CUPS_CSPACE_DEVICEB  CUPS 1.4.5  DeviceN, 11 colors
      CUPS_CSPACE_DEVICEC  CUPS 1.4.5  DeviceN, 12 colors
      CUPS_CSPACE_DEVICED  CUPS 1.4.5  DeviceN, 13 colors
      CUPS_CSPACE_DEVICEE  CUPS 1.4.5  DeviceN, 14 colors
      CUPS_CSPACE_DEVICEF  CUPS 1.4.5  DeviceN, 15 colors
      CUPS_CSPACE_GMCK  DEPRECATED  Gold, magenta, yellow, black
      CUPS_CSPACE_GMCS  DEPRECATED  Gold, magenta, yellow, silver
      CUPS_CSPACE_GOLD  DEPRECATED  Gold foil
      CUPS_CSPACE_ICC1  CUPS 1.1.19/macOS 10.3  ICC-based, 1 color
      CUPS_CSPACE_ICC2  CUPS 1.1.19/macOS 10.3  ICC-based, 2 colors
      CUPS_CSPACE_ICC3  CUPS 1.1.19/macOS 10.3  ICC-based, 3 colors
      CUPS_CSPACE_ICC4  CUPS 1.1.19/macOS 10.3  ICC-based, 4 colors
      CUPS_CSPACE_ICC5  CUPS 1.1.19/macOS 10.3  ICC-based, 5 colors
      CUPS_CSPACE_ICC6  CUPS 1.1.19/macOS 10.3  ICC-based, 6 colors
      CUPS_CSPACE_ICC7  CUPS 1.1.19/macOS 10.3  ICC-based, 7 colors
      CUPS_CSPACE_ICC8  CUPS 1.1.19/macOS 10.3  ICC-based, 8 colors
      CUPS_CSPACE_ICC9  CUPS 1.1.19/macOS 10.3  ICC-based, 9 colors
      CUPS_CSPACE_ICCA  CUPS 1.1.19/macOS 10.3  ICC-based, 10 colors
      CUPS_CSPACE_ICCB  CUPS 1.1.19/macOS 10.3  ICC-based, 11 colors
      CUPS_CSPACE_ICCC  CUPS 1.1.19/macOS 10.3  ICC-based, 12 colors
      CUPS_CSPACE_ICCD  CUPS 1.1.19/macOS 10.3  ICC-based, 13 colors
      CUPS_CSPACE_ICCE  CUPS 1.1.19/macOS 10.3  ICC-based, 14 colors
      CUPS_CSPACE_ICCF  CUPS 1.1.19/macOS 10.3  ICC-based, 15 colors
      CUPS_CSPACE_K Black (DeviceK)
      CUPS_CSPACE_KCMY  DEPRECATED  Black, cyan, magenta, yellow
      CUPS_CSPACE_KCMYcm  DEPRECATED  Black, cyan, magenta, yellow, light-cyan, light-magenta
      CUPS_CSPACE_RGB Red, green, blue (DeviceRGB, sRGB by default)
      CUPS_CSPACE_RGBA Red, green, blue, alpha (DeviceRGB, sRGB by default)
      CUPS_CSPACE_RGBW  CUPS 1.2/macOS 10.5  Red, green, blue, white (DeviceRGB, sRGB by default)
      CUPS_CSPACE_SILVER  DEPRECATED  Silver foil
      CUPS_CSPACE_SRGB  CUPS 1.4.5  Red, green, blue (sRGB)
      CUPS_CSPACE_SW  CUPS 1.4.5  Luminance (gamma 2.2)
      CUPS_CSPACE_W Luminance (DeviceGray, gamma 2.2 by default)
      CUPS_CSPACE_WHITE  DEPRECATED  White ink (as black)
      CUPS_CSPACE_YMC  DEPRECATED  Yellow, magenta, cyan
      CUPS_CSPACE_YMCK  DEPRECATED  Yellow, magenta, cyan, black
      -

      cups_cut_e

      -

      CutMedia attribute values

      -

      Constants

      - - - - - - -
      CUPS_CUT_FILE Cut the roll after this file
      CUPS_CUT_JOB Cut the roll after this job
      CUPS_CUT_NONE Never cut the roll
      CUPS_CUT_PAGE Cut the roll after this page
      CUPS_CUT_SET Cut the roll after this set
      -

      cups_edge_e

      -

      LeadingEdge attribute values

      -

      Constants

      - - - - - -
      CUPS_EDGE_BOTTOM Leading edge is the bottom of the page
      CUPS_EDGE_LEFT Leading edge is the left of the page
      CUPS_EDGE_RIGHT Leading edge is the right of the page
      CUPS_EDGE_TOP Leading edge is the top of the page
      -

      cups_jog_e

      -

      Jog attribute values

      -

      Constants

      - - - - - -
      CUPS_JOG_FILE Move pages after this file
      CUPS_JOG_JOB Move pages after this job
      CUPS_JOG_NONE Never move pages
      CUPS_JOG_SET Move pages after this set
      -

      cups_mode_e

      -

      cupsRasterOpen modes

      -

      Constants

      - - - - - -
      CUPS_RASTER_READ Open stream for reading
      CUPS_RASTER_WRITE Open stream for writing
      CUPS_RASTER_WRITE_COMPRESSED  CUPS 1.3/macOS 10.5  Open stream for compressed writing
      CUPS_RASTER_WRITE_PWG  CUPS 1.5/macOS 10.7  Open stream for compressed writing in PWG Raster mode
      -

      cups_order_e

      -

      cupsColorOrder attribute values

      -

      Constants

      - - - - -
      CUPS_ORDER_BANDED CCC MMM YYY KKK ...
      CUPS_ORDER_CHUNKED CMYK CMYK CMYK ...
      CUPS_ORDER_PLANAR CCC ... MMM ... YYY ... KKK ...
      -

      cups_orient_e

      -

      Orientation attribute values

      -

      Constants

      - - - - - -
      CUPS_ORIENT_0 Don't rotate the page
      CUPS_ORIENT_180 Turn the page upside down
      CUPS_ORIENT_270 Rotate the page clockwise
      CUPS_ORIENT_90 Rotate the page counter-clockwise
      -
      - - diff -Nru cups-2.3.3op2/doc/help/cgi.html cups-2.4.1op1/doc/help/cgi.html --- cups-2.3.3op2/doc/help/cgi.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/cgi.html 2022-01-27 11:11:42.000000000 +0000 @@ -1,82 +1,41 @@ - + + - - Using CGI Programs - - - - -

      Using CGI Programs

      - -

      CUPS provides a dynamic web interface through dedicated CGI programs that -are executed when users open special directories on the CUPS server. Each CGI -performs administration, class, help, job, and printer functions as directed by -the user, but the actual programs that are run and functions that are available -are limited to those that were originally designed into the scheduler.

      - -

      CUPS also supports CGI programs and specific scripting languages (Java, Perl, -PHP, and Python) for pages you want to provide. The interpreters for these -languages are currently configured at compile time and are associated with -MIME media types. Table 1 shows the MIME media types that -are reserved for each type of page and are the same as those used by the Apache -web server.

      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - -
      Table 1: CGI MIME Media Types
      MIME Media TypeDescription
      application/x-httpd-cgiCGI script/program
      application/x-httpd-javaJava program
      application/x-httpd-perlPerl script
      application/x-httpd-phpPHP script
      application/x-httpd-pythonPython script
      - -

      Configuring the Server

      - -

      In order to enable the corresponding type, you must create a -new /etc/cups/cgi.types file which maps the filename -extensions to the appropriate MIME types, for example:

      + + Using CGI Programs + + + +

      Using CGI Programs

      -
      -application/x-httpd-cgi cgi
      -application/x-httpd-java class
      -application/x-httpd-perl pl
      -application/x-httpd-php php
      -application/x-httpd-python py
      -
      +

      CUPS provides a dynamic web interface through dedicated CGI programs that are executed when users open special directories on the CUPS server. Each CGI performs administration, class, help, job, and printer functions as directed by the user, but the actual programs that are run and functions that are available are limited to those that were originally designed into the scheduler.

      + +

      CUPS also supports CGI scripts/programs for pages you want to provide, although this functionality is disabled by default. The "application/x-httpd-cgi" MIME media type is used to identify CGI content and can be associated with any filename extension. The scheduler requires CGI content to have the execute bit set, not have world or group write permissions, and any CGI scripts need to include a #! line as the first line of a script to identify the script interpreter. For example, a PHP script would look like:

      -

      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.

      +
      +#!/usr/bin/php -fn
      +<?php
      +...
      +?>
      +
      -

      Limitations

      -

      CUPS implements most of the CGI/1.1 specification, with the -following exceptions:

      +

      Configuring the Server

      -
        +

        In order to enable the corresponding type, you must create a new /etc/cups/cgi.types file which maps the filename extensions you use to the appropriate MIME types. For example, the following will support CGI programs/scripts with the "cgi" extension:

        + +
        +application/x-httpd-cgi cgi
        +
        -
      • No PATH_INFO or PATH_TRANSLATED support
      • -
      • 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
      • +

        Limitations

        -
      +

      CUPS implements most of the CGI/1.1 specification, with the following exceptions:

      - - +
        +
      • No PATH_INFO or PATH_TRANSLATED support
      • +
      • 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
      • +
      + + Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/help/cupspm.epub and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/help/cupspm.epub differ diff -Nru cups-2.3.3op2/doc/help/cupspm.html cups-2.4.1op1/doc/help/cupspm.html --- cups-2.3.3op2/doc/help/cupspm.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/cupspm.html 2022-01-27 11:11:42.000000000 +0000 @@ -1,115 +1,105 @@ - + - - CUPS Programming Manual - - - - - - - - - -

      CUPS Programming Manual

      -

      Michael R Sweet

      -

      Copyright © 2007-2019 by Apple Inc. All Rights Reserved.

      -
      -

      Contents

      - -
      -
      -
      -

      Please file issues on Github to provide feedback on this document.

      + + +
      +

      CUPS Programming Manual

      +

      Michael R Sweet

      +

      Copyright © 2021-2022 by OpenPrinting. All Rights Reserved.

      +
      +
      +

      Contents

      + +
      +
      +
      +

      Please file issues on Github to provide feedback on this document.

      -

      Introduction

      -

      CUPS provides the "cups" library to talk to the different parts of CUPS and with Internet Printing Protocol (IPP) printers. The "cups" library functions are accessed by including the <cups/cups.h> header.

      -

      CUPS is based on the Internet Printing Protocol ("IPP"), which allows clients (applications) to communicate with a server (the scheduler, printers, etc.) to get a list of destinations, send print jobs, and so forth. You identify which server you want to communicate with using a pointer to the opaque structure http_t. The CUPS_HTTP_DEFAULT constant can be used when you want to talk to the CUPS scheduler.

      -

      Guidelines

      -

      When writing software (other than printer drivers) that uses the "cups" library:

      -
        -
      • Do not use undocumented or deprecated APIs,
      • -
      • Do not rely on pre-configured printers,
      • -
      • Do not assume that printers support specific features or formats, and
      • -
      • Do not rely on implementation details (PPDs, etc.)
      • +

        Introduction

        +

        CUPS provides the "cups" library to talk to the different parts of CUPS and with Internet Printing Protocol (IPP) printers. The "cups" library functions are accessed by including the <cups/cups.h> header.

        +

        CUPS is based on the Internet Printing Protocol ("IPP"), which allows clients (applications) to communicate with a server (the scheduler, printers, etc.) to get a list of destinations, send print jobs, and so forth. You identify which server you want to communicate with using a pointer to the opaque structure http_t. The CUPS_HTTP_DEFAULT constant can be used when you want to talk to the CUPS scheduler.

        +

        Guidelines

        +

        When writing software (other than printer drivers) that uses the "cups" library:

        +
          +
        • Do not use undocumented or deprecated APIs,

          +
        • +
        • Do not rely on pre-configured printers,

          +
        • +
        • Do not assume that printers support specific features or formats, and

          +
        • +
        • Do not rely on implementation details (PPDs, etc.)

          +
        -

        CUPS is designed to insulate users and developers from the implementation details of printers and file formats. The goal is to allow an application to supply a print file in a standard format with the user intent ("print four copies, two-sided on A4 media, and staple each copy") and have the printing system manage the printer communication and format conversion needed.

        -

        Similarly, printer and job management applications can use standard query operations to obtain the status information in a common, generic form and use standard management operations to control the state of those printers and jobs.

        -
        -

        Note:

        -

        CUPS printer drivers necessarily depend on specific file formats and certain implementation details of the CUPS software. Please consult the Postscript and raster printer driver developer documentation on CUPS.org for more information.

        +

        CUPS is designed to insulate users and developers from the implementation details of printers and file formats. The goal is to allow an application to supply a print file in a standard format with the user intent ("print four copies, two-sided on A4 media, and staple each copy") and have the printing system manage the printer communication and format conversion needed.

        +

        Similarly, printer and job management applications can use standard query operations to obtain the status information in a common, generic form and use standard management operations to control the state of those printers and jobs.

        +
        +

        Note:

        +

        CUPS printer drivers necessarily depend on specific file formats and certain implementation details of the CUPS software. Please consult the Postscript and raster printer driver developer documentation on the OpenPrinting CUPS web site for more information.

        -

        Terms Used in This Document

        -

        A Destination is a printer or print queue that accepts print jobs. A Print Job is a collection of one or more documents that are processed by a destination using options supplied when creating the job. A Document is a file (JPEG image, PDF file, etc.) suitable for printing. An Option controls some aspect of printing, such as the media used. Media is the sheets or roll that is printed on. An Attribute is an option encoded for an Internet Printing Protocol (IPP) request.

        -

        Compiling Programs That Use the CUPS API

        -

        The CUPS libraries can be used from any C, C++, or Objective C program. The method of compiling against the libraries varies depending on the operating system and installation of CUPS. The following sections show how to compile a simple program (shown below) in two common environments.

        -

        The following simple program lists the available destinations:

        -
        #include <stdio.h>
        +

        Terms Used in This Document

        +

        A Destination is a printer or print queue that accepts print jobs. A Print Job is a collection of one or more documents that are processed by a destination using options supplied when creating the job. A Document is a file (JPEG image, PDF file, etc.) suitable for printing. An Option controls some aspect of printing, such as the media used. Media is the sheets or roll that is printed on. An Attribute is an option encoded for an Internet Printing Protocol (IPP) request.

        +

        Compiling Programs That Use the CUPS API

        +

        The CUPS libraries can be used from any C, C++, or Objective C program. The method of compiling against the libraries varies depending on the operating system and installation of CUPS. The following sections show how to compile a simple program (shown below) in two common environments.

        +

        The following simple program lists the available destinations:

        +
        #include <stdio.h>
         #include <cups/cups.h>
         
         int print_dest(void *user_data, unsigned flags, cups_dest_t *dest)
        @@ -558,68 +736,89 @@
           return (0);
         }
         
        -

        Compiling with Xcode

        -

        In Xcode, choose New Project... from the File menu (or press SHIFT+CMD+N), then select the Command Line Tool under the macOS Application project type. Click Next and enter a name for the project, for example "firstcups". Click Next and choose a project directory. The click Next to create the project.

        -

        In the project window, click on the Build Phases group and expand the Link Binary with Libraries section. Click +, type "libcups" to show the library, and then double-click on libcups.tbd.

        -

        Finally, click on the main.c file in the sidebar and copy the example program to the file. Build and run (CMD+R) to see the list of destinations.

        -

        Compiling with GCC

        -

        From the command-line, create a file called simple.c using your favorite editor, copy the example to this file, and save. Then run the following command to compile it with GCC and run it:

        -
        gcc -o simple `cups-config --cflags` simple.c `cups-config --libs`
        +

        Compiling with Xcode

        +

        In Xcode, choose New Project... from the File menu (or press SHIFT+CMD+N), then select the Command Line Tool under the macOS Application project type. Click Next and enter a name for the project, for example "firstcups". Click Next and choose a project directory. The click Next to create the project.

        +

        In the project window, click on the Build Phases group and expand the Link Binary with Libraries section. Click +, type "libcups" to show the library, and then double-click on libcups.tbd.

        +

        Finally, click on the main.c file in the sidebar and copy the example program to the file. Build and run (CMD+R) to see the list of destinations.

        +

        Compiling with GCC

        +

        From the command-line, create a file called simple.c using your favorite editor, copy the example to this file, and save. Then run the following command to compile it with GCC and run it:

        +
        gcc -o simple `cups-config --cflags` simple.c `cups-config --libs`
         ./simple
         
        -

        The cups-config command provides the compiler flags (cups-config --cflags) and libraries (cups-config --libs) needed for the local system.

        -

        Working with Destinations

        -

        Destinations, which in CUPS represent individual printers or classes (collections or pools) of printers, are represented by the cups_dest_t structure which includes the name (name), instance (instance, saved options/settings), whether the destination is the default for the user (is_default), and the options and basic information associated with that destination (num_options and options).

        -

        Historically destinations have been manually maintained by the administrator of a system or network, but CUPS also supports dynamic discovery of destinations on the current network.

        -

        Finding Available Destinations

        -

        The cupsEnumDests function finds all of the available destinations:

        -
         int
        +

        The cups-config command provides the compiler flags (cups-config --cflags) and libraries (cups-config --libs) needed for the local system.

        +

        Working with Destinations

        +

        Destinations, which in CUPS represent individual printers or classes (collections or pools) of printers, are represented by the cups_dest_t structure which includes the name (name), instance (instance, saved options/settings), whether the destination is the default for the user (is_default), and the options and basic information associated with that destination (num_options and options).

        +

        Historically destinations have been manually maintained by the administrator of a system or network, but CUPS also supports dynamic discovery of destinations on the current network.

        +

        Finding Available Destinations

        +

        The cupsEnumDests function finds all of the available destinations:

        +
         int
          cupsEnumDests(unsigned flags, int msec, int *cancel,
                        cups_ptype_t type, cups_ptype_t mask,
                        cups_dest_cb_t cb, void *user_data)
         
        -

        The flags argument specifies enumeration options, which at present must be CUPS_DEST_FLAGS_NONE.

        -

        The msec argument specifies the maximum amount of time that should be used for enumeration in milliseconds - interactive applications should keep this value to 5000 or less when run on the main thread.

        -

        The cancel argument points to an integer variable that, when set to a non-zero value, will cause enumeration to stop as soon as possible. It can be NULL if not needed.

        -

        The type and mask arguments are bitfields that allow the caller to filter the destinations based on categories and/or capabilities. The destination's "printer-type" value is masked by the mask value and compared to the type value when filtering. For example, to only enumerate destinations that are hosted on the local system, pass CUPS_PRINTER_LOCAL for the type argument and CUPS_PRINTER_DISCOVERED for the mask argument. The following constants can be used for filtering:

        -
          -
        • CUPS_PRINTER_CLASS: A collection of destinations.
        • -
        • CUPS_PRINTER_FAX: A facsimile device.
        • -
        • CUPS_PRINTER_LOCAL: A local printer or class. This constant has the value 0 (no bits set) and is only used for the type argument and is paired with the CUPS_PRINTER_REMOTE or CUPS_PRINTER_DISCOVERED constant passed in the mask argument.
        • -
        • CUPS_PRINTER_REMOTE: A remote (shared) printer or class.
        • -
        • CUPS_PRINTER_DISCOVERED: An available network printer or class.
        • -
        • CUPS_PRINTER_BW: Can do B&W printing.
        • -
        • CUPS_PRINTER_COLOR: Can do color printing.
        • -
        • CUPS_PRINTER_DUPLEX: Can do two-sided printing.
        • -
        • CUPS_PRINTER_STAPLE: Can staple output.
        • -
        • CUPS_PRINTER_COLLATE: Can quickly collate copies.
        • -
        • CUPS_PRINTER_PUNCH: Can punch output.
        • -
        • CUPS_PRINTER_COVER: Can cover output.
        • -
        • CUPS_PRINTER_BIND: Can bind output.
        • -
        • CUPS_PRINTER_SORT: Can sort output (mailboxes, etc.)
        • -
        • CUPS_PRINTER_SMALL: Can print on Letter/Legal/A4-size media.
        • -
        • CUPS_PRINTER_MEDIUM: Can print on Tabloid/B/C/A3/A2-size media.
        • -
        • CUPS_PRINTER_LARGE: Can print on D/E/A1/A0-size media.
        • -
        • CUPS_PRINTER_VARIABLE: Can print on rolls and custom-size media.
        • +

          The flags argument specifies enumeration options, which at present must be CUPS_DEST_FLAGS_NONE.

          +

          The msec argument specifies the maximum amount of time that should be used for enumeration in milliseconds - interactive applications should keep this value to 5000 or less when run on the main thread.

          +

          The cancel argument points to an integer variable that, when set to a non-zero value, will cause enumeration to stop as soon as possible. It can be NULL if not needed.

          +

          The type and mask arguments are bitfields that allow the caller to filter the destinations based on categories and/or capabilities. The destination's "printer-type" value is masked by the mask value and compared to the type value when filtering. For example, to only enumerate destinations that are hosted on the local system, pass CUPS_PRINTER_LOCAL for the type argument and CUPS_PRINTER_DISCOVERED for the mask argument. The following constants can be used for filtering:

          +
            +
          • CUPS_PRINTER_CLASS: A collection of destinations.

            +
          • +
          • CUPS_PRINTER_FAX: A facsimile device.

            +
          • +
          • CUPS_PRINTER_LOCAL: A local printer or class. This constant has the value 0 (no bits set) and is only used for the type argument and is paired with the CUPS_PRINTER_REMOTE or CUPS_PRINTER_DISCOVERED constant passed in the mask argument.

            +
          • +
          • CUPS_PRINTER_REMOTE: A remote (shared) printer or class.

            +
          • +
          • CUPS_PRINTER_DISCOVERED: An available network printer or class.

            +
          • +
          • CUPS_PRINTER_BW: Can do B&W printing.

            +
          • +
          • CUPS_PRINTER_COLOR: Can do color printing.

            +
          • +
          • CUPS_PRINTER_DUPLEX: Can do two-sided printing.

            +
          • +
          • CUPS_PRINTER_STAPLE: Can staple output.

            +
          • +
          • CUPS_PRINTER_COLLATE: Can quickly collate copies.

            +
          • +
          • CUPS_PRINTER_PUNCH: Can punch output.

            +
          • +
          • CUPS_PRINTER_COVER: Can cover output.

            +
          • +
          • CUPS_PRINTER_BIND: Can bind output.

            +
          • +
          • CUPS_PRINTER_SORT: Can sort output (mailboxes, etc.)

            +
          • +
          • CUPS_PRINTER_SMALL: Can print on Letter/Legal/A4-size media.

            +
          • +
          • CUPS_PRINTER_MEDIUM: Can print on Tabloid/B/C/A3/A2-size media.

            +
          • +
          • CUPS_PRINTER_LARGE: Can print on D/E/A1/A0-size media.

            +
          • +
          • CUPS_PRINTER_VARIABLE: Can print on rolls and custom-size media.

            +
          -

          The cb argument specifies a function to call for every destination that is found:

          -
          typedef int (*cups_dest_cb_t)(void *user_data,
          +

          The cb argument specifies a function to call for every destination that is found:

          +
          typedef int (*cups_dest_cb_t)(void *user_data,
                                         unsigned flags,
                                         cups_dest_t *dest);
           
          -

          The callback function receives a copy of the user_data argument along with a bitfield (flags) and the destination that was found. The flags argument can have any of the following constant (bit) values set:

          -
            -
          • CUPS_DEST_FLAGS_MORE: There are more destinations coming.
          • -
          • CUPS_DEST_FLAGS_REMOVED: The destination has gone away and should be removed from the list of destinations a user can select.
          • -
          • CUPS_DEST_FLAGS_ERROR: An error occurred. The reason for the error can be found by calling the cupsLastError and/or cupsLastErrorString functions.
          • +

            The callback function receives a copy of the user_data argument along with a bitfield (flags) and the destination that was found. The flags argument can have any of the following constant (bit) values set:

            +
              +
            • CUPS_DEST_FLAGS_MORE: There are more destinations coming.

              +
            • +
            • CUPS_DEST_FLAGS_REMOVED: The destination has gone away and should be removed from the list of destinations a user can select.

              +
            • +
            • CUPS_DEST_FLAGS_ERROR: An error occurred. The reason for the error can be found by calling the cupsLastError and/or cupsLastErrorString functions.

              +
            -

            The callback function returns 0 to stop enumeration or 1 to continue.

            -
            -

            Note:

            -

            The callback function will likely be called multiple times for the same destination, so it is up to the caller to suppress any duplicate destinations.

            +

            The callback function returns 0 to stop enumeration or 1 to continue.

            +
            +

            Note:

            +

            The callback function will likely be called multiple times for the same destination, so it is up to the caller to suppress any duplicate destinations.

            -

            The following example shows how to use cupsEnumDests to get a filtered array of destinations:

            -
            typedef struct
            +

            The following example shows how to use cupsEnumDests to get a filtered array of destinations:

            +
            typedef struct
             {
               int num_dests;
               cups_dest_t *dests;
            @@ -669,7 +868,7 @@
                 * return...
                 */
             
            -    cupsFreeDests(user_data.num_dests, user_dasta.dests);
            +    cupsFreeDests(user_data.num_dests, user_data.dests);
             
                 *dests = NULL;
             
            @@ -685,63 +884,84 @@
               return (user_data.num_dests);
             }
             
            -

            Basic Destination Information

            -

            The num_options and options members of the cups_dest_t structure provide basic attributes about the destination in addition to the user default options and values for that destination. The following names are predefined for various destination attributes:

            -
              -
            • "auth-info-required": The type of authentication required for printing to this destination: "none", "username,password", "domain,username,password", or "negotiate" (Kerberos).
            • -
            • "printer-info": The human-readable description of the destination such as "My Laser Printer".
            • -
            • "printer-is-accepting-jobs": "true" if the destination is accepting new jobs, "false" otherwise.
            • -
            • "printer-is-shared": "true" if the destination is being shared with other computers, "false" otherwise.
            • -
            • "printer-location": The human-readable location of the destination such as "Lab 4".
            • -
            • "printer-make-and-model": The human-readable make and model of the destination such as "ExampleCorp LaserPrinter 4000 Series".
            • -
            • "printer-state": "3" if the destination is idle, "4" if the destination is printing a job, and "5" if the destination is stopped.
            • -
            • "printer-state-change-time": The UNIX time when the destination entered the current state.
            • -
            • "printer-state-reasons": Additional comma-delimited state keywords for the destination such as "media-tray-empty-error" and "toner-low-warning".
            • -
            • "printer-type": The cups_ptype_t value associated with the destination.
            • -
            • "printer-uri-supported": The URI associated with the destination; if not set, this destination was discovered but is not yet setup as a local printer.
            • +

              Basic Destination Information

              +

              The num_options and options members of the cups_dest_t structure provide basic attributes about the destination in addition to the user default options and values for that destination. The following names are predefined for various destination attributes:

              +
                +
              • "auth-info-required": The type of authentication required for printing to this destination: "none", "username,password", "domain,username,password", or "negotiate" (Kerberos).

                +
              • +
              • "printer-info": The human-readable description of the destination such as "My Laser Printer".

                +
              • +
              • "printer-is-accepting-jobs": "true" if the destination is accepting new jobs, "false" otherwise.

                +
              • +
              • "printer-is-shared": "true" if the destination is being shared with other computers, "false" otherwise.

                +
              • +
              • "printer-location": The human-readable location of the destination such as "Lab 4".

                +
              • +
              • "printer-make-and-model": The human-readable make and model of the destination such as "ExampleCorp LaserPrinter 4000 Series".

                +
              • +
              • "printer-state": "3" if the destination is idle, "4" if the destination is printing a job, and "5" if the destination is stopped.

                +
              • +
              • "printer-state-change-time": The UNIX time when the destination entered the current state.

                +
              • +
              • "printer-state-reasons": Additional comma-delimited state keywords for the destination such as "media-tray-empty-error" and "toner-low-warning".

                +
              • +
              • "printer-type": The cups_ptype_t value associated with the destination.

                +
              • +
              • "printer-uri-supported": The URI associated with the destination; if not set, this destination was discovered but is not yet setup as a local printer.

                +
              -

              Use the cupsGetOption function to retrieve the value. For example, the following code gets the make and model of a destination:

              -
              const char *model = cupsGetOption("printer-make-and-model",
              +

              Use the cupsGetOption function to retrieve the value. For example, the following code gets the make and model of a destination:

              +
              const char *model = cupsGetOption("printer-make-and-model",
                                                 dest->num_options,
                                                 dest->options);
               
              -

              Detailed Destination Information

              -

              Once a destination has been chosen, the cupsCopyDestInfo function can be used to gather detailed information about the destination:

              -
              cups_dinfo_t *
              +

              Detailed Destination Information

              +

              Once a destination has been chosen, the cupsCopyDestInfo function can be used to gather detailed information about the destination:

              +
              cups_dinfo_t *
               cupsCopyDestInfo(http_t *http, cups_dest_t *dest);
               
              -

              The http argument specifies a connection to the CUPS scheduler and is typically the constant CUPS_HTTP_DEFAULT. The dest argument specifies the destination to query.

              -

              The cups_dinfo_t structure that is returned contains a snapshot of the supported options and their supported, ready, and default values. It also can report constraints between different options and values, and recommend changes to resolve those constraints.

              -

              Getting Supported Options and Values

              -

              The cupsCheckDestSupported function can be used to test whether a particular option or option and value is supported:

              -
              int
              +

              The http argument specifies a connection to the CUPS scheduler and is typically the constant CUPS_HTTP_DEFAULT. The dest argument specifies the destination to query.

              +

              The cups_dinfo_t structure that is returned contains a snapshot of the supported options and their supported, ready, and default values. It also can report constraints between different options and values, and recommend changes to resolve those constraints.

              +

              Getting Supported Options and Values

              +

              The cupsCheckDestSupported function can be used to test whether a particular option or option and value is supported:

              +
              int
               cupsCheckDestSupported(http_t *http, cups_dest_t *dest,
                                      cups_dinfo_t *info,
                                      const char *option,
                                      const char *value);
               
              -

              The option argument specifies the name of the option to check. The following constants can be used to check the various standard options:

              -
                -
              • CUPS_COPIES: Controls the number of copies that are produced.
              • -
              • CUPS_FINISHINGS: A comma-delimited list of integer constants that control the finishing processes that are applied to the job, including stapling, punching, and folding.
              • -
              • CUPS_MEDIA: Controls the media size that is used, typically one of the following: CUPS_MEDIA_3X5, CUPS_MEDIA_4X6, CUPS_MEDIA_5X7, CUPS_MEDIA_8X10, CUPS_MEDIA_A3, CUPS_MEDIA_A4, CUPS_MEDIA_A5, CUPS_MEDIA_A6, CUPS_MEDIA_ENV10, CUPS_MEDIA_ENVDL, CUPS_MEDIA_LEGAL, CUPS_MEDIA_LETTER, CUPS_MEDIA_PHOTO_L, CUPS_MEDIA_SUPERBA3, or CUPS_MEDIA_TABLOID.
              • -
              • CUPS_MEDIA_SOURCE: Controls where the media is pulled from, typically either CUPS_MEDIA_SOURCE_AUTO or CUPS_MEDIA_SOURCE_MANUAL.
              • -
              • CUPS_MEDIA_TYPE: Controls the type of media that is used, typically one of the following: CUPS_MEDIA_TYPE_AUTO, CUPS_MEDIA_TYPE_ENVELOPE, CUPS_MEDIA_TYPE_LABELS, CUPS_MEDIA_TYPE_LETTERHEAD, CUPS_MEDIA_TYPE_PHOTO, CUPS_MEDIA_TYPE_PHOTO_GLOSSY, CUPS_MEDIA_TYPE_PHOTO_MATTE, CUPS_MEDIA_TYPE_PLAIN, or CUPS_MEDIA_TYPE_TRANSPARENCY.
              • -
              • CUPS_NUMBER_UP: Controls the number of document pages that are placed on each media side.
              • -
              • CUPS_ORIENTATION: Controls the orientation of document pages placed on the media: CUPS_ORIENTATION_PORTRAIT or CUPS_ORIENTATION_LANDSCAPE.
              • -
              • CUPS_PRINT_COLOR_MODE: Controls whether the output is in color (CUPS_PRINT_COLOR_MODE_COLOR), grayscale (CUPS_PRINT_COLOR_MODE_MONOCHROME), or either (CUPS_PRINT_COLOR_MODE_AUTO).
              • -
              • CUPS_PRINT_QUALITY: Controls the generate quality of the output: CUPS_PRINT_QUALITY_DRAFT, CUPS_PRINT_QUALITY_NORMAL, or CUPS_PRINT_QUALITY_HIGH.
              • -
              • CUPS_SIDES: Controls whether prints are placed on one or both sides of the media: CUPS_SIDES_ONE_SIDED, CUPS_SIDES_TWO_SIDED_PORTRAIT, or CUPS_SIDES_TWO_SIDED_LANDSCAPE.
              • +

                The option argument specifies the name of the option to check. The following constants can be used to check the various standard options:

                +
                  +
                • CUPS_COPIES: Controls the number of copies that are produced.

                  +
                • +
                • CUPS_FINISHINGS: A comma-delimited list of integer constants that control the finishing processes that are applied to the job, including stapling, punching, and folding.

                  +
                • +
                • CUPS_MEDIA: Controls the media size that is used, typically one of the following: CUPS_MEDIA_3X5, CUPS_MEDIA_4X6, CUPS_MEDIA_5X7, CUPS_MEDIA_8X10, CUPS_MEDIA_A3, CUPS_MEDIA_A4, CUPS_MEDIA_A5, CUPS_MEDIA_A6, CUPS_MEDIA_ENV10, CUPS_MEDIA_ENVDL, CUPS_MEDIA_LEGAL, CUPS_MEDIA_LETTER, CUPS_MEDIA_PHOTO_L, CUPS_MEDIA_SUPERBA3, or CUPS_MEDIA_TABLOID.

                  +
                • +
                • CUPS_MEDIA_SOURCE: Controls where the media is pulled from, typically either CUPS_MEDIA_SOURCE_AUTO or CUPS_MEDIA_SOURCE_MANUAL.

                  +
                • +
                • CUPS_MEDIA_TYPE: Controls the type of media that is used, typically one of the following: CUPS_MEDIA_TYPE_AUTO, CUPS_MEDIA_TYPE_ENVELOPE, CUPS_MEDIA_TYPE_LABELS, CUPS_MEDIA_TYPE_LETTERHEAD, CUPS_MEDIA_TYPE_PHOTO, CUPS_MEDIA_TYPE_PHOTO_GLOSSY, CUPS_MEDIA_TYPE_PHOTO_MATTE, CUPS_MEDIA_TYPE_PLAIN, or CUPS_MEDIA_TYPE_TRANSPARENCY.

                  +
                • +
                • CUPS_NUMBER_UP: Controls the number of document pages that are placed on each media side.

                  +
                • +
                • CUPS_ORIENTATION: Controls the orientation of document pages placed on the media: CUPS_ORIENTATION_PORTRAIT or CUPS_ORIENTATION_LANDSCAPE.

                  +
                • +
                • CUPS_PRINT_COLOR_MODE: Controls whether the output is in color (CUPS_PRINT_COLOR_MODE_COLOR), grayscale (CUPS_PRINT_COLOR_MODE_MONOCHROME), or either (CUPS_PRINT_COLOR_MODE_AUTO).

                  +
                • +
                • CUPS_PRINT_QUALITY: Controls the generate quality of the output: CUPS_PRINT_QUALITY_DRAFT, CUPS_PRINT_QUALITY_NORMAL, or CUPS_PRINT_QUALITY_HIGH.

                  +
                • +
                • CUPS_SIDES: Controls whether prints are placed on one or both sides of the media: CUPS_SIDES_ONE_SIDED, CUPS_SIDES_TWO_SIDED_PORTRAIT, or CUPS_SIDES_TWO_SIDED_LANDSCAPE.

                  +
                -

                If the value argument is NULL, the cupsCheckDestSupported function returns whether the option is supported by the destination. Otherwise, the function returns whether the specified value of the option is supported.

                -

                The cupsFindDestSupported function returns the IPP attribute containing the supported values for a given option:

                -
                 ipp_attribute_t *
                +

                If the value argument is NULL, the cupsCheckDestSupported function returns whether the option is supported by the destination. Otherwise, the function returns whether the specified value of the option is supported.

                +

                The cupsFindDestSupported function returns the IPP attribute containing the supported values for a given option:

                +
                 ipp_attribute_t *
                  cupsFindDestSupported(http_t *http, cups_dest_t *dest,
                                        cups_dinfo_t *dinfo,
                                        const char *option);
                 
                -

                For example, the following code prints the supported finishing processes for a destination, if any, to the standard output:

                -
                cups_dinfo_t *info = cupsCopyDestInfo(CUPS_HTTP_DEFAULT,
                +

                For example, the following code prints the supported finishing processes for a destination, if any, to the standard output:

                +
                cups_dinfo_t *info = cupsCopyDestInfo(CUPS_HTTP_DEFAULT,
                                                       dest);
                 
                 if (cupsCheckDestSupported(CUPS_HTTP_DEFAULT, dest, info,
                @@ -759,8 +979,8 @@
                 else
                   puts("finishings not supported.");
                 
                -

                The "job-creation-attributes" option can be queried to get a list of supported options. For example, the following code prints the list of supported options to the standard output:

                -
                ipp_attribute_t *attrs =
                +

                The "job-creation-attributes" option can be queried to get a list of supported options. For example, the following code prints the list of supported options to the standard output:

                +
                ipp_attribute_t *attrs =
                     cupsFindDestSupported(CUPS_HTTP_DEFAULT, dest, info,
                                           "job-creation-attributes");
                 int i, count = ippGetCount(attrs);
                @@ -768,15 +988,15 @@
                 for (i = 0; i < count; i ++)
                   puts(ippGetString(attrs, i, NULL));
                 
                -

                Getting Default Values

                -

                There are two sets of default values - user defaults that are available via the num_options and options members of the cups_dest_t structure, and destination defaults that available via the cups_dinfo_t structure and the cupsFindDestDefault function which returns the IPP attribute containing the default value(s) for a given option:

                -
                ipp_attribute_t *
                +

                Getting Default Values

                +

                There are two sets of default values - user defaults that are available via the num_options and options members of the cups_dest_t structure, and destination defaults that available via the cups_dinfo_t structure and the cupsFindDestDefault function which returns the IPP attribute containing the default value(s) for a given option:

                +
                ipp_attribute_t *
                 cupsFindDestDefault(http_t *http, cups_dest_t *dest,
                                     cups_dinfo_t *dinfo,
                                     const char *option);
                 
                -

                The user defaults from cupsGetOption should always take preference over the destination defaults. For example, the following code prints the default finishings value(s) to the standard output:

                -
                const char *def_value =
                +

                The user defaults from cupsGetOption should always take preference over the destination defaults. For example, the following code prints the default finishings value(s) to the standard output:

                +
                const char *def_value =
                     cupsGetOption(CUPS_FINISHINGS, dest->num_options,
                                   dest->options);
                 ipp_attribute_t *def_attr =
                @@ -798,15 +1018,15 @@
                   putchar('\n');
                 }
                 
                -

                Getting Ready (Loaded) Values

                -

                The finishings and media options also support queries for the ready, or loaded, values. For example, a printer may have punch and staple finishers installed but be out of staples - the supported values will list both punch and staple finishing processes but the ready values will only list the punch processes. Similarly, a printer may support hundreds of different sizes of media but only have a single size loaded at any given time - the ready values are limited to the media that is actually in the printer.

                -

                The cupsFindDestReady function finds the IPP attribute containing the ready values for a given option:

                -
                ipp_attribute_t *
                +

                Getting Ready (Loaded) Values

                +

                The finishings and media options also support queries for the ready, or loaded, values. For example, a printer may have punch and staple finishers installed but be out of staples - the supported values will list both punch and staple finishing processes but the ready values will only list the punch processes. Similarly, a printer may support hundreds of different sizes of media but only have a single size loaded at any given time - the ready values are limited to the media that is actually in the printer.

                +

                The cupsFindDestReady function finds the IPP attribute containing the ready values for a given option:

                +
                ipp_attribute_t *
                 cupsFindDestReady(http_t *http, cups_dest_t *dest,
                                   cups_dinfo_t *dinfo, const char *option);
                 
                -

                For example, the following code lists the ready finishing processes:

                -
                ipp_attribute_t *ready_finishings =
                +

                For example, the following code lists the ready finishing processes:

                +
                ipp_attribute_t *ready_finishings =
                     cupsFindDestReady(CUPS_HTTP_DEFAULT, dest, info,
                                       CUPS_FINISHINGS);
                 
                @@ -821,18 +1041,18 @@
                 else
                   puts("no finishings are ready.");
                 
                -

                Media Size Options

                -

                CUPS provides functions for querying the dimensions and margins for each of the supported media size options. The cups_size_t structure is used to describe a media size:

                -
                typedef struct cups_size_s
                +

                Media Size Options

                +

                CUPS provides functions for querying the dimensions and margins for each of the supported media size options. The cups_size_t structure is used to describe a media size:

                +
                typedef struct cups_size_s
                 {
                   char media[128];
                   int width, length;
                   int bottom, left, right, top;
                 } cups_size_t;
                 
                -

                The width and length members specify the dimensions of the media in hundredths of millimeters (1/2540th of an inch). The bottom, left, right, and top members specify the margins of the printable area, also in hundredths of millimeters.

                -

                The cupsGetDestMediaByName and cupsGetDestMediaBySize functions lookup the media size information using a standard media size name or dimensions in hundredths of millimeters:

                -
                int
                +

                The width and length members specify the dimensions of the media in hundredths of millimeters (1/2540th of an inch). The bottom, left, right, and top members specify the margins of the printable area, also in hundredths of millimeters.

                +

                The cupsGetDestMediaByName and cupsGetDestMediaBySize functions lookup the media size information using a standard media size name or dimensions in hundredths of millimeters:

                +
                int
                 cupsGetDestMediaByName(http_t *http, cups_dest_t *dest,
                                        cups_dinfo_t *dinfo,
                                        const char *media,
                @@ -844,17 +1064,22 @@
                                        int width, int length,
                                        unsigned flags, cups_size_t *size);
                 
                -

                The media, width, and length arguments specify the size to lookup. The flags argument specifies a bitfield controlling various lookup options:

                -
                  -
                • CUPS_MEDIA_FLAGS_DEFAULT: Find the closest size supported by the printer.
                • -
                • CUPS_MEDIA_FLAGS_BORDERLESS: Find a borderless size.
                • -
                • CUPS_MEDIA_FLAGS_DUPLEX: Find a size compatible with two-sided printing.
                • -
                • CUPS_MEDIA_FLAGS_EXACT: Find an exact match for the size.
                • -
                • CUPS_MEDIA_FLAGS_READY: If the printer supports media sensing or configuration of the media in each tray/source, find the size amongst the "ready" media.
                • +

                  The media, width, and length arguments specify the size to lookup. The flags argument specifies a bitfield controlling various lookup options:

                  +
                    +
                  • CUPS_MEDIA_FLAGS_DEFAULT: Find the closest size supported by the printer.

                    +
                  • +
                  • CUPS_MEDIA_FLAGS_BORDERLESS: Find a borderless size.

                    +
                  • +
                  • CUPS_MEDIA_FLAGS_DUPLEX: Find a size compatible with two-sided printing.

                    +
                  • +
                  • CUPS_MEDIA_FLAGS_EXACT: Find an exact match for the size.

                    +
                  • +
                  • CUPS_MEDIA_FLAGS_READY: If the printer supports media sensing or configuration of the media in each tray/source, find the size amongst the "ready" media.

                    +
                  -

                  If a matching size is found for the destination, the size information is stored in the structure pointed to by the size argument and 1 is returned. Otherwise 0 is returned.

                  -

                  For example, the following code prints the margins for two-sided printing on US Letter media:

                  -
                  cups_size_t size;
                  +

                  If a matching size is found for the destination, the size information is stored in the structure pointed to by the size argument and 1 is returned. Otherwise 0 is returned.

                  +

                  For example, the following code prints the margins for two-sided printing on US Letter media:

                  +
                  cups_size_t size;
                   
                   if (cupsGetDestMediaByName(CUPS_HTTP_DEFAULT, dest, info,
                                              CUPS_MEDIA_LETTER,
                  @@ -869,8 +1094,8 @@
                   else
                     puts("Margins for duplex US Letter are not available.");
                   
                  -

                  You can also enumerate all of the sizes that match a given flags value using the cupsGetDestMediaByIndex and cupsGetDestMediaCount functions:

                  -
                  int
                  +

                  You can also enumerate all of the sizes that match a given flags value using the cupsGetDestMediaByIndex and cupsGetDestMediaCount functions:

                  +
                  int
                   cupsGetDestMediaByIndex(http_t *http, cups_dest_t *dest,
                                           cups_dinfo_t *dinfo, int n,
                                           unsigned flags, cups_size_t *size);
                  @@ -879,8 +1104,8 @@
                   cupsGetDestMediaCount(http_t *http, cups_dest_t *dest,
                                         cups_dinfo_t *dinfo, unsigned flags);
                   
                  -

                  For example, the following code prints the list of ready media and corresponding margins:

                  -
                  cups_size_t size;
                  +

                  For example, the following code prints the list of ready media and corresponding margins:

                  +
                  cups_size_t size;
                   int i;
                   int count = cupsGetDestMediaCount(CUPS_HTTP_DEFAULT,
                                                     dest, info,
                  @@ -902,15 +1127,15 @@
                     }
                   }
                   
                  -

                  Finally, the cupsGetDestMediaDefault function returns the default media size:

                  -
                  int
                  +

                  Finally, the cupsGetDestMediaDefault function returns the default media size:

                  +
                  int
                   cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest,
                                           cups_dinfo_t *dinfo, unsigned flags,
                                           cups_size_t *size);
                   
                  -

                  Localizing Options and Values

                  -

                  CUPS provides three functions to get localized, human-readable strings in the user's current locale for options and values: cupsLocalizeDestMedia, cupsLocalizeDestOption, and cupsLocalizeDestValue:

                  -
                  const char *
                  +

                  Localizing Options and Values

                  +

                  CUPS provides three functions to get localized, human-readable strings in the user's current locale for options and values: cupsLocalizeDestMedia, cupsLocalizeDestOption, and cupsLocalizeDestValue:

                  +
                  const char *
                   cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest,
                                         cups_dinfo_t *info, unsigned flags,
                                         cups_size_t *size);
                  @@ -925,18 +1150,18 @@
                                         cups_dinfo_t *info,
                                         const char *option, const char *value);
                   
                  -

                  Submitting a Print Job

                  -

                  Once you are ready to submit a print job, you create a job using the cupsCreateDestJob function:

                  -
                  ipp_status_t
                  +

                  Submitting a Print Job

                  +

                  Once you are ready to submit a print job, you create a job using the cupsCreateDestJob function:

                  +
                  ipp_status_t
                   cupsCreateDestJob(http_t *http, cups_dest_t *dest,
                                     cups_dinfo_t *info, int *job_id,
                                     const char *title, int num_options,
                                     cups_option_t *options);
                   
                  -

                  The title argument specifies a name for the print job such as "My Document". The num_options and options arguments specify the options for the print job which are allocated using the cupsAddOption function.

                  -

                  When successful, the job's numeric identifier is stored in the integer pointed to by the job_id argument and IPP_STATUS_OK is returned. Otherwise, an IPP error status is returned.

                  -

                  For example, the following code creates a new job that will print 42 copies of a two-sided US Letter document:

                  -
                  int job_id = 0;
                  +

                  The title argument specifies a name for the print job such as "My Document". The num_options and options arguments specify the options for the print job which are allocated using the cupsAddOption function.

                  +

                  When successful, the job's numeric identifier is stored in the integer pointed to by the job_id argument and IPP_STATUS_OK is returned. Otherwise, an IPP error status is returned.

                  +

                  For example, the following code creates a new job that will print 42 copies of a two-sided US Letter document:

                  +
                  int job_id = 0;
                   int num_options = 0;
                   cups_option_t *options = NULL;
                   
                  @@ -956,8 +1181,8 @@
                     printf("Unable to create job: %s\n",
                            cupsLastErrorString());
                   
                  -

                  Once the job is created, you submit documents for the job using the cupsStartDestDocument, cupsWriteRequestData, and cupsFinishDestDocument functions:

                  -
                  http_status_t
                  +

                  Once the job is created, you submit documents for the job using the cupsStartDestDocument, cupsWriteRequestData, and cupsFinishDestDocument functions:

                  +
                  http_status_t
                   cupsStartDestDocument(http_t *http, cups_dest_t *dest,
                                         cups_dinfo_t *info, int job_id,
                                         const char *docname,
                  @@ -974,16 +1199,20 @@
                   cupsFinishDestDocument(http_t *http, cups_dest_t *dest,
                                          cups_dinfo_t *info);
                   
                  -

                  The docname argument specifies the name of the document, typically the original filename. The format argument specifies the MIME media type of the document, including the following constants:

                  -
                    -
                  • CUPS_FORMAT_JPEG: "image/jpeg"
                  • -
                  • CUPS_FORMAT_PDF: "application/pdf"
                  • -
                  • CUPS_FORMAT_POSTSCRIPT: "application/postscript"
                  • -
                  • CUPS_FORMAT_TEXT: "text/plain"
                  • +

                    The docname argument specifies the name of the document, typically the original filename. The format argument specifies the MIME media type of the document, including the following constants:

                    +
                      +
                    • CUPS_FORMAT_JPEG: "image/jpeg"

                      +
                    • +
                    • CUPS_FORMAT_PDF: "application/pdf"

                      +
                    • +
                    • CUPS_FORMAT_POSTSCRIPT: "application/postscript"

                      +
                    • +
                    • CUPS_FORMAT_TEXT: "text/plain"

                      +
                    -

                    The num_options and options arguments specify per-document print options, which at present must be 0 and NULL. The last_document argument specifies whether this is the last document in the job.

                    -

                    For example, the following code submits a PDF file to the job that was just created:

                    -
                    FILE *fp = fopen("filename.pdf", "rb");
                    +

                    The num_options and options arguments specify per-document print options, which at present must be 0 and NULL. The last_document argument specifies whether this is the last document in the job.

                    +

                    For example, the following code submits a PDF file to the job that was just created:

                    +
                    FILE *fp = fopen("filename.pdf", "rb");
                     size_t bytes;
                     char buffer[65536];
                     
                    @@ -1006,54 +1235,54 @@
                     
                     fclose(fp);
                     
                    -

                    Sending IPP Requests

                    -

                    CUPS provides a rich API for sending IPP requests to the scheduler or printers, typically from management or utility applications whose primary purpose is not to send print jobs.

                    -

                    Connecting to the Scheduler or Printer

                    -

                    The connection to the scheduler or printer is represented by the HTTP connection type http_t. The cupsConnectDest function connects to the scheduler or printer associated with the destination:

                    -
                    http_t *
                    +

                    Sending IPP Requests

                    +

                    CUPS provides a rich API for sending IPP requests to the scheduler or printers, typically from management or utility applications whose primary purpose is not to send print jobs.

                    +

                    Connecting to the Scheduler or Printer

                    +

                    The connection to the scheduler or printer is represented by the HTTP connection type http_t. The cupsConnectDest function connects to the scheduler or printer associated with the destination:

                    +
                    http_t *
                     cupsConnectDest(cups_dest_t *dest, unsigned flags, int msec,
                                     int *cancel, char *resource,
                                     size_t resourcesize, cups_dest_cb_t cb,
                                     void *user_data);
                     
                    -

                    The dest argument specifies the destination to connect to.

                    -

                    The flags argument specifies whether you want to connect to the scheduler (CUPS_DEST_FLAGS_NONE) or device/printer (CUPS_DEST_FLAGS_DEVICE) associated with the destination.

                    -

                    The msec argument specifies how long you are willing to wait for the connection to be established in milliseconds. Specify a value of -1 to wait indefinitely.

                    -

                    The cancel argument specifies the address of an integer variable that can be set to a non-zero value to cancel the connection. Specify a value of NULL to not provide a cancel variable.

                    -

                    The resource and resourcesize arguments specify the address and size of a character string array to hold the path to use when sending an IPP request.

                    -

                    The cb and user_data arguments specify a destination callback function that returns 1 to continue connecting or 0 to stop. The destination callback work the same way as the one used for the cupsEnumDests function.

                    -

                    On success, a HTTP connection is returned that can be used to send IPP requests and get IPP responses.

                    -

                    For example, the following code connects to the printer associated with a destination with a 30 second timeout:

                    -
                    char resource[256];
                    +

                    The dest argument specifies the destination to connect to.

                    +

                    The flags argument specifies whether you want to connect to the scheduler (CUPS_DEST_FLAGS_NONE) or device/printer (CUPS_DEST_FLAGS_DEVICE) associated with the destination.

                    +

                    The msec argument specifies how long you are willing to wait for the connection to be established in milliseconds. Specify a value of -1 to wait indefinitely.

                    +

                    The cancel argument specifies the address of an integer variable that can be set to a non-zero value to cancel the connection. Specify a value of NULL to not provide a cancel variable.

                    +

                    The resource and resourcesize arguments specify the address and size of a character string array to hold the path to use when sending an IPP request.

                    +

                    The cb and user_data arguments specify a destination callback function that returns 1 to continue connecting or 0 to stop. The destination callback work the same way as the one used for the cupsEnumDests function.

                    +

                    On success, a HTTP connection is returned that can be used to send IPP requests and get IPP responses.

                    +

                    For example, the following code connects to the printer associated with a destination with a 30 second timeout:

                    +
                    char resource[256];
                     http_t *http = cupsConnectDest(dest, CUPS_DEST_FLAGS_DEVICE,
                                                    30000, NULL, resource,
                                                    sizeof(resource), NULL, NULL);
                     
                    -

                    Creating an IPP Request

                    -

                    IPP requests are represented by the IPP message type ipp_t and each IPP attribute in the request is representing using the type ipp_attribute_t. Each IPP request includes an operation code (IPP_OP_CREATE_JOB, IPP_OP_GET_PRINTER_ATTRIBUTES, etc.) and a 32-bit integer identifier.

                    -

                    The ippNewRequest function creates a new IPP request:

                    -
                    ipp_t *
                    +

                    Creating an IPP Request

                    +

                    IPP requests are represented by the IPP message type ipp_t and each IPP attribute in the request is representing using the type ipp_attribute_t. Each IPP request includes an operation code (IPP_OP_CREATE_JOB, IPP_OP_GET_PRINTER_ATTRIBUTES, etc.) and a 32-bit integer identifier.

                    +

                    The ippNewRequest function creates a new IPP request:

                    +
                    ipp_t *
                     ippNewRequest(ipp_op_t op);
                     
                    -

                    The op argument specifies the IPP operation code for the request. For example, the following code creates an IPP Get-Printer-Attributes request:

                    -
                    ipp_t *request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
                    +

                    The op argument specifies the IPP operation code for the request. For example, the following code creates an IPP Get-Printer-Attributes request:

                    +
                    ipp_t *request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
                     
                    -

                    The request identifier is automatically set to a unique value for the current process.

                    -

                    Each IPP request starts with two IPP attributes, "attributes-charset" and "attributes-natural-language", followed by IPP attribute(s) that specify the target of the operation. The ippNewRequest automatically adds the correct "attributes-charset" and "attributes-natural-language" attributes, but you must add the target attribute(s). For example, the following code adds the "printer-uri" attribute to the IPP Get-Printer-Attributes request to specify which printer is being queried:

                    -
                    const char *printer_uri = cupsGetOption("device-uri",
                    +

                    The request identifier is automatically set to a unique value for the current process.

                    +

                    Each IPP request starts with two IPP attributes, "attributes-charset" and "attributes-natural-language", followed by IPP attribute(s) that specify the target of the operation. The ippNewRequest automatically adds the correct "attributes-charset" and "attributes-natural-language" attributes, but you must add the target attribute(s). For example, the following code adds the "printer-uri" attribute to the IPP Get-Printer-Attributes request to specify which printer is being queried:

                    +
                    const char *printer_uri = cupsGetOption("device-uri",
                                                             dest->num_options,
                                                             dest->options);
                     
                     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                                  "printer-uri", NULL, printer_uri);
                     
                    -
                    -

                    Note:

                    -

                    If we wanted to query the scheduler instead of the device, we would look up the "printer-uri-supported" option instead of the "device-uri" value.

                    +
                    +

                    Note:

                    +

                    If we wanted to query the scheduler instead of the device, we would look up the "printer-uri-supported" option instead of the "device-uri" value.

                    -

                    The ippAddString function adds the "printer-uri" attribute the the IPP request. The IPP_TAG_OPERATION argument specifies that the attribute is part of the operation. The IPP_TAG_URI argument specifies that the value is a Universal Resource Identifier (URI) string. The NULL argument specifies there is no language (English, French, Japanese, etc.) associated with the string, and the printer_uri argument specifies the string value.

                    -

                    The IPP Get-Printer-Attributes request also supports an IPP attribute called "requested-attributes" that lists the attributes and values you are interested in. For example, the following code requests the printer state attributes:

                    -
                    static const char * const requested_attributes[] =
                    +

                    The ippAddString function adds the "printer-uri" attribute the the IPP request. The IPP_TAG_OPERATION argument specifies that the attribute is part of the operation. The IPP_TAG_URI argument specifies that the value is a Universal Resource Identifier (URI) string. The NULL argument specifies there is no language (English, French, Japanese, etc.) associated with the string, and the printer_uri argument specifies the string value.

                    +

                    The IPP Get-Printer-Attributes request also supports an IPP attribute called "requested-attributes" that lists the attributes and values you are interested in. For example, the following code requests the printer state attributes:

                    +
                    static const char * const requested_attributes[] =
                     {
                       "printer-state",
                       "printer-state-message",
                    @@ -1064,47 +1293,58 @@
                                   "requested-attributes", 3, NULL,
                                   requested_attributes);
                     
                    -

                    The ippAddStrings function adds an attribute with one or more strings, in this case three. The IPP_TAG_KEYWORD argument specifies that the strings are keyword values, which are used for attribute names. All strings use the same language (NULL), and the attribute will contain the three strings in the array requested_attributes.

                    -

                    CUPS provides many functions to adding attributes of different types:

                    -
                      -
                    • ippAddBoolean adds a boolean (IPP_TAG_BOOLEAN) attribute with one value.
                    • -
                    • ippAddInteger adds an enum (IPP_TAG_ENUM) or integer (IPP_TAG_INTEGER) attribute with one value.
                    • -
                    • ippAddIntegers adds an enum or integer attribute with one or more values.
                    • -
                    • ippAddOctetString adds an octetString attribute with one value.
                    • -
                    • ippAddOutOfBand adds a admin-defined (IPP_TAG_ADMINDEFINE), default (IPP_TAG_DEFAULT), delete-attribute (IPP_TAG_DELETEATTR), no-value (IPP_TAG_NOVALUE), not-settable (IPP_TAG_NOTSETTABLE), unknown (IPP_TAG_UNKNOWN), or unsupported (IPP_TAG_UNSUPPORTED_VALUE) out-of-band attribute.
                    • -
                    • ippAddRange adds a rangeOfInteger attribute with one range.
                    • -
                    • ippAddRanges adds a rangeOfInteger attribute with one or more ranges.
                    • -
                    • ippAddResolution adds a resolution attribute with one resolution.
                    • -
                    • ippAddResolutions adds a resolution attribute with one or more resolutions.
                    • -
                    • ippAddString adds a charset (IPP_TAG_CHARSET), keyword (IPP_TAG_KEYWORD), mimeMediaType (IPP_TAG_MIMETYPE), name (IPP_TAG_NAME and IPP_TAG_NAMELANG), naturalLanguage (IPP_TAG_NATURAL_LANGUAGE), text (IPP_TAG_TEXT and IPP_TAG_TEXTLANG), uri (IPP_TAG_URI), or uriScheme (IPP_TAG_URISCHEME) attribute with one value.
                    • -
                    • ippAddStrings adds a charset, keyword, mimeMediaType, name, naturalLanguage, text, uri, or uriScheme attribute with one or more values.
                    • +

                      The ippAddStrings function adds an attribute with one or more strings, in this case three. The IPP_TAG_KEYWORD argument specifies that the strings are keyword values, which are used for attribute names. All strings use the same language (NULL), and the attribute will contain the three strings in the array requested_attributes.

                      +

                      CUPS provides many functions to adding attributes of different types:

                      +
                        +
                      • ippAddBoolean adds a boolean (IPP_TAG_BOOLEAN) attribute with one value.

                        +
                      • +
                      • ippAddInteger adds an enum (IPP_TAG_ENUM) or integer (IPP_TAG_INTEGER) attribute with one value.

                        +
                      • +
                      • ippAddIntegers adds an enum or integer attribute with one or more values.

                        +
                      • +
                      • ippAddOctetString adds an octetString attribute with one value.

                        +
                      • +
                      • ippAddOutOfBand adds a admin-defined (IPP_TAG_ADMINDEFINE), default (IPP_TAG_DEFAULT), delete-attribute (IPP_TAG_DELETEATTR), no-value (IPP_TAG_NOVALUE), not-settable (IPP_TAG_NOTSETTABLE), unknown (IPP_TAG_UNKNOWN), or unsupported (IPP_TAG_UNSUPPORTED_VALUE) out-of-band attribute.

                        +
                      • +
                      • ippAddRange adds a rangeOfInteger attribute with one range.

                        +
                      • +
                      • ippAddRanges adds a rangeOfInteger attribute with one or more ranges.

                        +
                      • +
                      • ippAddResolution adds a resolution attribute with one resolution.

                        +
                      • +
                      • ippAddResolutions adds a resolution attribute with one or more resolutions.

                        +
                      • +
                      • ippAddString adds a charset (IPP_TAG_CHARSET), keyword (IPP_TAG_KEYWORD), mimeMediaType (IPP_TAG_MIMETYPE), name (IPP_TAG_NAME and IPP_TAG_NAMELANG), naturalLanguage (IPP_TAG_NATURAL_LANGUAGE), text (IPP_TAG_TEXT and IPP_TAG_TEXTLANG), uri (IPP_TAG_URI), or uriScheme (IPP_TAG_URISCHEME) attribute with one value.

                        +
                      • +
                      • ippAddStrings adds a charset, keyword, mimeMediaType, name, naturalLanguage, text, uri, or uriScheme attribute with one or more values.

                        +
                      -

                      Sending the IPP Request

                      -

                      Once you have created the IPP request, you can send it using the cupsDoRequest function. For example, the following code sends the IPP Get-Printer-Attributes request to the destination and saves the response:

                      -
                      ipp_t *response = cupsDoRequest(http, request, resource);
                      +

                      Sending the IPP Request

                      +

                      Once you have created the IPP request, you can send it using the cupsDoRequest function. For example, the following code sends the IPP Get-Printer-Attributes request to the destination and saves the response:

                      +
                      ipp_t *response = cupsDoRequest(http, request, resource);
                       
                      -

                      For requests like Send-Document that include a file, the cupsDoFileRequest function should be used:

                      -
                      ipp_t *response = cupsDoFileRequest(http, request, resource,
                      +

                      For requests like Send-Document that include a file, the cupsDoFileRequest function should be used:

                      +
                      ipp_t *response = cupsDoFileRequest(http, request, resource,
                                                           filename);
                       
                      -

                      Both cupsDoRequest and cupsDoFileRequest free the IPP request. If a valid IPP response is received, it is stored in a new IPP message (ipp_t) and returned to the caller. Otherwise NULL is returned.

                      -

                      The status from the most recent request can be queried using the cupsLastError function, for example:

                      -
                      if (cupsLastError() >= IPP_STATUS_ERROR_BAD_REQUEST)
                      +

                      Both cupsDoRequest and cupsDoFileRequest free the IPP request. If a valid IPP response is received, it is stored in a new IPP message (ipp_t) and returned to the caller. Otherwise NULL is returned.

                      +

                      The status from the most recent request can be queried using the cupsLastError function, for example:

                      +
                      if (cupsLastError() >= IPP_STATUS_ERROR_BAD_REQUEST)
                       {
                         /* request failed */
                       }
                       
                      -

                      A human-readable error message is also available using the cupsLastErrorString function:

                      -
                      if (cupsLastError() >= IPP_STATUS_ERROR_BAD_REQUEST)
                      +

                      A human-readable error message is also available using the cupsLastErrorString function:

                      +
                      if (cupsLastError() >= IPP_STATUS_ERROR_BAD_REQUEST)
                       {
                         /* request failed */
                         printf("Request failed: %s\n", cupsLastErrorString());
                       }
                       
                      -

                      Processing the IPP Response

                      -

                      Each response to an IPP request is also an IPP message (ipp_t) with its own IPP attributes (ipp_attribute_t) that includes a status code (IPP_STATUS_OK, IPP_STATUS_ERROR_BAD_REQUEST, etc.) and the corresponding 32-bit integer identifier from the request.

                      -

                      For example, the following code finds the printer state attributes and prints their values:

                      -
                      ipp_attribute_t *attr;
                      +

                      Processing the IPP Response

                      +

                      Each response to an IPP request is also an IPP message (ipp_t) with its own IPP attributes (ipp_attribute_t) that includes a status code (IPP_STATUS_OK, IPP_STATUS_ERROR_BAD_REQUEST, etc.) and the corresponding 32-bit integer identifier from the request.

                      +

                      For example, the following code finds the printer state attributes and prints their values:

                      +
                      ipp_attribute_t *attr;
                       
                       if ((attr = ippFindAttribute(response, "printer-state",
                                                    IPP_TAG_ENUM)) != NULL)
                      @@ -1132,48 +1372,48 @@
                           printf("    %s\n", ippGetString(attr, i, NULL)));
                       }
                       
                      -

                      The ippGetCount function returns the number of values in an attribute.

                      -

                      The ippGetInteger and ippGetString functions return a single integer or string value from an attribute.

                      -

                      The ippEnumString function converts a enum value to its keyword (string) equivalent.

                      -

                      Once you are done using the IPP response message, free it using the ippDelete function:

                      -
                      ippDelete(response);
                      +

                      The ippGetCount function returns the number of values in an attribute.

                      +

                      The ippGetInteger and ippGetString functions return a single integer or string value from an attribute.

                      +

                      The ippEnumString function converts a enum value to its keyword (string) equivalent.

                      +

                      Once you are done using the IPP response message, free it using the ippDelete function:

                      +
                      ippDelete(response);
                       
                      -

                      Authentication

                      -

                      CUPS normally handles authentication through the console. GUI applications should set a password callback using the cupsSetPasswordCB2 function:

                      -
                      void
                      +

                      Authentication

                      +

                      CUPS normally handles authentication through the console. GUI applications should set a password callback using the cupsSetPasswordCB2 function:

                      +
                      void
                       cupsSetPasswordCB2(cups_password_cb2_t cb, void *user_data);
                       
                      -

                      The password callback will be called when needed and is responsible for setting the current user name using cupsSetUser and returning a string:

                      -
                      const char *
                      +

                      The password callback will be called when needed and is responsible for setting the current user name using cupsSetUser and returning a string:

                      +
                      const char *
                       cups_password_cb2(const char *prompt, http_t *http,
                                         const char *method, const char *resource,
                                         void *user_data);
                       
                      -

                      The prompt argument is a string from CUPS that should be displayed to the user.

                      -

                      The http argument is the connection hosting the request that is being authenticated. The password callback can call the httpGetField and httpGetSubField functions to look for additional details concerning the authentication challenge.

                      -

                      The method argument specifies the HTTP method used for the request and is typically "POST".

                      -

                      The resource argument specifies the path used for the request.

                      -

                      The user_data argument provides the user data pointer from the cupsSetPasswordCB2 call.

                      -

                      Functions

                      +

                      The prompt argument is a string from CUPS that should be displayed to the user.

                      +

                      The http argument is the connection hosting the request that is being authenticated. The password callback can call the httpGetField and httpGetSubField functions to look for additional details concerning the authentication challenge.

                      +

                      The method argument specifies the HTTP method used for the request and is typically "POST".

                      +

                      The resource argument specifies the path used for the request.

                      +

                      The user_data argument provides the user data pointer from the cupsSetPasswordCB2 call.

                      +

                      Functions

                      cupsAddDest

                      -

                      Add a destination to the list of destinations.

                      +

                      Add a destination to the list of destinations.

                      int cupsAddDest(const char *name, const char *instance, int num_dests, cups_dest_t **dests);

                      Parameters

                      - + - + - + - +
                      nameDestination name
                      Destination name
                      instanceInstance name or NULL for none/primary
                      Instance name or NULL for none/primary
                      num_destsNumber of destinations
                      Number of destinations
                      destsDestinations
                      Destinations

                      Return Value

                      -

                      New number of destinations

                      +

                      New number of destinations

                      Discussion

                      -

                      This function cannot be used to add a new class or printer queue, +

                      This function cannot be used to add a new class or printer queue, it only adds a new container of saved options for the named destination or instance.

                      @@ -1184,87 +1424,451 @@ Use the cupsSaveDests function to save the updated list of destinations to the user's lpoptions file.

                       CUPS 2.3/macOS 10.14 cupsAddDestMediaOptions

                      -

                      Add the option corresponding to the specified media size.

                      +

                      Add the option corresponding to the specified media size.

                      int cupsAddDestMediaOptions(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size, int num_options, cups_option_t **options);

                      Parameters

                      - + - + - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      flagsMedia matching flags
                      Media matching flags
                      sizeMedia size
                      Media size
                      num_optionsCurrent number of options
                      Current number of options
                      optionsOptions
                      Options

                      Return Value

                      -

                      New number of options

                      +

                      New number of options

                       CUPS 2.2.4/macOS 10.13 cupsAddIntegerOption

                      -

                      Add an integer option to an option array.

                      +

                      Add an integer option to an option array.

                      int cupsAddIntegerOption(const char *name, int value, int num_options, cups_option_t **options);

                      Parameters

                      - + - + - + - +
                      nameName of option
                      Name of option
                      valueValue of option
                      Value of option
                      num_optionsNumber of options
                      Number of options
                      optionsPointer to options
                      Pointer to options

                      Return Value

                      -

                      Number of options

                      +

                      Number of options

                      Discussion

                      -

                      New option arrays can be initialized simply by passing 0 for the +

                      New option arrays can be initialized simply by passing 0 for the "num_options" parameter.

                      cupsAddOption

                      -

                      Add an option to an option array.

                      +

                      Add an option to an option array.

                      int cupsAddOption(const char *name, const char *value, int num_options, cups_option_t **options);

                      Parameters

                      - + - + - + - +
                      nameName of option
                      Name of option
                      valueValue of option
                      Value of option
                      num_optionsNumber of options
                      Number of options
                      optionsPointer to options
                      Pointer to options

                      Return Value

                      -

                      Number of options

                      +

                      Number of options

                      Discussion

                      -

                      New option arrays can be initialized simply by passing 0 for the +

                      New option arrays can be initialized simply by passing 0 for the "num_options" parameter.

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayAdd

                      +

                      Add an element to the array.

                      +

                      +int cupsArrayAdd(cups_array_t *a, void *e);

                      +

                      Parameters

                      + + + + + +
                      aArray
                      eElement
                      +

                      Return Value

                      +

                      1 on success, 0 on failure

                      +

                      Discussion

                      +

                      When adding an element to a sorted array, non-unique elements are +appended at the end of the run of identical elements. For unsorted arrays, +the element is appended to the end of the array. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayClear

                      +

                      Clear the array.

                      +

                      +void cupsArrayClear(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Discussion

                      +

                      This function is equivalent to removing all elements in the array. +The caller is responsible for freeing the memory used by the +elements themselves. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayCount

                      +

                      Get the number of elements in the array.

                      +

                      +int cupsArrayCount(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      Number of elements

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayCurrent

                      +

                      Return the current element in the array.

                      +

                      +void *cupsArrayCurrent(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      Element

                      +

                      Discussion

                      +

                      The current element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayDelete

                      +

                      Free all memory used by the array.

                      +

                      +void cupsArrayDelete(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Discussion

                      +

                      The caller is responsible for freeing the memory used by the +elements themselves. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayDup

                      +

                      Duplicate the array.

                      +

                      +cups_array_t *cupsArrayDup(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      Duplicate array

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayFind

                      +

                      Find an element in the array.

                      +

                      +void *cupsArrayFind(cups_array_t *a, void *e);

                      +

                      Parameters

                      + + + + + +
                      aArray
                      eElement
                      +

                      Return Value

                      +

                      Element found or NULL

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayFirst

                      +

                      Get the first element in the array.

                      +

                      +void *cupsArrayFirst(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      First element or NULL if the array is empty

                      +

                       CUPS 1.3/macOS 10.5 cupsArrayGetIndex

                      +

                      Get the index of the current element.

                      +

                      +int cupsArrayGetIndex(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      Index of the current element, starting at 0

                      +

                      Discussion

                      +

                      The current element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast. + +

                      +

                       CUPS 1.3/macOS 10.5 cupsArrayGetInsert

                      +

                      Get the index of the last inserted element.

                      +

                      +int cupsArrayGetInsert(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      Index of the last inserted element, starting at 0

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayIndex

                      +

                      Get the N-th element in the array.

                      +

                      +void *cupsArrayIndex(cups_array_t *a, int n);

                      +

                      Parameters

                      + + + + + +
                      aArray
                      nIndex into array, starting at 0
                      +

                      Return Value

                      +

                      N-th element or NULL

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayInsert

                      +

                      Insert an element in the array.

                      +

                      +int cupsArrayInsert(cups_array_t *a, void *e);

                      +

                      Parameters

                      + + + + + +
                      aArray
                      eElement
                      +

                      Return Value

                      +

                      0 on failure, 1 on success

                      +

                      Discussion

                      +

                      When inserting an element in a sorted array, non-unique elements are +inserted at the beginning of the run of identical elements. For unsorted +arrays, the element is inserted at the beginning of the array. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayLast

                      +

                      Get the last element in the array.

                      +

                      +void *cupsArrayLast(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      Last element or NULL if the array is empty

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayNew

                      +

                      Create a new array.

                      +

                      +cups_array_t *cupsArrayNew(cups_array_func_t f, void *d);

                      +

                      Parameters

                      + + + + + +
                      fComparison function or NULL for an unsorted array
                      dUser data pointer or NULL
                      +

                      Return Value

                      +

                      Array

                      +

                      Discussion

                      +

                      The comparison function ("f") is used to create a sorted array. The function +receives pointers to two elements and the user data pointer ("d") - the user +data pointer argument can safely be omitted when not required so functions +like strcmp can be used for sorted string arrays. + +

                      +

                       CUPS 1.3/macOS 10.5 cupsArrayNew2

                      +

                      Create a new array with hash.

                      +

                      +cups_array_t *cupsArrayNew2(cups_array_func_t f, void *d, cups_ahash_func_t h, int hsize);

                      +

                      Parameters

                      + + + + + + + + + +
                      fComparison function or NULL for an unsorted array
                      dUser data or NULL
                      hHash function or NULL for unhashed lookups
                      hsizeHash size (>= 0)
                      +

                      Return Value

                      +

                      Array

                      +

                      Discussion

                      +

                      The comparison function ("f") is used to create a sorted array. The function +receives pointers to two elements and the user data pointer ("d") - the user +data pointer argument can safely be omitted when not required so functions +like strcmp can be used for sorted string arrays.
                      +
                      +The hash function ("h") is used to implement cached lookups with the +specified hash size ("hsize"). + +

                      +

                       CUPS 1.5/macOS 10.7 cupsArrayNew3

                      +

                      Create a new array with hash and/or free function.

                      +

                      +cups_array_t *cupsArrayNew3(cups_array_func_t f, void *d, cups_ahash_func_t h, int hsize, cups_acopy_func_t cf, cups_afree_func_t ff);

                      +

                      Parameters

                      + + + + + + + + + + + + + +
                      fComparison function or NULL for an unsorted array
                      dUser data or NULL
                      hHash function or NULL for unhashed lookups
                      hsizeHash size (>= 0)
                      cfCopy function
                      ffFree function
                      +

                      Return Value

                      +

                      Array

                      +

                      Discussion

                      +

                      The comparison function ("f") is used to create a sorted array. The function +receives pointers to two elements and the user data pointer ("d") - the user +data pointer argument can safely be omitted when not required so functions +like strcmp can be used for sorted string arrays.
                      +
                      +The hash function ("h") is used to implement cached lookups with the +specified hash size ("hsize").
                      +
                      +The copy function ("cf") is used to automatically copy/retain elements when +added or the array is copied.
                      +
                      +The free function ("cf") is used to automatically free/release elements when +removed or the array is deleted. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayNext

                      +

                      Get the next element in the array.

                      +

                      +void *cupsArrayNext(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      Next element or NULL

                      +

                      Discussion

                      +

                      This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) + 1)".
                      +
                      +The next element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast +to set the current element. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayPrev

                      +

                      Get the previous element in the array.

                      +

                      +void *cupsArrayPrev(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      Previous element or NULL

                      +

                      Discussion

                      +

                      This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) - 1)".
                      +
                      +The previous element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast +to set the current element. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayRemove

                      +

                      Remove an element from the array.

                      +

                      +int cupsArrayRemove(cups_array_t *a, void *e);

                      +

                      Parameters

                      + + + + + +
                      aArray
                      eElement
                      +

                      Return Value

                      +

                      1 on success, 0 on failure

                      +

                      Discussion

                      +

                      If more than one element matches "e", only the first matching element is +removed.
                      +
                      +The caller is responsible for freeing the memory used by the +removed element. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayRestore

                      +

                      Reset the current element to the last cupsArraySave.

                      +

                      +void *cupsArrayRestore(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      New current element

                      +

                       CUPS 1.2/macOS 10.5 cupsArraySave

                      +

                      Mark the current element for a later cupsArrayRestore.

                      +

                      +int cupsArraySave(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      1 on success, 0 on failure

                      +

                      Discussion

                      +

                      The current element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast +to set the current element.
                      +
                      +The save/restore stack is guaranteed to be at least 32 elements deep. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsArrayUserData

                      +

                      Return the user data for an array.

                      +

                      +void *cupsArrayUserData(cups_array_t *a);

                      +

                      Parameters

                      + + + +
                      aArray
                      +

                      Return Value

                      +

                      User data

                       CUPS 1.6/macOS 10.8 cupsCancelDestJob

                      -

                      Cancel a job on a destination.

                      +

                      Cancel a job on a destination.

                      ipp_status_t cupsCancelDestJob(http_t *http, cups_dest_t *dest, int job_id);

                      Parameters

                      - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      job_idJob ID
                      Job ID

                      Return Value

                      -

                      Status of cancel operation

                      +

                      Status of cancel operation

                      Discussion

                      -

                      The "job_id" is the number returned by cupsCreateDestJob.
                      +

                      The "job_id" is the number returned by cupsCreateDestJob.

                      Returns IPP_STATUS_OK on success and IPP_STATUS_ERROR_NOT_AUTHORIZED or @@ -1272,79 +1876,79 @@

                       CUPS 1.6/macOS 10.8 cupsCheckDestSupported

                      -

                      Check that the option and value are supported +

                      Check that the option and value are supported by the destination.

                      int cupsCheckDestSupported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);

                      Parameters

                      - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      optionOption
                      Option
                      valueValue or NULL
                      Value or NULL

                      Return Value

                      -

                      1 if supported, 0 otherwise

                      +

                      1 if supported, 0 otherwise

                      Discussion

                      -

                      Returns 1 if supported, 0 otherwise. +

                      Returns 1 if supported, 0 otherwise.

                       CUPS 1.6/macOS 10.8 cupsCloseDestJob

                      -

                      Close a job and start printing.

                      +

                      Close a job and start printing.

                      ipp_status_t cupsCloseDestJob(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int job_id);

                      Parameters

                      - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      infoDestination information
                      Destination information
                      job_idJob ID
                      Job ID

                      Return Value

                      -

                      IPP status code

                      +

                      IPP status code

                      Discussion

                      -

                      Use when the last call to cupsStartDocument passed 0 for "last_document". +

                      Use when the last call to cupsStartDocument passed 0 for "last_document". "job_id" is the job ID returned by cupsCreateDestJob. Returns IPP_STATUS_OK on success.

                       CUPS 1.6/macOS 10.8 cupsConnectDest

                      -

                      Open a connection to the destination.

                      +

                      Open a connection to the destination.

                      http_t *cupsConnectDest(cups_dest_t *dest, unsigned flags, int msec, int *cancel, char *resource, size_t resourcesize, cups_dest_cb_t cb, void *user_data);

                      Parameters

                      - + - + - + - + - + - + - + - +
                      destDestination
                      Destination
                      flagsConnection flags
                      Connection flags
                      msecTimeout in milliseconds
                      Timeout in milliseconds
                      cancelPointer to "cancel" variable
                      Pointer to "cancel" variable
                      resourceResource buffer
                      Resource buffer
                      resourcesizeSize of resource buffer
                      Size of resource buffer
                      cbCallback function
                      Callback function
                      user_dataUser data pointer
                      User data pointer

                      Return Value

                      -

                      Connection to destination or NULL

                      +

                      Connection to destination or NULL

                      Discussion

                      -

                      Connect to the destination, returning a new http_t connection object +

                      Connect to the destination, returning a new http_t connection object and optionally the resource path to use for the destination. These calls will block until a connection is made, the timeout expires, the integer pointed to by "cancel" is non-zero, or the callback function (or block) @@ -1358,60 +1962,60 @@

                       CUPS 1.6/macOS 10.8 cupsCopyDest

                      -

                      Copy a destination.

                      +

                      Copy a destination.

                      int cupsCopyDest(cups_dest_t *dest, int num_dests, cups_dest_t **dests);

                      Parameters

                      - + - + - +
                      destDestination to copy
                      Destination to copy
                      num_destsNumber of destinations
                      Number of destinations
                      destsDestination array
                      Destination array

                      Return Value

                      -

                      New number of destinations

                      +

                      New number of destinations

                      Discussion

                      -

                      Make a copy of the destination to an array of destinations (or just a single +

                      Make a copy of the destination to an array of destinations (or just a single copy) - for use with the cupsEnumDests* functions. The caller is responsible for calling cupsFreeDests() on the returned object(s).

                       CUPS 1.6/macOS 10.8 cupsCopyDestConflicts

                      -

                      Get conflicts and resolutions for a new +

                      Get conflicts and resolutions for a new option/value pair.

                      int cupsCopyDestConflicts(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int num_options, cups_option_t *options, const char *new_option, const char *new_value, int *num_conflicts, cups_option_t **conflicts, int *num_resolved, cups_option_t **resolved);

                      Parameters

                      - + - + - + - + - + - + - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      num_optionsNumber of current options
                      Number of current options
                      optionsCurrent options
                      Current options
                      new_optionNew option
                      New option
                      new_valueNew value
                      New value
                      num_conflictsNumber of conflicting options
                      Number of conflicting options
                      conflictsConflicting options
                      Conflicting options
                      num_resolvedNumber of options to resolve
                      Number of options to resolve
                      resolvedResolved options
                      Resolved options

                      Return Value

                      -

                      1 if there is a conflict, 0 if none, -1 on error

                      +

                      1 if there is a conflict, 0 if none, -1 on error

                      Discussion

                      -

                      "num_options" and "options" represent the currently selected options by the +

                      "num_options" and "options" represent the currently selected options by the user. "new_option" and "new_value" are the setting the user has just changed.

                      @@ -1428,135 +2032,175 @@

                       CUPS 1.6/macOS 10.8 cupsCopyDestInfo

                      -

                      Get the supported values/capabilities for the +

                      Get the supported values/capabilities for the destination.

                      cups_dinfo_t *cupsCopyDestInfo(http_t *http, cups_dest_t *dest);

                      Parameters

                      - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination

                      Return Value

                      -

                      Destination information

                      +

                      Destination information

                      Discussion

                      -

                      The caller is responsible for calling cupsFreeDestInfo on the return +

                      The caller is responsible for calling cupsFreeDestInfo on the return value. NULL is returned on error.

                       CUPS 1.6/macOS 10.8 cupsCreateDestJob

                      -

                      Create a job on a destination.

                      +

                      Create a job on a destination.

                      ipp_status_t cupsCreateDestJob(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int *job_id, const char *title, int num_options, cups_option_t *options);

                      Parameters

                      - + - + - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      infoDestination information
                      Destination information
                      job_idJob ID or 0 on error
                      Job ID or 0 on error
                      titleJob name
                      Job name
                      num_optionsNumber of job options
                      Number of job options
                      optionsJob options
                      Job options

                      Return Value

                      -

                      IPP status code

                      +

                      IPP status code

                      Discussion

                      -

                      Returns IPP_STATUS_OK or IPP_STATUS_OK_SUBST on success, saving the job ID +

                      Returns IPP_STATUS_OK or IPP_STATUS_OK_SUBST on success, saving the job ID in the variable pointed to by "job_id".

                      +

                       CUPS 1.2/macOS 10.5 cupsDirClose

                      +

                      Close a directory.

                      +

                      +void cupsDirClose(cups_dir_t *dp);

                      +

                      Parameters

                      + + + +
                      dpDirectory pointer
                      +

                       CUPS 1.2/macOS 10.5 cupsDirOpen

                      +

                      Open a directory.

                      +

                      +cups_dir_t *cupsDirOpen(const char *directory);

                      +

                      Parameters

                      + + + +
                      directoryDirectory name
                      +

                      Return Value

                      +

                      Directory pointer or NULL if the directory could not be opened.

                      +

                       CUPS 1.2/macOS 10.5 cupsDirRead

                      +

                      Read the next directory entry.

                      +

                      +cups_dentry_t *cupsDirRead(cups_dir_t *dp);

                      +

                      Parameters

                      + + + +
                      dpDirectory pointer
                      +

                      Return Value

                      +

                      Directory entry or NULL when there are no more

                      +

                       CUPS 1.2/macOS 10.5 cupsDirRewind

                      +

                      Rewind to the start of the directory.

                      +

                      +void cupsDirRewind(cups_dir_t *dp);

                      +

                      Parameters

                      + + + +
                      dpDirectory pointer

                       CUPS 1.1.20/macOS 10.4 cupsDoAuthentication

                      -

                      Authenticate a request.

                      +

                      Authenticate a request.

                      int cupsDoAuthentication(http_t *http, const char *method, const char *resource);

                      Parameters

                      - + - + - +
                      httpConnection to server or CUPS_HTTP_DEFAULT
                      Connection to server or CUPS_HTTP_DEFAULT
                      methodRequest method ("GET", "POST", "PUT")
                      Request method ("GET", "POST", "PUT")
                      resourceResource path
                      Resource path

                      Return Value

                      -

                      0 on success, -1 on error

                      +

                      0 on success, -1 on error

                      Discussion

                      -

                      This function should be called in response to a HTTP_STATUS_UNAUTHORIZED +

                      This function should be called in response to a HTTP_STATUS_UNAUTHORIZED status, prior to resubmitting your request.

                       CUPS 2.3/macOS 10.14 cupsEncodeOption

                      -

                      Encode a single option into an IPP attribute.

                      +

                      Encode a single option into an IPP attribute.

                      ipp_attribute_t *cupsEncodeOption(ipp_t *ipp, ipp_tag_t group_tag, const char *name, const char *value);

                      Parameters

                      - + - + - + - +
                      ippIPP request/response
                      IPP request/response
                      group_tagAttribute group
                      Attribute group
                      nameOption name
                      Option name
                      valueOption string value
                      Option string value

                      Return Value

                      -

                      New attribute or NULL on error

                      +

                      New attribute or NULL on error

                      cupsEncodeOptions

                      -

                      Encode printer options into IPP attributes.

                      +

                      Encode printer options into IPP attributes.

                      void cupsEncodeOptions(ipp_t *ipp, int num_options, cups_option_t *options);

                      Parameters

                      - + - + - +
                      ippIPP request/response
                      IPP request/response
                      num_optionsNumber of options
                      Number of options
                      optionsOptions
                      Options

                      Discussion

                      -

                      This function adds operation, job, and then subscription attributes, +

                      This function adds operation, job, and then subscription attributes, in that order. Use the cupsEncodeOptions2 function to add attributes for a single group.

                       CUPS 1.2/macOS 10.5 cupsEncodeOptions2

                      -

                      Encode printer options into IPP attributes for a group.

                      +

                      Encode printer options into IPP attributes for a group.

                      void cupsEncodeOptions2(ipp_t *ipp, int num_options, cups_option_t *options, ipp_tag_t group_tag);

                      Parameters

                      - + - + - + - +
                      ippIPP request/response
                      IPP request/response
                      num_optionsNumber of options
                      Number of options
                      optionsOptions
                      Options
                      group_tagGroup to encode
                      Group to encode

                      Discussion

                      -

                      This function only adds attributes for a single group. Call this +

                      This function only adds attributes for a single group. Call this function multiple times for each group, or use cupsEncodeOptions to add the standard groups.

                      cupsEncryption

                      -

                      Get the current encryption settings.

                      +

                      Get the current encryption settings.

                      http_encryption_t cupsEncryption(void);

                      Return Value

                      -

                      Encryption settings

                      +

                      Encryption settings

                      Discussion

                      -

                      The default encryption setting comes from the CUPS_ENCRYPTION +

                      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 HTTP_ENCRYPTION_IF_REQUESTED.
                      @@ -1566,30 +2210,30 @@ cupsSetEncryption function need to do so in each thread for the same setting to be used.

                       CUPS 1.6/macOS 10.8 cupsEnumDests

                      -

                      Enumerate available destinations with a callback function.

                      +

                      Enumerate available destinations with a callback function.

                      int cupsEnumDests(unsigned flags, int msec, int *cancel, cups_ptype_t type, cups_ptype_t mask, cups_dest_cb_t cb, void *user_data);

                      Parameters

                      - + - + - + - + - + - + - +
                      flagsEnumeration flags
                      Enumeration flags
                      msecTimeout in milliseconds, -1 for indefinite
                      Timeout in milliseconds, -1 for indefinite
                      cancelPointer to "cancel" variable
                      Pointer to "cancel" variable
                      typePrinter type bits
                      Printer type bits
                      maskMask for printer type bits
                      Mask for printer type bits
                      cbCallback function
                      Callback function
                      user_dataUser data
                      User data

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      Destinations are enumerated from one or more sources. The callback function +

                      Destinations are enumerated from one or more sources. The callback function receives the user_data pointer and the destination pointer which can be used as input to the cupsCopyDest function. The function must return 1 to continue enumeration or 0 to stop.
                      @@ -1606,25 +2250,408 @@ destinations - it is up to the caller to suppress any duplicate destinations.

                      +

                       CUPS 1.2/macOS 10.5 cupsFileClose

                      +

                      Close a CUPS file.

                      +

                      +int cupsFileClose(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      0 on success, -1 on error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileCompression

                      +

                      Return whether a file is compressed.

                      +

                      +int cupsFileCompression(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      CUPS_FILE_NONE or CUPS_FILE_GZIP

                      +

                       CUPS 1.2/macOS 10.5 cupsFileEOF

                      +

                      Return the end-of-file status.

                      +

                      +int cupsFileEOF(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      1 on end of file, 0 otherwise

                      +

                       CUPS 1.2/macOS 10.5 cupsFileFind

                      +

                      Find a file using the specified path.

                      +

                      +const char *cupsFileFind(const char *filename, const char *path, int executable, char *buffer, int bufsize);

                      +

                      Parameters

                      + + + + + + + + + + + +
                      filenameFile to find
                      pathColon/semicolon-separated path
                      executable1 = executable files, 0 = any file/dir
                      bufferFilename buffer
                      bufsizeSize of filename buffer
                      +

                      Return Value

                      +

                      Full path to file or NULL if not found

                      +

                      Discussion

                      +

                      This function allows the paths in the path string to be separated by +colons (UNIX standard) or semicolons (Windows standard) and stores the +result in the buffer supplied. If the file cannot be found in any of +the supplied paths, NULL is returned. A NULL path only +matches the current directory. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsFileFlush

                      +

                      Flush pending output.

                      +

                      +int cupsFileFlush(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      0 on success, -1 on error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileGetChar

                      +

                      Get a single character from a file.

                      +

                      +int cupsFileGetChar(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      Character or -1 on end of file

                      +

                       CUPS 1.2/macOS 10.5 cupsFileGetConf

                      +

                      Get a line from a configuration file.

                      +

                      +char *cupsFileGetConf(cups_file_t *fp, char *buf, size_t buflen, char **value, int *linenum);

                      +

                      Parameters

                      + + + + + + + + + + + +
                      fpCUPS file
                      bufString buffer
                      buflenSize of string buffer
                      valuePointer to value
                      linenumCurrent line number
                      +

                      Return Value

                      +

                      Line read or NULL on end of file or error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileGetLine

                      +

                      Get a CR and/or LF-terminated line that may +contain binary data.

                      +

                      +size_t cupsFileGetLine(cups_file_t *fp, char *buf, size_t buflen);

                      +

                      Parameters

                      + + + + + + + +
                      fpFile to read from
                      bufBuffer
                      buflenSize of buffer
                      +

                      Return Value

                      +

                      Number of bytes on line or 0 on end of file

                      +

                      Discussion

                      +

                      This function differs from cupsFileGets in that the trailing CR +and LF are preserved, as is any binary data on the line. The buffer is +nul-terminated, however you should use the returned length to determine +the number of bytes on the line. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsFileGets

                      +

                      Get a CR and/or LF-terminated line.

                      +

                      +char *cupsFileGets(cups_file_t *fp, char *buf, size_t buflen);

                      +

                      Parameters

                      + + + + + + + +
                      fpCUPS file
                      bufString buffer
                      buflenSize of string buffer
                      +

                      Return Value

                      +

                      Line read or NULL on end of file or error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileLock

                      +

                      Temporarily lock access to a file.

                      +

                      +int cupsFileLock(cups_file_t *fp, int block);

                      +

                      Parameters

                      + + + + + +
                      fpCUPS file
                      block1 to wait for the lock, 0 to fail right away
                      +

                      Return Value

                      +

                      0 on success, -1 on error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileNumber

                      +

                      Return the file descriptor associated with a CUPS file.

                      +

                      +int cupsFileNumber(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      File descriptor

                      +

                       CUPS 1.2/macOS 10.5 cupsFileOpen

                      +

                      Open a CUPS file.

                      +

                      +cups_file_t *cupsFileOpen(const char *filename, const char *mode);

                      +

                      Parameters

                      + + + + + +
                      filenameName of file
                      modeOpen mode
                      +

                      Return Value

                      +

                      CUPS file or NULL if the file or socket cannot be opened

                      +

                      Discussion

                      +

                      The "mode" parameter can be "r" to read, "w" to write, overwriting any +existing file, "a" to append to an existing file or create a new file, +or "s" to open a socket connection.
                      +
                      +When opening for writing ("w"), an optional number from 1 to 9 can be +supplied which enables Flate compression of the file. Compression is +not supported for the "a" (append) mode.
                      +
                      +When opening a socket connection, the filename is a string of the form +"address:port" or "hostname:port". The socket will make an IPv4 or IPv6 +connection as needed, generally preferring IPv6 connections when there is +a choice. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsFileOpenFd

                      +

                      Open a CUPS file using a file descriptor.

                      +

                      +cups_file_t *cupsFileOpenFd(int fd, const char *mode);

                      +

                      Parameters

                      + + + + + +
                      fdFile descriptor
                      modeOpen mode
                      +

                      Return Value

                      +

                      CUPS file or NULL if the file could not be opened

                      +

                      Discussion

                      +

                      The "mode" parameter can be "r" to read, "w" to write, "a" to append, +or "s" to treat the file descriptor as a bidirectional socket connection.
                      +
                      +When opening for writing ("w"), an optional number from 1 to 9 can be +supplied which enables Flate compression of the file. Compression is +not supported for the "a" (append) mode. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsFilePeekChar

                      +

                      Peek at the next character from a file.

                      +

                      +int cupsFilePeekChar(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      Character or -1 on end of file

                      +

                       CUPS 1.2/macOS 10.5 cupsFilePrintf

                      +

                      Write a formatted string.

                      +

                      +int cupsFilePrintf(cups_file_t *fp, const char *format, ...);

                      +

                      Parameters

                      + + + + + + + +
                      fpCUPS file
                      formatPrintf-style format string
                      ...Additional args as necessary
                      +

                      Return Value

                      +

                      Number of bytes written or -1 on error

                      +

                       CUPS 1.2/macOS 10.5 cupsFilePutChar

                      +

                      Write a character.

                      +

                      +int cupsFilePutChar(cups_file_t *fp, int c);

                      +

                      Parameters

                      + + + + + +
                      fpCUPS file
                      cCharacter to write
                      +

                      Return Value

                      +

                      0 on success, -1 on error

                      +

                       CUPS 1.4/macOS 10.6 cupsFilePutConf

                      +

                      Write a configuration line.

                      +

                      +ssize_t cupsFilePutConf(cups_file_t *fp, const char *directive, const char *value);

                      +

                      Parameters

                      + + + + + + + +
                      fpCUPS file
                      directiveDirective
                      valueValue
                      +

                      Return Value

                      +

                      Number of bytes written or -1 on error

                      +

                      Discussion

                      +

                      This function handles any comment escaping of the value. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsFilePuts

                      +

                      Write a string.

                      +

                      +int cupsFilePuts(cups_file_t *fp, const char *s);

                      +

                      Parameters

                      + + + + + +
                      fpCUPS file
                      sString to write
                      +

                      Return Value

                      +

                      Number of bytes written or -1 on error

                      +

                      Discussion

                      +

                      Like the fputs function, no newline is appended to the string. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsFileRead

                      +

                      Read from a file.

                      +

                      +ssize_t cupsFileRead(cups_file_t *fp, char *buf, size_t bytes);

                      +

                      Parameters

                      + + + + + + + +
                      fpCUPS file
                      bufBuffer
                      bytesNumber of bytes to read
                      +

                      Return Value

                      +

                      Number of bytes read or -1 on error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileRewind

                      +

                      Set the current file position to the beginning of the +file.

                      +

                      +off_t cupsFileRewind(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      New file position or -1 on error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileSeek

                      +

                      Seek in a file.

                      +

                      +off_t cupsFileSeek(cups_file_t *fp, off_t pos);

                      +

                      Parameters

                      + + + + + +
                      fpCUPS file
                      posPosition in file
                      +

                      Return Value

                      +

                      New file position or -1 on error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileStderr

                      +

                      Return a CUPS file associated with stderr.

                      +

                      +cups_file_t *cupsFileStderr(void);

                      +

                      Return Value

                      +

                      CUPS file

                      +

                       CUPS 1.2/macOS 10.5 cupsFileStdin

                      +

                      Return a CUPS file associated with stdin.

                      +

                      +cups_file_t *cupsFileStdin(void);

                      +

                      Return Value

                      +

                      CUPS file

                      +

                       CUPS 1.2/macOS 10.5 cupsFileStdout

                      +

                      Return a CUPS file associated with stdout.

                      +

                      +cups_file_t *cupsFileStdout(void);

                      +

                      Return Value

                      +

                      CUPS file

                      +

                       CUPS 1.2/macOS 10.5 cupsFileTell

                      +

                      Return the current file position.

                      +

                      +off_t cupsFileTell(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      File position

                      +

                       CUPS 1.2/macOS 10.5 cupsFileUnlock

                      +

                      Unlock access to a file.

                      +

                      +int cupsFileUnlock(cups_file_t *fp);

                      +

                      Parameters

                      + + + +
                      fpCUPS file
                      +

                      Return Value

                      +

                      0 on success, -1 on error

                      +

                       CUPS 1.2/macOS 10.5 cupsFileWrite

                      +

                      Write to a file.

                      +

                      +ssize_t cupsFileWrite(cups_file_t *fp, const char *buf, size_t bytes);

                      +

                      Parameters

                      + + + + + + + +
                      fpCUPS file
                      bufBuffer
                      bytesNumber of bytes to write
                      +

                      Return Value

                      +

                      Number of bytes written or -1 on error

                       CUPS 1.7/macOS 10.9 cupsFindDestDefault

                      -

                      Find the default value(s) for the given option.

                      +

                      Find the default value(s) for the given option.

                      ipp_attribute_t *cupsFindDestDefault(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);

                      Parameters

                      - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      optionOption/attribute name
                      Option/attribute name

                      Return Value

                      -

                      Default attribute or NULL for none

                      +

                      Default attribute or NULL for none

                      Discussion

                      -

                      The returned value is an IPP attribute. Use the ippGetBoolean, +

                      The returned value is an IPP attribute. Use the ippGetBoolean, ippGetCollection, ippGetCount, ippGetDate, ippGetInteger, ippGetOctetString, ippGetRange, ippGetResolution, ippGetString, and ippGetValueTag @@ -1632,24 +2659,24 @@

                       CUPS 1.7/macOS 10.9 cupsFindDestReady

                      -

                      Find the default value(s) for the given option.

                      +

                      Find the default value(s) for the given option.

                      ipp_attribute_t *cupsFindDestReady(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);

                      Parameters

                      - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      optionOption/attribute name
                      Option/attribute name

                      Return Value

                      -

                      Default attribute or NULL for none

                      +

                      Default attribute or NULL for none

                      Discussion

                      -

                      The returned value is an IPP attribute. Use the ippGetBoolean, +

                      The returned value is an IPP attribute. Use the ippGetBoolean, ippGetCollection, ippGetCount, ippGetDate, ippGetInteger, ippGetOctetString, ippGetRange, ippGetResolution, ippGetString, and ippGetValueTag @@ -1657,24 +2684,24 @@

                       CUPS 1.7/macOS 10.9 cupsFindDestSupported

                      -

                      Find the default value(s) for the given option.

                      +

                      Find the default value(s) for the given option.

                      ipp_attribute_t *cupsFindDestSupported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);

                      Parameters

                      - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      optionOption/attribute name
                      Option/attribute name

                      Return Value

                      -

                      Default attribute or NULL for none

                      +

                      Default attribute or NULL for none

                      Discussion

                      -

                      The returned value is an IPP attribute. Use the ippGetBoolean, +

                      The returned value is an IPP attribute. Use the ippGetBoolean, ippGetCollection, ippGetCount, ippGetDate, ippGetInteger, ippGetOctetString, ippGetRange, ippGetResolution, ippGetString, and ippGetValueTag @@ -1682,138 +2709,138 @@

                       CUPS 1.6/macOS 10.8 cupsFinishDestDocument

                      -

                      Finish the current document.

                      +

                      Finish the current document.

                      ipp_status_t cupsFinishDestDocument(http_t *http, cups_dest_t *dest, cups_dinfo_t *info);

                      Parameters

                      - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      infoDestination information
                      Destination information

                      Return Value

                      -

                      Status of document submission

                      +

                      Status of document submission

                      Discussion

                      -

                      Returns IPP_STATUS_OK or IPP_STATUS_OK_SUBST on success. +

                      Returns IPP_STATUS_OK or IPP_STATUS_OK_SUBST on success.

                       CUPS 1.6/macOS 10.8 cupsFreeDestInfo

                      -

                      Free destination information obtained using +

                      Free destination information obtained using cupsCopyDestInfo.

                      void cupsFreeDestInfo(cups_dinfo_t *dinfo);

                      Parameters

                      - +
                      dinfoDestination information
                      Destination information

                      cupsFreeDests

                      -

                      Free the memory used by the list of destinations.

                      +

                      Free the memory used by the list of destinations.

                      void cupsFreeDests(int num_dests, cups_dest_t *dests);

                      Parameters

                      - + - +
                      num_destsNumber of destinations
                      Number of destinations
                      destsDestinations
                      Destinations

                      cupsFreeJobs

                      -

                      Free memory used by job data.

                      +

                      Free memory used by job data.

                      void cupsFreeJobs(int num_jobs, cups_job_t *jobs);

                      Parameters

                      - + - +
                      num_jobsNumber of jobs
                      Number of jobs
                      jobsJobs
                      Jobs

                      cupsFreeOptions

                      -

                      Free all memory used by options.

                      +

                      Free all memory used by options.

                      void cupsFreeOptions(int num_options, cups_option_t *options);

                      Parameters

                      - + - +
                      num_optionsNumber of options
                      Number of options
                      optionsPointer to options
                      Pointer to options

                      cupsGetDest

                      -

                      Get the named destination from the list.

                      +

                      Get the named destination from the list.

                      cups_dest_t *cupsGetDest(const char *name, const char *instance, int num_dests, cups_dest_t *dests);

                      Parameters

                      - + - + - + - +
                      nameDestination name or NULL for the default destination
                      Destination name or NULL for the default destination
                      instanceInstance name or NULL
                      Instance name or NULL
                      num_destsNumber of destinations
                      Number of destinations
                      destsDestinations
                      Destinations

                      Return Value

                      -

                      Destination pointer or NULL

                      +

                      Destination pointer or NULL

                      Discussion

                      -

                      Use the cupsEnumDests or cupsGetDests2 functions to get a +

                      Use the cupsEnumDests or cupsGetDests2 functions to get a list of supported destinations for the current user.

                       CUPS 1.7/macOS 10.9 cupsGetDestMediaByIndex

                      -

                      Get a media name, dimension, and margins for a +

                      Get a media name, dimension, and margins for a specific size.

                      int cupsGetDestMediaByIndex(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int n, unsigned flags, cups_size_t *size);

                      Parameters

                      - + - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      nMedia size number (0-based)
                      Media size number (0-based)
                      flagsMedia flags
                      Media flags
                      sizeMedia size information
                      Media size information

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The flags parameter determines which set of media are indexed. For +

                      The flags parameter determines which set of media are indexed. For example, passing CUPS_MEDIA_FLAGS_BORDERLESS will get the Nth borderless size supported by the printer.

                       CUPS 1.6/macOS 10.8 cupsGetDestMediaByName

                      -

                      Get media names, dimensions, and margins.

                      +

                      Get media names, dimensions, and margins.

                      int cupsGetDestMediaByName(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *media, unsigned flags, cups_size_t *size);

                      Parameters

                      - + - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      mediaMedia name
                      Media name
                      flagsMedia matching flags
                      Media matching flags
                      sizeMedia size information
                      Media size information

                      Return Value

                      -

                      1 on match, 0 on failure

                      +

                      1 on match, 0 on failure

                      Discussion

                      -

                      The "media" string is a PWG media name. "Flags" provides some matching +

                      The "media" string is a PWG media name. "Flags" provides some matching guidance (multiple flags can be combined):

                      CUPS_MEDIA_FLAGS_DEFAULT = find the closest size supported by the printer, @@ -1829,32 +2856,32 @@

                       CUPS 1.6/macOS 10.8 cupsGetDestMediaBySize

                      -

                      Get media names, dimensions, and margins.

                      +

                      Get media names, dimensions, and margins.

                      int cupsGetDestMediaBySize(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int width, int length, unsigned flags, cups_size_t *size);

                      Parameters

                      - + - + - + - - - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      widthMedia width in hundredths of +Media width in hundredths of of millimeters
                      lengthMedia length in hundredths of +Media length in hundredths of of millimeters
                      flagsMedia matching flags
                      Media matching flags
                      sizeMedia size information
                      Media size information

                      Return Value

                      -

                      1 on match, 0 on failure

                      +

                      1 on match, 0 on failure

                      Discussion

                      -

                      "Width" and "length" are the dimensions in hundredths of millimeters. +

                      "Width" and "length" are the dimensions in hundredths of millimeters. "Flags" provides some matching guidance (multiple flags can be combined):

                      CUPS_MEDIA_FLAGS_DEFAULT = find the closest size supported by the printer, @@ -1870,89 +2897,89 @@

                       CUPS 1.7/macOS 10.9 cupsGetDestMediaCount

                      -

                      Get the number of sizes supported by a +

                      Get the number of sizes supported by a destination.

                      int cupsGetDestMediaCount(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags);

                      Parameters

                      - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      flagsMedia flags
                      Media flags

                      Return Value

                      -

                      Number of sizes

                      +

                      Number of sizes

                      Discussion

                      -

                      The flags parameter determines the set of media sizes that are +

                      The flags parameter determines the set of media sizes that are counted. For example, passing CUPS_MEDIA_FLAGS_BORDERLESS will return the number of borderless sizes.

                       CUPS 1.7/macOS 10.9 cupsGetDestMediaDefault

                      -

                      Get the default size for a destination.

                      +

                      Get the default size for a destination.

                      int cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size);

                      Parameters

                      - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      flagsMedia flags
                      Media flags
                      sizeMedia size information
                      Media size information

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The flags parameter determines which default size is returned. For +

                      The flags parameter determines which default size is returned. For example, passing CUPS_MEDIA_FLAGS_BORDERLESS will return the default borderless size, typically US Letter or A4, but sometimes 4x6 photo media.

                       CUPS 2.0/macOS 10.10 cupsGetDestWithURI

                      -

                      Get a destination associated with a URI.

                      +

                      Get a destination associated with a URI.

                      cups_dest_t *cupsGetDestWithURI(const char *name, const char *uri);

                      Parameters

                      - + - +
                      nameDesired printer name or NULL
                      Desired printer name or NULL
                      uriURI for the printer
                      URI for the printer

                      Return Value

                      -

                      Destination or NULL

                      +

                      Destination or NULL

                      Discussion

                      -

                      "name" is the desired name for the printer. If NULL, a name will be +

                      "name" is the desired name for the printer. If NULL, a name will be created using the URI.

                      "uri" is the "ipp" or "ipps" URI for the printer.

                       CUPS 1.1.21/macOS 10.4 cupsGetDests2

                      -

                      Get the list of destinations from the specified server.

                      +

                      Get the list of destinations from the specified server.

                      int cupsGetDests2(http_t *http, cups_dest_t **dests);

                      Parameters

                      - + - +
                      httpConnection to server or CUPS_HTTP_DEFAULT
                      Connection to server or CUPS_HTTP_DEFAULT
                      destsDestinations
                      Destinations

                      Return Value

                      -

                      Number of destinations

                      +

                      Number of destinations

                      Discussion

                      -

                      Starting with CUPS 1.2, the returned list of destinations include the +

                      Starting with CUPS 1.2, the returned list of destinations include the "printer-info", "printer-is-accepting-jobs", "printer-is-shared", "printer-make-and-model", "printer-state", "printer-state-change-time", "printer-state-reasons", "printer-type", and "printer-uri-supported" @@ -1971,68 +2998,68 @@

                       CUPS 2.2.4/macOS 10.13 cupsGetIntegerOption

                      -

                      Get an integer option value.

                      +

                      Get an integer option value.

                      int cupsGetIntegerOption(const char *name, int num_options, cups_option_t *options);

                      Parameters

                      - + - + - +
                      nameName of option
                      Name of option
                      num_optionsNumber of options
                      Number of options
                      optionsOptions
                      Options

                      Return Value

                      -

                      Option value or INT_MIN

                      +

                      Option value or INT_MIN

                      Discussion

                      -

                      INT_MIN is returned when the option does not exist, is not an integer, or +

                      INT_MIN is returned when the option does not exist, is not an integer, or exceeds the range of values for the "int" type.

                       CUPS 1.1.21/macOS 10.4 cupsGetJobs2

                      -

                      Get the jobs from the specified server.

                      +

                      Get the jobs from the specified server.

                      int cupsGetJobs2(http_t *http, cups_job_t **jobs, const char *name, int myjobs, int whichjobs);

                      Parameters

                      - + - + - + - + - +
                      httpConnection to server or CUPS_HTTP_DEFAULT
                      Connection to server or CUPS_HTTP_DEFAULT
                      jobsJob data
                      Job data
                      nameNULL = all destinations, otherwise show jobs for named destination
                      NULL = all destinations, otherwise show jobs for named destination
                      myjobs0 = all users, 1 = mine
                      0 = all users, 1 = mine
                      whichjobsCUPS_WHICHJOBS_ALL, CUPS_WHICHJOBS_ACTIVE, or CUPS_WHICHJOBS_COMPLETED
                      CUPS_WHICHJOBS_ALL, CUPS_WHICHJOBS_ACTIVE, or CUPS_WHICHJOBS_COMPLETED

                      Return Value

                      -

                      Number of jobs

                      +

                      Number of jobs

                      Discussion

                      -

                      A "whichjobs" value of CUPS_WHICHJOBS_ALL returns all jobs regardless +

                      A "whichjobs" value of CUPS_WHICHJOBS_ALL returns all jobs regardless of state, while CUPS_WHICHJOBS_ACTIVE returns jobs that are pending, processing, or held and CUPS_WHICHJOBS_COMPLETED returns jobs that are stopped, canceled, aborted, or completed.

                       CUPS 1.4/macOS 10.6 cupsGetNamedDest

                      -

                      Get options for the named destination.

                      +

                      Get options for the named destination.

                      cups_dest_t *cupsGetNamedDest(http_t *http, const char *name, const char *instance);

                      Parameters

                      - + - + - +
                      httpConnection to server or CUPS_HTTP_DEFAULT
                      Connection to server or CUPS_HTTP_DEFAULT
                      nameDestination name or NULL for the default destination
                      Destination name or NULL for the default destination
                      instanceInstance name or NULL
                      Instance name or NULL

                      Return Value

                      -

                      Destination or NULL

                      +

                      Destination or NULL

                      Discussion

                      -

                      This function is optimized for retrieving a single destination and should +

                      This function is optimized for retrieving a single destination and should be used instead of cupsGetDests2 and cupsGetDest when you either know the name of the destination or want to print to the default destination. If NULL is returned, the destination does not exist or @@ -2049,40 +3076,40 @@

                      cupsGetOption

                      -

                      Get an option value.

                      +

                      Get an option value.

                      const char *cupsGetOption(const char *name, int num_options, cups_option_t *options);

                      Parameters

                      - + - + - +
                      nameName of option
                      Name of option
                      num_optionsNumber of options
                      Number of options
                      optionsOptions
                      Options

                      Return Value

                      -

                      Option value or NULL

                      +

                      Option value or NULL

                       CUPS 1.4/macOS 10.6 cupsGetPassword2

                      -

                      Get a password from the user using the current +

                      Get a password from the user using the current password callback.

                      const char *cupsGetPassword2(const char *prompt, http_t *http, const char *method, const char *resource);

                      Parameters

                      - + - + - + - +
                      promptPrompt string
                      Prompt string
                      httpConnection to server or CUPS_HTTP_DEFAULT
                      Connection to server or CUPS_HTTP_DEFAULT
                      methodRequest method ("GET", "POST", "PUT")
                      Request method ("GET", "POST", "PUT")
                      resourceResource path
                      Resource path

                      Return Value

                      -

                      Password

                      +

                      Password

                      Discussion

                      -

                      Uses the current password callback function. Returns NULL if the +

                      Uses the current password callback function. Returns NULL if the user does not provide a password.

                      Note: The current password callback function is tracked separately for each @@ -2092,165 +3119,385 @@

                       CUPS 2.0/macOS 10.10 cupsLocalizeDestMedia

                      -

                      Get the localized string for a destination media +

                      Get the localized string for a destination media size.

                      const char *cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, cups_size_t *size);

                      Parameters

                      - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      flagsMedia flags
                      Media flags
                      sizeMedia size
                      Media size

                      Return Value

                      -

                      Localized string

                      +

                      Localized string

                      Discussion

                      -

                      The returned string is stored in the destination information and will become +

                      The returned string is stored in the destination information and will become invalid if the destination information is deleted.

                       CUPS 1.6/macOS 10.8 cupsLocalizeDestOption

                      -

                      Get the localized string for a destination +

                      Get the localized string for a destination option.

                      const char *cupsLocalizeDestOption(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);

                      Parameters

                      - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      optionOption to localize
                      Option to localize

                      Return Value

                      -

                      Localized string

                      +

                      Localized string

                      Discussion

                      -

                      The returned string is stored in the destination information and will become +

                      The returned string is stored in the destination information and will become invalid if the destination information is deleted.

                       CUPS 1.6/macOS 10.8 cupsLocalizeDestValue

                      -

                      Get the localized string for a destination +

                      Get the localized string for a destination option+value pair.

                      const char *cupsLocalizeDestValue(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);

                      Parameters

                      - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      dinfoDestination information
                      Destination information
                      optionOption to localize
                      Option to localize
                      valueValue to localize
                      Value to localize

                      Return Value

                      -

                      Localized string

                      +

                      Localized string

                      Discussion

                      -

                      The returned string is stored in the destination information and will become +

                      The returned string is stored in the destination information and will become invalid if the destination information is deleted.

                       CUPS 2.0/OS 10.10 cupsMakeServerCredentials

                      -

                      Make a self-signed certificate and private key pair.

                      +

                      Make a self-signed certificate and private key pair.

                      int cupsMakeServerCredentials(const char *path, const char *common_name, int num_alt_names, const char **alt_names, time_t expiration_date);

                      Parameters

                      - + - + - + - + - +
                      pathKeychain path or NULL for default
                      Keychain path or NULL for default
                      common_nameCommon name
                      Common name
                      num_alt_namesNumber of subject alternate names
                      Number of subject alternate names
                      alt_namesSubject Alternate Names
                      Subject Alternate Names
                      expiration_dateExpiration date
                      Expiration date

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      cupsParseOptions

                      -

                      Parse options from a command-line argument.

                      +

                      Parse options from a command-line argument.

                      int cupsParseOptions(const char *arg, int num_options, cups_option_t **options);

                      Parameters

                      - + - + - +
                      argArgument to parse
                      Argument to parse
                      num_optionsNumber of options
                      Number of options
                      optionsOptions found
                      Options found

                      Return Value

                      -

                      Number of options found

                      +

                      Number of options found

                      Discussion

                      -

                      This function converts space-delimited name/value pairs according +

                      This function converts space-delimited name/value pairs according to the PAPI text option ABNF specification. Collection values ("name={a=... b=... c=...}") are stored with the curley brackets intact - use cupsParseOptions on the value to extract the collection attributes.

                      +

                      cupsRasterClose

                      +

                      Close a raster stream.

                      +

                      +void cupsRasterClose(cups_raster_t *r);

                      +

                      Parameters

                      + + + +
                      rStream to close
                      +

                      Discussion

                      +

                      The file descriptor associated with the raster stream must be closed +separately as needed.

                      +

                       CUPS 1.3/macOS 10.5 cupsRasterErrorString

                      +

                      Return the last error from a raster function.

                      +

                      +const char *cupsRasterErrorString(void);

                      +

                      Return Value

                      +

                      Last error or NULL

                      +

                      Discussion

                      +

                      If there are no recent errors, NULL is returned. + +

                      +

                       CUPS 2.2/macOS 10.12 cupsRasterInitPWGHeader

                      +

                      Initialize a page header for PWG Raster output.

                      +

                      +int cupsRasterInitPWGHeader(cups_page_header2_t *h, pwg_media_t *media, const char *type, int xdpi, int ydpi, const char *sides, const char *sheet_back);

                      +

                      Parameters

                      + + + + + + + + + + + + + + + +
                      hPage header
                      mediaPWG media information
                      typePWG raster type string
                      xdpiCross-feed direction (horizontal) resolution
                      ydpiFeed direction (vertical) resolution
                      sidesIPP "sides" option value
                      sheet_backTransform for back side or NULL for none
                      +

                      Return Value

                      +

                      1 on success, 0 on failure

                      +

                      Discussion

                      +

                      The "media" argument specifies the media to use.
                      +
                      +The "type" argument specifies a "pwg-raster-document-type-supported" value +that controls the color space and bit depth of the raster data.
                      +
                      +The "xres" and "yres" arguments specify the raster resolution in dots per +inch.
                      +
                      +The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value +to apply for the back side of a page. Pass NULL for the front side. + +

                      +

                      cupsRasterOpen

                      +

                      Open a raster stream using a file descriptor.

                      +

                      +cups_raster_t *cupsRasterOpen(int fd, cups_mode_t mode);

                      +

                      Parameters

                      + + + + + +
                      fdFile descriptor
                      modeMode - CUPS_RASTER_READ, +CUPS_RASTER_WRITE, +CUPS_RASTER_WRITE_COMPRESSED, +or CUPS_RASTER_WRITE_PWG
                      +

                      Return Value

                      +

                      New stream

                      +

                      Discussion

                      +

                      This function associates a raster stream with the given file descriptor. +For most printer driver filters, "fd" will be 0 (stdin). For most raster +image processor (RIP) filters that generate raster data, "fd" will be 1 +(stdout).
                      +
                      +When writing raster data, the CUPS_RASTER_WRITE, +CUPS_RASTER_WRITE_COMPRESS, or CUPS_RASTER_WRITE_PWG mode can +be used - compressed and PWG output is generally 25-50% smaller but adds a +100-300% execution time overhead.

                      +

                      cupsRasterOpenIO

                      +

                      Open a raster stream using a callback function.

                      +

                      +cups_raster_t *cupsRasterOpenIO(cups_raster_iocb_t iocb, void *ctx, cups_mode_t mode);

                      +

                      Parameters

                      + + + + + + + +
                      iocbRead/write callback
                      ctxContext pointer for callback
                      modeMode - CUPS_RASTER_READ, +CUPS_RASTER_WRITE, +CUPS_RASTER_WRITE_COMPRESSED, +or CUPS_RASTER_WRITE_PWG
                      +

                      Return Value

                      +

                      New stream

                      +

                      Discussion

                      +

                      This function associates a raster stream with the given callback function and +context pointer.
                      +
                      +When writing raster data, the CUPS_RASTER_WRITE, +CUPS_RASTER_WRITE_COMPRESS, or CUPS_RASTER_WRITE_PWG mode can +be used - compressed and PWG output is generally 25-50% smaller but adds a +100-300% execution time overhead.

                      +

                       DEPRECATED cupsRasterReadHeader

                      +

                      Read a raster page header and store it in a +version 1 page header structure.

                      +

                      +unsigned cupsRasterReadHeader(cups_raster_t *r, cups_page_header_t *h);

                      +

                      Parameters

                      + + + + + +
                      rRaster stream
                      hPointer to header data
                      +

                      Return Value

                      +

                      1 on success, 0 on failure/end-of-file

                      +

                      Discussion

                      +

                      This function is deprecated. Use cupsRasterReadHeader2 instead.
                      +
                      +Version 1 page headers were used in CUPS 1.0 and 1.1 and contain a subset +of the version 2 page header data. This function handles reading version 2 +page headers and copying only the version 1 data into the provided buffer. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsRasterReadHeader2

                      +

                      Read a raster page header and store it in a +version 2 page header structure.

                      +

                      +unsigned cupsRasterReadHeader2(cups_raster_t *r, cups_page_header2_t *h);

                      +

                      Parameters

                      + + + + + +
                      rRaster stream
                      hPointer to header data
                      +

                      Return Value

                      +

                      1 on success, 0 on failure/end-of-file

                      +

                      cupsRasterReadPixels

                      +

                      Read raster pixels.

                      +

                      +unsigned cupsRasterReadPixels(cups_raster_t *r, unsigned char *p, unsigned len);

                      +

                      Parameters

                      + + + + + + + +
                      rRaster stream
                      pPointer to pixel buffer
                      lenNumber of bytes to read
                      +

                      Return Value

                      +

                      Number of bytes read

                      +

                      Discussion

                      +

                      For best performance, filters should read one or more whole lines. +The "cupsBytesPerLine" value from the page header can be used to allocate +the line buffer and as the number of bytes to read.

                      +

                       DEPRECATED cupsRasterWriteHeader

                      +

                      Write a raster page header from a version 1 page +header structure.

                      +

                      +unsigned cupsRasterWriteHeader(cups_raster_t *r, cups_page_header_t *h);

                      +

                      Parameters

                      + + + + + +
                      rRaster stream
                      hRaster page header
                      +

                      Return Value

                      +

                      1 on success, 0 on failure

                      +

                      Discussion

                      +

                      This function is deprecated. Use cupsRasterWriteHeader2 instead. + +

                      +

                       CUPS 1.2/macOS 10.5 cupsRasterWriteHeader2

                      +

                      Write a raster page header from a version 2 +page header structure.

                      +

                      +unsigned cupsRasterWriteHeader2(cups_raster_t *r, cups_page_header2_t *h);

                      +

                      Parameters

                      + + + + + +
                      rRaster stream
                      hRaster page header
                      +

                      Return Value

                      +

                      1 on success, 0 on failure

                      +

                      Discussion

                      +

                      The page header can be initialized using cupsRasterInitPWGHeader. + +

                      +

                      cupsRasterWritePixels

                      +

                      Write raster pixels.

                      +

                      +unsigned cupsRasterWritePixels(cups_raster_t *r, unsigned char *p, unsigned len);

                      +

                      Parameters

                      + + + + + + + +
                      rRaster stream
                      pBytes to write
                      lenNumber of bytes to write
                      +

                      Return Value

                      +

                      Number of bytes written

                      +

                      Discussion

                      +

                      For best performance, filters should write one or more whole lines. +The "cupsBytesPerLine" value from the page header can be used to allocate +the line buffer and as the number of bytes to write.

                       CUPS 1.3/macOS 10.5 cupsRemoveDest

                      -

                      Remove a destination from the destination list.

                      +

                      Remove a destination from the destination list.

                      int cupsRemoveDest(const char *name, const char *instance, int num_dests, cups_dest_t **dests);

                      Parameters

                      - + - + - + - +
                      nameDestination name
                      Destination name
                      instanceInstance name or NULL
                      Instance name or NULL
                      num_destsNumber of destinations
                      Number of destinations
                      destsDestinations
                      Destinations

                      Return Value

                      -

                      New number of destinations

                      +

                      New number of destinations

                      Discussion

                      -

                      Removing a destination/instance does not delete the class or printer +

                      Removing a destination/instance does not delete the class or printer queue, merely the lpoptions for that destination/instance. Use the cupsSetDests or cupsSetDests2 functions to save the new options for the user.

                       CUPS 1.2/macOS 10.5 cupsRemoveOption

                      -

                      Remove an option from an option array.

                      +

                      Remove an option from an option array.

                      int cupsRemoveOption(const char *name, int num_options, cups_option_t **options);

                      Parameters

                      - + - + - +
                      nameOption name
                      Option name
                      num_optionsCurrent number of options
                      Current number of options
                      optionsOptions
                      Options

                      Return Value

                      -

                      New number of options

                      +

                      New number of options

                      cupsServer

                      -

                      Return the hostname/address of the current server.

                      +

                      Return the hostname/address of the current server.

                      const char *cupsServer(void);

                      Return Value

                      -

                      Server name

                      +

                      Server name

                      Discussion

                      -

                      The default server comes from the CUPS_SERVER environment variable, then the +

                      The default server comes from the CUPS_SERVER environment variable, then the ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not set, the default is the local system - either "localhost" or a domain socket path.
                      @@ -2263,18 +3510,18 @@ cupsSetServer function need to do so in each thread for the same server to be used.

                       CUPS 1.5/macOS 10.7 cupsSetClientCertCB

                      -

                      Set the client certificate callback.

                      +

                      Set the client certificate callback.

                      void cupsSetClientCertCB(cups_client_cert_cb_t cb, void *user_data);

                      Parameters

                      - + - +
                      cbCallback function
                      Callback function
                      user_dataUser data pointer
                      User data pointer

                      Discussion

                      -

                      Pass NULL to restore the default callback.
                      +

                      Pass NULL to restore the default callback.

                      Note: The current certificate callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do @@ -2282,69 +3529,69 @@

                       CUPS 1.5/macOS 10.7 cupsSetCredentials

                      -

                      Set the default credentials to be used for SSL/TLS +

                      Set the default credentials to be used for SSL/TLS connections.

                      -int cupsSetCredentials(cups_array_t *credentials);

                      +int cupsSetCredentials(cups_array_t *credentials);

                      Parameters

                      - +
                      credentialsArray of credentials
                      Array of credentials

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                      Discussion

                      -

                      Note: The default credentials are tracked separately for each thread in a +

                      Note: The default credentials are tracked separately for each thread in a program. Multi-threaded programs that override the setting need to do so in each thread for the same setting to be used.

                       CUPS 1.3/macOS 10.5 cupsSetDefaultDest

                      -

                      Set the default destination.

                      +

                      Set the default destination.

                      void cupsSetDefaultDest(const char *name, const char *instance, int num_dests, cups_dest_t *dests);

                      Parameters

                      - + - + - + - +
                      nameDestination name
                      Destination name
                      instanceInstance name or NULL
                      Instance name or NULL
                      num_destsNumber of destinations
                      Number of destinations
                      destsDestinations
                      Destinations

                       CUPS 1.1.21/macOS 10.4 cupsSetDests2

                      -

                      Save the list of destinations for the specified server.

                      +

                      Save the list of destinations for the specified server.

                      int cupsSetDests2(http_t *http, int num_dests, cups_dest_t *dests);

                      Parameters

                      - + - + - +
                      httpConnection to server or CUPS_HTTP_DEFAULT
                      Connection to server or CUPS_HTTP_DEFAULT
                      num_destsNumber of destinations
                      Number of destinations
                      destsDestinations
                      Destinations

                      Return Value

                      -

                      0 on success, -1 on error

                      +

                      0 on success, -1 on error

                      Discussion

                      -

                      This function saves the destinations to /etc/cups/lpoptions when run +

                      This function saves the destinations to /etc/cups/lpoptions when run as root and ~/.cups/lpoptions when run as a normal user.

                      cupsSetEncryption

                      -

                      Set the encryption preference.

                      +

                      Set the encryption preference.

                      void cupsSetEncryption(http_encryption_t e);

                      Parameters

                      - +
                      eNew encryption preference
                      New encryption preference

                      Discussion

                      -

                      The default encryption setting comes from the CUPS_ENCRYPTION +

                      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 HTTP_ENCRYPTION_IF_REQUESTED.
                      @@ -2353,18 +3600,18 @@ in a program. Multi-threaded programs that override the setting need to do so in each thread for the same setting to be used.

                       CUPS 1.4/macOS 10.6 cupsSetPasswordCB2

                      -

                      Set the advanced password callback for CUPS.

                      +

                      Set the advanced password callback for CUPS.

                      void cupsSetPasswordCB2(cups_password_cb2_t cb, void *user_data);

                      Parameters

                      - + - +
                      cbCallback function
                      Callback function
                      user_dataUser data pointer
                      User data pointer

                      Discussion

                      -

                      Pass NULL to restore the default (console) password callback, which +

                      Pass NULL to restore the default (console) password callback, which reads the password from the console. Programs should call either this function or cupsSetPasswordCB2, as only one callback can be registered by a program per thread.
                      @@ -2375,16 +3622,16 @@

                      cupsSetServer

                      -

                      Set the default server name and port.

                      +

                      Set the default server name and port.

                      void cupsSetServer(const char *server);

                      Parameters

                      - +
                      serverServer name
                      Server name

                      Discussion

                      -

                      The "server" string can be a fully-qualified hostname, a numeric +

                      The "server" string can be a fully-qualified hostname, a numeric IPv4 or IPv6 address, or a domain socket pathname. Hostnames and numeric IP addresses can be optionally followed by a colon and port number to override the default port 631, e.g. "hostname:8631". Pass NULL to restore the @@ -2394,18 +3641,18 @@ Multi-threaded programs that override the server need to do so in each thread for the same server to be used.

                       CUPS 1.5/macOS 10.7 cupsSetServerCertCB

                      -

                      Set the server certificate callback.

                      +

                      Set the server certificate callback.

                      void cupsSetServerCertCB(cups_server_cert_cb_t cb, void *user_data);

                      Parameters

                      - + - +
                      cbCallback function
                      Callback function
                      user_dataUser data pointer
                      User data pointer

                      Discussion

                      -

                      Pass NULL to restore the default callback.
                      +

                      Pass NULL to restore the default callback.

                      Note: The current credentials callback is tracked separately for each thread in a program. Multi-threaded programs that override the callback need to do @@ -2413,83 +3660,83 @@

                       CUPS 2.0/macOS 10.10 cupsSetServerCredentials

                      -

                      Set the default server credentials.

                      +

                      Set the default server credentials.

                      int cupsSetServerCredentials(const char *path, const char *common_name, int auto_create);

                      Parameters

                      - + - + - +
                      pathKeychain path or NULL for default
                      Keychain path or NULL for default
                      common_nameDefault common name for server
                      Default common name for server
                      auto_create1 = automatically create self-signed certificates
                      1 = automatically create self-signed certificates

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      Note: The server credentials are used by all threads in the running process. +

                      Note: The server credentials are used by all threads in the running process. This function is threadsafe.

                      cupsSetUser

                      -

                      Set the default user name.

                      +

                      Set the default user name.

                      void cupsSetUser(const char *user);

                      Parameters

                      - +
                      userUser name
                      User name

                      Discussion

                      -

                      Pass NULL to restore the default user name.
                      +

                      Pass NULL to restore the default user name.

                      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.

                       CUPS 1.7/macOS 10.9 cupsSetUserAgent

                      -

                      Set the default HTTP User-Agent string.

                      +

                      Set the default HTTP User-Agent string.

                      void cupsSetUserAgent(const char *user_agent);

                      Parameters

                      - +
                      user_agentUser-Agent string or NULL
                      User-Agent string or NULL

                      Discussion

                      -

                      Setting the string to NULL forces the default value containing the CUPS +

                      Setting the string to NULL forces the default value containing the CUPS version, IPP version, and operating system version and architecture.

                       CUPS 1.6/macOS 10.8 cupsStartDestDocument

                      -

                      Start a new document.

                      +

                      Start a new document.

                      http_status_t cupsStartDestDocument(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, int job_id, const char *docname, const char *format, int num_options, cups_option_t *options, int last_document);

                      Parameters

                      - + - + - + - + - + - + - + - + - +
                      httpConnection to destination
                      Connection to destination
                      destDestination
                      Destination
                      infoDestination information
                      Destination information
                      job_idJob ID
                      Job ID
                      docnameDocument name
                      Document name
                      formatDocument format
                      Document format
                      num_optionsNumber of document options
                      Number of document options
                      optionsDocument options
                      Document options
                      last_document1 if this is the last document
                      1 if this is the last document

                      Return Value

                      -

                      Status of document creation

                      +

                      Status of document creation

                      Discussion

                      -

                      "job_id" is the job ID returned by cupsCreateDestJob. "docname" is the name +

                      "job_id" is the job ID returned by cupsCreateDestJob. "docname" is the name of the document/file being printed, "format" is the MIME media type for the document (see CUPS_FORMAT_xxx constants), and "num_options" and "options" are the options do be applied to the document. "last_document" should be 1 @@ -2498,304 +3745,304 @@

                      cupsUser

                      -

                      Return the current user's name.

                      +

                      Return the current user's name.

                      const char *cupsUser(void);

                      Return Value

                      -

                      User name

                      +

                      User name

                      Discussion

                      -

                      Note: The current user name is tracked separately for each thread in a +

                      Note: The current user name is tracked separately for each thread in a program. Multi-threaded programs that override the user name with the cupsSetUser function need to do so in each thread for the same user name to be used.

                       CUPS 1.7/macOS 10.9 cupsUserAgent

                      -

                      Return the default HTTP User-Agent string.

                      +

                      Return the default HTTP User-Agent string.

                      const char *cupsUserAgent(void);

                      Return Value

                      -

                      User-Agent string

                      +

                      User-Agent string

                       CUPS 1.7/macOS 10.9 httpAcceptConnection

                      -

                      Accept a new HTTP client connection from the +

                      Accept a new HTTP client connection from the specified listening socket.

                      http_t *httpAcceptConnection(int fd, int blocking);

                      Parameters

                      - + -
                      fdListen socket file descriptor
                      Listen socket file descriptor
                      blocking1 if the connection should be +1 if the connection should be blocking, 0 otherwise

                      Return Value

                      -

                      HTTP connection or NULL

                      +

                      HTTP connection or NULL

                       CUPS 1.5/macOS 10.7 httpAddCredential

                      -

                      Allocates and adds a single credential to an array.

                      +

                      Allocates and adds a single credential to an array.

                      -int httpAddCredential(cups_array_t *credentials, const void *data, size_t datalen);

                      +int httpAddCredential(cups_array_t *credentials, const void *data, size_t datalen);

                      Parameters

                      - + - + - +
                      credentialsCredentials array
                      Credentials array
                      dataPEM-encoded X.509 data
                      PEM-encoded X.509 data
                      datalenLength of data
                      Length of data

                      Return Value

                      -

                      0 on success, -1 on error

                      +

                      0 on success, -1 on error

                      Discussion

                      -

                      Use cupsArrayNew(NULL, NULL) to create a credentials array. +

                      Use cupsArrayNew(NULL, NULL) to create a credentials array.

                       CUPS 1.2/macOS 10.5 httpAddrAny

                      -

                      Check for the "any" address.

                      +

                      Check for the "any" address.

                      int httpAddrAny(const http_addr_t *addr);

                      Parameters

                      - +
                      addrAddress to check
                      Address to check

                      Return Value

                      -

                      1 if "any", 0 otherwise

                      +

                      1 if "any", 0 otherwise

                       CUPS 2.0/OS 10.10 httpAddrClose

                      -

                      Close a socket created by httpAddrConnect or +

                      Close a socket created by httpAddrConnect or httpAddrListen.

                      int httpAddrClose(http_addr_t *addr, int fd);

                      Parameters

                      - + - +
                      addrListen address or NULL
                      Listen address or NULL
                      fdSocket file descriptor
                      Socket file descriptor

                      Return Value

                      -

                      0 on success, -1 on failure

                      +

                      0 on success, -1 on failure

                      Discussion

                      -

                      Pass NULL for sockets created with httpAddrConnect2 and the +

                      Pass NULL for sockets created with httpAddrConnect2 and the listen address for sockets created with httpAddrListen. This function ensures that domain sockets are removed when closed.

                       CUPS 1.7/macOS 10.9 httpAddrConnect2

                      -

                      Connect to any of the addresses in the list with a +

                      Connect to any of the addresses in the list with a timeout and optional cancel.

                      http_addrlist_t *httpAddrConnect2(http_addrlist_t *addrlist, int *sock, int msec, int *cancel);

                      Parameters

                      - + - + - + - +
                      addrlistList of potential addresses
                      List of potential addresses
                      sockSocket
                      Socket
                      msecTimeout in milliseconds
                      Timeout in milliseconds
                      cancelPointer to "cancel" variable
                      Pointer to "cancel" variable

                      Return Value

                      -

                      Connected address or NULL on failure

                      +

                      Connected address or NULL on failure

                       CUPS 1.7/macOS 10.9 httpAddrCopyList

                      -

                      Copy an address list.

                      +

                      Copy an address list.

                      http_addrlist_t *httpAddrCopyList(http_addrlist_t *src);

                      Parameters

                      - +
                      srcSource address list
                      Source address list

                      Return Value

                      -

                      New address list or NULL on error

                      +

                      New address list or NULL on error

                       CUPS 1.2/macOS 10.5 httpAddrEqual

                      -

                      Compare two addresses.

                      +

                      Compare two addresses.

                      int httpAddrEqual(const http_addr_t *addr1, const http_addr_t *addr2);

                      Parameters

                      - + - +
                      addr1First address
                      First address
                      addr2Second address
                      Second address

                      Return Value

                      -

                      1 if equal, 0 if not

                      +

                      1 if equal, 0 if not

                      httpAddrFamily

                      -

                      Get the address family of an address.

                      +

                      Get the address family of an address.

                      int httpAddrFamily(http_addr_t *addr);

                      Parameters

                      - +
                      addrAddress
                      Address

                      Return Value

                      -

                      Address family

                      +

                      Address family

                       CUPS 1.2/macOS 10.5 httpAddrFreeList

                      -

                      Free an address list.

                      +

                      Free an address list.

                      void httpAddrFreeList(http_addrlist_t *addrlist);

                      Parameters

                      - +
                      addrlistAddress list to free
                      Address list to free

                       CUPS 1.2/macOS 10.5 httpAddrGetList

                      -

                      Get a list of addresses for a hostname.

                      +

                      Get a list of addresses for a hostname.

                      http_addrlist_t *httpAddrGetList(const char *hostname, int family, const char *service);

                      Parameters

                      - + - + - +
                      hostnameHostname, IP address, or NULL for passive listen address
                      Hostname, IP address, or NULL for passive listen address
                      familyAddress family or AF_UNSPEC
                      Address family or AF_UNSPEC
                      serviceService name or port number
                      Service name or port number

                      Return Value

                      -

                      List of addresses or NULL

                      +

                      List of addresses or NULL

                       CUPS 1.2/macOS 10.5 httpAddrLength

                      -

                      Return the length of the address in bytes.

                      +

                      Return the length of the address in bytes.

                      int httpAddrLength(const http_addr_t *addr);

                      Parameters

                      - +
                      addrAddress
                      Address

                      Return Value

                      -

                      Length in bytes

                      +

                      Length in bytes

                       CUPS 1.7/macOS 10.9 httpAddrListen

                      -

                      Create a listening socket bound to the specified +

                      Create a listening socket bound to the specified address and port.

                      int httpAddrListen(http_addr_t *addr, int port);

                      Parameters

                      - + - +
                      addrAddress to bind to
                      Address to bind to
                      portPort number to bind to
                      Port number to bind to

                      Return Value

                      -

                      Socket or -1 on error

                      +

                      Socket or -1 on error

                       CUPS 1.2/macOS 10.5 httpAddrLocalhost

                      -

                      Check for the local loopback address.

                      +

                      Check for the local loopback address.

                      int httpAddrLocalhost(const http_addr_t *addr);

                      Parameters

                      - +
                      addrAddress to check
                      Address to check

                      Return Value

                      -

                      1 if local host, 0 otherwise

                      +

                      1 if local host, 0 otherwise

                       CUPS 1.2/macOS 10.5 httpAddrLookup

                      -

                      Lookup the hostname associated with the address.

                      +

                      Lookup the hostname associated with the address.

                      char *httpAddrLookup(const http_addr_t *addr, char *name, int namelen);

                      Parameters

                      - + - + - +
                      addrAddress to lookup
                      Address to lookup
                      nameHost name buffer
                      Host name buffer
                      namelenSize of name buffer
                      Size of name buffer

                      Return Value

                      -

                      Host name

                      +

                      Host name

                       CUPS 1.7/macOS 10.9 httpAddrPort

                      -

                      Get the port number associated with an address.

                      +

                      Get the port number associated with an address.

                      int httpAddrPort(http_addr_t *addr);

                      Parameters

                      - +
                      addrAddress
                      Address

                      Return Value

                      -

                      Port number

                      +

                      Port number

                       CUPS 1.2/macOS 10.5 httpAddrString

                      -

                      Convert an address to a numeric string.

                      +

                      Convert an address to a numeric string.

                      char *httpAddrString(const http_addr_t *addr, char *s, int slen);

                      Parameters

                      - + - + - +
                      addrAddress to convert
                      Address to convert
                      sString buffer
                      String buffer
                      slenLength of string
                      Length of string

                      Return Value

                      -

                      Numeric address string

                      +

                      Numeric address string

                       CUPS 1.2/macOS 10.5 httpAssembleURI

                      -

                      Assemble a uniform resource identifier from its +

                      Assemble a uniform resource identifier from its components.

                      http_uri_status_t httpAssembleURI(http_uri_coding_t encoding, char *uri, int urilen, const char *scheme, const char *username, const char *host, int port, const char *resource);

                      Parameters

                      - + - + - + - + - + - + - + - +
                      encodingEncoding flags
                      Encoding flags
                      uriURI buffer
                      URI buffer
                      urilenSize of URI buffer
                      Size of URI buffer
                      schemeScheme name
                      Scheme name
                      usernameUsername
                      Username
                      hostHostname or address
                      Hostname or address
                      portPort number
                      Port number
                      resourceResource
                      Resource

                      Return Value

                      -

                      URI status

                      +

                      URI status

                      Discussion

                      -

                      This function escapes reserved characters in the URI depending on the +

                      This function escapes reserved characters in the URI depending on the value of the "encoding" argument. You should use this function in place of traditional string functions whenever you need to create a URI string.

                       CUPS 1.2/macOS 10.5 httpAssembleURIf

                      -

                      Assemble a uniform resource identifier from its +

                      Assemble a uniform resource identifier from its components with a formatted resource.

                      http_uri_status_t httpAssembleURIf(http_uri_coding_t encoding, char *uri, int urilen, const char *scheme, const char *username, const char *host, int port, const char *resourcef, ...);

                      Parameters

                      - + - + - + - + - + - + - + - + - +
                      encodingEncoding flags
                      Encoding flags
                      uriURI buffer
                      URI buffer
                      urilenSize of URI buffer
                      Size of URI buffer
                      schemeScheme name
                      Scheme name
                      usernameUsername
                      Username
                      hostHostname or address
                      Hostname or address
                      portPort number
                      Port number
                      resourcefPrintf-style resource
                      Printf-style resource
                      ...Additional arguments as needed
                      Additional arguments as needed

                      Return Value

                      -

                      URI status

                      +

                      URI status

                      Discussion

                      -

                      This function creates a formatted version of the resource string +

                      This function creates a formatted version of the resource string argument "resourcef" and escapes reserved characters in the URI depending on the value of the "encoding" argument. You should use this function in place of traditional string functions whenever @@ -2803,28 +4050,28 @@

                       CUPS 1.7/macOS 10.9 httpAssembleUUID

                      -

                      Assemble a name-based UUID URN conforming to RFC 4122.

                      +

                      Assemble a name-based UUID URN conforming to RFC 4122.

                      char *httpAssembleUUID(const char *server, int port, const char *name, int number, char *buffer, size_t bufsize);

                      Parameters

                      - + - + - + - + - + - +
                      serverServer name
                      Server name
                      portPort number
                      Port number
                      nameObject name or NULL
                      Object name or NULL
                      numberObject number or 0
                      Object number or 0
                      bufferString buffer
                      String buffer
                      bufsizeSize of buffer
                      Size of buffer

                      Return Value

                      -

                      UUID string

                      +

                      UUID string

                      Discussion

                      -

                      This function creates a unique 128-bit identifying number using the server +

                      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.

                      @@ -2832,315 +4079,315 @@

                      httpBlocking

                      -

                      Set blocking/non-blocking behavior on a connection.

                      +

                      Set blocking/non-blocking behavior on a connection.

                      void httpBlocking(http_t *http, int b);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      b1 = blocking, 0 = non-blocking
                      1 = blocking, 0 = non-blocking

                      httpCheck

                      -

                      Check to see if there is a pending response from the server.

                      +

                      Check to see if there is a pending response from the server.

                      int httpCheck(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      0 = no data, 1 = data available

                      +

                      0 = no data, 1 = data available

                       CUPS 1.1.19/macOS 10.3 httpClearCookie

                      -

                      Clear the cookie value(s).

                      +

                      Clear the cookie value(s).

                      void httpClearCookie(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      httpClearFields

                      -

                      Clear HTTP request fields.

                      +

                      Clear HTTP request fields.

                      void httpClearFields(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      httpClose

                      -

                      Close an HTTP connection.

                      +

                      Close an HTTP connection.

                      void httpClose(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                       CUPS 2.0/OS 10.10 httpCompareCredentials

                      -

                      Compare two sets of X.509 credentials.

                      +

                      Compare two sets of X.509 credentials.

                      -int httpCompareCredentials(cups_array_t *cred1, cups_array_t *cred2);

                      +int httpCompareCredentials(cups_array_t *cred1, cups_array_t *cred2);

                      Parameters

                      - + - +
                      cred1First set of X.509 credentials
                      First set of X.509 credentials
                      cred2Second set of X.509 credentials
                      Second set of X.509 credentials

                      Return Value

                      -

                      1 if they match, 0 if they do not

                      +

                      1 if they match, 0 if they do not

                       CUPS 1.7/macOS 10.9 httpConnect2

                      -

                      Connect to a HTTP server.

                      +

                      Connect to a HTTP server.

                      http_t *httpConnect2(const char *host, int port, http_addrlist_t *addrlist, int family, http_encryption_t encryption, int blocking, int msec, int *cancel);

                      Parameters

                      - + - + - + - + - + - + - + - +
                      hostHost to connect to
                      Host to connect to
                      portPort number
                      Port number
                      addrlistList of addresses or NULL to lookup
                      List of addresses or NULL to lookup
                      familyAddress family to use or AF_UNSPEC for any
                      Address family to use or AF_UNSPEC for any
                      encryptionType of encryption to use
                      Type of encryption to use
                      blocking1 for blocking connection, 0 for non-blocking
                      1 for blocking connection, 0 for non-blocking
                      msecConnection timeout in milliseconds, 0 means don't connect
                      Connection timeout in milliseconds, 0 means don't connect
                      cancelPointer to "cancel" variable
                      Pointer to "cancel" variable

                      Return Value

                      -

                      New HTTP connection

                      +

                      New HTTP connection

                       CUPS 1.5/macOS 10.7 httpCopyCredentials

                      -

                      Copy the credentials associated with the peer in +

                      Copy the credentials associated with the peer in an encrypted connection.

                      -int httpCopyCredentials(http_t *http, cups_array_t **credentials);

                      +int httpCopyCredentials(http_t *http, cups_array_t **credentials);

                      Parameters

                      - + - +
                      httpConnection to server
                      Connection to server
                      credentialsArray of credentials
                      Array of credentials

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                       CUPS 2.0/macOS 10.10 httpCredentialsAreValidForName

                      -

                      Return whether the credentials are valid for the given name.

                      +

                      Return whether the credentials are valid for the given name.

                      -int httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name);

                      +int httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name);

                      Parameters

                      - + - +
                      credentialsCredentials
                      Credentials
                      common_nameName to check
                      Name to check

                      Return Value

                      -

                      1 if valid, 0 otherwise

                      +

                      1 if valid, 0 otherwise

                       CUPS 2.0/macOS 10.10 httpCredentialsGetExpiration

                      -

                      Return the expiration date of the credentials.

                      +

                      Return the expiration date of the credentials.

                      -time_t httpCredentialsGetExpiration(cups_array_t *credentials);

                      +time_t httpCredentialsGetExpiration(cups_array_t *credentials);

                      Parameters

                      - +
                      credentialsCredentials
                      Credentials

                      Return Value

                      -

                      Expiration date of credentials

                      +

                      Expiration date of credentials

                       CUPS 2.0/macOS 10.10 httpCredentialsGetTrust

                      -

                      Return the trust of credentials.

                      +

                      Return the trust of credentials.

                      -http_trust_t httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name);

                      +http_trust_t httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name);

                      Parameters

                      - + - +
                      credentialsCredentials
                      Credentials
                      common_nameCommon name for trust lookup
                      Common name for trust lookup

                      Return Value

                      -

                      Level of trust

                      +

                      Level of trust

                       CUPS 2.0/macOS 10.10 httpCredentialsString

                      -

                      Return a string representing the credentials.

                      +

                      Return a string representing the credentials.

                      -size_t httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize);

                      +size_t httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize);

                      Parameters

                      - + - + - +
                      credentialsCredentials
                      Credentials
                      bufferBuffer or NULL
                      Buffer or NULL
                      bufsizeSize of buffer
                      Size of buffer

                      Return Value

                      -

                      Total size of credentials string

                      +

                      Total size of credentials string

                       CUPS 1.1.21/macOS 10.4 httpDecode64_2

                      -

                      Base64-decode a string.

                      +

                      Base64-decode a string.

                      char *httpDecode64_2(char *out, int *outlen, const char *in);

                      Parameters

                      - + - + - +
                      outString to write to
                      String to write to
                      outlenSize of output string
                      Size of output string
                      inString to read from
                      String to read from

                      Return Value

                      -

                      Decoded string

                      +

                      Decoded string

                      Discussion

                      -

                      The caller must initialize "outlen" to the maximum size of the decoded +

                      The caller must initialize "outlen" to the maximum size of the decoded string before calling httpDecode64_2. On return "outlen" contains the decoded length of the string.

                      httpDelete

                      -

                      Send a DELETE request to the server.

                      +

                      Send a DELETE request to the server.

                      int httpDelete(http_t *http, const char *uri);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      uriURI to delete
                      URI to delete

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                       CUPS 1.1.21/macOS 10.4 httpEncode64_2

                      -

                      Base64-encode a string.

                      +

                      Base64-encode a string.

                      char *httpEncode64_2(char *out, int outlen, const char *in, int inlen);

                      Parameters

                      - + - + - + - +
                      outString to write to
                      String to write to
                      outlenMaximum size of output string
                      Maximum size of output string
                      inString to read from
                      String to read from
                      inlenSize of input string
                      Size of input string

                      Return Value

                      -

                      Encoded string

                      +

                      Encoded string

                      httpEncryption

                      -

                      Set the required encryption on the link.

                      +

                      Set the required encryption on the link.

                      int httpEncryption(http_t *http, http_encryption_t e);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      eNew encryption preference
                      New encryption preference

                      Return Value

                      -

                      -1 on error, 0 on success

                      +

                      -1 on error, 0 on success

                      httpError

                      -

                      Get the last error on a connection.

                      +

                      Get the last error on a connection.

                      int httpError(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Error code (errno) value

                      +

                      Error code (errno) value

                      httpFieldValue

                      -

                      Return the HTTP field enumeration value for a field +

                      Return the HTTP field enumeration value for a field name.

                      http_field_t httpFieldValue(const char *name);

                      Parameters

                      - +
                      nameString name
                      String name

                      Return Value

                      -

                      Field index

                      +

                      Field index

                      httpFlush

                      -

                      Flush data read from a HTTP connection.

                      +

                      Flush data read from a HTTP connection.

                      void httpFlush(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                       CUPS 1.2/macOS 10.5 httpFlushWrite

                      -

                      Flush data written to a HTTP connection.

                      +

                      Flush data written to a HTTP connection.

                      int httpFlushWrite(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Bytes written or -1 on error

                      +

                      Bytes written or -1 on error

                      httpFreeCredentials

                      -

                      Free an array of credentials.

                      +

                      Free an array of credentials.

                      -void httpFreeCredentials(cups_array_t *credentials);

                      +void httpFreeCredentials(cups_array_t *credentials);

                      Parameters

                      - +
                      credentialsArray of credentials
                      Array of credentials

                      httpGet

                      -

                      Send a GET request to the server.

                      +

                      Send a GET request to the server.

                      int httpGet(http_t *http, const char *uri);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      uriURI to get
                      URI to get

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                       CUPS 2.0/OS 10.10 httpGetActivity

                      -

                      Get the most recent activity for a connection.

                      +

                      Get the most recent activity for a connection.

                      time_t httpGetActivity(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Time of last read or write

                      +

                      Time of last read or write

                      Discussion

                      -

                      The return value is the time in seconds of the last read or write. +

                      The return value is the time in seconds of the last read or write.

                       CUPS 2.0/OS 10.10 httpGetAddress

                      -

                      Get the address of the connected peer of a connection.

                      +

                      Get the address of the connected peer of a connection.

                      http_addr_t *httpGetAddress(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Connected address or NULL

                      +

                      Connected address or NULL

                      Discussion

                      -

                      For connections created with httpConnect2, the address is for the +

                      For connections created with httpConnect2, the address is for the server. For connections created with httpAccept, the address is for the client.

                      @@ -3148,166 +4395,166 @@

                       CUPS 1.3/macOS 10.5 httpGetAuthString

                      -

                      Get the current authorization string.

                      +

                      Get the current authorization string.

                      char *httpGetAuthString(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Authorization string

                      +

                      Authorization string

                      Discussion

                      -

                      The authorization string is set by cupsDoAuthentication and +

                      The authorization string is set by cupsDoAuthentication and httpSetAuthString. Use httpGetAuthString to retrieve the string to use with httpSetField for the HTTP_FIELD_AUTHORIZATION value.

                       CUPS 1.2/macOS 10.5 httpGetBlocking

                      -

                      Get the blocking/non-block state of a connection.

                      +

                      Get the blocking/non-block state of a connection.

                      int httpGetBlocking(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      1 if blocking, 0 if non-blocking

                      +

                      1 if blocking, 0 if non-blocking

                       CUPS 1.7/macOS 10.9 httpGetContentEncoding

                      -

                      Get a common content encoding, if any, between +

                      Get a common content encoding, if any, between the client and server.

                      const char *httpGetContentEncoding(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Content-Coding value or +

                      Content-Coding value or NULL for the identity coding.

                      Discussion

                      -

                      This function uses the value of the Accepts-Encoding HTTP header and must be +

                      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.

                       CUPS 1.1.19/macOS 10.3 httpGetCookie

                      -

                      Get any cookie data from the response.

                      +

                      Get any cookie data from the response.

                      const char *httpGetCookie(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Cookie data or NULL

                      +

                      Cookie data or NULL

                       CUPS 1.2/macOS 10.5 httpGetDateString2

                      -

                      Get a formatted date/time string from a time value.

                      +

                      Get a formatted date/time string from a time value.

                      const char *httpGetDateString2(time_t t, char *s, int slen);

                      Parameters

                      - + - + - +
                      tTime in seconds
                      Time in seconds
                      sString buffer
                      String buffer
                      slenSize of string buffer
                      Size of string buffer

                      Return Value

                      -

                      Date/time string

                      +

                      Date/time string

                      httpGetDateTime

                      -

                      Get a time value from a formatted date/time string.

                      +

                      Get a time value from a formatted date/time string.

                      time_t httpGetDateTime(const char *s);

                      Parameters

                      - +
                      sDate/time string
                      Date/time string

                      Return Value

                      -

                      Time in seconds

                      +

                      Time in seconds

                       CUPS 2.0/OS 10.10 httpGetEncryption

                      -

                      Get the current encryption mode of a connection.

                      +

                      Get the current encryption mode of a connection.

                      http_encryption_t httpGetEncryption(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Current encryption mode

                      +

                      Current encryption mode

                      Discussion

                      -

                      This function returns the encryption mode for the connection. Use the +

                      This function returns the encryption mode for the connection. Use the httpIsEncrypted function to determine whether a TLS session has been established.

                       CUPS 1.7/macOS 10.9 httpGetExpect

                      -

                      Get the value of the Expect header, if any.

                      +

                      Get the value of the Expect header, if any.

                      http_status_t httpGetExpect(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Expect: status, if any

                      +

                      Expect: status, if any

                      Discussion

                      -

                      Returns HTTP_STATUS_NONE if there is no Expect header, otherwise +

                      Returns HTTP_STATUS_NONE if there is no Expect header, otherwise returns the expected HTTP status code, typically HTTP_STATUS_CONTINUE.

                       CUPS 1.2/macOS 10.5 httpGetFd

                      -

                      Get the file descriptor associated with a connection.

                      +

                      Get the file descriptor associated with a connection.

                      int httpGetFd(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      File descriptor or -1 if none

                      +

                      File descriptor or -1 if none

                      httpGetField

                      -

                      Get a field value from a request/response.

                      +

                      Get a field value from a request/response.

                      const char *httpGetField(http_t *http, http_field_t field);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      fieldField to get
                      Field to get

                      Return Value

                      -

                      Field value

                      +

                      Field value

                       CUPS 1.2/macOS 10.5 httpGetHostname

                      -

                      Get the FQDN for the connection or local system.

                      +

                      Get the FQDN for the connection or local system.

                      const char *httpGetHostname(http_t *http, char *s, int slen);

                      Parameters

                      - + - + - +
                      httpHTTP connection or NULL
                      HTTP connection or NULL
                      sString buffer for name
                      String buffer for name
                      slenSize of buffer
                      Size of buffer

                      Return Value

                      -

                      FQDN for connection or system

                      +

                      FQDN for connection or system

                      Discussion

                      -

                      When "http" points to a connected socket, return the hostname or +

                      When "http" points to a connected socket, return the hostname or 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() @@ -3315,233 +4562,233 @@

                       CUPS 2.0/OS 10.10 httpGetKeepAlive

                      -

                      Get the current Keep-Alive state of the connection.

                      +

                      Get the current Keep-Alive state of the connection.

                      http_keepalive_t httpGetKeepAlive(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Keep-Alive state

                      +

                      Keep-Alive state

                       CUPS 1.2/macOS 10.5 httpGetLength2

                      -

                      Get the amount of data remaining from the +

                      Get the amount of data remaining from the content-length or transfer-encoding fields.

                      off_t httpGetLength2(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Content length

                      +

                      Content length

                      Discussion

                      -

                      This function returns the complete content length, even for +

                      This function returns the complete content length, even for content larger than 2^31 - 1.

                       CUPS 2.0/OS 10.10 httpGetPending

                      -

                      Get the number of bytes that are buffered for writing.

                      +

                      Get the number of bytes that are buffered for writing.

                      size_t httpGetPending(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Number of bytes buffered

                      +

                      Number of bytes buffered

                       CUPS 2.0/OS 10.10 httpGetReady

                      -

                      Get the number of bytes that can be read without blocking.

                      +

                      Get the number of bytes that can be read without blocking.

                      size_t httpGetReady(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Number of bytes available

                      +

                      Number of bytes available

                       CUPS 2.0/OS 10.10 httpGetRemaining

                      -

                      Get the number of remaining bytes in the message +

                      Get the number of remaining bytes in the message body or current chunk.

                      size_t httpGetRemaining(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Remaining bytes

                      +

                      Remaining bytes

                      Discussion

                      -

                      The httpIsChunked function can be used to determine whether the +

                      The httpIsChunked function can be used to determine whether the message body is chunked or fixed-length.

                      httpGetState

                      -

                      Get the current state of the HTTP request.

                      +

                      Get the current state of the HTTP request.

                      http_state_t httpGetState(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      HTTP state

                      +

                      HTTP state

                       CUPS 1.2/macOS 10.5 httpGetStatus

                      -

                      Get the status of the last HTTP request.

                      +

                      Get the status of the last HTTP request.

                      http_status_t httpGetStatus(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      HTTP status

                      +

                      HTTP status

                       CUPS 1.2/macOS 10.5 httpGetSubField2

                      -

                      Get a sub-field value.

                      +

                      Get a sub-field value.

                      char *httpGetSubField2(http_t *http, http_field_t field, const char *name, char *value, int valuelen);

                      Parameters

                      - + - + - + - + - +
                      httpHTTP connection
                      HTTP connection
                      fieldField index
                      Field index
                      nameName of sub-field
                      Name of sub-field
                      valueValue string
                      Value string
                      valuelenSize of value buffer
                      Size of value buffer

                      Return Value

                      -

                      Value or NULL

                      +

                      Value or NULL

                      httpGetVersion

                      -

                      Get the HTTP version at the other end.

                      +

                      Get the HTTP version at the other end.

                      http_version_t httpGetVersion(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Version number

                      +

                      Version number

                      httpGets

                      -

                      Get a line of text from a HTTP connection.

                      +

                      Get a line of text from a HTTP connection.

                      char *httpGets(char *line, int length, http_t *http);

                      Parameters

                      - + - + - +
                      lineLine to read into
                      Line to read into
                      lengthMax length of buffer
                      Max length of buffer
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      Line or NULL

                      +

                      Line or NULL

                      httpHead

                      -

                      Send a HEAD request to the server.

                      +

                      Send a HEAD request to the server.

                      int httpHead(http_t *http, const char *uri);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      uriURI for head
                      URI for head

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                      httpInitialize

                      -

                      Initialize the HTTP interface library and set the +

                      Initialize the HTTP interface library and set the default HTTP proxy (if any).

                      void httpInitialize(void);

                       CUPS 2.0/OS 10.10 httpIsChunked

                      -

                      Report whether a message body is chunked.

                      +

                      Report whether a message body is chunked.

                      int httpIsChunked(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      1 if chunked, 0 if not

                      +

                      1 if chunked, 0 if not

                      Discussion

                      -

                      This function returns non-zero if the message body is composed of +

                      This function returns non-zero if the message body is composed of variable-length chunks.

                       CUPS 2.0/OS 10.10 httpIsEncrypted

                      -

                      Report whether a connection is encrypted.

                      +

                      Report whether a connection is encrypted.

                      int httpIsEncrypted(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      1 if encrypted, 0 if not

                      +

                      1 if encrypted, 0 if not

                      Discussion

                      -

                      This function returns non-zero if the connection is currently encrypted. +

                      This function returns non-zero if the connection is currently encrypted.

                       CUPS 2.0/OS 10.10 httpLoadCredentials

                      -

                      Load X.509 credentials from a keychain file.

                      +

                      Load X.509 credentials from a keychain file.

                      -int httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name);

                      +int httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name);

                      Parameters

                      - + - + - +
                      pathKeychain path or NULL for default
                      Keychain path or NULL for default
                      credentialsCredentials
                      Credentials
                      common_nameCommon name for credentials
                      Common name for credentials

                      Return Value

                      -

                      0 on success, -1 on error

                      +

                      0 on success, -1 on error

                      httpOptions

                      -

                      Send an OPTIONS request to the server.

                      +

                      Send an OPTIONS request to the server.

                      int httpOptions(http_t *http, const char *uri);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      uriURI for options
                      URI for options

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                       CUPS 1.7/macOS 10.9 httpPeek

                      -

                      Peek at data from a HTTP connection.

                      +

                      Peek at data from a HTTP connection.

                      ssize_t httpPeek(http_t *http, char *buffer, size_t length);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      bufferBuffer for data
                      Buffer for data
                      lengthMaximum number of bytes
                      Maximum number of bytes

                      Return Value

                      -

                      Number of bytes copied

                      +

                      Number of bytes copied

                      Discussion

                      -

                      This function copies available data from the given HTTP connection, reading +

                      This function copies available data from the given HTTP connection, reading a buffer as needed. The data is still available for reading using httpRead2.

                      @@ -3549,155 +4796,155 @@

                      httpPost

                      -

                      Send a POST request to the server.

                      +

                      Send a POST request to the server.

                      int httpPost(http_t *http, const char *uri);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      uriURI for post
                      URI for post

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                      httpPut

                      -

                      Send a PUT request to the server.

                      +

                      Send a PUT request to the server.

                      int httpPut(http_t *http, const char *uri);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      uriURI to put
                      URI to put

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                       CUPS 1.2/macOS 10.5 httpRead2

                      -

                      Read data from a HTTP connection.

                      +

                      Read data from a HTTP connection.

                      ssize_t httpRead2(http_t *http, char *buffer, size_t length);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      bufferBuffer for data
                      Buffer for data
                      lengthMaximum number of bytes
                      Maximum number of bytes

                      Return Value

                      -

                      Number of bytes read

                      +

                      Number of bytes read

                       CUPS 1.7/macOS 10.9 httpReadRequest

                      -

                      Read a HTTP request from a connection.

                      +

                      Read a HTTP request from a connection.

                      http_state_t httpReadRequest(http_t *http, char *uri, size_t urilen);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      uriURI buffer
                      URI buffer
                      urilenSize of URI buffer
                      Size of URI buffer

                      Return Value

                      -

                      New state of connection

                      +

                      New state of connection

                      httpReconnect2

                      -

                      Reconnect to a HTTP server with timeout and optional +

                      Reconnect to a HTTP server with timeout and optional cancel.

                      int httpReconnect2(http_t *http, int msec, int *cancel);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      msecTimeout in milliseconds
                      Timeout in milliseconds
                      cancelPointer to "cancel" variable
                      Pointer to "cancel" variable

                      Return Value

                      -

                      0 on success, non-zero on failure

                      +

                      0 on success, non-zero on failure

                       CUPS 2.0/OS 10.10 httpResolveHostname

                      -

                      Resolve the hostname of the HTTP connection +

                      Resolve the hostname of the HTTP connection address.

                      const char *httpResolveHostname(http_t *http, char *buffer, size_t bufsize);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      bufferHostname buffer
                      Hostname buffer
                      bufsizeSize of buffer
                      Size of buffer

                      Return Value

                      -

                      Resolved hostname or NULL

                      +

                      Resolved hostname or NULL

                       CUPS 2.0/OS 10.10 httpSaveCredentials

                      -

                      Save X.509 credentials to a keychain file.

                      +

                      Save X.509 credentials to a keychain file.

                      -int httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name);

                      +int httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name);

                      Parameters

                      - + - + - +
                      pathKeychain path or NULL for default
                      Keychain path or NULL for default
                      credentialsCredentials
                      Credentials
                      common_nameCommon name for credentials
                      Common name for credentials

                      Return Value

                      -

                      -1 on error, 0 on success

                      +

                      -1 on error, 0 on success

                       CUPS 1.2/macOS 10.5 httpSeparateURI

                      -

                      Separate a Universal Resource Identifier into its +

                      Separate a Universal Resource Identifier into its components.

                      http_uri_status_t httpSeparateURI(http_uri_coding_t decoding, const char *uri, char *scheme, int schemelen, char *username, int usernamelen, char *host, int hostlen, int *port, char *resource, int resourcelen);

                      Parameters

                      - + - + - + - + - + - + - + - + - + - + - +
                      decodingDecoding flags
                      Decoding flags
                      uriUniversal Resource Identifier
                      Universal Resource Identifier
                      schemeScheme (http, https, etc.)
                      Scheme (http, https, etc.)
                      schemelenSize of scheme buffer
                      Size of scheme buffer
                      usernameUsername
                      Username
                      usernamelenSize of username buffer
                      Size of username buffer
                      hostHostname
                      Hostname
                      hostlenSize of hostname buffer
                      Size of hostname buffer
                      portPort number to use
                      Port number to use
                      resourceResource/filename
                      Resource/filename
                      resourcelenSize of resource buffer
                      Size of resource buffer

                      Return Value

                      -

                      Result of separation

                      +

                      Result of separation

                       CUPS 1.3/macOS 10.5 httpSetAuthString

                      -

                      Set the current authorization string.

                      +

                      Set the current authorization string.

                      void httpSetAuthString(http_t *http, const char *scheme, const char *data);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      schemeAuth scheme (NULL to clear it)
                      Auth scheme (NULL to clear it)
                      dataAuth data (NULL for none)
                      Auth data (NULL for none)

                      Discussion

                      -

                      This function just stores a copy of the current authorization string in +

                      This function just stores a copy of the current authorization string in the HTTP connection object. You must still call httpSetField to set HTTP_FIELD_AUTHORIZATION prior to issuing a HTTP request using httpGet, httpHead, httpOptions, httpPost, or @@ -3705,237 +4952,237 @@

                       CUPS 1.1.19/macOS 10.3 httpSetCookie

                      -

                      Set the cookie value(s).

                      +

                      Set the cookie value(s).

                      void httpSetCookie(http_t *http, const char *cookie);

                      Parameters

                      - + - +
                      httpConnection
                      Connection
                      cookieCookie string
                      Cookie string

                       CUPS 1.5/macOS 10.7 httpSetCredentials

                      -

                      Set the credentials associated with an encrypted +

                      Set the credentials associated with an encrypted connection.

                      -int httpSetCredentials(http_t *http, cups_array_t *credentials);

                      +int httpSetCredentials(http_t *http, cups_array_t *credentials);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      credentialsArray of credentials
                      Array of credentials

                      Return Value

                      -

                      Status of call (0 = success)

                      +

                      Status of call (0 = success)

                       CUPS 1.7/macOS 10.9 httpSetDefaultField

                      -

                      Set the default value of an HTTP header.

                      +

                      Set the default value of an HTTP header.

                      void httpSetDefaultField(http_t *http, http_field_t field, const char *value);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      fieldField index
                      Field index
                      valueValue
                      Value

                      Discussion

                      -

                      Currently only HTTP_FIELD_ACCEPT_ENCODING, HTTP_FIELD_SERVER, +

                      Currently only HTTP_FIELD_ACCEPT_ENCODING, HTTP_FIELD_SERVER, and HTTP_FIELD_USER_AGENT can be set.

                       CUPS 1.2/macOS 10.5 httpSetExpect

                      -

                      Set the Expect: header in a request.

                      +

                      Set the Expect: header in a request.

                      void httpSetExpect(http_t *http, http_status_t expect);

                      Parameters

                      - + -
                      httpHTTP connection
                      HTTP connection
                      expectHTTP status to expect +HTTP status to expect (HTTP_STATUS_CONTINUE)

                      Discussion

                      -

                      Currently only HTTP_STATUS_CONTINUE is supported for the "expect" +

                      Currently only HTTP_STATUS_CONTINUE is supported for the "expect" argument.

                      httpSetField

                      -

                      Set the value of an HTTP header.

                      +

                      Set the value of an HTTP header.

                      void httpSetField(http_t *http, http_field_t field, const char *value);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      fieldField index
                      Field index
                      valueValue
                      Value

                       CUPS 2.0/OS 10.10 httpSetKeepAlive

                      -

                      Set the current Keep-Alive state of a connection.

                      +

                      Set the current Keep-Alive state of a connection.

                      void httpSetKeepAlive(http_t *http, http_keepalive_t keep_alive);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      keep_aliveNew Keep-Alive value
                      New Keep-Alive value

                       CUPS 1.2/macOS 10.5 httpSetLength

                      -

                      Set the content-length and content-encoding.

                      +

                      Set the content-length and content-encoding.

                      void httpSetLength(http_t *http, size_t length);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      lengthLength (0 for chunked)
                      Length (0 for chunked)

                       CUPS 1.5/macOS 10.7 httpSetTimeout

                      -

                      Set read/write timeouts and an optional callback.

                      +

                      Set read/write timeouts and an optional callback.

                      void httpSetTimeout(http_t *http, double timeout, http_timeout_cb_t cb, void *user_data);

                      Parameters

                      - + - - + - +
                      httpHTTP connection
                      HTTP connection
                      timeoutNumber of seconds for timeout, +Number of seconds for timeout, must be greater than 0
                      cbCallback function or NULL
                      Callback function or NULL
                      user_dataUser data pointer
                      User data pointer

                      Discussion

                      -

                      The optional timeout callback receives both the HTTP connection and a user +

                      The optional timeout callback receives both the HTTP connection and a user data pointer and must return 1 to continue or 0 to error (time) out.

                       CUPS 2.0/OS 10.10 httpShutdown

                      -

                      Shutdown one side of an HTTP connection.

                      +

                      Shutdown one side of an HTTP connection.

                      void httpShutdown(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                       CUPS 2.0/OS 10.10 httpStateString

                      -

                      Return the string describing a HTTP state value.

                      +

                      Return the string describing a HTTP state value.

                      const char *httpStateString(http_state_t state);

                      Parameters

                      - +
                      stateHTTP state value
                      HTTP state value

                      Return Value

                      -

                      State string

                      +

                      State string

                      httpStatus

                      -

                      Return a short string describing a HTTP status code.

                      +

                      Return a short string describing a HTTP status code.

                      const char *httpStatus(http_status_t status);

                      Parameters

                      - +
                      statusHTTP status code
                      HTTP status code

                      Return Value

                      -

                      Localized status string

                      +

                      Localized status string

                      Discussion

                      -

                      The returned string is localized to the current POSIX locale and is based +

                      The returned string is localized to the current POSIX locale and is based on the status strings defined in RFC 7231.

                       CUPS 2.0/OS 10.10 httpURIStatusString

                      -

                      Return a string describing a URI status code.

                      +

                      Return a string describing a URI status code.

                      const char *httpURIStatusString(http_uri_status_t status);

                      Parameters

                      - +
                      statusURI status code
                      URI status code

                      Return Value

                      -

                      Localized status string

                      +

                      Localized status string

                      httpUpdate

                      -

                      Update the current HTTP state for incoming data.

                      +

                      Update the current HTTP state for incoming data.

                      http_status_t httpUpdate(http_t *http);

                      Parameters

                      - +
                      httpHTTP connection
                      HTTP connection

                      Return Value

                      -

                      HTTP status

                      +

                      HTTP status

                       CUPS 1.1.19/macOS 10.3 httpWait

                      -

                      Wait for data available on a connection.

                      +

                      Wait for data available on a connection.

                      int httpWait(http_t *http, int msec);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      msecMilliseconds to wait
                      Milliseconds to wait

                      Return Value

                      -

                      1 if data is available, 0 otherwise

                      +

                      1 if data is available, 0 otherwise

                       CUPS 1.2/macOS 10.5 httpWrite2

                      -

                      Write data to a HTTP connection.

                      +

                      Write data to a HTTP connection.

                      ssize_t httpWrite2(http_t *http, const char *buffer, size_t length);

                      Parameters

                      - + - + - +
                      httpHTTP connection
                      HTTP connection
                      bufferBuffer for data
                      Buffer for data
                      lengthNumber of bytes to write
                      Number of bytes to write

                      Return Value

                      -

                      Number of bytes written

                      +

                      Number of bytes written

                       CUPS 1.7/macOS 10.9 httpWriteResponse

                      -

                      Write a HTTP response to a client connection.

                      +

                      Write a HTTP response to a client connection.

                      int httpWriteResponse(http_t *http, http_status_t status);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      statusStatus code
                      Status code

                      Return Value

                      -

                      0 on success, -1 on error

                      +

                      0 on success, -1 on error

                      ippAddBoolean

                      -

                      Add a boolean attribute to an IPP message.

                      +

                      Add a boolean attribute to an IPP message.

                      ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, const char *name, char value);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      valueValue of attribute
                      Value of attribute

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -3944,26 +5191,26 @@ (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

                      ippAddBooleans

                      -

                      Add an array of boolean values.

                      +

                      Add an array of boolean values.

                      ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const char *values);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      num_valuesNumber of values
                      Number of values
                      valuesValues
                      Values

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -3972,24 +5219,24 @@ (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

                       CUPS 1.1.19/macOS 10.3 ippAddCollection

                      -

                      Add a collection value.

                      +

                      Add a collection value.

                      ipp_attribute_t *ippAddCollection(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_t *value);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      valueValue
                      Value

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4000,26 +5247,26 @@

                       CUPS 1.1.19/macOS 10.3 ippAddCollections

                      -

                      Add an array of collection values.

                      +

                      Add an array of collection values.

                      ipp_attribute_t *ippAddCollections(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const ipp_t **values);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      num_valuesNumber of values
                      Number of values
                      valuesValues
                      Values

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4030,24 +5277,24 @@

                      ippAddDate

                      -

                      Add a dateTime attribute to an IPP message.

                      +

                      Add a dateTime attribute to an IPP message.

                      ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, const char *name, const ipp_uchar_t *value);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      valueValue
                      Value

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4056,26 +5303,26 @@ (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

                      ippAddInteger

                      -

                      Add a integer attribute to an IPP message.

                      +

                      Add a integer attribute to an IPP message.

                      ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int value);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      value_tagType of attribute
                      Type of attribute
                      nameName of attribute
                      Name of attribute
                      valueValue of attribute
                      Value of attribute

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4087,28 +5334,28 @@ Supported values include enum (IPP_TAG_ENUM) and integer (IPP_TAG_INTEGER).

                      ippAddIntegers

                      -

                      Add an array of integer values.

                      +

                      Add an array of integer values.

                      ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int num_values, const int *values);

                      Parameters

                      - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      value_tagType of attribute
                      Type of attribute
                      nameName of attribute
                      Name of attribute
                      num_valuesNumber of values
                      Number of values
                      valuesValues
                      Values

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4120,26 +5367,26 @@ Supported values include enum (IPP_TAG_ENUM) and integer (IPP_TAG_INTEGER).

                       CUPS 1.2/macOS 10.5 ippAddOctetString

                      -

                      Add an octetString value to an IPP message.

                      +

                      Add an octetString value to an IPP message.

                      ipp_attribute_t *ippAddOctetString(ipp_t *ipp, ipp_tag_t group, const char *name, const void *data, int datalen);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      dataoctetString data
                      octetString data
                      datalenLength of data in bytes
                      Length of data in bytes

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4150,24 +5397,24 @@

                       CUPS 1.6/macOS 10.8 ippAddOutOfBand

                      -

                      Add an out-of-band value to an IPP message.

                      +

                      Add an out-of-band value to an IPP message.

                      ipp_attribute_t *ippAddOutOfBand(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      value_tagType of attribute
                      Type of attribute
                      nameName of attribute
                      Name of attribute

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4184,26 +5431,26 @@

                      ippAddRange

                      -

                      Add a range of values to an IPP message.

                      +

                      Add a range of values to an IPP message.

                      ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, const char *name, int lower, int upper);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      lowerLower value
                      Lower value
                      upperUpper value
                      Upper value

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4214,28 +5461,28 @@
                      The lower parameter must be less than or equal to the upper parameter.

                      ippAddRanges

                      -

                      Add ranges of values to an IPP message.

                      +

                      Add ranges of values to an IPP message.

                      ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const int *lower, const int *upper);

                      Parameters

                      - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      num_valuesNumber of values
                      Number of values
                      lowerLower values
                      Lower values
                      upperUpper values
                      Upper values

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4244,28 +5491,28 @@ (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

                      ippAddResolution

                      -

                      Add a resolution value to an IPP message.

                      +

                      Add a resolution value to an IPP message.

                      ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_res_t units, int xres, int yres);

                      Parameters

                      - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      unitsUnits for resolution
                      Units for resolution
                      xresX resolution
                      X resolution
                      yresY resolution
                      Y resolution

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4274,30 +5521,30 @@ (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

                      ippAddResolutions

                      -

                      Add resolution values to an IPP message.

                      +

                      Add resolution values to an IPP message.

                      ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, ipp_res_t units, const int *xres, const int *yres);

                      Parameters

                      - + - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      nameName of attribute
                      Name of attribute
                      num_valuesNumber of values
                      Number of values
                      unitsUnits for resolution
                      Units for resolution
                      xresX resolutions
                      X resolutions
                      yresY resolutions
                      Y resolutions

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4306,42 +5553,42 @@ (IPP_TAG_OPERATION), printer (IPP_TAG_PRINTER), subscription (IPP_TAG_SUBSCRIPTION), or unsupported (IPP_TAG_UNSUPPORTED_GROUP).

                      ippAddSeparator

                      -

                      Add a group separator to an IPP message.

                      +

                      Add a group separator to an IPP message.

                      ipp_attribute_t *ippAddSeparator(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP message
                      IPP message

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      ippAddString

                      -

                      Add a language-encoded string to an IPP message.

                      +

                      Add a language-encoded string to an IPP message.

                      ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *value);

                      Parameters

                      - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      value_tagType of attribute
                      Type of attribute
                      nameName of attribute
                      Name of attribute
                      languageLanguage code
                      Language code
                      valueValue
                      Value

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4360,30 +5607,30 @@ The language parameter must be non-NULL for nameWithLanguage and textWithLanguage string values and must be NULL for all other string values.

                       CUPS 1.7/macOS 10.9 ippAddStringf

                      -

                      Add a formatted string to an IPP message.

                      +

                      Add a formatted string to an IPP message.

                      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, ...);

                      Parameters

                      - + - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      value_tagType of attribute
                      Type of attribute
                      nameName of attribute
                      Name of attribute
                      languageLanguage code (NULL for default)
                      Language code (NULL for default)
                      formatPrintf-style format string
                      Printf-style format string
                      ...Additional arguments as needed
                      Additional arguments as needed

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4411,30 +5658,30 @@

                       CUPS 1.7/macOS 10.9 ippAddStringfv

                      -

                      Add a formatted string to an IPP message.

                      +

                      Add a formatted string to an IPP message.

                      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);

                      Parameters

                      - + - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      value_tagType of attribute
                      Type of attribute
                      nameName of attribute
                      Name of attribute
                      languageLanguage code (NULL for default)
                      Language code (NULL for default)
                      formatPrintf-style format string
                      Printf-style format string
                      apAdditional arguments
                      Additional arguments

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4462,30 +5709,30 @@

                      ippAddStrings

                      -

                      Add language-encoded strings to an IPP message.

                      +

                      Add language-encoded strings to an IPP message.

                      ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int num_values, const char *language, const char *const *values);

                      Parameters

                      - + - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      groupIPP group
                      IPP group
                      value_tagType of attribute
                      Type of attribute
                      nameName of attribute
                      Name of attribute
                      num_valuesNumber of values
                      Number of values
                      languageLanguage code (NULL for default)
                      Language code (NULL for default)
                      valuesValues
                      Values

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The group parameter specifies the IPP attribute group tag: none @@ -4504,108 +5751,108 @@ The language parameter must be non-NULL for nameWithLanguage and textWithLanguage string values and must be NULL for all other string values.

                       CUPS 1.6/macOS 10.8 ippAttributeString

                      -

                      Convert the attribute's value to a string.

                      +

                      Convert the attribute's value to a string.

                      size_t ippAttributeString(ipp_attribute_t *attr, char *buffer, size_t bufsize);

                      Parameters

                      - + - + - +
                      attrAttribute
                      Attribute
                      bufferString buffer or NULL
                      String buffer or NULL
                      bufsizeSize of string buffer
                      Size of string buffer

                      Return Value

                      -

                      Number of bytes less nul

                      +

                      Number of bytes less nul

                      Discussion

                      -

                      Returns the number of bytes that would be written, not including the +

                      Returns the number of bytes that would be written, not including the trailing nul. The buffer pointer can be NULL to get the required length, just like (v)snprintf.

                       CUPS 1.7/macOS 10.9 ippContainsInteger

                      -

                      Determine whether an attribute contains the +

                      Determine whether an attribute contains the specified value or is within the list of ranges.

                      int ippContainsInteger(ipp_attribute_t *attr, int value);

                      Parameters

                      - + - +
                      attrAttribute
                      Attribute
                      valueInteger/enum value
                      Integer/enum value

                      Return Value

                      -

                      1 on a match, 0 on no match

                      +

                      1 on a match, 0 on no match

                      Discussion

                      -

                      Returns non-zero when the attribute contains either a matching integer or +

                      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.

                       CUPS 1.7/macOS 10.9 ippContainsString

                      -

                      Determine whether an attribute contains the +

                      Determine whether an attribute contains the specified string value.

                      int ippContainsString(ipp_attribute_t *attr, const char *value);

                      Parameters

                      - + - +
                      attrAttribute
                      Attribute
                      valueString value
                      String value

                      Return Value

                      -

                      1 on a match, 0 on no match

                      +

                      1 on a match, 0 on no match

                      Discussion

                      -

                      Returns non-zero when the attribute contains a matching charset, keyword, +

                      Returns non-zero when the attribute contains a matching charset, keyword, naturalLanguage, mimeMediaType, name, text, uri, or uriScheme value.

                       CUPS 1.6/macOS 10.8 ippCopyAttribute

                      -

                      Copy an attribute.

                      +

                      Copy an attribute.

                      ipp_attribute_t *ippCopyAttribute(ipp_t *dst, ipp_attribute_t *srcattr, int quickcopy);

                      Parameters

                      - + - + - +
                      dstDestination IPP message
                      Destination IPP message
                      srcattrAttribute to copy
                      Attribute to copy
                      quickcopy1 for a referenced copy, 0 for normal
                      1 for a referenced copy, 0 for normal

                      Return Value

                      -

                      New attribute

                      +

                      New attribute

                      Discussion

                      -

                      The specified attribute, attr, is copied to the destination IPP message. +

                      The specified attribute, attr, is copied to the destination IPP message. When 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.

                       CUPS 1.6/macOS 10.8 ippCopyAttributes

                      -

                      Copy attributes from one IPP message to another.

                      +

                      Copy attributes from one IPP message to another.

                      int ippCopyAttributes(ipp_t *dst, ipp_t *src, int quickcopy, ipp_copycb_t cb, void *context);

                      Parameters

                      - + - + - + - + - +
                      dstDestination IPP message
                      Destination IPP message
                      srcSource IPP message
                      Source IPP message
                      quickcopy1 for a referenced copy, 0 for normal
                      1 for a referenced copy, 0 for normal
                      cbCopy callback or NULL for none
                      Copy callback or NULL for none
                      contextContext pointer
                      Context pointer

                      Return Value

                      -

                      1 on success, 0 on error

                      +

                      1 on success, 0 on error

                      Discussion

                      -

                      Zero or more attributes are copied from the source IPP message, src, to the +

                      Zero or more attributes are copied from the source IPP message, src, to the destination IPP message, dst. When 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.
                      @@ -4617,19 +5864,19 @@

                       CUPS 1.7/macOS 10.9 ippCreateRequestedArray

                      -

                      Create a CUPS array of attribute names from the +

                      Create a CUPS array of attribute names from the given requested-attributes attribute.

                      -cups_array_t *ippCreateRequestedArray(ipp_t *request);

                      +cups_array_t *ippCreateRequestedArray(ipp_t *request);

                      Parameters

                      - +
                      requestIPP request
                      IPP request

                      Return Value

                      -

                      CUPS array or NULL if all

                      +

                      CUPS array or NULL if all

                      Discussion

                      -

                      This function creates a (sorted) CUPS array of attribute names matching the +

                      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.
                      @@ -4644,56 +5891,56 @@

                      ippDateToTime

                      -

                      Convert from RFC 2579 Date/Time format to time in +

                      Convert from RFC 2579 Date/Time format to time in seconds.

                      time_t ippDateToTime(const ipp_uchar_t *date);

                      Parameters

                      - +
                      dateRFC 2579 date info
                      RFC 2579 date info

                      Return Value

                      -

                      UNIX time value

                      +

                      UNIX time value

                      ippDelete

                      -

                      Delete an IPP message.

                      +

                      Delete an IPP message.

                      void ippDelete(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP message
                      IPP message

                       CUPS 1.1.19/macOS 10.3 ippDeleteAttribute

                      -

                      Delete a single attribute in an IPP message.

                      +

                      Delete a single attribute in an IPP message.

                      void ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr);

                      Parameters

                      - + - +
                      ippIPP message
                      IPP message
                      attrAttribute to delete
                      Attribute to delete

                       CUPS 1.6/macOS 10.8 ippDeleteValues

                      -

                      Delete values in an attribute.

                      +

                      Delete values in an attribute.

                      int ippDeleteValues(ipp_t *ipp, ipp_attribute_t **attr, int element, int count);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      attrAttribute
                      Attribute
                      elementIndex of first value to delete (0-based)
                      Index of first value to delete (0-based)
                      countNumber of values to delete
                      Number of values to delete

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The element parameter specifies the first value to delete, starting at +

                      The element parameter specifies the first value to delete, starting at 0. It must be less than the number of values returned by ippGetCount.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -4702,403 +5949,403 @@

                      ippEnumString

                      -

                      Return a string corresponding to the enum value.

                      +

                      Return a string corresponding to the enum value.

                      const char *ippEnumString(const char *attrname, int enumvalue);

                      Parameters

                      - + - +
                      attrnameAttribute name
                      Attribute name
                      enumvalueEnum value
                      Enum value

                      Return Value

                      -

                      Enum string

                      +

                      Enum string

                      ippEnumValue

                      -

                      Return the value associated with a given enum string.

                      +

                      Return the value associated with a given enum string.

                      int ippEnumValue(const char *attrname, const char *enumstring);

                      Parameters

                      - + - +
                      attrnameAttribute name
                      Attribute name
                      enumstringEnum string
                      Enum string

                      Return Value

                      -

                      Enum value or -1 if unknown

                      +

                      Enum value or -1 if unknown

                      ippErrorString

                      -

                      Return a name for the given status code.

                      +

                      Return a name for the given status code.

                      const char *ippErrorString(ipp_status_t error);

                      Parameters

                      - +
                      errorError status
                      Error status

                      Return Value

                      -

                      Text string

                      +

                      Text string

                       CUPS 1.2/macOS 10.5 ippErrorValue

                      -

                      Return a status code for the given name.

                      +

                      Return a status code for the given name.

                      ipp_status_t ippErrorValue(const char *name);

                      Parameters

                      - +
                      nameName
                      Name

                      Return Value

                      -

                      IPP status code

                      +

                      IPP status code

                      ippFindAttribute

                      -

                      Find a named attribute in a request.

                      +

                      Find a named attribute in a request.

                      ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, ipp_tag_t type);

                      Parameters

                      - + - + - +
                      ippIPP message
                      IPP message
                      nameName of attribute
                      Name of attribute
                      typeType of attribute
                      Type of attribute

                      Return Value

                      -

                      Matching attribute

                      +

                      Matching attribute

                      Discussion

                      -

                      Starting with CUPS 2.0, the attribute name can contain a hierarchical list +

                      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".

                      ippFindNextAttribute

                      -

                      Find the next named attribute in a request.

                      +

                      Find the next named attribute in a request.

                      ipp_attribute_t *ippFindNextAttribute(ipp_t *ipp, const char *name, ipp_tag_t type);

                      Parameters

                      - + - + - +
                      ippIPP message
                      IPP message
                      nameName of attribute
                      Name of attribute
                      typeType of attribute
                      Type of attribute

                      Return Value

                      -

                      Matching attribute

                      +

                      Matching attribute

                      Discussion

                      -

                      Starting with CUPS 2.0, the attribute name can contain a hierarchical list +

                      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".

                       CUPS 1.6/macOS 10.8 ippFirstAttribute

                      -

                      Return the first attribute in the message.

                      +

                      Return the first attribute in the message.

                      ipp_attribute_t *ippFirstAttribute(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP message
                      IPP message

                      Return Value

                      -

                      First attribute or NULL if none

                      +

                      First attribute or NULL if none

                       CUPS 1.6/macOS 10.8 ippGetBoolean

                      -

                      Get a boolean value for an attribute.

                      +

                      Get a boolean value for an attribute.

                      int ippGetBoolean(ipp_attribute_t *attr, int element);

                      Parameters

                      - + - +
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)

                      Return Value

                      -

                      Boolean value or 0 on error

                      +

                      Boolean value or 0 on error

                      Discussion

                      -

                      The element parameter specifies which value to get from 0 to +

                      The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

                       CUPS 1.6/macOS 10.8 ippGetCollection

                      -

                      Get a collection value for an attribute.

                      +

                      Get a collection value for an attribute.

                      ipp_t *ippGetCollection(ipp_attribute_t *attr, int element);

                      Parameters

                      - + - +
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)

                      Return Value

                      -

                      Collection value or NULL on error

                      +

                      Collection value or NULL on error

                      Discussion

                      -

                      The element parameter specifies which value to get from 0 to +

                      The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

                       CUPS 1.6/macOS 10.8 ippGetCount

                      -

                      Get the number of values in an attribute.

                      +

                      Get the number of values in an attribute.

                      int ippGetCount(ipp_attribute_t *attr);

                      Parameters

                      - +
                      attrIPP attribute
                      IPP attribute

                      Return Value

                      -

                      Number of values or 0 on error

                      +

                      Number of values or 0 on error

                       CUPS 1.6/macOS 10.8 ippGetDate

                      -

                      Get a dateTime value for an attribute.

                      +

                      Get a dateTime value for an attribute.

                      const ipp_uchar_t *ippGetDate(ipp_attribute_t *attr, int element);

                      Parameters

                      - + - +
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)

                      Return Value

                      -

                      dateTime value or NULL

                      +

                      dateTime value or NULL

                      Discussion

                      -

                      The element parameter specifies which value to get from 0 to +

                      The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

                       CUPS 1.6/macOS 10.8 ippGetGroupTag

                      -

                      Get the group associated with an attribute.

                      +

                      Get the group associated with an attribute.

                      ipp_tag_t ippGetGroupTag(ipp_attribute_t *attr);

                      Parameters

                      - +
                      attrIPP attribute
                      IPP attribute

                      Return Value

                      -

                      Group tag or IPP_TAG_ZERO on error

                      +

                      Group tag or IPP_TAG_ZERO on error

                       CUPS 1.6/macOS 10.8 ippGetInteger

                      -

                      Get the integer/enum value for an attribute.

                      +

                      Get the integer/enum value for an attribute.

                      int ippGetInteger(ipp_attribute_t *attr, int element);

                      Parameters

                      - + - +
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)

                      Return Value

                      -

                      Value or 0 on error

                      +

                      Value or 0 on error

                      Discussion

                      -

                      The element parameter specifies which value to get from 0 to +

                      The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

                       CUPS 1.6/macOS 10.8 ippGetName

                      -

                      Get the attribute name.

                      +

                      Get the attribute name.

                      const char *ippGetName(ipp_attribute_t *attr);

                      Parameters

                      - +
                      attrIPP attribute
                      IPP attribute

                      Return Value

                      -

                      Attribute name or NULL for separators

                      +

                      Attribute name or NULL for separators

                       CUPS 1.7/macOS 10.9 ippGetOctetString

                      -

                      Get an octetString value from an IPP attribute.

                      +

                      Get an octetString value from an IPP attribute.

                      void *ippGetOctetString(ipp_attribute_t *attr, int element, int *datalen);

                      Parameters

                      - + - + - +
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      datalenLength of octetString data
                      Length of octetString data

                      Return Value

                      -

                      Pointer to octetString data

                      +

                      Pointer to octetString data

                      Discussion

                      -

                      The element parameter specifies which value to get from 0 to +

                      The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

                       CUPS 1.6/macOS 10.8 ippGetOperation

                      -

                      Get the operation ID in an IPP message.

                      +

                      Get the operation ID in an IPP message.

                      ipp_op_t ippGetOperation(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP request message
                      IPP request message

                      Return Value

                      -

                      Operation ID or 0 on error

                      +

                      Operation ID or 0 on error

                       CUPS 1.6/macOS 10.8 ippGetRange

                      -

                      Get a rangeOfInteger value from an attribute.

                      +

                      Get a rangeOfInteger value from an attribute.

                      int ippGetRange(ipp_attribute_t *attr, int element, int *uppervalue);

                      Parameters

                      - + - + - +
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      uppervalueUpper value of range
                      Upper value of range

                      Return Value

                      -

                      Lower value of range or 0

                      +

                      Lower value of range or 0

                      Discussion

                      -

                      The element parameter specifies which value to get from 0 to +

                      The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

                       CUPS 1.6/macOS 10.8 ippGetRequestId

                      -

                      Get the request ID from an IPP message.

                      +

                      Get the request ID from an IPP message.

                      int ippGetRequestId(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP message
                      IPP message

                      Return Value

                      -

                      Request ID or 0 on error

                      +

                      Request ID or 0 on error

                       CUPS 1.6/macOS 10.8 ippGetResolution

                      -

                      Get a resolution value for an attribute.

                      +

                      Get a resolution value for an attribute.

                      int ippGetResolution(ipp_attribute_t *attr, int element, int *yres, ipp_res_t *units);

                      Parameters

                      - + - + - + - +
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      yresVertical/feed resolution
                      Vertical/feed resolution
                      unitsUnits for resolution
                      Units for resolution

                      Return Value

                      -

                      Horizontal/cross feed resolution or 0

                      +

                      Horizontal/cross feed resolution or 0

                      Discussion

                      -

                      The element parameter specifies which value to get from 0 to +

                      The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

                       CUPS 1.6/macOS 10.8 ippGetState

                      -

                      Get the IPP message state.

                      +

                      Get the IPP message state.

                      ipp_state_t ippGetState(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP message
                      IPP message

                      Return Value

                      -

                      IPP message state value

                      +

                      IPP message state value

                       CUPS 1.6/macOS 10.8 ippGetStatusCode

                      -

                      Get the status code from an IPP response or event message.

                      +

                      Get the status code from an IPP response or event message.

                      ipp_status_t ippGetStatusCode(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP response or event message
                      IPP response or event message

                      Return Value

                      -

                      Status code in IPP message

                      +

                      Status code in IPP message

                      ippGetString

                      -

                      +

                      const char *ippGetString(ipp_attribute_t *attr, int element, const char **language);

                      Parameters

                      - + - + - +
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      languageLanguage code (NULL for don't care)
                      Language code (NULL for don't care)

                      Return Value

                      -

                      Get the string and optionally the language code for an attribute.

                      -

                      The element parameter specifies which value to get from 0 to +

                      Get the string and optionally the language code for an attribute.

                      +

                      The element parameter specifies which value to get from 0 to ippGetCount(attr) - 1.

                       CUPS 1.6/macOS 10.8 ippGetValueTag

                      -

                      Get the value tag for an attribute.

                      +

                      Get the value tag for an attribute.

                      ipp_tag_t ippGetValueTag(ipp_attribute_t *attr);

                      Parameters

                      - +
                      attrIPP attribute
                      IPP attribute

                      Return Value

                      -

                      Value tag or IPP_TAG_ZERO on error

                      +

                      Value tag or IPP_TAG_ZERO on error

                       CUPS 1.6/macOS 10.8 ippGetVersion

                      -

                      Get the major and minor version number from an IPP message.

                      +

                      Get the major and minor version number from an IPP message.

                      int ippGetVersion(ipp_t *ipp, int *minor);

                      Parameters

                      - + - +
                      ippIPP message
                      IPP message
                      minorMinor version number or NULL for don't care
                      Minor version number or NULL for don't care

                      Return Value

                      -

                      Major version number or 0 on error

                      +

                      Major version number or 0 on error

                      ippLength

                      -

                      Compute the length of an IPP message.

                      +

                      Compute the length of an IPP message.

                      size_t ippLength(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP message
                      IPP message

                      Return Value

                      -

                      Size of IPP message

                      +

                      Size of IPP message

                      ippNew

                      -

                      Allocate a new IPP message.

                      +

                      Allocate a new IPP message.

                      ipp_t *ippNew(void);

                      Return Value

                      -

                      New IPP message

                      +

                      New IPP message

                       CUPS 1.2/macOS 10.5 ippNewRequest

                      -

                      Allocate a new IPP request message.

                      +

                      Allocate a new IPP request message.

                      ipp_t *ippNewRequest(ipp_op_t op);

                      Parameters

                      - +
                      opOperation code
                      Operation code

                      Return Value

                      -

                      IPP request message

                      +

                      IPP request message

                      Discussion

                      -

                      The new request message is initialized with the "attributes-charset" and +

                      The new request message is initialized with the "attributes-charset" and "attributes-natural-language" attributes added. The "attributes-natural-language" value is derived from the current locale.

                       CUPS 1.7/macOS 10.9 ippNewResponse

                      -

                      Allocate a new IPP response message.

                      +

                      Allocate a new IPP response message.

                      ipp_t *ippNewResponse(ipp_t *request);

                      Parameters

                      - +
                      requestIPP request message
                      IPP request message

                      Return Value

                      -

                      IPP response message

                      +

                      IPP response message

                      Discussion

                      -

                      The new response message is initialized with the same "version-number", +

                      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, @@ -5107,108 +6354,108 @@

                       CUPS 1.6/macOS 10.8 ippNextAttribute

                      -

                      Return the next attribute in the message.

                      +

                      Return the next attribute in the message.

                      ipp_attribute_t *ippNextAttribute(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP message
                      IPP message

                      Return Value

                      -

                      Next attribute or NULL if none

                      +

                      Next attribute or NULL if none

                       CUPS 1.2/macOS 10.5 ippOpString

                      -

                      Return a name for the given operation id.

                      +

                      Return a name for the given operation id.

                      const char *ippOpString(ipp_op_t op);

                      Parameters

                      - +
                      opOperation ID
                      Operation ID

                      Return Value

                      -

                      Name

                      +

                      Name

                       CUPS 1.2/macOS 10.5 ippOpValue

                      -

                      Return an operation id for the given name.

                      +

                      Return an operation id for the given name.

                      ipp_op_t ippOpValue(const char *name);

                      Parameters

                      - +
                      nameTextual name
                      Textual name

                      Return Value

                      -

                      Operation ID

                      +

                      Operation ID

                      ippPort

                      -

                      Return the default IPP port number.

                      +

                      Return the default IPP port number.

                      int ippPort(void);

                      Return Value

                      -

                      Port number

                      +

                      Port number

                      ippRead

                      -

                      Read data for an IPP message from a HTTP connection.

                      +

                      Read data for an IPP message from a HTTP connection.

                      ipp_state_t ippRead(http_t *http, ipp_t *ipp);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      ippIPP data
                      IPP data

                      Return Value

                      -

                      Current state

                      +

                      Current state

                       CUPS 1.1.19/macOS 10.3 ippReadFile

                      -

                      Read data for an IPP message from a file.

                      +

                      Read data for an IPP message from a file.

                      ipp_state_t ippReadFile(int fd, ipp_t *ipp);

                      Parameters

                      - + - +
                      fdHTTP data
                      HTTP data
                      ippIPP data
                      IPP data

                      Return Value

                      -

                      Current state

                      +

                      Current state

                       CUPS 1.2/macOS 10.5 ippReadIO

                      -

                      Read data for an IPP message.

                      +

                      Read data for an IPP message.

                      ipp_state_t ippReadIO(void *src, ipp_iocb_t cb, int blocking, ipp_t *parent, ipp_t *ipp);

                      Parameters

                      - + - + - + - + - +
                      srcData source
                      Data source
                      cbRead callback function
                      Read callback function
                      blockingUse blocking IO?
                      Use blocking IO?
                      parentParent request, if any
                      Parent request, if any
                      ippIPP data
                      IPP data

                      Return Value

                      -

                      Current state

                      +

                      Current state

                       CUPS 1.6/macOS 10.8 ippSetBoolean

                      -

                      Set a boolean value in an attribute.

                      +

                      Set a boolean value in an attribute.

                      int ippSetBoolean(ipp_t *ipp, ipp_attribute_t **attr, int element, int boolvalue);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      boolvalueBoolean value
                      Boolean value

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5218,24 +6465,24 @@

                       CUPS 1.6/macOS 10.8 ippSetCollection

                      -

                      Set a collection value in an attribute.

                      +

                      Set a collection value in an attribute.

                      int ippSetCollection(ipp_t *ipp, ipp_attribute_t **attr, int element, ipp_t *colvalue);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      colvalueCollection value
                      Collection value

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5245,24 +6492,24 @@

                       CUPS 1.6/macOS 10.8 ippSetDate

                      -

                      Set a dateTime value in an attribute.

                      +

                      Set a dateTime value in an attribute.

                      int ippSetDate(ipp_t *ipp, ipp_attribute_t **attr, int element, const ipp_uchar_t *datevalue);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      datevaluedateTime value
                      dateTime value

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5272,22 +6519,22 @@

                       CUPS 1.6/macOS 10.8 ippSetGroupTag

                      -

                      Set the group tag of an attribute.

                      +

                      Set the group tag of an attribute.

                      int ippSetGroupTag(ipp_t *ipp, ipp_attribute_t **attr, ipp_tag_t group_tag);

                      Parameters

                      - + - + - +
                      ippIPP message
                      IPP message
                      attrAttribute
                      Attribute
                      group_tagGroup tag
                      Group tag

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5300,24 +6547,24 @@

                       CUPS 1.6/macOS 10.8 ippSetInteger

                      -

                      Set an integer or enum value in an attribute.

                      +

                      Set an integer or enum value in an attribute.

                      int ippSetInteger(ipp_t *ipp, ipp_attribute_t **attr, int element, int intvalue);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      intvalueInteger/enum value
                      Integer/enum value

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5327,48 +6574,48 @@

                       CUPS 1.6/macOS 10.8 ippSetName

                      -

                      Set the name of an attribute.

                      +

                      Set the name of an attribute.

                      int ippSetName(ipp_t *ipp, ipp_attribute_t **attr, const char *name);

                      Parameters

                      - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      nameAttribute name
                      Attribute name

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.

                       CUPS 1.7/macOS 10.9 ippSetOctetString

                      -

                      Set an octetString value in an IPP attribute.

                      +

                      Set an octetString value in an IPP attribute.

                      int ippSetOctetString(ipp_t *ipp, ipp_attribute_t **attr, int element, const void *data, int datalen);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      dataPointer to octetString data
                      Pointer to octetString data
                      datalenLength of octetString data
                      Length of octetString data

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5378,53 +6625,53 @@

                       CUPS 1.6/macOS 10.8 ippSetOperation

                      -

                      Set the operation ID in an IPP request message.

                      +

                      Set the operation ID in an IPP request message.

                      int ippSetOperation(ipp_t *ipp, ipp_op_t op);

                      Parameters

                      - + - +
                      ippIPP request message
                      IPP request message
                      opOperation ID
                      Operation ID

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      ippSetPort

                      -

                      Set the default port number.

                      +

                      Set the default port number.

                      void ippSetPort(int p);

                      Parameters

                      - +
                      pPort number to use
                      Port number to use

                       CUPS 1.6/macOS 10.8 ippSetRange

                      -

                      Set a rangeOfInteger value in an attribute.

                      +

                      Set a rangeOfInteger value in an attribute.

                      int ippSetRange(ipp_t *ipp, ipp_attribute_t **attr, int element, int lowervalue, int uppervalue);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      lowervalueLower bound for range
                      Lower bound for range
                      uppervalueUpper bound for range
                      Upper bound for range

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5434,48 +6681,48 @@

                       CUPS 1.6/macOS 10.8 ippSetRequestId

                      -

                      Set the request ID in an IPP message.

                      +

                      Set the request ID in an IPP message.

                      int ippSetRequestId(ipp_t *ipp, int request_id);

                      Parameters

                      - + - +
                      ippIPP message
                      IPP message
                      request_idRequest ID
                      Request ID

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The request_id parameter must be greater than 0.

                       CUPS 1.6/macOS 10.8 ippSetResolution

                      -

                      Set a resolution value in an attribute.

                      +

                      Set a resolution value in an attribute.

                      int ippSetResolution(ipp_t *ipp, ipp_attribute_t **attr, int element, ipp_res_t unitsvalue, int xresvalue, int yresvalue);

                      Parameters

                      - + - + - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      unitsvalueResolution units
                      Resolution units
                      xresvalueHorizontal/cross feed resolution
                      Horizontal/cross feed resolution
                      yresvalueVertical/feed resolution
                      Vertical/feed resolution

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5485,55 +6732,55 @@

                       CUPS 1.6/macOS 10.8 ippSetState

                      -

                      Set the current state of the IPP message.

                      +

                      Set the current state of the IPP message.

                      int ippSetState(ipp_t *ipp, ipp_state_t state);

                      Parameters

                      - + - +
                      ippIPP message
                      IPP message
                      stateIPP state value
                      IPP state value

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                       CUPS 1.6/macOS 10.8 ippSetStatusCode

                      -

                      Set the status code in an IPP response or event message.

                      +

                      Set the status code in an IPP response or event message.

                      int ippSetStatusCode(ipp_t *ipp, ipp_status_t status);

                      Parameters

                      - + - +
                      ippIPP response or event message
                      IPP response or event message
                      statusStatus code
                      Status code

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                       CUPS 1.6/macOS 10.8 ippSetString

                      -

                      Set a string value in an attribute.

                      +

                      Set a string value in an attribute.

                      int ippSetString(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *strvalue);

                      Parameters

                      - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      strvalueString value
                      String value

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5543,26 +6790,26 @@

                       CUPS 1.7/macOS 10.9 ippSetStringf

                      -

                      Set a formatted string value of an attribute.

                      +

                      Set a formatted string value of an attribute.

                      int ippSetStringf(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *format, ...);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      formatPrintf-style format string
                      Printf-style format string
                      ...Additional arguments as needed
                      Additional arguments as needed

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5577,26 +6824,26 @@

                       CUPS 1.7/macOS 10.9 ippSetStringfv

                      -

                      Set a formatted string value of an attribute.

                      +

                      Set a formatted string value of an attribute.

                      int ippSetStringfv(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *format, va_list ap);

                      Parameters

                      - + - + - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      elementValue number (0-based)
                      Value number (0-based)
                      formatPrintf-style format string
                      Printf-style format string
                      apPointer to additional arguments
                      Pointer to additional arguments

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5611,22 +6858,22 @@

                       CUPS 1.6/macOS 10.8 ippSetValueTag

                      -

                      Set the value tag of an attribute.

                      +

                      Set the value tag of an attribute.

                      int ippSetValueTag(ipp_t *ipp, ipp_attribute_t **attr, ipp_tag_t value_tag);

                      Parameters

                      - + - + - +
                      ippIPP message
                      IPP message
                      attrIPP attribute
                      IPP attribute
                      value_tagValue tag
                      Value tag

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The attr parameter may be modified as a result of setting the value.
                      @@ -5645,331 +6892,454 @@

                       CUPS 1.6/macOS 10.8 ippSetVersion

                      -

                      Set the version number in an IPP message.

                      +

                      Set the version number in an IPP message.

                      int ippSetVersion(ipp_t *ipp, int major, int minor);

                      Parameters

                      - + - + - +
                      ippIPP message
                      IPP message
                      majorMajor version number (major.minor)
                      Major version number (major.minor)
                      minorMinor version number (major.minor)
                      Minor version number (major.minor)

                      Return Value

                      -

                      1 on success, 0 on failure

                      +

                      1 on success, 0 on failure

                      Discussion

                      -

                      The ipp parameter refers to an IPP message previously created using +

                      The ipp parameter refers to an IPP message previously created using the ippNew, ippNewRequest, or ippNewResponse functions.

                      The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2.

                       CUPS 2.0/OS 10.10 ippStateString

                      -

                      Return the name corresponding to a state value.

                      +

                      Return the name corresponding to a state value.

                      const char *ippStateString(ipp_state_t state);

                      Parameters

                      - +
                      stateState value
                      State value

                      Return Value

                      -

                      State name

                      +

                      State name

                       CUPS 1.4/macOS 10.6 ippTagString

                      -

                      Return the tag name corresponding to a tag value.

                      +

                      Return the tag name corresponding to a tag value.

                      const char *ippTagString(ipp_tag_t tag);

                      Parameters

                      - +
                      tagTag value
                      Tag value

                      Return Value

                      -

                      Tag name

                      +

                      Tag name

                      Discussion

                      -

                      The returned names are defined in RFC 8011 and the IANA IPP Registry. +

                      The returned names are defined in RFC 8011 and the IANA IPP Registry.

                       CUPS 1.4/macOS 10.6 ippTagValue

                      -

                      Return the tag value corresponding to a tag name.

                      +

                      Return the tag value corresponding to a tag name.

                      ipp_tag_t ippTagValue(const char *name);

                      Parameters

                      - +
                      nameTag name
                      Tag name

                      Return Value

                      -

                      Tag value

                      +

                      Tag value

                      Discussion

                      -

                      The tag names are defined in RFC 8011 and the IANA IPP Registry. +

                      The tag names are defined in RFC 8011 and the IANA IPP Registry.

                      ippTimeToDate

                      -

                      Convert from time in seconds to RFC 2579 format.

                      +

                      Convert from time in seconds to RFC 2579 format.

                      const ipp_uchar_t *ippTimeToDate(time_t t);

                      Parameters

                      - +
                      tTime in seconds
                      Time in seconds

                      Return Value

                      -

                      RFC-2579 date/time data

                      +

                      RFC-2579 date/time data

                       CUPS 1.7/macOS 10.9 ippValidateAttribute

                      -

                      Validate the contents of an attribute.

                      +

                      Validate the contents of an attribute.

                      int ippValidateAttribute(ipp_attribute_t *attr);

                      Parameters

                      - +
                      attrAttribute
                      Attribute

                      Return Value

                      -

                      1 if valid, 0 otherwise

                      +

                      1 if valid, 0 otherwise

                      Discussion

                      -

                      This function validates the contents of an attribute based on the name and +

                      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.

                       CUPS 1.7/macOS 10.9 ippValidateAttributes

                      -

                      Validate all attributes in an IPP message.

                      +

                      Validate all attributes in an IPP message.

                      int ippValidateAttributes(ipp_t *ipp);

                      Parameters

                      - +
                      ippIPP message
                      IPP message

                      Return Value

                      -

                      1 if valid, 0 otherwise

                      +

                      1 if valid, 0 otherwise

                      Discussion

                      -

                      This function validates the contents of the IPP message, including each +

                      This function validates the contents of the IPP message, including each attribute. Like ippValidateAttribute, cupsLastErrorString is set to a human-readable message on failure.

                      ippWrite

                      -

                      Write data for an IPP message to a HTTP connection.

                      +

                      Write data for an IPP message to a HTTP connection.

                      ipp_state_t ippWrite(http_t *http, ipp_t *ipp);

                      Parameters

                      - + - +
                      httpHTTP connection
                      HTTP connection
                      ippIPP data
                      IPP data

                      Return Value

                      -

                      Current state

                      +

                      Current state

                       CUPS 1.1.19/macOS 10.3 ippWriteFile

                      -

                      Write data for an IPP message to a file.

                      +

                      Write data for an IPP message to a file.

                      ipp_state_t ippWriteFile(int fd, ipp_t *ipp);

                      Parameters

                      - + - +
                      fdHTTP data
                      HTTP data
                      ippIPP data
                      IPP data

                      Return Value

                      -

                      Current state

                      +

                      Current state

                       CUPS 1.2/macOS 10.5 ippWriteIO

                      -

                      Write data for an IPP message.

                      +

                      Write data for an IPP message.

                      ipp_state_t ippWriteIO(void *dst, ipp_iocb_t cb, int blocking, ipp_t *parent, ipp_t *ipp);

                      Parameters

                      - + - + - + - + - +
                      dstDestination
                      Destination
                      cbWrite callback function
                      Write callback function
                      blockingUse blocking IO?
                      Use blocking IO?
                      parentParent IPP message
                      Parent IPP message
                      ippIPP data
                      IPP data

                      Return Value

                      -

                      Current state

                      -

                      Data Types

                      -

                       CUPS 1.5/macOS 10.7 cups_client_cert_cb_t

                      -

                      Client credentials callback +

                      Current state

                      +

                      Data Types

                      +

                      cups_acopy_func_t

                      +

                      Array element copy function

                      +

                      +typedef void *(*)(void *element, void *data)cups_acopy_func_t; +

                      +

                      cups_adv_t

                      +

                      AdvanceMedia attribute values

                      +

                      +typedef enum cups_adv_e cups_adv_t; +

                      +

                      cups_afree_func_t

                      +

                      Array element free function

                      +

                      +typedef void(*)(void *element, void *data)cups_afree_func_t; +

                      +

                      cups_ahash_func_t

                      +

                      Array hash function

                      +

                      +typedef int(*)(void *element, void *data)cups_ahash_func_t; +

                      +

                      cups_array_func_t

                      +

                      Array comparison function

                      +

                      +typedef int(*)(void *first, void *second, void *data)cups_array_func_t; +

                      +

                      cups_array_t

                      +

                      CUPS array type

                      +

                      +typedef struct _cups_array_s cups_array_t; +

                      +

                      cups_bool_t

                      +

                      Boolean type

                      +

                      +typedef enum cups_bool_e cups_bool_t;

                      -

                      -typedef int(*)(http_t *http, void *tls, cups_array_t *distinguished_names, void *user_data)cups_client_cert_cb_t; +

                       CUPS 1.5/macOS 10.7 cups_client_cert_cb_t

                      +

                      Client credentials callback

                      -

                       CUPS 1.6/macOS 10.8 cups_dest_cb_t

                      -

                      Destination enumeration callback +

                      +typedef int(*)(http_t *http, void *tls, cups_array_t *distinguished_names, void *user_data)cups_client_cert_cb_t; +

                      +

                      cups_cspace_t

                      +

                      cupsColorSpace attribute values

                      +

                      +typedef enum cups_cspace_e cups_cspace_t; +

                      +

                      cups_cut_t

                      +

                      CutMedia attribute values

                      +

                      +typedef enum cups_cut_e cups_cut_t;

                      -

                      +

                      cups_dentry_t

                      +

                      Directory entry type

                      +

                      +typedef struct cups_dentry_s cups_dentry_t; +

                      +

                       CUPS 1.6/macOS 10.8 cups_dest_cb_t

                      +

                      Destination enumeration callback +

                      +

                      typedef int(*)(void *user_data, unsigned flags, cups_dest_t *dest)cups_dest_cb_t;

                      -

                      cups_dest_t

                      -

                      Destination

                      -

                      +

                      cups_dest_t

                      +

                      Destination

                      +

                      typedef struct cups_dest_s cups_dest_t;

                      -

                       CUPS 1.6/macOS 10.8 cups_dinfo_t

                      -

                      Destination capability and status +

                       CUPS 1.6/macOS 10.8 cups_dinfo_t

                      +

                      Destination capability and status information

                      -

                      +

                      typedef struct _cups_dinfo_s cups_dinfo_t;

                      -

                      cups_job_t

                      -

                      Job

                      -

                      +

                      cups_dir_t

                      +

                      Directory type

                      +

                      +typedef struct _cups_dir_s cups_dir_t; +

                      +

                      cups_edge_t

                      +

                      LeadingEdge attribute values

                      +

                      +typedef enum cups_edge_e cups_edge_t; +

                      +

                      cups_file_t

                      +

                      CUPS file type

                      +

                      +typedef struct _cups_file_s cups_file_t; +

                      +

                      cups_job_t

                      +

                      Job

                      +

                      typedef struct cups_job_s cups_job_t;

                      -

                      cups_option_t

                      -

                      Printer Options

                      -

                      +

                      cups_jog_t

                      +

                      Jog attribute values

                      +

                      +typedef enum cups_jog_e cups_jog_t; +

                      +

                      cups_mode_t

                      +

                      cupsRasterOpen modes

                      +

                      +typedef enum cups_mode_e cups_mode_t; +

                      +

                      cups_option_t

                      +

                      Printer Options

                      +

                      typedef struct cups_option_s cups_option_t;

                      -

                       CUPS 1.4/macOS 10.6 cups_password_cb2_t

                      -

                      New password callback +

                      cups_order_t

                      +

                      cupsColorOrder attribute values

                      +

                      +typedef enum cups_order_e cups_order_t; +

                      +

                      cups_orient_t

                      +

                      Orientation attribute values

                      +

                      +typedef enum cups_orient_e cups_orient_t; +

                      +

                       CUPS 1.2/macOS 10.5 cups_page_header2_t

                      +

                      Version 2 page header

                      +

                      +typedef struct cups_page_header2_s cups_page_header2_t; +

                      +

                       DEPRECATED cups_page_header_t

                      +

                      Version 1 page header

                      +

                      +typedef struct cups_page_header_s cups_page_header_t;

                      -

                      +

                       CUPS 1.4/macOS 10.6 cups_password_cb2_t

                      +

                      New password callback +

                      +

                      typedef const char *(*)(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data)cups_password_cb2_t;

                      -

                      cups_ptype_t

                      -

                      Printer type/capability bits

                      -

                      +

                      cups_ptype_t

                      +

                      Printer type/capability bits

                      +

                      typedef unsigned cups_ptype_t;

                      -

                       CUPS 1.5/macOS 10.7 cups_server_cert_cb_t

                      -

                      Server credentials callback +

                      cups_raster_iocb_t

                      +

                      cupsRasterOpenIO callback function

                      +

                      +typedef ssize_t(*)(void *ctx, unsigned char *buffer, size_t length) cups_raster_iocb_t; +

                      +

                      cups_raster_t

                      +

                      Raster stream data

                      +

                      +typedef struct _cups_raster_s cups_raster_t; +

                      +

                       CUPS 1.5/macOS 10.7 cups_server_cert_cb_t

                      +

                      Server credentials callback

                      -

                      -typedef int(*)(http_t *http, void *tls, cups_array_t *certs, void *user_data)cups_server_cert_cb_t; +

                      +typedef int(*)(http_t *http, void *tls, cups_array_t *certs, void *user_data)cups_server_cert_cb_t;

                      -

                       CUPS 1.6/macOS 10.8 cups_size_t

                      -

                      Media Size

                      -

                      +

                       CUPS 1.6/macOS 10.8 cups_size_t

                      +

                      Media Size

                      +

                      typedef struct cups_size_s cups_size_t;

                      -

                       CUPS 1.2/macOS 10.5 http_addr_t

                      -

                      Socket address union, which +

                       CUPS 1.2/macOS 10.5 http_addr_t

                      +

                      Socket address union, which makes using IPv6 and other address types easier and more portable.

                      -

                      +

                      typedef union _http_addr_u / http_addr_t;

                      -

                      http_encoding_t

                      -

                      HTTP transfer encoding values

                      -

                      +

                      http_encoding_t

                      +

                      HTTP transfer encoding values

                      +

                      typedef enum http_encoding_e http_encoding_t;

                      -

                      http_encryption_t

                      -

                      HTTP encryption values

                      -

                      +

                      http_encryption_t

                      +

                      HTTP encryption values

                      +

                      typedef enum http_encryption_e http_encryption_t;

                      -

                      http_field_t

                      -

                      HTTP field names

                      -

                      +

                      http_field_t

                      +

                      HTTP field names

                      +

                      typedef enum http_field_e http_field_t;

                      -

                      http_keepalive_t

                      -

                      HTTP keep-alive values

                      -

                      +

                      http_keepalive_t

                      +

                      HTTP keep-alive values

                      +

                      typedef enum http_keepalive_e http_keepalive_t;

                      -

                      http_state_t

                      -

                      HTTP state values; states +

                      http_state_t

                      +

                      HTTP state values; states are server-oriented...

                      -

                      +

                      typedef enum http_state_e http_state_t;

                      -

                      http_t

                      -

                      HTTP connection type

                      -

                      +

                      http_t

                      +

                      HTTP connection type

                      +

                      typedef struct _http_s http_t;

                      -

                       CUPS 1.5/macOS 10.7 http_timeout_cb_t

                      -

                      HTTP timeout callback

                      -

                      +

                       CUPS 1.5/macOS 10.7 http_timeout_cb_t

                      +

                      HTTP timeout callback

                      +

                      typedef int(*)(http_t *http, void *user_data)http_timeout_cb_t;

                      -

                       CUPS 2.0/OS 10.10 http_trust_t

                      -

                      Level of trust for credentials

                      -

                      +

                       CUPS 2.0/OS 10.10 http_trust_t

                      +

                      Level of trust for credentials

                      +

                      typedef enum http_trust_e http_trust_t;

                      -

                      http_uri_coding_t

                      -

                      URI en/decode flags

                      -

                      +

                      http_uri_coding_t

                      +

                      URI en/decode flags

                      +

                      typedef enum http_uri_coding_e http_uri_coding_t;

                      -

                       CUPS 1.2 http_uri_status_t

                      -

                      URI separation status

                      -

                      +

                       CUPS 1.2 http_uri_status_t

                      +

                      URI separation status

                      +

                      typedef enum http_uri_status_e http_uri_status_t;

                      -

                      ipp_attribute_t

                      -

                      IPP attribute

                      -

                      +

                      ipp_attribute_t

                      +

                      IPP attribute

                      +

                      typedef struct _ipp_attribute_s ipp_attribute_t;

                      -

                       CUPS 1.6/macOS 10.8 ipp_copycb_t

                      -

                      ippCopyAttributes callback function

                      -

                      +

                       CUPS 1.6/macOS 10.8 ipp_copycb_t

                      +

                      ippCopyAttributes callback function

                      +

                      typedef int(*)(void *context, ipp_t *dst, ipp_attribute_t *attr)ipp_copycb_t;

                      -

                       CUPS 1.2/macOS 10.5 ipp_iocb_t

                      -

                      ippReadIO/ippWriteIO callback function

                      -

                      +

                       CUPS 1.2/macOS 10.5 ipp_iocb_t

                      +

                      ippReadIO/ippWriteIO callback function

                      +

                      typedef ssize_t(*)(void *context, ipp_uchar_t *buffer, size_t bytes) ipp_iocb_t;

                      -

                      ipp_orient_t

                      -

                      Orientation values

                      -

                      +

                      ipp_orient_t

                      +

                      Orientation values

                      +

                      typedef enum ipp_orient_e ipp_orient_t;

                      -

                      ipp_pstate_t

                      -

                      Printer state values

                      -

                      +

                      ipp_pstate_t

                      +

                      Printer state values

                      +

                      typedef enum ipp_pstate_e ipp_pstate_t;

                      -

                      ipp_quality_t

                      -

                      Print quality values

                      -

                      +

                      ipp_quality_t

                      +

                      Print quality values

                      +

                      typedef enum ipp_quality_e ipp_quality_t;

                      -

                      ipp_res_t

                      -

                      Resolution units

                      -

                      +

                      ipp_res_t

                      +

                      Resolution units

                      +

                      typedef enum ipp_res_e ipp_res_t;

                      -

                      ipp_rstate_t

                      -

                      resource-state values

                      -

                      +

                      ipp_rstate_t

                      +

                      resource-state values

                      +

                      typedef enum ipp_rstate_e ipp_rstate_t;

                      -

                      ipp_sstate_t

                      -

                      system-state values

                      -

                      +

                      ipp_sstate_t

                      +

                      system-state values

                      +

                      typedef enum ipp_sstate_e ipp_sstate_t;

                      -

                      ipp_state_t

                      -

                      ipp_t state values

                      -

                      +

                      ipp_state_t

                      +

                      ipp_t state values

                      +

                      typedef enum ipp_state_e ipp_state_t;

                      -

                      ipp_t

                      -

                      IPP request/response data

                      -

                      +

                      ipp_t

                      +

                      IPP request/response data

                      +

                      typedef struct _ipp_s ipp_t;

                      -

                      Structures

                      +

                      pwg_media_t

                      +

                      Common media size data

                      +

                      +typedef struct pwg_media_s pwg_media_t; +

                      +

                      Structures

                      +

                      cups_dentry_s

                      +

                      Directory entry type

                      +

                      struct cups_dentry_s {
                      +    struct stat fileinfo;
                      +    char filename[260];
                      +};

                      +

                      Members

                      + + + + + +
                      fileinfo File information
                      filename[260] File name

                      cups_dest_s

                      -

                      Destination

                      +

                      Destination

                      struct cups_dest_s {
                          char *name, *instance;
                          int is_default;
                      @@ -5979,16 +7349,16 @@

                      Members

                      - + - + - + - +
                      instance Local instance name or NULL
                      Local instance name or NULL
                      is_default Is this printer the default?
                      Is this printer the default?
                      num_options Number of options
                      Number of options
                      options Options
                      Options

                      cups_job_s

                      -

                      Job

                      +

                      Job

                      struct cups_job_s {
                          time_t completed_time;
                          time_t creation_time;
                      @@ -6005,30 +7375,30 @@

                      Members

                      - + - + - + - + - + - + - + - + - + - + - +
                      completed_time Time the job was completed
                      Time the job was completed
                      creation_time Time the job was created
                      Time the job was created
                      dest Printer or class name
                      Printer or class name
                      format Document format
                      Document format
                      id The job ID
                      The job ID
                      priority Priority (1-100)
                      Priority (1-100)
                      processing_time Time the job was processed
                      Time the job was processed
                      size Size in kilobytes
                      Size in kilobytes
                      state Job state
                      Job state
                      title Title/job name
                      Title/job name
                      user User that submitted the job
                      User that submitted the job

                      cups_option_s

                      -

                      Printer Options

                      +

                      Printer Options

                      struct cups_option_s {
                          char *name;
                          char *value;
                      @@ -6036,12 +7406,293 @@

                      Members

                      - + - + +
                      name Name of option
                      Name of option
                      value Value of option
                      Value of option
                      +

                       CUPS 1.2/macOS 10.5 cups_page_header2_s

                      +

                      Version 2 page header

                      +

                      struct cups_page_header2_s {
                      +    unsigned AdvanceDistance;
                      +    cups_adv_t AdvanceMedia;
                      +    cups_bool_t Collate;
                      +    cups_cut_t CutMedia;
                      +    cups_bool_t Duplex;
                      +    unsigned HWResolution[2];
                      +    unsigned ImagingBoundingBox[4];
                      +    cups_bool_t InsertSheet;
                      +    cups_jog_t Jog;
                      +    cups_edge_t LeadingEdge;
                      +    cups_bool_t ManualFeed;
                      +    unsigned Margins[2];
                      +    char MediaClass[64];
                      +    char MediaColor[64];
                      +    unsigned MediaPosition;
                      +    char MediaType[64];
                      +    unsigned MediaWeight;
                      +    cups_bool_t MirrorPrint;
                      +    cups_bool_t NegativePrint;
                      +    unsigned NumCopies;
                      +    cups_orient_t Orientation;
                      +    cups_bool_t OutputFaceUp;
                      +    char OutputType[64];
                      +    unsigned PageSize[2];
                      +    cups_bool_t Separations;
                      +    cups_bool_t TraySwitch;
                      +    cups_bool_t Tumble;
                      +    unsigned cupsBitsPerColor;
                      +    unsigned cupsBitsPerPixel;
                      +    float cupsBorderlessScalingFactor;
                      +    unsigned cupsBytesPerLine;
                      +    cups_order_t cupsColorOrder;
                      +    cups_cspace_t cupsColorSpace;
                      +    unsigned cupsCompression;
                      +    unsigned cupsHeight;
                      +    float cupsImagingBBox[4];
                      +    unsigned cupsInteger[16];
                      +    char cupsMarkerType[64];
                      +    unsigned cupsMediaType;
                      +    unsigned cupsNumColors;
                      +    char cupsPageSizeName[64];
                      +    float cupsPageSize[2];
                      +    float cupsReal[16];
                      +    char cupsRenderingIntent[64];
                      +    unsigned cupsRowCount;
                      +    unsigned cupsRowFeed;
                      +    unsigned cupsRowStep;
                      +    char cupsString[16][64];
                      +    unsigned cupsWidth;
                      +};

                      +

                      Members

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      AdvanceDistance AdvanceDistance value in points
                      AdvanceMedia AdvanceMedia value (cups_adv_t)
                      Collate Collated copies value
                      CutMedia CutMedia value (cups_cut_t)
                      Duplex Duplexed (double-sided) value
                      HWResolution[2] Resolution in dots-per-inch
                      ImagingBoundingBox[4] Pixel region that is painted (points, left, bottom, right, top)
                      InsertSheet InsertSheet value
                      Jog Jog value (cups_jog_t)
                      LeadingEdge LeadingEdge value (cups_edge_t)
                      ManualFeed ManualFeed value
                      Margins[2] Lower-lefthand margins in points
                      MediaClass[64] MediaClass string
                      MediaColor[64] MediaColor string
                      MediaPosition MediaPosition value
                      MediaType[64] MediaType string
                      MediaWeight MediaWeight value in grams/m^2
                      MirrorPrint MirrorPrint value
                      NegativePrint NegativePrint value
                      NumCopies Number of copies to produce
                      Orientation Orientation value (cups_orient_t)
                      OutputFaceUp OutputFaceUp value
                      OutputType[64] OutputType string
                      PageSize[2] Width and length of page in points
                      Separations Separations value
                      TraySwitch TraySwitch value
                      Tumble Tumble value
                      cupsBitsPerColor Number of bits for each color
                      cupsBitsPerPixel Number of bits for each pixel
                      cupsBorderlessScalingFactor  CUPS 1.2/macOS 10.5 Scaling that was applied to page data
                      cupsBytesPerLine Number of bytes per line
                      cupsColorOrder Order of colors
                      cupsColorSpace True colorspace
                      cupsCompression Device compression to use
                      cupsHeight Height of page image in pixels
                      cupsImagingBBox[4]  CUPS 1.2/macOS 10.5 Floating point ImagingBoundingBox +(scaling factor not applied, left, +bottom, right, top)
                      cupsInteger[16]  CUPS 1.2/macOS 10.5 User-defined integer values
                      cupsMarkerType[64]  CUPS 1.2/macOS 10.5 Ink/toner type
                      cupsMediaType Media type code
                      cupsNumColors  CUPS 1.2/macOS 10.5 Number of color compoents
                      cupsPageSizeName[64]  CUPS 1.2/macOS 10.5 PageSize name
                      cupsPageSize[2]  CUPS 1.2/macOS 10.5 Floating point PageSize (scaling * +factor not applied)
                      cupsReal[16]  CUPS 1.2/macOS 10.5 User-defined floating-point values
                      cupsRenderingIntent[64]  CUPS 1.2/macOS 10.5 Color rendering intent
                      cupsRowCount Rows per band
                      cupsRowFeed Feed between bands
                      cupsRowStep Spacing between lines
                      cupsString[16][64]  CUPS 1.2/macOS 10.5 User-defined string values
                      cupsWidth Width of page image in pixels
                      +

                       DEPRECATED cups_page_header_s

                      +

                      Version 1 page header

                      +

                      struct cups_page_header_s {
                      +    unsigned AdvanceDistance;
                      +    cups_adv_t AdvanceMedia;
                      +    cups_bool_t Collate;
                      +    cups_cut_t CutMedia;
                      +    cups_bool_t Duplex;
                      +    unsigned HWResolution[2];
                      +    unsigned ImagingBoundingBox[4];
                      +    cups_bool_t InsertSheet;
                      +    cups_jog_t Jog;
                      +    cups_edge_t LeadingEdge;
                      +    cups_bool_t ManualFeed;
                      +    unsigned Margins[2];
                      +    char MediaClass[64];
                      +    char MediaColor[64];
                      +    unsigned MediaPosition;
                      +    char MediaType[64];
                      +    unsigned MediaWeight;
                      +    cups_bool_t MirrorPrint;
                      +    cups_bool_t NegativePrint;
                      +    unsigned NumCopies;
                      +    cups_orient_t Orientation;
                      +    cups_bool_t OutputFaceUp;
                      +    char OutputType[64];
                      +    unsigned PageSize[2];
                      +    cups_bool_t Separations;
                      +    cups_bool_t TraySwitch;
                      +    cups_bool_t Tumble;
                      +    unsigned cupsBitsPerColor;
                      +    unsigned cupsBitsPerPixel;
                      +    unsigned cupsBytesPerLine;
                      +    cups_order_t cupsColorOrder;
                      +    cups_cspace_t cupsColorSpace;
                      +    unsigned cupsCompression;
                      +    unsigned cupsHeight;
                      +    unsigned cupsMediaType;
                      +    unsigned cupsRowCount;
                      +    unsigned cupsRowFeed;
                      +    unsigned cupsRowStep;
                      +    unsigned cupsWidth;
                      +};

                      +

                      Members

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      AdvanceDistance AdvanceDistance value in points
                      AdvanceMedia AdvanceMedia value (cups_adv_t)
                      Collate Collated copies value
                      CutMedia CutMedia value (cups_cut_t)
                      Duplex Duplexed (double-sided) value
                      HWResolution[2] Resolution in dots-per-inch
                      ImagingBoundingBox[4] Pixel region that is painted (points, left, bottom, right, top)
                      InsertSheet InsertSheet value
                      Jog Jog value (cups_jog_t)
                      LeadingEdge LeadingEdge value (cups_edge_t)
                      ManualFeed ManualFeed value
                      Margins[2] Lower-lefthand margins in points
                      MediaClass[64] MediaClass string
                      MediaColor[64] MediaColor string
                      MediaPosition MediaPosition value
                      MediaType[64] MediaType string
                      MediaWeight MediaWeight value in grams/m^2
                      MirrorPrint MirrorPrint value
                      NegativePrint NegativePrint value
                      NumCopies Number of copies to produce
                      Orientation Orientation value (cups_orient_t)
                      OutputFaceUp OutputFaceUp value
                      OutputType[64] OutputType string
                      PageSize[2] Width and length of page in points
                      Separations Separations value
                      TraySwitch TraySwitch value
                      Tumble Tumble value
                      cupsBitsPerColor Number of bits for each color
                      cupsBitsPerPixel Number of bits for each pixel
                      cupsBytesPerLine Number of bytes per line
                      cupsColorOrder Order of colors
                      cupsColorSpace True colorspace
                      cupsCompression Device compression to use
                      cupsHeight Height of page image in pixels
                      cupsMediaType Media type code
                      cupsRowCount Rows per band
                      cupsRowFeed Feed between bands
                      cupsRowStep Spacing between lines
                      cupsWidth Width of page image in pixels

                       CUPS 1.6/macOS 10.8 cups_size_s

                      -

                      Media Size

                      +

                      Media Size

                      struct cups_size_s {
                          char media[128];
                          int width, length, bottom, left, right, top;
                      @@ -6049,556 +7700,696 @@

                      Members

                      - + -
                      media[128] Media name to use
                      Media name to use
                      top Top margin in hundredths of +Top margin in hundredths of millimeters
                      -

                      Constants

                      -

                      cups_ptype_e

                      -

                      Printer type/capability bit +

                      pwg_media_s

                      +

                      Common media size data

                      +

                      struct pwg_media_s {
                      +    int width, length;
                      +    const char *pwg, *legacy, *ppd;
                      +};

                      +

                      Members

                      + + + + + +
                      length Length in 2540ths
                      ppd Standard Adobe PPD name
                      +

                      Constants

                      +

                      cups_adv_e

                      +

                      AdvanceMedia attribute values

                      +

                      Constants

                      + + + + + + +
                      CUPS_ADVANCE_FILE Advance the roll after this file
                      CUPS_ADVANCE_JOB Advance the roll after this job
                      CUPS_ADVANCE_NONE Never advance the roll
                      CUPS_ADVANCE_PAGE Advance the roll after this page
                      CUPS_ADVANCE_SET Advance the roll after this set
                      +

                      cups_bool_e

                      +

                      Boolean type

                      +

                      Constants

                      + + + +
                      CUPS_FALSE Logical false
                      CUPS_TRUE Logical true
                      +

                      cups_cspace_e

                      +

                      cupsColorSpace attribute values

                      +

                      Constants

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      CUPS_CSPACE_ADOBERGB  CUPS 1.4.5 Red, green, blue (Adobe RGB)
                      CUPS_CSPACE_CIELab  CUPS 1.1.19/macOS 10.3 CIE Lab
                      CUPS_CSPACE_CIEXYZ  CUPS 1.1.19/macOS 10.3 CIE XYZ
                      CUPS_CSPACE_CMY Cyan, magenta, yellow (DeviceCMY)
                      CUPS_CSPACE_CMYK Cyan, magenta, yellow, black (DeviceCMYK)
                      CUPS_CSPACE_DEVICE1  CUPS 1.4.5 DeviceN, 1 color
                      CUPS_CSPACE_DEVICE2  CUPS 1.4.5 DeviceN, 2 colors
                      CUPS_CSPACE_DEVICE3  CUPS 1.4.5 DeviceN, 3 colors
                      CUPS_CSPACE_DEVICE4  CUPS 1.4.5 DeviceN, 4 colors
                      CUPS_CSPACE_DEVICE5  CUPS 1.4.5 DeviceN, 5 colors
                      CUPS_CSPACE_DEVICE6  CUPS 1.4.5 DeviceN, 6 colors
                      CUPS_CSPACE_DEVICE7  CUPS 1.4.5 DeviceN, 7 colors
                      CUPS_CSPACE_DEVICE8  CUPS 1.4.5 DeviceN, 8 colors
                      CUPS_CSPACE_DEVICE9  CUPS 1.4.5 DeviceN, 9 colors
                      CUPS_CSPACE_DEVICEA  CUPS 1.4.5 DeviceN, 10 colors
                      CUPS_CSPACE_DEVICEB  CUPS 1.4.5 DeviceN, 11 colors
                      CUPS_CSPACE_DEVICEC  CUPS 1.4.5 DeviceN, 12 colors
                      CUPS_CSPACE_DEVICED  CUPS 1.4.5 DeviceN, 13 colors
                      CUPS_CSPACE_DEVICEE  CUPS 1.4.5 DeviceN, 14 colors
                      CUPS_CSPACE_DEVICEF  CUPS 1.4.5 DeviceN, 15 colors
                      CUPS_CSPACE_GMCK  DEPRECATED Gold, magenta, yellow, black
                      CUPS_CSPACE_GMCS  DEPRECATED Gold, magenta, yellow, silver
                      CUPS_CSPACE_GOLD  DEPRECATED Gold foil
                      CUPS_CSPACE_ICC1  CUPS 1.1.19/macOS 10.3 ICC-based, 1 color
                      CUPS_CSPACE_ICC2  CUPS 1.1.19/macOS 10.3 ICC-based, 2 colors
                      CUPS_CSPACE_ICC3  CUPS 1.1.19/macOS 10.3 ICC-based, 3 colors
                      CUPS_CSPACE_ICC4  CUPS 1.1.19/macOS 10.3 ICC-based, 4 colors
                      CUPS_CSPACE_ICC5  CUPS 1.1.19/macOS 10.3 ICC-based, 5 colors
                      CUPS_CSPACE_ICC6  CUPS 1.1.19/macOS 10.3 ICC-based, 6 colors
                      CUPS_CSPACE_ICC7  CUPS 1.1.19/macOS 10.3 ICC-based, 7 colors
                      CUPS_CSPACE_ICC8  CUPS 1.1.19/macOS 10.3 ICC-based, 8 colors
                      CUPS_CSPACE_ICC9  CUPS 1.1.19/macOS 10.3 ICC-based, 9 colors
                      CUPS_CSPACE_ICCA  CUPS 1.1.19/macOS 10.3 ICC-based, 10 colors
                      CUPS_CSPACE_ICCB  CUPS 1.1.19/macOS 10.3 ICC-based, 11 colors
                      CUPS_CSPACE_ICCC  CUPS 1.1.19/macOS 10.3 ICC-based, 12 colors
                      CUPS_CSPACE_ICCD  CUPS 1.1.19/macOS 10.3 ICC-based, 13 colors
                      CUPS_CSPACE_ICCE  CUPS 1.1.19/macOS 10.3 ICC-based, 14 colors
                      CUPS_CSPACE_ICCF  CUPS 1.1.19/macOS 10.3 ICC-based, 15 colors
                      CUPS_CSPACE_K Black (DeviceK)
                      CUPS_CSPACE_KCMY  DEPRECATED Black, cyan, magenta, yellow
                      CUPS_CSPACE_KCMYcm  DEPRECATED Black, cyan, magenta, yellow, light-cyan, light-magenta
                      CUPS_CSPACE_RGB Red, green, blue (DeviceRGB, sRGB by default)
                      CUPS_CSPACE_RGBA Red, green, blue, alpha (DeviceRGB, sRGB by default)
                      CUPS_CSPACE_RGBW  CUPS 1.2/macOS 10.5 Red, green, blue, white (DeviceRGB, sRGB by default)
                      CUPS_CSPACE_SILVER  DEPRECATED Silver foil
                      CUPS_CSPACE_SRGB  CUPS 1.4.5 Red, green, blue (sRGB)
                      CUPS_CSPACE_SW  CUPS 1.4.5 Luminance (gamma 2.2)
                      CUPS_CSPACE_W Luminance (DeviceGray, gamma 2.2 by default)
                      CUPS_CSPACE_WHITE  DEPRECATED White ink (as black)
                      CUPS_CSPACE_YMC  DEPRECATED Yellow, magenta, cyan
                      CUPS_CSPACE_YMCK  DEPRECATED Yellow, magenta, cyan, black
                      +

                      cups_cut_e

                      +

                      CutMedia attribute values

                      +

                      Constants

                      + + + + + + +
                      CUPS_CUT_FILE Cut the roll after this file
                      CUPS_CUT_JOB Cut the roll after this job
                      CUPS_CUT_NONE Never cut the roll
                      CUPS_CUT_PAGE Cut the roll after this page
                      CUPS_CUT_SET Cut the roll after this set
                      +

                      cups_edge_e

                      +

                      LeadingEdge attribute values

                      +

                      Constants

                      + + + + + +
                      CUPS_EDGE_BOTTOM Leading edge is the bottom of the page
                      CUPS_EDGE_LEFT Leading edge is the left of the page
                      CUPS_EDGE_RIGHT Leading edge is the right of the page
                      CUPS_EDGE_TOP Leading edge is the top of the page
                      +

                      cups_jog_e

                      +

                      Jog attribute values

                      +

                      Constants

                      + + + + + +
                      CUPS_JOG_FILE Move pages after this file
                      CUPS_JOG_JOB Move pages after this job
                      CUPS_JOG_NONE Never move pages
                      CUPS_JOG_SET Move pages after this set
                      +

                      cups_mode_e

                      +

                      cupsRasterOpen modes

                      +

                      Constants

                      + + + + + +
                      CUPS_RASTER_READ Open stream for reading
                      CUPS_RASTER_WRITE Open stream for writing
                      CUPS_RASTER_WRITE_COMPRESSED  CUPS 1.3/macOS 10.5 Open stream for compressed writing
                      CUPS_RASTER_WRITE_PWG  CUPS 1.5/macOS 10.7 Open stream for compressed writing in PWG Raster mode
                      +

                      cups_order_e

                      +

                      cupsColorOrder attribute values

                      +

                      Constants

                      + + + + +
                      CUPS_ORDER_BANDED CCC MMM YYY KKK ...
                      CUPS_ORDER_CHUNKED CMYK CMYK CMYK ...
                      CUPS_ORDER_PLANAR CCC ... MMM ... YYY ... KKK ...
                      +

                      cups_orient_e

                      +

                      Orientation attribute values

                      +

                      Constants

                      + + + + + +
                      CUPS_ORIENT_0 Don't rotate the page
                      CUPS_ORIENT_180 Turn the page upside down
                      CUPS_ORIENT_270 Rotate the page clockwise
                      CUPS_ORIENT_90 Rotate the page counter-clockwise
                      +

                      cups_ptype_e

                      +

                      Printer type/capability bit constants

                      -

                      Constants

                      - - diff -Nru cups-2.3.3op2/templates/class.tmpl cups-2.4.1op1/templates/class.tmpl --- cups-2.3.3op2/templates/class.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/class.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ {printer_state=5?:} {printer_is_accepting_jobs=0?:} - + diff -Nru cups-2.3.3op2/templates/da/choose-model.tmpl cups-2.4.1op1/templates/da/choose-model.tmpl --- cups-2.3.3op2/templates/da/choose-model.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/da/choose-model.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,7 +39,7 @@ diff -Nru cups-2.3.3op2/templates/da/class.tmpl cups-2.4.1op1/templates/da/class.tmpl --- cups-2.3.3op2/templates/da/class.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/da/class.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ {printer_state=5?:} {printer_is_accepting_jobs=0?:} - + diff -Nru cups-2.3.3op2/templates/da/header.tmpl.in cups-2.4.1op1/templates/da/header.tmpl.in --- cups-2.3.3op2/templates/da/header.tmpl.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/da/header.tmpl.in 2022-01-27 11:11:42.000000000 +0000 @@ -24,12 +24,12 @@ } } --> - {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + {title} - CUPS @CUPS_VERSION@
                        -
                      • CUPS.org
                      • +
                      • OpenPrinting CUPS
                      • Hjem
                      • Administration
                      • Klasser
                      • diff -Nru cups-2.3.3op2/templates/da/help-header.tmpl cups-2.4.1op1/templates/da/help-header.tmpl --- cups-2.3.3op2/templates/da/help-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/da/help-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -38,4 +38,4 @@

                        Hvis CUPS er nyt for dig, så læs "Oversigt over CUPS"-siden.

                        -

                        CUPS-hjemmesiden giver også mange ressourcer, inklusiv fora til brugerdiskussion, svar på oftest stillede spørgsmål, og en formular til indsendelse af fejlrapporter og anmodninger om funktionaliteter.

                        } +

                        CUPS-hjemmesiden giver også mange ressourcer, inklusiv fora til brugerdiskussion, svar på oftest stillede spørgsmål, og en formular til indsendelse af fejlrapporter og anmodninger om funktionaliteter.

                        } diff -Nru cups-2.3.3op2/templates/da/jobs-header.tmpl cups-2.4.1op1/templates/da/jobs-header.tmpl --- cups-2.3.3op2/templates/da/jobs-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/da/jobs-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -2,4 +2,4 @@ {?which_jobs=completed?:
                        } {?which_jobs=all?:
                        } -

                        {?which_jobs=?Jobs oplistet i udskrivningsrækkefølge - tilbageholdte jobs vises først.:{which_jobs=Jobs oplistes i stigende rækkefølge.?:Jobs oplistes i faldende rækkefølge.}}

                        +

                        {?which_jobs=?Jobs oplistet i udskrivningsrækkefølge - tilbageholdte jobs vises først.:{which_jobs=all?Jobs oplistes i stigende rækkefølge.:Jobs oplistes i faldende rækkefølge.}}

                        diff -Nru cups-2.3.3op2/templates/de/choose-model.tmpl cups-2.4.1op1/templates/de/choose-model.tmpl --- cups-2.3.3op2/templates/de/choose-model.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/de/choose-model.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,7 +39,7 @@
                      diff -Nru cups-2.3.3op2/templates/de/class.tmpl cups-2.4.1op1/templates/de/class.tmpl --- cups-2.3.3op2/templates/de/class.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/de/class.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ {printer_state=5?:} {printer_is_accepting_jobs=0?:} - + diff -Nru cups-2.3.3op2/templates/de/header.tmpl.in cups-2.4.1op1/templates/de/header.tmpl.in --- cups-2.3.3op2/templates/de/header.tmpl.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/de/header.tmpl.in 2022-01-27 11:11:42.000000000 +0000 @@ -24,12 +24,12 @@ } } --> - {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + {title} - CUPS @CUPS_VERSION@
                        -
                      • CUPS.org
                      • +
                      • OpenPrinting CUPS
                      • Startseite
                      • Verwaltung
                      • Klassen
                      • diff -Nru cups-2.3.3op2/templates/de/jobs-header.tmpl cups-2.4.1op1/templates/de/jobs-header.tmpl --- cups-2.3.3op2/templates/de/jobs-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/de/jobs-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -2,4 +2,4 @@ {?which_jobs=completed?:
                        } {?which_jobs=all?:
                        } -

                        {?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

                        +

                        {?which_jobs=?Aktive Aufträge in Reihenfolge der Abarbeitung▼:{which_jobs=all?Aufträge in sequenzieller Reihenfolge▼:Aufträge in der Reihenfolge der Fertigstellung oder Abbruch▲}}

                        diff -Nru cups-2.3.3op2/templates/de/pager.tmpl cups-2.4.1op1/templates/de/pager.tmpl --- cups-2.3.3op2/templates/de/pager.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/de/pager.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,6 @@
                      CUPS_PRINTER_AUTHENTICATED  CUPS 1.2/macOS 10.5  Printer requires authentication +

                      Constants

                      + + - - - - - - + + + + + - - - - - - - - - - + + + + + + + + + - - - - - - - -
                      CUPS_PRINTER_AUTHENTICATED  CUPS 1.2/macOS 10.5 Printer requires authentication
                      CUPS_PRINTER_BIND Can bind output
                      CUPS_PRINTER_BW Can do B&W printing
                      CUPS_PRINTER_CLASS Printer class
                      CUPS_PRINTER_COLLATE Can quickly collate copies
                      CUPS_PRINTER_COLOR Can do color printing
                      CUPS_PRINTER_COMMANDS  CUPS 1.2/macOS 10.5  Printer supports maintenance commands +
                      CUPS_PRINTER_BIND Can bind output
                      CUPS_PRINTER_BW Can do B&W printing
                      CUPS_PRINTER_CLASS Printer class
                      CUPS_PRINTER_COLLATE Can quickly collate copies
                      CUPS_PRINTER_COLOR Can do color printing
                      CUPS_PRINTER_COMMANDS  CUPS 1.2/macOS 10.5 Printer supports maintenance commands
                      CUPS_PRINTER_COPIES Can do copies in hardware
                      CUPS_PRINTER_COVER Can cover output
                      CUPS_PRINTER_DEFAULT Default printer on network
                      CUPS_PRINTER_DISCOVERED  CUPS 1.2/macOS 10.5  Printer was discovered
                      CUPS_PRINTER_DUPLEX Can do two-sided printing
                      CUPS_PRINTER_FAX Fax queue
                      CUPS_PRINTER_LARGE Can print on D/E/A1/A0-size media
                      CUPS_PRINTER_LOCAL Local printer or class
                      CUPS_PRINTER_MEDIUM Can print on Tabloid/B/C/A3/A2-size media
                      CUPS_PRINTER_NOT_SHARED  CUPS 1.2/macOS 10.5  Printer is not shared +
                      CUPS_PRINTER_COPIES Can do copies in hardware
                      CUPS_PRINTER_COVER Can cover output
                      CUPS_PRINTER_DEFAULT Default printer on network
                      CUPS_PRINTER_DISCOVERED  CUPS 1.2/macOS 10.5 Printer was discovered
                      CUPS_PRINTER_DUPLEX Can do two-sided printing
                      CUPS_PRINTER_FAX Fax queue
                      CUPS_PRINTER_LARGE Can print on D/E/A1/A0-size media
                      CUPS_PRINTER_LOCAL Local printer or class
                      CUPS_PRINTER_MEDIUM Can print on Tabloid/B/C/A3/A2-size media
                      CUPS_PRINTER_NOT_SHARED  CUPS 1.2/macOS 10.5 Printer is not shared
                      CUPS_PRINTER_PUNCH Can punch output
                      CUPS_PRINTER_REJECTING Printer is rejecting jobs
                      CUPS_PRINTER_REMOTE Remote printer or class
                      CUPS_PRINTER_SMALL Can print on Letter/Legal/A4-size media
                      CUPS_PRINTER_SORT Can sort output
                      CUPS_PRINTER_STAPLE Can staple output
                      CUPS_PRINTER_VARIABLE Can print on rolls and custom-size media
                      -

                      http_encoding_e

                      -

                      HTTP transfer encoding values

                      -

                      Constants

                      - - - - -
                      HTTP_ENCODING_CHUNKED Data is chunked
                      HTTP_ENCODING_FIELDS Sending HTTP fields
                      HTTP_ENCODING_LENGTH Data is sent with Content-Length
                      -

                      http_encryption_e

                      -

                      HTTP encryption values

                      -

                      Constants

                      - - - - - -
                      HTTP_ENCRYPTION_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_field_e

                      -

                      HTTP field names

                      -

                      Constants

                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      HTTP_FIELD_ACCEPT_ENCODING  CUPS 1.7/macOS 10.9  Accepting-Encoding field
                      HTTP_FIELD_ACCEPT_LANGUAGE Accept-Language field
                      HTTP_FIELD_ACCEPT_RANGES Accept-Ranges field
                      HTTP_FIELD_ALLOW  CUPS 1.7/macOS 10.9  Allow field
                      HTTP_FIELD_AUTHENTICATION_INFO  CUPS 2.2.9)  Authentication-Info field (
                      HTTP_FIELD_AUTHORIZATION Authorization field
                      HTTP_FIELD_CONNECTION Connection field
                      HTTP_FIELD_CONTENT_ENCODING Content-Encoding field
                      HTTP_FIELD_CONTENT_LANGUAGE Content-Language field
                      HTTP_FIELD_CONTENT_LENGTH Content-Length field
                      HTTP_FIELD_CONTENT_LOCATION Content-Location field
                      HTTP_FIELD_CONTENT_MD5 Content-MD5 field
                      HTTP_FIELD_CONTENT_RANGE Content-Range field
                      HTTP_FIELD_CONTENT_TYPE Content-Type field
                      HTTP_FIELD_CONTENT_VERSION Content-Version field
                      HTTP_FIELD_DATE Date field
                      HTTP_FIELD_HOST Host field
                      HTTP_FIELD_IF_MODIFIED_SINCE If-Modified-Since field
                      HTTP_FIELD_IF_UNMODIFIED_SINCE If-Unmodified-Since field
                      HTTP_FIELD_KEEP_ALIVE Keep-Alive field
                      HTTP_FIELD_LAST_MODIFIED Last-Modified field
                      HTTP_FIELD_LINK Link field
                      HTTP_FIELD_LOCATION Location field
                      HTTP_FIELD_MAX Maximum field index
                      HTTP_FIELD_RANGE Range field
                      HTTP_FIELD_REFERER Referer field
                      HTTP_FIELD_RETRY_AFTER Retry-After field
                      HTTP_FIELD_SERVER  CUPS 1.7/macOS 10.9  Server field
                      HTTP_FIELD_TRANSFER_ENCODING Transfer-Encoding field
                      HTTP_FIELD_UNKNOWN Unknown field
                      HTTP_FIELD_UPGRADE Upgrade field
                      HTTP_FIELD_USER_AGENT User-Agent field
                      HTTP_FIELD_WWW_AUTHENTICATE WWW-Authenticate field
                      -

                      http_keepalive_e

                      -

                      HTTP keep-alive values

                      -

                      Constants

                      - - - + + + + + + + +
                      HTTP_KEEPALIVE_OFF No keep alive support
                      HTTP_KEEPALIVE_ON Use keep alive
                      CUPS_PRINTER_PUNCH Can punch output
                      CUPS_PRINTER_REJECTING Printer is rejecting jobs
                      CUPS_PRINTER_REMOTE Remote printer or class
                      CUPS_PRINTER_SMALL Can print on Letter/Legal/A4-size media
                      CUPS_PRINTER_SORT Can sort output
                      CUPS_PRINTER_STAPLE Can staple output
                      CUPS_PRINTER_VARIABLE Can print on rolls and custom-size media
                      +

                      http_encoding_e

                      +

                      HTTP transfer encoding values

                      +

                      Constants

                      + + + + +
                      HTTP_ENCODING_CHUNKED Data is chunked
                      HTTP_ENCODING_FIELDS Sending HTTP fields
                      HTTP_ENCODING_LENGTH Data is sent with Content-Length
                      +

                      http_encryption_e

                      +

                      HTTP encryption values

                      +

                      Constants

                      + + + + + +
                      HTTP_ENCRYPTION_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_field_e

                      +

                      HTTP field names

                      +

                      Constants

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      HTTP_FIELD_ACCEPT_ENCODING  CUPS 1.7/macOS 10.9 Accepting-Encoding field
                      HTTP_FIELD_ACCEPT_LANGUAGE Accept-Language field
                      HTTP_FIELD_ACCEPT_RANGES Accept-Ranges field
                      HTTP_FIELD_ALLOW  CUPS 1.7/macOS 10.9 Allow field
                      HTTP_FIELD_AUTHENTICATION_INFO  CUPS 2.2.9) Authentication-Info field (
                      HTTP_FIELD_AUTHORIZATION Authorization field
                      HTTP_FIELD_CONNECTION Connection field
                      HTTP_FIELD_CONTENT_ENCODING Content-Encoding field
                      HTTP_FIELD_CONTENT_LANGUAGE Content-Language field
                      HTTP_FIELD_CONTENT_LENGTH Content-Length field
                      HTTP_FIELD_CONTENT_LOCATION Content-Location field
                      HTTP_FIELD_CONTENT_MD5 Content-MD5 field
                      HTTP_FIELD_CONTENT_RANGE Content-Range field
                      HTTP_FIELD_CONTENT_TYPE Content-Type field
                      HTTP_FIELD_CONTENT_VERSION Content-Version field
                      HTTP_FIELD_DATE Date field
                      HTTP_FIELD_HOST Host field
                      HTTP_FIELD_IF_MODIFIED_SINCE If-Modified-Since field
                      HTTP_FIELD_IF_UNMODIFIED_SINCE If-Unmodified-Since field
                      HTTP_FIELD_KEEP_ALIVE Keep-Alive field
                      HTTP_FIELD_LAST_MODIFIED Last-Modified field
                      HTTP_FIELD_LINK Link field
                      HTTP_FIELD_LOCATION Location field
                      HTTP_FIELD_MAX Maximum field index
                      HTTP_FIELD_RANGE Range field
                      HTTP_FIELD_REFERER Referer field
                      HTTP_FIELD_RETRY_AFTER Retry-After field
                      HTTP_FIELD_SERVER  CUPS 1.7/macOS 10.9 Server field
                      HTTP_FIELD_TRANSFER_ENCODING Transfer-Encoding field
                      HTTP_FIELD_UNKNOWN Unknown field
                      HTTP_FIELD_UPGRADE Upgrade field
                      HTTP_FIELD_USER_AGENT User-Agent field
                      HTTP_FIELD_WWW_AUTHENTICATE WWW-Authenticate field
                      +

                      http_keepalive_e

                      +

                      HTTP keep-alive values

                      +

                      Constants

                      + + +
                      HTTP_KEEPALIVE_OFF No keep alive support
                      HTTP_KEEPALIVE_ON Use keep alive
                      -

                      http_state_e

                      -

                      HTTP state values; states +

                      http_state_e

                      +

                      HTTP state values; states are server-oriented...

                      -

                      Constants

                      - - - - - - - - - - - - - - - - - - -
                      HTTP_STATE_CONNECT CONNECT command, waiting for blank line
                      HTTP_STATE_DELETE DELETE command, waiting for blank line
                      HTTP_STATE_ERROR Error on socket
                      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_OPTIONS OPTIONS 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_STATUS Command complete, sending status
                      HTTP_STATE_TRACE TRACE command, waiting for blank line
                      HTTP_STATE_UNKNOWN_METHOD  CUPS 1.7/macOS 10.9  Unknown request method, waiting for blank line
                      HTTP_STATE_UNKNOWN_VERSION  CUPS 1.7/macOS 10.9  Unknown request method, waiting for blank line
                      HTTP_STATE_WAITING Waiting for command
                      -

                      http_status_e

                      -

                      HTTP status codes

                      -

                      Constants

                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      HTTP_STATUS_ACCEPTED DELETE command was successful
                      HTTP_STATUS_BAD_GATEWAY Bad gateway
                      HTTP_STATUS_BAD_REQUEST Bad request
                      HTTP_STATUS_CONFLICT Request is self-conflicting
                      HTTP_STATUS_CONTINUE Everything OK, keep going...
                      HTTP_STATUS_CREATED PUT command was successful
                      HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED  CUPS 1.4  User canceled authorization
                      HTTP_STATUS_CUPS_PKI_ERROR  CUPS 1.5/macOS 10.7  Error negotiating a secure connection
                      HTTP_STATUS_ERROR An error response from httpXxxx()
                      HTTP_STATUS_EXPECTATION_FAILED The expectation given in an Expect header field was not met
                      HTTP_STATUS_FORBIDDEN Forbidden to access this URI
                      HTTP_STATUS_FOUND Document was found at a different URI
                      HTTP_STATUS_GATEWAY_TIMEOUT Gateway connection timed out
                      HTTP_STATUS_GONE Server has gone away
                      HTTP_STATUS_LENGTH_REQUIRED A content length or encoding is required
                      HTTP_STATUS_METHOD_NOT_ALLOWED Method is not allowed
                      HTTP_STATUS_MOVED_PERMANENTLY Document has moved permanently
                      HTTP_STATUS_MULTIPLE_CHOICES Multiple files match request
                      HTTP_STATUS_NONE  CUPS 1.7/macOS 10.9  No Expect value
                      HTTP_STATUS_NOT_ACCEPTABLE Not Acceptable
                      HTTP_STATUS_NOT_AUTHORITATIVE Information isn't authoritative
                      HTTP_STATUS_NOT_FOUND URI was not found
                      HTTP_STATUS_NOT_IMPLEMENTED Feature not implemented
                      HTTP_STATUS_NOT_MODIFIED File not modified
                      HTTP_STATUS_NOT_SUPPORTED HTTP version not supported
                      HTTP_STATUS_NO_CONTENT Successful command, no new data
                      HTTP_STATUS_OK OPTIONS/GET/HEAD/POST/TRACE command was successful
                      HTTP_STATUS_PARTIAL_CONTENT Only a partial file was received/sent
                      HTTP_STATUS_PAYMENT_REQUIRED Payment required
                      HTTP_STATUS_PRECONDITION Precondition failed
                      HTTP_STATUS_PROXY_AUTHENTICATION Proxy Authentication is Required
                      HTTP_STATUS_REQUESTED_RANGE The requested range is not satisfiable
                      HTTP_STATUS_REQUEST_TIMEOUT Request timed out
                      HTTP_STATUS_REQUEST_TOO_LARGE Request entity too large
                      HTTP_STATUS_RESET_CONTENT Content was reset/recreated
                      HTTP_STATUS_SEE_OTHER See this other link
                      HTTP_STATUS_SERVER_ERROR Internal server error
                      HTTP_STATUS_SERVICE_UNAVAILABLE Service is unavailable
                      HTTP_STATUS_SWITCHING_PROTOCOLS HTTP upgrade to TLS/SSL
                      HTTP_STATUS_TEMPORARY_REDIRECT Temporary redirection
                      HTTP_STATUS_UNAUTHORIZED Unauthorized to access host
                      HTTP_STATUS_UNSUPPORTED_MEDIATYPE The requested media type is unsupported
                      HTTP_STATUS_UPGRADE_REQUIRED Upgrade to SSL/TLS required
                      HTTP_STATUS_URI_TOO_LONG URI too long
                      HTTP_STATUS_USE_PROXY Must use a proxy to access this URI
                      -

                       CUPS 2.0/OS 10.10 http_trust_e

                      -

                      Level of trust for credentials

                      -

                      Constants

                      - - - - - - - -
                      HTTP_TRUST_CHANGED Credentials have changed
                      HTTP_TRUST_EXPIRED Credentials are expired
                      HTTP_TRUST_INVALID Credentials are invalid
                      HTTP_TRUST_OK Credentials are OK/trusted
                      HTTP_TRUST_RENEWED Credentials have been renewed
                      HTTP_TRUST_UNKNOWN Credentials are unknown/new
                      -

                      http_uri_coding_e

                      -

                      URI en/decode flags

                      -

                      Constants

                      - - - - - - - - - -
                      HTTP_URI_CODING_ALL En/decode everything
                      HTTP_URI_CODING_HOSTNAME En/decode the hostname portion
                      HTTP_URI_CODING_MOST En/decode all but the query
                      HTTP_URI_CODING_NONE Don't en/decode anything
                      HTTP_URI_CODING_QUERY En/decode the query portion
                      HTTP_URI_CODING_RESOURCE En/decode the resource portion
                      HTTP_URI_CODING_RFC6874 Use RFC 6874 address format
                      HTTP_URI_CODING_USERNAME En/decode the username portion
                      -

                       CUPS 1.2 http_uri_status_e

                      -

                      URI separation status

                      -

                      Constants

                      - - - - - - - - - - - - - -
                      HTTP_URI_STATUS_BAD_ARGUMENTS Bad arguments to function (error)
                      HTTP_URI_STATUS_BAD_HOSTNAME Bad hostname in URI (error)
                      HTTP_URI_STATUS_BAD_PORT Bad port number in URI (error)
                      HTTP_URI_STATUS_BAD_RESOURCE Bad resource in URI (error)
                      HTTP_URI_STATUS_BAD_SCHEME Bad scheme in URI (error)
                      HTTP_URI_STATUS_BAD_URI Bad/empty URI (error)
                      HTTP_URI_STATUS_BAD_USERNAME Bad username in URI (error)
                      HTTP_URI_STATUS_MISSING_RESOURCE Missing resource in URI (warning)
                      HTTP_URI_STATUS_MISSING_SCHEME Missing scheme in URI (warning)
                      HTTP_URI_STATUS_OK URI decoded OK
                      HTTP_URI_STATUS_OVERFLOW URI buffer for httpAssembleURI is too small
                      HTTP_URI_STATUS_UNKNOWN_SCHEME Unknown scheme in URI (warning)
                      -

                      ipp_finishings_e

                      -

                      Finishings values

                      -

                      Constants

                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      IPP_FINISHINGS_BALE Bale (any type)
                      IPP_FINISHINGS_BIND Bind
                      IPP_FINISHINGS_BIND_BOTTOM Bind on bottom
                      IPP_FINISHINGS_BIND_LEFT Bind on left
                      IPP_FINISHINGS_BIND_RIGHT Bind on right
                      IPP_FINISHINGS_BIND_TOP Bind on top
                      IPP_FINISHINGS_BOOKLET_MAKER Fold to make booklet
                      IPP_FINISHINGS_COAT Apply protective liquid or powder coating
                      IPP_FINISHINGS_COVER Add cover
                      IPP_FINISHINGS_EDGE_STITCH Stitch along any side
                      IPP_FINISHINGS_EDGE_STITCH_BOTTOM Stitch along bottom edge
                      IPP_FINISHINGS_EDGE_STITCH_LEFT Stitch along left side
                      IPP_FINISHINGS_EDGE_STITCH_RIGHT Stitch along right side
                      IPP_FINISHINGS_EDGE_STITCH_TOP Stitch along top edge
                      IPP_FINISHINGS_FOLD Fold (any type)
                      IPP_FINISHINGS_FOLD_ACCORDION Accordion-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_ENGINEERING_Z Fold the paper vertically into two small sections and one larger, forming an elongated Z
                      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
                      IPP_FINISHINGS_JOG_OFFSET Offset for binding (any type)
                      IPP_FINISHINGS_LAMINATE Apply protective (solid) material
                      IPP_FINISHINGS_NONE No finishing
                      IPP_FINISHINGS_PUNCH Punch (any location/count)
                      IPP_FINISHINGS_PUNCH_BOTTOM_LEFT Punch 1 hole bottom left
                      IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT Punch 1 hole bottom right
                      IPP_FINISHINGS_PUNCH_DUAL_BOTTOM Punch 2 holes bottom edge
                      IPP_FINISHINGS_PUNCH_DUAL_LEFT Punch 2 holes left side
                      IPP_FINISHINGS_PUNCH_DUAL_RIGHT Punch 2 holes right side
                      IPP_FINISHINGS_PUNCH_DUAL_TOP Punch 2 holes top edge
                      IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM Punch multiple holes bottom edge
                      IPP_FINISHINGS_PUNCH_MULTIPLE_LEFT Punch multiple holes left side
                      IPP_FINISHINGS_PUNCH_MULTIPLE_RIGHT Punch multiple holes right side
                      IPP_FINISHINGS_PUNCH_MULTIPLE_TOP Punch multiple holes top edge
                      IPP_FINISHINGS_PUNCH_QUAD_BOTTOM Punch 4 holes bottom edge
                      IPP_FINISHINGS_PUNCH_QUAD_LEFT Punch 4 holes left side
                      IPP_FINISHINGS_PUNCH_QUAD_RIGHT Punch 4 holes right side
                      IPP_FINISHINGS_PUNCH_QUAD_TOP Punch 4 holes top edge
                      IPP_FINISHINGS_PUNCH_TOP_LEFT Punch 1 hole top left
                      IPP_FINISHINGS_PUNCH_TOP_RIGHT Punch 1 hole top right
                      IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM Punch 3 holes bottom edge
                      IPP_FINISHINGS_PUNCH_TRIPLE_LEFT Punch 3 holes left side
                      IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT Punch 3 holes right side
                      IPP_FINISHINGS_PUNCH_TRIPLE_TOP Punch 3 holes top edge
                      IPP_FINISHINGS_SADDLE_STITCH Staple interior
                      IPP_FINISHINGS_STAPLE Staple (any location/method)
                      IPP_FINISHINGS_STAPLE_BOTTOM_LEFT Staple bottom left corner
                      IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT Staple bottom right corner
                      IPP_FINISHINGS_STAPLE_DUAL_BOTTOM Two staples on bottom
                      IPP_FINISHINGS_STAPLE_DUAL_LEFT Two staples on left
                      IPP_FINISHINGS_STAPLE_DUAL_RIGHT Two staples on right
                      IPP_FINISHINGS_STAPLE_DUAL_TOP Two staples on top
                      IPP_FINISHINGS_STAPLE_TOP_LEFT Staple top left corner
                      IPP_FINISHINGS_STAPLE_TOP_RIGHT Staple top right corner
                      IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM Three staples on bottom
                      IPP_FINISHINGS_STAPLE_TRIPLE_LEFT Three staples on left
                      IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT Three staples on right
                      IPP_FINISHINGS_STAPLE_TRIPLE_TOP Three staples on top
                      IPP_FINISHINGS_TRIM Trim (any type)
                      IPP_FINISHINGS_TRIM_AFTER_COPIES Trim output after each copy
                      IPP_FINISHINGS_TRIM_AFTER_DOCUMENTS Trim output after each document
                      IPP_FINISHINGS_TRIM_AFTER_JOB Trim output after job
                      IPP_FINISHINGS_TRIM_AFTER_PAGES Trim output after each page
                      -

                      ipp_jstate_e

                      -

                      Job states

                      -

                      Constants

                      - - - - - - - - -
                      IPP_JSTATE_ABORTED Job has aborted due to error
                      IPP_JSTATE_CANCELED Job has been canceled
                      IPP_JSTATE_COMPLETED Job has completed successfully
                      IPP_JSTATE_HELD Job is held for printing
                      IPP_JSTATE_PENDING Job is waiting to be printed
                      IPP_JSTATE_PROCESSING Job is currently printing
                      IPP_JSTATE_STOPPED Job has been stopped
                      -

                      ipp_op_e

                      -

                      IPP operations

                      -

                      Constants

                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      IPP_OP_ALLOCATE_PRINTER_RESOURCES Allocate-Printer-Resources: Use resources for a printer.
                      IPP_OP_CANCEL_CURRENT_JOB Cancel-Current-Job: Cancel the current job
                      IPP_OP_CANCEL_JOB Cancel-Job: Cancel a job
                      IPP_OP_CANCEL_JOBS Cancel-Jobs: Cancel all jobs (administrative)
                      IPP_OP_CANCEL_MY_JOBS Cancel-My-Jobs: Cancel a user's jobs
                      IPP_OP_CANCEL_RESOURCE Cancel-Resource: Uninstall a resource.
                      IPP_OP_CANCEL_SUBSCRIPTION  CUPS 1.2/macOS 10.5  Cancel-Subscription: Cancel a subscription
                      IPP_OP_CLOSE_JOB Close-Job: Close a job and start printing
                      IPP_OP_CREATE_JOB Create-Job: Create an empty print job
                      IPP_OP_CREATE_JOB_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5  Create-Job-Subscriptions: Create one of more job subscriptions
                      IPP_OP_CREATE_PRINTER Create-Printer: Create a new service.
                      IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5  Create-Printer-Subscriptions: Create one or more printer subscriptions
                      IPP_OP_CREATE_RESOURCE Create-Resource: Create a new (empty) resource.
                      IPP_OP_CREATE_RESOURCE_SUBSCRIPTIONS Create-Resource-Subscriptions: Create event subscriptions for a resource.
                      IPP_OP_CREATE_SYSTEM_SUBSCRIPTIONS Create-System-Subscriptions: Create event subscriptions for a system.
                      IPP_OP_CUPS_ADD_MODIFY_CLASS CUPS-Add-Modify-Class: Add or modify a class
                      IPP_OP_CUPS_ADD_MODIFY_PRINTER CUPS-Add-Modify-Printer: Add or modify a printer
                      IPP_OP_CUPS_AUTHENTICATE_JOB  CUPS 1.2/macOS 10.5  CUPS-Authenticate-Job: Authenticate a job
                      IPP_OP_CUPS_CREATE_LOCAL_PRINTER  CUPS 2.2  CUPS-Create-Local-Printer: Create a local (temporary) printer
                      IPP_OP_CUPS_DELETE_CLASS CUPS-Delete-Class: Delete a class
                      IPP_OP_CUPS_DELETE_PRINTER CUPS-Delete-Printer: Delete a printer
                      IPP_OP_CUPS_GET_DEFAULT CUPS-Get-Default: Get the default printer
                      IPP_OP_CUPS_GET_DEVICES  DEPRECATED  CUPS-Get-Devices: Get a list of supported devices
                      IPP_OP_CUPS_GET_DOCUMENT  CUPS 1.4/macOS 10.6  CUPS-Get-Document: Get a document file
                      IPP_OP_CUPS_GET_PPD  DEPRECATED  CUPS-Get-PPD: Get a PPD file
                      IPP_OP_CUPS_GET_PPDS  DEPRECATED  CUPS-Get-PPDs: Get a list of supported drivers
                      IPP_OP_CUPS_GET_PRINTERS CUPS-Get-Printers: Get a list of printers and/or classes
                      IPP_OP_CUPS_INVALID Invalid operation name for ippOpValue
                      IPP_OP_CUPS_MOVE_JOB CUPS-Move-Job: Move a job to a different printer
                      IPP_OP_CUPS_SET_DEFAULT CUPS-Set-Default: Set the default printer
                      IPP_OP_DEALLOCATE_PRINTER_RESOURCES Deallocate-Printer-Resources: Stop using resources for a printer.
                      IPP_OP_DELETE_PRINTER Delete-Printer: Delete an existing service.
                      IPP_OP_DISABLE_ALL_PRINTERS Disable-All-Printers: Stop accepting new jobs on all services.
                      IPP_OP_DISABLE_PRINTER Disable-Printer: Reject new jobs for a printer
                      IPP_OP_ENABLE_ALL_PRINTERS Enable-All-Printers: Start accepting new jobs on all services.
                      IPP_OP_ENABLE_PRINTER Enable-Printer: Accept new jobs for a printer
                      IPP_OP_GET_JOBS Get-Jobs: Get a list of jobs
                      IPP_OP_GET_JOB_ATTRIBUTES Get-Job-Attribute: Get information about a job
                      IPP_OP_GET_NOTIFICATIONS  CUPS 1.2/macOS 10.5  Get-Notifications: Get notification events
                      IPP_OP_GET_PRINTERS Get-Printers: Get a list of services.
                      IPP_OP_GET_PRINTER_ATTRIBUTES Get-Printer-Attributes: Get information about a printer
                      IPP_OP_GET_PRINTER_SUPPORTED_VALUES Get-Printer-Supported-Values: Get supported values
                      IPP_OP_GET_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5  Get-Subscriptions: Get list of subscriptions
                      IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES  CUPS 1.2/macOS 10.5  Get-Subscription-Attributes: Get subscription information
                      IPP_OP_GET_SYSTEM_ATTRIBUTES Get-System-Attributes: Get system object attributes.
                      IPP_OP_GET_SYSTEM_SUPPORTED_VALUES Get-System-Supported-Values: Get supported values for system object attributes.
                      IPP_OP_HOLD_JOB Hold-Job: Hold a job for printing
                      IPP_OP_HOLD_NEW_JOBS Hold-New-Jobs: Hold new jobs
                      IPP_OP_IDENTIFY_PRINTER Identify-Printer: Make the printer beep, flash, or display a message for identification
                      IPP_OP_INSTALL_RESOURCE Install-Resource: Install a resource.
                      IPP_OP_PAUSE_ALL_PRINTERS Pause-All-Printers: Stop all services immediately.
                      IPP_OP_PAUSE_ALL_PRINTERS_AFTER_CURRENT_JOB Pause-All-Printers-After-Current-Job: Stop all services after processing the current jobs.
                      IPP_OP_PAUSE_PRINTER Pause-Printer: Stop a printer
                      IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB Pause-Printer-After-Current-Job: Stop printer after the current job
                      IPP_OP_PRINT_JOB Print-Job: Print a single file
                      IPP_OP_PROMOTE_JOB Promote-Job: Promote a job to print sooner
                      IPP_OP_REGISTER_OUTPUT_DEVICE Register-Output-Device: Register a remote service.
                      IPP_OP_RELEASE_HELD_NEW_JOBS Release-Held-New-Jobs: Release new jobs that were previously held
                      IPP_OP_RELEASE_JOB Release-Job: Release a job for printing
                      IPP_OP_RENEW_SUBSCRIPTION  CUPS 1.2/macOS 10.5  Renew-Subscription: Renew a printer subscription
                      IPP_OP_RESTART_JOB  DEPRECATED  Restart-Job: Reprint a job
                      IPP_OP_RESTART_SYSTEM Restart-System: Restart all services.
                      IPP_OP_RESUME_ALL_PRINTERS Resume-All-Printers: Start job processing on all services.
                      IPP_OP_RESUME_JOB Resume-Job: Resume the current job
                      IPP_OP_RESUME_PRINTER Resume-Printer: Start a printer
                      IPP_OP_SCHEDULE_JOB_AFTER Schedule-Job-After: Schedule a job to print after another
                      IPP_OP_SEND_DOCUMENT Send-Document: Add a file to a job
                      IPP_OP_SEND_RESOURCE_DATA Send-Resource-Data: Upload the data for a resource.
                      IPP_OP_SET_JOB_ATTRIBUTES Set-Job-Attributes: Set job values
                      IPP_OP_SET_PRINTER_ATTRIBUTES Set-Printer-Attributes: Set printer values
                      IPP_OP_SET_RESOURCE_ATTRIBUTES Set-Resource-Attributes: Set resource object attributes.
                      IPP_OP_SET_SYSTEM_ATTRIBUTES Set-System-Attributes: Set system object attributes.
                      IPP_OP_SHUTDOWN_ALL_PRINTERS Shutdown-All-Printers: Shutdown all services.
                      IPP_OP_SHUTDOWN_ONE_PRINTER Shutdown-One-Printer: Shutdown a service.
                      IPP_OP_STARTUP_ALL_PRINTERS Startup-All-Printers: Startup all services.
                      IPP_OP_STARTUP_ONE_PRINTER Startup-One-Printer: Start a service.
                      IPP_OP_SUSPEND_CURRENT_JOB Suspend-Current-Job: Suspend the current job
                      IPP_OP_VALIDATE_JOB Validate-Job: Validate job values prior to submission
                      -

                      ipp_orient_e

                      -

                      Orientation values

                      -

                      Constants

                      - - - - - - -
                      IPP_ORIENT_LANDSCAPE 90 degrees counter-clockwise
                      IPP_ORIENT_NONE No rotation
                      IPP_ORIENT_PORTRAIT No rotation
                      IPP_ORIENT_REVERSE_LANDSCAPE 90 degrees clockwise
                      IPP_ORIENT_REVERSE_PORTRAIT 180 degrees
                      -

                      ipp_pstate_e

                      -

                      Printer state values

                      -

                      Constants

                      - - - - -
                      IPP_PSTATE_IDLE Printer is idle
                      IPP_PSTATE_PROCESSING Printer is working
                      IPP_PSTATE_STOPPED Printer is stopped
                      -

                      ipp_quality_e

                      -

                      Print quality values

                      -

                      Constants

                      - - - - -
                      IPP_QUALITY_DRAFT Draft quality
                      IPP_QUALITY_HIGH High quality
                      IPP_QUALITY_NORMAL Normal quality
                      -

                      ipp_res_e

                      -

                      Resolution units

                      -

                      Constants

                      - - - -
                      IPP_RES_PER_CM Pixels per centimeter
                      IPP_RES_PER_INCH Pixels per inch
                      -

                      ipp_rstate_e

                      -

                      resource-state values

                      -

                      Constants

                      - - - - - - -
                      IPP_RSTATE_ABORTED Resource has been aborted and is pending deletion.
                      IPP_RSTATE_AVAILABLE Resource is available for installation.
                      IPP_RSTATE_CANCELED Resource has been canceled and is pending deletion.
                      IPP_RSTATE_INSTALLED Resource is installed.
                      IPP_RSTATE_PENDING Resource is created but has no data yet.
                      -

                      ipp_sstate_e

                      -

                      system-state values

                      -

                      Constants

                      - - - - -
                      IPP_SSTATE_IDLE At least one printer is idle and none are processing a job.
                      IPP_SSTATE_PROCESSING At least one printer is processing a job.
                      IPP_SSTATE_STOPPED All printers are stopped.
                      -

                      ipp_state_e

                      -

                      ipp_t state values

                      -

                      Constants

                      - - - - - - -
                      IPP_STATE_ATTRIBUTE One or more attributes need to be sent/received
                      IPP_STATE_DATA IPP request data needs to be sent/received
                      IPP_STATE_ERROR An error occurred
                      IPP_STATE_HEADER The request header needs to be sent/received
                      IPP_STATE_IDLE Nothing is happening/request completed
                      -

                      ipp_status_e

                      -

                      IPP status code values

                      -

                      Constants

                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      IPP_STATUS_CUPS_INVALID Invalid status name for ippErrorValue
                      IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED client-error-account-authorization-failed
                      IPP_STATUS_ERROR_ACCOUNT_CLOSED client-error-account-closed
                      IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED client-error-account-info-needed
                      IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED client-error-account-limit-reached
                      IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE client-error-attributes-not-settable
                      IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES client-error-attributes-or-values-not-supported
                      IPP_STATUS_ERROR_BAD_REQUEST client-error-bad-request
                      IPP_STATUS_ERROR_BUSY server-error-busy
                      IPP_STATUS_ERROR_CHARSET client-error-charset-not-supported
                      IPP_STATUS_ERROR_COMPRESSION_ERROR client-error-compression-error
                      IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED client-error-compression-not-supported
                      IPP_STATUS_ERROR_CONFLICTING client-error-conflicting-attributes
                      IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED  DEPRECATED  cups-error-account-authorization-failed
                      IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED cups-error-account-closed @deprecate@
                      IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED  DEPRECATED  cups-error-account-info-needed
                      IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED  DEPRECATED  cups-error-account-limit-reached
                      IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED  CUPS 1.5/macOS 10.7  cups-authentication-canceled - Authentication canceled by user
                      IPP_STATUS_ERROR_CUPS_PKI  CUPS 1.5/macOS 10.7  cups-pki-error - Error negotiating a secure connection
                      IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED  CUPS 1.5/macOS 10.7  cups-upgrade-required - TLS upgrade required
                      IPP_STATUS_ERROR_DEVICE server-error-device-error
                      IPP_STATUS_ERROR_DOCUMENT_ACCESS client-error-document-access-error
                      IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR client-error-document-format-error
                      IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED client-error-document-format-not-supported
                      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_FORBIDDEN client-error-forbidden
                      IPP_STATUS_ERROR_GONE client-error-gone
                      IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS client-error-ignored-all-subscriptions
                      IPP_STATUS_ERROR_INTERNAL server-error-internal-error
                      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_NOT_ACCEPTING_JOBS server-error-not-accepting-jobs
                      IPP_STATUS_ERROR_NOT_AUTHENTICATED client-error-not-authenticated
                      IPP_STATUS_ERROR_NOT_AUTHORIZED client-error-not-authorized
                      IPP_STATUS_ERROR_NOT_FETCHABLE client-error-not-fetchable
                      IPP_STATUS_ERROR_NOT_FOUND client-error-not-found
                      IPP_STATUS_ERROR_NOT_POSSIBLE client-error-not-possible
                      IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED server-error-operation-not-supported
                      IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED server-error-printer-is-deactivated
                      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_SERVICE_UNAVAILABLE server-error-service-unavailable
                      IPP_STATUS_ERROR_TEMPORARY server-error-temporary-error
                      IPP_STATUS_ERROR_TIMEOUT client-error-timeout
                      IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS server-error-too-many-documents
                      IPP_STATUS_ERROR_TOO_MANY_JOBS server-error-too-many-jobs
                      IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS client-error-too-many-subscriptions
                      IPP_STATUS_ERROR_URI_SCHEME client-error-uri-scheme-not-supported
                      IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED server-error-version-not-supported
                      IPP_STATUS_OK successful-ok
                      IPP_STATUS_OK_CONFLICTING successful-ok-conflicting-attributes
                      IPP_STATUS_OK_EVENTS_COMPLETE successful-ok-events-complete
                      IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED successful-ok-ignored-or-substituted-attributes
                      IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS successful-ok-ignored-subscriptions
                      IPP_STATUS_OK_TOO_MANY_EVENTS successful-ok-too-many-events
                      -

                      ipp_tag_e

                      -

                      Value and group tag values for attributes

                      -

                      Constants

                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

                      Constants

                      +
                      IPP_TAG_ADMINDEFINE Admin-defined value
                      IPP_TAG_BOOLEAN Boolean value
                      IPP_TAG_CHARSET Character set value
                      IPP_TAG_CUPS_INVALID Invalid tag name for ippTagValue
                      IPP_TAG_DATE Date/time value
                      IPP_TAG_DEFAULT Default value
                      IPP_TAG_DELETEATTR Delete-attribute value
                      IPP_TAG_DOCUMENT Document group
                      IPP_TAG_END End-of-attributes
                      IPP_TAG_ENUM Enumeration value
                      IPP_TAG_EVENT_NOTIFICATION Event group
                      IPP_TAG_INTEGER Integer value
                      IPP_TAG_JOB Job group
                      IPP_TAG_KEYWORD Keyword value
                      IPP_TAG_LANGUAGE Language value
                      IPP_TAG_MIMETYPE MIME media type value
                      IPP_TAG_NAME Name value
                      IPP_TAG_NAMELANG Name-with-language value
                      IPP_TAG_NOTSETTABLE Not-settable value
                      IPP_TAG_NOVALUE No-value value
                      IPP_TAG_OPERATION Operation group
                      IPP_TAG_PRINTER Printer group
                      IPP_TAG_RANGE Range value
                      IPP_TAG_RESOLUTION Resolution value
                      IPP_TAG_RESOURCE Resource group
                      IPP_TAG_STRING Octet string value
                      IPP_TAG_SUBSCRIPTION Subscription group
                      IPP_TAG_SYSTEM System group
                      IPP_TAG_TEXT Text value
                      IPP_TAG_TEXTLANG Text-with-language value
                      IPP_TAG_UNKNOWN Unknown value
                      IPP_TAG_UNSUPPORTED_GROUP Unsupported attributes group
                      IPP_TAG_UNSUPPORTED_VALUE Unsupported value
                      IPP_TAG_URI URI value
                      IPP_TAG_URISCHEME URI scheme value
                      IPP_TAG_ZERO Zero tag - used for separators
                      + + + + + + + + + + + + + + + + + +
                      HTTP_STATE_CONNECT CONNECT command, waiting for blank line
                      HTTP_STATE_DELETE DELETE command, waiting for blank line
                      HTTP_STATE_ERROR Error on socket
                      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_OPTIONS OPTIONS 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_STATUS Command complete, sending status
                      HTTP_STATE_TRACE TRACE command, waiting for blank line
                      HTTP_STATE_UNKNOWN_METHOD  CUPS 1.7/macOS 10.9 Unknown request method, waiting for blank line
                      HTTP_STATE_UNKNOWN_VERSION  CUPS 1.7/macOS 10.9 Unknown request method, waiting for blank line
                      HTTP_STATE_WAITING Waiting for command
                      +

                      http_status_e

                      +

                      HTTP status codes

                      +

                      Constants

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      HTTP_STATUS_ACCEPTED DELETE command was successful
                      HTTP_STATUS_BAD_GATEWAY Bad gateway
                      HTTP_STATUS_BAD_REQUEST Bad request
                      HTTP_STATUS_CONFLICT Request is self-conflicting
                      HTTP_STATUS_CONTINUE Everything OK, keep going...
                      HTTP_STATUS_CREATED PUT command was successful
                      HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED  CUPS 1.4 User canceled authorization
                      HTTP_STATUS_CUPS_PKI_ERROR  CUPS 1.5/macOS 10.7 Error negotiating a secure connection
                      HTTP_STATUS_ERROR An error response from httpXxxx()
                      HTTP_STATUS_EXPECTATION_FAILED The expectation given in an Expect header field was not met
                      HTTP_STATUS_FORBIDDEN Forbidden to access this URI
                      HTTP_STATUS_FOUND Document was found at a different URI
                      HTTP_STATUS_GATEWAY_TIMEOUT Gateway connection timed out
                      HTTP_STATUS_GONE Server has gone away
                      HTTP_STATUS_LENGTH_REQUIRED A content length or encoding is required
                      HTTP_STATUS_METHOD_NOT_ALLOWED Method is not allowed
                      HTTP_STATUS_MOVED_PERMANENTLY Document has moved permanently
                      HTTP_STATUS_MULTIPLE_CHOICES Multiple files match request
                      HTTP_STATUS_NONE  CUPS 1.7/macOS 10.9 No Expect value
                      HTTP_STATUS_NOT_ACCEPTABLE Not Acceptable
                      HTTP_STATUS_NOT_AUTHORITATIVE Information isn't authoritative
                      HTTP_STATUS_NOT_FOUND URI was not found
                      HTTP_STATUS_NOT_IMPLEMENTED Feature not implemented
                      HTTP_STATUS_NOT_MODIFIED File not modified
                      HTTP_STATUS_NOT_SUPPORTED HTTP version not supported
                      HTTP_STATUS_NO_CONTENT Successful command, no new data
                      HTTP_STATUS_OK OPTIONS/GET/HEAD/POST/TRACE command was successful
                      HTTP_STATUS_PARTIAL_CONTENT Only a partial file was received/sent
                      HTTP_STATUS_PAYMENT_REQUIRED Payment required
                      HTTP_STATUS_PRECONDITION Precondition failed
                      HTTP_STATUS_PROXY_AUTHENTICATION Proxy Authentication is Required
                      HTTP_STATUS_REQUESTED_RANGE The requested range is not satisfiable
                      HTTP_STATUS_REQUEST_TIMEOUT Request timed out
                      HTTP_STATUS_REQUEST_TOO_LARGE Request entity too large
                      HTTP_STATUS_RESET_CONTENT Content was reset/recreated
                      HTTP_STATUS_SEE_OTHER See this other link
                      HTTP_STATUS_SERVER_ERROR Internal server error
                      HTTP_STATUS_SERVICE_UNAVAILABLE Service is unavailable
                      HTTP_STATUS_SWITCHING_PROTOCOLS HTTP upgrade to TLS/SSL
                      HTTP_STATUS_TEMPORARY_REDIRECT Temporary redirection
                      HTTP_STATUS_UNAUTHORIZED Unauthorized to access host
                      HTTP_STATUS_UNSUPPORTED_MEDIATYPE The requested media type is unsupported
                      HTTP_STATUS_UPGRADE_REQUIRED Upgrade to SSL/TLS required
                      HTTP_STATUS_URI_TOO_LONG URI too long
                      HTTP_STATUS_USE_PROXY Must use a proxy to access this URI
                      +

                       CUPS 2.0/OS 10.10 http_trust_e

                      +

                      Level of trust for credentials

                      +

                      Constants

                      + + + + + + + +
                      HTTP_TRUST_CHANGED Credentials have changed
                      HTTP_TRUST_EXPIRED Credentials are expired
                      HTTP_TRUST_INVALID Credentials are invalid
                      HTTP_TRUST_OK Credentials are OK/trusted
                      HTTP_TRUST_RENEWED Credentials have been renewed
                      HTTP_TRUST_UNKNOWN Credentials are unknown/new
                      +

                      http_uri_coding_e

                      +

                      URI en/decode flags

                      +

                      Constants

                      + + + + + + + + + +
                      HTTP_URI_CODING_ALL En/decode everything
                      HTTP_URI_CODING_HOSTNAME En/decode the hostname portion
                      HTTP_URI_CODING_MOST En/decode all but the query
                      HTTP_URI_CODING_NONE Don't en/decode anything
                      HTTP_URI_CODING_QUERY En/decode the query portion
                      HTTP_URI_CODING_RESOURCE En/decode the resource portion
                      HTTP_URI_CODING_RFC6874 Use RFC 6874 address format
                      HTTP_URI_CODING_USERNAME En/decode the username portion
                      +

                       CUPS 1.2 http_uri_status_e

                      +

                      URI separation status

                      +

                      Constants

                      + + + + + + + + + + + + + +
                      HTTP_URI_STATUS_BAD_ARGUMENTS Bad arguments to function (error)
                      HTTP_URI_STATUS_BAD_HOSTNAME Bad hostname in URI (error)
                      HTTP_URI_STATUS_BAD_PORT Bad port number in URI (error)
                      HTTP_URI_STATUS_BAD_RESOURCE Bad resource in URI (error)
                      HTTP_URI_STATUS_BAD_SCHEME Bad scheme in URI (error)
                      HTTP_URI_STATUS_BAD_URI Bad/empty URI (error)
                      HTTP_URI_STATUS_BAD_USERNAME Bad username in URI (error)
                      HTTP_URI_STATUS_MISSING_RESOURCE Missing resource in URI (warning)
                      HTTP_URI_STATUS_MISSING_SCHEME Missing scheme in URI (warning)
                      HTTP_URI_STATUS_OK URI decoded OK
                      HTTP_URI_STATUS_OVERFLOW URI buffer for httpAssembleURI is too small
                      HTTP_URI_STATUS_UNKNOWN_SCHEME Unknown scheme in URI (warning)
                      +

                      ipp_finishings_e

                      +

                      Finishings values

                      +

                      Constants

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      IPP_FINISHINGS_BALE Bale (any type)
                      IPP_FINISHINGS_BIND Bind
                      IPP_FINISHINGS_BIND_BOTTOM Bind on bottom
                      IPP_FINISHINGS_BIND_LEFT Bind on left
                      IPP_FINISHINGS_BIND_RIGHT Bind on right
                      IPP_FINISHINGS_BIND_TOP Bind on top
                      IPP_FINISHINGS_BOOKLET_MAKER Fold to make booklet
                      IPP_FINISHINGS_COAT Apply protective liquid or powder coating
                      IPP_FINISHINGS_COVER Add cover
                      IPP_FINISHINGS_EDGE_STITCH Stitch along any side
                      IPP_FINISHINGS_EDGE_STITCH_BOTTOM Stitch along bottom edge
                      IPP_FINISHINGS_EDGE_STITCH_LEFT Stitch along left side
                      IPP_FINISHINGS_EDGE_STITCH_RIGHT Stitch along right side
                      IPP_FINISHINGS_EDGE_STITCH_TOP Stitch along top edge
                      IPP_FINISHINGS_FOLD Fold (any type)
                      IPP_FINISHINGS_FOLD_ACCORDION Accordion-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_ENGINEERING_Z Fold the paper vertically into two small sections and one larger, forming an elongated Z
                      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
                      IPP_FINISHINGS_JOG_OFFSET Offset for binding (any type)
                      IPP_FINISHINGS_LAMINATE Apply protective (solid) material
                      IPP_FINISHINGS_NONE No finishing
                      IPP_FINISHINGS_PUNCH Punch (any location/count)
                      IPP_FINISHINGS_PUNCH_BOTTOM_LEFT Punch 1 hole bottom left
                      IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT Punch 1 hole bottom right
                      IPP_FINISHINGS_PUNCH_DUAL_BOTTOM Punch 2 holes bottom edge
                      IPP_FINISHINGS_PUNCH_DUAL_LEFT Punch 2 holes left side
                      IPP_FINISHINGS_PUNCH_DUAL_RIGHT Punch 2 holes right side
                      IPP_FINISHINGS_PUNCH_DUAL_TOP Punch 2 holes top edge
                      IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM Punch multiple holes bottom edge
                      IPP_FINISHINGS_PUNCH_MULTIPLE_LEFT Punch multiple holes left side
                      IPP_FINISHINGS_PUNCH_MULTIPLE_RIGHT Punch multiple holes right side
                      IPP_FINISHINGS_PUNCH_MULTIPLE_TOP Punch multiple holes top edge
                      IPP_FINISHINGS_PUNCH_QUAD_BOTTOM Punch 4 holes bottom edge
                      IPP_FINISHINGS_PUNCH_QUAD_LEFT Punch 4 holes left side
                      IPP_FINISHINGS_PUNCH_QUAD_RIGHT Punch 4 holes right side
                      IPP_FINISHINGS_PUNCH_QUAD_TOP Punch 4 holes top edge
                      IPP_FINISHINGS_PUNCH_TOP_LEFT Punch 1 hole top left
                      IPP_FINISHINGS_PUNCH_TOP_RIGHT Punch 1 hole top right
                      IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM Punch 3 holes bottom edge
                      IPP_FINISHINGS_PUNCH_TRIPLE_LEFT Punch 3 holes left side
                      IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT Punch 3 holes right side
                      IPP_FINISHINGS_PUNCH_TRIPLE_TOP Punch 3 holes top edge
                      IPP_FINISHINGS_SADDLE_STITCH Staple interior
                      IPP_FINISHINGS_STAPLE Staple (any location/method)
                      IPP_FINISHINGS_STAPLE_BOTTOM_LEFT Staple bottom left corner
                      IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT Staple bottom right corner
                      IPP_FINISHINGS_STAPLE_DUAL_BOTTOM Two staples on bottom
                      IPP_FINISHINGS_STAPLE_DUAL_LEFT Two staples on left
                      IPP_FINISHINGS_STAPLE_DUAL_RIGHT Two staples on right
                      IPP_FINISHINGS_STAPLE_DUAL_TOP Two staples on top
                      IPP_FINISHINGS_STAPLE_TOP_LEFT Staple top left corner
                      IPP_FINISHINGS_STAPLE_TOP_RIGHT Staple top right corner
                      IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM Three staples on bottom
                      IPP_FINISHINGS_STAPLE_TRIPLE_LEFT Three staples on left
                      IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT Three staples on right
                      IPP_FINISHINGS_STAPLE_TRIPLE_TOP Three staples on top
                      IPP_FINISHINGS_TRIM Trim (any type)
                      IPP_FINISHINGS_TRIM_AFTER_COPIES Trim output after each copy
                      IPP_FINISHINGS_TRIM_AFTER_DOCUMENTS Trim output after each document
                      IPP_FINISHINGS_TRIM_AFTER_JOB Trim output after job
                      IPP_FINISHINGS_TRIM_AFTER_PAGES Trim output after each page
                      +

                      ipp_jstate_e

                      +

                      Job states

                      +

                      Constants

                      + + + + + + + + +
                      IPP_JSTATE_ABORTED Job has aborted due to error
                      IPP_JSTATE_CANCELED Job has been canceled
                      IPP_JSTATE_COMPLETED Job has completed successfully
                      IPP_JSTATE_HELD Job is held for printing
                      IPP_JSTATE_PENDING Job is waiting to be printed
                      IPP_JSTATE_PROCESSING Job is currently printing
                      IPP_JSTATE_STOPPED Job has been stopped
                      +

                      ipp_op_e

                      +

                      IPP operations

                      +

                      Constants

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      IPP_OP_ALLOCATE_PRINTER_RESOURCES Allocate-Printer-Resources: Use resources for a printer.
                      IPP_OP_CANCEL_CURRENT_JOB Cancel-Current-Job: Cancel the current job
                      IPP_OP_CANCEL_JOB Cancel-Job: Cancel a job
                      IPP_OP_CANCEL_JOBS Cancel-Jobs: Cancel all jobs (administrative)
                      IPP_OP_CANCEL_MY_JOBS Cancel-My-Jobs: Cancel a user's jobs
                      IPP_OP_CANCEL_RESOURCE Cancel-Resource: Uninstall a resource.
                      IPP_OP_CANCEL_SUBSCRIPTION  CUPS 1.2/macOS 10.5 Cancel-Subscription: Cancel a subscription
                      IPP_OP_CLOSE_JOB Close-Job: Close a job and start printing
                      IPP_OP_CREATE_JOB Create-Job: Create an empty print job
                      IPP_OP_CREATE_JOB_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5 Create-Job-Subscriptions: Create one of more job subscriptions
                      IPP_OP_CREATE_PRINTER Create-Printer: Create a new service.
                      IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5 Create-Printer-Subscriptions: Create one or more printer subscriptions
                      IPP_OP_CREATE_RESOURCE Create-Resource: Create a new (empty) resource.
                      IPP_OP_CREATE_RESOURCE_SUBSCRIPTIONS Create-Resource-Subscriptions: Create event subscriptions for a resource.
                      IPP_OP_CREATE_SYSTEM_SUBSCRIPTIONS Create-System-Subscriptions: Create event subscriptions for a system.
                      IPP_OP_CUPS_ADD_MODIFY_CLASS CUPS-Add-Modify-Class: Add or modify a class
                      IPP_OP_CUPS_ADD_MODIFY_PRINTER CUPS-Add-Modify-Printer: Add or modify a printer
                      IPP_OP_CUPS_AUTHENTICATE_JOB  CUPS 1.2/macOS 10.5 CUPS-Authenticate-Job: Authenticate a job
                      IPP_OP_CUPS_CREATE_LOCAL_PRINTER  CUPS 2.2 CUPS-Create-Local-Printer: Create a local (temporary) printer
                      IPP_OP_CUPS_DELETE_CLASS CUPS-Delete-Class: Delete a class
                      IPP_OP_CUPS_DELETE_PRINTER CUPS-Delete-Printer: Delete a printer
                      IPP_OP_CUPS_GET_DEFAULT CUPS-Get-Default: Get the default printer
                      IPP_OP_CUPS_GET_DEVICES  DEPRECATED CUPS-Get-Devices: Get a list of supported devices
                      IPP_OP_CUPS_GET_DOCUMENT  CUPS 1.4/macOS 10.6 CUPS-Get-Document: Get a document file
                      IPP_OP_CUPS_GET_PPD  DEPRECATED CUPS-Get-PPD: Get a PPD file
                      IPP_OP_CUPS_GET_PPDS  DEPRECATED CUPS-Get-PPDs: Get a list of supported drivers
                      IPP_OP_CUPS_GET_PRINTERS CUPS-Get-Printers: Get a list of printers and/or classes
                      IPP_OP_CUPS_INVALID Invalid operation name for ippOpValue
                      IPP_OP_CUPS_MOVE_JOB CUPS-Move-Job: Move a job to a different printer
                      IPP_OP_CUPS_SET_DEFAULT CUPS-Set-Default: Set the default printer
                      IPP_OP_DEALLOCATE_PRINTER_RESOURCES Deallocate-Printer-Resources: Stop using resources for a printer.
                      IPP_OP_DELETE_PRINTER Delete-Printer: Delete an existing service.
                      IPP_OP_DISABLE_ALL_PRINTERS Disable-All-Printers: Stop accepting new jobs on all services.
                      IPP_OP_DISABLE_PRINTER Disable-Printer: Reject new jobs for a printer
                      IPP_OP_ENABLE_ALL_PRINTERS Enable-All-Printers: Start accepting new jobs on all services.
                      IPP_OP_ENABLE_PRINTER Enable-Printer: Accept new jobs for a printer
                      IPP_OP_GET_JOBS Get-Jobs: Get a list of jobs
                      IPP_OP_GET_JOB_ATTRIBUTES Get-Job-Attribute: Get information about a job
                      IPP_OP_GET_NOTIFICATIONS  CUPS 1.2/macOS 10.5 Get-Notifications: Get notification events
                      IPP_OP_GET_PRINTERS Get-Printers: Get a list of services.
                      IPP_OP_GET_PRINTER_ATTRIBUTES Get-Printer-Attributes: Get information about a printer
                      IPP_OP_GET_PRINTER_SUPPORTED_VALUES Get-Printer-Supported-Values: Get supported values
                      IPP_OP_GET_SUBSCRIPTIONS  CUPS 1.2/macOS 10.5 Get-Subscriptions: Get list of subscriptions
                      IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES  CUPS 1.2/macOS 10.5 Get-Subscription-Attributes: Get subscription information
                      IPP_OP_GET_SYSTEM_ATTRIBUTES Get-System-Attributes: Get system object attributes.
                      IPP_OP_GET_SYSTEM_SUPPORTED_VALUES Get-System-Supported-Values: Get supported values for system object attributes.
                      IPP_OP_HOLD_JOB Hold-Job: Hold a job for printing
                      IPP_OP_HOLD_NEW_JOBS Hold-New-Jobs: Hold new jobs
                      IPP_OP_IDENTIFY_PRINTER Identify-Printer: Make the printer beep, flash, or display a message for identification
                      IPP_OP_INSTALL_RESOURCE Install-Resource: Install a resource.
                      IPP_OP_PAUSE_ALL_PRINTERS Pause-All-Printers: Stop all services immediately.
                      IPP_OP_PAUSE_ALL_PRINTERS_AFTER_CURRENT_JOB Pause-All-Printers-After-Current-Job: Stop all services after processing the current jobs.
                      IPP_OP_PAUSE_PRINTER Pause-Printer: Stop a printer
                      IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB Pause-Printer-After-Current-Job: Stop printer after the current job
                      IPP_OP_PRINT_JOB Print-Job: Print a single file
                      IPP_OP_PROMOTE_JOB Promote-Job: Promote a job to print sooner
                      IPP_OP_REGISTER_OUTPUT_DEVICE Register-Output-Device: Register a remote service.
                      IPP_OP_RELEASE_HELD_NEW_JOBS Release-Held-New-Jobs: Release new jobs that were previously held
                      IPP_OP_RELEASE_JOB Release-Job: Release a job for printing
                      IPP_OP_RENEW_SUBSCRIPTION  CUPS 1.2/macOS 10.5 Renew-Subscription: Renew a printer subscription
                      IPP_OP_RESTART_JOB  DEPRECATED Restart-Job: Reprint a job
                      IPP_OP_RESTART_SYSTEM Restart-System: Restart all services.
                      IPP_OP_RESUME_ALL_PRINTERS Resume-All-Printers: Start job processing on all services.
                      IPP_OP_RESUME_JOB Resume-Job: Resume the current job
                      IPP_OP_RESUME_PRINTER Resume-Printer: Start a printer
                      IPP_OP_SCHEDULE_JOB_AFTER Schedule-Job-After: Schedule a job to print after another
                      IPP_OP_SEND_DOCUMENT Send-Document: Add a file to a job
                      IPP_OP_SEND_RESOURCE_DATA Send-Resource-Data: Upload the data for a resource.
                      IPP_OP_SET_JOB_ATTRIBUTES Set-Job-Attributes: Set job values
                      IPP_OP_SET_PRINTER_ATTRIBUTES Set-Printer-Attributes: Set printer values
                      IPP_OP_SET_RESOURCE_ATTRIBUTES Set-Resource-Attributes: Set resource object attributes.
                      IPP_OP_SET_SYSTEM_ATTRIBUTES Set-System-Attributes: Set system object attributes.
                      IPP_OP_SHUTDOWN_ALL_PRINTERS Shutdown-All-Printers: Shutdown all services.
                      IPP_OP_SHUTDOWN_ONE_PRINTER Shutdown-One-Printer: Shutdown a service.
                      IPP_OP_STARTUP_ALL_PRINTERS Startup-All-Printers: Startup all services.
                      IPP_OP_STARTUP_ONE_PRINTER Startup-One-Printer: Start a service.
                      IPP_OP_SUSPEND_CURRENT_JOB Suspend-Current-Job: Suspend the current job
                      IPP_OP_VALIDATE_JOB Validate-Job: Validate job values prior to submission
                      +

                      ipp_orient_e

                      +

                      Orientation values

                      +

                      Constants

                      + + + + + + +
                      IPP_ORIENT_LANDSCAPE 90 degrees counter-clockwise
                      IPP_ORIENT_NONE No rotation
                      IPP_ORIENT_PORTRAIT No rotation
                      IPP_ORIENT_REVERSE_LANDSCAPE 90 degrees clockwise
                      IPP_ORIENT_REVERSE_PORTRAIT 180 degrees
                      +

                      ipp_pstate_e

                      +

                      Printer state values

                      +

                      Constants

                      + + + + +
                      IPP_PSTATE_IDLE Printer is idle
                      IPP_PSTATE_PROCESSING Printer is working
                      IPP_PSTATE_STOPPED Printer is stopped
                      +

                      ipp_quality_e

                      +

                      Print quality values

                      +

                      Constants

                      + + + + +
                      IPP_QUALITY_DRAFT Draft quality
                      IPP_QUALITY_HIGH High quality
                      IPP_QUALITY_NORMAL Normal quality
                      +

                      ipp_res_e

                      +

                      Resolution units

                      +

                      Constants

                      + + + +
                      IPP_RES_PER_CM Pixels per centimeter
                      IPP_RES_PER_INCH Pixels per inch
                      +

                      ipp_rstate_e

                      +

                      resource-state values

                      +

                      Constants

                      + + + + + + +
                      IPP_RSTATE_ABORTED Resource has been aborted and is pending deletion.
                      IPP_RSTATE_AVAILABLE Resource is available for installation.
                      IPP_RSTATE_CANCELED Resource has been canceled and is pending deletion.
                      IPP_RSTATE_INSTALLED Resource is installed.
                      IPP_RSTATE_PENDING Resource is created but has no data yet.
                      +

                      ipp_sstate_e

                      +

                      system-state values

                      +

                      Constants

                      + + + + +
                      IPP_SSTATE_IDLE At least one printer is idle and none are processing a job.
                      IPP_SSTATE_PROCESSING At least one printer is processing a job.
                      IPP_SSTATE_STOPPED All printers are stopped.
                      +

                      ipp_state_e

                      +

                      ipp_t state values

                      +

                      Constants

                      + + + + + + +
                      IPP_STATE_ATTRIBUTE One or more attributes need to be sent/received
                      IPP_STATE_DATA IPP request data needs to be sent/received
                      IPP_STATE_ERROR An error occurred
                      IPP_STATE_HEADER The request header needs to be sent/received
                      IPP_STATE_IDLE Nothing is happening/request completed
                      +

                      ipp_status_e

                      +

                      IPP status code values

                      +

                      Constants

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      IPP_STATUS_CUPS_INVALID Invalid status name for ippErrorValue
                      IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED client-error-account-authorization-failed
                      IPP_STATUS_ERROR_ACCOUNT_CLOSED client-error-account-closed
                      IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED client-error-account-info-needed
                      IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED client-error-account-limit-reached
                      IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE client-error-attributes-not-settable
                      IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES client-error-attributes-or-values-not-supported
                      IPP_STATUS_ERROR_BAD_REQUEST client-error-bad-request
                      IPP_STATUS_ERROR_BUSY server-error-busy
                      IPP_STATUS_ERROR_CHARSET client-error-charset-not-supported
                      IPP_STATUS_ERROR_COMPRESSION_ERROR client-error-compression-error
                      IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED client-error-compression-not-supported
                      IPP_STATUS_ERROR_CONFLICTING client-error-conflicting-attributes
                      IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED  DEPRECATED cups-error-account-authorization-failed
                      IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED cups-error-account-closed @deprecate@
                      IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED  DEPRECATED cups-error-account-info-needed
                      IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED  DEPRECATED cups-error-account-limit-reached
                      IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED  CUPS 1.5/macOS 10.7 cups-authentication-canceled - Authentication canceled by user
                      IPP_STATUS_ERROR_CUPS_PKI  CUPS 1.5/macOS 10.7 cups-pki-error - Error negotiating a secure connection
                      IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED  CUPS 1.5/macOS 10.7 cups-upgrade-required - TLS upgrade required
                      IPP_STATUS_ERROR_DEVICE server-error-device-error
                      IPP_STATUS_ERROR_DOCUMENT_ACCESS client-error-document-access-error
                      IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR client-error-document-format-error
                      IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED client-error-document-format-not-supported
                      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_FORBIDDEN client-error-forbidden
                      IPP_STATUS_ERROR_GONE client-error-gone
                      IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS client-error-ignored-all-subscriptions
                      IPP_STATUS_ERROR_INTERNAL server-error-internal-error
                      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_NOT_ACCEPTING_JOBS server-error-not-accepting-jobs
                      IPP_STATUS_ERROR_NOT_AUTHENTICATED client-error-not-authenticated
                      IPP_STATUS_ERROR_NOT_AUTHORIZED client-error-not-authorized
                      IPP_STATUS_ERROR_NOT_FETCHABLE client-error-not-fetchable
                      IPP_STATUS_ERROR_NOT_FOUND client-error-not-found
                      IPP_STATUS_ERROR_NOT_POSSIBLE client-error-not-possible
                      IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED server-error-operation-not-supported
                      IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED server-error-printer-is-deactivated
                      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_SERVICE_UNAVAILABLE server-error-service-unavailable
                      IPP_STATUS_ERROR_TEMPORARY server-error-temporary-error
                      IPP_STATUS_ERROR_TIMEOUT client-error-timeout
                      IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS server-error-too-many-documents
                      IPP_STATUS_ERROR_TOO_MANY_JOBS server-error-too-many-jobs
                      IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS client-error-too-many-subscriptions
                      IPP_STATUS_ERROR_URI_SCHEME client-error-uri-scheme-not-supported
                      IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED server-error-version-not-supported
                      IPP_STATUS_OK successful-ok
                      IPP_STATUS_OK_CONFLICTING successful-ok-conflicting-attributes
                      IPP_STATUS_OK_EVENTS_COMPLETE successful-ok-events-complete
                      IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED successful-ok-ignored-or-substituted-attributes
                      IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS successful-ok-ignored-subscriptions
                      IPP_STATUS_OK_TOO_MANY_EVENTS successful-ok-too-many-events
                      +

                      ipp_tag_e

                      +

                      Value and group tag values for attributes

                      +

                      Constants

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      IPP_TAG_ADMINDEFINE Admin-defined value
                      IPP_TAG_BOOLEAN Boolean value
                      IPP_TAG_CHARSET Character set value
                      IPP_TAG_CUPS_INVALID Invalid tag name for ippTagValue
                      IPP_TAG_DATE Date/time value
                      IPP_TAG_DEFAULT Default value
                      IPP_TAG_DELETEATTR Delete-attribute value
                      IPP_TAG_DOCUMENT Document group
                      IPP_TAG_END End-of-attributes
                      IPP_TAG_ENUM Enumeration value
                      IPP_TAG_EVENT_NOTIFICATION Event group
                      IPP_TAG_INTEGER Integer value
                      IPP_TAG_JOB Job group
                      IPP_TAG_KEYWORD Keyword value
                      IPP_TAG_LANGUAGE Language value
                      IPP_TAG_MIMETYPE MIME media type value
                      IPP_TAG_NAME Name value
                      IPP_TAG_NAMELANG Name-with-language value
                      IPP_TAG_NOTSETTABLE Not-settable value
                      IPP_TAG_NOVALUE No-value value
                      IPP_TAG_OPERATION Operation group
                      IPP_TAG_PRINTER Printer group
                      IPP_TAG_RANGE Range value
                      IPP_TAG_RESOLUTION Resolution value
                      IPP_TAG_RESOURCE Resource group
                      IPP_TAG_STRING Octet string value
                      IPP_TAG_SUBSCRIPTION Subscription group
                      IPP_TAG_SYSTEM System group
                      IPP_TAG_TEXT Text value
                      IPP_TAG_TEXTLANG Text-with-language value
                      IPP_TAG_UNKNOWN Unknown value
                      IPP_TAG_UNSUPPORTED_GROUP Unsupported attributes group
                      IPP_TAG_UNSUPPORTED_VALUE Unsupported value
                      IPP_TAG_URI URI value
                      IPP_TAG_URISCHEME URI scheme value
                      IPP_TAG_ZERO Zero tag - used for separators
                      - - + + diff -Nru cups-2.3.3op2/doc/help/kerberos.html cups-2.4.1op1/doc/help/kerberos.html --- cups-2.3.3op2/doc/help/kerberos.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/kerberos.html 2022-01-27 11:11:42.000000000 +0000 @@ -1,87 +1,75 @@ - + - - Using Kerberos Authentication - - - + + Using Kerberos Authentication + + + +

                      Using Kerberos Authentication

                      -

                      Using Kerberos Authentication

                      +

                      CUPS allows you to use a Key Distribution Center (KDC) for authentication on your local CUPS server and when printing to a remote authenticated queue. This document describes how to configure CUPS to use Kerberos authentication and provides links to the MIT help pages for configuring Kerberos on your systems and network.

                      -

                      CUPS allows you to use a Key Distribution Center (KDC) for authentication on your local CUPS server and when printing to a remote authenticated queue. This document describes how to configure CUPS to use Kerberos authentication and provides links to the MIT help pages for configuring Kerberos on your systems and network.

                      +
                      Note: Kerberos authentication is deprecated starting in CUPS 2.4.0. OAuth 2.0 is the recommended SSO replacement.
                      -

                      System Requirements

                      +

                      System Requirements

                      -

                      The following are required to use Kerberos with CUPS:

                      +

                      The following are required to use Kerberos with CUPS:

                      -
                        +
                          +
                        1. Heimdal Kerberos (any version) or MIT Kerberos (1.6.3 or newer)
                        2. +
                        3. Properly configured Domain Name System (DNS) infrastructure (for your servers): +
                            +
                          1. DNS server(s) with static IP addresses for all CUPS servers or configured to allow DHCP updates to the host addresses and
                          2. +
                          3. All CUPS clients and servers configured to use the same DNS server(s).
                          4. +
                          +
                        4. -
                        5. Heimdal Kerberos (any version) or MIT Kerberos (1.6.3 or newer)
                        6. +
                        7. Properly configured Kerberos infrastructure: +
                            +
                          1. KDC configured to allow CUPS servers to obtain Service Granting Tickets (SGTs) for the "host" and "HTTP" services/principals,
                          2. +
                          3. LDAP-based user accounts - both OpenDirectory and ActiveDirectory provide this with the KDC, and
                          4. +
                          5. CUPS clients and servers bound to the same KDC and LDAP server(s).
                          6. +
                          +
                        8. +
                        -
                      1. Properly configured Domain Name System (DNS) infrastructure (for your servers):
                          -
                        1. DNS server(s) with static IP addresses for all CUPS servers or configured to allow DHCP updates to the host addresses and
                        2. -
                        3. All CUPS clients and servers configured to use the same -DNS server(s).
                        4. -
                      2. -
                      3. Properly configured Kerberos infrastructure:
                          -
                        1. KDC configured to allow CUPS servers to obtain Service Granting Tickets (SGTs) for the "host" and "HTTP" services/principals,
                        2. -
                        3. LDAP-based user accounts - both OpenDirectory and ActiveDirectory provide this with the KDC, and
                        4. -
                        5. CUPS clients and servers bound to the same KDC and LDAP - server(s).
                        6. -
                      4. +

                        Configuring Kerberos on Your System

                        -
                      +

                      Before you can use Kerberos with CUPS, you will need to configure Kerberos on your system and setup a system as a KDC. Because this configuration is highly system and site-specific, please consult the following on-line resources provided by the creators of Kerberos at the Massachusetts Institute of Technology (MIT):

                      + -

                      Configuring Kerberos on Your System

                      +

                      The Linux Documentation Project also has a HOWTO on Kerberos:

                      -

                      Before you can use Kerberos with CUPS, you will need to configure Kerberos on your system and setup a system as a KDC. Because this configuration is highly system and site-specific, please consult the following on-line resources provided by the creators of Kerberos at the Massachusetts Institute of Technology (MIT):

                      + - +
                      cupsctl DefaultAuthType=Negotiate
                      -

                      The Linux Documentation Project also has a HOWTO on Kerberos:

                      +

                      You can also enable Kerberos from the web interface by checking the Use Kerberos Authentication box and clicking Change Settings:

                      - +

                      Implementation Information

                      -

                      Configuring CUPS to Use Kerberos

                      +

                      CUPS implements Kerberos over HTTP using GSSAPI and the service/principal names "host/server.example.com" for command-line access and "HTTP/server.example.com" for web-based access, where "server.example.com" is replaced by your CUPS server's hostname. Because of limitations in the HTTP GSSAPI protocol extension, only a single domain/KDC is supported for authentication. The (experimental) HTTP extension is described in RFC 4559.

                      -

                      Once you have configured Kerberos on your system(s), you can then enable Kerberos authentication by selecting the Negotiate authentication type. The simplest way to do this is using the cupsctl(8) command on your server(s):

                      +

                      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 truncated to just "user" for purposes of user and group checks.

                      -
                      -cupsctl DefaultAuthType=Negotiate
                      -
                      - -

                      You can also enable Kerberos from the web interface by checking the Use Kerberos Authentication box and clicking Change Settings:

                      - -
                      -http://server.example.com:631/admin
                      -
                      - -

                      After you have enabled Kerberos authentication, use the built-in "authenticated" policy or your own custom policies with the printers you will be sharing. See Managing Operation Policies for more information.

                      - - -

                      Implementation Information

                      - -

                      CUPS implements Kerberos over HTTP using GSSAPI and the service/principal names "host/server.example.com" for command-line access and "HTTP/server.example.com" for web-based access, where "server.example.com" is replaced by your CUPS server's hostname. Because of limitations in the HTTP GSSAPI protocol extension, only a single domain/KDC is supported for authentication. The HTTP extension is described in RFC 4559.

                      - -

                      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 truncated to just "user" for purposes of user and group checks.

                      - -

                      In order to support printing to a shared printer, CUPS runs the IPP or SMB backend as the owner of the print job so it can obtain the necessary credentials when the job is de-spooled to the server.

                      - - - +

                      In order to support printing to a shared printer, CUPS runs the IPP or SMB backend as the owner of the print job so it can obtain the necessary credentials when the job is de-spooled to the server.

                      + + diff -Nru cups-2.3.3op2/doc/help/man-backend.html cups-2.4.1op1/doc/help/man-backend.html --- cups-2.3.3op2/doc/help/man-backend.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-backend.html 2022-01-27 11:11:42.000000000 +0000 @@ -22,7 +22,6 @@ filename ]
                      -
                       #include <cups/cups.h>
                       
                       const char *cupsBackendDeviceURI(char **argv);
                      @@ -47,7 +46,7 @@
                       

                      Description

                      Backends are a special type of -filter(7) +filter(7) which is used to send print data to and discover different devices on the system.

                      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.

                      The command name (argv[0]) is set to the device URI of the destination printer. @@ -70,7 +69,6 @@ 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:

                      -
                           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"
                      @@ -151,9 +149,9 @@
                       

                      All other exit code values are reserved.

                      Environment

                      In addition to the environment variables listed in -cups(1) +cups(1) and -filter(7), +filter(7), CUPS backends can expect the following environment variable:
                      DEVICE_URI @@ -171,19 +169,19 @@ 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.

                      Unless you are a developer and know what you are doing, please do not run backends directly. Instead, use the -lp(1) +lp(1) or -lpr(1) +lpr(1) programs to send print jobs or -lpinfo(8) +lpinfo(8) to query for available printers using the backend. The one exception is the SNMP backend - see -cups-snmp(8) +cups-snmp(8) for more information.

                      Notes

                      CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      cups(1), cups-files.conf(5), @@ -196,7 +194,7 @@
                      CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cancel.html cups-2.4.1op1/doc/help/man-cancel.html --- cups-2.3.3op2/doc/help/man-cancel.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cancel.html 2022-01-27 11:11:42.000000000 +0000 @@ -58,32 +58,29 @@

                      Examples

                      Cancel the current print job:
                      -
                           cancel
                       
                       
                      Cancel job "myprinter-42":
                      -
                           cancel myprinter-42
                       
                       
                      Cancel all jobs:
                      -
                           cancel -a
                       

                      Notes

                      Administrators wishing to prevent unauthorized cancellation of jobs via the -u option should require authentication for Cancel-Jobs operations in -cupsd.conf(5). +cupsd.conf(5).

                      See Also

                      -cupsd.conf(5), -lp(1), -lpmove(8), -lpstat(1), +cupsd.conf(5), +lp(1), +lpmove(8), +lpstat(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-classes.conf.html cups-2.4.1op1/doc/help/man-classes.conf.html --- cups-2.3.3op2/doc/help/man-classes.conf.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-classes.conf.html 2022-01-27 11:11:42.000000000 +0000 @@ -12,21 +12,21 @@

                      Description

                      The classes.conf file defines the local printer classes that are available. It is normally located in the /etc/cups directory and is maintained by the -cupsd(8) +cupsd(8) program. This file is not intended to be edited or managed manually.

                      Notes

                      The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.

                      See Also

                      -cupsd(8), -cupsd.conf(5), -mime.convs(5), -mime.types(5), -printers.conf(5), -subscriptions.conf(5), +cupsd(8), +cupsd.conf(5), +mime.convs(5), +mime.types(5), +printers.conf(5), +subscriptions.conf(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-client.conf.html cups-2.4.1op1/doc/help/man-client.conf.html --- cups-2.3.3op2/doc/help/man-client.conf.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-client.conf.html 2022-01-27 11:11:42.000000000 +0000 @@ -98,11 +98,11 @@
                      On Linux and other systems using GNU TLS, the /etc/cups/ssl/site.crl file, if present, provides a list of revoked X.509 certificates and is used when validating certificates.

                      See Also

                      -cups(1), +cups(1), default(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cups-config.html cups-2.4.1op1/doc/help/man-cups-config.html --- cups-2.3.3op2/doc/help/man-cups-config.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cups-config.html 2022-01-27 11:11:42.000000000 +0000 @@ -8,7 +8,7 @@

                      cups-config(1)

                      Name

                      -cups-config - get cups api, compiler, directory, and link information. +cups-config - get cups api, compiler, directory, and link information (deprecated).

                      Synopsis

                      cups-config --api-version @@ -48,6 +48,11 @@

                      Description

                      The cups-config 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. +Note: +This command is deprecated and will be removed in a future version of CUPS. +The +pkg-config(1) +command should be used instead.

                      Options

                      The cups-config command accepts the following command-line options:
                      @@ -77,13 +82,11 @@

                      Examples

                      Show the currently installed version of CUPS:
                      -
                           cups-config --version
                       
                       
                      Compile a simple one-file CUPS filter:
                      -
                           cc `cups-config --cflags --ldflags` -o filter filter.c \
                               `cups-config --libs`
                       
                      @@ -94,10 +97,11 @@
                      Formerly used to add the CUPS imaging library to the list of libraries.

                      See Also

                      -cups(1), +cups(1), +pkg-config(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cups-files.conf.html cups-2.4.1op1/doc/help/man-cups-files.conf.html --- cups-2.3.3op2/doc/help/man-cups-files.conf.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cups-files.conf.html 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ cups-files.conf - file and directory configuration file for cups

                      Description

                      The cups-files.conf file configures the files and directories used by the CUPS scheduler, -cupsd(8). +cupsd(8). It is normally located in the /etc/cups directory.

                      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. @@ -19,7 +19,7 @@ Comment lines start with the # character.

                      Directives

                      The following directives are understood by -cupsd(8): +cupsd(8):
                      AccessLog
                      AccessLog filename @@ -31,7 +31,6 @@ 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:
                      -
                           AccessLog /var/log/cups/%s-access_log
                       
                       
                      @@ -67,7 +66,6 @@ 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:
                      -
                           ErrorLog /var/log/cups/%s-error_log
                       
                       
                      @@ -114,7 +112,6 @@ Specifying a blank filename disables page log generation. The server name may be included in filenames using the string "%s", for example:
                      -
                           PageLog /var/log/cups/%s-page_log
                       
                       
                      @@ -174,14 +171,6 @@ File devices cannot be used with "raw" print queues - a PPD file is required. The specified file is overwritten for every print job. Writing to directories is not supported. -
                      FontPath directory[:...:directoryN] -
                      Specifies a colon separated list of directories where fonts can be found. -On Linux the -font-config(1) -mechanism is used instead. -On macOS the Font Book application manages system-installed fonts. -
                      LPDConfigFile filename -
                      Specifies the LPD service configuration file to update.
                      Printcap filename
                      Specifies a file that is filled with a list of local print queues.
                      PrintcapFormat bsd @@ -191,8 +180,6 @@ "bsd" is the historical LPD printcap file format. "plist" is the Apple plist file format. "solaris" is the historical Solaris LPD printcap file format. -
                      SMBConfigFile filename -
                      Specifies the SMB service configuration file to update.

                      Notes

                      The scheduler MUST be restarted manually after making changes to the cups-files.conf file. @@ -202,19 +189,17 @@ launchctl(8) command is used instead.

                      See Also

                      -classes.conf(5), -cups(1), -cupsd(8), -cupsd.conf(5), -mime.convs(5), -mime.types(5), -printers.conf(5), -subscriptions.conf(5), +classes.conf(5), +cups(1), +cupsd(8), +cupsd.conf(5), +mime.convs(5), +mime.types(5), +printers.conf(5), +subscriptions.conf(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2020 by Michael R Sweet -
                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2020-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cups-lpd.html cups-2.4.1op1/doc/help/man-cups-lpd.html --- cups-2.3.3op2/doc/help/man-cups-lpd.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cups-lpd.html 2022-01-27 11:11:42.000000000 +0000 @@ -85,7 +85,6 @@ cups-lpd mini-server:
                      -
                           printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd \
                               -o document-format=application/octet-stream
                       
                      @@ -99,16 +98,15 @@
                       cups-lpd
                       service using the corresponding control program.
                       

                      See Also

                      -cups(1), -cupsd(8), +cups(1), +cupsd(8), inetd(8), launchd(8), xinetd(8), -CUPS Online Help (http://localhost:631/help), +CUPS Online Help (http://localhost:631/help), RFC 2569

                      Copyright

                      -Copyright © 2020 by Michael R Sweet -Copyright © 2007-2019 by Apple Inc. +Copyright © 2020-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cups-snmp.conf.html cups-2.4.1op1/doc/help/man-cups-snmp.conf.html --- cups-2.3.3op2/doc/help/man-cups-snmp.conf.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cups-snmp.conf.html 2022-01-27 11:11:42.000000000 +0000 @@ -15,7 +15,7 @@ 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 /etc/cups directory. Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character.

                      The Community and DebugLevel directives are used by all backends. The remainder apply only to the SNMP backend - -cups-snmp(8). +cups-snmp(8).

                      Directives

                      The following directives are understood by the CUPS network backends:
                      @@ -49,12 +49,12 @@

                      Notes

                      CUPS backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -cups-snmp(8), +cups-snmp(8), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cups-snmp.html cups-2.4.1op1/doc/help/man-cups-snmp.html --- cups-2.3.3op2/doc/help/man-cups-snmp.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cups-snmp.html 2022-01-27 11:11:42.000000000 +0000 @@ -27,7 +27,7 @@

                      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 second form, the SNMP backend is run indirectly using the -lpinfo(8) +lpinfo(8) command. The output provides all printers detected via SNMP on the configured broadcast addresses. @@ -45,13 +45,13 @@

                      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.

                      See Also

                      -backend(7), -cups-snmp.conf(5), -cupsd(8), -lpinfo(8), +backend(7), +cups-snmp.conf(5), +cupsd(8), +lpinfo(8), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cups.html cups-2.4.1op1/doc/help/man-cups.html --- cups-2.3.3op2/doc/help/man-cups.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cups.html 2022-01-27 11:11:42.000000000 +0000 @@ -35,16 +35,16 @@

                      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.

                      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.

                      You can also use the -lpadmin(8) +lpadmin(8) and -lpinfo(8) +lpinfo(8) commands to add printers to CUPS. Additionally, your operating system may include graphical user interfaces or automatically create printer queues when you connect a printer to your computer.

                      How Do I Get Help?

                      The -CUPS -web site (http://www.CUPS.org) provides access to the +OpenPrintingCUPS +web site (https://openprinting.github.io/cups) provides access to the cups and cups-devel @@ -99,25 +99,25 @@

                      Notes

                      CUPS printer drivers, backends, and PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -cancel(1), -client.conf(7), -cupsctl(8), -cupsd(8), -lp(1), -lpadmin(8), -lpinfo(8), -lpoptions(1), -lpr(1), -lprm(1), -lpq(1), -lpstat(1), -CUPS Online Help (http://localhost:631/help), -CUPS Web Site (http://www.CUPS.org), +cancel(1), +client.conf(5), +cupsctl(8), +cupsd(8), +lp(1), +lpadmin(8), +lpinfo(8), +lpoptions(1), +lpr(1), +lprm(1), +lpq(1), +lpstat(1), +CUPS Online Help (http://localhost:631/help), +OpenPrinting CUPS Web Site (https://openprinting.github.io/cups), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupsaccept.html cups-2.4.1op1/doc/help/man-cupsaccept.html --- cups-2.3.3op2/doc/help/man-cupsaccept.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupsaccept.html 2022-01-27 11:11:42.000000000 +0000 @@ -70,15 +70,15 @@ Also, printer and class names are not case-sensitive.

                      Finally, the CUPS versions may ask the user for an access password depending on the printing system configuration.

                      See Also

                      -cancel(1), -cupsenable(8), -lp(1), -lpadmin(8), -lpstat(1), +cancel(1), +cupsenable(8), +lp(1), +lpadmin(8), +lpstat(1),
                      CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupsctl.html cups-2.4.1op1/doc/help/man-cupsctl.html --- cups-2.3.3op2/doc/help/man-cupsctl.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupsctl.html 2022-01-27 11:11:42.000000000 +0000 @@ -59,36 +59,32 @@

                      Examples

                      Display the current settings:
                      -
                           cupsctl
                       
                       
                      Enable debug logging:
                      -
                           cupsctl --debug-logging
                       
                       
                      Get the current debug logging state:
                      -
                           cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'
                       
                       
                      Disable printer sharing:
                      -
                           cupsctl --no-share-printers
                       

                      Known Issues

                      You cannot set the Listen or Port directives using cupsctl.

                      See Also

                      -cupsd.conf(5), -cupsd(8), +cupsd.conf(5), +cupsd(8),
                      CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupsd-helper.html cups-2.4.1op1/doc/help/man-cupsd-helper.html --- cups-2.3.3op2/doc/help/man-cupsd-helper.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupsd-helper.html 2022-01-27 11:11:42.000000000 +0000 @@ -44,16 +44,15 @@ argvN

                      Description

                      The cupsd-helper programs perform long-running operations on behalf of the scheduler, -cupsd(8). +cupsd(8). The cups-deviced helper program runs each CUPS -backend(7) +backend(7) with no arguments in order to discover the available printers.

                      The cups-driverd helper program lists all available printer drivers, a subset of "matching" printer drivers, or a copy of a specific driver PPD file.

                      The cups-exec helper program runs backends, filters, and other programs. On macOS these programs are run in a secure sandbox.

                      Files

                      The cups-driverd program looks for PPD and driver information files in the following directories:
                      -
                           /Library/Printers
                           /opt/share/ppd
                           /System/Library/Printers
                      @@ -68,21 +67,21 @@
                       tar(1)
                       archives to further reduce their size.
                       

                      Driver information files must conform to the format defined in -ppdcfile(5). +ppdcfile(5).

                      Notes

                      CUPS printer drivers, backends, and PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -backend(7), -cups(1), -cupsd(8), -cupsd.conf(5), -filter(7), -ppdcfile(5), +backend(7), +cups(1), +cupsd(8), +cupsd.conf(5), +filter(7), +ppdcfile(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupsd-logs.html cups-2.4.1op1/doc/help/man-cupsd-logs.html --- cups-2.3.3op2/doc/help/man-cupsd-logs.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupsd-logs.html 2022-01-27 11:11:42.000000000 +0000 @@ -10,25 +10,23 @@

                      Name

                      cupsd-logs - cupsd log files (access_log, error_log, and page_log)

                      Description

                      -cupsd(8) +cupsd(8) normally maintains three log files: access_log to track requests that are submitted to the scheduler, error_log to track progress and errors, and page_log to track pages that are printed. Configuration directives in -cupsd.conf(5) +cupsd.conf(5) and -cups-files.conf(5) +cups-files.conf(5) control what information is logged and where it is stored.

                      Access Log File Format

                      The access_log 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:
                      -
                           host group user date-time "method resource version" status bytes
                             ipp-operation ipp-status
                       
                       
                      For example:
                      -
                           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"
                      @@ -93,16 +91,14 @@
                       

                      The ipp-status field contains either "-" for non-IPP requests or the IPP status code name for POST requests containing an IPP response.

                      Error Log File Format

                      The error_log file lists messages from the scheduler - errors, warnings, etc. The LogLevel directive in the -cupsd.conf(5) +cupsd.conf(5) file controls which messages are logged:
                      -
                           level date-time message
                       
                       
                      For example:
                      -
                           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"
                      @@ -145,20 +141,18 @@
                       The page_log file lists the total number of pages (sheets) that are printed.
                       By default, each line contains the following information:
                       
                      -
                           printer user job-id date-time total num-sheets job-billing
                             job-originating-host-name job-name media sides
                       
                       
                      For example the entry for a two page job called "myjob" might look like:
                      -
                           DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123
                             localhost myjob na_letter_8.5x11in one-sided
                       
                       
                      The PageLogFormat directive in the -cupsd.conf(5) +cupsd.conf(5) file can be used to change this information.

                      The printer 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. @@ -173,12 +167,12 @@

                      The media 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.

                      The sides field contains a copy of the sides attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.

                      See Also

                      -cupsd(8), -cupsd.conf(5), -cups-files.conf(5), +cupsd(8), +cupsd.conf(5), +cups-files.conf(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupsd.conf.html cups-2.4.1op1/doc/help/man-cupsd.conf.html --- cups-2.3.3op2/doc/help/man-cupsd.conf.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupsd.conf.html 2022-01-27 11:11:42.000000000 +0000 @@ -13,7 +13,7 @@ The cupsd.conf file configures the CUPS scheduler, -cupsd(8). +cupsd(8). It is normally located in the /etc/cups directory. @@ -23,7 +23,7 @@ Comment lines start with the # character.

                      Top-level Directives

                      The following top-level directives are understood by -cupsd(8): +cupsd(8):
                      AccessLogLevel config
                      AccessLogLevel actions @@ -58,7 +58,6 @@ Specifies whether shared printers are advertised. The default is "No".
                      DefaultAuthType Basic -
                      DefaultAuthType Negotiate

                      Specifies the default type of authentication to use. The default is "Basic". @@ -76,6 +75,7 @@
                      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". +Note: The default paper size must use a size name from the PPD file and not a PWG self-describing media size name.
                      DefaultPolicy policy-name
                      Specifies the default access policy to use. The default access policy is "default". @@ -111,15 +111,12 @@ 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 name -
                      Specifies the service name when using Kerberos authentication. -The default service name is "http."
                      HostNameLookups On
                      HostNameLookups Off
                      HostNameLookups Double
                      Specifies whether to do reverse lookups on connecting clients. The "Double" setting causes -cupsd(8) +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. @@ -128,7 +125,7 @@
                      Specifies the length of time to wait before shutting down due to inactivity. The default is "60" seconds. Note: Only applicable when -cupsd(8) +cupsd(8) is run on-demand (e.g., with -l).
                      JobKillDelay seconds
                      Specifies the number of seconds to wait before killing the filters and backend associated with a canceled or held job. @@ -145,9 +142,6 @@
                      KeepAlive No
                      Specifies whether to support HTTP keep-alive connections. The default is "Yes". -
                      KeepAliveTimeout seconds -
                      Specifies how long an idle client connection remains open. -The default is "30".
                      <Limit operation ...> ... </Limit>
                      Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATION NAMES".
                      <Limit method ...> ... </Limit> @@ -164,11 +158,6 @@ 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. Note: "Listen *:port" and "Port port" effectively listen on all IP addresses, so you cannot combine them with Listen directives for explicit IPv4 or IPv6 addresses on the same port. -
                      ListenBackLog number -
                      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 /path> ... </Location>
                      Specifies access control for the named location. Paths are documented below in the section "LOCATION PATHS". @@ -222,6 +211,19 @@
                      Specifies the maximum size of the log files before they are rotated. The value "0" disables log rotation. The default is "1048576" (1MB). +
                      MaxSubscriptions number +
                      Specifies the maximum number of simultaneous event subscriptions that are allowed. +Set to "0" to allow an unlimited number of subscriptions. +The default is "100". +
                      MaxSubscriptionsPerJob number +
                      Specifies the maximum number of simultaneous event subscriptions that are allowed per job. +The default is "0" which allows up to MaxSubscriptions subscriptions per job. +
                      MaxSubscriptionsPerPrinter number +
                      Specifies the maximum number of simultaneous event subscriptions that are allowed per printer. +The default is "0" which allows up to MaxSubscriptions subscriptions per printer. +
                      MaxSubscriptionsPerUser number +
                      Specifies the maximum number of simultaneous event subscriptions that are allowed per user. +The default is "0" which allows up to MaxSubscriptions subscriptions per user.
                      MultipleOperationTimeout seconds
                      Specifies the maximum amount of time to allow between files in a multiple file print job. The default is "900" (15 minutes). @@ -242,6 +244,11 @@ 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". +
                      ReadyPaperSizes sizename[,...] +
                      Specifies a list of potential paper sizes that are reported as "ready" (loaded). +The actual list will only contain sizes that each printer supports. +The default is "Letter,Legal,Tabloid,4x6,Env10" when the default paper size is "Letter" and "A3,A4,A5,A6,EnvDL" otherwise. +Note: Paper sizes must use the size names from the PPD file and not PWG self-describing media size names.
                      ReloadTimeout seconds
                      Specifies the amount of time to wait for job completion before restarting the scheduler. The default is "30". @@ -308,7 +315,7 @@

                      Http Method Names

                      The following HTTP methods are supported by -cupsd(8): +cupsd(8):
                      GET
                      Used by a client to download icons and other printer resources and to access the CUPS web interface. @@ -323,7 +330,7 @@

                      Ipp Operation Names

                      The following IPP operations are supported by -cupsd(8): +cupsd(8):
                      CUPS-Accept-Jobs
                      Allows a printer to accept new jobs. @@ -416,7 +423,7 @@

                      Location Paths

                      The following paths are commonly used when configuring -cupsd(8): +cupsd(8):
                      /
                      The path for all get operations (get-printers, get-jobs, etc.) @@ -464,7 +471,6 @@
                      AuthType None
                      AuthType Basic
                      AuthType Default -
                      AuthType Negotiate
                      Specifies the type of authentication required. The value "Default" corresponds to the DefaultAuthType value.
                      Deny all @@ -496,7 +502,7 @@
                      Require user {user-name|@group-name} ...
                      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 -cups-files.conf(5) +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. Note: The 'root' user is not special and must be granted privileges like any other user account. @@ -519,7 +525,7 @@ "@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 -cups-files.conf(5) +cups-files.conf(5) file.
                      JobPrivateValues all
                      JobPrivateValues default @@ -535,7 +541,7 @@ "@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 -cups-files.conf(5) +cups-files.conf(5) file.
                      SubscriptionPrivateValues all
                      SubscriptionPrivateValues default @@ -547,6 +553,8 @@

                      Deprecated Directives

                      The following directives are deprecated and will be removed in a future release of CUPS:
                      +
                      AuthType Negotiate +
                      Specifies Kerberos authentication is required.
                      Classification banner

                      Specifies the security classification of the server. @@ -557,12 +565,16 @@

                      Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option. The default is "No". +
                      DefaultAuthType Negotiate +
                      Specifies that Kerberos authentication is required by default. +
                      GSSServiceName name +
                      Specifies the service name when using Kerberos authentication. +The default service name is "http."
                      PageLogFormat format-string
                      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:
                      -
                           "%%" inserts a single percent character.
                           "%{name}" inserts the value of the specified IPP attribute.
                           "%C" inserts the number of copies for the current page.
                      @@ -576,13 +588,10 @@
                       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.
                       Use "%{job-impressions-completed}" to insert the number of pages (sides) that were printed, or "%{job-media-sheets-completed}" to insert the number of sheets that were printed.
                      -
                      RIPCache size -
                      Specifies the maximum amount of memory to use when converting documents into bitmaps for a printer. -The default is "128m".

                      Notes

                      File, directory, and user configuration directives that used to be allowed in the cupsd.conf file are now stored in the -cups-files.conf(5) +cups-files.conf(5) file instead in order to prevent certain types of privilege escalation attacks.

                      The scheduler MUST be restarted manually after making changes to the cupsd.conf file. On Linux this is typically done using the @@ -598,7 +607,6 @@

                      Examples

                      Log everything with a maximum log file size of 32 megabytes:
                      -
                           AccessLogLevel all
                           LogLevel debug2
                           MaxLogSize 32m
                      @@ -606,7 +614,6 @@
                       
                      Require authentication for accesses from outside the 10. network:
                      -
                           <Location />
                           Order allow,deny
                           Allow from 10./8
                      @@ -616,18 +623,16 @@
                           </Location>
                       

                      See Also

                      -classes.conf(5), -cups-files.conf(5), -cupsd(8), -mime.convs(5), -mime.types(5), -printers.conf(5), -subscriptions.conf(5), +classes.conf(5), +cups-files.conf(5), +cupsd(8), +mime.convs(5), +mime.types(5), +printers.conf(5), +subscriptions.conf(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2020 by Michael R Sweet -
                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2020-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupsd.html cups-2.4.1op1/doc/help/man-cupsd.html --- cups-2.3.3op2/doc/help/man-cupsd.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupsd.html 2022-01-27 11:11:42.000000000 +0000 @@ -80,14 +80,12 @@ cupsd in the background with the default configuration file:
                      -
                           cupsd
                       
                       
                      Test a configuration file called test.conf:
                      -
                           cupsd -t -c test.conf
                       
                       
                      @@ -96,28 +94,27 @@ in the foreground with a test configuration file called test.conf:
                      -
                           cupsd -f -c test.conf
                       
                       

                      See Also

                      -backend(7), -classes.conf(5), -cups(1), -cups-files.conf(5), -cups-lpd(8), -cupsd.conf(5), -cupsd-helper(8), +backend(7), +classes.conf(5), +cups(1), +cups-files.conf(5), +cups-lpd(8), +cupsd.conf(5), +cupsd-helper(8), cupsd-logs(8), -filter(7), +filter(7), launchd(8), -mime.convs(5), -mime.types(5), -printers.conf(5), +mime.convs(5), +mime.types(5), +printers.conf(5), systemd(8), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupsenable.html cups-2.4.1op1/doc/help/man-cupsenable.html --- cups-2.3.3op2/doc/help/man-cupsenable.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupsenable.html 2022-01-27 11:11:42.000000000 +0000 @@ -78,15 +78,15 @@

                      The CUPS versions of disable and enable 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.

                      See Also

                      -cupsaccept(8), +cupsaccept(8), cupsreject(8), -cancel(1), -lp(1), -lpadmin(8), -lpstat(1), +cancel(1), +lp(1), +lpadmin(8), +lpstat(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupsfilter.html cups-2.4.1op1/doc/help/man-cupsfilter.html --- cups-2.3.3op2/doc/help/man-cupsfilter.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupsfilter.html 2022-01-27 11:11:42.000000000 +0000 @@ -92,7 +92,7 @@ returns a non-zero exit status on any error.

                      Environment

                      All of the standard -cups(1) +cups(1) environment variables affect the operation of cupsfilter.

                      Files

                      @@ -105,25 +105,24 @@

                      Notes

                      CUPS printer drivers, filters, and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      Unlike when printing, filters run using the cupsfilter command use the current user and security session. This may result in different output or unexpected behavior.

                      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":
                      -
                           cupsfilter -m application/pdf -d myprinter -j 42 >preview.pdf
                       

                      See Also

                      -cups(1), -cupsd.conf(5), +cups(1), +cupsd.conf(5), filter(7), mime.convs(7), mime.types(7), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-cupstestppd.html cups-2.4.1op1/doc/help/man-cupstestppd.html --- cups-2.3.3op2/doc/help/man-cupstestppd.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-cupstestppd.html 2022-01-27 11:11:42.000000000 +0000 @@ -8,7 +8,7 @@

                      cupstestppd(1)

                      Name

                      -cupstestppd - test conformance of ppd files +cupstestppd - test conformance of ppd files (deprecated)

                      Synopsis

                      cupstestppd [ @@ -106,26 +106,24 @@

                      Examples

                      The following command will test all PPD files under the current directory and print the names of each file that does not conform:
                      -
                           find . -name \*.ppd \! -exec cupstestppd -q '{}' \; -print
                       
                       
                      The next command tests all PPD files under the current directory and print detailed conformance testing results for the files that do not conform:
                      -
                           find . -name \*.ppd \! -exec cupstestppd -q '{}' \; \
                               -exec cupstestppd -v '{}' \;
                       

                      Notes

                      PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -lpadmin(8), -CUPS Online Help (http://localhost:631/help), +lpadmin(8), +CUPS Online Help (http://localhost:631/help), Adobe PostScript Printer Description File Format Specification, Version 4.3.

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-filter.html cups-2.4.1op1/doc/help/man-filter.html --- cups-2.3.3op2/doc/help/man-filter.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-filter.html 2022-01-27 11:11:42.000000000 +0000 @@ -20,7 +20,6 @@ filename ]
                      -
                       #include <cups/cups.h>
                       
                       ssize_t cupsBackChannelRead(char *buffer, size_t bytes,
                      @@ -70,7 +69,6 @@
                       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 Duplex PPD option:
                       
                      -
                           ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
                           cups_option_t *options = NULL;
                           int num_options = cupsParseOptions(argv[5], 0, &options);
                      @@ -167,23 +165,23 @@
                       

                      Notes

                      CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      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 macOS) 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 -cupsfilter(8) +cupsfilter(8) program to use the appropriate filters to do the conversions you need.

                      See Also

                      -backend(7), -cups(1), -cups-files.conf(5), -cupsd(8), -cupsfilter(8), +backend(7), +cups(1), +cups-files.conf(5), +cupsd(8), +cupsfilter(8),
                      CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ippevepcl.html cups-2.4.1op1/doc/help/man-ippevepcl.html --- cups-2.3.3op2/doc/help/man-ippevepcl.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ippevepcl.html 2022-01-27 11:11:42.000000000 +0000 @@ -24,7 +24,7 @@ and ippeveps are print commands for -ippeveprinter(1). +ippeveprinter(1). As with all print commands, these commands read either the filename specified on the command-line or from the standard input. Output is sent to the standard output. Status and progress messages are sent to the standard error. @@ -43,7 +43,7 @@

                      See Also

                      ippeveprinter(8)

                      Copyright

                      -Copyright © 2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ippeveprinter.html cups-2.4.1op1/doc/help/man-ippeveprinter.html --- cups-2.3.3op2/doc/help/man-ippeveprinter.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ippeveprinter.html 2022-01-27 11:11:42.000000000 +0000 @@ -130,10 +130,10 @@ ippeveprinter looks for the command in the "command" subdirectory of the CUPS binary directory, typically /usr/lib/cups/command or /usr/libexec/cups/command. The -cups-config(1) +cups-config(1) command can be used to discover the correct binary directory ("cups-config --serverbin"). In addition, the CUPS_SERVERBIN environment variable can be used to override the default location of this directory - see the -cups(1) +cups(1) man page for more details.
                      -d spool-directory
                      Specifies the directory that will hold the print files. @@ -222,22 +222,20 @@ ippeveprinter with a service name of My Cool Printer:
                      -
                           ippeveprinter "My Cool Printer"
                       

                      Run the file(1) command whenever a job is sent to the server:

                      -
                           ippeveprinter -c /usr/bin/file "My Cool Printer"
                       

                      See Also

                      -ippevepcl(7), +ippevepcl(7), ippeveps(7), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ippfind.html cups-2.4.1op1/doc/help/man-ippfind.html --- cups-2.3.3op2/doc/help/man-ippfind.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ippfind.html 2022-01-27 11:11:42.000000000 +0000 @@ -188,20 +188,18 @@

                      Examples

                      To show the status of all registered IPP printers on your network, run:
                      -
                           ippfind --ls
                       
                       
                      Similarly, to send a PostScript test page to every PostScript printer, run:
                      -
                           ippfind --txt-pdl application/postscript --exec ipptool
                             -f onepage-letter.ps '{}' print-job.test \;
                       

                      See Also

                      -ipptool(1) +ipptool(1)

                      Copyright

                      -Copyright © 2013-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ipptool.html cups-2.4.1op1/doc/help/man-ipptool.html --- cups-2.3.3op2/doc/help/man-ipptool.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ipptool.html 2022-01-27 11:11:42.000000000 +0000 @@ -84,7 +84,7 @@ The testfile format is described in -ipptoolfile(5). +ipptoolfile(5).

                      Options

                      The following options are recognized by ipptool: @@ -172,36 +172,36 @@

                      Files

                      The following standard files are available:
                      -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-notifications.test
                      -get-printer-attributes.test
                      -get-subscriptions.test
                      -gray.jpg
                      -ipp-1.1.test
                      -ipp-2.0.test
                      -ipp-2.1.test
                      -ipp-2.2.test
                      -ipp-everywhere.test
                      -onepage-a4.pdf
                      -onepage-a4.ps
                      -onepage-letter.pdf
                      -onepage-letter.ps
                      -print-job.test
                      -print-job-deflate.test
                      -print-job-gzip.test
                      -testfile.jpg
                      -testfile.pcl
                      -testfile.pdf
                      -testfile.ps
                      -testfile.txt
                      -validate-job.test
                      +    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-notifications.test
                      +    get-printer-attributes.test
                      +    get-subscriptions.test
                      +    gray.jpg
                      +    ipp-1.1.test
                      +    ipp-2.0.test
                      +    ipp-2.1.test
                      +    ipp-2.2.test
                      +    ipp-everywhere.test
                      +    onepage-a4.pdf
                      +    onepage-a4.ps
                      +    onepage-letter.pdf
                      +    onepage-letter.ps
                      +    print-job.test
                      +    print-job-deflate.test
                      +    print-job-gzip.test
                      +    testfile.jpg
                      +    testfile.pcl
                      +    testfile.pdf
                      +    testfile.ps
                      +    testfile.txt
                      +    validate-job.test
                       

                      Conforming To

                      The @@ -210,22 +210,20 @@

                      Examples

                      Get a list of completed jobs for "myprinter":
                      -
                           ipptool ipp://localhost/printers/myprinter get-completed-jobs.test
                       

                      Send email notifications to "user@example.com" when "myprinter" changes:

                      -
                           ipptool -d recipient=mailto:user@example.com \
                               ipp://localhost/printers/myprinter create-printer-subscription.test
                       

                      See Also

                      -ipptoolfile(5), -IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations), -PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) -RFC 8011 (http://tools.ietf.org/html/rfc8011), +ipptoolfile(5), +IANA IPP Registry (https://www.iana.org/assignments/ipp-registrations), +PWG Internet Printing Protocol Workgroup (https://www.pwg.org/ipp) +RFC 8011 (https://datatracker.ietf.org/doc/html/rfc8011),

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ipptoolfile.html cups-2.4.1op1/doc/help/man-ipptoolfile.html --- cups-2.3.3op2/doc/help/man-ipptoolfile.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ipptoolfile.html 2022-01-27 11:11:42.000000000 +0000 @@ -11,12 +11,11 @@ ipptoolfile - ipptool file format

                      Description

                      The -ipptool(1) +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:
                      -
                           # This is a comment
                           {
                             # The name of the test
                      @@ -175,10 +174,16 @@
                       
                      Specifies whether ipptool(8) will ignore errors and continue with subsequent tests. +
                      MONITOR-PRINTER-STATE [ printer-uri ] { EXPECT attribute-name [ predicate(s) ] } +
                      Specifies printer state monitoring tests to run in parallel with the test operation. +The monitoring tests will run until all of the EXPECT conditions are satisfied or the primary test operation has completed, whichever occurs first.
                      NAME "literal string"
                      Specifies the human-readable name of the test.
                      OPERATION operation-code
                      Specifies the operation to be performed. +
                      PASS-IF-DEFINED variable-name +
                      PASS-IF-NOT-DEFINED variable-name +
                      Specifies that the current test should be passed automatically when the variable is or is not defined.
                      PAUSE "message"
                      Displays the provided message and waits for the user to press a key to continue.
                      REQUEST-ID number @@ -219,19 +224,25 @@
                      COUNT number
                      Requires the EXPECT attribute to have the specified number of values.
                      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. +
                      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.
                      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. +
                      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.
                      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. +
                      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. +
                      DISPLAY-MATCH "message" +
                      Displays the specified message when the EXPECT condition matches.
                      IF-DEFINED variable-name
                      Makes the EXPECT conditions apply only if the specified variable is defined.
                      IF-NOT-DEFINED variable-name
                      Makes the EXPECT conditions apply only if the specified variable is not defined.
                      IN-GROUP tag
                      Requires the EXPECT attribute to be in the specified group tag. -
                      OF-TYPE tag[|tag,...] +
                      OF-TYPE tag[(limits)|tag|...]
                      Requires the EXPECT attribute to use one of the specified value tag(s). +Most value tags also support the specification of limits in parenthesis, for example "name(42)" would allow nameWith/WithoutLanguage strings up to 42 octets in length, "name(4:MAX)" would allow nameWith/WithoutLanguage strings between 4 and 255 octets in length, and "integer(-273:MAX)" would allow integers between -273 and 2147483647.
                      REPEAT-LIMIT number

                      Specifies the maximum number of times to repeat if the REPEAT-MATCH or REPEAT-NO-MATCH predicate is specified. The default value is 1000. @@ -260,7 +271,12 @@
                      WITH-ALL-VALUES "true"
                      Requires that all values of the EXPECT attribute match the boolean value given.
                      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. +
                      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. +
                      WITH-DISTINCT-VALUES +
                      Requires that all values of the EXPECT attribute are unique. +Comparisons are case-sensitive. +Only charset, collection, enum, integer, keyword, mimeMediaType, naturalLanguage, rangeOfInteger, resolution, uriScheme attributes support this predicate.
                      WITH-HOSTNAME "literal string"
                      WITH-HOSTNAME "/regular expression/"
                      Requires that at least one URI value contains a matching hostname. @@ -308,12 +324,32 @@ Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 8011 and other IPP extension specifications. Here is a complete list of names supported by ipptool(8):
                      -
                      +    Acknowledge-Document
                      +    Acknowledge-Identify-Printer
                      +    Acknowledge-Job
                           Activate-Printer
                      +    Add-Document-Images
                      +    Allocate-Printer-Resources
                      +    Cancel-Current-Job
                      +    Cancel-Job
                      +    Cancel-Jobs
                      +    Cancel-My-Jobs
                      +    Cancel-Resource
                      +    Cancel-Subscription
                      +    Close-Job
                      +    Create-Job
                      +    Create-Job-Subscriptions
                      +    Create-Printer
                      +    Create-Printer-Subscriptions
                      +    Create-Resource
                      +    Create-Resource-Subscriptions
                      +    Create-System-Subscriptions
                      +    CUPS-Accept-Jobs
                           CUPS-Accept-Jobs
                           CUPS-Add-Modify-Class
                           CUPS-Add-Modify-Printer
                           CUPS-Authenticate-Job
                      +    CUPS-Create-Local-Printer
                           CUPS-Delete-Class
                           CUPS-Delete-Printer
                           CUPS-Get-Classes
                      @@ -326,54 +362,74 @@
                           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
                      +    Deallocate-Printer-Resources
                      +    Delete-Printer
                      +    Deregister-Output-Device
                      +    Disable-All-Printers
                           Disable-Printer
                      +    Enable-All-Printers
                           Enable-Printer
                      +    Fetch-Document
                      +    Fetch-Job
                           Get-Job-Attributes
                           Get-Jobs
                      +    Get-Next-Document-Data
                           Get-Notifications
                      +    Get-Output-Device-Attributes
                           Get-Printer-Attributes
                           Get-Printer-Support-Files
                           Get-Printer-Supported-Values
                      +    Get-Printers
                           Get-Subscription-Attributes
                           Get-Subscriptions
                      +    Get-System-Attributes
                      +    Get-System-Supported-Values
                           Hold-Job
                           Hold-New-Jobs
                           Identify-Printer
                      +    Install-Resource
                      +    Pause-All-Printers
                      +    Pause-All-Printers-After-Current-Job
                           Pause-Printer
                           Pause-Printer-After-Current-Job
                           Print-Job
                           Print-URI
                           Promote-Job
                           Purge-Jobs
                      +    Register-Output-Device
                           Release-Held-New-Jobs
                           Release-Job
                           Renew-Subscription
                           Reprocess-Job
                           Restart-Job
                           Restart-Printer
                      +    Restart-System
                           Resubmit-Job
                      +    Resume-All-Printers
                           Resume-Job
                           Resume-Printer
                           Schedule-Job-After
                           Send-Document
                           Send-Hardcopy-Document
                           Send-Notifications
                      +    Send-Resource-Data
                           Send-URI
                           Set-Job-Attributes
                           Set-Printer-Attributes
                      +    Set-Resource-Attributes
                      +    Set-System-Attributes
                      +    Shutdown-All-Printers
                      +    Shutdown-One-Printer
                           Shutdown-Printer
                      +    Startup-All-Printers
                      +    Startup-One-Printer
                           Startup-Printer
                           Suspend-Current-Job
                      +    Update-Active-Jobs
                      +    Update-Document-Status
                      +    Update-Job-Status
                      +    Update-Output-Device-Attributes
                           Validate-Document
                           Validate-Job
                       
                      @@ -381,7 +437,6 @@ Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 8011 and other IPP extension specifications. Here is a complete list of the names supported by ipptool(8):
                      -
                           client-error-account-authorization-failed
                           client-error-account-closed
                           client-error-account-info-needed
                      @@ -406,6 +461,7 @@
                           client-error-ignored-all-subscriptions
                           client-error-not-authenticated
                           client-error-not-authorized
                      +    client-error-not-fetchable
                           client-error-not-found
                           client-error-not-possible
                           client-error-print-support-file-not-found
                      @@ -443,39 +499,37 @@
                       

                      Tags

                      Value and group tags correspond to the names from RFC 8011 and other IPP extension specifications. Here are the group tags:
                      -
                           document-attributes-tag
                           event-notification-attributes-tag
                      -    job-attributes-tag
                      -    operation-attributes-tag
                      -    printer-attributes-tag
                      +    job | job-attributes-tag
                      +    operation | operation-attributes-tag
                      +    printer | printer-attributes-tag
                      +    resource-attributes-tag
                           subscription-attributes-tag
                      +    system-attributes-tag
                           unsupported-attributes-tag
                       

                      Here are the value tags:

                      -
                           admin-define
                           boolean
                           charset
                      -    collection
                      +    collection | begCollection
                           dateTime
                           default
                           delete-attribute
                           enum
                           integer
                           keyword
                      -    mimeMediaType
                      -    nameWithLanguage
                      -    nameWithoutLanguage
                      -    naturalLanguage
                      +    language | naturalLanguage
                      +    mimetype | mimeMediaType
                      +    name | nameWithLanguage | nameWithoutLanguage
                           no-value
                           not-settable
                           octetString
                           rangeOfInteger
                           resolution
                      -    textWithLanguage
                      -    textWithoutLanguage
                      +    text | textWithLanguage | textWithoutLanguage
                           unknown
                           unsupported
                           uri
                      @@ -531,12 +585,12 @@
                       
                      Inserts the current user's login name.

                      See Also

                      -ipptool(1), -IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations), -PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp), -RFC 8011 (http://tools.ietf.org/html/rfc8011) +ipptool(1), +IANA IPP Registry (https://www.iana.org/assignments/ipp-registrations), +PWG Internet Printing Protocol Workgroup (https://www.pwg.org/ipp), +RFC 8011 (https://datatracker.ietf.org/doc/html/rfc8011)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lp.html cups-2.4.1op1/doc/help/man-lp.html --- cups-2.3.3op2/doc/help/man-lp.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lp.html 2022-01-27 11:11:42.000000000 +0000 @@ -86,9 +86,9 @@

                      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 -lpoptions(1) +lpoptions(1) command is used, followed by the default set using the -lpadmin(8) +lpadmin(8) command.

                      Options

                      The following options are recognized by lp: @@ -138,7 +138,7 @@

                      Common Job Options

                      Aside from the printer-specific options reported by the -lpoptions(1) +lpoptions(1) command, the following generic options are available:
                      -o job-sheets=name @@ -172,32 +172,29 @@

                      Examples

                      Print two copies of a document to the default printer:
                      -
                           lp -n 2 filename
                       
                       
                      Print a double-sided legal document to a printer called "foo":
                      -
                           lp -d foo -o media=legal -o sides=two-sided-long-edge filename
                       
                       
                      Print a presentation document 2-up to a printer called "bar":
                      -
                           lp -d bar -o number-up=2 filename
                       

                      See Also

                      -cancel(1), -lpadmin(8), -lpoptions(1), -lpq(1), -lpr(1), -lprm(1), -lpstat(1), +cancel(1), +lpadmin(8), +lpoptions(1), +lpq(1), +lpr(1), +lprm(1), +lpstat(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lpadmin.html cups-2.4.1op1/doc/help/man-lpadmin.html --- cups-2.3.3op2/doc/help/man-lpadmin.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lpadmin.html 2022-01-27 11:11:42.000000000 +0000 @@ -56,11 +56,11 @@

                      When specified before the -d, -p, or -x options, the -E option forces encryption when connecting to the server.

                      The first form of the command (-d) sets the default printer or class to destination. Subsequent print jobs submitted via the -lp(1) +lp(1) or -lpr(1) +lpr(1) commands will use this destination unless the user specifies otherwise with the -lpoptions(1) +lpoptions(1) command.

                      The second form of the command (-p) configures the named printer or class. The additional options are described below.

                      The third form of the command (-x) deletes the printer or class destination. @@ -74,7 +74,7 @@

                      -m model
                      Sets a standard PPD file for the printer from the model directory or using one of the driver interfaces. Use the -m option with the -lpinfo(8) +lpinfo(8) command to get a list of supported models. The model "raw" clears any existing PPD file and the model "everywhere" queries the printer referred to by the specified IPP device-uri. Note: Models other than "everywhere" are deprecated and will not be supported in a future version of CUPS. @@ -99,7 +99,7 @@
                      -o name=value
                      Sets a PPD option for the printer. PPD options can be listed using the -l option with the -lpoptions(1) +lpoptions(1) command.
                      -o name-default=value
                      Sets a default server-side option for the destination. @@ -138,16 +138,16 @@
                      -v "device-uri"
                      Sets the device-uri attribute of the printer queue. Use the -v option with the -lpinfo(8) +lpinfo(8) command to get a list of supported device URIs and schemes.
                      -D "info"
                      Provides a textual description of the destination.
                      -E
                      When specified before the -d, -p, or -x options, forces the use of TLS encryption on the connection to the scheduler. Otherwise, enables the destination and accepts jobs; this is the same as running the -cupsaccept(8) +cupsaccept(8) and -cupsenable(8) +cupsenable(8) programs on the destination.
                      -L "location"
                      Provides a textual location of the destination. @@ -171,7 +171,7 @@

                      Notes

                      CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      The CUPS version of lpadmin does not support all of the System V or Solaris printing system configuration options.

                      Interface scripts are not supported for security reasons.

                      The double meaning of the -E option is an unfortunate historical oddity. @@ -181,18 +181,17 @@

                      Example

                      Create an IPP Everywhere print queue:
                      -
                           lpadmin -p myprinter -E -v ipp://myprinter.local/ipp/print -m everywhere
                       
                       

                      See Also

                      -cupsaccept(8), -cupsenable(8), -lpinfo(8), -lpoptions(1), +cupsaccept(8), +cupsenable(8), +lpinfo(8), +lpoptions(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lpc.html cups-2.4.1op1/doc/help/man-lpc.html --- cups-2.3.3op2/doc/help/man-lpc.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lpc.html 2022-01-27 11:11:42.000000000 +0000 @@ -36,20 +36,20 @@ This program is deprecated and will be removed in a future feature release of CUPS.

                      Since lpc is geared towards the Berkeley printing system, it is impossible to use lpc to configure printer or class queues provided by CUPS. To configure printer or class queues you must use the -lpadmin(8) +lpadmin(8) command or another CUPS-compatible client with that functionality.

                      See Also

                      -cancel(1), -cupsaccept(8), -cupsenable(8), -lp(1), -lpadmin(8), -lpr(1), -lprm(1), -lpstat(1), +cancel(1), +cupsaccept(8), +cupsenable(8), +lp(1), +lpadmin(8), +lpr(1), +lprm(1), +lpstat(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lpinfo.html cups-2.4.1op1/doc/help/man-lpinfo.html --- cups-2.3.3op2/doc/help/man-lpinfo.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lpinfo.html 2022-01-27 11:11:42.000000000 +0000 @@ -90,30 +90,27 @@

                      Examples

                      List all devices:
                      -
                           lpinfo -v
                       
                       
                      List all drivers:
                      -
                           lpinfo -m
                       
                       
                      List drivers matching "HP LaserJet":
                      -
                           lpinfo --make-and-model "HP LaserJet" -m
                       

                      Notes

                      CUPS printer drivers and backends are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -lpadmin(8), +lpadmin(8), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lpmove.html cups-2.4.1op1/doc/help/man-lpmove.html --- cups-2.3.3op2/doc/help/man-lpmove.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lpmove.html 2022-01-27 11:11:42.000000000 +0000 @@ -48,7 +48,6 @@

                      Examples

                      Move job 123 from "oldprinter" to "newprinter":
                      -
                           lpmove 123 newprinter
                       
                                   or
                      @@ -58,18 +57,17 @@
                       
                      Move all jobs from "oldprinter" to "newprinter":
                      -
                           lpmove oldprinter newprinter
                       

                      See Also

                      -cancel(1), -lp(1), -lpr(1), -lprm(1), +cancel(1), +lp(1), +lpr(1), +lprm(1),
                      CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lpoptions.html cups-2.4.1op1/doc/help/man-lpoptions.html --- cups-2.3.3op2/doc/help/man-lpoptions.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lpoptions.html 2022-01-27 11:11:42.000000000 +0000 @@ -52,12 +52,12 @@

                      Description

                      lpoptions displays or sets printer options and defaults. If no printer is specified using the -p option, the default printer is used as described in -lp(1). +lp(1).

                      If no -l, -o, or -r options are specified, the current options are reported on the standard output.

                      Options set with the lpoptions command are used by the -lp(1) +lp(1) and -lpr(1) +lpr(1) commands when submitting jobs.

                      When run by the root user, lpoptions gets and sets default options and instances for all users in the /etc/cups/lpoptions file. Otherwise, the per-user defaults are managed in the ~/.cups/lpoptions file. @@ -80,7 +80,7 @@

                      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 -lpadmin(8) +lpadmin(8) program.
                      -r option
                      Removes the specified option from the named destination. @@ -88,7 +88,7 @@
                      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 -lpadmin(8) +lpadmin(8) command.

                      Files

                      @@ -98,14 +98,14 @@

                      Conforming To

                      The lpoptions command is unique to CUPS.

                      See Also

                      -cancel(1), -lp(1), -lpadmin(8), -lpr(1), -lprm(1), +cancel(1), +lp(1), +lpadmin(8), +lpr(1), +lprm(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lpq.html cups-2.4.1op1/doc/help/man-lpq.html --- cups-2.3.3op2/doc/help/man-lpq.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lpq.html 2022-01-27 11:11:42.000000000 +0000 @@ -48,14 +48,14 @@
                      Requests a more verbose (long) reporting format.

                      See Also

                      -cancel(1), -lp(1), -lpr(1), -lprm(1), -lpstat(1), +cancel(1), +lp(1), +lpr(1), +lprm(1), +lpstat(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lpr.html cups-2.4.1op1/doc/help/man-lpr.html --- cups-2.3.3op2/doc/help/man-lpr.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lpr.html 2022-01-27 11:11:42.000000000 +0000 @@ -56,9 +56,9 @@

                      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 -lpoptions(1) +lpoptions(1) command is used, followed by the default set using the -lpadmin(8) +lpadmin(8) command.

                      Options

                      The following options are recognized by lpr: @@ -97,7 +97,7 @@

                      Common Job Options

                      Aside from the printer-specific options reported by the -lpoptions(1) +lpoptions(1) command, the following generic options are available:
                      -o job-sheets=name @@ -129,32 +129,29 @@

                      Examples

                      Print two copies of a document to the default printer:
                      -
                           lpr -# 2 filename
                       
                       
                      Print a double-sided legal document to a printer called "foo":
                      -
                           lpr -P foo -o media=legal -o sides=two-sided-long-edge filename
                       
                       
                      Print a presentation document 2-up to a printer called "foo":
                      -
                           lpr -P foo -o number-up=2 filename
                       

                      See Also

                      -cancel(1), -lp(1), -lpadmin(8), -lpoptions(1), -lpq(1), -lprm(1), -lpstat(1), +cancel(1), +lp(1), +lpadmin(8), +lpoptions(1), +lpq(1), +lprm(1), +lpstat(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lprm.html cups-2.4.1op1/doc/help/man-lprm.html --- cups-2.3.3op2/doc/help/man-lprm.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lprm.html 2022-01-27 11:11:42.000000000 +0000 @@ -53,30 +53,27 @@

                      Examples

                      Cancel the current job on the default printer:
                      -
                           lprm
                       
                       
                      Cancel job 1234:
                      -
                           lprm 1234
                       
                       
                      Cancel all jobs:
                      -
                           lprm -
                       

                      See Also

                      -cancel(1), -lp(1), -lpq(1), -lpr(1), -lpstat(1), +cancel(1), +lp(1), +lpq(1), +lpr(1), +lpstat(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-lpstat.html cups-2.4.1op1/doc/help/man-lpstat.html --- cups-2.3.3op2/doc/help/man-lpstat.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-lpstat.html 2022-01-27 11:11:42.000000000 +0000 @@ -120,14 +120,14 @@

                      The -h, -e, -E, -U, and -W options are unique to CUPS.

                      The Solaris -f, -P, and -S options are silently ignored.

                      See Also

                      -cancel(1), -lp(1), -lpq(1), -lpr(1), -lprm(1), +cancel(1), +lp(1), +lpq(1), +lpr(1), +lprm(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-mailto.conf.html cups-2.4.1op1/doc/help/man-mailto.conf.html --- cups-2.3.3op2/doc/help/man-mailto.conf.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-mailto.conf.html 2022-01-27 11:11:42.000000000 +0000 @@ -33,10 +33,10 @@
                      Specifies a prefix string for the subject line of an email notification.

                      See Also

                      -cupsd(8), +cupsd(8), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-mime.convs.html cups-2.4.1op1/doc/help/man-mime.convs.html --- cups-2.3.3op2/doc/help/man-mime.convs.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-mime.convs.html 2022-01-27 11:11:42.000000000 +0000 @@ -18,7 +18,6 @@ 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:
                      -
                           source/type destination/type cost filter
                       
                       
                      @@ -37,23 +36,22 @@

                      Examples

                      Define a filter that converts PostScript documents to CUPS Raster format:
                      -
                           application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
                       
                       

                      Notes

                      CUPS filters are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -cups-files.conf(5), -cupsd.conf(5), -cupsd(8), -cupsfilter(8), -mime.types(5), +cups-files.conf(5), +cupsd.conf(5), +cupsd(8), +cupsfilter(8), +mime.types(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-mime.types.html cups-2.4.1op1/doc/help/man-mime.types.html --- cups-2.3.3op2/doc/help/man-mime.types.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-mime.types.html 2022-01-27 11:11:42.000000000 +0000 @@ -16,13 +16,11 @@ 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:
                      -
                           mime/type [ rule ... rule ]
                       
                       
                      Rules can be extended over multiple lines using the backslash character (\):
                      -
                           mime/type [ really-really-really-long-rule ... \
                             rule ]
                       
                      @@ -75,7 +73,6 @@
                       

                      Examples

                      Define two MIME media types for raster data, with one being a subset with higher priority:
                      -
                           application/vnd.cups-raster  string(0,"RaSt") string(0,"tSaR") \
                                                         string(0,"RaS2") string(0,"2SaR") \
                                                         string(0,"RaS3") string(0,"3SaR")
                      @@ -84,14 +81,14 @@
                                                         string(4,PwgRaster<00>) priority(150)
                       

                      See Also

                      -cups-files.conf(5), -cupsd.conf(5), -cupsd(8), -cupsfilter(8), -mime.convs(5), +cups-files.conf(5), +cupsd.conf(5), +cupsd(8), +cupsfilter(8), +mime.convs(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-notifier.html cups-2.4.1op1/doc/help/man-notifier.html --- cups-2.3.3op2/doc/help/man-notifier.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-notifier.html 2022-01-27 11:11:42.000000000 +0000 @@ -25,13 +25,13 @@ 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 -filter(7). +filter(7).

                      See Also

                      -cupsd(8), -filter(7), +cupsd(8), +filter(7), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ppdc.html cups-2.4.1op1/doc/help/man-ppdc.html --- cups-2.3.3op2/doc/help/man-ppdc.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ppdc.html 2022-01-27 11:11:42.000000000 +0000 @@ -80,16 +80,16 @@

                      Notes

                      PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -ppdhtml(1), -ppdi(1), -ppdmerge(1), -ppdpo(1), -ppdcfile(5), +ppdhtml(1), +ppdi(1), +ppdmerge(1), +ppdpo(1), +ppdcfile(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ppdcfile.html cups-2.4.1op1/doc/help/man-ppdcfile.html --- cups-2.3.3op2/doc/help/man-ppdcfile.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ppdcfile.html 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ ppdcfile - cups ppd compiler source file format (deprecated)

                      Description

                      The CUPS PPD compiler reads meta files that contain descriptions of one or more PPD files to be generated by -ppdc(1). +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.

                      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.

                      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. @@ -84,16 +84,16 @@

                      Notes

                      PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -ppdc(1), -ppdhtml(1), -ppdi(1), -ppdmerge(1), -ppdpo(1), +ppdc(1), +ppdhtml(1), +ppdi(1), +ppdmerge(1), +ppdpo(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ppdhtml.html cups-2.4.1op1/doc/help/man-ppdhtml.html --- cups-2.3.3op2/doc/help/man-ppdhtml.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ppdhtml.html 2022-01-27 11:11:42.000000000 +0000 @@ -34,16 +34,16 @@

                      Notes

                      PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -ppdc(1), -ppdcfile(5), -ppdi(1), -ppdmerge(1), -ppdpo(1), +ppdc(1), +ppdcfile(5), +ppdi(1), +ppdmerge(1), +ppdpo(1), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ppdi.html cups-2.4.1op1/doc/help/man-ppdi.html --- cups-2.3.3op2/doc/help/man-ppdi.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ppdi.html 2022-01-27 11:11:42.000000000 +0000 @@ -41,16 +41,16 @@

                      Notes

                      PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -ppdc(1), -ppdhtml(1), -ppdmerge(1), -ppdpo(1), -ppdcfile(5), +ppdc(1), +ppdhtml(1), +ppdmerge(1), +ppdpo(1), +ppdcfile(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ppdmerge.html cups-2.4.1op1/doc/help/man-ppdmerge.html --- cups-2.3.3op2/doc/help/man-ppdmerge.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ppdmerge.html 2022-01-27 11:11:42.000000000 +0000 @@ -35,18 +35,18 @@

                      Notes

                      PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      ppdmerge does not check whether the merged PPD files are for the same device. Merging of different device PPDs will yield unpredictable results.

                      See Also

                      -ppdc(1), -ppdhtml(1), -ppdi(1), -ppdpo(1), -ppdcfile(5), +ppdc(1), +ppdhtml(1), +ppdi(1), +ppdpo(1), +ppdcfile(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-ppdpo.html cups-2.4.1op1/doc/help/man-ppdpo.html --- cups-2.3.3op2/doc/help/man-ppdpo.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-ppdpo.html 2022-01-27 11:11:42.000000000 +0000 @@ -40,16 +40,16 @@

                      Notes

                      PPD files are deprecated and will no longer be supported in a future feature release of CUPS. Printers that do not support IPP can be supported using applications such as -ippeveprinter(1). +ippeveprinter(1).

                      See Also

                      -ppdc(1), -ppdhtml(1), -ppdi(1), -ppdmerge(1), +ppdc(1), +ppdhtml(1), +ppdi(1), +ppdmerge(1), ppdcfile(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-printers.conf.html cups-2.4.1op1/doc/help/man-printers.conf.html --- cups-2.3.3op2/doc/help/man-printers.conf.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-printers.conf.html 2022-01-27 11:11:42.000000000 +0000 @@ -11,21 +11,21 @@ printers.conf - printer configuration file for cups

                      Description

                      The printers.conf file defines the local printers that are available. It is normally located in the /etc/cups directory and is maintained by the -cupsd(8) +cupsd(8) program. This file is not intended to be edited or managed manually.

                      Notes

                      The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.

                      See Also

                      -classes.conf(5), -cups-files.conf(5), -cupsd(8), -cupsd.conf(5), -mime.convs(5), -mime.types(5), -subscriptions.conf(5), +classes.conf(5), +cups-files.conf(5), +cupsd(8), +cupsd.conf(5), +mime.convs(5), +mime.types(5), +subscriptions.conf(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/man-subscriptions.conf.html cups-2.4.1op1/doc/help/man-subscriptions.conf.html --- cups-2.3.3op2/doc/help/man-subscriptions.conf.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/man-subscriptions.conf.html 2022-01-27 11:11:42.000000000 +0000 @@ -12,22 +12,22 @@

                      Description

                      The subscriptions.conf file defines the local event notification subscriptions that are active. It is normally located in the /etc/cups directory and is maintained by the -cupsd(8) +cupsd(8) program. This file is not intended to be edited or managed manually.

                      Notes

                      The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.

                      See Also

                      -classes.conf(5), -cups-files.conf(5), -cupsd(8), -cupsd.conf(5), -mime.convs(5), -mime.types(5), -printers.conf(5), +classes.conf(5), +cups-files.conf(5), +cupsd(8), +cupsd.conf(5), +mime.convs(5), +mime.types(5), +printers.conf(5), CUPS Online Help (http://localhost:631/help)

                      Copyright

                      -Copyright © 2007-2019 by Apple Inc. +Copyright © 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/doc/help/postscript-driver.html cups-2.4.1op1/doc/help/postscript-driver.html --- cups-2.3.3op2/doc/help/postscript-driver.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/postscript-driver.html 2022-01-27 11:11:42.000000000 +0000 @@ -1,386 +1,105 @@ - + - - Developing PostScript Printer Drivers - - - - - - - - - + + +
                      - - Introduction to the PPD Compiler - - - - - - - - - + + +
                      - - Developing Raster Printer Drivers - - - - - - - - - + + +
                      - - CUPS Design Description - - - + + CUPS Design Description + + + -

                      CUPS Design Description

                      +

                      CUPS Design Description

                      -

                      This design description documents the overall organization of CUPS. The purpose is not to provide a line-by-line description of the CUPS source code, but rather to describe the overall architecture and location of key pieces so that developers can more easily understand the underlying operation of CUPS.

                      +

                      This design description documents the overall organization of CUPS. The purpose is not to provide a line-by-line description of the CUPS source code, but rather to describe the overall architecture and location of key pieces so that developers can more easily understand the underlying operation of CUPS.

                      -

                      Introduction

                      +

                      Introduction

                      -

                      Like most printing systems, CUPS is designed around a central print scheduling process that dispatches print jobs, processes administrative commands, provides printer status information to local and remote programs, and informs users as needed. Figure 1 shows the basic organization of CUPS.

                      +

                      Like most printing systems, CUPS is designed around a central print scheduling process that dispatches print jobs, processes administrative commands, provides printer status information to local and remote programs, and informs users as needed. Figure 1 shows the basic organization of CUPS.

                      -

                      Scheduler

                      +

                      Scheduler

                      -

                      The scheduler is a HTTP/1.1 and IPP/2.1 server application that manages HTTP and IPP requests, printers, classes, jobs, subscriptions, and notifications on the system. HTTP is used for normal web browser services as well as IPP operation messages passed via HTTP POST requests with the application/ipp content type. The scheduler uses a series of helper applications based on the Common Gateway Interface ("CGI") to provide dynamic web interfaces and can be configured to run additional site-specific programs or scripts for the web interface.

                      +

                      The scheduler is a HTTP/1.1 and IPP/2.1 server application that manages HTTP and IPP requests, printers, classes, jobs, subscriptions, and notifications on the system. HTTP is used for normal web browser services as well as IPP operation messages passed via HTTP POST requests with the application/ipp content type. The scheduler uses a series of helper applications based on the Common Gateway Interface ("CGI") to provide dynamic web interfaces and can be configured to run additional site-specific programs or scripts for the web interface.

                      -

                      The scheduler is designed as a traditional single-threaded server process which runs external processes to do longer-term operations such as printing, notification, device/driver enumeration, and remote printer monitoring. External processes are normally run as a non-privileged account ("lp") and, on some platforms, with additional restrictions that limit what the processes are allowed to do.

                      +

                      The scheduler is designed as a traditional single-threaded server process which runs external processes to do longer-term operations such as printing, notification, device/driver enumeration, and remote printer monitoring. External processes are normally run as a non-privileged account ("lp") and, on some platforms, with additional restrictions that limit what the processes are allowed to do.

                      -

                      The maximum number of simultaneous clients and print jobs that can be supported is primarily limited by the available server memory, file descriptors, and CPU - the scheduler itself imposes no hard limits.

                      +

                      The maximum number of simultaneous clients and print jobs that can be supported is primarily limited by the available server memory, file descriptors, and CPU - the scheduler itself imposes no hard limits.

                      -
                      - - -
                      Figure 1: CUPS Block Diagram
                      CUPS Block Diagram
                      +
                      + + +
                      Figure 1: CUPS Block Diagram
                      CUPS Block Diagram
                      -

                      Config Files

                      +

                      Config Files

                      -

                      The scheduler uses several configuration files to store the server settings (cupsd.conf), available classes (classes.conf), available printers (printers.conf), current notification subscriptions (subscriptions.conf), and supported file types and filters (mime.types, mime.convs). In addition, PostScript Printer Description ("PPD") files 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.

                      +

                      The scheduler uses several configuration files to store the server settings (cupsd.conf), available classes (classes.conf), available printers (printers.conf), current notification subscriptions (subscriptions.conf), and supported file types and filters (mime.types, mime.convs). In addition, PostScript Printer Description ("PPD") files 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.

                      -

                      Job Files

                      +

                      Job Files

                      -

                      The scheduler stores job files in a spool directory, typically /var/spool/cups. Two types of files will be found in the spool directory: control files starting with the letter "c" ("c00001", "c99999", "c100000", etc.) and data files starting with the letter "d" ("d00001-001", "d99999-001", "d100000-001", etc.) Control files are IPP messages based on the original IPP Print-Job or Create-Job messages, while data files are the original print files that were submitted for printing. There is one control file for every job known to the system and 0 or more data files for each job. +

                      The scheduler stores job files in a spool directory, typically /var/spool/cups. Two types of files will be found in the spool directory: control files starting with the letter "c" ("c00001", "c99999", "c100000", etc.) and data files starting with the letter "d" ("d00001-001", "d99999-001", "d100000-001", etc.) Control files are IPP messages based on the original IPP Print-Job or Create-Job messages, while data files are the original print files that were submitted for printing. There is one control file for every job known to the system and 0 or more data files for each job. -

                      Control files are normally cleaned out after the 500th job is submitted, while data files are removed immediately after a job has successfully printed. Both behaviors can be configured.

                      +

                      Control files are normally cleaned out after the 500th job is submitted, while data files are removed immediately after a job has successfully printed. Both behaviors can be configured.

                      -

                      Log Files

                      +

                      Log Files

                      -

                      The scheduler keeps three kinds of log files which are normally stored in the /var/log/cups directory. The access_log file lists every HTTP and IPP request that is processed by the scheduler. The error_log file contains messages from the scheduler and its helper applications that can be used -to track down problems. The page_log file lists every page that is printed, allowing for simple print accounting.

                      +

                      The scheduler keeps three kinds of log files which are normally stored in the /var/log/cups directory. The access_log file lists every HTTP and IPP request that is processed by the scheduler. The error_log file contains messages from the scheduler and its helper applications that can be used +to track down problems. The page_log file lists every page that is printed, allowing for simple print accounting.

                      -

                      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 logrotated(8) program to rotate them instead.

                      +

                      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 logrotated(8) program to rotate them instead.

                      -

                      Berkeley Commands

                      +

                      Berkeley Commands

                      -

                      CUPS provides the Berkeley lpc(8), lpq(1), lpr(1), and lprm(1) commands. In general, they function identically to the original Berkeley commands with the following exceptions:

                      +

                      CUPS provides the Berkeley lpc(8), lpq(1), lpr(1), and lprm(1) commands. In general, they function identically to the original Berkeley commands with the following exceptions:

                      -
                        +
                          +
                        1. The lpc command currently only supports the "status" sub-command.
                        2. +
                        3. The lpr command does not support the format modifier options "1" (TROFF font set 1), "2" (TROFF font set 2), "3" (TROFF font set 3), "4" (TROFF font set 4), "c" (CIFPLOT), "d" (DVI), "f" (FORTRAN), "g" (GNU plot), "i" (indentation), "n" (Ditroff), "r" (Sun raster), "t" (Troff), or "w" (width), as they do not map to the IPP MIME media type based document formats.
                        4. +
                        -
                      1. The lpc command currently only supports the "status" sub-command.
                      2. +

                        System V Commands

                        -
                      3. The lpr command does not support the format modifier options "1" (TROFF font set 1), "2" (TROFF font set 2), "3" (TROFF font set 3), "4" (TROFF font set 4), "c" (CIFPLOT), "d" (DVI), "f" (FORTRAN), "g" (GNU plot), "i" (indentation), "n" (Ditroff), "r" (Sun raster), "t" (Troff), or "w" (width), as they do not map to the IPP MIME media type based document formats.
                      4. +

                        CUPS provides the System V cancel(1), lp(1), lpadmin(8), lpmove(8), and lpstat(1) commands. In general, they function identically to the original System V commands with the following exceptions:

                        -
                      +
                        +
                      1. All commands may ask for a password; the System V print spooler requires root access to perform administration tasks, while CUPS allows for more flexible configurations.
                      2. +
                      3. The lpadmin command does not implement the Solaris "-A" (alert), "-F" (fault recovery), "-M" (mount form/wheel), "-P" (paper list), "-S" (print wheels), "-T" (type list), "-U" (dialer info), "-W" (wait), "-f" (form name), "-l" (content-type list), "-s" (remote printer), or "-t" (number of trays) options.
                      4. +
                      -

                      System V Commands

                      +

                      CUPS Commands

                      -

                      CUPS provides the System V cancel(1), lp(1), lpadmin(8), lpmove(8), and lpstat(1) commands. In general, they function identically to the original System V commands with the following exceptions:

                      +

                      CUPS provides the cupsaccept(8), cupsdisable(8), cupsenable(8), cupsreject(8), cupstestppd(1), and lpinfo(8) commands. The cupsaccept, cupsdisable, cupsenable, and cupsreject commands correspond to the System V accept, disable, enable, and reject commands but have been renamed to avoid confusion and conflicts with the bash(1) internal enable command of the same name.

                      -
                        +

                        LPD Support

                        -
                      1. All commands may ask for a password; the System V print spooler requires root access to perform administration tasks, while CUPS allows for more flexible configurations.
                      2. +

                        LPD client support is provided via the cups-lpd(8) program. Incoming LPD requests are accepted on TCP port 515 by the local inetd(8), launchd(8), or xinetd(8) process and forwarded to the cups-lpd program for conversion to the corresponding IPP request(s).

                        -
                      3. The lpadmin command does not implement the Solaris "-A" (alert), "-F" (fault recovery), "-M" (mount form/wheel), "-P" (paper list), "-S" (print wheels), "-T" (type list), "-U" (dialer info), "-W" (wait), "-f" (form name), "-l" (content-type list), "-s" (remote printer), or "-t" (number of trays) options.
                      4. +

                        The cups-lpd program conforms, for the most part, to RFC 1179: Line Printer Daemon Protocol, but does not enforce the privileged source port restriction specified in that document. In addition, the banner page and output format options are usually overridden via command-line options to the cups-lpd program when it is invoked by the corresponding super-daemon program.

                        -
                      +

                      Web Interface

                      -

                      CUPS Commands

                      +

                      The web interface is supported by five CGI programs. Table 1 describes the purpose of each of the programs.

                      -

                      CUPS provides the cupsaccept(8), cupsaddsmb(8), cupsdisable(8), cupsenable(8), cupsreject(8), cupstestppd(1), lpinfo(8), and lppasswd(1) commands. The cupsaccept, cupsdisable, cupsenable, and cupsreject commands correspond to the System V accept, disable, enable, and reject commands but have been renamed to avoid confusion and conflicts with the bash(1) internal enable command of the same name.

                      +
                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      Table 1: CGI Programs
                      ProgramLocationDescription
                      admin.cgi/adminProvides all of the administrative functions
                      classes.cgi/classesLists classes and provides class management functions
                      help.cgi/helpProvides access to online help documents
                      jobs.cgi/jobsLists jobs and provides job management functions
                      printers.cgi/printersLists printers and provides printer management functions
                      -

                      LPD Support

                      +

                      Notifiers

                      -

                      LPD client support is provided via the cups-lpd(8) program. Incoming LPD requests are accepted on TCP port 515 by the local inetd(8), launchd(8), or xinetd(8) process and forwarded to the cups-lpd program for conversion to the corresponding IPP request(s).

                      +

                      Notifiers (notifier(7)) provide the means for sending asynchronous event notifications from the scheduler. Notifiers are executed with the recipient information on the command-line and the event data on the standard input. For example:

                      -

                      The cups-lpd program conforms, for the most part, to RFC 1179: Line Printer Daemon Protocol, but does not enforce the privileged source port restriction specified in that document. In addition, the banner page and output format options are usually overridden via command-line options to the cups-lpd program when it is invoked by the corresponding super-daemon program.

                      - -

                      Web Interface

                      - -

                      The web interface is supported by five CGI programs. Table 1 describes the purpose of each of the programs.

                      - -
                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      Table 1: CGI Programs
                      ProgramLocationDescription
                      admin.cgi/adminProvides all of the administrative functions
                      classes.cgi/classesLists classes and provides class management functions
                      help.cgi/helpProvides access to online help documents
                      jobs.cgi/jobsLists jobs and provides job management functions
                      printers.cgi/printersLists printers and provides printer management functions
                      - -

                      Notifiers

                      - -

                      Notifiers (notifier(7)) provide the means for sending asynchronous event notifications from the scheduler. Notifiers are executed with the recipient information on the command-line and the event data on the standard input. For example:

                      - -
                      +
                       CUPS_SERVERBIN/notifier/foo recipient user-data
                      -
                      - -

                      CUPS includes two notifiers: mailto to provide SMTP-based email notifications and rss to provide Really Simple Syndication ("RSS") notifications from the scheduler. Additional notifiers can be installed in the notifier directory as needed to support other methods.

                      - -

                      Filters

                      - -

                      Filters (filter(7)) convert job files into a printable format. Multiple filters are run, as needed, to convert from the job file format to the printable format. A filter program reads from the standard input or from a file if a filename is supplied. All filters must support a common set of options including printer name, job ID, username, job title, number of copies, and job options. All output is sent to the standard output.

                      - -

                      CUPS provides filters for printing text, PostScript, PDF, HP-GL/2, and many types of image files. CUPS also provides printer driver filters for HP-PCL, ESC/P, and several types of label printers. Additional filters can be registered with CUPS via mime.convs and PPD files.

                      - -

                      Port Monitors

                      - -

                      Port monitors handle the device- and channel-specific data formatting for a printer. Port monitors use the same interface as filters.

                      - -

                      CUPS includes two port monitors: the bcp port monitor which supports the PostScript Binary Communications Protocol ("BCP") and the tbcp port monitor which supports the PostScript Tagged Binary Communications Protocol ("TBCP"). Additional port monitors can be registered in PPD files.

                      - -

                      Backends

                      - -

                      Backends (backend(7)) send print data to the printer and enumerate available printers/devices as needed. Backends use the same interface as filters.

                      - -

                      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.

                      - - -

                      Programming Interfaces

                      - -

                      CUPS makes use of several general-purpose libraries to provide its printing services. Unlike the rest of CUPS, the libraries are provided under the terms of the GNU LGPL so they may be used by non-GPL applications.

                      +
                      -

                      CUPS Library (libcups)

                      +

                      CUPS includes two notifiers: mailto to provide SMTP-based email notifications and rss to provide Really Simple Syndication ("RSS") notifications from the scheduler. Additional notifiers can be installed in the notifier directory as needed to support other methods.

                      -

                      The CUPS library contains all of the core HTTP and IPP communications code as well as convenience functions for queuing print jobs, getting printer information, accessing resources via HTTP and IPP, and manipulating PPD files. The scheduler and all commands, filters, and backends use this library.

                      +

                      Filters

                      -

                      CUPS CGI Library (libcupscgi)

                      +

                      Filters (filter(7)) convert job files into a printable format. Multiple filters are run, as needed, to convert from the job file format to the printable format. A filter program reads from the standard input or from a file if a filename is supplied. All filters must support a common set of options including printer name, job ID, username, job title, number of copies, and job options. All output is sent to the standard output.

                      -

                      The CUPS CGI library provides all of the web interface support functions. It is used by the CGI programs to provide the CUPS web interface.

                      +

                      CUPS provides filters for printing text, PostScript, PDF, HP-GL/2, and many types of image files. CUPS also provides printer driver filters for HP-PCL, ESC/P, and several types of label printers. Additional filters can be registered with CUPS via mime.convs and PPD files.

                      -

                      CUPS Driver Library (libcupsdriver)

                      +

                      Port Monitors

                      -

                      The CUPS driver library provides access to the dithering, color conversion, and helper functions used by the CUPS sample printer drivers.

                      +

                      Port monitors handle the device- and channel-specific data formatting for a printer. Port monitors use the same interface as filters.

                      -

                      CUPS Imaging Library (libcupsimage)

                      +

                      CUPS includes two port monitors: the bcp port monitor which supports the PostScript Binary Communications Protocol ("BCP") and the tbcp port monitor which supports the PostScript Tagged Binary Communications Protocol ("TBCP"). Additional port monitors can be registered in PPD files.

                      -

                      The CUPS imaging library provides functions for managing large images, doing colorspace conversion and color management, scaling images for printing, and managing raster page streams. It is used by the CUPS image file filters, the PostScript RIP, and all raster printers drivers.

                      +

                      Backends

                      -

                      CUPS MIME Library (libcupsmime)

                      +

                      Backends (backend(7)) send print data to the printer and enumerate available printers/devices as needed. Backends use the same interface as filters.

                      -

                      The CUPS MIME library provides file typing and conversion functions and is used by the scheduler and cupsfilter(8) command to auto-type and convert print files to a printable format.

                      +

                      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.

                      -

                      CUPS PPD Compiler Library (libcupsppdc)

                      -

                      The CUPS PPD compiler library provides access to driver information files and is used by the PPD compiler tools as well as the cups-driverd(8) helper program to generate PPD files and message catalogs for localization.

                      +

                      Programming Interfaces

                      +

                      The CUPS library (libcups) contains all of the core HTTP and IPP communications code as well as convenience functions for queuing print jobs, getting printer information, accessing resources via HTTP and IPP, manipulating PPD files, and reading and writing raster streams. The scheduler and all commands, filters, and backends use this library.

                      - - + + diff -Nru cups-2.3.3op2/doc/help/spec-ipp.html cups-2.4.1op1/doc/help/spec-ipp.html --- cups-2.3.3op2/doc/help/spec-ipp.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/spec-ipp.html 2022-01-27 11:11:42.000000000 +0000 @@ -1292,7 +1292,7 @@
                      "document-number" (integer(1:MAX)): -
                      The client MUST supply a document number to retrieve. The document-count attribute for the job defines the maximum document number that can be specified. In the case of jobs with banners (job-sheets is not "none"), document number 1 will typically contain the start banner and document number N will typically contain the end banner. +
                      The client MUST supply a document number to retrieve. The number-of-documents attribute for the job defines the maximum document number that can be specified. In the case of jobs with banners (job-sheets is not "none"), document number 1 will typically contain the start banner and document number N will typically contain the end banner. diff -Nru cups-2.3.3op2/doc/help/spec-ppd.html cups-2.4.1op1/doc/help/spec-ppd.html --- cups-2.3.3op2/doc/help/spec-ppd.html 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/help/spec-ppd.html 2022-01-27 11:11:42.000000000 +0000 @@ -1,386 +1,105 @@ - + - - CUPS PPD Extensions - - - - - - - - - + + +
                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - CUPS Icon - - - Michael Sweet - - - - - Apple Inc. - - - - - - - - - - - - - - - - - - - + + + + + + + + New Image + Michael Sweet + Copyright 2020 Michael Sweet + + image/svg+xml + en + + + + + Background + + + + + Logo + + + + + + Printer + + + + + + + + + + + Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/images/generic.png and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/images/generic.png differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/images/left.gif and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/images/left.gif differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/images/left.xcf.gz and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/images/left.xcf.gz differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/images/right.gif and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/images/right.gif differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/images/sel.gif and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/images/sel.gif differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/images/unsel.gif and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/images/unsel.gif differ Binary files /tmp/tmpkjb46acw/cX9fjXGOhZ/cups-2.3.3op2/doc/images/webinterface.png and /tmp/tmpkjb46acw/RrSacsEoZH/cups-2.4.1op1/doc/images/webinterface.png differ diff -Nru cups-2.3.3op2/doc/index.html.in cups-2.4.1op1/doc/index.html.in --- cups-2.3.3op2/doc/index.html.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/index.html.in 2022-01-27 11:11:42.000000000 +0000 @@ -7,12 +7,12 @@ - Home - CUPS @CUPS_VERSION@@CUPS_REVISION@ + Home - CUPS @CUPS_VERSION@
                      -

                      CUPS @CUPS_VERSION@

                      -

                      CUPS is the standards-based, open source printing system developed by Apple Inc. for macOS® and other UNIX®-like operating systems.

                      +

                      OpenPrinting CUPS @CUPS_VERSION@

                      +

                      The standards-based, open source printing system developed by OpenPrinting for Linux® and other Unix®-like operating systems. CUPS uses IPP Everywhere™ to support printing to local and network printers.

                      CUPS for Administrators

                      @@ -45,10 +44,9 @@

                      CUPS for Developers

                      CUPS Programming Manual

                      Filter and Backend Programming

                      -

                      Developer Forum

                      - + diff -Nru cups-2.3.3op2/doc/ja/index.html.in cups-2.4.1op1/doc/ja/index.html.in --- cups-2.3.3op2/doc/ja/index.html.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/ja/index.html.in 2022-01-27 11:11:42.000000000 +0000 @@ -7,12 +7,12 @@ - ホーム - CUPS @CUPS_VERSION@@CUPS_REVISION@ + ホーム - CUPS @CUPS_VERSION@
                      - + diff -Nru cups-2.3.3op2/doc/pt_BR/index.html.in cups-2.4.1op1/doc/pt_BR/index.html.in --- cups-2.3.3op2/doc/pt_BR/index.html.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/pt_BR/index.html.in 2022-01-27 11:11:42.000000000 +0000 @@ -7,12 +7,12 @@ - Início - CUPS @CUPS_VERSION@@CUPS_REVISION@ + Início - CUPS @CUPS_VERSION@
                        -
                      • CUPS.org
                      • +
                      • OpenPrinting CUPS
                      • Início
                      • Administração
                      • Classes
                      • @@ -24,14 +24,13 @@

                        CUPS @CUPS_VERSION@

                        -

                        CUPS é o sistema de impressão baseado em padrões e de código aberto desenvolvido pela Apple Inc. para macOS® e outros sistemas operacionais similares ao UNIX®.

                        +

                        CUPS é o sistema de impressão baseado em padrões e de código aberto desenvolvido pela OpenPrinting para Linux® e outros sistemas operacionais similares ao UNIX®. CUPS uses IPP Everywhere™ to support printing to local and network printers.

                        - + diff -Nru cups-2.3.3op2/doc/ru/index.html.in cups-2.4.1op1/doc/ru/index.html.in --- cups-2.3.3op2/doc/ru/index.html.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/doc/ru/index.html.in 2022-01-27 11:11:42.000000000 +0000 @@ -7,12 +7,12 @@ - Home - CUPS @CUPS_VERSION@@CUPS_REVISION@ + Home - CUPS @CUPS_VERSION@
                        -

                        CUPS @CUPS_VERSION@

                        -

                        CUPS — поддерживающая большинство стандартов, свободная подсистема печати, разрабатываемая компанией Apple Inc. для операционной системы macOS® и других UNIX®-подобных операционных систем.

                        +

                        OpenPrinting CUPS @CUPS_VERSION@

                        +

                        CUPS — поддерживающая большинство стандартов, свободная подсистема печати, разрабатываемая компанией OpenPrinting для операционной системы Linux® и других UNIX®-подобных операционных систем. CUPS uses IPP Everywhere™ to support printing to local and network printers

                        CUPS для администраторов

                        @@ -45,10 +44,9 @@

                        CUPS для разработчиков

                        CUPS Programming Manual

                        Разработка фильтров и модулей

                        -

                        Форум разработчиков

                        - + diff -Nru cups-2.3.3op2/doc/test.cgi cups-2.4.1op1/doc/test.cgi --- cups-2.3.3op2/doc/test.cgi 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/doc/test.cgi 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,7 @@ +#!/bin/sh +echo "Content-Type: text/plain" +echo "" +echo "POSIX shell CGI test page." +echo "" +echo "ps ax" +ps ax diff -Nru cups-2.3.3op2/doc/test.php cups-2.4.1op1/doc/test.php --- cups-2.3.3op2/doc/test.php 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/doc/test.php 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,20 @@ +#!/usr/bin/php -nf +\n" + ."\n" + ." \n" + ." PHP script CGI test page\n" + ." \n" + ." \n" + ."

                        PHP script CGI test page

                        \n" + ."
                        ps ax\n");
                        +$fp = popen("ps ax", "r");
                        +while ($line = fgets($fp, 1024))
                        +{
                        +  print(htmlspecialchars($line));
                        +}
                        +print("
                        \n" + ." \n" + ."\n"); +?> diff -Nru cups-2.3.3op2/examples/Makefile cups-2.4.1op1/examples/Makefile --- cups-2.3.3op2/examples/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/examples/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ # # Example files makefile for CUPS. # +# Copyright © 2021-2022 by OpenPrinting. # Copyright © 2007-2019 by Apple Inc. # Copyright © 2002-2005 by Easy Software Products. # @@ -87,6 +88,7 @@ ipp-2.2.test \ ipp-backend.test \ ipp-everywhere.test \ + print-job.test \ print-job-and-wait.test \ print-job-deflate.test \ print-job-gzip.test \ @@ -94,8 +96,8 @@ print-job-letter.test \ print-job-manual.test \ print-job-media-col.test \ + print-job-media-needed.test \ print-job-password.test \ - print-job.test \ print-uri.test \ set-attrs-hold.test \ validate-job.test diff -Nru cups-2.3.3op2/examples/print-job-media-needed.test cups-2.4.1op1/examples/print-job-media-needed.test --- cups-2.3.3op2/examples/print-job-media-needed.test 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/examples/print-job-media-needed.test 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,49 @@ +# Print a test page, expecting the printer to run out of media +{ + PAUSE "Remove Paper" + + NAME "Print file expecting media-empty" + 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 + ATTR mimeMediaType document-format $filetype + FILE $filename + STATUS successful-ok + + MONITOR-PRINTER-STATE $uri { + EXPECT printer-state-reasons WITH-VALUE "/^media-needed/" DEFINE-MATCH HAVE_MEDIA_NEEDED + } +} + +{ + PASS-IF-DEFINED HAVE_MEDIA_NEEDED + + NAME "Wait for media-empty" + OPERATION Get-Printer-Attributes + 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 requested-attributes printer-state-reasons + STATUS successful-ok + EXPECT printer-state-reasons WITH-VALUE "/^media-needed/" REPEAT-NO-MATCH +} + +{ + PAUSE "Load Paper" + + NAME "Wait for no media-empty" + OPERATION Get-Printer-Attributes + 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 requested-attributes printer-state-reasons + STATUS successful-ok + EXPECT printer-state-reasons WITH-VALUE "/^media-needed/" REPEAT-MATCH +} diff -Nru cups-2.3.3op2/filter/Makefile cups-2.4.1op1/filter/Makefile --- cups-2.3.3op2/filter/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/filter/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -128,25 +128,21 @@ echo Generating CUPS API help files... codedoc --section "Programming" \ --title "Developing PostScript Printer Drivers" \ - --css ../doc/cups-printable.css \ --header postscript-driver.header \ --body postscript-driver.shtml \ >../doc/help/postscript-driver.html codedoc --section "Programming" \ --title "Introduction to the PPD Compiler" \ - --css ../doc/cups-printable.css \ --header ppd-compiler.header \ --body ppd-compiler.shtml \ >../doc/help/ppd-compiler.html codedoc --section "Programming" \ --title "Developing Raster Printer Drivers" \ - --css ../doc/cups-printable.css \ --header raster-driver.header \ --body raster-driver.shtml \ >../doc/help/raster-driver.html codedoc --section "Specifications" \ --title "CUPS PPD Extensions" \ - --css ../doc/cups-printable.css \ --header spec-ppd.header \ --body spec-ppd.shtml \ >../doc/help/spec-ppd.html diff -Nru cups-2.3.3op2/filter/common.c cups-2.4.1op1/filter/common.c --- cups-2.3.3op2/filter/common.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/filter/common.c 2022-01-27 11:11:42.000000000 +0000 @@ -301,7 +301,7 @@ if ((classification = getenv("CLASSIFICATION")) == NULL) classification = ""; - if (strcmp(classification, "none") == 0) + else if (strcmp(classification, "none") == 0) classification = ""; /* diff -Nru cups-2.3.3op2/filter/gziptoany.c cups-2.4.1op1/filter/gziptoany.c --- cups-2.3.3op2/filter/gziptoany.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/filter/gziptoany.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * GZIP/raw pre-filter for CUPS. * - * Copyright 2007-2015 by Apple Inc. - * Copyright 1993-2007 by Easy Software Products. + * Copyright © 2021 by OpenPrinting. + * Copyright © 2007-2015 by Apple Inc. + * Copyright © 1993-2007 by Easy Software Products. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -46,9 +48,14 @@ */ if (!getenv("FINAL_CONTENT_TYPE")) - copies = atoi(argv[4]); + { + if ((copies = atoi(argv[4])) < 1) + copies = 1; + } else + { copies = 1; + } /* * Open the file... diff -Nru cups-2.3.3op2/filter/rastertohp.c cups-2.4.1op1/filter/rastertohp.c --- cups-2.3.3op2/filter/rastertohp.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/filter/rastertohp.c 2022-01-27 11:11:42.000000000 +0000 @@ -813,8 +813,7 @@ Shutdown(); - if (ppd) - ppdClose(ppd); + ppdClose(ppd); /* * Close the raster stream... diff -Nru cups-2.3.3op2/filter/spec-ppd.shtml cups-2.4.1op1/filter/spec-ppd.shtml --- cups-2.3.3op2/filter/spec-ppd.shtml 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/filter/spec-ppd.shtml 2022-01-27 11:11:42.000000000 +0000 @@ -1403,7 +1403,7 @@
                         *% Tell the RIP filters to generate the copies for us
                        -*cupsManualCopies: true
                        +*cupsManualCopies: True
                         
                        diff -Nru cups-2.3.3op2/locale/Makefile cups-2.4.1op1/locale/Makefile --- cups-2.3.3op2/locale/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ # # Locale file makefile for CUPS. # +# Copyright © 2021-2022 by OpenPrinting. # Copyright © 2007-2019 by Apple Inc. # Copyright © 1993-2007 by Easy Software Products. # @@ -127,9 +128,9 @@ touch cups.pot cd ..; xgettext -o locale/cups.pot -cTRANSLATORS -s \ --keyword=_ --no-wrap --from-code utf-8 \ - --copyright-holder="Apple Inc." \ + --copyright-holder="OpenPrinting" \ --package-name="CUPS" --package-version="$(CUPS_VERSION)" \ - --msgid-bugs-address="https://github.com/apple/cups/issues" \ + --msgid-bugs-address="https://github.com/openprinting/cups/issues" \ */*.c */*.cxx (cat cups.header; tail +6 cups.pot) > cups.pot.N mv cups.pot.N cups.pot diff -Nru cups-2.3.3op2/locale/checkpo.c cups-2.4.1op1/locale/checkpo.c --- cups-2.3.3op2/locale/checkpo.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/checkpo.c 2022-01-27 11:11:42.000000000 +0000 @@ -2,8 +2,9 @@ * Verify that translations in the .po file have the same number and type of * printf-style format strings. * - * Copyright 2007-2017 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2017 by Apple Inc. + * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. * @@ -321,7 +322,7 @@ if (bufsize < 4) break; - snprintf(bufptr, bufsize, "\\%03o", *s); + snprintf(bufptr, (size_t)bufsize, "\\%03o", *s); bufptr += 4; bufsize -= 4; } diff -Nru cups-2.3.3op2/locale/cups.header cups-2.4.1op1/locale/cups.header --- cups-2.3.3op2/locale/cups.header 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups.header 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ # # Message catalog template for CUPS. # +# Copyright © 2021 by OpenPrinting. # Copyright © 2007-2019 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # diff -Nru cups-2.3.3op2/locale/cups.pot cups-2.4.1op1/locale/cups.pot --- cups-2.3.3op2/locale/cups.pot 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups.pot 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ # # Message catalog template for CUPS. # +# Copyright © 2021 by OpenPrinting. # Copyright © 2007-2019 by Apple Inc. # Copyright © 2005-2007 by Easy Software Products. # @@ -23,9 +24,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: CUPS 2.3.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Project-Id-Version: CUPS 2.4rc1\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -34,12 +35,12 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: systemv/lpstat.c:1871 systemv/lpstat.c:1990 +#: systemv/lpstat.c:1872 systemv/lpstat.c:1991 msgid "\t\t(all)" msgstr "" -#: systemv/lpstat.c:1874 systemv/lpstat.c:1877 systemv/lpstat.c:1993 -#: systemv/lpstat.c:1996 +#: systemv/lpstat.c:1875 systemv/lpstat.c:1878 systemv/lpstat.c:1994 +#: systemv/lpstat.c:1997 msgid "\t\t(none)" msgstr "" @@ -48,99 +49,99 @@ msgid "\t%d entries" msgstr "" -#: systemv/lpstat.c:812 systemv/lpstat.c:828 +#: systemv/lpstat.c:813 systemv/lpstat.c:829 #, c-format msgid "\t%s" msgstr "" -#: systemv/lpstat.c:1852 systemv/lpstat.c:1971 +#: systemv/lpstat.c:1853 systemv/lpstat.c:1972 msgid "\tAfter fault: continue" msgstr "" -#: systemv/lpstat.c:1488 systemv/lpstat.c:1825 systemv/lpstat.c:1945 +#: systemv/lpstat.c:1489 systemv/lpstat.c:1826 systemv/lpstat.c:1946 #, c-format msgid "\tAlerts: %s" msgstr "" -#: systemv/lpstat.c:1875 systemv/lpstat.c:1994 +#: systemv/lpstat.c:1876 systemv/lpstat.c:1995 msgid "\tBanner required" msgstr "" -#: systemv/lpstat.c:1876 systemv/lpstat.c:1995 +#: systemv/lpstat.c:1877 systemv/lpstat.c:1996 msgid "\tCharset sets:" msgstr "" -#: systemv/lpstat.c:1844 systemv/lpstat.c:1963 +#: systemv/lpstat.c:1845 systemv/lpstat.c:1964 msgid "\tConnection: direct" msgstr "" -#: systemv/lpstat.c:1835 systemv/lpstat.c:1955 +#: systemv/lpstat.c:1836 systemv/lpstat.c:1956 msgid "\tConnection: remote" msgstr "" -#: systemv/lpstat.c:1801 systemv/lpstat.c:1921 +#: systemv/lpstat.c:1802 systemv/lpstat.c:1922 msgid "\tContent types: any" msgstr "" -#: systemv/lpstat.c:1879 systemv/lpstat.c:1998 +#: systemv/lpstat.c:1880 systemv/lpstat.c:1999 msgid "\tDefault page size:" msgstr "" -#: systemv/lpstat.c:1878 systemv/lpstat.c:1997 +#: systemv/lpstat.c:1879 systemv/lpstat.c:1998 msgid "\tDefault pitch:" msgstr "" -#: systemv/lpstat.c:1880 systemv/lpstat.c:1999 +#: systemv/lpstat.c:1881 systemv/lpstat.c:2000 msgid "\tDefault port settings:" msgstr "" -#: systemv/lpstat.c:1807 systemv/lpstat.c:1927 +#: systemv/lpstat.c:1808 systemv/lpstat.c:1928 #, c-format msgid "\tDescription: %s" msgstr "" -#: systemv/lpstat.c:1800 systemv/lpstat.c:1920 +#: systemv/lpstat.c:1801 systemv/lpstat.c:1921 msgid "\tForm mounted:" msgstr "" -#: systemv/lpstat.c:1873 systemv/lpstat.c:1992 +#: systemv/lpstat.c:1874 systemv/lpstat.c:1993 msgid "\tForms allowed:" msgstr "" -#: systemv/lpstat.c:1839 systemv/lpstat.c:1959 +#: systemv/lpstat.c:1840 systemv/lpstat.c:1960 #, c-format msgid "\tInterface: %s.ppd" msgstr "" -#: systemv/lpstat.c:1848 systemv/lpstat.c:1967 +#: systemv/lpstat.c:1849 systemv/lpstat.c:1968 #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "" -#: systemv/lpstat.c:1830 systemv/lpstat.c:1950 +#: systemv/lpstat.c:1831 systemv/lpstat.c:1951 #, c-format msgid "\tLocation: %s" msgstr "" -#: systemv/lpstat.c:1851 systemv/lpstat.c:1970 +#: systemv/lpstat.c:1852 systemv/lpstat.c:1971 msgid "\tOn fault: no alert" msgstr "" -#: systemv/lpstat.c:1802 systemv/lpstat.c:1922 +#: systemv/lpstat.c:1803 systemv/lpstat.c:1923 msgid "\tPrinter types: unknown" msgstr "" -#: systemv/lpstat.c:1471 +#: systemv/lpstat.c:1472 #, c-format msgid "\tStatus: %s" msgstr "" -#: systemv/lpstat.c:1856 systemv/lpstat.c:1870 systemv/lpstat.c:1975 -#: systemv/lpstat.c:1989 +#: systemv/lpstat.c:1857 systemv/lpstat.c:1871 systemv/lpstat.c:1976 +#: systemv/lpstat.c:1990 msgid "\tUsers allowed:" msgstr "" -#: systemv/lpstat.c:1863 systemv/lpstat.c:1982 +#: systemv/lpstat.c:1864 systemv/lpstat.c:1983 msgid "\tUsers denied:" msgstr "" @@ -165,7 +166,7 @@ msgid "\tprinting is enabled" msgstr "" -#: systemv/lpstat.c:1491 +#: systemv/lpstat.c:1492 #, c-format msgid "\tqueued for %s" msgstr "" @@ -178,7 +179,7 @@ msgid "\tqueuing is enabled" msgstr "" -#: systemv/lpstat.c:1793 systemv/lpstat.c:1913 +#: systemv/lpstat.c:1794 systemv/lpstat.c:1914 msgid "\treason unknown" msgstr "" @@ -232,7 +233,7 @@ msgid " REF: Pages 52-54, section 5.2." msgstr "" -#: berkeley/lpq.c:533 +#: berkeley/lpq.c:534 #, c-format msgid " %-39.39s %.0f bytes" msgstr "" @@ -864,11 +865,11 @@ msgid " --lf End lines with LF (UNIX/Linux/macOS)." msgstr "" -#: scheduler/cupsfilter.c:1477 +#: scheduler/cupsfilter.c:1564 msgid " --list-filters List filters that will be used." msgstr "" -#: scheduler/cupsfilter.c:1478 +#: scheduler/cupsfilter.c:1565 msgid " -D Remove the input file when finished." msgstr "" @@ -880,11 +881,11 @@ msgid " -I include-dir Add include directory to search path." msgstr "" -#: scheduler/cupsfilter.c:1479 +#: scheduler/cupsfilter.c:1566 msgid " -P filename.ppd Set PPD file." msgstr "" -#: scheduler/cupsfilter.c:1480 +#: scheduler/cupsfilter.c:1567 msgid " -U username Specify username." msgstr "" @@ -892,7 +893,7 @@ msgid " -c catalog.po Load the specified message catalog." msgstr "" -#: scheduler/cupsfilter.c:1481 +#: scheduler/cupsfilter.c:1568 msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr "" @@ -900,19 +901,19 @@ msgid " -d output-dir Specify the output directory." msgstr "" -#: scheduler/cupsfilter.c:1482 +#: scheduler/cupsfilter.c:1569 msgid " -d printer Use the named printer." msgstr "" -#: scheduler/cupsfilter.c:1483 +#: scheduler/cupsfilter.c:1570 msgid " -e Use every filter from the PPD file." msgstr "" -#: scheduler/cupsfilter.c:1484 +#: scheduler/cupsfilter.c:1571 msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" -#: scheduler/cupsfilter.c:1485 +#: scheduler/cupsfilter.c:1572 msgid " -j job-id[,N] Filter file N from the specified job (default is file 1)." msgstr "" @@ -924,11 +925,11 @@ msgid " -m Use the ModelName value as the filename." msgstr "" -#: scheduler/cupsfilter.c:1486 +#: scheduler/cupsfilter.c:1573 msgid " -m mime/type Set output MIME type (otherwise application/pdf)." msgstr "" -#: scheduler/cupsfilter.c:1487 +#: scheduler/cupsfilter.c:1574 msgid " -n copies Set number of copies." msgstr "" @@ -940,11 +941,11 @@ msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." msgstr "" -#: scheduler/cupsfilter.c:1488 +#: scheduler/cupsfilter.c:1575 msgid " -o name=value Set option(s)." msgstr "" -#: scheduler/cupsfilter.c:1489 +#: scheduler/cupsfilter.c:1576 msgid " -p filename.ppd Set PPD file." msgstr "" @@ -952,11 +953,11 @@ msgid " -t Test PPDs instead of generating them." msgstr "" -#: scheduler/cupsfilter.c:1490 +#: scheduler/cupsfilter.c:1577 msgid " -t title Set title." msgstr "" -#: scheduler/cupsfilter.c:1491 +#: scheduler/cupsfilter.c:1578 msgid " -u Remove the PPD file when finished." msgstr "" @@ -1030,199 +1031,199 @@ msgid " PASS" msgstr "" -#: tools/ippfind.c:2803 +#: tools/ippfind.c:2817 msgid "! expression Unary NOT of expression" msgstr "" -#: cups/ipp.c:5045 +#: cups/ipp.c:5047 #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." msgstr "" -#: cups/ipp.c:5051 +#: cups/ipp.c:5053 #, c-format msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." msgstr "" -#: cups/ipp.c:4753 +#: cups/ipp.c:4755 #, c-format msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." msgstr "" -#: cups/ipp.c:4747 +#: cups/ipp.c:4749 #, c-format msgid "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." msgstr "" -#: cups/ipp.c:4768 +#: cups/ipp.c:4770 #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." msgstr "" -#: cups/ipp.c:5096 +#: cups/ipp.c:5098 #, c-format msgid "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." msgstr "" -#: cups/ipp.c:5102 +#: cups/ipp.c:5104 #, c-format msgid "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" -#: cups/ipp.c:4845 +#: cups/ipp.c:4847 #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4851 +#: cups/ipp.c:4853 #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4839 +#: cups/ipp.c:4841 #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4809 +#: cups/ipp.c:4811 #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4833 +#: cups/ipp.c:4835 #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4815 +#: cups/ipp.c:4817 #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4821 +#: cups/ipp.c:4823 #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4803 +#: cups/ipp.c:4805 #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4827 +#: cups/ipp.c:4829 #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." msgstr "" -#: cups/ipp.c:4779 +#: cups/ipp.c:4781 #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" -#: cups/ipp.c:5032 +#: cups/ipp.c:5034 #, c-format msgid "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." msgstr "" -#: cups/ipp.c:5026 +#: cups/ipp.c:5028 #, c-format msgid "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section 5.1.4)." msgstr "" -#: cups/ipp.c:5187 +#: cups/ipp.c:5189 #, c-format msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section 5.1.10)." msgstr "" -#: cups/ipp.c:5194 +#: cups/ipp.c:5196 #, c-format msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section 5.1.10)." msgstr "" -#: cups/ipp.c:5001 +#: cups/ipp.c:5003 #, c-format msgid "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." msgstr "" -#: cups/ipp.c:4996 +#: cups/ipp.c:4998 #, c-format msgid "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section 8.1)." msgstr "" -#: cups/ipp.c:5008 +#: cups/ipp.c:5010 #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" -#: cups/ipp.c:5142 +#: cups/ipp.c:5144 #, c-format msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section 5.1.9)." msgstr "" -#: cups/ipp.c:5149 +#: cups/ipp.c:5151 #, c-format msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section 5.1.9)." msgstr "" -#: cups/ipp.c:4790 +#: cups/ipp.c:4792 #, c-format msgid "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." msgstr "" -#: cups/ipp.c:4885 +#: cups/ipp.c:4887 #, c-format msgid "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 section 5.1.14)." msgstr "" -#: cups/ipp.c:4874 +#: cups/ipp.c:4876 #, c-format msgid "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section 5.1.16)." msgstr "" -#: cups/ipp.c:4862 +#: cups/ipp.c:4864 #, c-format msgid "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 8011 section 5.1.16)." msgstr "" -#: cups/ipp.c:4868 +#: cups/ipp.c:4870 #, c-format msgid "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 8011 section 5.1.16)." msgstr "" -#: cups/ipp.c:4946 +#: cups/ipp.c:4948 #, c-format msgid "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." msgstr "" -#: cups/ipp.c:4941 +#: cups/ipp.c:4943 #, c-format msgid "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section 8.3)." msgstr "" -#: cups/ipp.c:4953 +#: cups/ipp.c:4955 #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." msgstr "" -#: cups/ipp.c:5072 +#: cups/ipp.c:5074 #, c-format msgid "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." msgstr "" -#: cups/ipp.c:5078 +#: cups/ipp.c:5080 #, c-format msgid "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." msgstr "" -#: scheduler/ipp.c:365 +#: scheduler/ipp.c:366 msgid "\"requesting-user-name\" attribute in wrong group." msgstr "" -#: scheduler/ipp.c:371 scheduler/ipp.c:386 +#: scheduler/ipp.c:372 scheduler/ipp.c:387 msgid "\"requesting-user-name\" attribute with wrong syntax." msgstr "" -#: berkeley/lpq.c:538 +#: berkeley/lpq.c:539 #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" msgstr "" @@ -1262,12 +1263,12 @@ msgid "%s (Borderless, %s, %s)" msgstr "" -#: systemv/lpstat.c:806 +#: systemv/lpstat.c:807 #, c-format msgid "%s accepting requests since %s" msgstr "" -#: scheduler/ipp.c:10327 +#: scheduler/ipp.c:10331 #, c-format msgid "%s cannot be changed." msgstr "" @@ -1277,17 +1278,17 @@ msgid "%s is not implemented by the CUPS version of lpc." msgstr "" -#: berkeley/lpq.c:623 +#: berkeley/lpq.c:624 #, c-format msgid "%s is not ready" msgstr "" -#: berkeley/lpq.c:616 +#: berkeley/lpq.c:617 #, c-format msgid "%s is ready" msgstr "" -#: berkeley/lpq.c:619 +#: berkeley/lpq.c:620 #, c-format msgid "%s is ready and printing" msgstr "" @@ -1298,339 +1299,409 @@ msgid "%s job-id user title copies options [file]" msgstr "" -#: systemv/lpstat.c:810 +#: systemv/lpstat.c:811 #, c-format msgid "%s not accepting requests since %s -" msgstr "" -#: scheduler/ipp.c:608 +#: scheduler/ipp.c:609 #, c-format msgid "%s not supported." msgstr "" -#: systemv/lpstat.c:821 +#: systemv/lpstat.c:822 #, c-format msgid "%s/%s accepting requests since %s" msgstr "" -#: systemv/lpstat.c:826 +#: systemv/lpstat.c:827 #, c-format msgid "%s/%s not accepting requests since %s -" msgstr "" -#: berkeley/lpq.c:531 +#: berkeley/lpq.c:532 #, c-format msgid "%s: %-33.33s [job %d localhost]" msgstr "" #. TRANSLATORS: Message is "subject: error" -#: cups/langprintf.c:70 scheduler/cupsfilter.c:720 systemv/lpadmin.c:795 -#: systemv/lpadmin.c:844 systemv/lpadmin.c:892 systemv/lpadmin.c:945 -#: systemv/lpadmin.c:1043 systemv/lpadmin.c:1095 systemv/lpadmin.c:1136 -#: systemv/lpadmin.c:1150 systemv/lpadmin.c:1599 +#: cups/langprintf.c:70 scheduler/cupsfilter.c:765 systemv/lpadmin.c:796 +#: systemv/lpadmin.c:845 systemv/lpadmin.c:893 systemv/lpadmin.c:946 +#: systemv/lpadmin.c:1044 systemv/lpadmin.c:1096 systemv/lpadmin.c:1137 +#: systemv/lpadmin.c:1151 systemv/lpadmin.c:1600 #, c-format msgid "%s: %s" msgstr "" -#: systemv/cancel.c:310 systemv/cancel.c:374 +#: systemv/cancel.c:311 systemv/cancel.c:375 #, c-format msgid "%s: %s failed: %s" msgstr "" -#: systemv/lpadmin.c:1209 +#: systemv/lpadmin.c:1210 #, c-format msgid "%s: Bad printer URI \"%s\"." msgstr "" -#: tools/ippfind.c:768 tools/ipptool.c:412 +#: tools/ippfind.c:770 tools/ipptool.c:415 #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "" -#: systemv/cupsaccept.c:67 +#: systemv/cupsaccept.c:68 #, c-format msgid "%s: Don't know what to do." msgstr "" -#: berkeley/lpr.c:354 systemv/lp.c:589 +#: berkeley/lpr.c:360 systemv/lp.c:592 #, c-format msgid "%s: Error - %s" msgstr "" -#: berkeley/lpq.c:233 +#: berkeley/lpq.c:234 #, c-format msgid "%s: Error - %s environment variable names non-existent destination \"%s\"." msgstr "" -#: berkeley/lpq.c:138 berkeley/lpq.c:211 berkeley/lpr.c:234 berkeley/lpr.c:345 -#: systemv/lp.c:160 systemv/lp.c:580 systemv/lp.c:677 systemv/lp.c:727 -#: systemv/lpstat.c:190 systemv/lpstat.c:235 systemv/lpstat.c:368 -#: systemv/lpstat.c:395 systemv/lpstat.c:417 systemv/lpstat.c:477 -#: systemv/lpstat.c:543 systemv/lpstat.c:604 systemv/lpstat.c:727 -#: systemv/lpstat.c:907 systemv/lpstat.c:1164 systemv/lpstat.c:1356 -#: systemv/lpstat.c:1593 +#: berkeley/lpr.c:241 systemv/lp.c:168 +#, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#: berkeley/lpq.c:139 berkeley/lpq.c:212 berkeley/lpr.c:235 berkeley/lpr.c:351 +#: systemv/lp.c:161 systemv/lp.c:583 systemv/lp.c:680 systemv/lp.c:730 +#: systemv/lpstat.c:191 systemv/lpstat.c:236 systemv/lpstat.c:369 +#: systemv/lpstat.c:396 systemv/lpstat.c:418 systemv/lpstat.c:478 +#: systemv/lpstat.c:544 systemv/lpstat.c:605 systemv/lpstat.c:728 +#: systemv/lpstat.c:908 systemv/lpstat.c:1165 systemv/lpstat.c:1357 +#: systemv/lpstat.c:1594 #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "" -#: systemv/lp.c:237 +#: systemv/lp.c:244 #, c-format msgid "%s: Error - bad job ID." msgstr "" -#: systemv/lp.c:226 +#: systemv/lp.c:233 #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously." msgstr "" -#: systemv/lp.c:517 +#: systemv/lp.c:520 #, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided." msgstr "" -#: berkeley/lpr.c:259 systemv/lp.c:279 +#: berkeley/lpr.c:266 systemv/lp.c:286 #, c-format msgid "%s: Error - copies must be 1 or more." msgstr "" -#: systemv/lp.c:469 +#: scheduler/cupsfilter.c:368 +#, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#: scheduler/cupsfilter.c:337 +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#: systemv/lp.c:472 #, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "" -#: systemv/lp.c:488 +#: systemv/lp.c:491 #, c-format msgid "%s: Error - expected content type after \"-T\" option." msgstr "" -#: berkeley/lpr.c:250 +#: berkeley/lpr.c:257 #, c-format msgid "%s: Error - expected copies after \"-#\" option." msgstr "" -#: systemv/lp.c:270 +#: systemv/lp.c:277 #, c-format msgid "%s: Error - expected copies after \"-n\" option." msgstr "" -#: berkeley/lpr.c:212 +#: scheduler/cupsfilter.c:287 +#, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#: berkeley/lpr.c:213 #, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "" -#: systemv/lp.c:136 +#: systemv/lp.c:137 #, c-format msgid "%s: Error - expected destination after \"-d\" option." msgstr "" -#: systemv/lp.c:177 +#: scheduler/cupsfilter.c:204 +#, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#: systemv/lp.c:184 #, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "" -#: systemv/lp.c:405 +#: systemv/lp.c:408 #, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "" -#: berkeley/lpr.c:109 +#: berkeley/lpr.c:110 #, c-format msgid "%s: Error - expected hostname after \"-H\" option." msgstr "" -#: berkeley/lpq.c:172 berkeley/lprm.c:130 systemv/cancel.c:130 -#: systemv/cupsaccept.c:133 systemv/lp.c:197 systemv/lpstat.c:304 +#: berkeley/lpq.c:173 berkeley/lprm.c:131 systemv/cancel.c:131 +#: systemv/cupsaccept.c:134 systemv/lp.c:204 systemv/lpstat.c:305 #, c-format msgid "%s: Error - expected hostname after \"-h\" option." msgstr "" -#: systemv/lp.c:385 +#: scheduler/cupsfilter.c:238 +#, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#: scheduler/cupsfilter.c:270 +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#: systemv/lp.c:388 #, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "" -#: berkeley/lpr.c:280 +#: berkeley/lpr.c:286 #, c-format msgid "%s: Error - expected name after \"-%c\" option." msgstr "" -#: berkeley/lpr.c:161 systemv/lp.c:300 +#: scheduler/cupsfilter.c:188 +#, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#: scheduler/cupsfilter.c:323 +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#: scheduler/cupsfilter.c:300 +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#: berkeley/lpr.c:162 systemv/lp.c:305 #, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "" -#: systemv/lp.c:448 +#: systemv/lp.c:451 #, c-format msgid "%s: Error - expected page list after \"-P\" option." msgstr "" -#: systemv/lp.c:321 +#: scheduler/cupsfilter.c:217 +#, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#: systemv/lp.c:326 #, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "" -#: systemv/cupsaccept.c:152 +#: systemv/cupsaccept.c:153 #, c-format msgid "%s: Error - expected reason text after \"-r\" option." msgstr "" -#: systemv/lp.c:366 +#: scheduler/cupsfilter.c:254 +#, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#: scheduler/cupsfilter.c:351 +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#: systemv/lp.c:369 #, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "" -#: berkeley/lpq.c:101 berkeley/lpr.c:89 berkeley/lprm.c:110 -#: systemv/cancel.c:100 systemv/cupsaccept.c:110 systemv/lp.c:113 -#: systemv/lpadmin.c:439 systemv/lpstat.c:129 +#: berkeley/lpq.c:102 berkeley/lpr.c:90 berkeley/lprm.c:111 +#: systemv/cancel.c:101 systemv/cupsaccept.c:111 systemv/lp.c:114 +#: systemv/lpadmin.c:440 systemv/lpstat.c:130 #, c-format msgid "%s: Error - expected username after \"-U\" option." msgstr "" -#: systemv/cancel.c:152 +#: systemv/cancel.c:153 #, c-format msgid "%s: Error - expected username after \"-u\" option." msgstr "" -#: berkeley/lpr.c:134 +#: berkeley/lpr.c:135 #, c-format msgid "%s: Error - expected value after \"-%c\" option." msgstr "" -#: systemv/lpstat.c:149 systemv/lpstat.c:158 +#: systemv/lpstat.c:150 systemv/lpstat.c:159 #, c-format msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option." msgstr "" -#: berkeley/lpq.c:238 +#: berkeley/lpq.c:239 #, c-format msgid "%s: Error - no default destination available." msgstr "" -#: systemv/lp.c:341 +#: systemv/lp.c:346 #, c-format msgid "%s: Error - priority must be between 1 and 100." msgstr "" -#: berkeley/lpr.c:356 systemv/lp.c:591 +#: berkeley/lpr.c:362 systemv/lp.c:594 #, c-format msgid "%s: Error - scheduler not responding." msgstr "" -#: berkeley/lpr.c:321 systemv/lp.c:549 +#: berkeley/lpr.c:327 systemv/lp.c:552 #, c-format msgid "%s: Error - too many files - \"%s\"." msgstr "" -#: berkeley/lpr.c:303 systemv/lp.c:532 +#: berkeley/lpr.c:309 systemv/lp.c:535 #, c-format msgid "%s: Error - unable to access \"%s\" - %s" msgstr "" -#: berkeley/lpr.c:398 systemv/lp.c:621 +#: berkeley/lpr.c:404 systemv/lp.c:624 #, c-format msgid "%s: Error - unable to queue from stdin - %s." msgstr "" -#: berkeley/lprm.c:92 berkeley/lprm.c:179 systemv/cancel.c:227 +#: berkeley/lprm.c:93 berkeley/lprm.c:180 systemv/cancel.c:228 #, c-format msgid "%s: Error - unknown destination \"%s\"." msgstr "" -#: berkeley/lpq.c:140 +#: berkeley/lpq.c:141 #, c-format msgid "%s: Error - unknown destination \"%s/%s\"." msgstr "" -#: berkeley/lpr.c:289 berkeley/lprm.c:145 systemv/cancel.c:168 -#: systemv/cupsaccept.c:161 systemv/lp.c:507 systemv/lpstat.c:487 +#: berkeley/lpr.c:295 berkeley/lprm.c:146 systemv/cancel.c:169 +#: systemv/cupsaccept.c:162 systemv/lp.c:510 systemv/lpstat.c:488 #, c-format msgid "%s: Error - unknown option \"%c\"." msgstr "" -#: systemv/lp.c:499 +#: systemv/lp.c:502 #, c-format msgid "%s: Error - unknown option \"%s\"." msgstr "" -#: systemv/lp.c:217 +#: scheduler/cupsfilter.c:374 +#, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#: systemv/lp.c:224 #, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "" -#: systemv/lpstat.c:547 systemv/lpstat.c:587 +#: systemv/lpstat.c:548 systemv/lpstat.c:588 #, c-format msgid "%s: Invalid destination name in list \"%s\"." msgstr "" -#: scheduler/cupsfilter.c:573 +#: scheduler/cupsfilter.c:618 #, c-format msgid "%s: Invalid filter string \"%s\"." msgstr "" -#: tools/ipptool.c:334 +#: tools/ipptool.c:337 #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "" -#: tools/ippfind.c:740 tools/ipptool.c:371 +#: tools/ippfind.c:742 tools/ipptool.c:374 #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "" -#: tools/ippfind.c:753 tools/ipptool.c:385 +#: tools/ippfind.c:755 tools/ipptool.c:388 #, c-format msgid "%s: Missing version for \"-V\"." msgstr "" -#: systemv/lp.c:425 +#: systemv/lp.c:428 #, c-format msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." msgstr "" -#: scheduler/cupsfilter.c:445 +#: scheduler/cupsfilter.c:490 #, c-format msgid "%s: No filter to convert from %s/%s to %s/%s." msgstr "" -#: systemv/cupsaccept.c:195 +#: systemv/cupsaccept.c:196 #, c-format msgid "%s: Operation failed: %s" msgstr "" -#: berkeley/lpq.c:86 berkeley/lpr.c:74 berkeley/lprm.c:71 systemv/cancel.c:85 -#: systemv/cupsaccept.c:95 systemv/lp.c:98 systemv/lpadmin.c:249 -#: systemv/lpinfo.c:192 systemv/lpmove.c:69 systemv/lpstat.c:91 -#: tools/ipptool.c:316 tools/ipptool.c:360 +#: berkeley/lpq.c:87 berkeley/lpr.c:75 berkeley/lprm.c:72 systemv/cancel.c:86 +#: systemv/cupsaccept.c:96 systemv/lp.c:99 systemv/lpadmin.c:250 +#: systemv/lpinfo.c:193 systemv/lpmove.c:70 systemv/lpstat.c:92 +#: tools/ipptool.c:319 tools/ipptool.c:363 #, c-format msgid "%s: Sorry, no encryption support." msgstr "" -#: systemv/lpadmin.c:1216 +#: systemv/lpadmin.c:1217 #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" msgstr "" -#: berkeley/lpq.c:292 scheduler/cupsfilter.c:1269 systemv/cancel.c:250 +#: berkeley/lpq.c:293 scheduler/cupsfilter.c:1360 systemv/cancel.c:251 #, c-format msgid "%s: Unable to connect to server." msgstr "" -#: systemv/cancel.c:334 +#: systemv/cancel.c:335 #, c-format msgid "%s: Unable to contact server." msgstr "" -#: systemv/lpadmin.c:1246 +#: systemv/lpadmin.c:1247 #, c-format msgid "%s: Unable to create PPD file: %s" msgstr "" -#: scheduler/cupsfilter.c:410 +#: scheduler/cupsfilter.c:455 #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "" -#: tools/ipptool.c:277 tools/ipptool.c:343 +#: tools/ipptool.c:280 tools/ipptool.c:346 #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "" @@ -1640,95 +1711,95 @@ msgid "%s: Unable to open %s: %s" msgstr "" -#: scheduler/cupsfilter.c:668 ppdc/ppdmerge.cxx:102 +#: scheduler/cupsfilter.c:713 ppdc/ppdmerge.cxx:102 #, c-format msgid "%s: Unable to open PPD file: %s on line %d." msgstr "" -#: systemv/lpadmin.c:1231 +#: systemv/lpadmin.c:1232 #, c-format msgid "%s: Unable to query printer: %s" msgstr "" -#: scheduler/cupsfilter.c:377 +#: scheduler/cupsfilter.c:424 #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." msgstr "" -#: systemv/lpadmin.c:1200 +#: systemv/lpadmin.c:1201 #, c-format msgid "%s: Unable to resolve \"%s\"." msgstr "" -#: systemv/lpinfo.c:238 +#: systemv/lpinfo.c:239 #, c-format msgid "%s: Unknown argument \"%s\"." msgstr "" -#: berkeley/lpq.c:142 systemv/lpstat.c:608 +#: berkeley/lpq.c:143 systemv/lpstat.c:609 #, c-format msgid "%s: Unknown destination \"%s\"." msgstr "" -#: scheduler/cupsfilter.c:422 +#: scheduler/cupsfilter.c:467 #, c-format msgid "%s: Unknown destination MIME type %s/%s." msgstr "" -#: scheduler/cupsfilter.c:1473 systemv/lpinfo.c:231 systemv/lpmove.c:94 +#: scheduler/cupsfilter.c:1560 systemv/lpinfo.c:232 systemv/lpmove.c:95 #, c-format msgid "%s: Unknown option \"%c\"." msgstr "" -#: tools/ippeveprinter.c:414 tools/ippeveprinter.c:604 tools/ippfind.c:627 +#: tools/ippeveprinter.c:434 tools/ippeveprinter.c:632 tools/ippfind.c:629 #, c-format msgid "%s: Unknown option \"%s\"." msgstr "" -#: tools/ippeveprinter.c:593 tools/ippfind.c:919 tools/ipptool.c:606 +#: tools/ippeveprinter.c:621 tools/ippfind.c:921 tools/ipptool.c:609 #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "" -#: scheduler/cupsfilter.c:402 +#: scheduler/cupsfilter.c:447 #, c-format msgid "%s: Unknown source MIME type %s/%s." msgstr "" -#: berkeley/lpr.c:147 +#: berkeley/lpr.c:148 #, c-format msgid "%s: Warning - \"%c\" format modifier not supported - output may not be correct." msgstr "" -#: systemv/lp.c:474 +#: systemv/lp.c:477 #, c-format msgid "%s: Warning - character set option ignored." msgstr "" -#: systemv/lp.c:493 +#: systemv/lp.c:496 #, c-format msgid "%s: Warning - content type option ignored." msgstr "" -#: systemv/lp.c:182 +#: systemv/lp.c:189 #, c-format msgid "%s: Warning - form option ignored." msgstr "" -#: systemv/lp.c:390 +#: systemv/lp.c:393 #, c-format msgid "%s: Warning - mode option ignored." msgstr "" -#: tools/ippfind.c:2802 +#: tools/ippfind.c:2816 msgid "( expressions ) Group expressions" msgstr "" -#: berkeley/lprm.c:233 +#: berkeley/lprm.c:234 msgid "- Cancel all jobs" msgstr "" -#: berkeley/lpr.c:432 +#: berkeley/lpr.c:438 msgid "-# num-copies Specify the number of copies to print" msgstr "" @@ -1752,374 +1823,378 @@ msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" -#: systemv/lpinfo.c:504 +#: systemv/lpinfo.c:505 msgid "--device-id device-id Show models matching the given IEEE 1284 device ID" msgstr "" -#: tools/ippfind.c:2785 +#: tools/ippfind.c:2798 msgid "--domain regex Match domain to regular expression" msgstr "" -#: systemv/lpinfo.c:505 +#: systemv/lpinfo.c:506 msgid "" "--exclude-schemes scheme-list\n" " Exclude the specified URI schemes" msgstr "" -#: tools/ippfind.c:2786 +#: tools/ippfind.c:2799 msgid "" "--exec utility [argument ...] ;\n" " Execute program if true" msgstr "" -#: tools/ippfind.c:2805 +#: tools/ippfind.c:2819 msgid "--false Always false" msgstr "" -#: tools/ippeveprinter.c:7923 +#: tools/ippeveprinter.c:8345 msgid "--help Show program help" msgstr "" -#: systemv/cupsaccept.c:249 +#: systemv/cupsaccept.c:250 msgid "--hold Hold new jobs" msgstr "" -#: tools/ippfind.c:2788 +#: tools/ippfind.c:2801 msgid "--host regex Match hostname to regular expression" msgstr "" -#: systemv/lpinfo.c:507 +#: systemv/lpinfo.c:508 msgid "" "--include-schemes scheme-list\n" " Include only the specified URI schemes" msgstr "" -#: tools/ipptool.c:4308 +#: tools/ipptool.c:4338 msgid "--ippserver filename Produce ippserver attribute file" msgstr "" -#: systemv/lpinfo.c:509 +#: systemv/lpinfo.c:510 msgid "--language locale Show models matching the given locale" msgstr "" -#: tools/ippfind.c:2790 +#: tools/ippfind.c:2802 +msgid "--literal-name name Match service name to literal name value" +msgstr "" + +#: tools/ippfind.c:2803 msgid "--local True if service is local" msgstr "" -#: tools/ippfind.c:2789 +#: tools/ippfind.c:2804 msgid "--ls List attributes" msgstr "" -#: systemv/lpinfo.c:510 +#: systemv/lpinfo.c:511 msgid "--make-and-model name Show models matching the given make and model name" msgstr "" -#: tools/ippfind.c:2791 +#: tools/ippfind.c:2805 msgid "--name regex Match service name to regular expression" msgstr "" -#: tools/ippeveprinter.c:7924 +#: tools/ippeveprinter.c:8346 msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" -#: tools/ippfind.c:2804 +#: tools/ippfind.c:2818 msgid "--not expression Unary NOT of expression" msgstr "" -#: tools/ippeveprinter.c:7925 +#: tools/ippeveprinter.c:8347 msgid "--pam-service service Use the named PAM service" msgstr "" -#: tools/ippfind.c:2792 +#: tools/ippfind.c:2806 msgid "--path regex Match resource path to regular expression" msgstr "" -#: tools/ippfind.c:2793 +#: tools/ippfind.c:2807 msgid "--port number[-number] Match port to number or range" msgstr "" -#: tools/ippfind.c:2794 +#: tools/ippfind.c:2808 msgid "--print Print URI if true" msgstr "" -#: tools/ippfind.c:2795 +#: tools/ippfind.c:2809 msgid "--print-name Print service name if true" msgstr "" -#: systemv/lpinfo.c:511 +#: systemv/lpinfo.c:512 msgid "--product name Show models matching the given PostScript product" msgstr "" -#: tools/ippfind.c:2796 +#: tools/ippfind.c:2810 msgid "--quiet Quietly report match via exit code" msgstr "" -#: systemv/cupsaccept.c:251 +#: systemv/cupsaccept.c:252 msgid "--release Release previously held jobs" msgstr "" -#: tools/ippfind.c:2797 +#: tools/ippfind.c:2811 msgid "--remote True if service is remote" msgstr "" -#: tools/ipptool.c:4309 +#: tools/ipptool.c:4339 msgid "" "--stop-after-include-error\n" " Stop tests after a failed INCLUDE" msgstr "" -#: systemv/lpinfo.c:512 +#: systemv/lpinfo.c:513 msgid "--timeout seconds Specify the maximum number of seconds to discover devices" msgstr "" -#: tools/ippfind.c:2806 +#: tools/ippfind.c:2820 msgid "--true Always true" msgstr "" -#: tools/ippfind.c:2798 +#: tools/ippfind.c:2812 msgid "--txt key True if the TXT record contains the key" msgstr "" -#: tools/ippfind.c:2799 +#: tools/ippfind.c:2813 msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" -#: tools/ippfind.c:2800 +#: tools/ippfind.c:2814 msgid "--uri regex Match URI to regular expression" msgstr "" -#: tools/ippeveprinter.c:7926 tools/ippfind.c:2770 +#: tools/ippeveprinter.c:8348 tools/ippfind.c:2782 msgid "--version Show program version" msgstr "" -#: tools/ipptool.c:4311 +#: tools/ipptool.c:4341 msgid "--version Show version" msgstr "" -#: ppdc/sample.c:308 +#: ppdc/sample.c:315 msgid "-1" msgstr "" -#: ppdc/sample.c:299 +#: ppdc/sample.c:306 msgid "-10" msgstr "" -#: ppdc/sample.c:391 +#: ppdc/sample.c:398 msgid "-100" msgstr "" -#: ppdc/sample.c:390 +#: ppdc/sample.c:397 msgid "-105" msgstr "" -#: ppdc/sample.c:298 +#: ppdc/sample.c:305 msgid "-11" msgstr "" -#: ppdc/sample.c:389 +#: ppdc/sample.c:396 msgid "-110" msgstr "" -#: ppdc/sample.c:388 +#: ppdc/sample.c:395 msgid "-115" msgstr "" -#: ppdc/sample.c:297 +#: ppdc/sample.c:304 msgid "-12" msgstr "" -#: ppdc/sample.c:387 +#: ppdc/sample.c:394 msgid "-120" msgstr "" -#: ppdc/sample.c:296 +#: ppdc/sample.c:303 msgid "-13" msgstr "" -#: ppdc/sample.c:295 +#: ppdc/sample.c:302 msgid "-14" msgstr "" -#: ppdc/sample.c:294 +#: ppdc/sample.c:301 msgid "-15" msgstr "" -#: ppdc/sample.c:307 +#: ppdc/sample.c:314 msgid "-2" msgstr "" -#: tools/ippeveprinter.c:7927 +#: tools/ippeveprinter.c:8349 msgid "-2 Set 2-sided printing support (default=1-sided)" msgstr "" -#: ppdc/sample.c:407 +#: ppdc/sample.c:414 msgid "-20" msgstr "" -#: ppdc/sample.c:406 +#: ppdc/sample.c:413 msgid "-25" msgstr "" -#: ppdc/sample.c:306 +#: ppdc/sample.c:313 msgid "-3" msgstr "" -#: ppdc/sample.c:405 +#: ppdc/sample.c:412 msgid "-30" msgstr "" -#: ppdc/sample.c:404 +#: ppdc/sample.c:411 msgid "-35" msgstr "" -#: ppdc/sample.c:305 +#: ppdc/sample.c:312 msgid "-4" msgstr "" -#: tools/ippfind.c:2766 tools/ipptool.c:4312 +#: tools/ippfind.c:2778 tools/ipptool.c:4342 msgid "-4 Connect using IPv4" msgstr "" -#: ppdc/sample.c:403 +#: ppdc/sample.c:410 msgid "-40" msgstr "" -#: ppdc/sample.c:402 +#: ppdc/sample.c:409 msgid "-45" msgstr "" -#: ppdc/sample.c:304 +#: ppdc/sample.c:311 msgid "-5" msgstr "" -#: ppdc/sample.c:401 +#: ppdc/sample.c:408 msgid "-50" msgstr "" -#: ppdc/sample.c:400 +#: ppdc/sample.c:407 msgid "-55" msgstr "" -#: ppdc/sample.c:303 +#: ppdc/sample.c:310 msgid "-6" msgstr "" -#: tools/ippfind.c:2767 tools/ipptool.c:4313 +#: tools/ippfind.c:2779 tools/ipptool.c:4343 msgid "-6 Connect using IPv6" msgstr "" -#: ppdc/sample.c:399 +#: ppdc/sample.c:406 msgid "-60" msgstr "" -#: ppdc/sample.c:398 +#: ppdc/sample.c:405 msgid "-65" msgstr "" -#: ppdc/sample.c:302 +#: ppdc/sample.c:309 msgid "-7" msgstr "" -#: ppdc/sample.c:397 +#: ppdc/sample.c:404 msgid "-70" msgstr "" -#: ppdc/sample.c:396 +#: ppdc/sample.c:403 msgid "-75" msgstr "" -#: ppdc/sample.c:301 +#: ppdc/sample.c:308 msgid "-8" msgstr "" -#: ppdc/sample.c:395 +#: ppdc/sample.c:402 msgid "-80" msgstr "" -#: ppdc/sample.c:394 +#: ppdc/sample.c:401 msgid "-85" msgstr "" -#: ppdc/sample.c:300 +#: ppdc/sample.c:307 msgid "-9" msgstr "" -#: ppdc/sample.c:393 +#: ppdc/sample.c:400 msgid "-90" msgstr "" -#: ppdc/sample.c:392 +#: ppdc/sample.c:399 msgid "-95" msgstr "" -#: tools/ippeveprinter.c:7928 +#: tools/ippeveprinter.c:8350 msgid "-A Enable authentication" msgstr "" -#: tools/ipptool.c:4314 +#: tools/ipptool.c:4344 msgid "-C Send requests using chunking (default)" msgstr "" -#: systemv/lpadmin.c:1623 +#: systemv/lpadmin.c:1624 msgid "-D description Specify the textual description of the printer" msgstr "" -#: tools/ippeveprinter.c:7929 +#: tools/ippeveprinter.c:8351 msgid "-D device-uri Set the device URI for the printer" msgstr "" -#: systemv/lpadmin.c:1625 +#: systemv/lpadmin.c:1626 msgid "-E Enable and accept jobs on the printer (after -p)" msgstr "" -#: berkeley/lpq.c:644 berkeley/lpr.c:433 berkeley/lprm.c:234 -#: systemv/cancel.c:403 systemv/cupsaccept.c:244 systemv/cupsctl.c:233 -#: systemv/lp.c:753 systemv/lpadmin.c:1624 systemv/lpinfo.c:498 -#: systemv/lpmove.c:217 systemv/lpoptions.c:540 systemv/lpstat.c:2045 +#: berkeley/lpq.c:645 berkeley/lpr.c:439 berkeley/lprm.c:235 +#: systemv/cancel.c:404 systemv/cupsaccept.c:245 systemv/cupsctl.c:233 +#: systemv/lp.c:756 systemv/lpadmin.c:1625 systemv/lpinfo.c:499 +#: systemv/lpmove.c:218 systemv/lpoptions.c:540 systemv/lpstat.c:2046 msgid "-E Encrypt the connection to the server" msgstr "" -#: tools/ipptool.c:4315 +#: tools/ipptool.c:4345 msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" -#: scheduler/main.c:2138 +#: scheduler/main.c:2148 msgid "-F Run in the foreground but detach from console." msgstr "" -#: tools/ippeveprinter.c:7930 +#: tools/ippeveprinter.c:8352 msgid "-F output-type/subtype Set the output format for the printer" msgstr "" -#: systemv/lpstat.c:2050 +#: systemv/lpstat.c:2051 msgid "-H Show the default server and port" msgstr "" -#: systemv/lp.c:755 +#: systemv/lp.c:758 msgid "-H HH:MM Hold the job until the specified UTC time" msgstr "" -#: systemv/lp.c:756 +#: systemv/lp.c:759 msgid "-H hold Hold the job until released/resumed" msgstr "" -#: systemv/lp.c:757 +#: systemv/lp.c:760 msgid "-H immediate Print the job as soon as possible" msgstr "" -#: systemv/lp.c:758 +#: systemv/lp.c:761 msgid "-H restart Reprint the job" msgstr "" -#: systemv/lp.c:759 +#: systemv/lp.c:762 msgid "-H resume Resume a held job" msgstr "" -#: berkeley/lpr.c:434 +#: berkeley/lpr.c:440 msgid "-H server[:port] Connect to the named server and port" msgstr "" -#: tools/ipptool.c:4316 +#: tools/ipptool.c:4346 msgid "-I Ignore errors" msgstr "" @@ -2129,51 +2204,55 @@ " Ignore specific warnings" msgstr "" -#: tools/ippeveprinter.c:7932 +#: tools/ippeveprinter.c:8354 msgid "-K keypath Set location of server X.509 certificates and keys." msgstr "" -#: tools/ipptool.c:4317 +#: tools/ipptool.c:4347 msgid "-L Send requests using content-length" msgstr "" -#: systemv/lpadmin.c:1628 +#: systemv/lpadmin.c:1629 msgid "-L location Specify the textual location of the printer" msgstr "" -#: tools/ippeveprinter.c:7934 +#: tools/ippeveprinter.c:8356 msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" -#: berkeley/lpq.c:647 +#: tools/ippfind.c:2789 +msgid "-N name Match service name to literal name value" +msgstr "" + +#: berkeley/lpq.c:648 msgid "-P destination Show status for the specified destination" msgstr "" -#: berkeley/lpr.c:448 berkeley/lprm.c:236 +#: berkeley/lpr.c:454 berkeley/lprm.c:237 msgid "-P destination Specify the destination" msgstr "" -#: tools/ipptool.c:4318 +#: tools/ipptool.c:4348 msgid "-P filename.plist Produce XML plist to a file and test report to standard output" msgstr "" -#: tools/ippeveprinter.c:7935 +#: tools/ippeveprinter.c:8358 msgid "-P filename.ppd Load printer attributes from PPD file" msgstr "" -#: tools/ippfind.c:2772 +#: tools/ippfind.c:2784 msgid "-P number[-number] Match port to number or range" msgstr "" -#: systemv/lp.c:775 +#: systemv/lp.c:778 msgid "-P page-list Specify a list of pages to print" msgstr "" -#: systemv/lpstat.c:2060 +#: systemv/lpstat.c:2061 msgid "-R Show the ranking of jobs" msgstr "" -#: systemv/lpadmin.c:1648 +#: systemv/lpadmin.c:1649 msgid "-R name-default Remove the default value for the named option" msgstr "" @@ -2181,26 +2260,30 @@ msgid "-R root-directory Set alternate root" msgstr "" -#: tools/ipptool.c:4319 +#: tools/ipptool.c:4349 msgid "-S Test with encryption using HTTPS" msgstr "" -#: tools/ippfind.c:2768 +#: tools/ippeveprinter.c:8360 +msgid "-S filename.strings Set strings file" +msgstr "" + +#: tools/ippfind.c:2780 msgid "-T seconds Set the browse timeout in seconds" msgstr "" -#: tools/ipptool.c:4320 +#: tools/ipptool.c:4350 msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" -#: berkeley/lpr.c:451 +#: berkeley/lpr.c:457 msgid "-T title Specify the job title" msgstr "" -#: berkeley/lpq.c:648 berkeley/lpr.c:452 berkeley/lprm.c:237 -#: systemv/cancel.c:406 systemv/cupsaccept.c:247 systemv/lp.c:779 -#: systemv/lpadmin.c:1652 systemv/lpinfo.c:502 systemv/lpmove.c:219 -#: systemv/lpoptions.c:545 systemv/lpstat.c:2048 +#: berkeley/lpq.c:649 berkeley/lpr.c:458 berkeley/lprm.c:238 +#: systemv/cancel.c:407 systemv/cupsaccept.c:248 systemv/lp.c:782 +#: systemv/lpadmin.c:1653 systemv/lpinfo.c:503 systemv/lpmove.c:220 +#: systemv/lpoptions.c:545 systemv/lpstat.c:2049 msgid "-U username Specify the username to use for authentication" msgstr "" @@ -2208,15 +2291,15 @@ msgid "-U username Specify username to use for authentication" msgstr "" -#: tools/ippeveprinter.c:7936 tools/ippfind.c:2769 tools/ipptool.c:4321 +#: tools/ippeveprinter.c:8361 tools/ippfind.c:2781 tools/ipptool.c:4351 msgid "-V version Set default IPP version" msgstr "" -#: systemv/lpstat.c:2051 +#: systemv/lpstat.c:2052 msgid "-W completed Show completed jobs" msgstr "" -#: systemv/lpstat.c:2052 +#: systemv/lpstat.c:2053 msgid "-W not-completed Show pending jobs" msgstr "" @@ -2226,51 +2309,51 @@ " Issue warnings instead of errors" msgstr "" -#: tools/ipptool.c:4322 +#: tools/ipptool.c:4352 msgid "-X Produce XML plist instead of plain text" msgstr "" -#: systemv/cancel.c:402 +#: systemv/cancel.c:403 msgid "-a Cancel all jobs" msgstr "" -#: berkeley/lpq.c:643 +#: berkeley/lpq.c:644 msgid "-a Show jobs on all destinations" msgstr "" -#: systemv/lpstat.c:2053 +#: systemv/lpstat.c:2054 msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" -#: tools/ippeveprinter.c:7937 +#: tools/ippeveprinter.c:8362 msgid "-a filename.conf Load printer attributes from conf file" msgstr "" -#: systemv/lp.c:751 +#: systemv/lp.c:754 msgid "-c Make a copy of the print file(s)" msgstr "" -#: tools/ipptool.c:4323 +#: tools/ipptool.c:4353 msgid "-c Produce CSV output" msgstr "" -#: systemv/lpstat.c:2054 +#: systemv/lpstat.c:2055 msgid "-c [class(es)] Show classes and their member printers" msgstr "" -#: systemv/lpadmin.c:1621 +#: systemv/lpadmin.c:1622 msgid "-c class Add the named destination to a class" msgstr "" -#: tools/ippeveprinter.c:7938 +#: tools/ippeveprinter.c:8363 msgid "-c command Set print command" msgstr "" -#: scheduler/main.c:2136 +#: scheduler/main.c:2146 msgid "-c cupsd.conf Set cupsd.conf file to use." msgstr "" -#: systemv/lpstat.c:2055 +#: systemv/lpstat.c:2056 msgid "-d Show the default destination" msgstr "" @@ -2278,90 +2361,90 @@ msgid "-d destination Set default destination" msgstr "" -#: systemv/lpadmin.c:1622 +#: systemv/lpadmin.c:1623 msgid "-d destination Set the named destination as the server default" msgstr "" -#: systemv/lp.c:752 +#: systemv/lp.c:755 msgid "-d destination Specify the destination" msgstr "" -#: tools/ipptool.c:4324 +#: tools/ipptool.c:4354 msgid "-d name=value Set named variable to value" msgstr "" -#: tools/ippfind.c:2773 +#: tools/ippfind.c:2785 msgid "-d regex Match domain to regular expression" msgstr "" -#: tools/ippeveprinter.c:7939 +#: tools/ippeveprinter.c:8364 msgid "-d spool-directory Set spool directory" msgstr "" -#: systemv/lpstat.c:2056 +#: systemv/lpstat.c:2057 msgid "-e Show available destinations on the network" msgstr "" -#: scheduler/main.c:2137 +#: scheduler/main.c:2147 msgid "-f Run in the foreground." msgstr "" -#: tools/ipptool.c:4325 +#: tools/ipptool.c:4355 msgid "-f filename Set default request filename" msgstr "" -#: tools/ippeveprinter.c:7940 +#: tools/ippeveprinter.c:8365 msgid "-f type/subtype[,...] Set supported file types" msgstr "" -#: scheduler/main.c:2139 +#: scheduler/main.c:2149 msgid "-h Show this usage message." msgstr "" -#: tools/ipptool.c:4326 +#: tools/ipptool.c:4356 msgid "-h Validate HTTP response headers" msgstr "" -#: tools/ippfind.c:2774 +#: tools/ippfind.c:2786 msgid "-h regex Match hostname to regular expression" msgstr "" -#: berkeley/lpq.c:645 berkeley/lprm.c:235 systemv/cancel.c:404 -#: systemv/cupsaccept.c:245 systemv/cupsctl.c:234 systemv/lp.c:754 -#: systemv/lpadmin.c:1626 systemv/lpinfo.c:499 systemv/lpmove.c:218 -#: systemv/lpoptions.c:541 systemv/lpstat.c:2046 +#: berkeley/lpq.c:646 berkeley/lprm.c:236 systemv/cancel.c:405 +#: systemv/cupsaccept.c:246 systemv/cupsctl.c:234 systemv/lp.c:757 +#: systemv/lpadmin.c:1627 systemv/lpinfo.c:500 systemv/lpmove.c:219 +#: systemv/lpoptions.c:541 systemv/lpstat.c:2047 msgid "-h server[:port] Connect to the named server and port" msgstr "" -#: tools/ippeveprinter.c:7941 -msgid "-i iconfile.png Set icon file" +#: tools/ippeveprinter.c:8366 +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" -#: systemv/lp.c:760 +#: systemv/lp.c:763 msgid "-i id Specify an existing job ID to modify" msgstr "" -#: systemv/lpadmin.c:1627 +#: systemv/lpadmin.c:1628 msgid "-i ppd-file Specify a PPD file for the printer" msgstr "" -#: tools/ipptool.c:4327 +#: tools/ipptool.c:4357 msgid "-i seconds Repeat the last file with the given time interval" msgstr "" -#: tools/ippeveprinter.c:7942 +#: tools/ippeveprinter.c:8367 msgid "-k Keep job spool files" msgstr "" -#: tools/ippfind.c:2775 +#: tools/ippfind.c:2787 msgid "-l List attributes" msgstr "" -#: tools/ipptool.c:4328 +#: tools/ipptool.c:4358 msgid "-l Produce plain text output" msgstr "" -#: scheduler/main.c:2141 +#: scheduler/main.c:2151 msgid "-l Run cupsd on demand." msgstr "" @@ -2369,91 +2452,91 @@ msgid "-l Show supported options and values" msgstr "" -#: berkeley/lpq.c:646 systemv/lpinfo.c:500 systemv/lpstat.c:2047 +#: berkeley/lpq.c:647 systemv/lpinfo.c:501 systemv/lpstat.c:2048 msgid "-l Show verbose (long) output" msgstr "" -#: tools/ippeveprinter.c:7943 +#: tools/ippeveprinter.c:8368 msgid "-l location Set location of printer" msgstr "" -#: berkeley/lpr.c:435 systemv/lp.c:761 +#: berkeley/lpr.c:441 systemv/lp.c:764 msgid "-m Send an email notification when the job completes" msgstr "" -#: systemv/lpinfo.c:501 +#: systemv/lpinfo.c:502 msgid "-m Show models" msgstr "" -#: systemv/lpadmin.c:1630 +#: systemv/lpadmin.c:1631 msgid "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" -#: tools/ippeveprinter.c:7944 +#: tools/ippeveprinter.c:8369 msgid "-m model Set model name (default=Printer)" msgstr "" -#: systemv/lpadmin.c:1629 +#: systemv/lpadmin.c:1630 msgid "-m model Specify a standard model/PPD file for the printer" msgstr "" -#: tools/ipptool.c:4329 +#: tools/ipptool.c:4359 msgid "-n count Repeat the last file the given number of times" msgstr "" -#: tools/ippeveprinter.c:7945 +#: tools/ippeveprinter.c:8370 msgid "-n hostname Set hostname for printer" msgstr "" -#: systemv/lp.c:762 +#: systemv/lp.c:765 msgid "-n num-copies Specify the number of copies to print" msgstr "" -#: tools/ippfind.c:2776 +#: tools/ippfind.c:2788 msgid "-n regex Match service name to regular expression" msgstr "" -#: systemv/lpadmin.c:1632 +#: systemv/lpadmin.c:1633 msgid "-o Name=Value Specify the default value for the named PPD option " msgstr "" -#: systemv/lpstat.c:2057 +#: systemv/lpstat.c:2058 msgid "-o [destination(s)] Show jobs" msgstr "" -#: systemv/lpadmin.c:1633 +#: systemv/lpadmin.c:1634 msgid "" "-o cupsIPPSupplies=false\n" " Disable supply level reporting via IPP" msgstr "" -#: systemv/lpadmin.c:1635 +#: systemv/lpadmin.c:1636 msgid "" "-o cupsSNMPSupplies=false\n" " Disable supply level reporting via SNMP" msgstr "" -#: systemv/lpadmin.c:1637 +#: systemv/lpadmin.c:1638 msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" msgstr "" -#: systemv/lpadmin.c:1638 +#: systemv/lpadmin.c:1639 msgid "-o job-page-limit=N Specify the page limit for per-user quotas" msgstr "" -#: systemv/lpadmin.c:1639 +#: systemv/lpadmin.c:1640 msgid "-o job-quota-period=N Specify the per-user quota period in seconds" msgstr "" -#: berkeley/lpr.c:437 systemv/lp.c:764 +#: berkeley/lpr.c:443 systemv/lp.c:767 msgid "-o job-sheets=standard Print a banner page with the job" msgstr "" -#: berkeley/lpr.c:438 systemv/lp.c:765 +#: berkeley/lpr.c:444 systemv/lp.c:768 msgid "-o media=size Specify the media size to use" msgstr "" -#: systemv/lpadmin.c:1631 +#: systemv/lpadmin.c:1632 msgid "-o name-default=value Specify the default value for the named option" msgstr "" @@ -2461,63 +2544,63 @@ msgid "-o name[=value] Set default option and value" msgstr "" -#: berkeley/lpr.c:439 systemv/lp.c:766 +#: berkeley/lpr.c:445 systemv/lp.c:769 msgid "-o number-up=N Specify that input pages should be printed N-up (1, 2, 4, 6, 9, and 16 are supported)" msgstr "" -#: berkeley/lpr.c:436 systemv/lp.c:763 +#: berkeley/lpr.c:442 systemv/lp.c:766 msgid "-o option[=value] Specify a printer-specific option" msgstr "" -#: berkeley/lpr.c:440 systemv/lp.c:767 +#: berkeley/lpr.c:446 systemv/lp.c:770 msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" -#: berkeley/lpr.c:442 systemv/lp.c:769 +#: berkeley/lpr.c:448 systemv/lp.c:772 msgid "-o print-quality=N Specify the print quality - draft (3), normal (4), or best (5)" msgstr "" -#: systemv/lpadmin.c:1640 +#: systemv/lpadmin.c:1641 msgid "" "-o printer-error-policy=name\n" " Specify the printer error policy" msgstr "" -#: systemv/lpadmin.c:1642 +#: systemv/lpadmin.c:1643 msgid "" "-o printer-is-shared=true\n" " Share the printer" msgstr "" -#: systemv/lpadmin.c:1644 +#: systemv/lpadmin.c:1645 msgid "" "-o printer-op-policy=name\n" " Specify the printer operation policy" msgstr "" -#: berkeley/lpr.c:443 systemv/lp.c:770 +#: berkeley/lpr.c:449 systemv/lp.c:773 msgid "-o sides=one-sided Specify 1-sided printing" msgstr "" -#: berkeley/lpr.c:444 systemv/lp.c:771 +#: berkeley/lpr.c:450 systemv/lp.c:774 msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" -#: berkeley/lpr.c:446 systemv/lp.c:773 +#: berkeley/lpr.c:452 systemv/lp.c:776 msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" -#: tools/ippfind.c:2777 +#: tools/ippfind.c:2790 msgid "-p Print URI if true" msgstr "" -#: systemv/lpstat.c:2058 +#: systemv/lpstat.c:2059 msgid "-p [printer(s)] Show the processing state of destinations" msgstr "" @@ -2525,39 +2608,39 @@ msgid "-p destination Specify a destination" msgstr "" -#: systemv/lpadmin.c:1646 +#: systemv/lpadmin.c:1647 msgid "-p destination Specify/add the named destination" msgstr "" -#: tools/ippeveprinter.c:7946 +#: tools/ippeveprinter.c:8371 msgid "-p port Set port number for printer" msgstr "" -#: tools/ippfind.c:2778 +#: tools/ippfind.c:2791 msgid "-q Quietly report match via exit code" msgstr "" -#: systemv/cupstestppd.c:3863 tools/ipptool.c:4330 +#: systemv/cupstestppd.c:3863 tools/ipptool.c:4360 msgid "-q Run silently" msgstr "" -#: berkeley/lpr.c:449 +#: berkeley/lpr.c:455 msgid "-q Specify the job should be held for printing" msgstr "" -#: systemv/lp.c:776 +#: systemv/lp.c:779 msgid "-q priority Specify the priority from low (1) to high (100)" msgstr "" -#: berkeley/lpr.c:450 +#: berkeley/lpr.c:456 msgid "-r Remove the file(s) after submission" msgstr "" -#: systemv/lpstat.c:2059 +#: systemv/lpstat.c:2060 msgid "-r Show whether the CUPS server is running" msgstr "" -#: tools/ippfind.c:2779 +#: tools/ippfind.c:2792 msgid "-r True if service is remote" msgstr "" @@ -2565,95 +2648,95 @@ msgid "-r Use 'relaxed' open mode" msgstr "" -#: systemv/lpadmin.c:1647 +#: systemv/lpadmin.c:1648 msgid "-r class Remove the named destination from a class" msgstr "" -#: systemv/cupsaccept.c:246 +#: systemv/cupsaccept.c:247 msgid "-r reason Specify a reason message that others can see" msgstr "" -#: tools/ippeveprinter.c:7947 +#: tools/ippeveprinter.c:8372 msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" -#: systemv/lp.c:777 +#: systemv/lp.c:780 msgid "-s Be silent" msgstr "" -#: tools/ippfind.c:2780 +#: tools/ippfind.c:2793 msgid "-s Print service name if true" msgstr "" -#: systemv/lpstat.c:2061 +#: systemv/lpstat.c:2062 msgid "-s Show a status summary" msgstr "" -#: scheduler/main.c:2143 +#: scheduler/main.c:2153 msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" -#: tools/ippeveprinter.c:7948 +#: tools/ippeveprinter.c:8373 msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" -#: tools/ipptool.c:4331 +#: tools/ipptool.c:4361 msgid "-t Produce a test report" msgstr "" -#: systemv/lpstat.c:2062 +#: systemv/lpstat.c:2063 msgid "-t Show all status information" msgstr "" -#: scheduler/main.c:2144 +#: scheduler/main.c:2154 msgid "-t Test the configuration file." msgstr "" -#: tools/ippfind.c:2781 +#: tools/ippfind.c:2794 msgid "-t key True if the TXT record contains the key" msgstr "" -#: systemv/lp.c:778 +#: systemv/lp.c:781 msgid "-t title Specify the job title" msgstr "" -#: systemv/lpstat.c:2063 +#: systemv/lpstat.c:2064 msgid "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" -#: systemv/lpadmin.c:1649 +#: systemv/lpadmin.c:1650 msgid "-u allow:all Allow all users to print" msgstr "" -#: systemv/lpadmin.c:1650 +#: systemv/lpadmin.c:1651 msgid "-u allow:list Allow the list of users or groups (@name) to print" msgstr "" -#: systemv/lpadmin.c:1651 +#: systemv/lpadmin.c:1652 msgid "-u deny:list Prevent the list of users or groups (@name) to print" msgstr "" -#: systemv/cancel.c:405 +#: systemv/cancel.c:406 msgid "-u owner Specify the owner to use for jobs" msgstr "" -#: tools/ippfind.c:2782 +#: tools/ippfind.c:2795 msgid "-u regex Match URI to regular expression" msgstr "" -#: systemv/cupstestppd.c:3865 tools/ippeveprinter.c:7949 tools/ipptool.c:4332 +#: systemv/cupstestppd.c:3865 tools/ippeveprinter.c:8374 tools/ipptool.c:4362 msgid "-v Be verbose" msgstr "" -#: systemv/lpinfo.c:503 +#: systemv/lpinfo.c:504 msgid "-v Show devices" msgstr "" -#: systemv/lpstat.c:2064 +#: systemv/lpstat.c:2065 msgid "-v [printer(s)] Show the devices for each destination" msgstr "" -#: systemv/lpadmin.c:1653 +#: systemv/lpadmin.c:1654 msgid "-v device-uri Specify the device URI for the printer" msgstr "" @@ -2661,7 +2744,7 @@ msgid "-vv Be very verbose" msgstr "" -#: systemv/cancel.c:407 +#: systemv/cancel.c:408 msgid "-x Purge jobs rather than just canceling" msgstr "" @@ -2669,29 +2752,29 @@ msgid "-x destination Remove default options for destination" msgstr "" -#: systemv/lpadmin.c:1654 +#: systemv/lpadmin.c:1655 msgid "-x destination Remove the named destination" msgstr "" -#: tools/ippfind.c:2783 +#: tools/ippfind.c:2796 msgid "" "-x utility [argument ...] ;\n" " Execute program if true" msgstr "" -#: cups/dest.c:1867 +#: cups/dest.c:1871 msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" -#: ppdc/sample.c:309 +#: ppdc/sample.c:316 msgid "0" msgstr "" -#: ppdc/sample.c:310 +#: ppdc/sample.c:317 msgid "1" msgstr "" -#: ppdc/sample.c:382 +#: ppdc/sample.c:389 msgid "1 inch/sec." msgstr "" @@ -2703,7 +2786,7 @@ msgid "1.25x2.25\"" msgstr "" -#: ppdc/sample.c:430 +#: ppdc/sample.c:437 msgid "1.5 inch/sec." msgstr "" @@ -2723,11 +2806,11 @@ msgid "1.50x2.00\"" msgstr "" -#: ppdc/sample.c:319 +#: ppdc/sample.c:326 msgid "10" msgstr "" -#: ppdc/sample.c:441 +#: ppdc/sample.c:448 msgid "10 inches/sec." msgstr "" @@ -2743,39 +2826,39 @@ msgid "10 x 14" msgstr "" -#: ppdc/sample.c:421 +#: ppdc/sample.c:428 msgid "100" msgstr "" -#: ppdc/sample.c:332 +#: ppdc/sample.c:339 msgid "100 mm/sec." msgstr "" -#: ppdc/sample.c:422 +#: ppdc/sample.c:429 msgid "105" msgstr "" -#: ppdc/sample.c:320 +#: ppdc/sample.c:327 msgid "11" msgstr "" -#: ppdc/sample.c:442 +#: ppdc/sample.c:449 msgid "11 inches/sec." msgstr "" -#: ppdc/sample.c:423 +#: ppdc/sample.c:430 msgid "110" msgstr "" -#: ppdc/sample.c:424 +#: ppdc/sample.c:431 msgid "115" msgstr "" -#: ppdc/sample.c:321 +#: ppdc/sample.c:328 msgid "12" msgstr "" -#: ppdc/sample.c:443 +#: ppdc/sample.c:450 msgid "12 inches/sec." msgstr "" @@ -2783,39 +2866,39 @@ msgid "12 x 11" msgstr "" -#: ppdc/sample.c:425 +#: ppdc/sample.c:432 msgid "120" msgstr "" -#: ppdc/sample.c:333 +#: ppdc/sample.c:340 msgid "120 mm/sec." msgstr "" -#: ppdc/sample.c:247 +#: ppdc/sample.c:254 msgid "120x60dpi" msgstr "" -#: ppdc/sample.c:253 +#: ppdc/sample.c:260 msgid "120x72dpi" msgstr "" -#: ppdc/sample.c:322 +#: ppdc/sample.c:329 msgid "13" msgstr "" -#: ppdc/sample.c:233 +#: ppdc/sample.c:240 msgid "136dpi" msgstr "" -#: ppdc/sample.c:323 +#: ppdc/sample.c:330 msgid "14" msgstr "" -#: ppdc/sample.c:324 +#: ppdc/sample.c:331 msgid "15" msgstr "" -#: ppdc/sample.c:326 +#: ppdc/sample.c:333 msgid "15 mm/sec." msgstr "" @@ -2823,187 +2906,187 @@ msgid "15 x 11" msgstr "" -#: ppdc/sample.c:334 +#: ppdc/sample.c:341 msgid "150 mm/sec." msgstr "" -#: ppdc/sample.c:281 +#: ppdc/sample.c:288 msgid "150dpi" msgstr "" -#: ppdc/sample.c:366 +#: ppdc/sample.c:373 msgid "16" msgstr "" -#: ppdc/sample.c:367 +#: ppdc/sample.c:374 msgid "17" msgstr "" -#: ppdc/sample.c:368 +#: ppdc/sample.c:375 msgid "18" msgstr "" -#: ppdc/sample.c:248 +#: ppdc/sample.c:255 msgid "180dpi" msgstr "" -#: ppdc/sample.c:369 +#: ppdc/sample.c:376 msgid "19" msgstr "" -#: ppdc/sample.c:311 +#: ppdc/sample.c:318 msgid "2" msgstr "" -#: ppdc/sample.c:383 +#: ppdc/sample.c:390 msgid "2 inches/sec." msgstr "" -#: cups/ppd-cache.c:3872 ppdc/sample.c:265 +#: cups/ppd-cache.c:3888 ppdc/sample.c:272 msgid "2-Sided Printing" msgstr "" -#: ppdc/sample.c:178 +#: ppdc/sample.c:179 msgid "2.00x0.37\"" msgstr "" -#: ppdc/sample.c:179 +#: ppdc/sample.c:180 msgid "2.00x0.50\"" msgstr "" -#: ppdc/sample.c:180 +#: ppdc/sample.c:181 msgid "2.00x1.00\"" msgstr "" -#: ppdc/sample.c:181 +#: ppdc/sample.c:182 msgid "2.00x1.25\"" msgstr "" -#: ppdc/sample.c:182 +#: ppdc/sample.c:183 msgid "2.00x2.00\"" msgstr "" -#: ppdc/sample.c:183 +#: ppdc/sample.c:184 msgid "2.00x3.00\"" msgstr "" -#: ppdc/sample.c:184 +#: ppdc/sample.c:185 msgid "2.00x4.00\"" msgstr "" -#: ppdc/sample.c:185 +#: ppdc/sample.c:186 msgid "2.00x5.50\"" msgstr "" -#: ppdc/sample.c:186 +#: ppdc/sample.c:187 msgid "2.25x0.50\"" msgstr "" -#: ppdc/sample.c:187 +#: ppdc/sample.c:188 msgid "2.25x1.25\"" msgstr "" -#: ppdc/sample.c:189 +#: ppdc/sample.c:190 msgid "2.25x4.00\"" msgstr "" -#: ppdc/sample.c:190 +#: ppdc/sample.c:191 msgid "2.25x5.50\"" msgstr "" -#: ppdc/sample.c:191 +#: ppdc/sample.c:192 msgid "2.38x5.50\"" msgstr "" -#: ppdc/sample.c:431 +#: ppdc/sample.c:438 msgid "2.5 inches/sec." msgstr "" -#: ppdc/sample.c:192 +#: ppdc/sample.c:193 msgid "2.50x1.00\"" msgstr "" -#: ppdc/sample.c:193 +#: ppdc/sample.c:194 msgid "2.50x2.00\"" msgstr "" -#: ppdc/sample.c:194 +#: ppdc/sample.c:195 msgid "2.75x1.25\"" msgstr "" -#: ppdc/sample.c:195 +#: ppdc/sample.c:196 msgid "2.9 x 1\"" msgstr "" -#: ppdc/sample.c:370 +#: ppdc/sample.c:377 msgid "20" msgstr "" -#: ppdc/sample.c:327 +#: ppdc/sample.c:334 msgid "20 mm/sec." msgstr "" -#: ppdc/sample.c:335 +#: ppdc/sample.c:342 msgid "200 mm/sec." msgstr "" -#: ppdc/sample.c:234 +#: ppdc/sample.c:241 msgid "203dpi" msgstr "" -#: ppdc/sample.c:371 +#: ppdc/sample.c:378 msgid "21" msgstr "" -#: ppdc/sample.c:372 +#: ppdc/sample.c:379 msgid "22" msgstr "" -#: ppdc/sample.c:373 +#: ppdc/sample.c:380 msgid "23" msgstr "" -#: ppdc/sample.c:374 +#: ppdc/sample.c:381 msgid "24" msgstr "" -#: ppdc/sample.c:245 +#: ppdc/sample.c:252 msgid "24-Pin Series" msgstr "" -#: ppdc/sample.c:254 +#: ppdc/sample.c:261 msgid "240x72dpi" msgstr "" -#: ppdc/sample.c:375 +#: ppdc/sample.c:382 msgid "25" msgstr "" -#: ppdc/sample.c:336 +#: ppdc/sample.c:343 msgid "250 mm/sec." msgstr "" -#: ppdc/sample.c:376 +#: ppdc/sample.c:383 msgid "26" msgstr "" -#: ppdc/sample.c:377 +#: ppdc/sample.c:384 msgid "27" msgstr "" -#: ppdc/sample.c:378 +#: ppdc/sample.c:385 msgid "28" msgstr "" -#: ppdc/sample.c:379 +#: ppdc/sample.c:386 msgid "29" msgstr "" -#: ppdc/sample.c:312 +#: ppdc/sample.c:319 msgid "3" msgstr "" -#: ppdc/sample.c:384 +#: ppdc/sample.c:391 msgid "3 inches/sec." msgstr "" @@ -3011,43 +3094,55 @@ msgid "3 x 5" msgstr "" -#: ppdc/sample.c:196 +#: ppdc/sample.c:197 msgid "3.00x1.00\"" msgstr "" -#: ppdc/sample.c:197 +#: ppdc/sample.c:198 msgid "3.00x1.25\"" msgstr "" -#: ppdc/sample.c:198 +#: ppdc/sample.c:199 msgid "3.00x2.00\"" msgstr "" -#: ppdc/sample.c:199 +#: ppdc/sample.c:200 msgid "3.00x3.00\"" msgstr "" -#: ppdc/sample.c:200 +#: ppdc/sample.c:201 +msgid "3.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:202 msgid "3.00x5.00\"" msgstr "" -#: ppdc/sample.c:201 +#: ppdc/sample.c:203 +msgid "3.00x6.00\"" +msgstr "" + +#: ppdc/sample.c:204 +msgid "3.00x8.00\"" +msgstr "" + +#: ppdc/sample.c:205 msgid "3.25x2.00\"" msgstr "" -#: ppdc/sample.c:202 +#: ppdc/sample.c:206 msgid "3.25x5.00\"" msgstr "" -#: ppdc/sample.c:203 +#: ppdc/sample.c:207 msgid "3.25x5.50\"" msgstr "" -#: ppdc/sample.c:204 +#: ppdc/sample.c:208 msgid "3.25x5.83\"" msgstr "" -#: ppdc/sample.c:205 +#: ppdc/sample.c:209 msgid "3.25x7.83\"" msgstr "" @@ -3059,103 +3154,107 @@ msgid "3.5\" Disk" msgstr "" -#: ppdc/sample.c:206 +#: ppdc/sample.c:210 msgid "3.50x1.00\"" msgstr "" -#: ppdc/sample.c:380 +#: ppdc/sample.c:387 msgid "30" msgstr "" -#: ppdc/sample.c:328 +#: ppdc/sample.c:335 msgid "30 mm/sec." msgstr "" -#: ppdc/sample.c:337 +#: ppdc/sample.c:344 msgid "300 mm/sec." msgstr "" -#: ppdc/sample.c:235 +#: ppdc/sample.c:242 msgid "300dpi" msgstr "" -#: ppdc/sample.c:188 +#: ppdc/sample.c:189 msgid "30859 Paint Can Label" msgstr "" -#: ppdc/sample.c:408 +#: ppdc/sample.c:415 msgid "35" msgstr "" -#: ppdc/sample.c:250 +#: ppdc/sample.c:257 msgid "360dpi" msgstr "" -#: ppdc/sample.c:249 +#: ppdc/sample.c:256 msgid "360x180dpi" msgstr "" -#: ppdc/sample.c:313 +#: ppdc/sample.c:320 msgid "4" msgstr "" -#: ppdc/sample.c:385 +#: ppdc/sample.c:392 msgid "4 inches/sec." msgstr "" -#: ppdc/sample.c:207 +#: ppdc/sample.c:211 msgid "4.00x1.00\"" msgstr "" -#: ppdc/sample.c:215 +#: ppdc/sample.c:220 msgid "4.00x13.00\"" msgstr "" -#: ppdc/sample.c:208 +#: ppdc/sample.c:212 msgid "4.00x2.00\"" msgstr "" -#: ppdc/sample.c:209 +#: ppdc/sample.c:213 msgid "4.00x2.50\"" msgstr "" -#: ppdc/sample.c:210 +#: ppdc/sample.c:214 msgid "4.00x3.00\"" msgstr "" -#: ppdc/sample.c:211 +#: ppdc/sample.c:215 msgid "4.00x4.00\"" msgstr "" -#: ppdc/sample.c:212 +#: ppdc/sample.c:216 msgid "4.00x5.00\"" msgstr "" -#: ppdc/sample.c:213 +#: ppdc/sample.c:217 msgid "4.00x6.00\"" msgstr "" -#: ppdc/sample.c:214 +#: ppdc/sample.c:218 msgid "4.00x6.50\"" msgstr "" -#: ppdc/sample.c:409 +#: ppdc/sample.c:219 +msgid "4.00x8.00\"" +msgstr "" + +#: ppdc/sample.c:416 msgid "40" msgstr "" -#: ppdc/sample.c:329 +#: ppdc/sample.c:336 msgid "40 mm/sec." msgstr "" -#: ppdc/sample.c:410 +#: ppdc/sample.c:417 msgid "45" msgstr "" -#: ppdc/sample.c:314 +#: ppdc/sample.c:321 msgid "5" msgstr "" -#: ppdc/sample.c:435 +#: ppdc/sample.c:442 msgid "5 inches/sec." msgstr "" @@ -3163,79 +3262,83 @@ msgid "5 x 7" msgstr "" -#: ppdc/sample.c:411 +#: ppdc/sample.c:418 msgid "50" msgstr "" -#: ppdc/sample.c:412 +#: ppdc/sample.c:419 msgid "55" msgstr "" -#: ppdc/sample.c:315 +#: ppdc/sample.c:322 msgid "6" msgstr "" -#: ppdc/sample.c:436 +#: ppdc/sample.c:443 msgid "6 inches/sec." msgstr "" -#: ppdc/sample.c:216 +#: ppdc/sample.c:221 msgid "6.00x1.00\"" msgstr "" -#: ppdc/sample.c:217 +#: ppdc/sample.c:222 msgid "6.00x2.00\"" msgstr "" -#: ppdc/sample.c:218 +#: ppdc/sample.c:223 msgid "6.00x3.00\"" msgstr "" -#: ppdc/sample.c:219 +#: ppdc/sample.c:224 msgid "6.00x4.00\"" msgstr "" -#: ppdc/sample.c:220 +#: ppdc/sample.c:225 msgid "6.00x5.00\"" msgstr "" -#: ppdc/sample.c:221 +#: ppdc/sample.c:226 msgid "6.00x6.00\"" msgstr "" -#: ppdc/sample.c:222 +#: ppdc/sample.c:227 msgid "6.00x6.50\"" msgstr "" -#: ppdc/sample.c:413 +#: ppdc/sample.c:228 +msgid "6.00x8.00\"" +msgstr "" + +#: ppdc/sample.c:420 msgid "60" msgstr "" -#: ppdc/sample.c:330 +#: ppdc/sample.c:337 msgid "60 mm/sec." msgstr "" -#: ppdc/sample.c:257 +#: ppdc/sample.c:264 msgid "600dpi" msgstr "" -#: ppdc/sample.c:246 +#: ppdc/sample.c:253 msgid "60dpi" msgstr "" -#: ppdc/sample.c:252 +#: ppdc/sample.c:259 msgid "60x72dpi" msgstr "" -#: ppdc/sample.c:414 +#: ppdc/sample.c:421 msgid "65" msgstr "" -#: ppdc/sample.c:316 +#: ppdc/sample.c:323 msgid "7" msgstr "" -#: ppdc/sample.c:438 +#: ppdc/sample.c:445 msgid "7 inches/sec." msgstr "" @@ -3243,19 +3346,19 @@ msgid "7 x 9" msgstr "" -#: ppdc/sample.c:415 +#: ppdc/sample.c:422 msgid "70" msgstr "" -#: ppdc/sample.c:416 +#: ppdc/sample.c:423 msgid "75" msgstr "" -#: ppdc/sample.c:317 +#: ppdc/sample.c:324 msgid "8" msgstr "" -#: ppdc/sample.c:439 +#: ppdc/sample.c:446 msgid "8 inches/sec." msgstr "" @@ -3263,51 +3366,59 @@ msgid "8 x 10" msgstr "" -#: ppdc/sample.c:223 +#: ppdc/sample.c:229 msgid "8.00x1.00\"" msgstr "" -#: ppdc/sample.c:224 +#: ppdc/sample.c:230 msgid "8.00x2.00\"" msgstr "" -#: ppdc/sample.c:225 +#: ppdc/sample.c:231 msgid "8.00x3.00\"" msgstr "" -#: ppdc/sample.c:226 +#: ppdc/sample.c:232 msgid "8.00x4.00\"" msgstr "" -#: ppdc/sample.c:227 +#: ppdc/sample.c:233 msgid "8.00x5.00\"" msgstr "" -#: ppdc/sample.c:228 +#: ppdc/sample.c:234 msgid "8.00x6.00\"" msgstr "" -#: ppdc/sample.c:229 +#: ppdc/sample.c:235 msgid "8.00x6.50\"" msgstr "" -#: ppdc/sample.c:417 +#: ppdc/sample.c:236 +msgid "8.26x1.00\"" +msgstr "" + +#: ppdc/sample.c:424 msgid "80" msgstr "" -#: ppdc/sample.c:331 +#: ppdc/sample.c:338 msgid "80 mm/sec." msgstr "" -#: ppdc/sample.c:418 +#: ppdc/sample.c:178 +msgid "80x50mm" +msgstr "" + +#: ppdc/sample.c:425 msgid "85" msgstr "" -#: ppdc/sample.c:318 +#: ppdc/sample.c:325 msgid "9" msgstr "" -#: ppdc/sample.c:440 +#: ppdc/sample.c:447 msgid "9 inches/sec." msgstr "" @@ -3319,15 +3430,15 @@ msgid "9 x 12" msgstr "" -#: ppdc/sample.c:251 +#: ppdc/sample.c:258 msgid "9-Pin Series" msgstr "" -#: ppdc/sample.c:419 +#: ppdc/sample.c:426 msgid "90" msgstr "" -#: ppdc/sample.c:420 +#: ppdc/sample.c:427 msgid "95" msgstr "" @@ -3335,12 +3446,12 @@ msgid "?Invalid help command unknown." msgstr "" -#: scheduler/ipp.c:2283 +#: scheduler/ipp.c:2284 #, c-format msgid "A class named \"%s\" already exists." msgstr "" -#: scheduler/ipp.c:890 +#: scheduler/ipp.c:891 #, c-format msgid "A printer named \"%s\" already exists." msgstr "" @@ -3485,7 +3596,7 @@ msgid "Accept Jobs" msgstr "" -#: cups/http-support.c:1499 +#: cups/http-support.c:1508 msgid "Accepted" msgstr "" @@ -3501,11 +3612,11 @@ msgid "Address" msgstr "" -#: cgi-bin/admin.c:172 cgi-bin/admin.c:246 cgi-bin/admin.c:2249 +#: cgi-bin/admin.c:172 cgi-bin/admin.c:246 cgi-bin/admin.c:2256 msgid "Administration" msgstr "" -#: ppdc/sample.c:427 +#: ppdc/sample.c:434 msgid "Always" msgstr "" @@ -3513,26 +3624,26 @@ msgid "AppSocket/HP JetDirect" msgstr "" -#: ppdc/sample.c:448 +#: ppdc/sample.c:455 msgid "Applicator" msgstr "" -#: scheduler/ipp.c:987 +#: scheduler/ipp.c:988 #, c-format msgid "Attempt to set %s printer-state to bad value %d." msgstr "" -#: scheduler/ipp.c:5422 scheduler/ipp.c:5448 +#: scheduler/ipp.c:5426 scheduler/ipp.c:5452 #, c-format msgid "Attribute \"%s\" is in the wrong group." msgstr "" -#: scheduler/ipp.c:5424 scheduler/ipp.c:5450 +#: scheduler/ipp.c:5428 scheduler/ipp.c:5454 #, c-format msgid "Attribute \"%s\" is the wrong value type." msgstr "" -#: scheduler/ipp.c:227 +#: scheduler/ipp.c:228 #, c-format msgid "Attribute groups are out of order (%x < %x)." msgstr "" @@ -3585,38 +3696,38 @@ msgid "B9" msgstr "" -#: scheduler/ipp.c:7504 +#: scheduler/ipp.c:7508 #, c-format msgid "Bad \"printer-id\" value %d." msgstr "" -#: scheduler/ipp.c:10336 +#: scheduler/ipp.c:10340 #, c-format msgid "Bad '%s' value." msgstr "" -#: scheduler/ipp.c:11284 +#: scheduler/ipp.c:11281 #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "" -#: cups/ppd.c:307 +#: cups/ppd.c:308 msgid "Bad CloseUI/JCLCloseUI" msgstr "" -#: cups/dest.c:1661 +#: cups/dest.c:1662 msgid "Bad NULL dests pointer" msgstr "" -#: cups/ppd.c:290 +#: cups/ppd.c:291 msgid "Bad OpenGroup" msgstr "" -#: cups/ppd.c:292 +#: cups/ppd.c:293 msgid "Bad OpenUI/JCLOpenUI" msgstr "" -#: cups/ppd.c:294 +#: cups/ppd.c:295 msgid "Bad OrderDependency" msgstr "" @@ -3633,11 +3744,11 @@ msgid "Bad PPD cache file." msgstr "" -#: scheduler/ipp.c:2659 +#: scheduler/ipp.c:2660 msgid "Bad PPD file." msgstr "" -#: cups/http-support.c:1517 +#: cups/http-support.c:1526 msgid "Bad Request" msgstr "" @@ -3645,43 +3756,43 @@ msgid "Bad SNMP version number" msgstr "" -#: cups/ppd.c:295 +#: cups/ppd.c:296 msgid "Bad UIConstraints" msgstr "" -#: cups/dest.c:1195 +#: cups/dest.c:1196 msgid "Bad URI." msgstr "" -#: cups/hash.c:49 cups/http-support.c:1611 +#: cups/hash.c:49 cups/http-support.c:1620 msgid "Bad arguments to function" msgstr "" -#: scheduler/ipp.c:1372 +#: scheduler/ipp.c:1373 #, c-format msgid "Bad copies value %d." msgstr "" -#: cups/ppd.c:303 +#: cups/ppd.c:304 msgid "Bad custom parameter" msgstr "" -#: cups/http-support.c:1751 scheduler/ipp.c:2365 +#: cups/http-support.c:1760 scheduler/ipp.c:2366 #, c-format msgid "Bad device-uri \"%s\"." msgstr "" -#: scheduler/ipp.c:2410 +#: scheduler/ipp.c:2411 #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "" -#: scheduler/ipp.c:8486 scheduler/ipp.c:8504 scheduler/ipp.c:9732 +#: scheduler/ipp.c:8490 scheduler/ipp.c:8508 scheduler/ipp.c:9736 #, c-format msgid "Bad document-format \"%s\"." msgstr "" -#: scheduler/ipp.c:9750 +#: scheduler/ipp.c:9754 #, c-format msgid "Bad document-format-default \"%s\"." msgstr "" @@ -3690,126 +3801,126 @@ msgid "Bad filename buffer" msgstr "" -#: cups/http-support.c:1620 +#: cups/http-support.c:1629 msgid "Bad hostname/address in URI" msgstr "" -#: scheduler/ipp.c:1554 +#: scheduler/ipp.c:1555 #, c-format msgid "Bad job-name value: %s" msgstr "" -#: scheduler/ipp.c:1540 +#: scheduler/ipp.c:1541 msgid "Bad job-name value: Wrong type or count." msgstr "" -#: scheduler/ipp.c:10374 +#: scheduler/ipp.c:10378 msgid "Bad job-priority value." msgstr "" -#: scheduler/ipp.c:1402 +#: scheduler/ipp.c:1403 #, c-format msgid "Bad job-sheets value \"%s\"." msgstr "" -#: scheduler/ipp.c:1386 +#: scheduler/ipp.c:1387 msgid "Bad job-sheets value type." msgstr "" -#: scheduler/ipp.c:10404 +#: scheduler/ipp.c:10408 msgid "Bad job-state value." msgstr "" -#: scheduler/ipp.c:3006 scheduler/ipp.c:3468 scheduler/ipp.c:6253 -#: scheduler/ipp.c:6400 scheduler/ipp.c:7912 scheduler/ipp.c:8184 -#: scheduler/ipp.c:9050 scheduler/ipp.c:9274 scheduler/ipp.c:9626 -#: scheduler/ipp.c:10235 +#: scheduler/ipp.c:3007 scheduler/ipp.c:3469 scheduler/ipp.c:6257 +#: scheduler/ipp.c:6404 scheduler/ipp.c:7916 scheduler/ipp.c:8188 +#: scheduler/ipp.c:9054 scheduler/ipp.c:9278 scheduler/ipp.c:9630 +#: scheduler/ipp.c:10239 #, c-format msgid "Bad job-uri \"%s\"." msgstr "" -#: scheduler/ipp.c:2049 scheduler/ipp.c:5773 +#: scheduler/ipp.c:2050 scheduler/ipp.c:5777 #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "" -#: scheduler/ipp.c:2014 scheduler/ipp.c:5737 +#: scheduler/ipp.c:2015 scheduler/ipp.c:5741 #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "" -#: scheduler/ipp.c:5848 +#: scheduler/ipp.c:5852 #, c-format msgid "Bad notify-user-data \"%s\"." msgstr "" -#: scheduler/ipp.c:1418 +#: scheduler/ipp.c:1419 #, c-format msgid "Bad number-up value %d." msgstr "" -#: scheduler/ipp.c:1435 +#: scheduler/ipp.c:1436 #, c-format msgid "Bad page-ranges values %d-%d." msgstr "" -#: cups/http-support.c:1617 +#: cups/http-support.c:1626 msgid "Bad port number in URI" msgstr "" -#: scheduler/ipp.c:2456 +#: scheduler/ipp.c:2457 #, c-format msgid "Bad port-monitor \"%s\"." msgstr "" -#: scheduler/ipp.c:2537 +#: scheduler/ipp.c:2538 #, c-format msgid "Bad printer-state value %d." msgstr "" -#: cups/dest.c:678 cups/dest.c:1245 +#: cups/dest.c:679 cups/dest.c:1246 msgid "Bad printer-uri." msgstr "" -#: scheduler/ipp.c:201 +#: scheduler/ipp.c:202 #, c-format msgid "Bad request ID %d." msgstr "" -#: scheduler/ipp.c:191 +#: scheduler/ipp.c:192 #, c-format msgid "Bad request version number %d.%d." msgstr "" -#: cups/http-support.c:1614 +#: cups/http-support.c:1623 msgid "Bad resource in URI" msgstr "" -#: cups/http-support.c:1626 +#: cups/http-support.c:1635 msgid "Bad scheme in URI" msgstr "" -#: cups/http-support.c:1623 +#: cups/http-support.c:1632 msgid "Bad username in URI" msgstr "" -#: cups/ppd.c:305 +#: cups/ppd.c:306 msgid "Bad value string" msgstr "" -#: cups/http-support.c:1629 +#: cups/http-support.c:1638 msgid "Bad/empty URI" msgstr "" -#: cgi-bin/admin.c:2794 cgi-bin/admin.c:3043 +#: cgi-bin/admin.c:2801 cgi-bin/admin.c:3050 msgid "Banners" msgstr "" -#: ppdc/sample.c:285 +#: ppdc/sample.c:292 msgid "Bond Paper" msgstr "" -#: cups/ppd-cache.c:4277 +#: cups/ppd-cache.c:4293 msgid "Booklet" msgstr "" @@ -3822,11 +3933,11 @@ msgid "Buffer overflow detected, aborting." msgstr "" -#: ppdc/sample.c:280 +#: ppdc/sample.c:287 msgid "CMYK" msgstr "" -#: ppdc/sample.c:361 +#: ppdc/sample.c:368 msgid "CPCL Label Printer" msgstr "" @@ -3834,28 +3945,28 @@ msgid "Cancel Jobs" msgstr "" -#: backend/ipp.c:2295 +#: backend/ipp.c:2296 msgid "Canceling print job." msgstr "" -#: scheduler/ipp.c:963 scheduler/ipp.c:2512 +#: scheduler/ipp.c:964 scheduler/ipp.c:2513 msgid "Cannot change printer-is-shared for remote queues." msgstr "" -#: scheduler/ipp.c:2499 +#: scheduler/ipp.c:2500 msgid "Cannot share a remote Kerberized printer." msgstr "" -#: ppdc/sample.c:274 +#: ppdc/sample.c:281 msgid "Cassette" msgstr "" -#: cgi-bin/admin.c:1347 cgi-bin/admin.c:1489 cgi-bin/admin.c:1502 -#: cgi-bin/admin.c:1513 +#: cgi-bin/admin.c:1354 cgi-bin/admin.c:1496 cgi-bin/admin.c:1509 +#: cgi-bin/admin.c:1520 msgid "Change Settings" msgstr "" -#: scheduler/ipp.c:2061 scheduler/ipp.c:5785 +#: scheduler/ipp.c:2062 scheduler/ipp.c:5789 #, c-format msgid "Character set \"%s\" not supported." msgstr "" @@ -3868,15 +3979,15 @@ msgid "Clean Print Heads" msgstr "" -#: scheduler/ipp.c:3920 +#: scheduler/ipp.c:3921 msgid "Close-Job doesn't support the job-uri attribute." msgstr "" -#: cups/ppd-cache.c:3790 ppdc/sample.c:279 +#: cups/ppd-cache.c:3801 ppdc/sample.c:286 msgid "Color" msgstr "" -#: cups/ppd-cache.c:3751 ppdc/sample.c:277 +#: cups/ppd-cache.c:3762 ppdc/sample.c:284 msgid "Color Mode" msgstr "" @@ -3899,11 +4010,11 @@ msgid "Connecting to printer." msgstr "" -#: cups/http-support.c:1487 +#: cups/http-support.c:1496 msgid "Continue" msgstr "" -#: ppdc/sample.c:363 +#: ppdc/sample.c:370 msgid "Continuous" msgstr "" @@ -3915,47 +4026,47 @@ msgid "Copying print data." msgstr "" -#: cups/http-support.c:1496 +#: cups/http-support.c:1505 msgid "Created" msgstr "" -#: cups/tls-darwin.c:723 cups/tls-gnutls.c:582 +#: cups/tls-darwin.c:723 cups/tls-gnutls.c:583 msgid "Credentials do not validate against site CA certificate." msgstr "" -#: cups/tls-darwin.c:734 cups/tls-gnutls.c:599 +#: cups/tls-darwin.c:734 cups/tls-gnutls.c:600 msgid "Credentials have expired." msgstr "" -#: cups/ppd.c:1133 cups/ppd.c:1173 cups/ppd.c:1382 cups/ppd.c:1485 +#: cups/ppd.c:1134 cups/ppd.c:1174 cups/ppd.c:1383 cups/ppd.c:1486 msgid "Custom" msgstr "" -#: ppdc/sample.c:357 +#: ppdc/sample.c:364 msgid "CustominCutInterval" msgstr "" -#: ppdc/sample.c:355 +#: ppdc/sample.c:362 msgid "CustominTearInterval" msgstr "" -#: cups/ppd-cache.c:4312 ppdc/sample.c:341 +#: cups/ppd-cache.c:4328 ppdc/sample.c:348 msgid "Cut" msgstr "" -#: ppdc/sample.c:449 +#: ppdc/sample.c:456 msgid "Cutter" msgstr "" -#: ppdc/sample.c:230 +#: ppdc/sample.c:237 msgid "DYMO" msgstr "" -#: ppdc/sample.c:243 +#: ppdc/sample.c:250 msgid "Dark" msgstr "" -#: ppdc/sample.c:239 +#: ppdc/sample.c:246 msgid "Darkness" msgstr "" @@ -3963,44 +4074,44 @@ msgid "Data file sent successfully." msgstr "" -#: cups/ppd-cache.c:3798 cups/ppd-cache.c:3807 +#: cups/ppd-cache.c:3814 cups/ppd-cache.c:3823 msgid "Deep Color" msgstr "" -#: cups/ppd-cache.c:3784 +#: cups/ppd-cache.c:3795 msgid "Deep Gray" msgstr "" -#: cgi-bin/admin.c:1786 cgi-bin/admin.c:1797 cgi-bin/admin.c:1842 +#: cgi-bin/admin.c:1793 cgi-bin/admin.c:1804 cgi-bin/admin.c:1849 msgid "Delete Class" msgstr "" -#: cgi-bin/admin.c:1871 cgi-bin/admin.c:1882 cgi-bin/admin.c:1927 +#: cgi-bin/admin.c:1878 cgi-bin/admin.c:1889 cgi-bin/admin.c:1934 msgid "Delete Printer" msgstr "" -#: ppdc/sample.c:276 +#: ppdc/sample.c:283 msgid "DeskJet Series" msgstr "" -#: scheduler/ipp.c:1301 +#: scheduler/ipp.c:1302 #, c-format msgid "Destination \"%s\" is not accepting jobs." msgstr "" -#: cups/ppd-cache.c:3828 cups/ppd-cache.c:3834 +#: cups/ppd-cache.c:3844 cups/ppd-cache.c:3850 msgid "Device CMYK" msgstr "" -#: cups/ppd-cache.c:3816 cups/ppd-cache.c:3822 +#: cups/ppd-cache.c:3832 cups/ppd-cache.c:3838 msgid "Device Gray" msgstr "" -#: cups/ppd-cache.c:3840 cups/ppd-cache.c:3846 +#: cups/ppd-cache.c:3856 cups/ppd-cache.c:3862 msgid "Device RGB" msgstr "" -#: systemv/lpinfo.c:273 +#: systemv/lpinfo.c:274 #, c-format msgid "" "Device: uri = %s\n" @@ -4011,7 +4122,7 @@ " location = %s" msgstr "" -#: ppdc/sample.c:434 +#: ppdc/sample.c:441 msgid "Direct Thermal Media" msgstr "" @@ -4040,44 +4151,44 @@ msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" -#: ppdc/sample.c:343 +#: ppdc/sample.c:350 msgid "Disabled" msgstr "" -#: scheduler/ipp.c:6302 +#: scheduler/ipp.c:6306 #, c-format msgid "Document #%d does not exist in job #%d." msgstr "" -#: cups/ppd-cache.c:4471 cups/ppd-cache.c:4473 cups/ppd-cache.c:4536 -#: cups/ppd-cache.c:4573 +#: cups/ppd-cache.c:4487 cups/ppd-cache.c:4489 cups/ppd-cache.c:4552 +#: cups/ppd-cache.c:4589 msgid "Draft" msgstr "" -#: ppdc/sample.c:270 +#: ppdc/sample.c:277 msgid "Duplexer" msgstr "" -#: ppdc/sample.c:429 +#: ppdc/sample.c:436 msgid "EPL1 Label Printer" msgstr "" -#: ppdc/sample.c:432 +#: ppdc/sample.c:439 msgid "EPL2 Label Printer" msgstr "" -#: cgi-bin/admin.c:1541 cgi-bin/admin.c:1553 cgi-bin/admin.c:1607 -#: cgi-bin/admin.c:1614 cgi-bin/admin.c:1649 cgi-bin/admin.c:1662 -#: cgi-bin/admin.c:1686 cgi-bin/admin.c:1759 +#: cgi-bin/admin.c:1548 cgi-bin/admin.c:1560 cgi-bin/admin.c:1614 +#: cgi-bin/admin.c:1621 cgi-bin/admin.c:1656 cgi-bin/admin.c:1669 +#: cgi-bin/admin.c:1693 cgi-bin/admin.c:1766 msgid "Edit Configuration File" msgstr "" -#: cups/http.c:4649 +#: cups/http.c:4650 msgid "Encryption is not supported." msgstr "" #. TRANSLATORS: Banner/cover sheet after the print job. -#: cgi-bin/admin.c:3068 +#: cgi-bin/admin.c:3075 msgid "Ending Banner" msgstr "" @@ -4085,7 +4196,7 @@ msgid "English" msgstr "" -#: scheduler/client.c:1981 +#: scheduler/client.c:1982 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 "" @@ -4177,7 +4288,7 @@ msgid "Envelope DL" msgstr "" -#: ppdc/sample.c:264 +#: ppdc/sample.c:271 msgid "Envelope Feed" msgstr "" @@ -4301,28 +4412,28 @@ msgid "Envelope You4 Long Edge" msgstr "" -#: tools/ippfind.c:2822 +#: tools/ippfind.c:2836 msgid "Environment Variables:" msgstr "" -#: ppdc/sample.c:244 +#: ppdc/sample.c:251 msgid "Epson" msgstr "" -#: cgi-bin/admin.c:3111 +#: cgi-bin/admin.c:3118 msgid "Error Policy" msgstr "" -#: filter/rastertopwg.c:452 +#: filter/rastertopwg.c:467 msgid "Error reading raster data." msgstr "" -#: filter/rastertopwg.c:421 filter/rastertopwg.c:442 filter/rastertopwg.c:460 -#: filter/rastertopwg.c:471 +#: filter/rastertopwg.c:436 filter/rastertopwg.c:457 filter/rastertopwg.c:475 +#: filter/rastertopwg.c:486 msgid "Error sending raster data." msgstr "" -#: systemv/lpinfo.c:208 systemv/lpmove.c:85 +#: systemv/lpinfo.c:209 systemv/lpmove.c:86 msgid "Error: need hostname after \"-h\" option." msgstr "" @@ -4334,43 +4445,43 @@ msgid "European Fanfold Legal" msgstr "" -#: ppdc/sample.c:353 +#: ppdc/sample.c:360 msgid "Every 10 Labels" msgstr "" -#: ppdc/sample.c:345 +#: ppdc/sample.c:352 msgid "Every 2 Labels" msgstr "" -#: ppdc/sample.c:346 +#: ppdc/sample.c:353 msgid "Every 3 Labels" msgstr "" -#: ppdc/sample.c:347 +#: ppdc/sample.c:354 msgid "Every 4 Labels" msgstr "" -#: ppdc/sample.c:348 +#: ppdc/sample.c:355 msgid "Every 5 Labels" msgstr "" -#: ppdc/sample.c:349 +#: ppdc/sample.c:356 msgid "Every 6 Labels" msgstr "" -#: ppdc/sample.c:350 +#: ppdc/sample.c:357 msgid "Every 7 Labels" msgstr "" -#: ppdc/sample.c:351 +#: ppdc/sample.c:358 msgid "Every 8 Labels" msgstr "" -#: ppdc/sample.c:352 +#: ppdc/sample.c:359 msgid "Every 9 Labels" msgstr "" -#: ppdc/sample.c:344 +#: ppdc/sample.c:351 msgid "Every Label" msgstr "" @@ -4378,15 +4489,15 @@ msgid "Executive" msgstr "" -#: cups/http-support.c:1545 +#: cups/http-support.c:1554 msgid "Expectation Failed" msgstr "" -#: tools/ippfind.c:2771 +#: tools/ippfind.c:2783 msgid "Expressions:" msgstr "" -#: cups/ppd-cache.c:3758 +#: cups/ppd-cache.c:3769 msgid "Fast Grayscale" msgstr "" @@ -4419,7 +4530,7 @@ msgid "File Folder" msgstr "" -#: scheduler/ipp.c:2386 +#: scheduler/ipp.c:2387 #, c-format msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"." msgstr "" @@ -4430,11 +4541,11 @@ msgid "Finished page %d." msgstr "" -#: cups/ppd-cache.c:4359 +#: cups/ppd-cache.c:4375 msgid "Finishing Preset" msgstr "" -#: cups/ppd-cache.c:4134 +#: cups/ppd-cache.c:4150 msgid "Fold" msgstr "" @@ -4442,19 +4553,19 @@ msgid "Folio" msgstr "" -#: cups/http-support.c:1524 +#: cups/http-support.c:1533 msgid "Forbidden" msgstr "" -#: cups/http-support.c:1508 +#: cups/http-support.c:1517 msgid "Found" msgstr "" -#: cups/ppd.c:757 cups/ppd.c:1286 +#: cups/ppd.c:758 cups/ppd.c:1287 msgid "General" msgstr "" -#: ppdc/sample.c:255 +#: ppdc/sample.c:262 msgid "Generic" msgstr "" @@ -4462,22 +4573,26 @@ msgid "Get-Response-PDU uses indefinite length" msgstr "" -#: ppdc/sample.c:288 +#: ppdc/sample.c:295 msgid "Glossy Paper" msgstr "" -#: scheduler/ipp.c:2984 scheduler/ipp.c:3394 scheduler/ipp.c:3932 -#: scheduler/ipp.c:6231 scheduler/ipp.c:6378 scheduler/ipp.c:7889 -#: scheduler/ipp.c:9028 scheduler/ipp.c:9252 scheduler/ipp.c:9604 -#: scheduler/ipp.c:10213 +#: scheduler/ipp.c:2985 scheduler/ipp.c:3395 scheduler/ipp.c:3933 +#: scheduler/ipp.c:6235 scheduler/ipp.c:6382 scheduler/ipp.c:7893 +#: scheduler/ipp.c:9032 scheduler/ipp.c:9256 scheduler/ipp.c:9608 +#: scheduler/ipp.c:10217 msgid "Got a printer-uri attribute but no job-id." msgstr "" -#: cups/ppd-cache.c:3767 cups/ppd-cache.c:3778 ppdc/sample.c:278 +#: cups/ppd-cache.c:3808 +msgid "GrayScale" +msgstr "" + +#: cups/ppd-cache.c:3778 cups/ppd-cache.c:3789 ppdc/sample.c:285 msgid "Grayscale" msgstr "" -#: ppdc/sample.c:275 +#: ppdc/sample.c:282 msgid "HP" msgstr "" @@ -4493,133 +4608,133 @@ msgid "Help file not in index." msgstr "" -#: cups/ppd-cache.c:4478 cups/ppd-cache.c:4547 cups/ppd-cache.c:4578 +#: cups/ppd-cache.c:4494 cups/ppd-cache.c:4563 cups/ppd-cache.c:4594 msgid "High" msgstr "" -#: cups/ipp.c:3094 cups/ipp.c:3121 cups/ipp.c:3144 +#: cups/ipp.c:3095 cups/ipp.c:3122 cups/ipp.c:3145 msgid "IPP 1setOf attribute with incompatible value tags." msgstr "" -#: cups/ipp.c:3057 +#: cups/ipp.c:3058 msgid "IPP attribute has no name." msgstr "" -#: cups/ipp.c:6802 +#: cups/ipp.c:6804 msgid "IPP attribute is not a member of the message." msgstr "" -#: cups/ipp.c:3507 +#: cups/ipp.c:3509 msgid "IPP begCollection value not 0 bytes." msgstr "" -#: cups/ipp.c:3285 +#: cups/ipp.c:3286 msgid "IPP boolean value not 1 byte." msgstr "" -#: cups/ipp.c:3350 +#: cups/ipp.c:3351 msgid "IPP date value not 11 bytes." msgstr "" -#: cups/ipp.c:3528 +#: cups/ipp.c:3530 msgid "IPP endCollection value not 0 bytes." msgstr "" -#: cups/ipp.c:3260 +#: cups/ipp.c:3261 msgid "IPP enum value not 4 bytes." msgstr "" -#: cups/ipp.c:2975 +#: cups/ipp.c:2976 msgid "IPP extension tag larger than 0x7FFFFFFF." msgstr "" -#: cups/ipp.c:3257 +#: cups/ipp.c:3258 msgid "IPP integer value not 4 bytes." msgstr "" -#: cups/ipp.c:3460 +#: cups/ipp.c:3462 msgid "IPP language length overflows value." msgstr "" -#: cups/ipp.c:3469 +#: cups/ipp.c:3471 msgid "IPP language length too large." msgstr "" -#: cups/ipp.c:3171 +#: cups/ipp.c:3172 msgid "IPP member name is not empty." msgstr "" -#: cups/ipp.c:3554 +#: cups/ipp.c:3556 msgid "IPP memberName value is empty." msgstr "" -#: cups/ipp.c:3546 +#: cups/ipp.c:3548 msgid "IPP memberName with no attribute." msgstr "" -#: cups/ipp.c:3035 +#: cups/ipp.c:3036 msgid "IPP name larger than 32767 bytes." msgstr "" -#: cups/ipp.c:3427 +#: cups/ipp.c:3428 msgid "IPP nameWithLanguage value less than minimum 4 bytes." msgstr "" -#: cups/ipp.c:3585 +#: cups/ipp.c:3587 msgid "IPP octetString length too large." msgstr "" -#: cups/ipp.c:3395 +#: cups/ipp.c:3396 msgid "IPP rangeOfInteger value not 8 bytes." msgstr "" -#: cups/ipp.c:3368 +#: cups/ipp.c:3369 msgid "IPP resolution value not 9 bytes." msgstr "" -#: cups/ipp.c:3487 +#: cups/ipp.c:3489 msgid "IPP string length overflows value." msgstr "" -#: cups/ipp.c:3423 +#: cups/ipp.c:3424 msgid "IPP textWithLanguage value less than minimum 4 bytes." msgstr "" -#: cups/ipp.c:3243 +#: cups/ipp.c:3244 msgid "IPP value larger than 32767 bytes." msgstr "" -#: tools/ippfind.c:2823 +#: tools/ippfind.c:2837 msgid "IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" -#: tools/ippfind.c:2824 +#: tools/ippfind.c:2838 msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" -#: tools/ippfind.c:2826 +#: tools/ippfind.c:2840 msgid "IPPFIND_SERVICE_NAME Service instance name" msgstr "" -#: tools/ippfind.c:2827 +#: tools/ippfind.c:2841 msgid "IPPFIND_SERVICE_PORT Port number" msgstr "" -#: tools/ippfind.c:2828 +#: tools/ippfind.c:2842 msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" -#: tools/ippfind.c:2829 +#: tools/ippfind.c:2843 msgid "IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" -#: tools/ippfind.c:2830 +#: tools/ippfind.c:2844 msgid "IPPFIND_SERVICE_URI URI" msgstr "" -#: tools/ippfind.c:2831 +#: tools/ippfind.c:2845 msgid "IPPFIND_TXT_* Value of TXT record key" msgstr "" @@ -4627,47 +4742,47 @@ msgid "ISOLatin1" msgstr "" -#: cups/ppd.c:298 +#: cups/ppd.c:299 msgid "Illegal control character" msgstr "" -#: cups/ppd.c:299 +#: cups/ppd.c:300 msgid "Illegal main keyword string" msgstr "" -#: cups/ppd.c:300 +#: cups/ppd.c:301 msgid "Illegal option keyword string" msgstr "" -#: cups/ppd.c:301 +#: cups/ppd.c:302 msgid "Illegal translation string" msgstr "" -#: cups/ppd.c:302 +#: cups/ppd.c:303 msgid "Illegal whitespace character" msgstr "" -#: ppdc/sample.c:269 +#: ppdc/sample.c:276 msgid "Installable Options" msgstr "" -#: ppdc/sample.c:272 +#: ppdc/sample.c:279 msgid "Installed" msgstr "" -#: ppdc/sample.c:291 +#: ppdc/sample.c:298 msgid "IntelliBar Label Printer" msgstr "" -#: ppdc/sample.c:290 +#: ppdc/sample.c:297 msgid "Intellitech" msgstr "" -#: cups/http-support.c:1551 +#: cups/http-support.c:1560 msgid "Internal Server Error" msgstr "" -#: cups/ppd.c:289 +#: cups/ppd.c:290 msgid "Internal error" msgstr "" @@ -4683,7 +4798,7 @@ msgid "Internet Printing Protocol" msgstr "" -#: cups/ipp.c:2995 +#: cups/ipp.c:2996 msgid "Invalid group tag." msgstr "" @@ -4695,11 +4810,11 @@ msgid "Invalid media size." msgstr "" -#: cups/ipp.c:3045 +#: cups/ipp.c:3046 msgid "Invalid named IPP attribute in collection." msgstr "" -#: scheduler/ipp.c:2705 scheduler/ipp.c:7045 +#: scheduler/ipp.c:2706 scheduler/ipp.c:7049 msgid "Invalid ppd-name value." msgstr "" @@ -4708,7 +4823,7 @@ msgid "Invalid printer command \"%s\"." msgstr "" -#: cups/ppd.c:1404 +#: cups/ppd.c:1405 msgid "JCL" msgstr "" @@ -4768,52 +4883,52 @@ msgid "JIS B9" msgstr "" -#: scheduler/ipp.c:9324 +#: scheduler/ipp.c:9328 #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "" -#: scheduler/ipp.c:3024 scheduler/ipp.c:3258 scheduler/ipp.c:3317 -#: scheduler/ipp.c:3496 scheduler/ipp.c:3942 scheduler/ipp.c:5890 -#: scheduler/ipp.c:6271 scheduler/ipp.c:6418 scheduler/ipp.c:6755 -#: scheduler/ipp.c:7730 scheduler/ipp.c:7752 scheduler/ipp.c:7930 -#: scheduler/ipp.c:8158 scheduler/ipp.c:8201 scheduler/ipp.c:9068 -#: scheduler/ipp.c:9292 scheduler/ipp.c:9644 scheduler/ipp.c:10253 +#: scheduler/ipp.c:3025 scheduler/ipp.c:3259 scheduler/ipp.c:3318 +#: scheduler/ipp.c:3497 scheduler/ipp.c:3943 scheduler/ipp.c:5894 +#: scheduler/ipp.c:6275 scheduler/ipp.c:6422 scheduler/ipp.c:6759 +#: scheduler/ipp.c:7734 scheduler/ipp.c:7756 scheduler/ipp.c:7934 +#: scheduler/ipp.c:8162 scheduler/ipp.c:8205 scheduler/ipp.c:9072 +#: scheduler/ipp.c:9296 scheduler/ipp.c:9648 scheduler/ipp.c:10257 #, c-format msgid "Job #%d does not exist." msgstr "" -#: scheduler/ipp.c:3528 +#: scheduler/ipp.c:3529 #, c-format msgid "Job #%d is already aborted - can't cancel." msgstr "" -#: scheduler/ipp.c:3522 +#: scheduler/ipp.c:3523 #, c-format msgid "Job #%d is already canceled - can't cancel." msgstr "" -#: scheduler/ipp.c:3534 +#: scheduler/ipp.c:3535 #, c-format msgid "Job #%d is already completed - can't cancel." msgstr "" -#: scheduler/ipp.c:7956 scheduler/ipp.c:8243 scheduler/ipp.c:10268 +#: scheduler/ipp.c:7960 scheduler/ipp.c:8247 scheduler/ipp.c:10272 #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "" -#: scheduler/ipp.c:9306 +#: scheduler/ipp.c:9310 #, c-format msgid "Job #%d is not complete." msgstr "" -#: scheduler/ipp.c:3039 +#: scheduler/ipp.c:3040 #, c-format msgid "Job #%d is not held for authentication." msgstr "" -#: scheduler/ipp.c:9082 +#: scheduler/ipp.c:9086 #, c-format msgid "Job #%d is not held." msgstr "" @@ -4834,7 +4949,7 @@ msgid "Job Stopped" msgstr "" -#: scheduler/ipp.c:10382 +#: scheduler/ipp.c:10386 msgid "Job is completed and cannot be changed." msgstr "" @@ -4842,11 +4957,11 @@ msgid "Job operation failed" msgstr "" -#: scheduler/ipp.c:10418 scheduler/ipp.c:10435 scheduler/ipp.c:10446 +#: scheduler/ipp.c:10422 scheduler/ipp.c:10439 scheduler/ipp.c:10450 msgid "Job state cannot be changed." msgstr "" -#: scheduler/ipp.c:9172 +#: scheduler/ipp.c:9176 msgid "Job subscriptions cannot be renewed." msgstr "" @@ -4858,19 +4973,19 @@ msgid "LPD/LPR Host or Printer" msgstr "" -#: cups/dest.c:1855 +#: cups/dest.c:1859 msgid "LPDEST environment variable names default destination that does not exist." msgstr "" -#: ppdc/sample.c:231 +#: ppdc/sample.c:238 msgid "Label Printer" msgstr "" -#: ppdc/sample.c:444 +#: ppdc/sample.c:451 msgid "Label Top" msgstr "" -#: scheduler/ipp.c:2070 scheduler/ipp.c:5794 +#: scheduler/ipp.c:2071 scheduler/ipp.c:5798 #, c-format msgid "Language \"%s\" not supported." msgstr "" @@ -4879,7 +4994,7 @@ msgid "Large Address" msgstr "" -#: ppdc/sample.c:289 +#: ppdc/sample.c:296 msgid "LaserJet Series PCL 4/5" msgstr "" @@ -4891,94 +5006,94 @@ msgid "Letter Oversize Long Edge" msgstr "" -#: ppdc/sample.c:240 +#: ppdc/sample.c:247 msgid "Light" msgstr "" -#: cups/ppd.c:297 +#: cups/ppd.c:298 msgid "Line longer than the maximum allowed (255 characters)" msgstr "" -#: cgi-bin/admin.c:1950 +#: cgi-bin/admin.c:1957 msgid "List Available Printers" msgstr "" -#: tools/ippeveprinter.c:642 +#: tools/ippeveprinter.c:670 #, c-format msgid "Listening on port %d." msgstr "" -#: scheduler/ipp.c:5503 +#: scheduler/ipp.c:5507 msgid "Local printer created." msgstr "" -#: cups/ppd-cache.c:3872 ppdc/sample.c:267 +#: cups/ppd-cache.c:3888 ppdc/sample.c:274 msgid "Long-Edge (Portrait)" msgstr "" -#: cups/http-support.c:1875 +#: cups/http-support.c:1884 msgid "Looking for printer." msgstr "" -#: ppdc/sample.c:237 +#: ppdc/sample.c:244 msgid "Main Roll" msgstr "" -#: ppdc/sample.c:263 +#: ppdc/sample.c:270 msgid "Manual Feed" msgstr "" -#: cups/ppd.c:804 cups/ppd.c:1341 +#: cups/ppd.c:805 cups/ppd.c:1342 msgid "Media Size" msgstr "" -#: cups/ppd.c:808 cups/ppd.c:1345 ppdc/sample.c:236 +#: cups/ppd.c:809 cups/ppd.c:1346 ppdc/sample.c:243 msgid "Media Source" msgstr "" -#: ppdc/sample.c:362 +#: ppdc/sample.c:369 msgid "Media Tracking" msgstr "" -#: cups/ppd.c:806 cups/ppd.c:1343 ppdc/sample.c:283 +#: cups/ppd.c:807 cups/ppd.c:1344 ppdc/sample.c:290 msgid "Media Type" msgstr "" -#: ppdc/sample.c:241 +#: ppdc/sample.c:248 msgid "Medium" msgstr "" -#: cups/ppd.c:286 +#: cups/ppd.c:287 msgid "Memory allocation error" msgstr "" -#: cups/ppd.c:306 +#: cups/ppd.c:307 msgid "Missing CloseGroup" msgstr "" -#: cups/ppd.c:308 +#: cups/ppd.c:309 msgid "Missing CloseUI/JCLCloseUI" msgstr "" -#: cups/ppd.c:287 +#: cups/ppd.c:288 msgid "Missing PPD-Adobe-4.x header" msgstr "" -#: cups/ppd.c:296 +#: cups/ppd.c:297 msgid "Missing asterisk in column 1" msgstr "" -#: scheduler/ipp.c:6294 +#: scheduler/ipp.c:6298 msgid "Missing document-number attribute." msgstr "" -#: cgi-bin/admin.c:502 cgi-bin/admin.c:1798 cgi-bin/admin.c:1883 -#: cgi-bin/admin.c:2289 cgi-bin/admin.c:2543 cgi-bin/admin.c:2654 -#: cgi-bin/admin.c:3367 +#: cgi-bin/admin.c:502 cgi-bin/admin.c:1805 cgi-bin/admin.c:1890 +#: cgi-bin/admin.c:2296 cgi-bin/admin.c:2550 cgi-bin/admin.c:2661 +#: cgi-bin/admin.c:3374 msgid "Missing form variable" msgstr "" -#: scheduler/ipp.c:9698 +#: scheduler/ipp.c:9702 msgid "Missing last-document attribute in request." msgstr "" @@ -4990,36 +5105,36 @@ msgid "Missing media-size in media-col." msgstr "" -#: scheduler/ipp.c:6895 +#: scheduler/ipp.c:6899 msgid "Missing notify-subscription-ids attribute." msgstr "" -#: cups/ppd.c:304 +#: cups/ppd.c:305 msgid "Missing option keyword" msgstr "" -#: scheduler/ipp.c:3165 scheduler/ipp.c:3190 +#: scheduler/ipp.c:3166 scheduler/ipp.c:3191 msgid "Missing requesting-user-name attribute." msgstr "" -#: scheduler/ipp.c:5420 scheduler/ipp.c:5446 +#: scheduler/ipp.c:5424 scheduler/ipp.c:5450 #, c-format msgid "Missing required attribute \"%s\"." msgstr "" -#: scheduler/ipp.c:347 +#: scheduler/ipp.c:348 msgid "Missing required attributes." msgstr "" -#: cups/http-support.c:1641 +#: cups/http-support.c:1650 msgid "Missing resource in URI" msgstr "" -#: cups/http-support.c:1635 +#: cups/http-support.c:1644 msgid "Missing scheme in URI" msgstr "" -#: cups/ppd.c:288 +#: cups/ppd.c:289 msgid "Missing value string" msgstr "" @@ -5031,7 +5146,7 @@ msgid "Missing y-dimension in media-size." msgstr "" -#: systemv/lpinfo.c:443 systemv/lpinfo.c:467 +#: systemv/lpinfo.c:444 systemv/lpinfo.c:468 #, c-format msgid "" "Model: name = %s\n" @@ -5040,7 +5155,7 @@ " device-id = %s" msgstr "" -#: tools/ippfind.c:2801 +#: tools/ippfind.c:2815 msgid "Modifiers:" msgstr "" @@ -5060,11 +5175,11 @@ msgid "Move Job" msgstr "" -#: cups/http-support.c:1505 +#: cups/http-support.c:1514 msgid "Moved Permanently" msgstr "" -#: cups/ppd.c:285 +#: cups/ppd.c:286 msgid "NULL PPD file pointer" msgstr "" @@ -5072,31 +5187,31 @@ msgid "Name OID uses indefinite length" msgstr "" -#: scheduler/ipp.c:1056 +#: scheduler/ipp.c:1057 msgid "Nested classes are not allowed." msgstr "" -#: ppdc/sample.c:428 +#: ppdc/sample.c:435 msgid "Never" msgstr "" -#: cups/tls-darwin.c:665 cups/tls-gnutls.c:524 +#: cups/tls-darwin.c:665 cups/tls-gnutls.c:525 msgid "New credentials are not valid for name." msgstr "" -#: cups/tls-darwin.c:655 cups/tls-gnutls.c:514 +#: cups/tls-darwin.c:655 cups/tls-gnutls.c:515 msgid "New credentials are older than stored credentials." msgstr "" -#: cups/ppd.c:1974 +#: cups/ppd.c:2030 msgid "No" msgstr "" -#: cups/http-support.c:1502 +#: cups/http-support.c:1511 msgid "No Content" msgstr "" -#: cups/ppd-cache.c:3076 +#: cups/ppd-cache.c:3078 msgid "No IPP attributes." msgstr "" @@ -5108,28 +5223,28 @@ msgid "No VarBind SEQUENCE" msgstr "" -#: cups/request.c:548 cups/request.c:920 +#: cups/request.c:550 cups/request.c:922 msgid "No active connection" msgstr "" -#: cups/request.c:329 +#: cups/request.c:331 msgid "No active connection." msgstr "" -#: scheduler/ipp.c:3445 +#: scheduler/ipp.c:3446 #, c-format msgid "No active jobs on %s." msgstr "" -#: scheduler/ipp.c:207 +#: scheduler/ipp.c:208 msgid "No attributes in request." msgstr "" -#: scheduler/ipp.c:3066 +#: scheduler/ipp.c:3067 msgid "No authentication information provided." msgstr "" -#: cups/tls-darwin.c:605 cups/tls-gnutls.c:461 +#: cups/tls-darwin.c:605 cups/tls-gnutls.c:462 msgid "No common name specified." msgstr "" @@ -5137,15 +5252,15 @@ msgid "No community name" msgstr "" -#: cups/dest.c:1859 cups/dest.c:1871 +#: cups/dest.c:1863 cups/dest.c:1875 msgid "No default destination." msgstr "" -#: scheduler/ipp.c:6094 +#: scheduler/ipp.c:6098 msgid "No default printer." msgstr "" -#: cgi-bin/ipp-var.c:418 scheduler/ipp.c:7476 +#: cgi-bin/ipp-var.c:418 scheduler/ipp.c:7480 msgid "No destinations added." msgstr "" @@ -5161,7 +5276,7 @@ msgid "No error-status" msgstr "" -#: scheduler/ipp.c:8448 scheduler/ipp.c:9712 +#: scheduler/ipp.c:8452 scheduler/ipp.c:9716 msgid "No file in print request." msgstr "" @@ -5190,19 +5305,19 @@ msgid "No printer-uri found for class" msgstr "" -#: scheduler/ipp.c:6501 +#: scheduler/ipp.c:6505 msgid "No printer-uri in request." msgstr "" -#: cups/http.c:2217 +#: cups/http.c:2218 msgid "No request URI." msgstr "" -#: cups/http.c:2234 +#: cups/http.c:2235 msgid "No request protocol version." msgstr "" -#: cups/request.c:337 +#: cups/request.c:339 msgid "No request sent." msgstr "" @@ -5210,15 +5325,15 @@ msgid "No request-id" msgstr "" -#: cups/tls-darwin.c:685 cups/tls-gnutls.c:544 +#: cups/tls-darwin.c:685 cups/tls-gnutls.c:545 msgid "No stored credentials, not valid for name." msgstr "" -#: scheduler/ipp.c:5679 +#: scheduler/ipp.c:5683 msgid "No subscription attributes in request." msgstr "" -#: scheduler/ipp.c:7829 +#: scheduler/ipp.c:7833 msgid "No subscriptions found." msgstr "" @@ -5230,45 +5345,45 @@ msgid "No version number" msgstr "" -#: ppdc/sample.c:365 +#: ppdc/sample.c:372 msgid "Non-continuous (Mark sensing)" msgstr "" -#: ppdc/sample.c:364 +#: ppdc/sample.c:371 msgid "Non-continuous (Web sensing)" msgstr "" -#: cups/ppd-cache.c:4059 cups/ppd-cache.c:4137 cups/ppd-cache.c:4225 -#: cups/ppd-cache.c:4315 cups/ppd-cache.c:4362 +#: cups/ppd-cache.c:4075 cups/ppd-cache.c:4153 cups/ppd-cache.c:4241 +#: cups/ppd-cache.c:4331 cups/ppd-cache.c:4378 msgid "None" msgstr "" -#: cups/ppd-cache.c:4475 cups/ppd-cache.c:4541 cups/ppd-cache.c:4575 -#: ppdc/sample.c:242 +#: cups/ppd-cache.c:4491 cups/ppd-cache.c:4557 cups/ppd-cache.c:4591 +#: ppdc/sample.c:249 msgid "Normal" msgstr "" -#: cups/http-support.c:1527 +#: cups/http-support.c:1536 msgid "Not Found" msgstr "" -#: cups/http-support.c:1539 +#: cups/http-support.c:1548 msgid "Not Implemented" msgstr "" -#: ppdc/sample.c:271 +#: ppdc/sample.c:278 msgid "Not Installed" msgstr "" -#: cups/http-support.c:1514 +#: cups/http-support.c:1523 msgid "Not Modified" msgstr "" -#: cups/http-support.c:1542 +#: cups/http-support.c:1551 msgid "Not Supported" msgstr "" -#: scheduler/ipp.c:1510 scheduler/ipp.c:10979 +#: scheduler/ipp.c:1511 scheduler/ipp.c:10976 msgid "Not allowed to print." msgstr "" @@ -5276,15 +5391,15 @@ msgid "Note" msgstr "" -#: cups/http-support.c:1493 cups/http-support.c:1632 cups/ppd.c:283 +#: cups/http-support.c:1502 cups/http-support.c:1641 cups/ppd.c:284 msgid "OK" msgstr "" -#: cups/ppd-cache.c:3872 ppdc/sample.c:266 +#: cups/ppd-cache.c:3888 ppdc/sample.c:273 msgid "Off (1-Sided)" msgstr "" -#: ppdc/sample.c:359 +#: ppdc/sample.c:366 msgid "Oki" msgstr "" @@ -5292,7 +5407,7 @@ msgid "Online Help" msgstr "" -#: scheduler/ipp.c:5399 +#: scheduler/ipp.c:5403 msgid "Only local users can create a local printer." msgstr "" @@ -5301,15 +5416,15 @@ msgid "Open of %s failed: %s" msgstr "" -#: cups/ppd.c:291 +#: cups/ppd.c:292 msgid "OpenGroup without a CloseGroup first" msgstr "" -#: cups/ppd.c:293 +#: cups/ppd.c:294 msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" msgstr "" -#: cgi-bin/admin.c:3138 +#: cgi-bin/admin.c:3145 msgid "Operation Policy" msgstr "" @@ -5318,16 +5433,16 @@ msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." msgstr "" -#: cgi-bin/admin.c:2785 cgi-bin/admin.c:2869 +#: cgi-bin/admin.c:2792 cgi-bin/admin.c:2876 msgid "Options Installed" msgstr "" -#: berkeley/lpq.c:642 berkeley/lpr.c:431 berkeley/lprm.c:232 -#: scheduler/cupsfilter.c:1476 scheduler/main.c:2135 systemv/cancel.c:401 -#: systemv/cupsaccept.c:243 systemv/cupsctl.c:232 systemv/cupstestppd.c:3857 -#: systemv/lp.c:750 systemv/lpadmin.c:1620 systemv/lpinfo.c:497 -#: systemv/lpmove.c:216 systemv/lpoptions.c:538 systemv/lpstat.c:2044 -#: tools/ippeveprinter.c:7922 tools/ippfind.c:2765 tools/ipptool.c:4307 +#: berkeley/lpq.c:643 berkeley/lpr.c:437 berkeley/lprm.c:233 +#: scheduler/cupsfilter.c:1563 scheduler/main.c:2145 systemv/cancel.c:402 +#: systemv/cupsaccept.c:244 systemv/cupsctl.c:232 systemv/cupstestppd.c:3857 +#: systemv/lp.c:753 systemv/lpadmin.c:1621 systemv/lpinfo.c:498 +#: systemv/lpmove.c:217 systemv/lpoptions.c:538 systemv/lpstat.c:2045 +#: tools/ippeveprinter.c:8344 tools/ippfind.c:2777 tools/ipptool.c:4337 #: ppdc/ppdc.cxx:426 ppdc/ppdhtml.cxx:173 ppdc/ppdi.cxx:119 #: ppdc/ppdmerge.cxx:356 ppdc/ppdpo.cxx:243 msgid "Options:" @@ -5345,15 +5460,15 @@ msgid "Out of date PPD cache file." msgstr "" -#: cups/ppd-cache.c:1934 +#: cups/ppd-cache.c:1936 msgid "Out of memory." msgstr "" -#: cups/ppd.c:810 cups/ppd.c:1347 +#: cups/ppd.c:811 cups/ppd.c:1348 msgid "Output Mode" msgstr "" -#: ppdc/sample.c:256 +#: ppdc/sample.c:263 msgid "PCL Laser Printer" msgstr "" @@ -5381,7 +5496,7 @@ msgid "PRC32K Oversize Long Edge" msgstr "" -#: cups/dest.c:1857 +#: cups/dest.c:1861 msgid "PRINTER environment variable names default destination that does not exist." msgstr "" @@ -5393,15 +5508,15 @@ msgid "Packet does not start with SEQUENCE" msgstr "" -#: ppdc/sample.c:358 +#: ppdc/sample.c:365 msgid "ParamCustominCutInterval" msgstr "" -#: ppdc/sample.c:356 +#: ppdc/sample.c:363 msgid "ParamCustominTearInterval" msgstr "" -#: cups/auth.c:235 cups/auth.c:394 +#: cups/auth.c:238 cups/auth.c:397 #, c-format msgid "Password for %s on %s? " msgstr "" @@ -5414,7 +5529,7 @@ msgid "Pause Printer" msgstr "" -#: ppdc/sample.c:446 +#: ppdc/sample.c:453 msgid "Peel-Off" msgstr "" @@ -5426,19 +5541,19 @@ msgid "Photo Labels" msgstr "" -#: ppdc/sample.c:284 +#: ppdc/sample.c:291 msgid "Plain Paper" msgstr "" -#: cgi-bin/admin.c:2803 cgi-bin/admin.c:3087 +#: cgi-bin/admin.c:2810 cgi-bin/admin.c:3094 msgid "Policies" msgstr "" -#: cgi-bin/admin.c:2810 cgi-bin/admin.c:3156 cgi-bin/admin.c:3169 +#: cgi-bin/admin.c:2817 cgi-bin/admin.c:3163 cgi-bin/admin.c:3176 msgid "Port Monitor" msgstr "" -#: ppdc/sample.c:273 +#: ppdc/sample.c:280 msgid "PostScript Printer" msgstr "" @@ -5462,7 +5577,7 @@ msgid "Preparing to print." msgstr "" -#: ppdc/sample.c:293 +#: ppdc/sample.c:300 msgid "Print Density" msgstr "" @@ -5470,15 +5585,15 @@ msgid "Print Job:" msgstr "" -#: ppdc/sample.c:338 +#: ppdc/sample.c:345 msgid "Print Mode" msgstr "" -#: cups/ppd-cache.c:4469 cups/ppd-cache.c:4531 cups/ppd-cache.c:4571 +#: cups/ppd-cache.c:4485 cups/ppd-cache.c:4547 cups/ppd-cache.c:4587 msgid "Print Quality" msgstr "" -#: ppdc/sample.c:381 +#: ppdc/sample.c:388 msgid "Print Rate" msgstr "" @@ -5486,7 +5601,7 @@ msgid "Print Self-Test Page" msgstr "" -#: ppdc/sample.c:325 +#: ppdc/sample.c:332 msgid "Print Speed" msgstr "" @@ -5494,11 +5609,11 @@ msgid "Print Test Page" msgstr "" -#: ppdc/sample.c:354 +#: ppdc/sample.c:361 msgid "Print and Cut" msgstr "" -#: ppdc/sample.c:342 +#: ppdc/sample.c:349 msgid "Print and Tear" msgstr "" @@ -5506,11 +5621,11 @@ msgid "Print file sent." msgstr "" -#: backend/ipp.c:2269 +#: backend/ipp.c:2270 msgid "Print job canceled at printer." msgstr "" -#: backend/ipp.c:2261 +#: backend/ipp.c:2262 msgid "Print job too large." msgstr "" @@ -5518,7 +5633,7 @@ msgid "Print job was not accepted." msgstr "" -#: scheduler/ipp.c:5465 +#: scheduler/ipp.c:5469 #, c-format msgid "Printer \"%s\" already exists." msgstr "" @@ -5527,7 +5642,7 @@ msgid "Printer Added" msgstr "" -#: ppdc/sample.c:258 +#: ppdc/sample.c:265 msgid "Printer Default" msgstr "" @@ -5543,19 +5658,19 @@ msgid "Printer Paused" msgstr "" -#: ppdc/sample.c:292 +#: ppdc/sample.c:299 msgid "Printer Settings" msgstr "" -#: backend/ipp.c:2264 +#: backend/ipp.c:2265 msgid "Printer cannot print supplied content." msgstr "" -#: backend/ipp.c:2267 +#: backend/ipp.c:2268 msgid "Printer cannot print with supplied options." msgstr "" -#: cups/ppd-cache.c:4744 +#: cups/ppd-cache.c:4760 msgid "Printer does not support required IPP attributes or document formats." msgstr "" @@ -5573,7 +5688,7 @@ msgid "Printing page %d, %u%% complete." msgstr "" -#: cups/ppd-cache.c:4222 +#: cups/ppd-cache.c:4238 msgid "Punch" msgstr "" @@ -5581,11 +5696,11 @@ msgid "Quarto" msgstr "" -#: scheduler/ipp.c:1505 scheduler/ipp.c:10974 +#: scheduler/ipp.c:1506 scheduler/ipp.c:10971 msgid "Quota limit reached." msgstr "" -#: berkeley/lpq.c:495 +#: berkeley/lpq.c:496 msgid "Rank Owner Job File(s) Total Size" msgstr "" @@ -5603,15 +5718,15 @@ msgid "Remote host did not accept data file (%d)." msgstr "" -#: ppdc/sample.c:426 +#: ppdc/sample.c:433 msgid "Reprint After Error" msgstr "" -#: cups/http-support.c:1530 +#: cups/http-support.c:1539 msgid "Request Entity Too Large" msgstr "" -#: cups/ppd.c:812 cups/ppd.c:1349 ppdc/sample.c:232 +#: cups/ppd.c:813 cups/ppd.c:1350 ppdc/sample.c:239 msgid "Resolution" msgstr "" @@ -5627,7 +5742,7 @@ msgid "Return Address" msgstr "" -#: ppdc/sample.c:447 +#: ppdc/sample.c:454 msgid "Rewind" msgstr "" @@ -5635,23 +5750,23 @@ msgid "SEQUENCE uses indefinite length" msgstr "" -#: cups/http-support.c:1554 +#: cups/http-support.c:1563 msgid "SSL/TLS Negotiation Error" msgstr "" -#: ppdc/sample.c:238 +#: ppdc/sample.c:245 msgid "Second Roll (DUO/Twin Only)" msgstr "" -#: cups/http-support.c:1511 +#: cups/http-support.c:1520 msgid "See Other" msgstr "" -#: scheduler/ipp.c:7099 scheduler/ipp.c:7118 +#: scheduler/ipp.c:7103 scheduler/ipp.c:7122 msgid "See remote printer." msgstr "" -#: cups/tls-darwin.c:740 cups/tls-gnutls.c:606 +#: cups/tls-darwin.c:740 cups/tls-gnutls.c:607 msgid "Self-signed credentials are blocked." msgstr "" @@ -5675,32 +5790,32 @@ msgid "Server Stopped" msgstr "" -#: cups/tls-darwin.c:1250 cups/tls-gnutls.c:1299 +#: cups/tls-darwin.c:1250 cups/tls-gnutls.c:1300 msgid "Server credentials not set." msgstr "" -#: cups/http-support.c:1548 +#: cups/http-support.c:1557 msgid "Service Unavailable" msgstr "" -#: cgi-bin/admin.c:2290 cgi-bin/admin.c:2336 cgi-bin/admin.c:2493 -#: cgi-bin/admin.c:2512 +#: cgi-bin/admin.c:2297 cgi-bin/admin.c:2343 cgi-bin/admin.c:2500 +#: cgi-bin/admin.c:2519 msgid "Set Allowed Users" msgstr "" -#: cgi-bin/admin.c:2539 +#: cgi-bin/admin.c:2546 msgid "Set As Server Default" msgstr "" -#: cgi-bin/admin.c:2639 +#: cgi-bin/admin.c:2646 msgid "Set Class Options" msgstr "" -#: cgi-bin/admin.c:2639 cgi-bin/admin.c:2813 cgi-bin/admin.c:3198 +#: cgi-bin/admin.c:2646 cgi-bin/admin.c:2820 cgi-bin/admin.c:3205 msgid "Set Printer Options" msgstr "" -#: cgi-bin/admin.c:3368 cgi-bin/admin.c:3412 cgi-bin/admin.c:3430 +#: cgi-bin/admin.c:3375 cgi-bin/admin.c:3419 cgi-bin/admin.c:3437 msgid "Set Publishing" msgstr "" @@ -5708,11 +5823,11 @@ msgid "Shipping Address" msgstr "" -#: cups/ppd-cache.c:3872 ppdc/sample.c:268 +#: cups/ppd-cache.c:3888 ppdc/sample.c:275 msgid "Short-Edge (Landscape)" msgstr "" -#: ppdc/sample.c:286 +#: ppdc/sample.c:293 msgid "Special Paper" msgstr "" @@ -5721,16 +5836,16 @@ msgid "Spooling job, %.0f%% complete." msgstr "" -#: ppdc/sample.c:339 +#: ppdc/sample.c:346 msgid "Standard" msgstr "" -#: cups/ppd-cache.c:4056 +#: cups/ppd-cache.c:4072 msgid "Staple" msgstr "" #. TRANSLATORS: Banner/cover sheet before the print job. -#: cgi-bin/admin.c:3059 +#: cgi-bin/admin.c:3066 msgid "Starting Banner" msgstr "" @@ -5744,13 +5859,13 @@ msgid "Statement" msgstr "" -#: scheduler/ipp.c:3591 scheduler/ipp.c:6911 scheduler/ipp.c:7636 -#: scheduler/ipp.c:9160 +#: scheduler/ipp.c:3592 scheduler/ipp.c:6915 scheduler/ipp.c:7640 +#: scheduler/ipp.c:9164 #, c-format msgid "Subscription #%d does not exist." msgstr "" -#: tools/ippfind.c:2812 +#: tools/ippfind.c:2826 msgid "Substitutions:" msgstr "" @@ -5766,7 +5881,7 @@ msgid "Super B/A3" msgstr "" -#: cups/http-support.c:1490 +#: cups/http-support.c:1499 msgid "Switching Protocols" msgstr "" @@ -5782,45 +5897,45 @@ msgid "Tabloid Oversize Long Edge" msgstr "" -#: ppdc/sample.c:340 +#: ppdc/sample.c:347 msgid "Tear" msgstr "" -#: ppdc/sample.c:445 +#: ppdc/sample.c:452 msgid "Tear-Off" msgstr "" -#: ppdc/sample.c:386 +#: ppdc/sample.c:393 msgid "Tear-Off Adjust Position" msgstr "" -#: scheduler/ipp.c:1341 +#: scheduler/ipp.c:1342 #, c-format msgid "The \"%s\" attribute is required for print jobs." msgstr "" -#: scheduler/ipp.c:6572 scheduler/ipp.c:6652 scheduler/ipp.c:6665 -#: scheduler/ipp.c:6677 scheduler/ipp.c:6692 +#: scheduler/ipp.c:6576 scheduler/ipp.c:6656 scheduler/ipp.c:6669 +#: scheduler/ipp.c:6681 scheduler/ipp.c:6696 #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "" -#: scheduler/ipp.c:1320 +#: scheduler/ipp.c:1321 #, c-format msgid "The '%s' Job Status attribute cannot be supplied in a job creation request." msgstr "" -#: scheduler/ipp.c:5194 +#: scheduler/ipp.c:5198 #, c-format msgid "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" -#: scheduler/ipp.c:7141 +#: scheduler/ipp.c:7145 #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "" -#: scheduler/ipp.c:7130 +#: scheduler/ipp.c:7134 #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "" @@ -5834,11 +5949,11 @@ msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." msgstr "" -#: scheduler/ipp.c:2097 +#: scheduler/ipp.c:2098 msgid "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" -#: scheduler/ipp.c:2080 scheduler/ipp.c:5804 +#: scheduler/ipp.c:2081 scheduler/ipp.c:5808 #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "" @@ -5890,48 +6005,48 @@ msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/ \\), quotes (' \"), question mark (?), or the pound sign (#)." msgstr "" -#: scheduler/ipp.c:762 scheduler/ipp.c:1047 scheduler/ipp.c:3230 -#: scheduler/ipp.c:3411 scheduler/ipp.c:5177 scheduler/ipp.c:5638 -#: scheduler/ipp.c:5972 scheduler/ipp.c:6538 scheduler/ipp.c:7345 -#: scheduler/ipp.c:7401 scheduler/ipp.c:7742 scheduler/ipp.c:8017 -#: scheduler/ipp.c:8106 scheduler/ipp.c:8139 scheduler/ipp.c:8463 -#: scheduler/ipp.c:8870 scheduler/ipp.c:8952 scheduler/ipp.c:10122 -#: scheduler/ipp.c:10584 scheduler/ipp.c:10937 scheduler/ipp.c:11019 -#: scheduler/ipp.c:11348 +#: cups/dest.c:1844 scheduler/ipp.c:763 scheduler/ipp.c:1048 +#: scheduler/ipp.c:3231 scheduler/ipp.c:3412 scheduler/ipp.c:5181 +#: scheduler/ipp.c:5642 scheduler/ipp.c:5976 scheduler/ipp.c:6542 +#: scheduler/ipp.c:7349 scheduler/ipp.c:7405 scheduler/ipp.c:7746 +#: scheduler/ipp.c:8021 scheduler/ipp.c:8110 scheduler/ipp.c:8143 +#: scheduler/ipp.c:8467 scheduler/ipp.c:8874 scheduler/ipp.c:8956 +#: scheduler/ipp.c:10126 scheduler/ipp.c:10588 scheduler/ipp.c:10934 +#: scheduler/ipp.c:11016 scheduler/ipp.c:11345 msgid "The printer or class does not exist." msgstr "" -#: scheduler/ipp.c:1259 +#: scheduler/ipp.c:1260 msgid "The printer or class is not shared." msgstr "" -#: scheduler/ipp.c:868 scheduler/ipp.c:2261 +#: scheduler/ipp.c:869 scheduler/ipp.c:2262 #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "" -#: scheduler/ipp.c:3207 +#: scheduler/ipp.c:3208 msgid "The printer-uri attribute is required." msgstr "" -#: scheduler/ipp.c:852 +#: scheduler/ipp.c:853 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" -#: scheduler/ipp.c:2245 +#: scheduler/ipp.c:2246 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" -#: scheduler/client.c:2003 +#: scheduler/client.c:2004 msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." msgstr "" -#: scheduler/ipp.c:6636 +#: scheduler/ipp.c:6640 #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "" -#: scheduler/ipp.c:5901 +#: scheduler/ipp.c:5905 msgid "There are too many subscriptions." msgstr "" @@ -5940,58 +6055,58 @@ msgid "There was an unrecoverable USB error." msgstr "" -#: ppdc/sample.c:433 +#: ppdc/sample.c:440 msgid "Thermal Transfer Media" msgstr "" -#: scheduler/ipp.c:1499 +#: scheduler/ipp.c:1500 msgid "Too many active jobs." msgstr "" -#: scheduler/ipp.c:1393 +#: scheduler/ipp.c:1394 #, c-format msgid "Too many job-sheets values (%d > 2)." msgstr "" -#: scheduler/ipp.c:2574 +#: scheduler/ipp.c:2575 #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "" -#: ppdc/sample.c:287 +#: ppdc/sample.c:294 msgid "Transparency" msgstr "" -#: ppdc/sample.c:282 +#: ppdc/sample.c:289 msgid "Tray" msgstr "" -#: ppdc/sample.c:259 +#: ppdc/sample.c:266 msgid "Tray 1" msgstr "" -#: ppdc/sample.c:260 +#: ppdc/sample.c:267 msgid "Tray 2" msgstr "" -#: ppdc/sample.c:261 +#: ppdc/sample.c:268 msgid "Tray 3" msgstr "" -#: ppdc/sample.c:262 +#: ppdc/sample.c:269 msgid "Tray 4" msgstr "" -#: cups/tls-darwin.c:645 cups/tls-darwin.c:727 cups/tls-gnutls.c:504 -#: cups/tls-gnutls.c:586 +#: cups/tls-darwin.c:645 cups/tls-darwin.c:727 cups/tls-gnutls.c:505 +#: cups/tls-gnutls.c:587 msgid "Trust on first use is disabled." msgstr "" -#: cups/http-support.c:1533 +#: cups/http-support.c:1542 msgid "URI Too Long" msgstr "" -#: cups/http-support.c:1608 +#: cups/http-support.c:1617 msgid "URI too large" msgstr "" @@ -6031,7 +6146,7 @@ msgid "US Letter Small" msgstr "" -#: cgi-bin/admin.c:1651 cgi-bin/admin.c:1664 cgi-bin/admin.c:1688 +#: cgi-bin/admin.c:1658 cgi-bin/admin.c:1671 cgi-bin/admin.c:1695 msgid "Unable to access cupsd.conf file" msgstr "" @@ -6047,16 +6162,16 @@ msgid "Unable to add document to print job." msgstr "" -#: scheduler/ipp.c:1574 +#: scheduler/ipp.c:1575 #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "" -#: cgi-bin/admin.c:823 cgi-bin/admin.c:1193 +#: cgi-bin/admin.c:830 cgi-bin/admin.c:1200 msgid "Unable to add printer" msgstr "" -#: scheduler/ipp.c:1177 +#: scheduler/ipp.c:1178 msgid "Unable to allocate memory for file types." msgstr "" @@ -6068,32 +6183,32 @@ msgid "Unable to allocate memory for pages array" msgstr "" -#: tools/ippeveprinter.c:1628 +#: tools/ippeveprinter.c:1664 msgid "Unable to allocate memory for printer" msgstr "" -#: backend/ipp.c:2173 backend/ipp.c:2704 +#: backend/ipp.c:2173 backend/ipp.c:2705 msgid "Unable to cancel print job." msgstr "" -#: cgi-bin/admin.c:2494 +#: cgi-bin/admin.c:2501 msgid "Unable to change printer" msgstr "" -#: cgi-bin/admin.c:3413 +#: cgi-bin/admin.c:3420 msgid "Unable to change printer-is-shared attribute" msgstr "" -#: cgi-bin/admin.c:1349 cgi-bin/admin.c:1491 +#: cgi-bin/admin.c:1356 cgi-bin/admin.c:1498 msgid "Unable to change server settings" msgstr "" -#: cups/ipp.c:5179 +#: cups/ipp.c:5181 #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "" -#: cups/ipp.c:5134 +#: cups/ipp.c:5136 #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." msgstr "" @@ -6102,7 +6217,7 @@ msgid "Unable to configure printer options." msgstr "" -#: cups/adminutil.c:158 cups/request.c:1057 +#: cups/adminutil.c:158 cups/request.c:1059 msgid "Unable to connect to host." msgstr "" @@ -6111,16 +6226,16 @@ msgid "Unable to contact printer, queuing on next printer in class." msgstr "" -#: scheduler/ipp.c:2676 +#: scheduler/ipp.c:2677 #, c-format msgid "Unable to copy PPD file - %s" msgstr "" -#: scheduler/ipp.c:2721 +#: scheduler/ipp.c:2722 msgid "Unable to copy PPD file." msgstr "" -#: cups/tls-darwin.c:611 cups/tls-gnutls.c:467 +#: cups/tls-darwin.c:611 cups/tls-gnutls.c:468 msgid "Unable to create credentials from array." msgstr "" @@ -6128,28 +6243,28 @@ msgid "Unable to create printer-uri" msgstr "" -#: scheduler/ipp.c:5475 +#: scheduler/ipp.c:5479 msgid "Unable to create printer." msgstr "" -#: cups/tls-darwin.c:1541 cups/tls-gnutls.c:1511 +#: cups/tls-darwin.c:1541 cups/tls-gnutls.c:1512 msgid "Unable to create server credentials." msgstr "" -#: tools/ippeveprinter.c:664 +#: tools/ippeveprinter.c:692 #, c-format msgid "Unable to create spool directory \"%s\": %s" msgstr "" -#: cgi-bin/admin.c:1542 cgi-bin/admin.c:1554 scheduler/cupsfilter.c:1284 +#: cgi-bin/admin.c:1549 cgi-bin/admin.c:1561 scheduler/cupsfilter.c:1375 msgid "Unable to create temporary file" msgstr "" -#: cgi-bin/admin.c:1845 +#: cgi-bin/admin.c:1852 msgid "Unable to delete class" msgstr "" -#: cgi-bin/admin.c:1930 +#: cgi-bin/admin.c:1937 msgid "Unable to delete printer" msgstr "" @@ -6157,7 +6272,7 @@ msgid "Unable to do maintenance command" msgstr "" -#: cgi-bin/admin.c:1666 +#: cgi-bin/admin.c:1673 msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "" @@ -6198,7 +6313,7 @@ msgid "Unable to establish a secure connection to host." msgstr "" -#: tools/ippeveprinter.c:1603 tools/ippeveprinter.c:1613 +#: tools/ippeveprinter.c:1639 tools/ippeveprinter.c:1649 #, c-format msgid "Unable to execute command \"%s\": %s" msgstr "" @@ -6207,7 +6322,7 @@ msgid "Unable to find destination for job" msgstr "" -#: cups/http-support.c:2099 +#: cups/http-support.c:2108 msgid "Unable to find printer." msgstr "" @@ -6215,7 +6330,7 @@ msgid "Unable to find server credentials." msgstr "" -#: backend/ipp.c:3367 +#: backend/ipp.c:3397 msgid "Unable to get backend exit status." msgstr "" @@ -6227,11 +6342,11 @@ msgid "Unable to get class status" msgstr "" -#: cgi-bin/admin.c:1087 +#: cgi-bin/admin.c:1094 msgid "Unable to get list of printer drivers" msgstr "" -#: cgi-bin/admin.c:2344 +#: cgi-bin/admin.c:2351 msgid "Unable to get printer attributes" msgstr "" @@ -6256,7 +6371,7 @@ msgid "Unable to locate printer \"%s\"." msgstr "" -#: backend/dnssd.c:752 backend/ipp.c:335 backend/lpd.c:185 +#: backend/dnssd.c:753 backend/ipp.c:335 backend/lpd.c:185 #: backend/socket.c:155 msgid "Unable to locate printer." msgstr "" @@ -6265,7 +6380,7 @@ msgid "Unable to modify class" msgstr "" -#: cgi-bin/admin.c:822 cgi-bin/admin.c:1192 +#: cgi-bin/admin.c:829 cgi-bin/admin.c:1199 msgid "Unable to modify printer" msgstr "" @@ -6277,11 +6392,11 @@ msgid "Unable to move jobs" msgstr "" -#: cgi-bin/admin.c:2690 cups/ppd.c:284 +#: cgi-bin/admin.c:2697 cups/ppd.c:285 msgid "Unable to open PPD file" msgstr "" -#: cgi-bin/admin.c:2161 +#: cgi-bin/admin.c:2168 msgid "Unable to open cupsd.conf file:" msgstr "" @@ -6289,7 +6404,7 @@ msgid "Unable to open device file" msgstr "" -#: scheduler/ipp.c:6315 +#: scheduler/ipp.c:6319 #, c-format msgid "Unable to open document #%d in job #%d." msgstr "" @@ -6318,17 +6433,17 @@ msgid "Unable to read print data." msgstr "" -#: tools/ippeveprinter.c:6861 tools/ippeveprinter.c:6879 -#: tools/ippeveprinter.c:6898 tools/ippeveprinter.c:6912 +#: tools/ippeveprinter.c:7269 tools/ippeveprinter.c:7290 +#: tools/ippeveprinter.c:7312 tools/ippeveprinter.c:7329 #, c-format msgid "Unable to register \"%s.%s\": %d" msgstr "" -#: scheduler/ipp.c:8622 scheduler/ipp.c:9865 +#: scheduler/ipp.c:8626 scheduler/ipp.c:9869 msgid "Unable to rename job document file." msgstr "" -#: cups/dest.c:3252 +#: cups/dest.c:3256 msgid "Unable to resolve printer-uri." msgstr "" @@ -6344,23 +6459,23 @@ msgid "Unable to send data to printer." msgstr "" -#: cgi-bin/admin.c:3314 +#: cgi-bin/admin.c:3321 msgid "Unable to set options" msgstr "" -#: cgi-bin/admin.c:2581 +#: cgi-bin/admin.c:2588 msgid "Unable to set server default" msgstr "" -#: backend/ipp.c:3226 backend/ipp.c:3303 backend/ipp.c:3311 +#: backend/ipp.c:3256 backend/ipp.c:3333 backend/ipp.c:3341 msgid "Unable to start backend process." msgstr "" -#: cgi-bin/admin.c:1604 +#: cgi-bin/admin.c:1611 msgid "Unable to upload cupsd.conf file" msgstr "" -#: backend/usb-darwin.c:2148 backend/usb-darwin.c:2172 +#: backend/usb-darwin.c:2132 backend/usb-darwin.c:2156 msgid "Unable to use legacy USB class driver." msgstr "" @@ -6373,15 +6488,15 @@ msgid "Unable to write uncompressed print data: %s" msgstr "" -#: cups/http-support.c:1521 +#: cups/http-support.c:1530 msgid "Unauthorized" msgstr "" -#: cgi-bin/admin.c:3010 +#: cgi-bin/admin.c:3017 msgid "Units" msgstr "" -#: cups/http-support.c:1561 cups/http-support.c:1645 cups/ppd.c:313 +#: cups/http-support.c:1570 cups/http-support.c:1654 cups/ppd.c:314 msgid "Unknown" msgstr "" @@ -6390,7 +6505,7 @@ msgid "Unknown choice \"%s\" for option \"%s\"." msgstr "" -#: tools/ippeveprinter.c:3996 +#: tools/ippeveprinter.c:4193 #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." msgstr "" @@ -6433,29 +6548,29 @@ msgid "Unknown print mode: \"%s\"." msgstr "" -#: scheduler/ipp.c:10806 +#: scheduler/ipp.c:10810 #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "" -#: scheduler/ipp.c:10789 +#: scheduler/ipp.c:10793 #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "" -#: cups/http.c:2266 +#: cups/http.c:2267 msgid "Unknown request method." msgstr "" -#: cups/http.c:2286 +#: cups/http.c:2287 msgid "Unknown request version." msgstr "" -#: cups/http-support.c:1638 +#: cups/http-support.c:1647 msgid "Unknown scheme in URI" msgstr "" -#: cups/http-addrlist.c:824 +#: cups/http-addrlist.c:834 msgid "Unknown service name." msgstr "" @@ -6464,50 +6579,50 @@ msgid "Unknown version option value: \"%s\"." msgstr "" -#: scheduler/ipp.c:11265 +#: scheduler/ipp.c:11262 #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "" -#: scheduler/ipp.c:11295 +#: scheduler/ipp.c:11292 #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "" -#: scheduler/ipp.c:7969 scheduler/ipp.c:10348 scheduler/ipp.c:11309 +#: scheduler/ipp.c:7973 scheduler/ipp.c:10352 scheduler/ipp.c:11306 msgid "Unsupported 'job-hold-until' value." msgstr "" -#: scheduler/ipp.c:11325 +#: scheduler/ipp.c:11322 msgid "Unsupported 'job-name' value." msgstr "" -#: scheduler/ipp.c:298 +#: scheduler/ipp.c:299 #, c-format msgid "Unsupported character set \"%s\"." msgstr "" -#: scheduler/ipp.c:8429 scheduler/ipp.c:9677 +#: scheduler/ipp.c:8433 scheduler/ipp.c:9681 #, c-format msgid "Unsupported compression \"%s\"." msgstr "" -#: scheduler/ipp.c:8565 scheduler/ipp.c:9830 +#: scheduler/ipp.c:8569 scheduler/ipp.c:9834 #, c-format msgid "Unsupported document-format \"%s\"." msgstr "" -#: scheduler/ipp.c:9813 +#: scheduler/ipp.c:9817 #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "" -#: scheduler/ipp.c:1359 +#: scheduler/ipp.c:1360 #, c-format msgid "Unsupported format \"%s\"." msgstr "" -#: scheduler/ipp.c:1457 +#: scheduler/ipp.c:1458 msgid "Unsupported margins." msgstr "" @@ -6530,8 +6645,8 @@ msgid "Unsupported page-border value %s, using page-border=none." msgstr "" -#: filter/rastertopwg.c:132 filter/rastertopwg.c:168 filter/rastertopwg.c:176 -#: filter/rastertopwg.c:185 +#: filter/rastertopwg.c:150 filter/rastertopwg.c:186 filter/rastertopwg.c:194 +#: filter/rastertopwg.c:203 msgid "Unsupported raster data." msgstr "" @@ -6539,16 +6654,16 @@ msgid "Unsupported value type" msgstr "" -#: cups/http-support.c:1536 +#: cups/http-support.c:1545 msgid "Upgrade Required" msgstr "" -#: systemv/cupsaccept.c:242 +#: systemv/cupsaccept.c:243 #, c-format msgid "Usage: %s [options] destination(s)" msgstr "" -#: backend/dnssd.c:192 backend/ipp.c:324 backend/lpd.c:172 +#: backend/dnssd.c:193 backend/ipp.c:324 backend/lpd.c:172 #: backend/socket.c:119 backend/usb.c:170 filter/commandtops.c:57 #: filter/gziptoany.c:38 filter/pstops.c:223 monitor/bcp.c:48 #: monitor/tbcp.c:47 @@ -6556,7 +6671,7 @@ msgid "Usage: %s job-id user title copies options [file]" msgstr "" -#: systemv/cancel.c:398 +#: systemv/cancel.c:399 msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" @@ -6567,11 +6682,11 @@ msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "" -#: scheduler/main.c:2134 +#: scheduler/main.c:2144 msgid "Usage: cupsd [options]" msgstr "" -#: scheduler/cupsfilter.c:1475 +#: scheduler/cupsfilter.c:1562 msgid "Usage: cupsfilter [ options ] [ -- ] filename" msgstr "" @@ -6581,11 +6696,11 @@ " program | cupstestppd [options] -" msgstr "" -#: tools/ippeveprinter.c:7921 +#: tools/ippeveprinter.c:8343 msgid "Usage: ippeveprinter [options] \"name\"" msgstr "" -#: tools/ippfind.c:2759 +#: tools/ippfind.c:2771 msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" @@ -6593,17 +6708,17 @@ " ippfind --version" msgstr "" -#: tools/ipptool.c:4306 +#: tools/ipptool.c:4336 msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "" -#: systemv/lp.c:748 +#: systemv/lp.c:751 msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" -#: systemv/lpadmin.c:1615 +#: systemv/lpadmin.c:1616 msgid "" "Usage: lpadmin [options] -d destination\n" " lpadmin [options] -p destination\n" @@ -6612,13 +6727,13 @@ " lpadmin [options] -x destination" msgstr "" -#: systemv/lpinfo.c:495 +#: systemv/lpinfo.c:496 msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" -#: systemv/lpmove.c:214 +#: systemv/lpmove.c:215 msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" @@ -6632,21 +6747,21 @@ " lpoptions [options] -x destination" msgstr "" -#: berkeley/lpq.c:641 +#: berkeley/lpq.c:642 msgid "Usage: lpq [options] [+interval]" msgstr "" -#: berkeley/lpr.c:430 +#: berkeley/lpr.c:436 msgid "Usage: lpr [options] [file(s)]" msgstr "" -#: berkeley/lprm.c:230 +#: berkeley/lprm.c:231 msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" -#: systemv/lpstat.c:2043 +#: systemv/lpstat.c:2044 msgid "Usage: lpstat [options]" msgstr "" @@ -6670,11 +6785,11 @@ msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" -#: backend/snmp.c:185 +#: backend/snmp.c:187 msgid "Usage: snmp [host-or-ip-address]" msgstr "" -#: tools/ippeveprinter.c:669 +#: tools/ippeveprinter.c:697 #, c-format msgid "Using spool directory \"%s\"." msgstr "" @@ -6707,32 +6822,32 @@ msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" -#: cups/http-support.c:1557 +#: cups/http-support.c:1566 msgid "Web Interface is Disabled" msgstr "" -#: cups/ppd.c:1972 +#: cups/ppd.c:2028 msgid "Yes" msgstr "" -#: scheduler/client.c:1991 +#: scheduler/client.c:1992 msgid "You cannot access this page." msgstr "" -#: scheduler/client.c:1997 +#: scheduler/client.c:1998 #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "" -#: scheduler/client.c:1989 +#: scheduler/client.c:1990 msgid "Your account does not have the necessary privileges." msgstr "" -#: ppdc/sample.c:437 +#: ppdc/sample.c:444 msgid "ZPL Label Printer" msgstr "" -#: ppdc/sample.c:360 +#: ppdc/sample.c:367 msgid "Zebra" msgstr "" @@ -7093,11 +7208,11 @@ msgid "covering-name.pre-printed" msgstr "" -#: scheduler/ipp.c:6187 +#: scheduler/ipp.c:6191 msgid "cups-deviced failed to execute." msgstr "" -#: scheduler/ipp.c:7073 scheduler/ipp.c:7312 +#: scheduler/ipp.c:7077 scheduler/ipp.c:7316 msgid "cups-driverd failed to execute." msgstr "" @@ -7121,55 +7236,55 @@ msgid "cupsctl: Unknown option \"-%c\"" msgstr "" -#: scheduler/main.c:174 +#: scheduler/main.c:175 msgid "cupsd: Expected config filename after \"-c\" option." msgstr "" -#: scheduler/main.c:270 +#: scheduler/main.c:271 msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" -#: scheduler/main.c:244 +#: scheduler/main.c:245 msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" -#: scheduler/main.c:281 +#: scheduler/main.c:282 msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "" -#: scheduler/main.c:205 scheduler/main.c:212 +#: scheduler/main.c:206 scheduler/main.c:213 msgid "cupsd: Unable to get current directory." msgstr "" -#: scheduler/main.c:340 scheduler/main.c:350 +#: scheduler/main.c:341 scheduler/main.c:351 msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "" -#: scheduler/main.c:321 +#: scheduler/main.c:322 #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "" -#: scheduler/main.c:312 +#: scheduler/main.c:313 #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "" -#: scheduler/cupsfilter.c:1257 +#: scheduler/cupsfilter.c:1348 #, c-format msgid "cupsfilter: Invalid document number %d." msgstr "" -#: scheduler/cupsfilter.c:1251 +#: scheduler/cupsfilter.c:1342 #, c-format msgid "cupsfilter: Invalid job ID %d." msgstr "" -#: scheduler/cupsfilter.c:342 +#: scheduler/cupsfilter.c:390 msgid "cupsfilter: Only one filename can be specified." msgstr "" -#: scheduler/cupsfilter.c:1299 +#: scheduler/cupsfilter.c:1390 #, c-format msgid "cupsfilter: Unable to get job file - %s" msgstr "" @@ -7187,12 +7302,12 @@ msgid "detailed-status-message" msgstr "" -#: systemv/lpstat.c:1253 systemv/lpstat.c:1256 systemv/lpstat.c:1259 +#: systemv/lpstat.c:1254 systemv/lpstat.c:1257 systemv/lpstat.c:1260 #, c-format msgid "device for %s/%s: %s" msgstr "" -#: systemv/lpstat.c:1239 systemv/lpstat.c:1242 systemv/lpstat.c:1245 +#: systemv/lpstat.c:1240 systemv/lpstat.c:1243 systemv/lpstat.c:1246 #, c-format msgid "device for %s: %s" msgstr "" @@ -7485,19 +7600,19 @@ msgid "error-status uses indefinite length" msgstr "" -#: tools/ippfind.c:2808 +#: tools/ippfind.c:2822 msgid "" "expression --and expression\n" " Logical AND" msgstr "" -#: tools/ippfind.c:2810 +#: tools/ippfind.c:2824 msgid "" "expression --or expression\n" " Logical OR" msgstr "" -#: tools/ippfind.c:2807 +#: tools/ippfind.c:2821 msgid "expression expression Logical AND" msgstr "" @@ -8798,158 +8913,158 @@ msgid "insert-sheet" msgstr "" -#: tools/ippeveprinter.c:4850 +#: tools/ippeveprinter.c:5074 #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." msgstr "" -#: tools/ippfind.c:2478 +#: tools/ippfind.c:2490 #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "" -#: tools/ippfind.c:295 +#: tools/ippfind.c:297 msgid "ippfind: Cannot use --and after --or." msgstr "" -#: tools/ippfind.c:580 +#: tools/ippfind.c:582 #, c-format msgid "ippfind: Expected key name after %s." msgstr "" -#: tools/ippfind.c:530 tools/ippfind.c:725 +#: tools/ippfind.c:532 tools/ippfind.c:727 #, c-format msgid "ippfind: Expected port range after %s." msgstr "" -#: tools/ippfind.c:328 +#: tools/ippfind.c:330 #, c-format msgid "ippfind: Expected program after %s." msgstr "" -#: tools/ippfind.c:345 +#: tools/ippfind.c:347 #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "" -#: tools/ippfind.c:1981 +#: tools/ippfind.c:1993 msgid "ippfind: Missing close brace in substitution." msgstr "" -#: tools/ippfind.c:1044 +#: tools/ippfind.c:1046 msgid "ippfind: Missing close parenthesis." msgstr "" -#: tools/ippfind.c:302 +#: tools/ippfind.c:304 msgid "ippfind: Missing expression before \"--and\"." msgstr "" -#: tools/ippfind.c:427 +#: tools/ippfind.c:429 msgid "ippfind: Missing expression before \"--or\"." msgstr "" -#: tools/ippfind.c:862 +#: tools/ippfind.c:864 #, c-format msgid "ippfind: Missing key name after %s." msgstr "" -#: tools/ippfind.c:396 tools/ippfind.c:712 +#: tools/ippfind.c:398 tools/ippfind.c:714 #, c-format msgid "ippfind: Missing name after %s." msgstr "" -#: tools/ippfind.c:1015 +#: tools/ippfind.c:1017 msgid "ippfind: Missing open parenthesis." msgstr "" -#: tools/ippfind.c:892 +#: tools/ippfind.c:894 #, c-format msgid "ippfind: Missing program after %s." msgstr "" -#: tools/ippfind.c:314 tools/ippfind.c:368 tools/ippfind.c:409 -#: tools/ippfind.c:515 tools/ippfind.c:597 tools/ippfind.c:612 -#: tools/ippfind.c:779 tools/ippfind.c:794 tools/ippfind.c:817 -#: tools/ippfind.c:877 +#: tools/ippfind.c:316 tools/ippfind.c:370 tools/ippfind.c:411 +#: tools/ippfind.c:517 tools/ippfind.c:599 tools/ippfind.c:614 +#: tools/ippfind.c:781 tools/ippfind.c:796 tools/ippfind.c:819 +#: tools/ippfind.c:879 #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "" -#: tools/ippfind.c:910 +#: tools/ippfind.c:912 #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "" -#: tools/ippfind.c:1928 tools/ippfind.c:1953 +#: tools/ippfind.c:1940 tools/ippfind.c:1965 msgid "ippfind: Out of memory." msgstr "" -#: tools/ippfind.c:988 +#: tools/ippfind.c:990 msgid "ippfind: Too many parenthesis." msgstr "" -#: tools/ippfind.c:1287 tools/ippfind.c:1415 tools/ippfind.c:2570 +#: tools/ippfind.c:1299 tools/ippfind.c:1427 tools/ippfind.c:2582 #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "" -#: tools/ippfind.c:2051 tools/ippfind.c:2078 +#: tools/ippfind.c:2063 tools/ippfind.c:2090 #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "" -#: tools/ippfind.c:1134 tools/ippfind.c:1142 tools/ippfind.c:1153 +#: tools/ippfind.c:1136 tools/ippfind.c:1144 tools/ippfind.c:1155 #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "" -#: tools/ippfind.c:2010 +#: tools/ippfind.c:2022 #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "" -#: tools/ipptool.c:566 tools/ipptool.c:588 +#: tools/ipptool.c:569 tools/ipptool.c:591 msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\"." msgstr "" -#: tools/ipptool.c:351 tools/ipptool.c:422 +#: tools/ipptool.c:354 tools/ipptool.c:425 msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" -#: tools/ipptool.c:634 +#: tools/ipptool.c:637 #, c-format msgid "ipptool: Bad URI \"%s\"." msgstr "" -#: tools/ipptool.c:559 +#: tools/ipptool.c:562 msgid "ipptool: Invalid seconds for \"-i\"." msgstr "" -#: tools/ipptool.c:623 +#: tools/ipptool.c:626 msgid "ipptool: May only specify a single URI." msgstr "" -#: tools/ipptool.c:580 +#: tools/ipptool.c:583 msgid "ipptool: Missing count for \"-n\"." msgstr "" -#: tools/ipptool.c:268 +#: tools/ipptool.c:271 msgid "ipptool: Missing filename for \"--ippserver\"." msgstr "" -#: tools/ipptool.c:456 +#: tools/ipptool.c:459 msgid "ipptool: Missing filename for \"-f\"." msgstr "" -#: tools/ipptool.c:437 +#: tools/ipptool.c:440 msgid "ipptool: Missing name=value for \"-d\"." msgstr "" -#: tools/ipptool.c:551 +#: tools/ipptool.c:554 msgid "ipptool: Missing seconds for \"-i\"." msgstr "" -#: tools/ipptool.c:649 +#: tools/ipptool.c:652 msgid "ipptool: URI required before test file." msgstr "" @@ -9218,7 +9333,7 @@ msgid "job-phone-number" msgstr "" -#: scheduler/ipp.c:8095 +#: scheduler/ipp.c:8099 msgid "job-printer-uri attribute missing." msgstr "" @@ -9847,170 +9962,170 @@ msgid "logo" msgstr "" -#: systemv/lpadmin.c:123 systemv/lpadmin.c:378 +#: systemv/lpadmin.c:124 systemv/lpadmin.c:379 msgid "lpadmin: Class name can only contain printable characters." msgstr "" -#: systemv/lpadmin.c:213 +#: systemv/lpadmin.c:214 #, c-format msgid "lpadmin: Expected PPD after \"-%c\" option." msgstr "" -#: systemv/lpadmin.c:459 +#: systemv/lpadmin.c:460 msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." msgstr "" -#: systemv/lpadmin.c:369 +#: systemv/lpadmin.c:370 msgid "lpadmin: Expected class after \"-r\" option." msgstr "" -#: systemv/lpadmin.c:113 +#: systemv/lpadmin.c:114 msgid "lpadmin: Expected class name after \"-c\" option." msgstr "" -#: systemv/lpadmin.c:553 +#: systemv/lpadmin.c:554 msgid "lpadmin: Expected description after \"-D\" option." msgstr "" -#: systemv/lpadmin.c:489 +#: systemv/lpadmin.c:490 msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "" -#: systemv/lpadmin.c:566 +#: systemv/lpadmin.c:567 msgid "lpadmin: Expected file type(s) after \"-I\" option." msgstr "" -#: systemv/lpadmin.c:192 +#: systemv/lpadmin.c:193 msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "" -#: systemv/lpadmin.c:585 +#: systemv/lpadmin.c:586 msgid "lpadmin: Expected location after \"-L\" option." msgstr "" -#: systemv/lpadmin.c:282 +#: systemv/lpadmin.c:283 msgid "lpadmin: Expected model after \"-m\" option." msgstr "" -#: systemv/lpadmin.c:417 +#: systemv/lpadmin.c:418 msgid "lpadmin: Expected name after \"-R\" option." msgstr "" -#: systemv/lpadmin.c:302 +#: systemv/lpadmin.c:303 msgid "lpadmin: Expected name=value after \"-o\" option." msgstr "" -#: systemv/lpadmin.c:322 +#: systemv/lpadmin.c:323 msgid "lpadmin: Expected printer after \"-p\" option." msgstr "" -#: systemv/lpadmin.c:155 +#: systemv/lpadmin.c:156 msgid "lpadmin: Expected printer name after \"-d\" option." msgstr "" -#: systemv/lpadmin.c:522 +#: systemv/lpadmin.c:523 msgid "lpadmin: Expected printer or class after \"-x\" option." msgstr "" -#: systemv/lpadmin.c:958 +#: systemv/lpadmin.c:959 msgid "lpadmin: No member names were seen." msgstr "" -#: systemv/lpadmin.c:752 +#: systemv/lpadmin.c:753 #, c-format msgid "lpadmin: Printer %s is already a member of class %s." msgstr "" -#: systemv/lpadmin.c:972 +#: systemv/lpadmin.c:973 #, c-format msgid "lpadmin: Printer %s is not a member of class %s." msgstr "" -#: systemv/lpadmin.c:637 +#: systemv/lpadmin.c:638 msgid "lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS." msgstr "" -#: systemv/lpadmin.c:164 systemv/lpadmin.c:331 systemv/lpadmin.c:531 +#: systemv/lpadmin.c:165 systemv/lpadmin.c:332 systemv/lpadmin.c:532 msgid "lpadmin: Printer name can only contain printable characters." msgstr "" -#: systemv/lpadmin.c:618 +#: systemv/lpadmin.c:619 msgid "lpadmin: Raw queues are deprecated and will stop working in a future version of CUPS." msgstr "" -#: systemv/lpadmin.c:616 +#: systemv/lpadmin.c:617 msgid "lpadmin: Raw queues are no longer supported on macOS." msgstr "" -#: systemv/lpadmin.c:231 +#: systemv/lpadmin.c:232 msgid "lpadmin: System V interface scripts are no longer supported for security reasons." msgstr "" -#: systemv/lpadmin.c:97 +#: systemv/lpadmin.c:98 msgid "" "lpadmin: Unable to add a printer to the class:\n" " You must specify a printer name first." msgstr "" -#: systemv/lpadmin.c:89 systemv/lpadmin.c:139 systemv/lpadmin.c:261 -#: systemv/lpadmin.c:344 systemv/lpadmin.c:393 systemv/lpadmin.c:505 -#: systemv/lpadmin.c:656 +#: systemv/lpadmin.c:90 systemv/lpadmin.c:140 systemv/lpadmin.c:262 +#: systemv/lpadmin.c:345 systemv/lpadmin.c:394 systemv/lpadmin.c:506 +#: systemv/lpadmin.c:657 #, c-format msgid "lpadmin: Unable to connect to server: %s" msgstr "" -#: systemv/lpadmin.c:1442 +#: systemv/lpadmin.c:1443 msgid "lpadmin: Unable to create temporary file" msgstr "" -#: systemv/lpadmin.c:401 +#: systemv/lpadmin.c:402 msgid "" "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" -#: systemv/lpadmin.c:1453 +#: systemv/lpadmin.c:1454 #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" msgstr "" -#: systemv/lpadmin.c:1433 +#: systemv/lpadmin.c:1434 #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." msgstr "" -#: systemv/lpadmin.c:353 +#: systemv/lpadmin.c:354 msgid "" "lpadmin: Unable to remove a printer from the class:\n" " You must specify a printer name first." msgstr "" -#: systemv/lpadmin.c:645 +#: systemv/lpadmin.c:646 msgid "" "lpadmin: Unable to set the printer options:\n" " You must specify a printer name first." msgstr "" -#: systemv/lpadmin.c:472 +#: systemv/lpadmin.c:473 #, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"." msgstr "" -#: systemv/lpadmin.c:601 +#: systemv/lpadmin.c:602 #, c-format msgid "lpadmin: Unknown argument \"%s\"." msgstr "" -#: systemv/lpadmin.c:594 +#: systemv/lpadmin.c:595 #, c-format msgid "lpadmin: Unknown option \"%c\"." msgstr "" -#: systemv/lpadmin.c:622 +#: systemv/lpadmin.c:623 msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" -#: systemv/lpadmin.c:570 +#: systemv/lpadmin.c:571 msgid "lpadmin: Warning - content type list ignored." msgstr "" @@ -10018,40 +10133,40 @@ msgid "lpc> " msgstr "" -#: systemv/lpinfo.c:80 +#: systemv/lpinfo.c:81 msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." msgstr "" -#: systemv/lpinfo.c:129 +#: systemv/lpinfo.c:130 msgid "lpinfo: Expected language after \"--language\"." msgstr "" -#: systemv/lpinfo.c:144 +#: systemv/lpinfo.c:145 msgid "lpinfo: Expected make and model after \"--make-and-model\"." msgstr "" -#: systemv/lpinfo.c:159 +#: systemv/lpinfo.c:160 msgid "lpinfo: Expected product string after \"--product\"." msgstr "" -#: systemv/lpinfo.c:96 +#: systemv/lpinfo.c:97 msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "" -#: systemv/lpinfo.c:114 +#: systemv/lpinfo.c:115 msgid "lpinfo: Expected scheme list after \"--include-schemes\"." msgstr "" -#: systemv/lpinfo.c:174 +#: systemv/lpinfo.c:175 msgid "lpinfo: Expected timeout after \"--timeout\"." msgstr "" -#: systemv/lpmove.c:129 +#: systemv/lpmove.c:130 #, c-format msgid "lpmove: Unable to connect to server: %s" msgstr "" -#: systemv/lpmove.c:117 +#: systemv/lpmove.c:118 #, c-format msgid "lpmove: Unknown argument \"%s\"." msgstr "" @@ -10079,7 +10194,7 @@ msgid "lpoptions: Unknown printer or class." msgstr "" -#: systemv/lpstat.c:1099 +#: systemv/lpstat.c:1100 #, c-format msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"." msgstr "" @@ -12919,7 +13034,7 @@ msgid "media.roc_8k_10.75x15.5in" msgstr "" -#: systemv/lpstat.c:1035 +#: systemv/lpstat.c:1036 #, c-format msgid "members of class %s:" msgstr "" @@ -13004,11 +13119,11 @@ msgid "multiple-operation-time-out-action.process-job" msgstr "" -#: berkeley/lpq.c:554 +#: berkeley/lpq.c:555 msgid "no entries" msgstr "" -#: systemv/lpstat.c:1103 +#: systemv/lpstat.c:1104 msgid "no system default destination" msgstr "" @@ -13032,7 +13147,7 @@ msgid "notify-events" msgstr "" -#: scheduler/ipp.c:5872 +#: scheduler/ipp.c:5876 msgid "notify-events not specified." msgstr "" @@ -13171,12 +13286,12 @@ msgid "notify-recipient-uri" msgstr "" -#: scheduler/ipp.c:2034 scheduler/ipp.c:5758 +#: scheduler/ipp.c:2035 scheduler/ipp.c:5762 #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "" -#: scheduler/ipp.c:2024 scheduler/ipp.c:5748 +#: scheduler/ipp.c:2025 scheduler/ipp.c:5752 #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "" @@ -13625,7 +13740,7 @@ msgid "ppdc: Bad font attribute: %s" msgstr "" -#: ppdc/ppdc-source.cxx:1748 +#: ppdc/ppdc-source.cxx:1753 #, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." msgstr "" @@ -13635,12 +13750,12 @@ msgid "ppdc: Bad status keyword %s on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:1985 +#: ppdc/ppdc-source.cxx:1987 #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:2671 +#: ppdc/ppdc-source.cxx:2673 #, c-format msgid "ppdc: Choice found on line %d of %s with no Option." msgstr "" @@ -13700,7 +13815,7 @@ msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:2857 +#: ppdc/ppdc-source.cxx:2859 #, c-format msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s." msgstr "" @@ -13725,7 +13840,7 @@ msgid "ppdc: Expected group name/text on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:2570 +#: ppdc/ppdc-source.cxx:2572 #, c-format msgid "ppdc: Expected include filename on line %d of %s." msgstr "" @@ -13745,7 +13860,7 @@ msgid "ppdc: Expected name after %s on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:3229 +#: ppdc/ppdc-source.cxx:3231 #, c-format msgid "ppdc: Expected name after FileName on line %d of %s." msgstr "" @@ -13755,22 +13870,22 @@ msgid "ppdc: Expected name after Font on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:3060 +#: ppdc/ppdc-source.cxx:3062 #, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:3093 +#: ppdc/ppdc-source.cxx:3095 #, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:3183 +#: ppdc/ppdc-source.cxx:3185 #, c-format msgid "ppdc: Expected name after ModelName on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:3246 +#: ppdc/ppdc-source.cxx:3248 #, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s." msgstr "" @@ -13830,7 +13945,7 @@ msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:1815 +#: ppdc/ppdc-source.cxx:1817 #, c-format msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s." msgstr "" @@ -13845,12 +13960,12 @@ msgid "ppdc: Expected status after Font on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:2746 +#: ppdc/ppdc-source.cxx:2748 #, c-format msgid "ppdc: Expected string after Copyright on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:3349 +#: ppdc/ppdc-source.cxx:3351 #, c-format msgid "ppdc: Expected string after Version on line %d of %s." msgstr "" @@ -13915,13 +14030,13 @@ msgid "ppdc: Loading messages from \"%s\"." msgstr "" -#: ppdc/ppdc-source.cxx:2363 ppdc/ppdc-source.cxx:2595 +#: ppdc/ppdc-source.cxx:2365 ppdc/ppdc-source.cxx:2597 #, c-format msgid "ppdc: Missing #endif at end of \"%s\"." msgstr "" -#: ppdc/ppdc-source.cxx:2464 ppdc/ppdc-source.cxx:2499 -#: ppdc/ppdc-source.cxx:2529 +#: ppdc/ppdc-source.cxx:2466 ppdc/ppdc-source.cxx:2501 +#: ppdc/ppdc-source.cxx:2531 #, c-format msgid "ppdc: Missing #if on line %d of %s." msgstr "" @@ -13936,9 +14051,9 @@ msgid "ppdc: No message catalog provided for locale %s." msgstr "" -#: ppdc/ppdc-source.cxx:1603 ppdc/ppdc-source.cxx:2834 -#: ppdc/ppdc-source.cxx:2920 ppdc/ppdc-source.cxx:3013 -#: ppdc/ppdc-source.cxx:3146 ppdc/ppdc-source.cxx:3279 +#: ppdc/ppdc-source.cxx:1603 ppdc/ppdc-source.cxx:2836 +#: ppdc/ppdc-source.cxx:2922 ppdc/ppdc-source.cxx:3015 +#: ppdc/ppdc-source.cxx:3148 ppdc/ppdc-source.cxx:3281 #, c-format msgid "ppdc: Option %s defined in two different groups on line %d of %s." msgstr "" @@ -13953,7 +14068,7 @@ msgid "ppdc: Option constraint must *name on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:2446 +#: ppdc/ppdc-source.cxx:2448 #, c-format msgid "ppdc: Too many nested #if's on line %d of %s." msgstr "" @@ -13983,7 +14098,7 @@ msgid "ppdc: Unable to find #po file %s on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:2602 +#: ppdc/ppdc-source.cxx:2604 #, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." msgstr "" @@ -14003,7 +14118,7 @@ msgid "ppdc: Unable to open %s: %s" msgstr "" -#: ppdc/ppdc-source.cxx:2006 +#: ppdc/ppdc-source.cxx:2008 #, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s." msgstr "" @@ -14013,7 +14128,7 @@ msgid "ppdc: Unexpected text on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:2876 +#: ppdc/ppdc-source.cxx:2878 #, c-format msgid "ppdc: Unknown driver type %s on line %d of %s." msgstr "" @@ -14023,7 +14138,7 @@ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:3106 +#: ppdc/ppdc-source.cxx:3108 #, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s." msgstr "" @@ -14033,7 +14148,7 @@ msgid "ppdc: Unknown message catalog format for \"%s\"." msgstr "" -#: ppdc/ppdc-source.cxx:3360 +#: ppdc/ppdc-source.cxx:3362 #, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." msgstr "" @@ -14043,7 +14158,7 @@ msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." msgstr "" -#: ppdc/ppdc-source.cxx:2116 +#: ppdc/ppdc-source.cxx:2118 #, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s." msgstr "" @@ -14373,37 +14488,37 @@ msgid "print-supports.standard" msgstr "" -#: systemv/lpstat.c:1786 +#: systemv/lpstat.c:1787 #, c-format msgid "printer %s disabled since %s -" msgstr "" -#: systemv/lpstat.c:1778 +#: systemv/lpstat.c:1779 #, c-format msgid "printer %s is holding new jobs. enabled since %s" msgstr "" -#: systemv/lpstat.c:1780 +#: systemv/lpstat.c:1781 #, c-format msgid "printer %s is idle. enabled since %s" msgstr "" -#: systemv/lpstat.c:1783 +#: systemv/lpstat.c:1784 #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "" -#: systemv/lpstat.c:1904 +#: systemv/lpstat.c:1905 #, c-format msgid "printer %s/%s disabled since %s -" msgstr "" -#: systemv/lpstat.c:1890 +#: systemv/lpstat.c:1891 #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "" -#: systemv/lpstat.c:1897 +#: systemv/lpstat.c:1898 #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "" @@ -18527,7 +18642,7 @@ msgid "punching-reference-edge.top" msgstr "" -#: systemv/lp.c:642 +#: systemv/lp.c:645 #, c-format msgid "request id is %s-%d (%d file(s))" msgstr "" @@ -18591,11 +18706,11 @@ msgid "save-name" msgstr "" -#: systemv/lpstat.c:2032 +#: systemv/lpstat.c:2033 msgid "scheduler is not running" msgstr "" -#: systemv/lpstat.c:2028 +#: systemv/lpstat.c:2029 msgid "scheduler is running" msgstr "" @@ -18797,12 +18912,12 @@ msgid "subscription-privacy-scope.owner" msgstr "" -#: systemv/lpstat.c:1077 +#: systemv/lpstat.c:1078 #, c-format msgid "system default destination: %s" msgstr "" -#: systemv/lpstat.c:1074 +#: systemv/lpstat.c:1075 #, c-format msgid "system default destination: %s/%s" msgstr "" @@ -19014,42 +19129,42 @@ msgid "z-offset" msgstr "" -#: tools/ippfind.c:2814 +#: tools/ippfind.c:2828 msgid "{service_domain} Domain name" msgstr "" -#: tools/ippfind.c:2815 +#: tools/ippfind.c:2829 msgid "{service_hostname} Fully-qualified domain name" msgstr "" -#: tools/ippfind.c:2816 +#: tools/ippfind.c:2830 msgid "{service_name} Service instance name" msgstr "" -#: tools/ippfind.c:2817 +#: tools/ippfind.c:2831 msgid "{service_port} Port number" msgstr "" -#: tools/ippfind.c:2818 +#: tools/ippfind.c:2832 msgid "{service_regtype} DNS-SD registration type" msgstr "" -#: tools/ippfind.c:2819 +#: tools/ippfind.c:2833 msgid "{service_scheme} URI scheme" msgstr "" -#: tools/ippfind.c:2820 +#: tools/ippfind.c:2834 msgid "{service_uri} URI" msgstr "" -#: tools/ippfind.c:2821 +#: tools/ippfind.c:2835 msgid "{txt_*} Value of TXT record key" msgstr "" -#: tools/ippfind.c:2813 +#: tools/ippfind.c:2827 msgid "{} URI" msgstr "" -#: cups/dest.c:1863 +#: cups/dest.c:1867 msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" diff -Nru cups-2.3.3op2/locale/cups.strings cups-2.4.1op1/locale/cups.strings --- cups-2.3.3op2/locale/cups.strings 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups.strings 2022-01-27 11:11:42.000000000 +0000 @@ -253,27 +253,40 @@ "%s: Don't know what to do." = "%s: Don’t know what to do."; "%s: Error - %s" = "%s: Error - %s"; "%s: Error - %s environment variable names non-existent destination \"%s\"." = "%s: Error - %s environment variable names non-existent destination “%s”."; +"%s: Error - The printer or class does not exist." = "%s: Error - The printer or class does not exist."; "%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 - copies must be 1 or more." = "%s: Error - copies must be 1 or more."; +"%s: Error - expected \"username\" after \"-U\" option." = "%s: Error - expected “username” after “-U” option."; +"%s: Error - expected PPD file after \"-%c\" option." = "%s: Error - expected PPD file after “-%c” 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 MIME type after \"-m\" option." = "%s: Error - expected destination MIME type after “-m” 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 filename after \"-c\" option." = "%s: Error - expected filename after “-c” 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 input file after \"-f\" option." = "%s: Error - expected input file after “-f” option."; +"%s: Error - expected job-id after \"-j\" option." = "%s: Error - expected job-id after “-j” 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 name=value after \"-a\" option." = "%s: Error - expected name=value after “-a” option."; +"%s: Error - expected name=value after \"-o\" option." = "%s: Error - expected name=value after “-o” option."; +"%s: Error - expected number of copies after \"-n\" option." = "%s: Error - expected number of copies after “-n” 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 printer name after \"-d\" option." = "%s: Error - expected printer name after “-d” 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 source MIME type after \"-i\" option." = "%s: Error - expected source MIME type after “-i” option."; +"%s: Error - expected title after \"-%c\" option." = "%s: Error - expected title after “-%c” 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."; @@ -289,6 +302,7 @@ "%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: Error - unknown option \"-%c\"." = "%s: Error - unknown option “-%c”."; "%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”."; @@ -341,6 +355,7 @@ "--include-schemes scheme-list\n Include only the specified URI schemes" = "--include-schemes scheme-list\n Include only the specified URI schemes"; "--ippserver filename Produce ippserver attribute file" = "--ippserver filename Produce ippserver attribute file"; "--language locale Show models matching the given locale" = "--language locale Show models matching the given locale"; +"--literal-name name Match service name to literal name value" = "--literal-name name Match service name to literal name value"; "--local True if service is local" = "--local True if service is local"; "--ls List attributes" = "--ls List attributes"; "--make-and-model name Show models matching the given make and model name" = "--make-and-model name Show models matching the given make and model name"; @@ -425,6 +440,7 @@ "-L Send requests using content-length" = "-L Send requests using content-length"; "-L location Specify the textual location of the printer" = "-L location Specify the textual location of the printer"; "-M manufacturer Set manufacturer name (default=Test)" = "-M manufacturer Set manufacturer name (default=Test)"; +"-N name Match service name to literal name value" = "-N name Match service name to literal name value"; "-P destination Show status for the specified destination" = "-P destination Show status for the specified destination"; "-P destination Specify the destination" = "-P destination Specify the destination"; "-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"; @@ -435,6 +451,7 @@ "-R name-default Remove the default value for the named option" = "-R name-default Remove the default value for the named option"; "-R root-directory Set alternate root" = "-R root-directory Set alternate root"; "-S Test with encryption using HTTPS" = "-S Test with encryption using HTTPS"; +"-S filename.strings Set strings file" = "-S filename.strings Set strings file"; "-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"; "-T title Specify the job title" = "-T title Specify the job title"; @@ -470,7 +487,7 @@ "-h Validate HTTP response headers" = "-h Validate HTTP response headers"; "-h regex Match hostname to regular expression" = "-h regex Match hostname to regular expression"; "-h server[:port] Connect to the named server and port" = "-h server[:port] Connect to the named server and port"; -"-i iconfile.png Set icon file" = "-i iconfile.png Set icon file"; +"-i iconfile.png[,...] Set icon file(s)" = "-i iconfile.png[,…] Set icon file(s)"; "-i id Specify an existing job ID to modify" = "-i id Specify an existing job ID to modify"; "-i ppd-file Specify a PPD file for the printer" = "-i ppd-file Specify a PPD file for the printer"; "-i seconds Repeat the last file with the given time interval" = "-i seconds Repeat the last file with the given time interval"; @@ -639,7 +656,10 @@ "3.00x1.25\"" = "3.00x1.25″"; "3.00x2.00\"" = "3.00x2.00″"; "3.00x3.00\"" = "3.00x3.00″"; +"3.00x4.00\"" = "3.00x4.00″"; "3.00x5.00\"" = "3.00x5.00″"; +"3.00x6.00\"" = "3.00x6.00″"; +"3.00x8.00\"" = "3.00x8.00″"; "3.25x2.00\"" = "3.25x2.00″"; "3.25x5.00\"" = "3.25x5.00″"; "3.25x5.50\"" = "3.25x5.50″"; @@ -667,6 +687,7 @@ "4.00x5.00\"" = "4.00x5.00″"; "4.00x6.00\"" = "4.00x6.00″"; "4.00x6.50\"" = "4.00x6.50″"; +"4.00x8.00\"" = "4.00x8.00″"; "40" = "40"; "40 mm/sec." = "40 mm/sec."; "45" = "45"; @@ -684,6 +705,7 @@ "6.00x5.00\"" = "6.00x5.00″"; "6.00x6.00\"" = "6.00x6.00″"; "6.00x6.50\"" = "6.00x6.50″"; +"6.00x8.00\"" = "6.00x8.00″"; "60" = "60"; "60 mm/sec." = "60 mm/sec."; "600dpi" = "600dpi"; @@ -705,8 +727,10 @@ "8.00x5.00\"" = "8.00x5.00″"; "8.00x6.00\"" = "8.00x6.00″"; "8.00x6.50\"" = "8.00x6.50″"; +"8.26x1.00\"" = "8.26x1.00″"; "80" = "80"; "80 mm/sec." = "80 mm/sec."; +"80x50mm" = "80x50mm"; "85" = "85"; "9" = "9"; "9 inches/sec." = "9 inches/sec."; @@ -983,6 +1007,7 @@ "Get-Response-PDU uses indefinite length" = "Get-Response-PDU uses indefinite length"; "Glossy Paper" = "Glossy Paper"; "Got a printer-uri attribute but no job-id." = "Got a printer-uri attribute but no job-id."; +"GrayScale" = "GrayScale"; "Grayscale" = "Grayscale"; "HP" = "HP"; "Hanging Folder" = "Hanging Folder"; diff -Nru cups-2.3.3op2/locale/cups_ca.po cups-2.4.1op1/locale/cups_ca.po --- cups-2.3.3op2/locale/cups_ca.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_ca.po 2022-01-27 11:11:42.000000000 +0000 @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2012-09-29 11:21+0200\n" "Last-Translator: Àngel Mompó \n" "Language-Team: Catalan \n" @@ -1209,6 +1209,10 @@ "«%s»." #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "" @@ -1232,6 +1236,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "" "%s: error - s'esperava un conjunt de caràcters després de l'opció «-S»." @@ -1249,6 +1261,10 @@ msgstr "%s: error - s'esperaven còpies després de l'opció «-n»." #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: error - s'esperava un destí després de l'opció «-P»." @@ -1257,6 +1273,10 @@ msgstr "%s: error - s'esperava un destí després de l'opció «-d»." #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: error - s'esperava un formulari després de l'opció «-f»." @@ -1273,6 +1293,14 @@ msgstr "%s: error - s'esperava el nom de l'amfitrió després de l'opció «-h»." #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: error - s'esperava una llista de modes després de l'opció «-y»." @@ -1281,6 +1309,18 @@ msgstr "%s: error - s'esperava un nom després de l'opció «-%c»." #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: error - s'esperava opció=valor després de l'opció «-o»." @@ -1289,6 +1329,10 @@ msgstr "%s: error - s'esperava una llista de pàgines després de l'opció «-P»." #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: error - s'esperava una prioritat després de l'opció «-%c»." @@ -1297,6 +1341,14 @@ msgstr "%s: error - s'esperava una explicació després de l'opció «-r»." #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: error - s'esperava un títol després de l'opció «-t»." @@ -1361,6 +1413,10 @@ msgstr "%s: error - l'opció «%s» és desconeguda." #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: s'esperava l'ID d'una feina després de l'opció «-i»." @@ -1560,6 +1616,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1822,6 +1881,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1854,6 +1916,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1962,7 +2027,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2499,9 +2564,18 @@ msgid "3.00x3.00\"" msgstr "3.00x3.00\"" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3.00x5.00\"" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3.25x2.00\"" @@ -2583,6 +2657,9 @@ msgid "4.00x6.50\"" msgstr "4.00x6.50\"" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2634,6 +2711,9 @@ msgid "6.00x6.50\"" msgstr "6.00x6.50\"" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2697,12 +2777,18 @@ msgid "8.00x6.50\"" msgstr "8.00x6.50\"" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/seg." +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3600,6 +3686,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "S'ha obtingut l'atribut printer-uri però no el job-id." +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "Escala de grisos" diff -Nru cups-2.3.3op2/locale/cups_cs.po cups-2.4.1op1/locale/cups_cs.po --- cups-2.3.3op2/locale/cups_cs.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_cs.po 2022-01-27 11:11:42.000000000 +0000 @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2012-09-14 10:26+0100\n" "Last-Translator: Jan Bartos \n" "Language-Team: Czech\n" @@ -1066,6 +1066,10 @@ msgstr "" #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "" @@ -1086,6 +1090,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "" @@ -1102,6 +1114,10 @@ msgstr "" #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "" @@ -1110,6 +1126,10 @@ msgstr "" #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "" @@ -1126,6 +1146,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "" @@ -1134,6 +1162,18 @@ msgstr "" #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "" @@ -1142,6 +1182,10 @@ msgstr "" #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "" @@ -1150,6 +1194,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "" @@ -1212,6 +1264,10 @@ msgstr "" #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "" @@ -1409,6 +1465,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1671,6 +1730,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1703,6 +1765,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1811,7 +1876,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2348,9 +2413,18 @@ msgid "3.00x3.00\"" msgstr "3.00x3.00\"" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3.00x5.00\"" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3.25x2.00\"" @@ -2432,6 +2506,9 @@ msgid "4.00x6.50\"" msgstr "4.00x6.50\"" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2483,6 +2560,9 @@ msgid "6.00x6.50\"" msgstr "6.00x6.50\"" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2546,12 +2626,18 @@ msgid "8.00x6.50\"" msgstr "8.00x6.50\"" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/sek." +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3438,6 +3524,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "" +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "Stupně šedi" diff -Nru cups-2.3.3op2/locale/cups_da.po cups-2.4.1op1/locale/cups_da.po --- cups-2.3.3op2/locale/cups_da.po 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/locale/cups_da.po 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,19062 @@ +# Danish translation for CUPS +# +# Message catalog template for CUPS. +# +# Copyright © 2007-2019 by Apple Inc. +# Copyright © 2005-2007 by Easy Software Products. +# +# Licensed under Apache License v2.0. See the file "LICENSE" for more +# information. +# + +# +# 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. +# +# scootergrisen, 2019. +msgid "" +msgstr "" +"Project-Id-Version: CUPS 2.3.0\n" +"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" +"POT-Creation-Date: 2019-08-23 09:13-0400\n" +"PO-Revision-Date: 2019-12-30 19:44+0200\n" +"Last-Translator: scootergrisen\n" +"Language-Team: Danish\n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: systemv/lpstat.c:1871 systemv/lpstat.c:1990 +msgid "\t\t(all)" +msgstr "\t\t(alle)" + +#: systemv/lpstat.c:1874 systemv/lpstat.c:1877 systemv/lpstat.c:1993 +#: systemv/lpstat.c:1996 +msgid "\t\t(none)" +msgstr "\t\t(ingen)" + +#: berkeley/lpc.c:416 +#, c-format +msgid "\t%d entries" +msgstr "" + +#: systemv/lpstat.c:812 systemv/lpstat.c:828 +#, c-format +msgid "\t%s" +msgstr "" + +#: systemv/lpstat.c:1852 systemv/lpstat.c:1971 +msgid "\tAfter fault: continue" +msgstr "" + +#: systemv/lpstat.c:1488 systemv/lpstat.c:1825 systemv/lpstat.c:1945 +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +#: systemv/lpstat.c:1875 systemv/lpstat.c:1994 +msgid "\tBanner required" +msgstr "" + +#: systemv/lpstat.c:1876 systemv/lpstat.c:1995 +msgid "\tCharset sets:" +msgstr "" + +#: systemv/lpstat.c:1844 systemv/lpstat.c:1963 +msgid "\tConnection: direct" +msgstr "" + +#: systemv/lpstat.c:1835 systemv/lpstat.c:1955 +msgid "\tConnection: remote" +msgstr "" + +#: systemv/lpstat.c:1801 systemv/lpstat.c:1921 +msgid "\tContent types: any" +msgstr "" + +#: systemv/lpstat.c:1879 systemv/lpstat.c:1998 +msgid "\tDefault page size:" +msgstr "" + +#: systemv/lpstat.c:1878 systemv/lpstat.c:1997 +msgid "\tDefault pitch:" +msgstr "" + +#: systemv/lpstat.c:1880 systemv/lpstat.c:1999 +msgid "\tDefault port settings:" +msgstr "" + +#: systemv/lpstat.c:1807 systemv/lpstat.c:1927 +#, c-format +msgid "\tDescription: %s" +msgstr "" + +#: systemv/lpstat.c:1800 systemv/lpstat.c:1920 +msgid "\tForm mounted:" +msgstr "" + +#: systemv/lpstat.c:1873 systemv/lpstat.c:1992 +msgid "\tForms allowed:" +msgstr "" + +#: systemv/lpstat.c:1839 systemv/lpstat.c:1959 +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#: systemv/lpstat.c:1848 systemv/lpstat.c:1967 +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#: systemv/lpstat.c:1830 systemv/lpstat.c:1950 +#, c-format +msgid "\tLocation: %s" +msgstr "" + +#: systemv/lpstat.c:1851 systemv/lpstat.c:1970 +msgid "\tOn fault: no alert" +msgstr "" + +#: systemv/lpstat.c:1802 systemv/lpstat.c:1922 +msgid "\tPrinter types: unknown" +msgstr "" + +#: systemv/lpstat.c:1471 +#, c-format +msgid "\tStatus: %s" +msgstr "" + +#: systemv/lpstat.c:1856 systemv/lpstat.c:1870 systemv/lpstat.c:1975 +#: systemv/lpstat.c:1989 +msgid "\tUsers allowed:" +msgstr "" + +#: systemv/lpstat.c:1863 systemv/lpstat.c:1982 +msgid "\tUsers denied:" +msgstr "" + +#: berkeley/lpc.c:418 +msgid "\tdaemon present" +msgstr "" + +#: berkeley/lpc.c:414 +msgid "\tno entries" +msgstr "" + +#: berkeley/lpc.c:386 berkeley/lpc.c:398 +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +#: berkeley/lpc.c:411 +msgid "\tprinting is disabled" +msgstr "" + +#: berkeley/lpc.c:409 +msgid "\tprinting is enabled" +msgstr "" + +#: systemv/lpstat.c:1491 +#, c-format +msgid "\tqueued for %s" +msgstr "" + +#: berkeley/lpc.c:406 +msgid "\tqueuing is disabled" +msgstr "" + +#: berkeley/lpc.c:404 +msgid "\tqueuing is enabled" +msgstr "" + +#: systemv/lpstat.c:1793 systemv/lpstat.c:1913 +msgid "\treason unknown" +msgstr "" + +#: systemv/cupstestppd.c:431 +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +#: systemv/cupstestppd.c:387 systemv/cupstestppd.c:392 +msgid " REF: Page 15, section 3.1." +msgstr "" + +#: systemv/cupstestppd.c:382 +msgid " REF: Page 15, section 3.2." +msgstr "" + +#: systemv/cupstestppd.c:402 +msgid " REF: Page 19, section 3.3." +msgstr "" + +#: systemv/cupstestppd.c:355 +msgid " REF: Page 20, section 3.4." +msgstr "" + +#: systemv/cupstestppd.c:407 +msgid " REF: Page 27, section 3.5." +msgstr "" + +#: systemv/cupstestppd.c:350 +msgid " REF: Page 42, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:397 +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +#: systemv/cupstestppd.c:367 +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:361 +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:372 +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:377 +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#: berkeley/lpq.c:533 +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#: systemv/cupstestppd.c:566 +#, c-format +msgid " PASS Default%s" +msgstr "" + +#: systemv/cupstestppd.c:501 +msgid " PASS DefaultImageableArea" +msgstr "" + +#: systemv/cupstestppd.c:535 +msgid " PASS DefaultPaperDimension" +msgstr "" + +#: systemv/cupstestppd.c:608 +msgid " PASS FileVersion" +msgstr "" + +#: systemv/cupstestppd.c:652 +msgid " PASS FormatVersion" +msgstr "" + +#: systemv/cupstestppd.c:672 +msgid " PASS LanguageEncoding" +msgstr "" + +#: systemv/cupstestppd.c:692 +msgid " PASS LanguageVersion" +msgstr "" + +#: systemv/cupstestppd.c:746 +msgid " PASS Manufacturer" +msgstr "" + +#: systemv/cupstestppd.c:786 +msgid " PASS ModelName" +msgstr "" + +#: systemv/cupstestppd.c:806 +msgid " PASS NickName" +msgstr "" + +#: systemv/cupstestppd.c:866 +msgid " PASS PCFileName" +msgstr "" + +#: systemv/cupstestppd.c:941 +msgid " PASS PSVersion" +msgstr "" + +#: systemv/cupstestppd.c:846 +msgid " PASS PageRegion" +msgstr "" + +#: systemv/cupstestppd.c:826 +msgid " PASS PageSize" +msgstr "" + +#: systemv/cupstestppd.c:901 +msgid " PASS Product" +msgstr "" + +#: systemv/cupstestppd.c:976 +msgid " PASS ShortNickName" +msgstr "" + +#: systemv/cupstestppd.c:1351 +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#: systemv/cupstestppd.c:1463 +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#: systemv/cupstestppd.c:1322 +#, 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:1721 +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +#: systemv/cupstestppd.c:1367 +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1703 +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +#: systemv/cupstestppd.c:1375 +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1726 +msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF." +msgstr "" + +#: systemv/cupstestppd.c:1359 +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:1390 +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1398 +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1433 +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +#: systemv/cupstestppd.c:1424 +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +#: systemv/cupstestppd.c:1407 +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:3788 +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#: systemv/cupstestppd.c:2225 +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#: systemv/cupstestppd.c:3941 +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#: systemv/cupstestppd.c:2295 +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#: systemv/cupstestppd.c:3548 systemv/cupstestppd.c:3597 +#: systemv/cupstestppd.c:3636 +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#: systemv/cupstestppd.c:3502 +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#: systemv/cupstestppd.c:2366 systemv/cupstestppd.c:2388 +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:2484 systemv/cupstestppd.c:2506 +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:3005 +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#: systemv/cupstestppd.c:2612 +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:1799 +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#: systemv/cupstestppd.c:3452 +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:2442 systemv/cupstestppd.c:2570 +#: systemv/cupstestppd.c:2656 systemv/cupstestppd.c:2714 +#: systemv/cupstestppd.c:2769 systemv/cupstestppd.c:2824 +#: systemv/cupstestppd.c:2879 systemv/cupstestppd.c:2932 +#: systemv/cupstestppd.c:3054 +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:2350 systemv/cupstestppd.c:2468 +#: systemv/cupstestppd.c:2596 systemv/cupstestppd.c:2683 +#: systemv/cupstestppd.c:2738 systemv/cupstestppd.c:2793 +#: systemv/cupstestppd.c:2848 systemv/cupstestppd.c:2903 +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#: systemv/cupstestppd.c:2948 +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#: systemv/cupstestppd.c:2182 +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#: systemv/cupstestppd.c:1780 +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#: systemv/cupstestppd.c:3580 systemv/cupstestppd.c:3620 +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#: systemv/cupstestppd.c:3488 +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#: systemv/cupstestppd.c:2427 systemv/cupstestppd.c:2555 +#: systemv/cupstestppd.c:2641 systemv/cupstestppd.c:2699 +#: systemv/cupstestppd.c:2754 systemv/cupstestppd.c:2809 +#: systemv/cupstestppd.c:2864 systemv/cupstestppd.c:2916 +#: systemv/cupstestppd.c:3039 +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:3162 +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:3147 +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:1990 systemv/cupstestppd.c:2031 +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#: systemv/cupstestppd.c:1885 +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#: systemv/cupstestppd.c:1817 +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#: systemv/cupstestppd.c:1976 systemv/cupstestppd.c:2017 +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#: systemv/cupstestppd.c:1869 +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#: systemv/cupstestppd.c:3674 +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#: systemv/cupstestppd.c:2271 +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#: systemv/cupstestppd.c:3221 systemv/cupstestppd.c:3235 +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#: systemv/cupstestppd.c:3201 +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#: systemv/cupstestppd.c:3392 +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:3341 +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:3082 +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#: systemv/cupstestppd.c:1940 +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#: systemv/cupstestppd.c:1922 +#, c-format +msgid " %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#: systemv/cupstestppd.c:1145 +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#: systemv/cupstestppd.c:557 +#, c-format +msgid "" +" **FAIL** Bad Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#: systemv/cupstestppd.c:491 +#, c-format +msgid "" +" **FAIL** Bad DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:527 +#, c-format +msgid "" +" **FAIL** Bad DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:600 +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:644 +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1002 +msgid "" +" **FAIL** Bad JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +#: systemv/cupstestppd.c:1190 +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#: systemv/cupstestppd.c:1204 +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#: systemv/cupstestppd.c:720 systemv/cupstestppd.c:737 +#, c-format +msgid "" +" **FAIL** Bad Manufacturer (should be \"%s\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#: systemv/cupstestppd.c:777 +#, c-format +msgid "" +" **FAIL** Bad ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:933 +msgid "" +" **FAIL** Bad PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:894 +msgid "" +" **FAIL** Bad Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:968 +msgid "" +" **FAIL** Bad ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1126 +#, c-format +msgid "" +" **FAIL** Bad option %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#: systemv/cupstestppd.c:3815 systemv/cupstestppd.c:3837 +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#: systemv/cupstestppd.c:1263 +#, c-format +msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters." +msgstr "" + +#: systemv/cupstestppd.c:1236 +#, c-format +msgid " **FAIL** Default translation string for option %s contains 8-bit characters." +msgstr "" + +#: systemv/cupstestppd.c:2078 +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#: systemv/cupstestppd.c:2123 +#, c-format +msgid " **FAIL** Multiple occurrences of option %s choice name %s." +msgstr "" + +#: systemv/cupstestppd.c:2140 +#, c-format +msgid " **FAIL** Option %s choice names %s and %s differ only by case." +msgstr "" + +#: systemv/cupstestppd.c:2100 +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#: systemv/cupstestppd.c:577 +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#: systemv/cupstestppd.c:476 +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:512 +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:618 +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:662 +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1053 +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:682 +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:702 +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:756 +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:796 +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:816 +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:876 +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:951 +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:856 +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:1022 +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:836 +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:1075 +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:911 +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:986 +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:311 systemv/cupstestppd.c:330 +#: systemv/cupstestppd.c:342 +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#: systemv/cupstestppd.c:1475 +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +#: systemv/cupstestppd.c:1477 +msgid " NO ERRORS FOUND" +msgstr "" + +#: ppdc/ppdc.cxx:444 +msgid " --cr End lines with CR (Mac OS 9)." +msgstr " --cr Afslut linjer med CR (Mac OS 9)." + +#: ppdc/ppdc.cxx:446 +msgid " --crlf End lines with CR + LF (Windows)." +msgstr " --crlf Afslut linjer med CR + LF (Windows)." + +#: ppdc/ppdc.cxx:448 +msgid " --lf End lines with LF (UNIX/Linux/macOS)." +msgstr " --lf Afslut linjer med LF (UNIX/Linux/macOS)." + +#: scheduler/cupsfilter.c:1477 +msgid " --list-filters List filters that will be used." +msgstr " --list-filters Vis filtre som skal bruges." + +#: scheduler/cupsfilter.c:1478 +msgid " -D Remove the input file when finished." +msgstr " -D Fjern inputfilen når færdig." + +#: ppdc/ppdc.cxx:427 ppdc/ppdhtml.cxx:174 ppdc/ppdpo.cxx:244 +msgid " -D name=value Set named variable to value." +msgstr " -D navn=værdi Indstil navngivet variabel til værdi." + +#: ppdc/ppdc.cxx:429 ppdc/ppdhtml.cxx:176 ppdc/ppdi.cxx:120 ppdc/ppdpo.cxx:246 +msgid " -I include-dir Add include directory to search path." +msgstr " -I include-mappe Tilføj include-mappe til søgesti." + +#: scheduler/cupsfilter.c:1479 +msgid " -P filename.ppd Set PPD file." +msgstr " -P filnavn.ppd Indstil PPD-fil." + +#: scheduler/cupsfilter.c:1480 +msgid " -U username Specify username." +msgstr " -U brugernavn Angiv brugernavn." + +#: ppdc/ppdc.cxx:431 +msgid " -c catalog.po Load the specified message catalog." +msgstr " -c katalog.po Indlæs det angivne meddelelseskatalog." + +#: scheduler/cupsfilter.c:1481 +msgid " -c cups-files.conf Set cups-files.conf file to use." +msgstr " -c cups-files.conf Indstil cups-files.conf-fil som skal bruges." + +#: ppdc/ppdc.cxx:433 +msgid " -d output-dir Specify the output directory." +msgstr " -d outputmappe Angiv outputmappen." + +#: scheduler/cupsfilter.c:1482 +msgid " -d printer Use the named printer." +msgstr " -d printer Brug den angivne printer." + +#: scheduler/cupsfilter.c:1483 +msgid " -e Use every filter from the PPD file." +msgstr " -e Brug alle filtre fra PPD-filen." + +#: scheduler/cupsfilter.c:1484 +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" +" -i mime/type Indstil input-MIME-type (ellers findes typen " +"automatisk)." + +#: scheduler/cupsfilter.c:1485 +msgid " -j job-id[,N] Filter file N from the specified job (default is file 1)." +msgstr "" +" -j job-id[,N] Filtrér fil N fra det angivne job (standard er fil " +"1)." + +#: ppdc/ppdc.cxx:435 +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr " -l sprog[,sprog,...] Angiv outputsprogene (lokalitet)." + +#: ppdc/ppdc.cxx:437 +msgid " -m Use the ModelName value as the filename." +msgstr " -m Brug ModelName-værdien som filnavnet." + +#: scheduler/cupsfilter.c:1486 +msgid " -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" +" -m mime/type Indstil output-MIME-type (ellers bruges " +"application/pdf)." + +#: scheduler/cupsfilter.c:1487 +msgid " -n copies Set number of copies." +msgstr " -n kopier Indstil antal kopier." + +#: ppdc/ppdi.cxx:122 +msgid " -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" +" -o filnavn.drv Indstil driverinformationsfil (ellers bruges " +"ppdi.drv)." + +#: ppdc/ppdmerge.cxx:357 +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr " -o filnavn.ppd[.gz] Indstil outputfil (ellers bruges stdout)." + +#: scheduler/cupsfilter.c:1488 +msgid " -o name=value Set option(s)." +msgstr " -o navn=værdi Indstil tilvalg." + +#: scheduler/cupsfilter.c:1489 +msgid " -p filename.ppd Set PPD file." +msgstr " -p filnavn.ppd Indstil PPD-fil." + +#: ppdc/ppdc.cxx:439 +msgid " -t Test PPDs instead of generating them." +msgstr " -t Test PPD'er i stedet for at oprette dem." + +#: scheduler/cupsfilter.c:1490 +msgid " -t title Set title." +msgstr " -t titel Indstil titel." + +#: scheduler/cupsfilter.c:1491 +msgid " -u Remove the PPD file when finished." +msgstr " -u Fjern PPD-filen når færdig." + +#: ppdc/ppdc.cxx:441 ppdc/ppdpo.cxx:248 +msgid " -v Be verbose." +msgstr " -v Vær uddybende." + +#: ppdc/ppdc.cxx:442 +msgid " -z Compress PPD files using GNU zip." +msgstr " -z Komprimer PPD-filer med GNU zip." + +#: systemv/cupstestppd.c:309 systemv/cupstestppd.c:328 +#: systemv/cupstestppd.c:340 systemv/cupstestppd.c:473 +#: systemv/cupstestppd.c:488 systemv/cupstestppd.c:509 +#: systemv/cupstestppd.c:524 systemv/cupstestppd.c:554 +#: systemv/cupstestppd.c:574 systemv/cupstestppd.c:597 +#: systemv/cupstestppd.c:615 systemv/cupstestppd.c:641 +#: systemv/cupstestppd.c:659 systemv/cupstestppd.c:679 +#: systemv/cupstestppd.c:699 systemv/cupstestppd.c:717 +#: systemv/cupstestppd.c:734 systemv/cupstestppd.c:753 +#: systemv/cupstestppd.c:774 systemv/cupstestppd.c:793 +#: systemv/cupstestppd.c:813 systemv/cupstestppd.c:833 +#: systemv/cupstestppd.c:853 systemv/cupstestppd.c:873 +#: systemv/cupstestppd.c:891 systemv/cupstestppd.c:908 +#: systemv/cupstestppd.c:930 systemv/cupstestppd.c:948 +#: systemv/cupstestppd.c:965 systemv/cupstestppd.c:983 +#: systemv/cupstestppd.c:999 systemv/cupstestppd.c:1019 +#: systemv/cupstestppd.c:1050 systemv/cupstestppd.c:1072 +#: systemv/cupstestppd.c:1123 systemv/cupstestppd.c:1142 +#: systemv/cupstestppd.c:1186 systemv/cupstestppd.c:1200 +#: systemv/cupstestppd.c:1232 systemv/cupstestppd.c:1259 +#: systemv/cupstestppd.c:1777 systemv/cupstestppd.c:1796 +#: systemv/cupstestppd.c:1814 systemv/cupstestppd.c:1866 +#: systemv/cupstestppd.c:1882 systemv/cupstestppd.c:1919 +#: systemv/cupstestppd.c:1937 systemv/cupstestppd.c:1973 +#: systemv/cupstestppd.c:1987 systemv/cupstestppd.c:2014 +#: systemv/cupstestppd.c:2028 systemv/cupstestppd.c:2074 +#: systemv/cupstestppd.c:2096 systemv/cupstestppd.c:2119 +#: systemv/cupstestppd.c:2136 systemv/cupstestppd.c:2178 +#: systemv/cupstestppd.c:2221 systemv/cupstestppd.c:2268 +#: systemv/cupstestppd.c:2292 systemv/cupstestppd.c:2346 +#: systemv/cupstestppd.c:2362 systemv/cupstestppd.c:2384 +#: systemv/cupstestppd.c:2424 systemv/cupstestppd.c:2438 +#: systemv/cupstestppd.c:2464 systemv/cupstestppd.c:2480 +#: systemv/cupstestppd.c:2502 systemv/cupstestppd.c:2552 +#: systemv/cupstestppd.c:2566 systemv/cupstestppd.c:2592 +#: systemv/cupstestppd.c:2608 systemv/cupstestppd.c:2638 +#: systemv/cupstestppd.c:2652 systemv/cupstestppd.c:2679 +#: systemv/cupstestppd.c:2696 systemv/cupstestppd.c:2710 +#: systemv/cupstestppd.c:2734 systemv/cupstestppd.c:2751 +#: systemv/cupstestppd.c:2765 systemv/cupstestppd.c:2789 +#: systemv/cupstestppd.c:2806 systemv/cupstestppd.c:2820 +#: systemv/cupstestppd.c:2844 systemv/cupstestppd.c:2861 +#: systemv/cupstestppd.c:2875 systemv/cupstestppd.c:2899 +#: systemv/cupstestppd.c:2913 systemv/cupstestppd.c:2928 +#: systemv/cupstestppd.c:2945 systemv/cupstestppd.c:3001 +#: systemv/cupstestppd.c:3036 systemv/cupstestppd.c:3050 +#: systemv/cupstestppd.c:3078 systemv/cupstestppd.c:3143 +#: systemv/cupstestppd.c:3158 systemv/cupstestppd.c:3197 +#: systemv/cupstestppd.c:3217 systemv/cupstestppd.c:3231 +#: systemv/cupstestppd.c:3448 systemv/cupstestppd.c:3484 +#: systemv/cupstestppd.c:3498 systemv/cupstestppd.c:3544 +#: systemv/cupstestppd.c:3576 systemv/cupstestppd.c:3593 +#: systemv/cupstestppd.c:3616 systemv/cupstestppd.c:3632 +#: systemv/cupstestppd.c:3670 systemv/cupstestppd.c:3811 +#: systemv/cupstestppd.c:3833 systemv/cupstestppd.c:3937 +msgid " FAIL" +msgstr "" + +#: systemv/cupstestppd.c:1283 +msgid " PASS" +msgstr "" + +#: tools/ippfind.c:2803 +msgid "! expression Unary NOT of expression" +msgstr "" + +#: cups/ipp.c:5045 +#, c-format +msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." +msgstr "" + +#: cups/ipp.c:5051 +#, c-format +msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)." +msgstr "" + +#: cups/ipp.c:4753 +#, c-format +msgid "\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)." +msgstr "" + +#: cups/ipp.c:4747 +#, c-format +msgid "\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)." +msgstr "" + +#: cups/ipp.c:4768 +#, c-format +msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." +msgstr "" + +#: cups/ipp.c:5096 +#, c-format +msgid "\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)." +msgstr "" + +#: cups/ipp.c:5102 +#, c-format +msgid "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." +msgstr "" + +#: cups/ipp.c:4845 +#, c-format +msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4851 +#, c-format +msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4839 +#, c-format +msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4809 +#, c-format +msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4833 +#, c-format +msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4815 +#, c-format +msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4821 +#, c-format +msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4803 +#, c-format +msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4827 +#, c-format +msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." +msgstr "" + +#: cups/ipp.c:4779 +#, c-format +msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." +msgstr "" + +#: cups/ipp.c:5032 +#, c-format +msgid "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)." +msgstr "" + +#: cups/ipp.c:5026 +#, c-format +msgid "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section 5.1.4)." +msgstr "" + +#: cups/ipp.c:5187 +#, c-format +msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section 5.1.10)." +msgstr "" + +#: cups/ipp.c:5194 +#, c-format +msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section 5.1.10)." +msgstr "" + +#: cups/ipp.c:5001 +#, c-format +msgid "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)." +msgstr "" + +#: cups/ipp.c:4996 +#, c-format +msgid "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section 8.1)." +msgstr "" + +#: cups/ipp.c:5008 +#, c-format +msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." +msgstr "" + +#: cups/ipp.c:5142 +#, c-format +msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section 5.1.9)." +msgstr "" + +#: cups/ipp.c:5149 +#, c-format +msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section 5.1.9)." +msgstr "" + +#: cups/ipp.c:4790 +#, c-format +msgid "\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)." +msgstr "" + +#: cups/ipp.c:4885 +#, c-format +msgid "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 section 5.1.14)." +msgstr "" + +#: cups/ipp.c:4874 +#, c-format +msgid "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section 5.1.16)." +msgstr "" + +#: cups/ipp.c:4862 +#, c-format +msgid "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 8011 section 5.1.16)." +msgstr "" + +#: cups/ipp.c:4868 +#, c-format +msgid "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 8011 section 5.1.16)." +msgstr "" + +#: cups/ipp.c:4946 +#, c-format +msgid "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)." +msgstr "" + +#: cups/ipp.c:4941 +#, c-format +msgid "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section 8.3)." +msgstr "" + +#: cups/ipp.c:4953 +#, c-format +msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." +msgstr "" + +#: cups/ipp.c:5072 +#, c-format +msgid "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)." +msgstr "" + +#: cups/ipp.c:5078 +#, c-format +msgid "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)." +msgstr "" + +#: scheduler/ipp.c:365 +msgid "\"requesting-user-name\" attribute in wrong group." +msgstr "" + +#: scheduler/ipp.c:371 scheduler/ipp.c:386 +msgid "\"requesting-user-name\" attribute with wrong syntax." +msgstr "" + +#: berkeley/lpq.c:538 +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#: cups/dest-localization.c:156 +#, c-format +msgid "%d x %d mm" +msgstr "" + +#: cups/dest-localization.c:148 +#, c-format +msgid "%g x %g \"" +msgstr "" + +#: cups/dest-localization.c:189 cups/dest-localization.c:196 +#, c-format +msgid "%s (%s)" +msgstr "" + +#: cups/dest-localization.c:203 +#, c-format +msgid "%s (%s, %s)" +msgstr "" + +#: cups/dest-localization.c:180 +#, c-format +msgid "%s (Borderless)" +msgstr "" + +#: cups/dest-localization.c:187 cups/dest-localization.c:194 +#, c-format +msgid "%s (Borderless, %s)" +msgstr "" + +#: cups/dest-localization.c:201 +#, c-format +msgid "%s (Borderless, %s, %s)" +msgstr "" + +#: systemv/lpstat.c:806 +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#: scheduler/ipp.c:10327 +#, c-format +msgid "%s cannot be changed." +msgstr "" + +#: berkeley/lpc.c:175 +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#: berkeley/lpq.c:623 +#, c-format +msgid "%s is not ready" +msgstr "" + +#: berkeley/lpq.c:616 +#, c-format +msgid "%s is ready" +msgstr "" + +#: berkeley/lpq.c:619 +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#: filter/rastertoepson.c:999 filter/rastertohp.c:668 +#: filter/rastertolabel.c:1120 +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#: systemv/lpstat.c:810 +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#: scheduler/ipp.c:608 +#, c-format +msgid "%s not supported." +msgstr "" + +#: systemv/lpstat.c:821 +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#: systemv/lpstat.c:826 +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#: berkeley/lpq.c:531 +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#: cups/langprintf.c:70 scheduler/cupsfilter.c:720 systemv/lpadmin.c:795 +#: systemv/lpadmin.c:844 systemv/lpadmin.c:892 systemv/lpadmin.c:945 +#: systemv/lpadmin.c:1043 systemv/lpadmin.c:1095 systemv/lpadmin.c:1136 +#: systemv/lpadmin.c:1150 systemv/lpadmin.c:1599 +#, c-format +msgid "%s: %s" +msgstr "" + +#: systemv/cancel.c:310 systemv/cancel.c:374 +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#: systemv/lpadmin.c:1209 +#, c-format +msgid "%s: Bad printer URI \"%s\"." +msgstr "" + +#: tools/ippfind.c:768 tools/ipptool.c:412 +#, c-format +msgid "%s: Bad version %s for \"-V\"." +msgstr "" + +#: systemv/cupsaccept.c:67 +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#: berkeley/lpr.c:354 systemv/lp.c:589 +#, c-format +msgid "%s: Error - %s" +msgstr "" + +#: berkeley/lpq.c:233 +#, c-format +msgid "%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#: berkeley/lpq.c:138 berkeley/lpq.c:211 berkeley/lpr.c:234 berkeley/lpr.c:345 +#: systemv/lp.c:160 systemv/lp.c:580 systemv/lp.c:677 systemv/lp.c:727 +#: systemv/lpstat.c:190 systemv/lpstat.c:235 systemv/lpstat.c:368 +#: systemv/lpstat.c:395 systemv/lpstat.c:417 systemv/lpstat.c:477 +#: systemv/lpstat.c:543 systemv/lpstat.c:604 systemv/lpstat.c:727 +#: systemv/lpstat.c:907 systemv/lpstat.c:1164 systemv/lpstat.c:1356 +#: systemv/lpstat.c:1593 +#, c-format +msgid "%s: Error - add '/version=1.1' to server name." +msgstr "" + +#: systemv/lp.c:237 +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#: systemv/lp.c:226 +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#: systemv/lp.c:517 +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#: berkeley/lpr.c:259 systemv/lp.c:279 +#, c-format +msgid "%s: Error - copies must be 1 or more." +msgstr "" + +#: systemv/lp.c:469 +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#: systemv/lp.c:488 +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#: berkeley/lpr.c:250 +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#: systemv/lp.c:270 +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#: berkeley/lpr.c:212 +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#: systemv/lp.c:136 +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#: systemv/lp.c:177 +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#: systemv/lp.c:405 +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#: berkeley/lpr.c:109 +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#: berkeley/lpq.c:172 berkeley/lprm.c:130 systemv/cancel.c:130 +#: systemv/cupsaccept.c:133 systemv/lp.c:197 systemv/lpstat.c:304 +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#: systemv/lp.c:385 +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#: berkeley/lpr.c:280 +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#: berkeley/lpr.c:161 systemv/lp.c:300 +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#: systemv/lp.c:448 +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#: systemv/lp.c:321 +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#: systemv/cupsaccept.c:152 +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#: systemv/lp.c:366 +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#: berkeley/lpq.c:101 berkeley/lpr.c:89 berkeley/lprm.c:110 +#: systemv/cancel.c:100 systemv/cupsaccept.c:110 systemv/lp.c:113 +#: systemv/lpadmin.c:439 systemv/lpstat.c:129 +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#: systemv/cancel.c:152 +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#: berkeley/lpr.c:134 +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#: systemv/lpstat.c:149 systemv/lpstat.c:158 +#, c-format +msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option." +msgstr "" + +#: berkeley/lpq.c:238 +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#: systemv/lp.c:341 +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#: berkeley/lpr.c:356 systemv/lp.c:591 +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#: berkeley/lpr.c:321 systemv/lp.c:549 +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#: berkeley/lpr.c:303 systemv/lp.c:532 +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#: berkeley/lpr.c:398 systemv/lp.c:621 +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#: berkeley/lprm.c:92 berkeley/lprm.c:179 systemv/cancel.c:227 +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#: berkeley/lpq.c:140 +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#: berkeley/lpr.c:289 berkeley/lprm.c:145 systemv/cancel.c:168 +#: systemv/cupsaccept.c:161 systemv/lp.c:507 systemv/lpstat.c:487 +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#: systemv/lp.c:499 +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#: systemv/lp.c:217 +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#: systemv/lpstat.c:547 systemv/lpstat.c:587 +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#: scheduler/cupsfilter.c:573 +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#: tools/ipptool.c:334 +#, c-format +msgid "%s: Missing filename for \"-P\"." +msgstr "" + +#: tools/ippfind.c:740 tools/ipptool.c:371 +#, c-format +msgid "%s: Missing timeout for \"-T\"." +msgstr "" + +#: tools/ippfind.c:753 tools/ipptool.c:385 +#, c-format +msgid "%s: Missing version for \"-V\"." +msgstr "" + +#: systemv/lp.c:425 +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#: scheduler/cupsfilter.c:445 +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#: systemv/cupsaccept.c:195 +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#: berkeley/lpq.c:86 berkeley/lpr.c:74 berkeley/lprm.c:71 systemv/cancel.c:85 +#: systemv/cupsaccept.c:95 systemv/lp.c:98 systemv/lpadmin.c:249 +#: systemv/lpinfo.c:192 systemv/lpmove.c:69 systemv/lpstat.c:91 +#: tools/ipptool.c:316 tools/ipptool.c:360 +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#: systemv/lpadmin.c:1216 +#, c-format +msgid "%s: Unable to connect to \"%s:%d\": %s" +msgstr "" + +#: berkeley/lpq.c:292 scheduler/cupsfilter.c:1269 systemv/cancel.c:250 +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#: systemv/cancel.c:334 +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#: systemv/lpadmin.c:1246 +#, c-format +msgid "%s: Unable to create PPD file: %s" +msgstr "" + +#: scheduler/cupsfilter.c:410 +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#: tools/ipptool.c:277 tools/ipptool.c:343 +#, c-format +msgid "%s: Unable to open \"%s\": %s" +msgstr "" + +#: ppdc/ppdmerge.cxx:86 +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#: scheduler/cupsfilter.c:668 ppdc/ppdmerge.cxx:102 +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#: systemv/lpadmin.c:1231 +#, c-format +msgid "%s: Unable to query printer: %s" +msgstr "" + +#: scheduler/cupsfilter.c:377 +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#: systemv/lpadmin.c:1200 +#, c-format +msgid "%s: Unable to resolve \"%s\"." +msgstr "" + +#: systemv/lpinfo.c:238 +#, c-format +msgid "%s: Unknown argument \"%s\"." +msgstr "" + +#: berkeley/lpq.c:142 systemv/lpstat.c:608 +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#: scheduler/cupsfilter.c:422 +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#: scheduler/cupsfilter.c:1473 systemv/lpinfo.c:231 systemv/lpmove.c:94 +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#: tools/ippeveprinter.c:381 tools/ippeveprinter.c:566 tools/ippfind.c:627 +#, c-format +msgid "%s: Unknown option \"%s\"." +msgstr "" + +#: tools/ippeveprinter.c:555 tools/ippfind.c:919 tools/ipptool.c:606 +#, c-format +msgid "%s: Unknown option \"-%c\"." +msgstr "" + +#: scheduler/cupsfilter.c:402 +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#: berkeley/lpr.c:147 +#, c-format +msgid "%s: Warning - \"%c\" format modifier not supported - output may not be correct." +msgstr "" + +#: systemv/lp.c:474 +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#: systemv/lp.c:493 +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#: systemv/lp.c:182 +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#: systemv/lp.c:390 +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +#: tools/ippfind.c:2802 +msgid "( expressions ) Group expressions" +msgstr "( udtryk ) Gruppér udtryk" + +#: berkeley/lprm.c:233 +msgid "- Cancel all jobs" +msgstr "- Annuller alle jobs" + +#: berkeley/lpr.c:432 +msgid "-# num-copies Specify the number of copies to print" +msgstr "-# antal-kopier Angiv antallet af kopier som skal udskrives" + +#: systemv/cupsctl.c:236 +msgid "--[no-]debug-logging Turn debug logging on/off" +msgstr "--[no-]debug-logging Fejlretningslogning til/fra" + +#: systemv/cupsctl.c:237 +msgid "--[no-]remote-admin Turn remote administration on/off" +msgstr "--[no-]remote-admin Fjernadministration til/fra" + +#: systemv/cupsctl.c:238 +msgid "--[no-]remote-any Allow/prevent access from the Internet" +msgstr "--[no-]remote-any Tillad/forhindr adgang fra internettet" + +#: systemv/cupsctl.c:239 +msgid "--[no-]share-printers Turn printer sharing on/off" +msgstr "--[no-]share-printers Printerdeling til/fra" + +#: systemv/cupsctl.c:240 +msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" +msgstr "--[no-]user-cancel-any Tillad/forhindr brugere i at annullere job" + +#: systemv/lpinfo.c:504 +msgid "--device-id device-id Show models matching the given IEEE 1284 device ID" +msgstr "" +"--device-id enheds-id Vis modeller som matcher det angive IEEE 1284 " +"enheds-ID" + +#: tools/ippfind.c:2785 +msgid "--domain regex Match domain to regular expression" +msgstr "--domain reg-udtryk Match domæne til regulært udtryk" + +#: systemv/lpinfo.c:505 +msgid "" +"--exclude-schemes scheme-list\n" +" Exclude the specified URI schemes" +msgstr "" +"--exclude-schemes skemaliste\n" +" Udeluk de angivne URI-skemaer" + +#: tools/ippfind.c:2786 +msgid "" +"--exec utility [argument ...] ;\n" +" Execute program if true" +msgstr "" +"--exec redskab [argument ...] ;\n" +" Kør program, hvis sand" + +#: tools/ippfind.c:2805 +msgid "--false Always false" +msgstr "--false Altid falsk" + +#: tools/ippeveprinter.c:7665 +msgid "--help Show program help" +msgstr "--help Vis hjælp til program" + +#: systemv/cupsaccept.c:249 +msgid "--hold Hold new jobs" +msgstr "--hold Tilbagehold nye jobs" + +#: tools/ippfind.c:2788 +msgid "--host regex Match hostname to regular expression" +msgstr "--host reg-udtryk Match værtsnavn til regulært udtryk" + +#: systemv/lpinfo.c:507 +msgid "" +"--include-schemes scheme-list\n" +" Include only the specified URI schemes" +msgstr "" +"--include-schemes skemaliste\n" +" Medtag kun de angive URI-skemaer" + +#: tools/ipptool.c:4308 +msgid "--ippserver filename Produce ippserver attribute file" +msgstr "--ippserver filnavn Generer ippserver-attributfil" + +#: systemv/lpinfo.c:509 +msgid "--language locale Show models matching the given locale" +msgstr "--language lokalitet Vis modeller som matcher den angivne lokalitet" + +#: tools/ippfind.c:2790 +msgid "--local True if service is local" +msgstr "--local Sand hvis tjeneste er lokal" + +#: tools/ippfind.c:2789 +msgid "--ls List attributes" +msgstr "--ls Vis attributter" + +#: systemv/lpinfo.c:510 +msgid "--make-and-model name Show models matching the given make and model name" +msgstr "" +"--make-and-model navn Vis modeller som matcher det angivne mærke og " +"modelnavn" + +#: tools/ippfind.c:2791 +msgid "--name regex Match service name to regular expression" +msgstr "--name reg-udtryk Match tjenestenavn til regulært udtryk" + +#: tools/ippeveprinter.c:7666 +msgid "--no-web-forms Disable web forms for media and supplies" +msgstr "" +"--no-web-forms Deaktivér webformularer for medier og forsyninger" + +#: tools/ippfind.c:2804 +msgid "--not expression Unary NOT of expression" +msgstr "--not udtryk Unær IKKE af udtryk" + +#: tools/ippfind.c:2792 +msgid "--path regex Match resource path to regular expression" +msgstr "--path reg-udtryk Match ressourcesti til regulært udtryk" + +#: tools/ippfind.c:2793 +msgid "--port number[-number] Match port to number or range" +msgstr "--port nummer[-nummer] Match port til nummer eller område" + +#: tools/ippfind.c:2794 +msgid "--print Print URI if true" +msgstr "--print Udskriv URI, hvis sand" + +#: tools/ippfind.c:2795 +msgid "--print-name Print service name if true" +msgstr "--print-name Udskriv tjenestenavn, hvis sand" + +#: systemv/lpinfo.c:511 +msgid "--product name Show models matching the given PostScript product" +msgstr "" +"--product navn Vis modeller som matcher det angivne PostScript-" +"produkt" + +#: tools/ippfind.c:2796 +msgid "--quiet Quietly report match via exit code" +msgstr "" +"--quiet Stille rapportering af match via afslutningskode" + +#: systemv/cupsaccept.c:251 +msgid "--release Release previously held jobs" +msgstr "--release Frigiv tidligere tilbageholdte jobs" + +#: tools/ippfind.c:2797 +msgid "--remote True if service is remote" +msgstr "--remote Sand hvis fjerntjeneste" + +#: tools/ipptool.c:4309 +msgid "" +"--stop-after-include-error\n" +" Stop tests after a failed INCLUDE" +msgstr "" +"--stop-after-include-error\n" +" Stop tests efter et mislykket INCLUDE" + +#: systemv/lpinfo.c:512 +msgid "--timeout seconds Specify the maximum number of seconds to discover devices" +msgstr "" +"--timeout sekunder Angiv maksimum antal sekunder til opdagelse af " +"enheder" + +#: tools/ippfind.c:2806 +msgid "--true Always true" +msgstr "--true Altid sand" + +#: tools/ippfind.c:2798 +msgid "--txt key True if the TXT record contains the key" +msgstr "--txt nøgle Sand hvis TXT-registreringen indeholder nøglen" + +#: tools/ippfind.c:2799 +msgid "--txt-* regex Match TXT record key to regular expression" +msgstr "" +"--txt-* reg-udtryk Match TXT-registreringsnøgle til regulært udtryk" + +#: tools/ippfind.c:2800 +msgid "--uri regex Match URI to regular expression" +msgstr "--uri reg-udtryk Match URI til regulært udtryk" + +#: tools/ippeveprinter.c:7667 tools/ippfind.c:2770 +msgid "--version Show program version" +msgstr "--version Vis programversion" + +#: tools/ipptool.c:4311 +msgid "--version Show version" +msgstr "--version Vis version" + +#: ppdc/sample.c:305 +msgid "-1" +msgstr "" + +#: ppdc/sample.c:296 +msgid "-10" +msgstr "" + +#: ppdc/sample.c:388 +msgid "-100" +msgstr "" + +#: ppdc/sample.c:387 +msgid "-105" +msgstr "" + +#: ppdc/sample.c:295 +msgid "-11" +msgstr "" + +#: ppdc/sample.c:386 +msgid "-110" +msgstr "" + +#: ppdc/sample.c:385 +msgid "-115" +msgstr "" + +#: ppdc/sample.c:294 +msgid "-12" +msgstr "" + +#: ppdc/sample.c:384 +msgid "-120" +msgstr "" + +#: ppdc/sample.c:293 +msgid "-13" +msgstr "" + +#: ppdc/sample.c:292 +msgid "-14" +msgstr "" + +#: ppdc/sample.c:291 +msgid "-15" +msgstr "" + +#: ppdc/sample.c:304 +msgid "-2" +msgstr "" + +#: tools/ippeveprinter.c:7668 +msgid "-2 Set 2-sided printing support (default=1-sided)" +msgstr "" +"-2 Indstil understøttelse af dobbeltsidet udskrivning " +"(standard=enkeltsidet)" + +#: ppdc/sample.c:404 +msgid "-20" +msgstr "" + +#: ppdc/sample.c:403 +msgid "-25" +msgstr "" + +#: ppdc/sample.c:303 +msgid "-3" +msgstr "" + +#: ppdc/sample.c:402 +msgid "-30" +msgstr "" + +#: ppdc/sample.c:401 +msgid "-35" +msgstr "" + +#: ppdc/sample.c:302 +msgid "-4" +msgstr "" + +#: tools/ippfind.c:2766 tools/ipptool.c:4312 +msgid "-4 Connect using IPv4" +msgstr "-4 Opret forbindelse med IPv4" + +#: ppdc/sample.c:400 +msgid "-40" +msgstr "" + +#: ppdc/sample.c:399 +msgid "-45" +msgstr "" + +#: ppdc/sample.c:301 +msgid "-5" +msgstr "" + +#: ppdc/sample.c:398 +msgid "-50" +msgstr "" + +#: ppdc/sample.c:397 +msgid "-55" +msgstr "" + +#: ppdc/sample.c:300 +msgid "-6" +msgstr "" + +#: tools/ippfind.c:2767 tools/ipptool.c:4313 +msgid "-6 Connect using IPv6" +msgstr "-6 Opret forbindelse med IPv6" + +#: ppdc/sample.c:396 +msgid "-60" +msgstr "" + +#: ppdc/sample.c:395 +msgid "-65" +msgstr "" + +#: ppdc/sample.c:299 +msgid "-7" +msgstr "" + +#: ppdc/sample.c:394 +msgid "-70" +msgstr "" + +#: ppdc/sample.c:393 +msgid "-75" +msgstr "" + +#: ppdc/sample.c:298 +msgid "-8" +msgstr "" + +#: ppdc/sample.c:392 +msgid "-80" +msgstr "" + +#: ppdc/sample.c:391 +msgid "-85" +msgstr "" + +#: ppdc/sample.c:297 +msgid "-9" +msgstr "" + +#: ppdc/sample.c:390 +msgid "-90" +msgstr "" + +#: ppdc/sample.c:389 +msgid "-95" +msgstr "" + +#: tools/ipptool.c:4314 +msgid "-C Send requests using chunking (default)" +msgstr "-C Send anmodninger med \"chunking\" (standard)" + +#: systemv/lpadmin.c:1623 +msgid "-D description Specify the textual description of the printer" +msgstr "-D beskrivelse Angiv beskrivelsen af printeren, som tekst" + +#: tools/ippeveprinter.c:7669 +msgid "-D device-uri Set the device URI for the printer" +msgstr "-D enheds-uri Indstil enheds-URI'en til printeren" + +#: systemv/lpadmin.c:1625 +msgid "-E Enable and accept jobs on the printer (after -p)" +msgstr "" +"-E Aktivér og accepter jobs på printeren (efter -p)" + +#: berkeley/lpq.c:644 berkeley/lpr.c:433 berkeley/lprm.c:234 +#: systemv/cancel.c:403 systemv/cupsaccept.c:244 systemv/cupsctl.c:233 +#: systemv/lp.c:752 systemv/lpadmin.c:1624 systemv/lpinfo.c:498 +#: systemv/lpmove.c:217 systemv/lpoptions.c:540 systemv/lpstat.c:2045 +msgid "-E Encrypt the connection to the server" +msgstr "-E Kryptér forbindelsen til serveren" + +#: tools/ipptool.c:4315 +msgid "-E Test with encryption using HTTP Upgrade to TLS" +msgstr "-E Test med kryptering med HTTP Upgrade til TLS" + +#: scheduler/main.c:2136 +msgid "-F Run in the foreground but detach from console." +msgstr "-F Kør i forgrunden, men frakobl fra konsol." + +#: tools/ippeveprinter.c:7670 +msgid "-F output-type/subtype Set the output format for the printer" +msgstr "-F outputtype/undertype Indstil outputformatet til printeren" + +#: systemv/lpstat.c:2050 +msgid "-H Show the default server and port" +msgstr "-H Vis standardserver og -port" + +#: systemv/lp.c:754 +msgid "-H HH:MM Hold the job until the specified UTC time" +msgstr "-H TT:MM Tilbagehold jobbet indtil den angivne UTC-tid" + +#: systemv/lp.c:755 +msgid "-H hold Hold the job until released/resumed" +msgstr "" +"-H hold Tilbagehold jobbet indtil det frigives/genoptages" + +#: systemv/lp.c:756 +msgid "-H immediate Print the job as soon as possible" +msgstr "-H immediate Udskriv jobbet så snart det er muligt" + +#: systemv/lp.c:757 +msgid "-H restart Reprint the job" +msgstr "-H restart Udskriv jobbet igen" + +#: systemv/lp.c:758 +msgid "-H resume Resume a held job" +msgstr "-H resume Genoptag et tilbageholdt job" + +#: berkeley/lpr.c:434 +msgid "-H server[:port] Connect to the named server and port" +msgstr "" +"-H server[:port] Opret forbindelse til den navngivne server og port" + +#: tools/ipptool.c:4316 +msgid "-I Ignore errors" +msgstr "-I Ignorer fejl" + +#: systemv/cupstestppd.c:3858 +msgid "" +"-I {filename,filters,none,profiles}\n" +" Ignore specific warnings" +msgstr "" +"-I {filename,filters,none,profiles}\n" +" Ignorer bestemte advarsler" + +#: tools/ippeveprinter.c:7672 +msgid "-K keypath Set location of server X.509 certificates and keys." +msgstr "" +"-K nøglesti Indstil placeringen af serverens X.509-certifikater " +"og -nøgler." + +#: tools/ipptool.c:4317 +msgid "-L Send requests using content-length" +msgstr "-L Send anmodninger med content-length" + +#: systemv/lpadmin.c:1628 +msgid "-L location Specify the textual location of the printer" +msgstr "-L placering Angiv placeringen af printeren, som tekst" + +#: tools/ippeveprinter.c:7674 +msgid "-M manufacturer Set manufacturer name (default=Test)" +msgstr "-M producent Indstil producentnavn (standard=Test)" + +#: berkeley/lpq.c:647 +msgid "-P destination Show status for the specified destination" +msgstr "-P destination Vis status for den angivne destination" + +#: berkeley/lpr.c:450 berkeley/lprm.c:236 +msgid "-P destination Specify the destination" +msgstr "-P destination Angiv destinationen" + +#: tools/ipptool.c:4318 +msgid "-P filename.plist Produce XML plist to a file and test report to standard output" +msgstr "" +"-P filnavn.plist Generer XML-plist til en fil og test rapportering " +"til standardoutput" + +#: tools/ippeveprinter.c:7675 +msgid "-P filename.ppd Load printer attributes from PPD file" +msgstr "-P filnavn.ppd Indlæs printerattributter fra PPD-fil" + +#: tools/ippfind.c:2772 +msgid "-P number[-number] Match port to number or range" +msgstr "-P nummer[-nummer] Match port til nummer eller område" + +#: systemv/lp.c:774 +msgid "-P page-list Specify a list of pages to print" +msgstr "-P sideliste Angiv en liste over sider som skal udskrives" + +#: systemv/lpstat.c:2060 +msgid "-R Show the ranking of jobs" +msgstr "-R Vis rangeringen af jobs" + +#: systemv/lpadmin.c:1648 +msgid "-R name-default Remove the default value for the named option" +msgstr "-R navn-standard Fjern standardværdien for det navngivne tilvalg" + +#: systemv/cupstestppd.c:3860 +msgid "-R root-directory Set alternate root" +msgstr "-R rodmappe Indstil alternativ rod" + +#: tools/ipptool.c:4319 +msgid "-S Test with encryption using HTTPS" +msgstr "-S Test med kryptering med HTTPS" + +#: tools/ippfind.c:2768 +msgid "-T seconds Set the browse timeout in seconds" +msgstr "-T sekunder Indstil timeout for gennemse i sekunder" + +#: tools/ipptool.c:4320 +msgid "-T seconds Set the receive/send timeout in seconds" +msgstr "-T sekunder Indstil timeouten for modtag/send i sekunder" + +#: berkeley/lpr.c:451 +msgid "-T title Specify the job title" +msgstr "-T titel Angiv jobbets titel" + +#: berkeley/lpq.c:648 berkeley/lpr.c:452 berkeley/lprm.c:237 +#: systemv/cancel.c:406 systemv/cupsaccept.c:247 systemv/lp.c:778 +#: systemv/lpadmin.c:1652 systemv/lpinfo.c:502 systemv/lpmove.c:219 +#: systemv/lpoptions.c:545 systemv/lpstat.c:2048 +msgid "-U username Specify the username to use for authentication" +msgstr "" +"-U brugernavn Angiv brugernavnet som skal bruges til " +"autentifikation" + +#: systemv/cupsctl.c:235 +msgid "-U username Specify username to use for authentication" +msgstr "" +"-U brugernavn Angiv brugernavn som skal bruges til autentifikation" + +#: tools/ippeveprinter.c:7676 tools/ippfind.c:2769 tools/ipptool.c:4321 +msgid "-V version Set default IPP version" +msgstr "-V version Indstil standard-IPP-version" + +#: systemv/lpstat.c:2051 +msgid "-W completed Show completed jobs" +msgstr "-W completed Vis fuldførte jobs" + +#: systemv/lpstat.c:2052 +msgid "-W not-completed Show pending jobs" +msgstr "-W not-completed Vis afventende jobs" + +#: systemv/cupstestppd.c:3861 +msgid "" +"-W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}\n" +" Issue warnings instead of errors" +msgstr "" +"-W " +"{all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}\n" +" Udsted advarsler i stedet for fejl" + +#: tools/ipptool.c:4322 +msgid "-X Produce XML plist instead of plain text" +msgstr "-X Generer XML-plist i stedet for ren tekst" + +#: systemv/cancel.c:402 +msgid "-a Cancel all jobs" +msgstr "-a Annuller alle jobs" + +#: berkeley/lpq.c:643 +msgid "-a Show jobs on all destinations" +msgstr "-a Vis jobs på alle destinationer" + +#: systemv/lpstat.c:2053 +msgid "-a [destination(s)] Show the accepting state of destinations" +msgstr "-a [destination(er)] Vis den accepterende tilstand for destinationer" + +#: tools/ippeveprinter.c:7677 +msgid "-a filename.conf Load printer attributes from conf file" +msgstr "-a filnavn.conf Indlæs printerattributter fra conf-fil" + +#: systemv/lp.c:751 +msgid "-c Make a copy of the print file(s)" +msgstr "-c Opret en kopi af udskrivningsfilerne" + +#: tools/ipptool.c:4323 +msgid "-c Produce CSV output" +msgstr "-c Generer CSV-output" + +#: systemv/lpstat.c:2054 +msgid "-c [class(es)] Show classes and their member printers" +msgstr "-c [klasse(r)] Vis klasser og deres medlemmers printere" + +#: systemv/lpadmin.c:1621 +msgid "-c class Add the named destination to a class" +msgstr "-c klasse Tilføj den navngivne destination til en klasse" + +#: tools/ippeveprinter.c:7678 +msgid "-c command Set print command" +msgstr "-c kommando Indstil udskrivningskommando" + +#: scheduler/main.c:2134 +msgid "-c cupsd.conf Set cupsd.conf file to use." +msgstr "-c cupsd.conf Indstil cupsd.conf-fil som skal bruges." + +#: systemv/lpstat.c:2055 +msgid "-d Show the default destination" +msgstr "-d Vis standarddestinationen" + +#: systemv/lpoptions.c:539 +msgid "-d destination Set default destination" +msgstr "-d destination Indstil standarddestination" + +#: systemv/lpadmin.c:1622 +msgid "-d destination Set the named destination as the server default" +msgstr "" +"-d destination Indstil den navngivne destination som " +"serverstandarden" + +#: tools/ipptool.c:4324 +msgid "-d name=value Set named variable to value" +msgstr "-d navn=værdi Indstil navngivet variabel til værdi" + +#: tools/ippfind.c:2773 +msgid "-d regex Match domain to regular expression" +msgstr "-d reg-udtryk Match domæne til regulært udtryk" + +#: tools/ippeveprinter.c:7679 +msgid "-d spool-directory Set spool directory" +msgstr "-d spool-mappe Indstil \"spool\"-mappe" + +#: systemv/lpstat.c:2056 +msgid "-e Show available destinations on the network" +msgstr "-e Vis tilgængelige destinationer på netværket" + +#: scheduler/main.c:2135 +msgid "-f Run in the foreground." +msgstr "-f Kør i forgrunden." + +#: tools/ipptool.c:4325 +msgid "-f filename Set default request filename" +msgstr "-f filnavn Indstil standardanmodningsfilnavn" + +#: tools/ippeveprinter.c:7680 +msgid "-f type/subtype[,...] Set supported file types" +msgstr "-f type/undertype[,...] Indstil understøttede filtyper" + +#: scheduler/main.c:2137 +msgid "-h Show this usage message." +msgstr "-h Vis denne anvendelsesmeddelelse." + +#: tools/ipptool.c:4326 +msgid "-h Validate HTTP response headers" +msgstr "-h Valider headere i HTTP-svar" + +#: tools/ippfind.c:2774 +msgid "-h regex Match hostname to regular expression" +msgstr "-h reg-udtryk Match værtsnavn til regulært udtryk" + +#: berkeley/lpq.c:645 berkeley/lprm.c:235 systemv/cancel.c:404 +#: systemv/cupsaccept.c:245 systemv/cupsctl.c:234 systemv/lp.c:753 +#: systemv/lpadmin.c:1626 systemv/lpinfo.c:499 systemv/lpmove.c:218 +#: systemv/lpoptions.c:541 systemv/lpstat.c:2046 +msgid "-h server[:port] Connect to the named server and port" +msgstr "" +"-h server[:port] Opret forbindelse til den navngivne server og port" + +#: tools/ippeveprinter.c:7681 +msgid "-i iconfile.png Set icon file" +msgstr "-i ikonfil.png Indstil ikonfil" + +#: systemv/lp.c:759 +msgid "-i id Specify an existing job ID to modify" +msgstr "-i id Angiv et eksisterende job-ID som skal redigeres" + +#: systemv/lpadmin.c:1627 +msgid "-i ppd-file Specify a PPD file for the printer" +msgstr "-i ppd-fil Angiv en PPD-fil til printeren" + +#: tools/ipptool.c:4327 +msgid "-i seconds Repeat the last file with the given time interval" +msgstr "" +"-i sekunder Gentag den sidste fil med det angive tidsinterval" + +#: tools/ippeveprinter.c:7682 +msgid "-k Keep job spool files" +msgstr "-k Bevar jobbets \"spool\"-filer" + +#: tools/ippfind.c:2775 +msgid "-l List attributes" +msgstr "-l Vis attributter" + +#: tools/ipptool.c:4328 +msgid "-l Produce plain text output" +msgstr "-l Generer output i ren tekst" + +#: scheduler/main.c:2139 +msgid "-l Run cupsd on demand." +msgstr "-l Kør cupsd når der er brug for det." + +#: systemv/lpoptions.c:542 +msgid "-l Show supported options and values" +msgstr "-l Vis understøttede tilvalg og værdier" + +#: berkeley/lpq.c:646 systemv/lpinfo.c:500 systemv/lpstat.c:2047 +msgid "-l Show verbose (long) output" +msgstr "-l Vis uddybende (langt) output" + +#: tools/ippeveprinter.c:7683 +msgid "-l location Set location of printer" +msgstr "-l placering Indstil placeringen af printeren" + +#: berkeley/lpr.c:435 systemv/lp.c:760 +msgid "-m Send an email notification when the job completes" +msgstr "" +"-m Send en e-mailunderretning når jobbet er fuldført" + +#: systemv/lpinfo.c:501 +msgid "-m Show models" +msgstr "-m Vis modeller" + +#: systemv/lpadmin.c:1630 +msgid "-m everywhere Specify the printer is compatible with IPP Everywhere" +msgstr "" +"-m everywhere Angiv at printeren er kompatibel med IPP Everywhere" + +#: tools/ippeveprinter.c:7684 +msgid "-m model Set model name (default=Printer)" +msgstr "-m model Indstil modelnavn (standard=Printer)" + +#: systemv/lpadmin.c:1629 +msgid "-m model Specify a standard model/PPD file for the printer" +msgstr "-m model Angiv en standardmodel/-PPD-fil til printeren" + +#: tools/ipptool.c:4329 +msgid "-n count Repeat the last file the given number of times" +msgstr "-n antal Gentag den sidste fil det angivne antal gange" + +#: tools/ippeveprinter.c:7685 +msgid "-n hostname Set hostname for printer" +msgstr "-n værtsnavn Indstil værtsnavn til printeren" + +#: systemv/lp.c:761 +msgid "-n num-copies Specify the number of copies to print" +msgstr "-n antal-kopier Angiv antallet af kopier som skal udskrives" + +#: tools/ippfind.c:2776 +msgid "-n regex Match service name to regular expression" +msgstr "-n reg-udtryk Match tjenestenavn til regulært udtryk" + +#: systemv/lpadmin.c:1632 +msgid "-o Name=Value Specify the default value for the named PPD option " +msgstr "" +"-o Navn=Værdi Angiv standardværdien til det navngivne PPD-tilvalg " + +#: systemv/lpstat.c:2057 +msgid "-o [destination(s)] Show jobs" +msgstr "-o [destination(er)] Vis jobs" + +#: systemv/lpadmin.c:1633 +msgid "" +"-o cupsIPPSupplies=false\n" +" Disable supply level reporting via IPP" +msgstr "" +"-o cupsIPPSupplies=false\n" +" Deaktivér rapportering af forsyningsniveau via IPP" + +#: systemv/lpadmin.c:1635 +msgid "" +"-o cupsSNMPSupplies=false\n" +" Disable supply level reporting via SNMP" +msgstr "" +"-o cupsSNMPSupplies=false\n" +" Deaktivér rapportering af forsyningsniveau via SNMP" + +#: systemv/lpadmin.c:1637 +msgid "-o job-k-limit=N Specify the kilobyte limit for per-user quotas" +msgstr "-o job-k-limit=N Angiv kilobyte-grænsen for kvoter pr. bruger" + +#: systemv/lpadmin.c:1638 +msgid "-o job-page-limit=N Specify the page limit for per-user quotas" +msgstr "-o job-page-limit=N Angiv sidegrænsen for kvoter pr. bruger" + +#: systemv/lpadmin.c:1639 +msgid "-o job-quota-period=N Specify the per-user quota period in seconds" +msgstr "-o job-quota-period=N Angiv kvoteperioden pr. bruger, i sekunder" + +#: berkeley/lpr.c:437 systemv/lp.c:763 +msgid "-o job-sheets=standard Print a banner page with the job" +msgstr "-o job-sheets=standard Udskriv en bannerside med jobbet" + +#: berkeley/lpr.c:438 systemv/lp.c:764 +msgid "-o media=size Specify the media size to use" +msgstr "-o media=størrelse Angiv mediestørrelsen som skal bruges" + +#: systemv/lpadmin.c:1631 +msgid "-o name-default=value Specify the default value for the named option" +msgstr "-o name-default=værdi Angiv standardværdien til det navngivne tilvalg" + +#: systemv/lpoptions.c:543 +msgid "-o name[=value] Set default option and value" +msgstr "-o name[=værdi] Indstil standardtilvalg og -værdi" + +#: berkeley/lpr.c:439 systemv/lp.c:765 +msgid "-o number-up=N Specify that input pages should be printed N-up (1, 2, 4, 6, 9, and 16 are supported)" +msgstr "" +"-o number-up=N Angiv at inputsider skal udskrives N-op (1, 2, 4, 6, " +"9 og 16 understøttes)" + +#: berkeley/lpr.c:436 systemv/lp.c:762 +msgid "-o option[=value] Specify a printer-specific option" +msgstr "-o option[=værdi] Angiv et printerspecifikt tilvalg" + +#: berkeley/lpr.c:440 systemv/lp.c:766 +msgid "" +"-o orientation-requested=N\n" +" Specify portrait (3) or landscape (4) orientation" +msgstr "" +"-o orientation-requested=N\n" +" Angiv portræt- (3) eller landskabsorientering (4)" + +#: berkeley/lpr.c:442 systemv/lp.c:768 +msgid "-o print-quality=N Specify the print quality - draft (3), normal (4), or best (5)" +msgstr "" +"-o print-quality=N Angiv udskriftskvaliteten - kladde (3), normal (4) " +"eller bedste (5)" + +#: systemv/lpadmin.c:1640 +msgid "" +"-o printer-error-policy=name\n" +" Specify the printer error policy" +msgstr "" +"-o printer-error-policy=navn\n" +" Angiv reglerne for printerfejl" + +#: systemv/lpadmin.c:1642 +msgid "" +"-o printer-is-shared=true\n" +" Share the printer" +msgstr "" +"-o printer-is-shared=true\n" +" Del printeren" + +#: systemv/lpadmin.c:1644 +msgid "" +"-o printer-op-policy=name\n" +" Specify the printer operation policy" +msgstr "" +"-o printer-op-policy=navn\n" +" Angiv reglerne for printerhandling" + +#: berkeley/lpr.c:443 systemv/lp.c:769 +msgid "-o sides=one-sided Specify 1-sided printing" +msgstr "-o sides=one-sided Angiv udskrivning som enkeltsidet" + +#: berkeley/lpr.c:444 systemv/lp.c:770 +msgid "" +"-o sides=two-sided-long-edge\n" +" Specify 2-sided portrait printing" +msgstr "" +"-o sides=two-sided-long-edge\n" +" Angiv udskrivning som dobbeltsidet portræt" + +#: berkeley/lpr.c:446 systemv/lp.c:772 +msgid "" +"-o sides=two-sided-short-edge\n" +" Specify 2-sided landscape printing" +msgstr "" +"-o sides=two-sided-short-edge\n" +" Angiv udskrivning som dobbeltsidet landskab" + +#: tools/ippfind.c:2777 +msgid "-p Print URI if true" +msgstr "-p Udskriv URI, hvis sand" + +#: systemv/lpstat.c:2058 +msgid "-p [printer(s)] Show the processing state of destinations" +msgstr "-p [printer(e)] Vis destinationernes bearbejdningstilstand" + +#: systemv/lpoptions.c:544 +msgid "-p destination Specify a destination" +msgstr "-p destination Angiv en destination" + +#: systemv/lpadmin.c:1646 +msgid "-p destination Specify/add the named destination" +msgstr "-p destination Angiv/tilføj den navngivne destination" + +#: tools/ippeveprinter.c:7686 +msgid "-p port Set port number for printer" +msgstr "-p port Indstil portnummer til printer" + +#: tools/ippfind.c:2778 +msgid "-q Quietly report match via exit code" +msgstr "" +"-q Stille rapportering af match via afslutningskode" + +#: systemv/cupstestppd.c:3863 tools/ipptool.c:4330 +msgid "-q Run silently" +msgstr "-q Kør stille" + +#: berkeley/lpr.c:448 +msgid "-q Specify the job should be held for printing" +msgstr "" +"-q Angiv at jobbet skal tilbageholdes til udskrivning" + +#: systemv/lp.c:775 +msgid "-q priority Specify the priority from low (1) to high (100)" +msgstr "-q prioritet Angiv prioriteten fra lav (1) til høj (100)" + +#: berkeley/lpr.c:449 +msgid "-r Remove the file(s) after submission" +msgstr "-r Fjern filerne efter indsendelse" + +#: systemv/lpstat.c:2059 +msgid "-r Show whether the CUPS server is running" +msgstr "-r Vis om CUPS-serveren kører" + +#: tools/ippfind.c:2779 +msgid "-r True if service is remote" +msgstr "-r Sand hvis fjerntjeneste" + +#: systemv/cupstestppd.c:3864 +msgid "-r Use 'relaxed' open mode" +msgstr "-r Brug 'afslappet' åben tilstand" + +#: systemv/lpadmin.c:1647 +msgid "-r class Remove the named destination from a class" +msgstr "-r klasse Fjern den navngivne destination fra en klasse" + +#: systemv/cupsaccept.c:246 +msgid "-r reason Specify a reason message that others can see" +msgstr "-r årsag Angiv en årsagsmeddelelse som andre kan se" + +#: tools/ippeveprinter.c:7687 +msgid "-r subtype,[subtype] Set DNS-SD service subtype" +msgstr "-r undertype,[undertype] Indstil DNS-SD-tjenestens undertype" + +#: systemv/lp.c:776 +msgid "-s Be silent" +msgstr "-s Vær stille" + +#: tools/ippfind.c:2780 +msgid "-s Print service name if true" +msgstr "-s Udskriv tjenestenavn, hvis sand" + +#: systemv/lpstat.c:2061 +msgid "-s Show a status summary" +msgstr "-s Vis en statusopsummering" + +#: scheduler/main.c:2141 +msgid "-s cups-files.conf Set cups-files.conf file to use." +msgstr "-s cups-files.conf Indstil cups-files.conf-fil som skal bruges." + +#: tools/ippeveprinter.c:7688 +msgid "-s speed[,color-speed] Set speed in pages per minute" +msgstr "-s hastighed[,farve-hastighed] Indstil hastighed, i sider pr. minut" + +#: tools/ipptool.c:4331 +msgid "-t Produce a test report" +msgstr "-t Generer en testrapport" + +#: systemv/lpstat.c:2062 +msgid "-t Show all status information" +msgstr "-t Vis al statusinformation" + +#: scheduler/main.c:2142 +msgid "-t Test the configuration file." +msgstr "-t Test konfigurationsfilen." + +#: tools/ippfind.c:2781 +msgid "-t key True if the TXT record contains the key" +msgstr "-t nøgle Sand hvis TXT-registreringen indeholder nøglen" + +#: systemv/lp.c:777 +msgid "-t title Specify the job title" +msgstr "-t titel Angiv jobbets title" + +#: systemv/lpstat.c:2063 +msgid "-u [user(s)] Show jobs queued by the current or specified users" +msgstr "" +"-u [bruger(e)] Vis jobs som er sat i kø af den nuværende eller de " +"angivne brugere" + +#: systemv/lpadmin.c:1649 +msgid "-u allow:all Allow all users to print" +msgstr "-u allow:all Tillad alle brugere at udskrive" + +#: systemv/lpadmin.c:1650 +msgid "-u allow:list Allow the list of users or groups (@name) to print" +msgstr "" +"-u allow:list Tillad brugere eller grupper i listen (\"@name\") at " +"udskrive" + +#: systemv/lpadmin.c:1651 +msgid "-u deny:list Prevent the list of users or groups (@name) to print" +msgstr "" +"-u deny:list Forhindr brugere eller grupper i listen (\"@name\") at " +"udskrive" + +#: systemv/cancel.c:405 +msgid "-u owner Specify the owner to use for jobs" +msgstr "-u ejer Angiv ejeren som skal bruges til jobs" + +#: tools/ippfind.c:2782 +msgid "-u regex Match URI to regular expression" +msgstr "-u reg-udtryk Match URI til regulært udtryk" + +#: systemv/cupstestppd.c:3865 tools/ippeveprinter.c:7689 tools/ipptool.c:4332 +msgid "-v Be verbose" +msgstr "-v Vær uddybende" + +#: systemv/lpinfo.c:503 +msgid "-v Show devices" +msgstr "-v Vis enheder" + +#: systemv/lpstat.c:2064 +msgid "-v [printer(s)] Show the devices for each destination" +msgstr "-v [printer(e)] Vis enheder for hver destination" + +#: systemv/lpadmin.c:1653 +msgid "-v device-uri Specify the device URI for the printer" +msgstr "-v enheds-uri Angiv enheds-URI'en til printeren" + +#: systemv/cupstestppd.c:3866 +msgid "-vv Be very verbose" +msgstr "-vv Vær meget uddybende" + +#: systemv/cancel.c:407 +msgid "-x Purge jobs rather than just canceling" +msgstr "-x Tøm jobs fremfor blot at annullere" + +#: systemv/lpoptions.c:546 +msgid "-x destination Remove default options for destination" +msgstr "-x destination Fjern standardtilvalg for destination" + +#: systemv/lpadmin.c:1654 +msgid "-x destination Remove the named destination" +msgstr "-x destination Fjern den navngivne destination" + +#: tools/ippfind.c:2783 +msgid "" +"-x utility [argument ...] ;\n" +" Execute program if true" +msgstr "" +"-x redskab [argument ...] ;\n" +" Kør program, hvis sand" + +#: cups/dest.c:1868 +msgid "/etc/cups/lpoptions file names default destination that does not exist." +msgstr "" + +#: ppdc/sample.c:306 +msgid "0" +msgstr "" + +#: ppdc/sample.c:307 +msgid "1" +msgstr "" + +#: ppdc/sample.c:379 +msgid "1 inch/sec." +msgstr "" + +#: ppdc/sample.c:172 +msgid "1.25x0.25\"" +msgstr "" + +#: ppdc/sample.c:173 +msgid "1.25x2.25\"" +msgstr "" + +#: ppdc/sample.c:427 +msgid "1.5 inch/sec." +msgstr "" + +#: ppdc/sample.c:174 +msgid "1.50x0.25\"" +msgstr "" + +#: ppdc/sample.c:175 +msgid "1.50x0.50\"" +msgstr "" + +#: ppdc/sample.c:176 +msgid "1.50x1.00\"" +msgstr "" + +#: ppdc/sample.c:177 +msgid "1.50x2.00\"" +msgstr "" + +#: ppdc/sample.c:316 +msgid "10" +msgstr "" + +#: ppdc/sample.c:438 +msgid "10 inches/sec." +msgstr "" + +#: 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:418 +msgid "100" +msgstr "" + +#: ppdc/sample.c:329 +msgid "100 mm/sec." +msgstr "" + +#: ppdc/sample.c:419 +msgid "105" +msgstr "" + +#: ppdc/sample.c:317 +msgid "11" +msgstr "" + +#: ppdc/sample.c:439 +msgid "11 inches/sec." +msgstr "" + +#: ppdc/sample.c:420 +msgid "110" +msgstr "" + +#: ppdc/sample.c:421 +msgid "115" +msgstr "" + +#: ppdc/sample.c:318 +msgid "12" +msgstr "" + +#: ppdc/sample.c:440 +msgid "12 inches/sec." +msgstr "" + +#: ppdc/sample.c:9 +msgid "12 x 11" +msgstr "" + +#: ppdc/sample.c:422 +msgid "120" +msgstr "" + +#: ppdc/sample.c:330 +msgid "120 mm/sec." +msgstr "" + +#: ppdc/sample.c:243 +msgid "120x60dpi" +msgstr "" + +#: ppdc/sample.c:249 +msgid "120x72dpi" +msgstr "" + +#: ppdc/sample.c:319 +msgid "13" +msgstr "" + +#: ppdc/sample.c:232 +msgid "136dpi" +msgstr "" + +#: ppdc/sample.c:320 +msgid "14" +msgstr "" + +#: ppdc/sample.c:321 +msgid "15" +msgstr "" + +#: ppdc/sample.c:323 +msgid "15 mm/sec." +msgstr "" + +#: ppdc/sample.c:10 +msgid "15 x 11" +msgstr "" + +#: ppdc/sample.c:331 +msgid "150 mm/sec." +msgstr "" + +#: ppdc/sample.c:278 +msgid "150dpi" +msgstr "" + +#: ppdc/sample.c:363 +msgid "16" +msgstr "" + +#: ppdc/sample.c:364 +msgid "17" +msgstr "" + +#: ppdc/sample.c:365 +msgid "18" +msgstr "" + +#: ppdc/sample.c:244 +msgid "180dpi" +msgstr "" + +#: ppdc/sample.c:366 +msgid "19" +msgstr "" + +#: ppdc/sample.c:308 +msgid "2" +msgstr "" + +#: ppdc/sample.c:380 +msgid "2 inches/sec." +msgstr "" + +#: cups/ppd-cache.c:3872 ppdc/sample.c:262 +msgid "2-Sided Printing" +msgstr "" + +#: ppdc/sample.c:178 +msgid "2.00x0.37\"" +msgstr "" + +#: ppdc/sample.c:179 +msgid "2.00x0.50\"" +msgstr "" + +#: ppdc/sample.c:180 +msgid "2.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:181 +msgid "2.00x1.25\"" +msgstr "" + +#: ppdc/sample.c:182 +msgid "2.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:183 +msgid "2.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:184 +msgid "2.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:185 +msgid "2.00x5.50\"" +msgstr "" + +#: ppdc/sample.c:186 +msgid "2.25x0.50\"" +msgstr "" + +#: ppdc/sample.c:187 +msgid "2.25x1.25\"" +msgstr "" + +#: ppdc/sample.c:188 +msgid "2.25x4.00\"" +msgstr "" + +#: ppdc/sample.c:189 +msgid "2.25x5.50\"" +msgstr "" + +#: ppdc/sample.c:190 +msgid "2.38x5.50\"" +msgstr "" + +#: ppdc/sample.c:428 +msgid "2.5 inches/sec." +msgstr "" + +#: ppdc/sample.c:191 +msgid "2.50x1.00\"" +msgstr "" + +#: ppdc/sample.c:192 +msgid "2.50x2.00\"" +msgstr "" + +#: ppdc/sample.c:193 +msgid "2.75x1.25\"" +msgstr "" + +#: ppdc/sample.c:194 +msgid "2.9 x 1\"" +msgstr "" + +#: ppdc/sample.c:367 +msgid "20" +msgstr "" + +#: ppdc/sample.c:324 +msgid "20 mm/sec." +msgstr "" + +#: ppdc/sample.c:332 +msgid "200 mm/sec." +msgstr "" + +#: ppdc/sample.c:233 +msgid "203dpi" +msgstr "" + +#: ppdc/sample.c:368 +msgid "21" +msgstr "" + +#: ppdc/sample.c:369 +msgid "22" +msgstr "" + +#: ppdc/sample.c:370 +msgid "23" +msgstr "" + +#: ppdc/sample.c:371 +msgid "24" +msgstr "" + +#: ppdc/sample.c:241 +msgid "24-Pin Series" +msgstr "" + +#: ppdc/sample.c:250 +msgid "240x72dpi" +msgstr "" + +#: ppdc/sample.c:372 +msgid "25" +msgstr "" + +#: ppdc/sample.c:333 +msgid "250 mm/sec." +msgstr "" + +#: ppdc/sample.c:373 +msgid "26" +msgstr "" + +#: ppdc/sample.c:374 +msgid "27" +msgstr "" + +#: ppdc/sample.c:375 +msgid "28" +msgstr "" + +#: ppdc/sample.c:376 +msgid "29" +msgstr "" + +#: ppdc/sample.c:309 +msgid "3" +msgstr "" + +#: ppdc/sample.c:381 +msgid "3 inches/sec." +msgstr "" + +#: ppdc/sample.c:3 +msgid "3 x 5" +msgstr "" + +#: ppdc/sample.c:195 +msgid "3.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:196 +msgid "3.00x1.25\"" +msgstr "" + +#: ppdc/sample.c:197 +msgid "3.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:198 +msgid "3.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:199 +msgid "3.00x5.00\"" +msgstr "" + +#: ppdc/sample.c:200 +msgid "3.25x2.00\"" +msgstr "" + +#: ppdc/sample.c:201 +msgid "3.25x5.00\"" +msgstr "" + +#: ppdc/sample.c:202 +msgid "3.25x5.50\"" +msgstr "" + +#: ppdc/sample.c:203 +msgid "3.25x5.83\"" +msgstr "" + +#: ppdc/sample.c:204 +msgid "3.25x7.83\"" +msgstr "" + +#: ppdc/sample.c:4 +msgid "3.5 x 5" +msgstr "" + +#: ppdc/sample.c:171 +msgid "3.5\" Disk" +msgstr "" + +#: ppdc/sample.c:205 +msgid "3.50x1.00\"" +msgstr "" + +#: ppdc/sample.c:377 +msgid "30" +msgstr "" + +#: ppdc/sample.c:325 +msgid "30 mm/sec." +msgstr "" + +#: ppdc/sample.c:334 +msgid "300 mm/sec." +msgstr "" + +#: ppdc/sample.c:234 +msgid "300dpi" +msgstr "" + +#: ppdc/sample.c:405 +msgid "35" +msgstr "" + +#: ppdc/sample.c:246 +msgid "360dpi" +msgstr "" + +#: ppdc/sample.c:245 +msgid "360x180dpi" +msgstr "" + +#: ppdc/sample.c:310 +msgid "4" +msgstr "" + +#: ppdc/sample.c:382 +msgid "4 inches/sec." +msgstr "" + +#: ppdc/sample.c:206 +msgid "4.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:214 +msgid "4.00x13.00\"" +msgstr "" + +#: ppdc/sample.c:207 +msgid "4.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:208 +msgid "4.00x2.50\"" +msgstr "" + +#: ppdc/sample.c:209 +msgid "4.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:210 +msgid "4.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:211 +msgid "4.00x5.00\"" +msgstr "" + +#: ppdc/sample.c:212 +msgid "4.00x6.00\"" +msgstr "" + +#: ppdc/sample.c:213 +msgid "4.00x6.50\"" +msgstr "" + +#: ppdc/sample.c:406 +msgid "40" +msgstr "" + +#: ppdc/sample.c:326 +msgid "40 mm/sec." +msgstr "" + +#: ppdc/sample.c:407 +msgid "45" +msgstr "" + +#: ppdc/sample.c:311 +msgid "5" +msgstr "" + +#: ppdc/sample.c:432 +msgid "5 inches/sec." +msgstr "" + +#: ppdc/sample.c:5 +msgid "5 x 7" +msgstr "" + +#: ppdc/sample.c:408 +msgid "50" +msgstr "" + +#: ppdc/sample.c:409 +msgid "55" +msgstr "" + +#: ppdc/sample.c:312 +msgid "6" +msgstr "" + +#: ppdc/sample.c:433 +msgid "6 inches/sec." +msgstr "" + +#: ppdc/sample.c:215 +msgid "6.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:216 +msgid "6.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:217 +msgid "6.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:218 +msgid "6.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:219 +msgid "6.00x5.00\"" +msgstr "" + +#: ppdc/sample.c:220 +msgid "6.00x6.00\"" +msgstr "" + +#: ppdc/sample.c:221 +msgid "6.00x6.50\"" +msgstr "" + +#: ppdc/sample.c:410 +msgid "60" +msgstr "" + +#: ppdc/sample.c:327 +msgid "60 mm/sec." +msgstr "" + +#: ppdc/sample.c:253 +msgid "600dpi" +msgstr "" + +#: ppdc/sample.c:242 +msgid "60dpi" +msgstr "" + +#: ppdc/sample.c:248 +msgid "60x72dpi" +msgstr "" + +#: ppdc/sample.c:411 +msgid "65" +msgstr "" + +#: ppdc/sample.c:313 +msgid "7" +msgstr "" + +#: ppdc/sample.c:435 +msgid "7 inches/sec." +msgstr "" + +#: ppdc/sample.c:11 +msgid "7 x 9" +msgstr "" + +#: ppdc/sample.c:412 +msgid "70" +msgstr "" + +#: ppdc/sample.c:413 +msgid "75" +msgstr "" + +#: ppdc/sample.c:314 +msgid "8" +msgstr "" + +#: ppdc/sample.c:436 +msgid "8 inches/sec." +msgstr "" + +#: ppdc/sample.c:12 +msgid "8 x 10" +msgstr "" + +#: ppdc/sample.c:222 +msgid "8.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:223 +msgid "8.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:224 +msgid "8.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:225 +msgid "8.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:226 +msgid "8.00x5.00\"" +msgstr "" + +#: ppdc/sample.c:227 +msgid "8.00x6.00\"" +msgstr "" + +#: ppdc/sample.c:228 +msgid "8.00x6.50\"" +msgstr "" + +#: ppdc/sample.c:414 +msgid "80" +msgstr "" + +#: ppdc/sample.c:328 +msgid "80 mm/sec." +msgstr "" + +#: ppdc/sample.c:415 +msgid "85" +msgstr "" + +#: ppdc/sample.c:315 +msgid "9" +msgstr "" + +#: ppdc/sample.c:437 +msgid "9 inches/sec." +msgstr "" + +#: 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 "" + +#: ppdc/sample.c:416 +msgid "90" +msgstr "" + +#: ppdc/sample.c:417 +msgid "95" +msgstr "" + +#: berkeley/lpc.c:199 +msgid "?Invalid help command unknown." +msgstr "" + +#: scheduler/ipp.c:2283 +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#: scheduler/ipp.c:890 +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +#: ppdc/sample.c:15 +msgid "A0" +msgstr "" + +#: ppdc/sample.c:16 +msgid "A0 Long Edge" +msgstr "" + +#: ppdc/sample.c:17 +msgid "A1" +msgstr "" + +#: ppdc/sample.c:18 +msgid "A1 Long Edge" +msgstr "" + +#: ppdc/sample.c:37 +msgid "A10" +msgstr "" + +#: ppdc/sample.c:19 +msgid "A2" +msgstr "" + +#: ppdc/sample.c:20 +msgid "A2 Long Edge" +msgstr "" + +#: ppdc/sample.c:21 +msgid "A3" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: ppdc/sample.c:31 +msgid "A5 Long Edge" +msgstr "" + +#: ppdc/sample.c:30 +msgid "A5 Oversize" +msgstr "" + +#: ppdc/sample.c:32 +msgid "A6" +msgstr "" + +#: ppdc/sample.c:33 +msgid "A6 Long Edge" +msgstr "" + +#: ppdc/sample.c:34 +msgid "A7" +msgstr "" + +#: ppdc/sample.c:35 +msgid "A8" +msgstr "" + +#: ppdc/sample.c:36 +msgid "A9" +msgstr "" + +#: ppdc/sample.c:38 +msgid "ANSI A" +msgstr "" + +#: ppdc/sample.c:39 +msgid "ANSI B" +msgstr "" + +#: ppdc/sample.c:40 +msgid "ANSI C" +msgstr "" + +#: ppdc/sample.c:41 +msgid "ANSI D" +msgstr "" + +#: ppdc/sample.c:42 +msgid "ANSI E" +msgstr "" + +#: ppdc/sample.c:47 +msgid "ARCH C" +msgstr "" + +#: ppdc/sample.c:48 +msgid "ARCH C Long Edge" +msgstr "" + +#: ppdc/sample.c:49 +msgid "ARCH D" +msgstr "" + +#: ppdc/sample.c:50 +msgid "ARCH D Long Edge" +msgstr "" + +#: ppdc/sample.c:51 +msgid "ARCH E" +msgstr "" + +#: ppdc/sample.c:52 +msgid "ARCH E Long Edge" +msgstr "" + +#: cgi-bin/classes.c:155 cgi-bin/printers.c:158 +msgid "Accept Jobs" +msgstr "" + +#: cups/http-support.c:1494 +msgid "Accepted" +msgstr "" + +#: cgi-bin/admin.c:336 +msgid "Add Class" +msgstr "" + +#: cgi-bin/admin.c:649 +msgid "Add Printer" +msgstr "" + +#: ppdc/sample.c:163 +msgid "Address" +msgstr "" + +#: cgi-bin/admin.c:172 cgi-bin/admin.c:246 cgi-bin/admin.c:2249 +msgid "Administration" +msgstr "" + +#: ppdc/sample.c:424 +msgid "Always" +msgstr "" + +#: backend/socket.c:113 +msgid "AppSocket/HP JetDirect" +msgstr "" + +#: ppdc/sample.c:445 +msgid "Applicator" +msgstr "" + +#: scheduler/ipp.c:987 +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#: scheduler/ipp.c:5422 scheduler/ipp.c:5448 +#, c-format +msgid "Attribute \"%s\" is in the wrong group." +msgstr "" + +#: scheduler/ipp.c:5424 scheduler/ipp.c:5450 +#, c-format +msgid "Attribute \"%s\" is the wrong value type." +msgstr "" + +#: scheduler/ipp.c:227 +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +#: ppdc/sample.c:126 +msgid "B0" +msgstr "" + +#: ppdc/sample.c:127 +msgid "B1" +msgstr "" + +#: ppdc/sample.c:137 +msgid "B10" +msgstr "" + +#: ppdc/sample.c:128 +msgid "B2" +msgstr "" + +#: ppdc/sample.c:129 +msgid "B3" +msgstr "" + +#: ppdc/sample.c:130 +msgid "B4" +msgstr "" + +#: ppdc/sample.c:131 +msgid "B5" +msgstr "" + +#: ppdc/sample.c:132 +msgid "B5 Oversize" +msgstr "" + +#: ppdc/sample.c:133 +msgid "B6" +msgstr "" + +#: ppdc/sample.c:134 +msgid "B7" +msgstr "" + +#: ppdc/sample.c:135 +msgid "B8" +msgstr "" + +#: ppdc/sample.c:136 +msgid "B9" +msgstr "" + +#: scheduler/ipp.c:7504 +#, c-format +msgid "Bad \"printer-id\" value %d." +msgstr "" + +#: scheduler/ipp.c:10336 +#, c-format +msgid "Bad '%s' value." +msgstr "" + +#: scheduler/ipp.c:11284 +#, c-format +msgid "Bad 'document-format' value \"%s\"." +msgstr "" + +#: cups/ppd.c:307 +msgid "Bad CloseUI/JCLCloseUI" +msgstr "" + +#: cups/dest.c:1661 +msgid "Bad NULL dests pointer" +msgstr "" + +#: cups/ppd.c:290 +msgid "Bad OpenGroup" +msgstr "" + +#: cups/ppd.c:292 +msgid "Bad OpenUI/JCLOpenUI" +msgstr "" + +#: cups/ppd.c:294 +msgid "Bad OrderDependency" +msgstr "" + +#: cups/ppd-cache.c:483 cups/ppd-cache.c:530 cups/ppd-cache.c:564 +#: cups/ppd-cache.c:570 cups/ppd-cache.c:586 cups/ppd-cache.c:602 +#: cups/ppd-cache.c:611 cups/ppd-cache.c:619 cups/ppd-cache.c:636 +#: cups/ppd-cache.c:644 cups/ppd-cache.c:659 cups/ppd-cache.c:667 +#: cups/ppd-cache.c:688 cups/ppd-cache.c:700 cups/ppd-cache.c:715 +#: cups/ppd-cache.c:727 cups/ppd-cache.c:749 cups/ppd-cache.c:757 +#: cups/ppd-cache.c:775 cups/ppd-cache.c:783 cups/ppd-cache.c:798 +#: cups/ppd-cache.c:806 cups/ppd-cache.c:824 cups/ppd-cache.c:832 +#: cups/ppd-cache.c:859 cups/ppd-cache.c:934 cups/ppd-cache.c:942 +#: cups/ppd-cache.c:950 +msgid "Bad PPD cache file." +msgstr "" + +#: scheduler/ipp.c:2659 +msgid "Bad PPD file." +msgstr "" + +#: cups/http-support.c:1512 +msgid "Bad Request" +msgstr "" + +#: cups/snmp.c:956 +msgid "Bad SNMP version number" +msgstr "" + +#: cups/ppd.c:295 +msgid "Bad UIConstraints" +msgstr "" + +#: cups/dest.c:1195 +msgid "Bad URI." +msgstr "" + +#: cups/hash.c:48 cups/http-support.c:1606 +msgid "Bad arguments to function" +msgstr "" + +#: scheduler/ipp.c:1372 +#, c-format +msgid "Bad copies value %d." +msgstr "" + +#: cups/ppd.c:303 +msgid "Bad custom parameter" +msgstr "" + +#: cups/http-support.c:1746 scheduler/ipp.c:2365 +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#: scheduler/ipp.c:2410 +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#: scheduler/ipp.c:8486 scheduler/ipp.c:8504 scheduler/ipp.c:9732 +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#: scheduler/ipp.c:9750 +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +#: cups/ppd-util.c:169 +msgid "Bad filename buffer" +msgstr "" + +#: cups/http-support.c:1615 +msgid "Bad hostname/address in URI" +msgstr "" + +#: scheduler/ipp.c:1554 +#, c-format +msgid "Bad job-name value: %s" +msgstr "" + +#: scheduler/ipp.c:1540 +msgid "Bad job-name value: Wrong type or count." +msgstr "" + +#: scheduler/ipp.c:10374 +msgid "Bad job-priority value." +msgstr "" + +#: scheduler/ipp.c:1402 +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +#: scheduler/ipp.c:1386 +msgid "Bad job-sheets value type." +msgstr "" + +#: scheduler/ipp.c:10404 +msgid "Bad job-state value." +msgstr "" + +#: scheduler/ipp.c:3006 scheduler/ipp.c:3468 scheduler/ipp.c:6253 +#: scheduler/ipp.c:6400 scheduler/ipp.c:7912 scheduler/ipp.c:8184 +#: scheduler/ipp.c:9050 scheduler/ipp.c:9274 scheduler/ipp.c:9626 +#: scheduler/ipp.c:10235 +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#: scheduler/ipp.c:2049 scheduler/ipp.c:5773 +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#: scheduler/ipp.c:2014 scheduler/ipp.c:5737 +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#: scheduler/ipp.c:5848 +#, c-format +msgid "Bad notify-user-data \"%s\"." +msgstr "" + +#: scheduler/ipp.c:1418 +#, c-format +msgid "Bad number-up value %d." +msgstr "" + +#: scheduler/ipp.c:1435 +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "" + +#: cups/http-support.c:1612 +msgid "Bad port number in URI" +msgstr "" + +#: scheduler/ipp.c:2456 +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#: scheduler/ipp.c:2537 +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#: cups/dest.c:678 cups/dest.c:1245 +msgid "Bad printer-uri." +msgstr "" + +#: scheduler/ipp.c:201 +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#: scheduler/ipp.c:191 +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +#: cups/http-support.c:1609 +msgid "Bad resource in URI" +msgstr "" + +#: cups/http-support.c:1621 +msgid "Bad scheme in URI" +msgstr "" + +#: cups/http-support.c:1618 +msgid "Bad username in URI" +msgstr "" + +#: cups/ppd.c:305 +msgid "Bad value string" +msgstr "" + +#: cups/http-support.c:1624 +msgid "Bad/empty URI" +msgstr "" + +#: cgi-bin/admin.c:2794 cgi-bin/admin.c:3043 +msgid "Banners" +msgstr "" + +#: ppdc/sample.c:282 +msgid "Bond Paper" +msgstr "" + +#: cups/ppd-cache.c:4152 +msgid "Booklet" +msgstr "" + +#: backend/usb-darwin.c:2008 +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +#: filter/pstops.c:2026 +msgid "Buffer overflow detected, aborting." +msgstr "" + +#: ppdc/sample.c:277 +msgid "CMYK" +msgstr "" + +#: ppdc/sample.c:358 +msgid "CPCL Label Printer" +msgstr "" + +#: cgi-bin/classes.c:159 cgi-bin/printers.c:162 +msgid "Cancel Jobs" +msgstr "Annuller jobs" + +#: backend/ipp.c:2287 +msgid "Canceling print job." +msgstr "Annullerer udskrivningsjob." + +#: scheduler/ipp.c:963 scheduler/ipp.c:2512 +msgid "Cannot change printer-is-shared for remote queues." +msgstr "" + +#: scheduler/ipp.c:2499 +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +#: ppdc/sample.c:271 +msgid "Cassette" +msgstr "" + +#: cgi-bin/admin.c:1347 cgi-bin/admin.c:1489 cgi-bin/admin.c:1502 +#: cgi-bin/admin.c:1513 +msgid "Change Settings" +msgstr "" + +#: scheduler/ipp.c:2061 scheduler/ipp.c:5785 +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +#: cgi-bin/classes.c:181 cgi-bin/classes.c:307 +msgid "Classes" +msgstr "" + +#: cgi-bin/printers.c:168 +msgid "Clean Print Heads" +msgstr "" + +#: scheduler/ipp.c:3920 +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +#: cups/ppd-cache.c:3790 ppdc/sample.c:276 +msgid "Color" +msgstr "" + +#: cups/ppd-cache.c:3751 ppdc/sample.c:274 +msgid "Color Mode" +msgstr "" + +#: berkeley/lpc.c:190 +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +#: cups/snmp.c:960 +msgid "Community name uses indefinite length" +msgstr "" + +#: backend/ipp.c:865 backend/lpd.c:929 backend/socket.c:375 +msgid "Connected to printer." +msgstr "" + +#: backend/ipp.c:701 backend/lpd.c:753 backend/socket.c:295 +msgid "Connecting to printer." +msgstr "" + +#: cups/http-support.c:1482 +msgid "Continue" +msgstr "" + +#: ppdc/sample.c:360 +msgid "Continuous" +msgstr "" + +#: backend/lpd.c:1078 backend/lpd.c:1210 +msgid "Control file sent successfully." +msgstr "" + +#: backend/ipp.c:1396 backend/lpd.c:445 +msgid "Copying print data." +msgstr "" + +#: cups/http-support.c:1491 +msgid "Created" +msgstr "" + +#: cups/tls-darwin.c:748 cups/tls-gnutls.c:582 +msgid "Credentials do not validate against site CA certificate." +msgstr "" + +#: cups/tls-darwin.c:759 cups/tls-gnutls.c:599 +msgid "Credentials have expired." +msgstr "" + +#: cups/ppd.c:1133 cups/ppd.c:1173 cups/ppd.c:1382 cups/ppd.c:1485 +msgid "Custom" +msgstr "" + +#: ppdc/sample.c:354 +msgid "CustominCutInterval" +msgstr "" + +#: ppdc/sample.c:352 +msgid "CustominTearInterval" +msgstr "" + +#: ppdc/sample.c:338 +msgid "Cut" +msgstr "" + +#: ppdc/sample.c:446 +msgid "Cutter" +msgstr "" + +#: ppdc/sample.c:239 +msgid "Dark" +msgstr "" + +#: ppdc/sample.c:235 +msgid "Darkness" +msgstr "" + +#: backend/lpd.c:1163 +msgid "Data file sent successfully." +msgstr "" + +#: cups/ppd-cache.c:3798 cups/ppd-cache.c:3807 +msgid "Deep Color" +msgstr "" + +#: cups/ppd-cache.c:3784 +msgid "Deep Gray" +msgstr "" + +#: cgi-bin/admin.c:1786 cgi-bin/admin.c:1797 cgi-bin/admin.c:1842 +msgid "Delete Class" +msgstr "" + +#: cgi-bin/admin.c:1871 cgi-bin/admin.c:1882 cgi-bin/admin.c:1927 +msgid "Delete Printer" +msgstr "" + +#: ppdc/sample.c:273 +msgid "DeskJet Series" +msgstr "" + +#: scheduler/ipp.c:1301 +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "" + +#: cups/ppd-cache.c:3828 cups/ppd-cache.c:3834 +msgid "Device CMYK" +msgstr "" + +#: cups/ppd-cache.c:3816 cups/ppd-cache.c:3822 +msgid "Device Gray" +msgstr "" + +#: cups/ppd-cache.c:3840 cups/ppd-cache.c:3846 +msgid "Device RGB" +msgstr "" + +#: systemv/lpinfo.c:273 +#, 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 "" + +#: ppdc/sample.c:431 +msgid "Direct Thermal Media" +msgstr "" + +#: cups/file.c:285 +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#: cups/file.c:257 +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#: cups/file.c:274 +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#: cups/file.c:245 +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#: cups/file.c:230 +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +#: ppdc/sample.c:340 +msgid "Disabled" +msgstr "" + +#: scheduler/ipp.c:6302 +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +#: cups/ppd-cache.c:4283 cups/ppd-cache.c:4285 cups/ppd-cache.c:4348 +#: cups/ppd-cache.c:4385 +msgid "Draft" +msgstr "" + +#: ppdc/sample.c:267 +msgid "Duplexer" +msgstr "" + +#: ppdc/sample.c:229 +msgid "Dymo" +msgstr "" + +#: ppdc/sample.c:426 +msgid "EPL1 Label Printer" +msgstr "" + +#: ppdc/sample.c:429 +msgid "EPL2 Label Printer" +msgstr "" + +#: cgi-bin/admin.c:1541 cgi-bin/admin.c:1553 cgi-bin/admin.c:1607 +#: cgi-bin/admin.c:1614 cgi-bin/admin.c:1649 cgi-bin/admin.c:1662 +#: cgi-bin/admin.c:1686 cgi-bin/admin.c:1759 +msgid "Edit Configuration File" +msgstr "" + +#: cups/http.c:4649 +msgid "Encryption is not supported." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +#: cgi-bin/admin.c:3068 +msgid "Ending Banner" +msgstr "" + +#: ppdc/sample.c:2 +msgid "English" +msgstr "" + +#: scheduler/client.c:1981 +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 "" + +#: 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:261 +msgid "Envelope Feed" +msgstr "" + +#: 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 "" + +#: tools/ippfind.c:2822 +msgid "Environment Variables:" +msgstr "" + +#: ppdc/sample.c:240 +msgid "Epson" +msgstr "" + +#: cgi-bin/admin.c:3111 +msgid "Error Policy" +msgstr "" + +#: filter/rastertopwg.c:452 +msgid "Error reading raster data." +msgstr "" + +#: filter/rastertopwg.c:421 filter/rastertopwg.c:442 filter/rastertopwg.c:460 +#: filter/rastertopwg.c:471 +msgid "Error sending raster data." +msgstr "" + +#: systemv/lpinfo.c:208 systemv/lpmove.c:85 +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +#: ppdc/sample.c:122 +msgid "European Fanfold" +msgstr "" + +#: ppdc/sample.c:123 +msgid "European Fanfold Legal" +msgstr "" + +#: ppdc/sample.c:350 +msgid "Every 10 Labels" +msgstr "" + +#: ppdc/sample.c:342 +msgid "Every 2 Labels" +msgstr "" + +#: ppdc/sample.c:343 +msgid "Every 3 Labels" +msgstr "" + +#: ppdc/sample.c:344 +msgid "Every 4 Labels" +msgstr "" + +#: ppdc/sample.c:345 +msgid "Every 5 Labels" +msgstr "" + +#: ppdc/sample.c:346 +msgid "Every 6 Labels" +msgstr "" + +#: ppdc/sample.c:347 +msgid "Every 7 Labels" +msgstr "" + +#: ppdc/sample.c:348 +msgid "Every 8 Labels" +msgstr "" + +#: ppdc/sample.c:349 +msgid "Every 9 Labels" +msgstr "" + +#: ppdc/sample.c:341 +msgid "Every Label" +msgstr "" + +#: ppdc/sample.c:121 +msgid "Executive" +msgstr "" + +#: cups/http-support.c:1540 +msgid "Expectation Failed" +msgstr "" + +#: tools/ippfind.c:2771 +msgid "Expressions:" +msgstr "" + +#: cups/ppd-cache.c:3758 +msgid "Fast Grayscale" +msgstr "" + +#: cups/file.c:289 +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#: cups/file.c:264 +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#: cups/file.c:278 +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#: cups/file.c:250 +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#: cups/file.c:236 +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +#: ppdc/sample.c:169 +msgid "File Folder" +msgstr "" + +#: scheduler/ipp.c:2386 +#, c-format +msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"." +msgstr "" + +#: filter/rastertoepson.c:1131 filter/rastertohp.c:802 +#: filter/rastertolabel.c:1259 +#, c-format +msgid "Finished page %d." +msgstr "" + +#: cups/ppd-cache.c:4171 +msgid "Finishing Preset" +msgstr "" + +#: cups/ppd-cache.c:4061 +msgid "Fold" +msgstr "" + +#: ppdc/sample.c:125 +msgid "Folio" +msgstr "" + +#: cups/http-support.c:1519 +msgid "Forbidden" +msgstr "" + +#: cups/http-support.c:1503 +msgid "Found" +msgstr "" + +#: cups/ppd.c:757 cups/ppd.c:1286 +msgid "General" +msgstr "" + +#: ppdc/sample.c:251 +msgid "Generic" +msgstr "" + +#: cups/snmp.c:970 +msgid "Get-Response-PDU uses indefinite length" +msgstr "" + +#: ppdc/sample.c:285 +msgid "Glossy Paper" +msgstr "" + +#: scheduler/ipp.c:2984 scheduler/ipp.c:3394 scheduler/ipp.c:3932 +#: scheduler/ipp.c:6231 scheduler/ipp.c:6378 scheduler/ipp.c:7889 +#: scheduler/ipp.c:9028 scheduler/ipp.c:9252 scheduler/ipp.c:9604 +#: scheduler/ipp.c:10213 +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +#: cups/ppd-cache.c:3767 cups/ppd-cache.c:3778 ppdc/sample.c:275 +msgid "Grayscale" +msgstr "" + +#: ppdc/sample.c:272 +msgid "HP" +msgstr "" + +#: ppdc/sample.c:170 +msgid "Hanging Folder" +msgstr "" + +#: cups/hash.c:292 +msgid "Hash buffer too small." +msgstr "" + +#: cgi-bin/help.c:133 +msgid "Help file not in index." +msgstr "" + +#: cups/ppd-cache.c:4290 cups/ppd-cache.c:4359 cups/ppd-cache.c:4390 +msgid "High" +msgstr "" + +#: cups/ipp.c:3094 cups/ipp.c:3121 cups/ipp.c:3144 +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +#: cups/ipp.c:3057 +msgid "IPP attribute has no name." +msgstr "" + +#: cups/ipp.c:6802 +msgid "IPP attribute is not a member of the message." +msgstr "" + +#: cups/ipp.c:3507 +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +#: cups/ipp.c:3285 +msgid "IPP boolean value not 1 byte." +msgstr "" + +#: cups/ipp.c:3350 +msgid "IPP date value not 11 bytes." +msgstr "" + +#: cups/ipp.c:3528 +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +#: cups/ipp.c:3260 +msgid "IPP enum value not 4 bytes." +msgstr "" + +#: cups/ipp.c:2975 +msgid "IPP extension tag larger than 0x7FFFFFFF." +msgstr "" + +#: cups/ipp.c:3257 +msgid "IPP integer value not 4 bytes." +msgstr "" + +#: cups/ipp.c:3460 +msgid "IPP language length overflows value." +msgstr "" + +#: cups/ipp.c:3469 +msgid "IPP language length too large." +msgstr "" + +#: cups/ipp.c:3171 +msgid "IPP member name is not empty." +msgstr "" + +#: cups/ipp.c:3554 +msgid "IPP memberName value is empty." +msgstr "" + +#: cups/ipp.c:3546 +msgid "IPP memberName with no attribute." +msgstr "" + +#: cups/ipp.c:3035 +msgid "IPP name larger than 32767 bytes." +msgstr "" + +#: cups/ipp.c:3427 +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +#: cups/ipp.c:3585 +msgid "IPP octetString length too large." +msgstr "" + +#: cups/ipp.c:3395 +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +#: cups/ipp.c:3368 +msgid "IPP resolution value not 9 bytes." +msgstr "" + +#: cups/ipp.c:3487 +msgid "IPP string length overflows value." +msgstr "" + +#: cups/ipp.c:3423 +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +#: cups/ipp.c:3243 +msgid "IPP value larger than 32767 bytes." +msgstr "" + +#: tools/ippfind.c:2823 +msgid "IPPFIND_SERVICE_DOMAIN Domain name" +msgstr "" + +#: tools/ippfind.c:2824 +msgid "" +"IPPFIND_SERVICE_HOSTNAME\n" +" Fully-qualified domain name" +msgstr "" + +#: tools/ippfind.c:2826 +msgid "IPPFIND_SERVICE_NAME Service instance name" +msgstr "" + +#: tools/ippfind.c:2827 +msgid "IPPFIND_SERVICE_PORT Port number" +msgstr "" + +#: tools/ippfind.c:2828 +msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" +msgstr "" + +#: tools/ippfind.c:2829 +msgid "IPPFIND_SERVICE_SCHEME URI scheme" +msgstr "" + +#: tools/ippfind.c:2830 +msgid "IPPFIND_SERVICE_URI URI" +msgstr "" + +#: tools/ippfind.c:2831 +msgid "IPPFIND_TXT_* Value of TXT record key" +msgstr "" + +#: ppdc/sample.c:1 +msgid "ISOLatin1" +msgstr "" + +#: cups/ppd.c:298 +msgid "Illegal control character" +msgstr "" + +#: cups/ppd.c:299 +msgid "Illegal main keyword string" +msgstr "" + +#: cups/ppd.c:300 +msgid "Illegal option keyword string" +msgstr "" + +#: cups/ppd.c:301 +msgid "Illegal translation string" +msgstr "" + +#: cups/ppd.c:302 +msgid "Illegal whitespace character" +msgstr "" + +#: ppdc/sample.c:266 +msgid "Installable Options" +msgstr "" + +#: ppdc/sample.c:269 +msgid "Installed" +msgstr "" + +#: ppdc/sample.c:288 +msgid "IntelliBar Label Printer" +msgstr "" + +#: ppdc/sample.c:287 +msgid "Intellitech" +msgstr "" + +#: cups/http-support.c:1546 +msgid "Internal Server Error" +msgstr "" + +#: cups/ppd.c:289 +msgid "Internal error" +msgstr "" + +#: ppdc/sample.c:167 +msgid "Internet Postage 2-Part" +msgstr "" + +#: ppdc/sample.c:168 +msgid "Internet Postage 3-Part" +msgstr "" + +#: backend/ipp.c:319 +msgid "Internet Printing Protocol" +msgstr "" + +#: cups/ipp.c:2995 +msgid "Invalid group tag." +msgstr "" + +#: cups/pwg-media.c:288 cups/pwg-media.c:307 +msgid "Invalid media name arguments." +msgstr "" + +#: cups/dest-options.c:1232 +msgid "Invalid media size." +msgstr "" + +#: cups/ipp.c:3045 +msgid "Invalid named IPP attribute in collection." +msgstr "" + +#: scheduler/ipp.c:2705 scheduler/ipp.c:7045 +msgid "Invalid ppd-name value." +msgstr "" + +#: filter/commandtops.c:108 +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +#: cups/ppd.c:1404 +msgid "JCL" +msgstr "" + +#: 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:9324 +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#: scheduler/ipp.c:3024 scheduler/ipp.c:3258 scheduler/ipp.c:3317 +#: scheduler/ipp.c:3496 scheduler/ipp.c:3942 scheduler/ipp.c:5890 +#: scheduler/ipp.c:6271 scheduler/ipp.c:6418 scheduler/ipp.c:6755 +#: scheduler/ipp.c:7730 scheduler/ipp.c:7752 scheduler/ipp.c:7930 +#: scheduler/ipp.c:8158 scheduler/ipp.c:8201 scheduler/ipp.c:9068 +#: scheduler/ipp.c:9292 scheduler/ipp.c:9644 scheduler/ipp.c:10253 +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#: scheduler/ipp.c:3528 +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Job #%d er allerede afbrudt - kan ikke annullere." + +#: scheduler/ipp.c:3522 +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Job #%d er allerede annulleret - kan ikke annullere." + +#: scheduler/ipp.c:3534 +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Job #%d er allerede fuldført - kan ikke annullere." + +#: scheduler/ipp.c:7956 scheduler/ipp.c:8243 scheduler/ipp.c:10268 +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#: scheduler/ipp.c:9306 +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#: scheduler/ipp.c:3039 +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#: scheduler/ipp.c:9082 +#, c-format +msgid "Job #%d is not held." +msgstr "" + +#: cgi-bin/ipp-var.c:1032 +msgid "Job Completed" +msgstr "" + +#: cgi-bin/ipp-var.c:1030 +msgid "Job Created" +msgstr "" + +#: cgi-bin/ipp-var.c:1036 +msgid "Job Options Changed" +msgstr "" + +#: cgi-bin/ipp-var.c:1034 +msgid "Job Stopped" +msgstr "" + +#: scheduler/ipp.c:10382 +msgid "Job is completed and cannot be changed." +msgstr "" + +#: cgi-bin/jobs.c:186 +msgid "Job operation failed" +msgstr "" + +#: scheduler/ipp.c:10418 scheduler/ipp.c:10435 scheduler/ipp.c:10446 +msgid "Job state cannot be changed." +msgstr "" + +#: scheduler/ipp.c:9172 +msgid "Job subscriptions cannot be renewed." +msgstr "" + +#: cgi-bin/jobs.c:91 cgi-bin/jobs.c:102 cgi-bin/jobs.c:183 +msgid "Jobs" +msgstr "" + +#: backend/lpd.c:162 +msgid "LPD/LPR Host or Printer" +msgstr "" + +#: cups/dest.c:1856 +msgid "LPDEST environment variable names default destination that does not exist." +msgstr "" + +#: ppdc/sample.c:230 +msgid "Label Printer" +msgstr "" + +#: ppdc/sample.c:441 +msgid "Label Top" +msgstr "" + +#: scheduler/ipp.c:2070 scheduler/ipp.c:5794 +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +#: ppdc/sample.c:164 +msgid "Large Address" +msgstr "" + +#: ppdc/sample.c:286 +msgid "LaserJet Series PCL 4/5" +msgstr "" + +#: 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 "" + +#: cups/ppd.c:297 +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "" + +#: cgi-bin/admin.c:1950 +msgid "List Available Printers" +msgstr "" + +#: tools/ippeveprinter.c:604 +#, c-format +msgid "Listening on port %d." +msgstr "" + +#: scheduler/ipp.c:5503 +msgid "Local printer created." +msgstr "" + +#: cups/ppd-cache.c:3872 ppdc/sample.c:264 +msgid "Long-Edge (Portrait)" +msgstr "" + +#: cups/http-support.c:1870 +msgid "Looking for printer." +msgstr "" + +#: ppdc/sample.c:260 +msgid "Manual Feed" +msgstr "" + +#: cups/ppd.c:804 cups/ppd.c:1341 +msgid "Media Size" +msgstr "" + +#: cups/ppd.c:808 cups/ppd.c:1345 ppdc/sample.c:254 +msgid "Media Source" +msgstr "" + +#: ppdc/sample.c:359 +msgid "Media Tracking" +msgstr "" + +#: cups/ppd.c:806 cups/ppd.c:1343 ppdc/sample.c:280 +msgid "Media Type" +msgstr "" + +#: ppdc/sample.c:237 +msgid "Medium" +msgstr "" + +#: cups/ppd.c:286 +msgid "Memory allocation error" +msgstr "" + +#: cups/ppd.c:306 +msgid "Missing CloseGroup" +msgstr "" + +#: cups/ppd.c:308 +msgid "Missing CloseUI/JCLCloseUI" +msgstr "" + +#: cups/ppd.c:287 +msgid "Missing PPD-Adobe-4.x header" +msgstr "" + +#: cups/ppd.c:296 +msgid "Missing asterisk in column 1" +msgstr "" + +#: scheduler/ipp.c:6294 +msgid "Missing document-number attribute." +msgstr "" + +#: cgi-bin/admin.c:502 cgi-bin/admin.c:1798 cgi-bin/admin.c:1883 +#: cgi-bin/admin.c:2289 cgi-bin/admin.c:2543 cgi-bin/admin.c:2654 +#: cgi-bin/admin.c:3367 +msgid "Missing form variable" +msgstr "" + +#: scheduler/ipp.c:9698 +msgid "Missing last-document attribute in request." +msgstr "" + +#: cups/pwg-media.c:547 +msgid "Missing media or media-col." +msgstr "" + +#: cups/pwg-media.c:466 +msgid "Missing media-size in media-col." +msgstr "" + +#: scheduler/ipp.c:6895 +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +#: cups/ppd.c:304 +msgid "Missing option keyword" +msgstr "" + +#: scheduler/ipp.c:3165 scheduler/ipp.c:3190 +msgid "Missing requesting-user-name attribute." +msgstr "" + +#: scheduler/ipp.c:5420 scheduler/ipp.c:5446 +#, c-format +msgid "Missing required attribute \"%s\"." +msgstr "" + +#: scheduler/ipp.c:347 +msgid "Missing required attributes." +msgstr "" + +#: cups/http-support.c:1636 +msgid "Missing resource in URI" +msgstr "" + +#: cups/http-support.c:1630 +msgid "Missing scheme in URI" +msgstr "" + +#: cups/ppd.c:288 +msgid "Missing value string" +msgstr "" + +#: cups/pwg-media.c:454 +msgid "Missing x-dimension in media-size." +msgstr "" + +#: cups/pwg-media.c:460 +msgid "Missing y-dimension in media-size." +msgstr "" + +#: systemv/lpinfo.c:443 systemv/lpinfo.c:467 +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +#: tools/ippfind.c:2801 +msgid "Modifiers:" +msgstr "" + +#: cgi-bin/admin.c:336 +msgid "Modify Class" +msgstr "" + +#: cgi-bin/admin.c:649 +msgid "Modify Printer" +msgstr "" + +#: cgi-bin/ipp-var.c:407 cgi-bin/ipp-var.c:498 +msgid "Move All Jobs" +msgstr "" + +#: cgi-bin/ipp-var.c:346 cgi-bin/ipp-var.c:405 cgi-bin/ipp-var.c:496 +msgid "Move Job" +msgstr "" + +#: cups/http-support.c:1500 +msgid "Moved Permanently" +msgstr "" + +#: cups/ppd.c:285 +msgid "NULL PPD file pointer" +msgstr "" + +#: cups/snmp.c:1007 +msgid "Name OID uses indefinite length" +msgstr "" + +#: scheduler/ipp.c:1056 +msgid "Nested classes are not allowed." +msgstr "" + +#: ppdc/sample.c:425 +msgid "Never" +msgstr "" + +#: cups/tls-darwin.c:690 cups/tls-gnutls.c:524 +msgid "New credentials are not valid for name." +msgstr "" + +#: cups/tls-darwin.c:680 cups/tls-gnutls.c:514 +msgid "New credentials are older than stored credentials." +msgstr "" + +#: cups/ppd.c:1974 +msgid "No" +msgstr "Nej" + +#: cups/http-support.c:1497 +msgid "No Content" +msgstr "" + +#: cups/ppd-cache.c:3076 +msgid "No IPP attributes." +msgstr "" + +#: cups/ppd-util.c:489 +msgid "No PPD name" +msgstr "" + +#: cups/snmp.c:1001 +msgid "No VarBind SEQUENCE" +msgstr "" + +#: cups/request.c:548 cups/request.c:920 +msgid "No active connection" +msgstr "" + +#: cups/request.c:329 +msgid "No active connection." +msgstr "" + +#: scheduler/ipp.c:3445 +#, c-format +msgid "No active jobs on %s." +msgstr "" + +#: scheduler/ipp.c:207 +msgid "No attributes in request." +msgstr "" + +#: scheduler/ipp.c:3066 +msgid "No authentication information provided." +msgstr "" + +#: cups/tls-darwin.c:630 cups/tls-gnutls.c:461 +msgid "No common name specified." +msgstr "" + +#: cups/snmp.c:958 +msgid "No community name" +msgstr "" + +#: cups/dest.c:1860 cups/dest.c:1872 +msgid "No default destination." +msgstr "" + +#: scheduler/ipp.c:6094 +msgid "No default printer." +msgstr "" + +#: cgi-bin/ipp-var.c:418 scheduler/ipp.c:7476 +msgid "No destinations added." +msgstr "" + +#: backend/usb.c:187 +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +#: cups/snmp.c:988 +msgid "No error-index" +msgstr "" + +#: cups/snmp.c:980 +msgid "No error-status" +msgstr "" + +#: scheduler/ipp.c:8448 scheduler/ipp.c:9712 +msgid "No file in print request." +msgstr "" + +#: cups/ppd-util.c:162 +msgid "No modification time" +msgstr "" + +#: cups/snmp.c:1005 +msgid "No name OID" +msgstr "" + +#: filter/rastertoepson.c:1161 filter/rastertohp.c:833 +#: filter/rastertolabel.c:1288 +msgid "No pages were found." +msgstr "" + +#: cups/ppd-util.c:155 +msgid "No printer name" +msgstr "" + +#: cups/ppd-util.c:658 +msgid "No printer-uri found" +msgstr "" + +#: cups/ppd-util.c:642 +msgid "No printer-uri found for class" +msgstr "" + +#: scheduler/ipp.c:6501 +msgid "No printer-uri in request." +msgstr "" + +#: cups/http.c:2217 +msgid "No request URI." +msgstr "" + +#: cups/http.c:2234 +msgid "No request protocol version." +msgstr "" + +#: cups/request.c:337 +msgid "No request sent." +msgstr "" + +#: cups/snmp.c:972 +msgid "No request-id" +msgstr "" + +#: cups/tls-darwin.c:710 cups/tls-gnutls.c:544 +msgid "No stored credentials, not valid for name." +msgstr "" + +#: scheduler/ipp.c:5679 +msgid "No subscription attributes in request." +msgstr "" + +#: scheduler/ipp.c:7829 +msgid "No subscriptions found." +msgstr "" + +#: cups/snmp.c:996 +msgid "No variable-bindings SEQUENCE" +msgstr "" + +#: cups/snmp.c:951 +msgid "No version number" +msgstr "" + +#: ppdc/sample.c:362 +msgid "Non-continuous (Mark sensing)" +msgstr "" + +#: ppdc/sample.c:361 +msgid "Non-continuous (Web sensing)" +msgstr "" + +#: cups/ppd-cache.c:4014 cups/ppd-cache.c:4064 cups/ppd-cache.c:4114 +#: cups/ppd-cache.c:4174 +msgid "None" +msgstr "" + +#: cups/ppd-cache.c:4287 cups/ppd-cache.c:4353 cups/ppd-cache.c:4387 +#: ppdc/sample.c:238 +msgid "Normal" +msgstr "" + +#: cups/http-support.c:1522 +msgid "Not Found" +msgstr "" + +#: cups/http-support.c:1534 +msgid "Not Implemented" +msgstr "" + +#: ppdc/sample.c:268 +msgid "Not Installed" +msgstr "" + +#: cups/http-support.c:1509 +msgid "Not Modified" +msgstr "" + +#: cups/http-support.c:1537 +msgid "Not Supported" +msgstr "" + +#: scheduler/ipp.c:1510 scheduler/ipp.c:10979 +msgid "Not allowed to print." +msgstr "" + +#: ppdc/sample.c:146 +msgid "Note" +msgstr "" + +#: cups/http-support.c:1488 cups/http-support.c:1627 cups/ppd.c:283 +msgid "OK" +msgstr "" + +#: cups/ppd-cache.c:3872 ppdc/sample.c:263 +msgid "Off (1-Sided)" +msgstr "" + +#: ppdc/sample.c:356 +msgid "Oki" +msgstr "" + +#: cgi-bin/help.c:81 cgi-bin/help.c:122 cgi-bin/help.c:132 cgi-bin/help.c:162 +msgid "Online Help" +msgstr "" + +#: scheduler/ipp.c:5399 +msgid "Only local users can create a local printer." +msgstr "" + +#: cups/adminutil.c:202 +#, c-format +msgid "Open of %s failed: %s" +msgstr "" + +#: cups/ppd.c:291 +msgid "OpenGroup without a CloseGroup first" +msgstr "" + +#: cups/ppd.c:293 +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "" + +#: cgi-bin/admin.c:3138 +msgid "Operation Policy" +msgstr "" + +#: filter/pstops.c:2174 +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +#: cgi-bin/admin.c:2785 cgi-bin/admin.c:2869 +msgid "Options Installed" +msgstr "" + +#: berkeley/lpq.c:642 berkeley/lpr.c:431 berkeley/lprm.c:232 +#: scheduler/cupsfilter.c:1476 scheduler/main.c:2133 systemv/cancel.c:401 +#: systemv/cupsaccept.c:243 systemv/cupsctl.c:232 systemv/cupstestppd.c:3857 +#: systemv/lp.c:750 systemv/lpadmin.c:1620 systemv/lpinfo.c:497 +#: systemv/lpmove.c:216 systemv/lpoptions.c:538 systemv/lpstat.c:2044 +#: tools/ippeveprinter.c:7664 tools/ippfind.c:2765 tools/ipptool.c:4307 +#: ppdc/ppdc.cxx:426 ppdc/ppdhtml.cxx:173 ppdc/ppdi.cxx:119 +#: ppdc/ppdmerge.cxx:356 ppdc/ppdpo.cxx:243 +msgid "Options:" +msgstr "" + +#: cups/dest-localization.c:169 +msgid "Other Media" +msgstr "" + +#: cups/dest-localization.c:167 +msgid "Other Tray" +msgstr "" + +#: cups/ppd-cache.c:491 +msgid "Out of date PPD cache file." +msgstr "" + +#: cups/ppd-cache.c:1934 +msgid "Out of memory." +msgstr "" + +#: cups/ppd.c:810 cups/ppd.c:1347 +msgid "Output Mode" +msgstr "" + +#: ppdc/sample.c:252 +msgid "PCL Laser Printer" +msgstr "" + +#: ppdc/sample.c:149 +msgid "PRC16K" +msgstr "" + +#: ppdc/sample.c:150 +msgid "PRC16K Long Edge" +msgstr "" + +#: ppdc/sample.c:151 +msgid "PRC32K" +msgstr "" + +#: 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/dest.c:1858 +msgid "PRINTER environment variable names default destination that does not exist." +msgstr "" + +#: cups/snmp.c:968 +msgid "Packet does not contain a Get-Response-PDU" +msgstr "" + +#: cups/snmp.c:947 +msgid "Packet does not start with SEQUENCE" +msgstr "" + +#: ppdc/sample.c:355 +msgid "ParamCustominCutInterval" +msgstr "" + +#: ppdc/sample.c:353 +msgid "ParamCustominTearInterval" +msgstr "" + +#: cups/auth.c:235 cups/auth.c:394 +#, c-format +msgid "Password for %s on %s? " +msgstr "" + +#: cgi-bin/classes.c:153 +msgid "Pause Class" +msgstr "" + +#: cgi-bin/printers.c:156 +msgid "Pause Printer" +msgstr "" + +#: ppdc/sample.c:443 +msgid "Peel-Off" +msgstr "" + +#: ppdc/sample.c:160 +msgid "Photo" +msgstr "" + +#: ppdc/sample.c:161 +msgid "Photo Labels" +msgstr "" + +#: ppdc/sample.c:281 +msgid "Plain Paper" +msgstr "" + +#: cgi-bin/admin.c:2803 cgi-bin/admin.c:3087 +msgid "Policies" +msgstr "" + +#: cgi-bin/admin.c:2810 cgi-bin/admin.c:3156 cgi-bin/admin.c:3169 +msgid "Port Monitor" +msgstr "" + +#: ppdc/sample.c:270 +msgid "PostScript Printer" +msgstr "" + +#: ppdc/sample.c:147 +msgid "Postcard" +msgstr "" + +#: 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 "" + +#: backend/ipp.c:973 backend/ipp.c:981 +msgid "Preparing to print." +msgstr "" + +#: ppdc/sample.c:290 +msgid "Print Density" +msgstr "" + +#: cups/notify.c:69 +msgid "Print Job:" +msgstr "" + +#: ppdc/sample.c:335 +msgid "Print Mode" +msgstr "" + +#: cups/ppd-cache.c:4281 cups/ppd-cache.c:4343 cups/ppd-cache.c:4383 +msgid "Print Quality" +msgstr "" + +#: ppdc/sample.c:378 +msgid "Print Rate" +msgstr "" + +#: cgi-bin/printers.c:165 +msgid "Print Self-Test Page" +msgstr "" + +#: ppdc/sample.c:322 +msgid "Print Speed" +msgstr "" + +#: cgi-bin/ipp-var.c:774 +msgid "Print Test Page" +msgstr "" + +#: ppdc/sample.c:351 +msgid "Print and Cut" +msgstr "" + +#: ppdc/sample.c:339 +msgid "Print and Tear" +msgstr "" + +#: backend/socket.c:406 backend/usb-unix.c:177 +msgid "Print file sent." +msgstr "" + +#: backend/ipp.c:2261 +msgid "Print job canceled at printer." +msgstr "Udskrivningsjob annulleret på printer." + +#: backend/ipp.c:2253 +msgid "Print job too large." +msgstr "" + +#: backend/ipp.c:1721 +msgid "Print job was not accepted." +msgstr "" + +#: scheduler/ipp.c:5465 +#, c-format +msgid "Printer \"%s\" already exists." +msgstr "" + +#: cgi-bin/ipp-var.c:1024 +msgid "Printer Added" +msgstr "" + +#: ppdc/sample.c:255 +msgid "Printer Default" +msgstr "" + +#: cgi-bin/ipp-var.c:1028 +msgid "Printer Deleted" +msgstr "" + +#: cgi-bin/ipp-var.c:1026 +msgid "Printer Modified" +msgstr "" + +#: cgi-bin/ipp-var.c:1022 +msgid "Printer Paused" +msgstr "" + +#: ppdc/sample.c:289 +msgid "Printer Settings" +msgstr "" + +#: backend/ipp.c:2256 +msgid "Printer cannot print supplied content." +msgstr "" + +#: backend/ipp.c:2259 +msgid "Printer cannot print with supplied options." +msgstr "" + +#: cups/ppd-cache.c:4556 +msgid "Printer does not support required IPP attributes or document formats." +msgstr "" + +#: cups/notify.c:113 +msgid "Printer:" +msgstr "" + +#: cgi-bin/printers.c:190 cgi-bin/printers.c:317 +msgid "Printers" +msgstr "" + +#: filter/rastertoepson.c:1107 filter/rastertohp.c:774 +#: filter/rastertolabel.c:1235 +#, c-format +msgid "Printing page %d, %u%% complete." +msgstr "" + +#: cups/ppd-cache.c:4111 +msgid "Punch" +msgstr "" + +#: ppdc/sample.c:155 +msgid "Quarto" +msgstr "" + +#: scheduler/ipp.c:1505 scheduler/ipp.c:10974 +msgid "Quota limit reached." +msgstr "" + +#: berkeley/lpq.c:495 +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#: cgi-bin/classes.c:157 cgi-bin/printers.c:160 +msgid "Reject Jobs" +msgstr "" + +#: backend/lpd.c:1074 backend/lpd.c:1206 +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#: backend/lpd.c:1159 +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +#: ppdc/sample.c:423 +msgid "Reprint After Error" +msgstr "" + +#: cups/http-support.c:1525 +msgid "Request Entity Too Large" +msgstr "" + +#: cups/ppd.c:812 cups/ppd.c:1349 ppdc/sample.c:231 +msgid "Resolution" +msgstr "" + +#: cgi-bin/classes.c:151 +msgid "Resume Class" +msgstr "" + +#: cgi-bin/printers.c:153 +msgid "Resume Printer" +msgstr "" + +#: ppdc/sample.c:165 +msgid "Return Address" +msgstr "" + +#: ppdc/sample.c:444 +msgid "Rewind" +msgstr "" + +#: cups/snmp.c:949 +msgid "SEQUENCE uses indefinite length" +msgstr "" + +#: cups/http-support.c:1549 +msgid "SSL/TLS Negotiation Error" +msgstr "" + +#: cups/http-support.c:1506 +msgid "See Other" +msgstr "" + +#: scheduler/ipp.c:7099 scheduler/ipp.c:7118 +msgid "See remote printer." +msgstr "" + +#: cups/tls-darwin.c:765 cups/tls-gnutls.c:606 +msgid "Self-signed credentials are blocked." +msgstr "" + +#: backend/usb-darwin.c:566 backend/usb-libusb.c:343 +msgid "Sending data to printer." +msgstr "" + +#: cgi-bin/ipp-var.c:1038 +msgid "Server Restarted" +msgstr "" + +#: cgi-bin/ipp-var.c:1044 +msgid "Server Security Auditing" +msgstr "" + +#: cgi-bin/ipp-var.c:1040 +msgid "Server Started" +msgstr "" + +#: cgi-bin/ipp-var.c:1042 +msgid "Server Stopped" +msgstr "" + +#: cups/tls-darwin.c:1275 cups/tls-gnutls.c:1298 +msgid "Server credentials not set." +msgstr "" + +#: cups/http-support.c:1543 +msgid "Service Unavailable" +msgstr "" + +#: cgi-bin/admin.c:2290 cgi-bin/admin.c:2336 cgi-bin/admin.c:2493 +#: cgi-bin/admin.c:2512 +msgid "Set Allowed Users" +msgstr "" + +#: cgi-bin/admin.c:2539 +msgid "Set As Server Default" +msgstr "" + +#: cgi-bin/admin.c:2639 +msgid "Set Class Options" +msgstr "" + +#: cgi-bin/admin.c:2639 cgi-bin/admin.c:2813 cgi-bin/admin.c:3198 +msgid "Set Printer Options" +msgstr "" + +#: cgi-bin/admin.c:3368 cgi-bin/admin.c:3412 cgi-bin/admin.c:3430 +msgid "Set Publishing" +msgstr "" + +#: ppdc/sample.c:166 +msgid "Shipping Address" +msgstr "" + +#: cups/ppd-cache.c:3872 ppdc/sample.c:265 +msgid "Short-Edge (Landscape)" +msgstr "" + +#: ppdc/sample.c:283 +msgid "Special Paper" +msgstr "" + +#: backend/lpd.c:1115 +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +#: ppdc/sample.c:336 +msgid "Standard" +msgstr "" + +#: cups/ppd-cache.c:4011 +msgid "Staple" +msgstr "" + +#. TRANSLATORS: Banner/cover sheet before the print job. +#: cgi-bin/admin.c:3059 +msgid "Starting Banner" +msgstr "" + +#: filter/rastertoepson.c:1083 filter/rastertohp.c:750 +#: filter/rastertolabel.c:1211 +#, c-format +msgid "Starting page %d." +msgstr "" + +#: ppdc/sample.c:156 +msgid "Statement" +msgstr "" + +#: scheduler/ipp.c:3591 scheduler/ipp.c:6911 scheduler/ipp.c:7636 +#: scheduler/ipp.c:9160 +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +#: tools/ippfind.c:2812 +msgid "Substitutions:" +msgstr "" + +#: ppdc/sample.c:157 +msgid "Super A" +msgstr "" + +#: ppdc/sample.c:158 +msgid "Super B" +msgstr "" + +#: ppdc/sample.c:162 +msgid "Super B/A3" +msgstr "" + +#: cups/http-support.c:1485 +msgid "Switching Protocols" +msgstr "" + +#: ppdc/sample.c:159 +msgid "Tabloid" +msgstr "" + +#: ppdc/sample.c:45 +msgid "Tabloid Oversize" +msgstr "" + +#: ppdc/sample.c:46 +msgid "Tabloid Oversize Long Edge" +msgstr "" + +#: ppdc/sample.c:337 +msgid "Tear" +msgstr "" + +#: ppdc/sample.c:442 +msgid "Tear-Off" +msgstr "" + +#: ppdc/sample.c:383 +msgid "Tear-Off Adjust Position" +msgstr "" + +#: scheduler/ipp.c:1341 +#, c-format +msgid "The \"%s\" attribute is required for print jobs." +msgstr "" + +#: scheduler/ipp.c:6572 scheduler/ipp.c:6652 scheduler/ipp.c:6665 +#: scheduler/ipp.c:6677 scheduler/ipp.c:6692 +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#: scheduler/ipp.c:1320 +#, c-format +msgid "The '%s' Job Status attribute cannot be supplied in a job creation request." +msgstr "" + +#: scheduler/ipp.c:5194 +#, c-format +msgid "The '%s' operation attribute cannot be supplied in a Create-Job request." +msgstr "" + +#: scheduler/ipp.c:7141 +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "" + +#: scheduler/ipp.c:7130 +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "" + +#: filter/rastertoepson.c:1052 filter/rastertohp.c:721 +#: filter/rastertolabel.c:1175 +msgid "The PPD file could not be opened." +msgstr "" + +#: cgi-bin/admin.c:515 +msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." +msgstr "" + +#: scheduler/ipp.c:2097 +msgid "The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" + +#: scheduler/ipp.c:2080 scheduler/ipp.c:5804 +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +#: backend/ipp.c:993 +msgid "The printer configuration is incorrect or the printer no longer exists." +msgstr "" + +#: backend/lpd.c:678 backend/lpd.c:1067 backend/lpd.c:1149 backend/lpd.c:1199 +msgid "The printer did not respond." +msgstr "" + +#: backend/ipp.c:766 backend/ipp.c:956 backend/ipp.c:1070 backend/ipp.c:1523 +#: backend/ipp.c:1693 backend/lpd.c:886 backend/socket.c:354 +#: backend/usb-unix.c:117 backend/usb-unix.c:407 backend/usb-unix.c:490 +msgid "The printer is in use." +msgstr "" + +#: backend/runloop.c:236 backend/runloop.c:356 +msgid "The printer is not connected." +msgstr "" + +#: backend/ipp.c:744 backend/ipp.c:777 backend/ipp.c:952 backend/lpd.c:865 +#: backend/lpd.c:906 backend/socket.c:333 backend/socket.c:366 +msgid "The printer is not responding." +msgstr "" + +#: backend/runloop.c:378 +msgid "The printer is now connected." +msgstr "" + +#: backend/usb-darwin.c:1342 +msgid "The printer is now online." +msgstr "" + +#: backend/usb-darwin.c:1381 +msgid "The printer is offline." +msgstr "" + +#: backend/ipp.c:760 backend/lpd.c:880 backend/socket.c:348 +msgid "The printer is unreachable at this time." +msgstr "" + +#: backend/ipp.c:753 backend/lpd.c:873 backend/socket.c:341 +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +#: cgi-bin/admin.c:698 +msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/ \\), quotes (' \"), question mark (?), or the pound sign (#)." +msgstr "" + +#: scheduler/ipp.c:762 scheduler/ipp.c:1047 scheduler/ipp.c:3230 +#: scheduler/ipp.c:3411 scheduler/ipp.c:5177 scheduler/ipp.c:5638 +#: scheduler/ipp.c:5972 scheduler/ipp.c:6538 scheduler/ipp.c:7345 +#: scheduler/ipp.c:7401 scheduler/ipp.c:7742 scheduler/ipp.c:8017 +#: scheduler/ipp.c:8106 scheduler/ipp.c:8139 scheduler/ipp.c:8463 +#: scheduler/ipp.c:8870 scheduler/ipp.c:8952 scheduler/ipp.c:10122 +#: scheduler/ipp.c:10584 scheduler/ipp.c:10937 scheduler/ipp.c:11019 +#: scheduler/ipp.c:11348 +msgid "The printer or class does not exist." +msgstr "" + +#: scheduler/ipp.c:1259 +msgid "The printer or class is not shared." +msgstr "" + +#: scheduler/ipp.c:868 scheduler/ipp.c:2261 +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "" + +#: scheduler/ipp.c:3207 +msgid "The printer-uri attribute is required." +msgstr "" + +#: scheduler/ipp.c:852 +msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" + +#: scheduler/ipp.c:2245 +msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" + +#: scheduler/client.c:2003 +msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." +msgstr "" + +#: scheduler/ipp.c:6636 +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +#: scheduler/ipp.c:5901 +msgid "There are too many subscriptions." +msgstr "" + +#: backend/usb-darwin.c:398 backend/usb-darwin.c:464 backend/usb-darwin.c:528 +#: backend/usb-darwin.c:549 backend/usb-libusb.c:268 backend/usb-libusb.c:322 +msgid "There was an unrecoverable USB error." +msgstr "" + +#: ppdc/sample.c:430 +msgid "Thermal Transfer Media" +msgstr "" + +#: scheduler/ipp.c:1499 +msgid "Too many active jobs." +msgstr "" + +#: scheduler/ipp.c:1393 +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#: scheduler/ipp.c:2574 +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +#: ppdc/sample.c:284 +msgid "Transparency" +msgstr "" + +#: ppdc/sample.c:279 +msgid "Tray" +msgstr "" + +#: ppdc/sample.c:256 +msgid "Tray 1" +msgstr "" + +#: ppdc/sample.c:257 +msgid "Tray 2" +msgstr "" + +#: ppdc/sample.c:258 +msgid "Tray 3" +msgstr "" + +#: ppdc/sample.c:259 +msgid "Tray 4" +msgstr "" + +#: cups/tls-darwin.c:670 cups/tls-darwin.c:752 cups/tls-gnutls.c:504 +#: cups/tls-gnutls.c:586 +msgid "Trust on first use is disabled." +msgstr "" + +#: cups/http-support.c:1528 +msgid "URI Too Long" +msgstr "" + +#: cups/http-support.c:1603 +msgid "URI too large" +msgstr "" + +#: ppdc/sample.c:124 +msgid "US Fanfold" +msgstr "" + +#: ppdc/sample.c:138 +msgid "US Ledger" +msgstr "" + +#: ppdc/sample.c:139 +msgid "US Legal" +msgstr "" + +#: ppdc/sample.c:140 +msgid "US Legal Oversize" +msgstr "" + +#: ppdc/sample.c:141 +msgid "US Letter" +msgstr "" + +#: 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:1651 cgi-bin/admin.c:1664 cgi-bin/admin.c:1688 +msgid "Unable to access cupsd.conf file" +msgstr "" + +#: cgi-bin/help.c:123 +msgid "Unable to access help file." +msgstr "" + +#: cgi-bin/admin.c:580 +msgid "Unable to add class" +msgstr "" + +#: backend/ipp.c:1880 +msgid "Unable to add document to print job." +msgstr "" + +#: scheduler/ipp.c:1574 +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +#: cgi-bin/admin.c:823 cgi-bin/admin.c:1193 +msgid "Unable to add printer" +msgstr "" + +#: scheduler/ipp.c:1177 +msgid "Unable to allocate memory for file types." +msgstr "" + +#: filter/pstops.c:415 +msgid "Unable to allocate memory for page info" +msgstr "" + +#: filter/pstops.c:409 +msgid "Unable to allocate memory for pages array" +msgstr "" + +#: tools/ippeveprinter.c:1486 +msgid "Unable to allocate memory for printer" +msgstr "" + +#: backend/ipp.c:2165 backend/ipp.c:2696 +msgid "Unable to cancel print job." +msgstr "Kan ikke annullere udskrivningsjob." + +#: cgi-bin/admin.c:2494 +msgid "Unable to change printer" +msgstr "" + +#: cgi-bin/admin.c:3413 +msgid "Unable to change printer-is-shared attribute" +msgstr "" + +#: cgi-bin/admin.c:1349 cgi-bin/admin.c:1491 +msgid "Unable to change server settings" +msgstr "" + +#: cups/ipp.c:5179 +#, c-format +msgid "Unable to compile mimeMediaType regular expression: %s." +msgstr "" + +#: cups/ipp.c:5134 +#, c-format +msgid "Unable to compile naturalLanguage regular expression: %s." +msgstr "" + +#: filter/commandtops.c:401 +msgid "Unable to configure printer options." +msgstr "" + +#: cups/adminutil.c:158 cups/request.c:1057 +msgid "Unable to connect to host." +msgstr "" + +#: backend/ipp.c:723 backend/ipp.c:1275 backend/lpd.c:846 backend/socket.c:314 +#: backend/usb-unix.c:103 +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#: scheduler/ipp.c:2676 +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +#: scheduler/ipp.c:2721 +msgid "Unable to copy PPD file." +msgstr "" + +#: cups/tls-darwin.c:636 cups/tls-gnutls.c:467 +msgid "Unable to create credentials from array." +msgstr "" + +#: cups/ppd-util.c:573 cups/util.c:478 +msgid "Unable to create printer-uri" +msgstr "" + +#: scheduler/ipp.c:5475 +msgid "Unable to create printer." +msgstr "" + +#: cups/tls-darwin.c:1566 cups/tls-gnutls.c:1510 +msgid "Unable to create server credentials." +msgstr "" + +#: tools/ippeveprinter.c:626 +#, c-format +msgid "Unable to create spool directory \"%s\": %s" +msgstr "" + +#: cgi-bin/admin.c:1542 cgi-bin/admin.c:1554 scheduler/cupsfilter.c:1284 +msgid "Unable to create temporary file" +msgstr "" + +#: cgi-bin/admin.c:1845 +msgid "Unable to delete class" +msgstr "" + +#: cgi-bin/admin.c:1930 +msgid "Unable to delete printer" +msgstr "" + +#: cgi-bin/classes.c:246 cgi-bin/printers.c:255 +msgid "Unable to do maintenance command" +msgstr "" + +#: cgi-bin/admin.c:1666 +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +#: cups/tls-darwin.c:1793 +#, c-format +msgid "Unable to establish a secure connection to host (%d)." +msgstr "" + +#: cups/tls-darwin.c:1754 +msgid "Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +#: cups/tls-darwin.c:1744 +msgid "Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +#: cups/tls-darwin.c:1739 +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +#: cups/tls-darwin.c:1749 +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +#: cups/tls-darwin.c:1759 +msgid "Unable to establish a secure connection to host (peer dropped connection before responding)." +msgstr "" + +#: cups/tls-darwin.c:1734 +msgid "Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +#: cups/tls-darwin.c:1729 +msgid "Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +#: cups/tls-sspi.c:1277 cups/tls-sspi.c:1294 +msgid "Unable to establish a secure connection to host." +msgstr "" + +#: tools/ippeveprinter.c:1461 tools/ippeveprinter.c:1471 +#, c-format +msgid "Unable to execute command \"%s\": %s" +msgstr "" + +#: cgi-bin/ipp-var.c:347 +msgid "Unable to find destination for job" +msgstr "" + +#: cups/http-support.c:2094 +msgid "Unable to find printer." +msgstr "" + +#: cups/tls-darwin.c:1579 +msgid "Unable to find server credentials." +msgstr "" + +#: backend/ipp.c:3359 +msgid "Unable to get backend exit status." +msgstr "" + +#: cgi-bin/classes.c:426 +msgid "Unable to get class list" +msgstr "" + +#: cgi-bin/classes.c:525 +msgid "Unable to get class status" +msgstr "" + +#: cgi-bin/admin.c:1087 +msgid "Unable to get list of printer drivers" +msgstr "" + +#: cgi-bin/admin.c:2344 +msgid "Unable to get printer attributes" +msgstr "" + +#: cgi-bin/printers.c:443 +msgid "Unable to get printer list" +msgstr "" + +#: cgi-bin/printers.c:545 +msgid "Unable to get printer status" +msgstr "" + +#: backend/ipp.c:1017 +msgid "Unable to get printer status." +msgstr "" + +#: cgi-bin/help.c:82 +msgid "Unable to load help index." +msgstr "" + +#: backend/network.c:69 +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +#: backend/dnssd.c:752 backend/ipp.c:336 backend/lpd.c:181 +#: backend/socket.c:155 +msgid "Unable to locate printer." +msgstr "" + +#: cgi-bin/admin.c:579 +msgid "Unable to modify class" +msgstr "" + +#: cgi-bin/admin.c:822 cgi-bin/admin.c:1192 +msgid "Unable to modify printer" +msgstr "" + +#: cgi-bin/ipp-var.c:414 cgi-bin/ipp-var.c:503 +msgid "Unable to move job" +msgstr "" + +#: cgi-bin/ipp-var.c:416 cgi-bin/ipp-var.c:505 +msgid "Unable to move jobs" +msgstr "" + +#: cgi-bin/admin.c:2690 cups/ppd.c:284 +msgid "Unable to open PPD file" +msgstr "" + +#: cgi-bin/admin.c:2161 +msgid "Unable to open cupsd.conf file:" +msgstr "" + +#: backend/usb-unix.c:127 +msgid "Unable to open device file" +msgstr "" + +#: scheduler/ipp.c:6315 +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +#: cgi-bin/help.c:356 +msgid "Unable to open help file." +msgstr "" + +#: backend/ipp.c:377 backend/ipp.c:1620 backend/ipp.c:1833 backend/lpd.c:469 +#: backend/socket.c:142 backend/usb.c:224 filter/gziptoany.c:65 +#: filter/pstops.c:262 +msgid "Unable to open print file" +msgstr "" + +#: filter/rastertoepson.c:1012 filter/rastertohp.c:681 +#: filter/rastertolabel.c:1133 +msgid "Unable to open raster file" +msgstr "" + +#: cgi-bin/ipp-var.c:777 +msgid "Unable to print test page" +msgstr "" + +#: backend/runloop.c:78 backend/runloop.c:307 backend/usb-darwin.c:636 +#: backend/usb-darwin.c:680 backend/usb-libusb.c:413 backend/usb-libusb.c:448 +msgid "Unable to read print data." +msgstr "" + +#: tools/ippeveprinter.c:6613 tools/ippeveprinter.c:6631 +#: tools/ippeveprinter.c:6650 tools/ippeveprinter.c:6664 +#, c-format +msgid "Unable to register \"%s.%s\": %d" +msgstr "" + +#: scheduler/ipp.c:8622 scheduler/ipp.c:9865 +msgid "Unable to rename job document file." +msgstr "" + +#: cups/dest.c:3265 +msgid "Unable to resolve printer-uri." +msgstr "" + +#: filter/pstops.c:527 +msgid "Unable to see in file" +msgstr "" + +#: cgi-bin/ipp-var.c:580 cgi-bin/ipp-var.c:600 +msgid "Unable to send command to printer driver" +msgstr "" + +#: backend/usb-darwin.c:758 backend/usb-libusb.c:524 +msgid "Unable to send data to printer." +msgstr "" + +#: cgi-bin/admin.c:3314 +msgid "Unable to set options" +msgstr "" + +#: cgi-bin/admin.c:2581 +msgid "Unable to set server default" +msgstr "" + +#: backend/ipp.c:3218 backend/ipp.c:3295 backend/ipp.c:3303 +msgid "Unable to start backend process." +msgstr "" + +#: cgi-bin/admin.c:1604 +msgid "Unable to upload cupsd.conf file" +msgstr "" + +#: backend/usb-darwin.c:2148 backend/usb-darwin.c:2172 +msgid "Unable to use legacy USB class driver." +msgstr "" + +#: backend/runloop.c:107 backend/runloop.c:362 +msgid "Unable to write print data" +msgstr "" + +#: filter/gziptoany.c:84 +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +#: cups/http-support.c:1516 +msgid "Unauthorized" +msgstr "" + +#: cgi-bin/admin.c:3010 +msgid "Units" +msgstr "" + +#: cups/http-support.c:1556 cups/http-support.c:1640 cups/ppd.c:313 +msgid "Unknown" +msgstr "" + +#: filter/pstops.c:2182 +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#: tools/ippeveprinter.c:3848 +#, c-format +msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." +msgstr "" + +#: backend/ipp.c:519 +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#: backend/lpd.c:327 +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#: backend/lpd.c:298 +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#: cups/hash.c:278 +msgid "Unknown hash algorithm." +msgstr "" + +#: cups/dest-options.c:1157 +msgid "Unknown media size name." +msgstr "" + +#: backend/ipp.c:583 +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#: filter/pstops.c:2165 +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#: backend/lpd.c:313 +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#: scheduler/ipp.c:10806 +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "" + +#: scheduler/ipp.c:10789 +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "" + +#: cups/http.c:2266 +msgid "Unknown request method." +msgstr "" + +#: cups/http.c:2286 +msgid "Unknown request version." +msgstr "" + +#: cups/http-support.c:1633 +msgid "Unknown scheme in URI" +msgstr "" + +#: cups/http-addrlist.c:824 +msgid "Unknown service name." +msgstr "" + +#: backend/ipp.c:548 +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#: scheduler/ipp.c:11265 +#, c-format +msgid "Unsupported 'compression' value \"%s\"." +msgstr "" + +#: scheduler/ipp.c:11295 +#, c-format +msgid "Unsupported 'document-format' value \"%s\"." +msgstr "" + +#: scheduler/ipp.c:7969 scheduler/ipp.c:10348 scheduler/ipp.c:11309 +msgid "Unsupported 'job-hold-until' value." +msgstr "" + +#: scheduler/ipp.c:11325 +msgid "Unsupported 'job-name' value." +msgstr "" + +#: scheduler/ipp.c:298 +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#: scheduler/ipp.c:8429 scheduler/ipp.c:9677 +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#: scheduler/ipp.c:8565 scheduler/ipp.c:9830 +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#: scheduler/ipp.c:9813 +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#: scheduler/ipp.c:1359 +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#: scheduler/ipp.c:1457 +msgid "Unsupported margins." +msgstr "" + +#: cups/pwg-media.c:541 +msgid "Unsupported media value." +msgstr "" + +#: filter/pstops.c:2447 +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#: filter/pstops.c:2481 +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#: filter/pstops.c:2532 +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +#: filter/rastertopwg.c:132 filter/rastertopwg.c:168 filter/rastertopwg.c:176 +#: filter/rastertopwg.c:185 +msgid "Unsupported raster data." +msgstr "" + +#: cups/snmp.c:1066 +msgid "Unsupported value type" +msgstr "" + +#: cups/http-support.c:1531 +msgid "Upgrade Required" +msgstr "" + +#: systemv/cupsaccept.c:242 +#, c-format +msgid "Usage: %s [options] destination(s)" +msgstr "Anvendelse: %s [tilvalg] destination(er)" + +#: backend/dnssd.c:192 backend/ipp.c:325 backend/lpd.c:168 +#: backend/socket.c:119 backend/usb.c:170 filter/commandtops.c:57 +#: filter/gziptoany.c:38 filter/pstops.c:223 monitor/bcp.c:48 +#: monitor/tbcp.c:47 +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "Anvendelse: %s job-id bruger titel kopier tilvalg [fil]" + +#: systemv/cancel.c:398 +msgid "" +"Usage: cancel [options] [id]\n" +" cancel [options] [destination]\n" +" cancel [options] [destination-id]" +msgstr "" +"Anvendelse: cancel [tilvalg] [id]\n" +" cancel [tilvalg] [destination]\n" +" cancel [tilvalg] [destinations-id]" + +#: systemv/cupsctl.c:231 +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "Anvendelse: cupsctl [tilvalg] [param=værdi ... paramN=værdiN]" + +#: scheduler/main.c:2132 +msgid "Usage: cupsd [options]" +msgstr "Anvendelse: cupsd [tilvalg]" + +#: scheduler/cupsfilter.c:1475 +msgid "Usage: cupsfilter [ options ] [ -- ] filename" +msgstr "Anvendelse: cupsfilter [ tilvalg ] [ -- ] filnavn" + +#: systemv/cupstestppd.c:3855 +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +" program | cupstestppd [options] -" +msgstr "" +"Anvendelse: cupstestppd [tilvalg] filnavn1.ppd[.gz] [... filnavnN.ppd[.gz]]\n" +" program | cupstestppd [tilvalg] -" + +#: tools/ippeveprinter.c:7663 +msgid "Usage: ippeveprinter [options] \"name\"" +msgstr "Anvendelse: ippeveprinter [tilvalg] \"navn\"" + +#: tools/ippfind.c:2759 +msgid "" +"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" +" ippfind [options] name[.regtype[.domain.]] ... [expression]\n" +" ippfind --help\n" +" ippfind --version" +msgstr "" +"Anvendelse: ippfind [tilvalg] regtype[,undertype][.domæne.] ... [udtryk]\n" +" ippfind [tilvalg] navn[.regtype[.domæne.]] ... [udtryk]\n" +" ippfind --help\n" +" ippfind --version" + +#: tools/ipptool.c:4306 +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "Anvendelse: ipptool [tilvalg] URI filnavn [ ... filnavnN ]" + +#: systemv/lp.c:748 +msgid "" +"Usage: lp [options] [--] [file(s)]\n" +" lp [options] -i id" +msgstr "" +"Anvendelse: lp [tilvalg] [--] [fil(er)]\n" +" lp [tilvalg] -i id" + +#: systemv/lpadmin.c:1615 +msgid "" +"Usage: lpadmin [options] -d destination\n" +" lpadmin [options] -p destination\n" +" lpadmin [options] -p destination -c class\n" +" lpadmin [options] -p destination -r class\n" +" lpadmin [options] -x destination" +msgstr "" +"Anvendelse: lpadmin [tilvalg] -d destination\n" +" lpadmin [tilvalg] -p destination\n" +" lpadmin [tilvalg] -p destination -c klasse\n" +" lpadmin [tilvalg] -p destination -r klasse\n" +" lpadmin [tilvalg] -x destination" + +#: systemv/lpinfo.c:495 +msgid "" +"Usage: lpinfo [options] -m\n" +" lpinfo [options] -v" +msgstr "" +"Anvendelse: lpinfo [tilvalg] -m\n" +" lpinfo [tilvalg] -v" + +#: systemv/lpmove.c:214 +msgid "" +"Usage: lpmove [options] job destination\n" +" lpmove [options] source-destination destination" +msgstr "" +"Anvendelse: lpmove [tilvalg] job destination\n" +" lpmove [tilvalg] kilde-destination destination" + +#: systemv/lpoptions.c:534 +msgid "" +"Usage: lpoptions [options] -d destination\n" +" lpoptions [options] [-p destination] [-l]\n" +" lpoptions [options] [-p destination] -o option[=value]\n" +" lpoptions [options] -x destination" +msgstr "" +"Anvendelse: lpoptions [tilvalg] -d destination\n" +" lpoptions [tilvalg] [-p destination] [-l]\n" +" lpoptions [tilvalg] [-p destination] -o tilvalg[=værdi]\n" +" lpoptions [tilvalg] -x destination" + +#: berkeley/lpq.c:641 +msgid "Usage: lpq [options] [+interval]" +msgstr "Anvendelse: lpq [tilvalg] [+interval]" + +#: berkeley/lpr.c:430 +msgid "Usage: lpr [options] [file(s)]" +msgstr "Anvendelse: lpr [tilvalg] [fil(er)]" + +#: berkeley/lprm.c:230 +msgid "" +"Usage: lprm [options] [id]\n" +" lprm [options] -" +msgstr "" +"Anvendelse: lprm [tilvalg] [id]\n" +" lprm [tilvalg] -" + +#: systemv/lpstat.c:2043 +msgid "Usage: lpstat [options]" +msgstr "Anvendelse: lpstat [tilvalg]" + +#: ppdc/ppdc.cxx:424 +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "Anvendelse: ppdc [tilvalg] filnavn.drv [ ... filnavnN.drv ]" + +#: ppdc/ppdhtml.cxx:171 +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "Anvendelse: ppdhtml [tilvalg] filnavn.drv >filnavn.html" + +#: ppdc/ppdi.cxx:117 +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "Anvendelse: ppdi [tilvalg] filnavn.ppd [ ... filnavnN.ppd ]" + +#: ppdc/ppdmerge.cxx:354 +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "Anvendelse: ppdmerge [tilvalg] filnavn.ppd [ ... filnavnN.ppd ]" + +#: ppdc/ppdpo.cxx:241 +msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" +"Anvendelse: ppdpo [tilvalg] -o filnavn.po filnavn.drv [ ... filnavnN.drv ]" + +#: backend/snmp.c:185 +msgid "Usage: snmp [host-or-ip-address]" +msgstr "Anvendelse: snmp [vært-eller-ip-adresse]" + +#: tools/ippeveprinter.c:631 +#, c-format +msgid "Using spool directory \"%s\"." +msgstr "" + +#: cups/snmp.c:1018 +msgid "Value uses indefinite length" +msgstr "" + +#: cups/snmp.c:1003 +msgid "VarBind uses indefinite length" +msgstr "" + +#: cups/snmp.c:953 +msgid "Version uses indefinite length" +msgstr "" + +#: backend/ipp.c:2000 +msgid "Waiting for job to complete." +msgstr "" + +#: backend/usb-darwin.c:429 backend/usb-darwin.c:483 backend/usb-libusb.c:220 +msgid "Waiting for printer to become available." +msgstr "" + +#: backend/socket.c:417 +msgid "Waiting for printer to finish." +msgstr "" + +#: systemv/cupstestppd.c:3854 +msgid "Warning: This program will be removed in a future version of CUPS." +msgstr "" + +#: cups/http-support.c:1552 +msgid "Web Interface is Disabled" +msgstr "" + +#: cups/ppd.c:1972 +msgid "Yes" +msgstr "Ja" + +#: scheduler/client.c:1991 +msgid "You cannot access this page." +msgstr "" + +#: scheduler/client.c:1997 +#, c-format +msgid "You must access this page using the URL https://%s:%d%s." +msgstr "" + +#: scheduler/client.c:1989 +msgid "Your account does not have the necessary privileges." +msgstr "" + +#: ppdc/sample.c:434 +msgid "ZPL Label Printer" +msgstr "" + +#: ppdc/sample.c:357 +msgid "Zebra" +msgstr "" + +#: cups/notify.c:89 +msgid "aborted" +msgstr "" + +#. TRANSLATORS: Accuracy Units +#: locale/ipp-strings.c:2 +msgid "accuracy-units" +msgstr "" + +#. TRANSLATORS: Millimeters +#: locale/ipp-strings.c:4 +msgid "accuracy-units.mm" +msgstr "" + +#. TRANSLATORS: Nanometers +#: locale/ipp-strings.c:6 +msgid "accuracy-units.nm" +msgstr "" + +#. TRANSLATORS: Micrometers +#: locale/ipp-strings.c:8 +msgid "accuracy-units.um" +msgstr "" + +#. TRANSLATORS: Bale Output +#: locale/ipp-strings.c:10 +msgid "baling" +msgstr "" + +#. TRANSLATORS: Bale Using +#: locale/ipp-strings.c:12 +msgid "baling-type" +msgstr "" + +#. TRANSLATORS: Band +#: locale/ipp-strings.c:14 +msgid "baling-type.band" +msgstr "" + +#. TRANSLATORS: Shrink Wrap +#: locale/ipp-strings.c:16 +msgid "baling-type.shrink-wrap" +msgstr "" + +#. TRANSLATORS: Wrap +#: locale/ipp-strings.c:18 +msgid "baling-type.wrap" +msgstr "" + +#. TRANSLATORS: Bale After +#: locale/ipp-strings.c:20 +msgid "baling-when" +msgstr "" + +#. TRANSLATORS: Job +#: locale/ipp-strings.c:22 +msgid "baling-when.after-job" +msgstr "" + +#. TRANSLATORS: Sets +#: locale/ipp-strings.c:24 +msgid "baling-when.after-sets" +msgstr "" + +#. TRANSLATORS: Bind Output +#: locale/ipp-strings.c:26 +msgid "binding" +msgstr "" + +#. TRANSLATORS: Bind Edge +#: locale/ipp-strings.c:28 +msgid "binding-reference-edge" +msgstr "" + +#. TRANSLATORS: Bottom +#: locale/ipp-strings.c:30 +msgid "binding-reference-edge.bottom" +msgstr "" + +#. TRANSLATORS: Left +#: locale/ipp-strings.c:32 +msgid "binding-reference-edge.left" +msgstr "" + +#. TRANSLATORS: Right +#: locale/ipp-strings.c:34 +msgid "binding-reference-edge.right" +msgstr "" + +#. TRANSLATORS: Top +#: locale/ipp-strings.c:36 +msgid "binding-reference-edge.top" +msgstr "" + +#. TRANSLATORS: Binder Type +#: locale/ipp-strings.c:38 +msgid "binding-type" +msgstr "" + +#. TRANSLATORS: Adhesive +#: locale/ipp-strings.c:40 +msgid "binding-type.adhesive" +msgstr "" + +#. TRANSLATORS: Comb +#: locale/ipp-strings.c:42 +msgid "binding-type.comb" +msgstr "" + +#. TRANSLATORS: Flat +#: locale/ipp-strings.c:44 +msgid "binding-type.flat" +msgstr "" + +#. TRANSLATORS: Padding +#: locale/ipp-strings.c:46 +msgid "binding-type.padding" +msgstr "" + +#. TRANSLATORS: Perfect +#: locale/ipp-strings.c:48 +msgid "binding-type.perfect" +msgstr "" + +#. TRANSLATORS: Spiral +#: locale/ipp-strings.c:50 +msgid "binding-type.spiral" +msgstr "" + +#. TRANSLATORS: Tape +#: locale/ipp-strings.c:52 +msgid "binding-type.tape" +msgstr "" + +#. TRANSLATORS: Velo +#: locale/ipp-strings.c:54 +msgid "binding-type.velo" +msgstr "" + +#: cups/notify.c:86 +msgid "canceled" +msgstr "" + +#. TRANSLATORS: Chamber Humidity +#: locale/ipp-strings.c:56 +msgid "chamber-humidity" +msgstr "" + +#. TRANSLATORS: Chamber Temperature +#: locale/ipp-strings.c:58 +msgid "chamber-temperature" +msgstr "" + +#. TRANSLATORS: Print Job Cost +#: locale/ipp-strings.c:60 +msgid "charge-info-message" +msgstr "" + +#. TRANSLATORS: Coat Sheets +#: locale/ipp-strings.c:62 +msgid "coating" +msgstr "" + +#. TRANSLATORS: Add Coating To +#: locale/ipp-strings.c:64 +msgid "coating-sides" +msgstr "" + +#. TRANSLATORS: Back +#: locale/ipp-strings.c:66 +msgid "coating-sides.back" +msgstr "" + +#. TRANSLATORS: Front and Back +#: locale/ipp-strings.c:68 +msgid "coating-sides.both" +msgstr "" + +#. TRANSLATORS: Front +#: locale/ipp-strings.c:70 +msgid "coating-sides.front" +msgstr "" + +#. TRANSLATORS: Type of Coating +#: locale/ipp-strings.c:72 +msgid "coating-type" +msgstr "" + +#. TRANSLATORS: Archival +#: locale/ipp-strings.c:74 +msgid "coating-type.archival" +msgstr "" + +#. TRANSLATORS: Archival Glossy +#: locale/ipp-strings.c:76 +msgid "coating-type.archival-glossy" +msgstr "" + +#. TRANSLATORS: Archival Matte +#: locale/ipp-strings.c:78 +msgid "coating-type.archival-matte" +msgstr "" + +#. TRANSLATORS: Archival Semi Gloss +#: locale/ipp-strings.c:80 +msgid "coating-type.archival-semi-gloss" +msgstr "" + +#. TRANSLATORS: Glossy +#: locale/ipp-strings.c:82 +msgid "coating-type.glossy" +msgstr "" + +#. TRANSLATORS: High Gloss +#: locale/ipp-strings.c:84 +msgid "coating-type.high-gloss" +msgstr "" + +#. TRANSLATORS: Matte +#: locale/ipp-strings.c:86 +msgid "coating-type.matte" +msgstr "" + +#. TRANSLATORS: Semi-gloss +#: locale/ipp-strings.c:88 +msgid "coating-type.semi-gloss" +msgstr "" + +#. TRANSLATORS: Silicone +#: locale/ipp-strings.c:90 +msgid "coating-type.silicone" +msgstr "" + +#. TRANSLATORS: Translucent +#: locale/ipp-strings.c:92 +msgid "coating-type.translucent" +msgstr "" + +#: cups/notify.c:92 +msgid "completed" +msgstr "" + +#. TRANSLATORS: Print Confirmation Sheet +#: locale/ipp-strings.c:94 +msgid "confirmation-sheet-print" +msgstr "" + +#. TRANSLATORS: Copies +#: locale/ipp-strings.c:96 +msgid "copies" +msgstr "" + +#. TRANSLATORS: Back Cover +#: locale/ipp-strings.c:98 +msgid "cover-back" +msgstr "" + +#. TRANSLATORS: Front Cover +#: locale/ipp-strings.c:100 +msgid "cover-front" +msgstr "" + +#. TRANSLATORS: Cover Sheet Info +#: locale/ipp-strings.c:102 +msgid "cover-sheet-info" +msgstr "" + +#. TRANSLATORS: Date Time +#: locale/ipp-strings.c:104 +msgid "cover-sheet-info-supported.date-time" +msgstr "" + +#. TRANSLATORS: From Name +#: locale/ipp-strings.c:106 +msgid "cover-sheet-info-supported.from-name" +msgstr "" + +#. TRANSLATORS: Logo +#: locale/ipp-strings.c:108 +msgid "cover-sheet-info-supported.logo" +msgstr "" + +#. TRANSLATORS: Message +#: locale/ipp-strings.c:110 +msgid "cover-sheet-info-supported.message" +msgstr "" + +#. TRANSLATORS: Organization +#: locale/ipp-strings.c:112 +msgid "cover-sheet-info-supported.organization" +msgstr "" + +#. TRANSLATORS: Subject +#: locale/ipp-strings.c:114 +msgid "cover-sheet-info-supported.subject" +msgstr "" + +#. TRANSLATORS: To Name +#: locale/ipp-strings.c:116 +msgid "cover-sheet-info-supported.to-name" +msgstr "" + +#. TRANSLATORS: Printed Cover +#: locale/ipp-strings.c:118 +msgid "cover-type" +msgstr "" + +#. TRANSLATORS: No Cover +#: locale/ipp-strings.c:120 +msgid "cover-type.no-cover" +msgstr "" + +#. TRANSLATORS: Back Only +#: locale/ipp-strings.c:122 +msgid "cover-type.print-back" +msgstr "" + +#. TRANSLATORS: Front and Back +#: locale/ipp-strings.c:124 +msgid "cover-type.print-both" +msgstr "" + +#. TRANSLATORS: Front Only +#: locale/ipp-strings.c:126 +msgid "cover-type.print-front" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:128 +msgid "cover-type.print-none" +msgstr "" + +#. TRANSLATORS: Cover Output +#: locale/ipp-strings.c:130 +msgid "covering" +msgstr "" + +#. TRANSLATORS: Add Cover +#: locale/ipp-strings.c:132 +msgid "covering-name" +msgstr "" + +#. TRANSLATORS: Plain +#: locale/ipp-strings.c:134 +msgid "covering-name.plain" +msgstr "" + +#. TRANSLATORS: Pre-cut +#: locale/ipp-strings.c:136 +msgid "covering-name.pre-cut" +msgstr "" + +#. TRANSLATORS: Pre-printed +#: locale/ipp-strings.c:138 +msgid "covering-name.pre-printed" +msgstr "" + +#: scheduler/ipp.c:6187 +msgid "cups-deviced failed to execute." +msgstr "" + +#: scheduler/ipp.c:7073 scheduler/ipp.c:7312 +msgid "cups-driverd failed to execute." +msgstr "" + +#: systemv/cupsctl.c:170 +#, c-format +msgid "cupsctl: Cannot set %s directly." +msgstr "" + +#: systemv/cupsctl.c:183 +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#: systemv/cupsctl.c:226 +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#: systemv/cupsctl.c:228 +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +#: scheduler/main.c:174 +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +#: scheduler/main.c:270 +msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." +msgstr "" + +#: scheduler/main.c:244 +msgid "cupsd: On-demand support not compiled in, running in normal mode." +msgstr "" + +#: scheduler/main.c:281 +msgid "cupsd: Relative cups-files.conf filename not allowed." +msgstr "" + +#: scheduler/main.c:205 scheduler/main.c:212 +msgid "cupsd: Unable to get current directory." +msgstr "" + +#: scheduler/main.c:340 scheduler/main.c:350 +msgid "cupsd: Unable to get path to cups-files.conf file." +msgstr "" + +#: scheduler/main.c:321 +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#: scheduler/main.c:312 +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +#: scheduler/cupsfilter.c:1257 +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#: scheduler/cupsfilter.c:1251 +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +#: scheduler/cupsfilter.c:342 +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#: scheduler/cupsfilter.c:1299 +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +#: systemv/cupstestppd.c:238 +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +#: systemv/cupstestppd.c:254 +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#. TRANSLATORS: Detailed Status Message +#: locale/ipp-strings.c:140 +msgid "detailed-status-message" +msgstr "" + +#: systemv/lpstat.c:1253 systemv/lpstat.c:1256 systemv/lpstat.c:1259 +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#: systemv/lpstat.c:1239 systemv/lpstat.c:1242 systemv/lpstat.c:1245 +#, c-format +msgid "device for %s: %s" +msgstr "" + +#. TRANSLATORS: Copies +#: locale/ipp-strings.c:142 +msgid "document-copies" +msgstr "" + +#. TRANSLATORS: Document Privacy Attributes +#: locale/ipp-strings.c:144 +msgid "document-privacy-attributes" +msgstr "" + +#. TRANSLATORS: All +#: locale/ipp-strings.c:146 +msgid "document-privacy-attributes.all" +msgstr "" + +#. TRANSLATORS: Default +#: locale/ipp-strings.c:148 +msgid "document-privacy-attributes.default" +msgstr "" + +#. TRANSLATORS: Document Description +#: locale/ipp-strings.c:150 +msgid "document-privacy-attributes.document-description" +msgstr "" + +#. TRANSLATORS: Document Template +#: locale/ipp-strings.c:152 +msgid "document-privacy-attributes.document-template" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:154 +msgid "document-privacy-attributes.none" +msgstr "" + +#. TRANSLATORS: Document Privacy Scope +#: locale/ipp-strings.c:156 +msgid "document-privacy-scope" +msgstr "" + +#. TRANSLATORS: All +#: locale/ipp-strings.c:158 +msgid "document-privacy-scope.all" +msgstr "" + +#. TRANSLATORS: Default +#: locale/ipp-strings.c:160 +msgid "document-privacy-scope.default" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:162 +msgid "document-privacy-scope.none" +msgstr "" + +#. TRANSLATORS: Owner +#: locale/ipp-strings.c:164 +msgid "document-privacy-scope.owner" +msgstr "" + +#. TRANSLATORS: Document State +#: locale/ipp-strings.c:166 +msgid "document-state" +msgstr "" + +#. TRANSLATORS: Detailed Document State +#: locale/ipp-strings.c:168 +msgid "document-state-reasons" +msgstr "" + +#. TRANSLATORS: Aborted By System +#: locale/ipp-strings.c:170 +msgid "document-state-reasons.aborted-by-system" +msgstr "" + +#. TRANSLATORS: Canceled At Device +#: locale/ipp-strings.c:172 +msgid "document-state-reasons.canceled-at-device" +msgstr "" + +#. TRANSLATORS: Canceled By Operator +#: locale/ipp-strings.c:174 +msgid "document-state-reasons.canceled-by-operator" +msgstr "" + +#. TRANSLATORS: Canceled By User +#: locale/ipp-strings.c:176 +msgid "document-state-reasons.canceled-by-user" +msgstr "" + +#. TRANSLATORS: Completed Successfully +#: locale/ipp-strings.c:178 +msgid "document-state-reasons.completed-successfully" +msgstr "" + +#. TRANSLATORS: Completed With Errors +#: locale/ipp-strings.c:180 +msgid "document-state-reasons.completed-with-errors" +msgstr "" + +#. TRANSLATORS: Completed With Warnings +#: locale/ipp-strings.c:182 +msgid "document-state-reasons.completed-with-warnings" +msgstr "" + +#. TRANSLATORS: Compression Error +#: locale/ipp-strings.c:184 +msgid "document-state-reasons.compression-error" +msgstr "" + +#. TRANSLATORS: Data Insufficient +#: locale/ipp-strings.c:186 +msgid "document-state-reasons.data-insufficient" +msgstr "" + +#. TRANSLATORS: Digital Signature Did Not Verify +#: locale/ipp-strings.c:188 +msgid "document-state-reasons.digital-signature-did-not-verify" +msgstr "" + +#. TRANSLATORS: Digital Signature Type Not Supported +#: locale/ipp-strings.c:190 +msgid "document-state-reasons.digital-signature-type-not-supported" +msgstr "" + +#. TRANSLATORS: Digital Signature Wait +#: locale/ipp-strings.c:192 +msgid "document-state-reasons.digital-signature-wait" +msgstr "" + +#. TRANSLATORS: Document Access Error +#: locale/ipp-strings.c:194 +msgid "document-state-reasons.document-access-error" +msgstr "" + +#. TRANSLATORS: Document Fetchable +#: locale/ipp-strings.c:196 +msgid "document-state-reasons.document-fetchable" +msgstr "" + +#. TRANSLATORS: Document Format Error +#: locale/ipp-strings.c:198 +msgid "document-state-reasons.document-format-error" +msgstr "" + +#. TRANSLATORS: Document Password Error +#: locale/ipp-strings.c:200 +msgid "document-state-reasons.document-password-error" +msgstr "" + +#. TRANSLATORS: Document Permission Error +#: locale/ipp-strings.c:202 +msgid "document-state-reasons.document-permission-error" +msgstr "" + +#. TRANSLATORS: Document Security Error +#: locale/ipp-strings.c:204 +msgid "document-state-reasons.document-security-error" +msgstr "" + +#. TRANSLATORS: Document Unprintable Error +#: locale/ipp-strings.c:206 +msgid "document-state-reasons.document-unprintable-error" +msgstr "" + +#. TRANSLATORS: Errors Detected +#: locale/ipp-strings.c:208 +msgid "document-state-reasons.errors-detected" +msgstr "" + +#. TRANSLATORS: Incoming +#: locale/ipp-strings.c:210 +msgid "document-state-reasons.incoming" +msgstr "" + +#. TRANSLATORS: Interpreting +#: locale/ipp-strings.c:212 +msgid "document-state-reasons.interpreting" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:214 +msgid "document-state-reasons.none" +msgstr "" + +#. TRANSLATORS: Outgoing +#: locale/ipp-strings.c:216 +msgid "document-state-reasons.outgoing" +msgstr "" + +#. TRANSLATORS: Printing +#: locale/ipp-strings.c:218 +msgid "document-state-reasons.printing" +msgstr "" + +#. TRANSLATORS: Processing To Stop Point +#: locale/ipp-strings.c:220 +msgid "document-state-reasons.processing-to-stop-point" +msgstr "" + +#. TRANSLATORS: Queued +#: locale/ipp-strings.c:222 +msgid "document-state-reasons.queued" +msgstr "" + +#. TRANSLATORS: Queued For Marker +#: locale/ipp-strings.c:224 +msgid "document-state-reasons.queued-for-marker" +msgstr "" + +#. TRANSLATORS: Queued In Device +#: locale/ipp-strings.c:226 +msgid "document-state-reasons.queued-in-device" +msgstr "" + +#. TRANSLATORS: Resources Are Not Ready +#: locale/ipp-strings.c:228 +msgid "document-state-reasons.resources-are-not-ready" +msgstr "" + +#. TRANSLATORS: Resources Are Not Supported +#: locale/ipp-strings.c:230 +msgid "document-state-reasons.resources-are-not-supported" +msgstr "" + +#. TRANSLATORS: Submission Interrupted +#: locale/ipp-strings.c:232 +msgid "document-state-reasons.submission-interrupted" +msgstr "" + +#. TRANSLATORS: Transforming +#: locale/ipp-strings.c:234 +msgid "document-state-reasons.transforming" +msgstr "" + +#. TRANSLATORS: Unsupported Compression +#: locale/ipp-strings.c:236 +msgid "document-state-reasons.unsupported-compression" +msgstr "" + +#. TRANSLATORS: Unsupported Document Format +#: locale/ipp-strings.c:238 +msgid "document-state-reasons.unsupported-document-format" +msgstr "" + +#. TRANSLATORS: Warnings Detected +#: locale/ipp-strings.c:240 +msgid "document-state-reasons.warnings-detected" +msgstr "" + +#. TRANSLATORS: Pending +#: locale/ipp-strings.c:242 +msgid "document-state.3" +msgstr "" + +#. TRANSLATORS: Processing +#: locale/ipp-strings.c:244 +msgid "document-state.5" +msgstr "" + +#. TRANSLATORS: Stopped +#: locale/ipp-strings.c:246 +msgid "document-state.6" +msgstr "" + +#. TRANSLATORS: Canceled +#: locale/ipp-strings.c:248 +msgid "document-state.7" +msgstr "" + +#. TRANSLATORS: Aborted +#: locale/ipp-strings.c:250 +msgid "document-state.8" +msgstr "" + +#. TRANSLATORS: Completed +#: locale/ipp-strings.c:252 +msgid "document-state.9" +msgstr "" + +#: cups/snmp.c:990 +msgid "error-index uses indefinite length" +msgstr "" + +#: cups/snmp.c:982 +msgid "error-status uses indefinite length" +msgstr "" + +#: tools/ippfind.c:2808 +msgid "" +"expression --and expression\n" +" Logical AND" +msgstr "" + +#: tools/ippfind.c:2810 +msgid "" +"expression --or expression\n" +" Logical OR" +msgstr "" + +#: tools/ippfind.c:2807 +msgid "expression expression Logical AND" +msgstr "" + +#. TRANSLATORS: Feed Orientation +#: locale/ipp-strings.c:254 +msgid "feed-orientation" +msgstr "" + +#. TRANSLATORS: Long Edge First +#: locale/ipp-strings.c:256 +msgid "feed-orientation.long-edge-first" +msgstr "" + +#. TRANSLATORS: Short Edge First +#: locale/ipp-strings.c:258 +msgid "feed-orientation.short-edge-first" +msgstr "" + +#. TRANSLATORS: Fetch Status Code +#: locale/ipp-strings.c:260 +msgid "fetch-status-code" +msgstr "" + +#. TRANSLATORS: Finishing Template +#: locale/ipp-strings.c:262 +msgid "finishing-template" +msgstr "" + +#. TRANSLATORS: Bale +#: locale/ipp-strings.c:264 +msgid "finishing-template.bale" +msgstr "" + +#. TRANSLATORS: Bind +#: locale/ipp-strings.c:266 +msgid "finishing-template.bind" +msgstr "" + +#. TRANSLATORS: Bind Bottom +#: locale/ipp-strings.c:268 +msgid "finishing-template.bind-bottom" +msgstr "" + +#. TRANSLATORS: Bind Left +#: locale/ipp-strings.c:270 +msgid "finishing-template.bind-left" +msgstr "" + +#. TRANSLATORS: Bind Right +#: locale/ipp-strings.c:272 +msgid "finishing-template.bind-right" +msgstr "" + +#. TRANSLATORS: Bind Top +#: locale/ipp-strings.c:274 +msgid "finishing-template.bind-top" +msgstr "" + +#. TRANSLATORS: Booklet Maker +#: locale/ipp-strings.c:276 +msgid "finishing-template.booklet-maker" +msgstr "" + +#. TRANSLATORS: Coat +#: locale/ipp-strings.c:278 +msgid "finishing-template.coat" +msgstr "" + +#. TRANSLATORS: Cover +#: locale/ipp-strings.c:280 +msgid "finishing-template.cover" +msgstr "" + +#. TRANSLATORS: Edge Stitch +#: locale/ipp-strings.c:282 +msgid "finishing-template.edge-stitch" +msgstr "" + +#. TRANSLATORS: Edge Stitch Bottom +#: locale/ipp-strings.c:284 +msgid "finishing-template.edge-stitch-bottom" +msgstr "" + +#. TRANSLATORS: Edge Stitch Left +#: locale/ipp-strings.c:286 +msgid "finishing-template.edge-stitch-left" +msgstr "" + +#. TRANSLATORS: Edge Stitch Right +#: locale/ipp-strings.c:288 +msgid "finishing-template.edge-stitch-right" +msgstr "" + +#. TRANSLATORS: Edge Stitch Top +#: locale/ipp-strings.c:290 +msgid "finishing-template.edge-stitch-top" +msgstr "" + +#. TRANSLATORS: Fold +#: locale/ipp-strings.c:292 +msgid "finishing-template.fold" +msgstr "" + +#. TRANSLATORS: Accordion Fold +#: locale/ipp-strings.c:294 +msgid "finishing-template.fold-accordion" +msgstr "" + +#. TRANSLATORS: Double Gate Fold +#: locale/ipp-strings.c:296 +msgid "finishing-template.fold-double-gate" +msgstr "" + +#. TRANSLATORS: Engineering Z Fold +#: locale/ipp-strings.c:298 +msgid "finishing-template.fold-engineering-z" +msgstr "" + +#. TRANSLATORS: Gate Fold +#: locale/ipp-strings.c:300 +msgid "finishing-template.fold-gate" +msgstr "" + +#. TRANSLATORS: Half Fold +#: locale/ipp-strings.c:302 +msgid "finishing-template.fold-half" +msgstr "" + +#. TRANSLATORS: Half Z Fold +#: locale/ipp-strings.c:304 +msgid "finishing-template.fold-half-z" +msgstr "" + +#. TRANSLATORS: Left Gate Fold +#: locale/ipp-strings.c:306 +msgid "finishing-template.fold-left-gate" +msgstr "" + +#. TRANSLATORS: Letter Fold +#: locale/ipp-strings.c:308 +msgid "finishing-template.fold-letter" +msgstr "" + +#. TRANSLATORS: Parallel Fold +#: locale/ipp-strings.c:310 +msgid "finishing-template.fold-parallel" +msgstr "" + +#. TRANSLATORS: Poster Fold +#: locale/ipp-strings.c:312 +msgid "finishing-template.fold-poster" +msgstr "" + +#. TRANSLATORS: Right Gate Fold +#: locale/ipp-strings.c:314 +msgid "finishing-template.fold-right-gate" +msgstr "" + +#. TRANSLATORS: Z Fold +#: locale/ipp-strings.c:316 +msgid "finishing-template.fold-z" +msgstr "" + +#. TRANSLATORS: JDF F10-1 +#: locale/ipp-strings.c:318 +msgid "finishing-template.jdf-f10-1" +msgstr "" + +#. TRANSLATORS: JDF F10-2 +#: locale/ipp-strings.c:320 +msgid "finishing-template.jdf-f10-2" +msgstr "" + +#. TRANSLATORS: JDF F10-3 +#: locale/ipp-strings.c:322 +msgid "finishing-template.jdf-f10-3" +msgstr "" + +#. TRANSLATORS: JDF F12-1 +#: locale/ipp-strings.c:324 +msgid "finishing-template.jdf-f12-1" +msgstr "" + +#. TRANSLATORS: JDF F12-10 +#: locale/ipp-strings.c:326 +msgid "finishing-template.jdf-f12-10" +msgstr "" + +#. TRANSLATORS: JDF F12-11 +#: locale/ipp-strings.c:328 +msgid "finishing-template.jdf-f12-11" +msgstr "" + +#. TRANSLATORS: JDF F12-12 +#: locale/ipp-strings.c:330 +msgid "finishing-template.jdf-f12-12" +msgstr "" + +#. TRANSLATORS: JDF F12-13 +#: locale/ipp-strings.c:332 +msgid "finishing-template.jdf-f12-13" +msgstr "" + +#. TRANSLATORS: JDF F12-14 +#: locale/ipp-strings.c:334 +msgid "finishing-template.jdf-f12-14" +msgstr "" + +#. TRANSLATORS: JDF F12-2 +#: locale/ipp-strings.c:336 +msgid "finishing-template.jdf-f12-2" +msgstr "" + +#. TRANSLATORS: JDF F12-3 +#: locale/ipp-strings.c:338 +msgid "finishing-template.jdf-f12-3" +msgstr "" + +#. TRANSLATORS: JDF F12-4 +#: locale/ipp-strings.c:340 +msgid "finishing-template.jdf-f12-4" +msgstr "" + +#. TRANSLATORS: JDF F12-5 +#: locale/ipp-strings.c:342 +msgid "finishing-template.jdf-f12-5" +msgstr "" + +#. TRANSLATORS: JDF F12-6 +#: locale/ipp-strings.c:344 +msgid "finishing-template.jdf-f12-6" +msgstr "" + +#. TRANSLATORS: JDF F12-7 +#: locale/ipp-strings.c:346 +msgid "finishing-template.jdf-f12-7" +msgstr "" + +#. TRANSLATORS: JDF F12-8 +#: locale/ipp-strings.c:348 +msgid "finishing-template.jdf-f12-8" +msgstr "" + +#. TRANSLATORS: JDF F12-9 +#: locale/ipp-strings.c:350 +msgid "finishing-template.jdf-f12-9" +msgstr "" + +#. TRANSLATORS: JDF F14-1 +#: locale/ipp-strings.c:352 +msgid "finishing-template.jdf-f14-1" +msgstr "" + +#. TRANSLATORS: JDF F16-1 +#: locale/ipp-strings.c:354 +msgid "finishing-template.jdf-f16-1" +msgstr "" + +#. TRANSLATORS: JDF F16-10 +#: locale/ipp-strings.c:356 +msgid "finishing-template.jdf-f16-10" +msgstr "" + +#. TRANSLATORS: JDF F16-11 +#: locale/ipp-strings.c:358 +msgid "finishing-template.jdf-f16-11" +msgstr "" + +#. TRANSLATORS: JDF F16-12 +#: locale/ipp-strings.c:360 +msgid "finishing-template.jdf-f16-12" +msgstr "" + +#. TRANSLATORS: JDF F16-13 +#: locale/ipp-strings.c:362 +msgid "finishing-template.jdf-f16-13" +msgstr "" + +#. TRANSLATORS: JDF F16-14 +#: locale/ipp-strings.c:364 +msgid "finishing-template.jdf-f16-14" +msgstr "" + +#. TRANSLATORS: JDF F16-2 +#: locale/ipp-strings.c:366 +msgid "finishing-template.jdf-f16-2" +msgstr "" + +#. TRANSLATORS: JDF F16-3 +#: locale/ipp-strings.c:368 +msgid "finishing-template.jdf-f16-3" +msgstr "" + +#. TRANSLATORS: JDF F16-4 +#: locale/ipp-strings.c:370 +msgid "finishing-template.jdf-f16-4" +msgstr "" + +#. TRANSLATORS: JDF F16-5 +#: locale/ipp-strings.c:372 +msgid "finishing-template.jdf-f16-5" +msgstr "" + +#. TRANSLATORS: JDF F16-6 +#: locale/ipp-strings.c:374 +msgid "finishing-template.jdf-f16-6" +msgstr "" + +#. TRANSLATORS: JDF F16-7 +#: locale/ipp-strings.c:376 +msgid "finishing-template.jdf-f16-7" +msgstr "" + +#. TRANSLATORS: JDF F16-8 +#: locale/ipp-strings.c:378 +msgid "finishing-template.jdf-f16-8" +msgstr "" + +#. TRANSLATORS: JDF F16-9 +#: locale/ipp-strings.c:380 +msgid "finishing-template.jdf-f16-9" +msgstr "" + +#. TRANSLATORS: JDF F18-1 +#: locale/ipp-strings.c:382 +msgid "finishing-template.jdf-f18-1" +msgstr "" + +#. TRANSLATORS: JDF F18-2 +#: locale/ipp-strings.c:384 +msgid "finishing-template.jdf-f18-2" +msgstr "" + +#. TRANSLATORS: JDF F18-3 +#: locale/ipp-strings.c:386 +msgid "finishing-template.jdf-f18-3" +msgstr "" + +#. TRANSLATORS: JDF F18-4 +#: locale/ipp-strings.c:388 +msgid "finishing-template.jdf-f18-4" +msgstr "" + +#. TRANSLATORS: JDF F18-5 +#: locale/ipp-strings.c:390 +msgid "finishing-template.jdf-f18-5" +msgstr "" + +#. TRANSLATORS: JDF F18-6 +#: locale/ipp-strings.c:392 +msgid "finishing-template.jdf-f18-6" +msgstr "" + +#. TRANSLATORS: JDF F18-7 +#: locale/ipp-strings.c:394 +msgid "finishing-template.jdf-f18-7" +msgstr "" + +#. TRANSLATORS: JDF F18-8 +#: locale/ipp-strings.c:396 +msgid "finishing-template.jdf-f18-8" +msgstr "" + +#. TRANSLATORS: JDF F18-9 +#: locale/ipp-strings.c:398 +msgid "finishing-template.jdf-f18-9" +msgstr "" + +#. TRANSLATORS: JDF F2-1 +#: locale/ipp-strings.c:400 +msgid "finishing-template.jdf-f2-1" +msgstr "" + +#. TRANSLATORS: JDF F20-1 +#: locale/ipp-strings.c:402 +msgid "finishing-template.jdf-f20-1" +msgstr "" + +#. TRANSLATORS: JDF F20-2 +#: locale/ipp-strings.c:404 +msgid "finishing-template.jdf-f20-2" +msgstr "" + +#. TRANSLATORS: JDF F24-1 +#: locale/ipp-strings.c:406 +msgid "finishing-template.jdf-f24-1" +msgstr "" + +#. TRANSLATORS: JDF F24-10 +#: locale/ipp-strings.c:408 +msgid "finishing-template.jdf-f24-10" +msgstr "" + +#. TRANSLATORS: JDF F24-11 +#: locale/ipp-strings.c:410 +msgid "finishing-template.jdf-f24-11" +msgstr "" + +#. TRANSLATORS: JDF F24-2 +#: locale/ipp-strings.c:412 +msgid "finishing-template.jdf-f24-2" +msgstr "" + +#. TRANSLATORS: JDF F24-3 +#: locale/ipp-strings.c:414 +msgid "finishing-template.jdf-f24-3" +msgstr "" + +#. TRANSLATORS: JDF F24-4 +#: locale/ipp-strings.c:416 +msgid "finishing-template.jdf-f24-4" +msgstr "" + +#. TRANSLATORS: JDF F24-5 +#: locale/ipp-strings.c:418 +msgid "finishing-template.jdf-f24-5" +msgstr "" + +#. TRANSLATORS: JDF F24-6 +#: locale/ipp-strings.c:420 +msgid "finishing-template.jdf-f24-6" +msgstr "" + +#. TRANSLATORS: JDF F24-7 +#: locale/ipp-strings.c:422 +msgid "finishing-template.jdf-f24-7" +msgstr "" + +#. TRANSLATORS: JDF F24-8 +#: locale/ipp-strings.c:424 +msgid "finishing-template.jdf-f24-8" +msgstr "" + +#. TRANSLATORS: JDF F24-9 +#: locale/ipp-strings.c:426 +msgid "finishing-template.jdf-f24-9" +msgstr "" + +#. TRANSLATORS: JDF F28-1 +#: locale/ipp-strings.c:428 +msgid "finishing-template.jdf-f28-1" +msgstr "" + +#. TRANSLATORS: JDF F32-1 +#: locale/ipp-strings.c:430 +msgid "finishing-template.jdf-f32-1" +msgstr "" + +#. TRANSLATORS: JDF F32-2 +#: locale/ipp-strings.c:432 +msgid "finishing-template.jdf-f32-2" +msgstr "" + +#. TRANSLATORS: JDF F32-3 +#: locale/ipp-strings.c:434 +msgid "finishing-template.jdf-f32-3" +msgstr "" + +#. TRANSLATORS: JDF F32-4 +#: locale/ipp-strings.c:436 +msgid "finishing-template.jdf-f32-4" +msgstr "" + +#. TRANSLATORS: JDF F32-5 +#: locale/ipp-strings.c:438 +msgid "finishing-template.jdf-f32-5" +msgstr "" + +#. TRANSLATORS: JDF F32-6 +#: locale/ipp-strings.c:440 +msgid "finishing-template.jdf-f32-6" +msgstr "" + +#. TRANSLATORS: JDF F32-7 +#: locale/ipp-strings.c:442 +msgid "finishing-template.jdf-f32-7" +msgstr "" + +#. TRANSLATORS: JDF F32-8 +#: locale/ipp-strings.c:444 +msgid "finishing-template.jdf-f32-8" +msgstr "" + +#. TRANSLATORS: JDF F32-9 +#: locale/ipp-strings.c:446 +msgid "finishing-template.jdf-f32-9" +msgstr "" + +#. TRANSLATORS: JDF F36-1 +#: locale/ipp-strings.c:448 +msgid "finishing-template.jdf-f36-1" +msgstr "" + +#. TRANSLATORS: JDF F36-2 +#: locale/ipp-strings.c:450 +msgid "finishing-template.jdf-f36-2" +msgstr "" + +#. TRANSLATORS: JDF F4-1 +#: locale/ipp-strings.c:452 +msgid "finishing-template.jdf-f4-1" +msgstr "" + +#. TRANSLATORS: JDF F4-2 +#: locale/ipp-strings.c:454 +msgid "finishing-template.jdf-f4-2" +msgstr "" + +#. TRANSLATORS: JDF F40-1 +#: locale/ipp-strings.c:456 +msgid "finishing-template.jdf-f40-1" +msgstr "" + +#. TRANSLATORS: JDF F48-1 +#: locale/ipp-strings.c:458 +msgid "finishing-template.jdf-f48-1" +msgstr "" + +#. TRANSLATORS: JDF F48-2 +#: locale/ipp-strings.c:460 +msgid "finishing-template.jdf-f48-2" +msgstr "" + +#. TRANSLATORS: JDF F6-1 +#: locale/ipp-strings.c:462 +msgid "finishing-template.jdf-f6-1" +msgstr "" + +#. TRANSLATORS: JDF F6-2 +#: locale/ipp-strings.c:464 +msgid "finishing-template.jdf-f6-2" +msgstr "" + +#. TRANSLATORS: JDF F6-3 +#: locale/ipp-strings.c:466 +msgid "finishing-template.jdf-f6-3" +msgstr "" + +#. TRANSLATORS: JDF F6-4 +#: locale/ipp-strings.c:468 +msgid "finishing-template.jdf-f6-4" +msgstr "" + +#. TRANSLATORS: JDF F6-5 +#: locale/ipp-strings.c:470 +msgid "finishing-template.jdf-f6-5" +msgstr "" + +#. TRANSLATORS: JDF F6-6 +#: locale/ipp-strings.c:472 +msgid "finishing-template.jdf-f6-6" +msgstr "" + +#. TRANSLATORS: JDF F6-7 +#: locale/ipp-strings.c:474 +msgid "finishing-template.jdf-f6-7" +msgstr "" + +#. TRANSLATORS: JDF F6-8 +#: locale/ipp-strings.c:476 +msgid "finishing-template.jdf-f6-8" +msgstr "" + +#. TRANSLATORS: JDF F64-1 +#: locale/ipp-strings.c:478 +msgid "finishing-template.jdf-f64-1" +msgstr "" + +#. TRANSLATORS: JDF F64-2 +#: locale/ipp-strings.c:480 +msgid "finishing-template.jdf-f64-2" +msgstr "" + +#. TRANSLATORS: JDF F8-1 +#: locale/ipp-strings.c:482 +msgid "finishing-template.jdf-f8-1" +msgstr "" + +#. TRANSLATORS: JDF F8-2 +#: locale/ipp-strings.c:484 +msgid "finishing-template.jdf-f8-2" +msgstr "" + +#. TRANSLATORS: JDF F8-3 +#: locale/ipp-strings.c:486 +msgid "finishing-template.jdf-f8-3" +msgstr "" + +#. TRANSLATORS: JDF F8-4 +#: locale/ipp-strings.c:488 +msgid "finishing-template.jdf-f8-4" +msgstr "" + +#. TRANSLATORS: JDF F8-5 +#: locale/ipp-strings.c:490 +msgid "finishing-template.jdf-f8-5" +msgstr "" + +#. TRANSLATORS: JDF F8-6 +#: locale/ipp-strings.c:492 +msgid "finishing-template.jdf-f8-6" +msgstr "" + +#. TRANSLATORS: JDF F8-7 +#: locale/ipp-strings.c:494 +msgid "finishing-template.jdf-f8-7" +msgstr "" + +#. TRANSLATORS: Jog Offset +#: locale/ipp-strings.c:496 +msgid "finishing-template.jog-offset" +msgstr "" + +#. TRANSLATORS: Laminate +#: locale/ipp-strings.c:498 +msgid "finishing-template.laminate" +msgstr "" + +#. TRANSLATORS: Punch +#: locale/ipp-strings.c:500 +msgid "finishing-template.punch" +msgstr "" + +#. TRANSLATORS: Punch Bottom Left +#: locale/ipp-strings.c:502 +msgid "finishing-template.punch-bottom-left" +msgstr "" + +#. TRANSLATORS: Punch Bottom Right +#: locale/ipp-strings.c:504 +msgid "finishing-template.punch-bottom-right" +msgstr "" + +#. TRANSLATORS: 2-hole Punch Bottom +#: locale/ipp-strings.c:506 +msgid "finishing-template.punch-dual-bottom" +msgstr "" + +#. TRANSLATORS: 2-hole Punch Left +#: locale/ipp-strings.c:508 +msgid "finishing-template.punch-dual-left" +msgstr "" + +#. TRANSLATORS: 2-hole Punch Right +#: locale/ipp-strings.c:510 +msgid "finishing-template.punch-dual-right" +msgstr "" + +#. TRANSLATORS: 2-hole Punch Top +#: locale/ipp-strings.c:512 +msgid "finishing-template.punch-dual-top" +msgstr "" + +#. TRANSLATORS: Multi-hole Punch Bottom +#: locale/ipp-strings.c:514 +msgid "finishing-template.punch-multiple-bottom" +msgstr "" + +#. TRANSLATORS: Multi-hole Punch Left +#: locale/ipp-strings.c:516 +msgid "finishing-template.punch-multiple-left" +msgstr "" + +#. TRANSLATORS: Multi-hole Punch Right +#: locale/ipp-strings.c:518 +msgid "finishing-template.punch-multiple-right" +msgstr "" + +#. TRANSLATORS: Multi-hole Punch Top +#: locale/ipp-strings.c:520 +msgid "finishing-template.punch-multiple-top" +msgstr "" + +#. TRANSLATORS: 4-hole Punch Bottom +#: locale/ipp-strings.c:522 +msgid "finishing-template.punch-quad-bottom" +msgstr "" + +#. TRANSLATORS: 4-hole Punch Left +#: locale/ipp-strings.c:524 +msgid "finishing-template.punch-quad-left" +msgstr "" + +#. TRANSLATORS: 4-hole Punch Right +#: locale/ipp-strings.c:526 +msgid "finishing-template.punch-quad-right" +msgstr "" + +#. TRANSLATORS: 4-hole Punch Top +#: locale/ipp-strings.c:528 +msgid "finishing-template.punch-quad-top" +msgstr "" + +#. TRANSLATORS: Punch Top Left +#: locale/ipp-strings.c:530 +msgid "finishing-template.punch-top-left" +msgstr "" + +#. TRANSLATORS: Punch Top Right +#: locale/ipp-strings.c:532 +msgid "finishing-template.punch-top-right" +msgstr "" + +#. TRANSLATORS: 3-hole Punch Bottom +#: locale/ipp-strings.c:534 +msgid "finishing-template.punch-triple-bottom" +msgstr "" + +#. TRANSLATORS: 3-hole Punch Left +#: locale/ipp-strings.c:536 +msgid "finishing-template.punch-triple-left" +msgstr "" + +#. TRANSLATORS: 3-hole Punch Right +#: locale/ipp-strings.c:538 +msgid "finishing-template.punch-triple-right" +msgstr "" + +#. TRANSLATORS: 3-hole Punch Top +#: locale/ipp-strings.c:540 +msgid "finishing-template.punch-triple-top" +msgstr "" + +#. TRANSLATORS: Saddle Stitch +#: locale/ipp-strings.c:542 +msgid "finishing-template.saddle-stitch" +msgstr "" + +#. TRANSLATORS: Staple +#: locale/ipp-strings.c:544 +msgid "finishing-template.staple" +msgstr "" + +#. TRANSLATORS: Staple Bottom Left +#: locale/ipp-strings.c:546 +msgid "finishing-template.staple-bottom-left" +msgstr "" + +#. TRANSLATORS: Staple Bottom Right +#: locale/ipp-strings.c:548 +msgid "finishing-template.staple-bottom-right" +msgstr "" + +#. TRANSLATORS: 2 Staples on Bottom +#: locale/ipp-strings.c:550 +msgid "finishing-template.staple-dual-bottom" +msgstr "" + +#. TRANSLATORS: 2 Staples on Left +#: locale/ipp-strings.c:552 +msgid "finishing-template.staple-dual-left" +msgstr "" + +#. TRANSLATORS: 2 Staples on Right +#: locale/ipp-strings.c:554 +msgid "finishing-template.staple-dual-right" +msgstr "" + +#. TRANSLATORS: 2 Staples on Top +#: locale/ipp-strings.c:556 +msgid "finishing-template.staple-dual-top" +msgstr "" + +#. TRANSLATORS: Staple Top Left +#: locale/ipp-strings.c:558 +msgid "finishing-template.staple-top-left" +msgstr "" + +#. TRANSLATORS: Staple Top Right +#: locale/ipp-strings.c:560 +msgid "finishing-template.staple-top-right" +msgstr "" + +#. TRANSLATORS: 3 Staples on Bottom +#: locale/ipp-strings.c:562 +msgid "finishing-template.staple-triple-bottom" +msgstr "" + +#. TRANSLATORS: 3 Staples on Left +#: locale/ipp-strings.c:564 +msgid "finishing-template.staple-triple-left" +msgstr "" + +#. TRANSLATORS: 3 Staples on Right +#: locale/ipp-strings.c:566 +msgid "finishing-template.staple-triple-right" +msgstr "" + +#. TRANSLATORS: 3 Staples on Top +#: locale/ipp-strings.c:568 +msgid "finishing-template.staple-triple-top" +msgstr "" + +#. TRANSLATORS: Trim +#: locale/ipp-strings.c:570 +msgid "finishing-template.trim" +msgstr "" + +#. TRANSLATORS: Trim After Every Set +#: locale/ipp-strings.c:572 +msgid "finishing-template.trim-after-copies" +msgstr "" + +#. TRANSLATORS: Trim After Every Document +#: locale/ipp-strings.c:574 +msgid "finishing-template.trim-after-documents" +msgstr "" + +#. TRANSLATORS: Trim After Job +#: locale/ipp-strings.c:576 +msgid "finishing-template.trim-after-job" +msgstr "" + +#. TRANSLATORS: Trim After Every Page +#: locale/ipp-strings.c:578 +msgid "finishing-template.trim-after-pages" +msgstr "" + +#. TRANSLATORS: Finishings +#: locale/ipp-strings.c:580 +msgid "finishings" +msgstr "" + +#. TRANSLATORS: Finishings +#: locale/ipp-strings.c:582 +msgid "finishings-col" +msgstr "" + +#. TRANSLATORS: Fold +#: locale/ipp-strings.c:584 +msgid "finishings.10" +msgstr "" + +#. TRANSLATORS: Z Fold +#: locale/ipp-strings.c:586 +msgid "finishings.100" +msgstr "" + +#. TRANSLATORS: Engineering Z Fold +#: locale/ipp-strings.c:588 +msgid "finishings.101" +msgstr "" + +#. TRANSLATORS: Trim +#: locale/ipp-strings.c:590 +msgid "finishings.11" +msgstr "" + +#. TRANSLATORS: Bale +#: locale/ipp-strings.c:592 +msgid "finishings.12" +msgstr "" + +#. TRANSLATORS: Booklet Maker +#: locale/ipp-strings.c:594 +msgid "finishings.13" +msgstr "" + +#. TRANSLATORS: Jog Offset +#: locale/ipp-strings.c:596 +msgid "finishings.14" +msgstr "" + +#. TRANSLATORS: Coat +#: locale/ipp-strings.c:598 +msgid "finishings.15" +msgstr "" + +#. TRANSLATORS: Laminate +#: locale/ipp-strings.c:600 +msgid "finishings.16" +msgstr "" + +#. TRANSLATORS: Staple Top Left +#: locale/ipp-strings.c:602 +msgid "finishings.20" +msgstr "" + +#. TRANSLATORS: Staple Bottom Left +#: locale/ipp-strings.c:604 +msgid "finishings.21" +msgstr "" + +#. TRANSLATORS: Staple Top Right +#: locale/ipp-strings.c:606 +msgid "finishings.22" +msgstr "" + +#. TRANSLATORS: Staple Bottom Right +#: locale/ipp-strings.c:608 +msgid "finishings.23" +msgstr "" + +#. TRANSLATORS: Edge Stitch Left +#: locale/ipp-strings.c:610 +msgid "finishings.24" +msgstr "" + +#. TRANSLATORS: Edge Stitch Top +#: locale/ipp-strings.c:612 +msgid "finishings.25" +msgstr "" + +#. TRANSLATORS: Edge Stitch Right +#: locale/ipp-strings.c:614 +msgid "finishings.26" +msgstr "" + +#. TRANSLATORS: Edge Stitch Bottom +#: locale/ipp-strings.c:616 +msgid "finishings.27" +msgstr "" + +#. TRANSLATORS: 2 Staples on Left +#: locale/ipp-strings.c:618 +msgid "finishings.28" +msgstr "" + +#. TRANSLATORS: 2 Staples on Top +#: locale/ipp-strings.c:620 +msgid "finishings.29" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:622 +msgid "finishings.3" +msgstr "" + +#. TRANSLATORS: 2 Staples on Right +#: locale/ipp-strings.c:624 +msgid "finishings.30" +msgstr "" + +#. TRANSLATORS: 2 Staples on Bottom +#: locale/ipp-strings.c:626 +msgid "finishings.31" +msgstr "" + +#. TRANSLATORS: 3 Staples on Left +#: locale/ipp-strings.c:628 +msgid "finishings.32" +msgstr "" + +#. TRANSLATORS: 3 Staples on Top +#: locale/ipp-strings.c:630 +msgid "finishings.33" +msgstr "" + +#. TRANSLATORS: 3 Staples on Right +#: locale/ipp-strings.c:632 +msgid "finishings.34" +msgstr "" + +#. TRANSLATORS: 3 Staples on Bottom +#: locale/ipp-strings.c:634 +msgid "finishings.35" +msgstr "" + +#. TRANSLATORS: Staple +#: locale/ipp-strings.c:636 +msgid "finishings.4" +msgstr "" + +#. TRANSLATORS: Punch +#: locale/ipp-strings.c:638 +msgid "finishings.5" +msgstr "" + +#. TRANSLATORS: Bind Left +#: locale/ipp-strings.c:640 +msgid "finishings.50" +msgstr "" + +#. TRANSLATORS: Bind Top +#: locale/ipp-strings.c:642 +msgid "finishings.51" +msgstr "" + +#. TRANSLATORS: Bind Right +#: locale/ipp-strings.c:644 +msgid "finishings.52" +msgstr "" + +#. TRANSLATORS: Bind Bottom +#: locale/ipp-strings.c:646 +msgid "finishings.53" +msgstr "" + +#. TRANSLATORS: Cover +#: locale/ipp-strings.c:648 +msgid "finishings.6" +msgstr "" + +#. TRANSLATORS: Trim Pages +#: locale/ipp-strings.c:650 +msgid "finishings.60" +msgstr "" + +#. TRANSLATORS: Trim Documents +#: locale/ipp-strings.c:652 +msgid "finishings.61" +msgstr "" + +#. TRANSLATORS: Trim Copies +#: locale/ipp-strings.c:654 +msgid "finishings.62" +msgstr "" + +#. TRANSLATORS: Trim Job +#: locale/ipp-strings.c:656 +msgid "finishings.63" +msgstr "" + +#. TRANSLATORS: Bind +#: locale/ipp-strings.c:658 +msgid "finishings.7" +msgstr "" + +#. TRANSLATORS: Punch Top Left +#: locale/ipp-strings.c:660 +msgid "finishings.70" +msgstr "" + +#. TRANSLATORS: Punch Bottom Left +#: locale/ipp-strings.c:662 +msgid "finishings.71" +msgstr "" + +#. TRANSLATORS: Punch Top Right +#: locale/ipp-strings.c:664 +msgid "finishings.72" +msgstr "" + +#. TRANSLATORS: Punch Bottom Right +#: locale/ipp-strings.c:666 +msgid "finishings.73" +msgstr "" + +#. TRANSLATORS: 2-hole Punch Left +#: locale/ipp-strings.c:668 +msgid "finishings.74" +msgstr "" + +#. TRANSLATORS: 2-hole Punch Top +#: locale/ipp-strings.c:670 +msgid "finishings.75" +msgstr "" + +#. TRANSLATORS: 2-hole Punch Right +#: locale/ipp-strings.c:672 +msgid "finishings.76" +msgstr "" + +#. TRANSLATORS: 2-hole Punch Bottom +#: locale/ipp-strings.c:674 +msgid "finishings.77" +msgstr "" + +#. TRANSLATORS: 3-hole Punch Left +#: locale/ipp-strings.c:676 +msgid "finishings.78" +msgstr "" + +#. TRANSLATORS: 3-hole Punch Top +#: locale/ipp-strings.c:678 +msgid "finishings.79" +msgstr "" + +#. TRANSLATORS: Saddle Stitch +#: locale/ipp-strings.c:680 +msgid "finishings.8" +msgstr "" + +#. TRANSLATORS: 3-hole Punch Right +#: locale/ipp-strings.c:682 +msgid "finishings.80" +msgstr "" + +#. TRANSLATORS: 3-hole Punch Bottom +#: locale/ipp-strings.c:684 +msgid "finishings.81" +msgstr "" + +#. TRANSLATORS: 4-hole Punch Left +#: locale/ipp-strings.c:686 +msgid "finishings.82" +msgstr "" + +#. TRANSLATORS: 4-hole Punch Top +#: locale/ipp-strings.c:688 +msgid "finishings.83" +msgstr "" + +#. TRANSLATORS: 4-hole Punch Right +#: locale/ipp-strings.c:690 +msgid "finishings.84" +msgstr "" + +#. TRANSLATORS: 4-hole Punch Bottom +#: locale/ipp-strings.c:692 +msgid "finishings.85" +msgstr "" + +#. TRANSLATORS: Multi-hole Punch Left +#: locale/ipp-strings.c:694 +msgid "finishings.86" +msgstr "" + +#. TRANSLATORS: Multi-hole Punch Top +#: locale/ipp-strings.c:696 +msgid "finishings.87" +msgstr "" + +#. TRANSLATORS: Multi-hole Punch Right +#: locale/ipp-strings.c:698 +msgid "finishings.88" +msgstr "" + +#. TRANSLATORS: Multi-hole Punch Bottom +#: locale/ipp-strings.c:700 +msgid "finishings.89" +msgstr "" + +#. TRANSLATORS: Edge Stitch +#: locale/ipp-strings.c:702 +msgid "finishings.9" +msgstr "" + +#. TRANSLATORS: Accordion Fold +#: locale/ipp-strings.c:704 +msgid "finishings.90" +msgstr "" + +#. TRANSLATORS: Double Gate Fold +#: locale/ipp-strings.c:706 +msgid "finishings.91" +msgstr "" + +#. TRANSLATORS: Gate Fold +#: locale/ipp-strings.c:708 +msgid "finishings.92" +msgstr "" + +#. TRANSLATORS: Half Fold +#: locale/ipp-strings.c:710 +msgid "finishings.93" +msgstr "" + +#. TRANSLATORS: Half Z Fold +#: locale/ipp-strings.c:712 +msgid "finishings.94" +msgstr "" + +#. TRANSLATORS: Left Gate Fold +#: locale/ipp-strings.c:714 +msgid "finishings.95" +msgstr "" + +#. TRANSLATORS: Letter Fold +#: locale/ipp-strings.c:716 +msgid "finishings.96" +msgstr "" + +#. TRANSLATORS: Parallel Fold +#: locale/ipp-strings.c:718 +msgid "finishings.97" +msgstr "" + +#. TRANSLATORS: Poster Fold +#: locale/ipp-strings.c:720 +msgid "finishings.98" +msgstr "" + +#. TRANSLATORS: Right Gate Fold +#: locale/ipp-strings.c:722 +msgid "finishings.99" +msgstr "" + +#. TRANSLATORS: Fold +#: locale/ipp-strings.c:724 +msgid "folding" +msgstr "" + +#. TRANSLATORS: Fold Direction +#: locale/ipp-strings.c:726 +msgid "folding-direction" +msgstr "" + +#. TRANSLATORS: Inward +#: locale/ipp-strings.c:728 +msgid "folding-direction.inward" +msgstr "" + +#. TRANSLATORS: Outward +#: locale/ipp-strings.c:730 +msgid "folding-direction.outward" +msgstr "" + +#. TRANSLATORS: Fold Position +#: locale/ipp-strings.c:732 +msgid "folding-offset" +msgstr "" + +#. TRANSLATORS: Fold Edge +#: locale/ipp-strings.c:734 +msgid "folding-reference-edge" +msgstr "" + +#. TRANSLATORS: Bottom +#: locale/ipp-strings.c:736 +msgid "folding-reference-edge.bottom" +msgstr "" + +#. TRANSLATORS: Left +#: locale/ipp-strings.c:738 +msgid "folding-reference-edge.left" +msgstr "" + +#. TRANSLATORS: Right +#: locale/ipp-strings.c:740 +msgid "folding-reference-edge.right" +msgstr "" + +#. TRANSLATORS: Top +#: locale/ipp-strings.c:742 +msgid "folding-reference-edge.top" +msgstr "" + +#. TRANSLATORS: Font Name +#: locale/ipp-strings.c:744 +msgid "font-name-requested" +msgstr "" + +#. TRANSLATORS: Font Size +#: locale/ipp-strings.c:746 +msgid "font-size-requested" +msgstr "" + +#. TRANSLATORS: Force Front Side +#: locale/ipp-strings.c:748 +msgid "force-front-side" +msgstr "" + +#. TRANSLATORS: From Name +#: locale/ipp-strings.c:750 +msgid "from-name" +msgstr "" + +#: cups/notify.c:77 +msgid "held" +msgstr "" + +#: berkeley/lpc.c:195 +msgid "help\t\tGet help on commands." +msgstr "" + +#: cups/notify.c:118 +msgid "idle" +msgstr "" + +#. TRANSLATORS: Imposition Template +#: locale/ipp-strings.c:752 +msgid "imposition-template" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:754 +msgid "imposition-template.none" +msgstr "" + +#. TRANSLATORS: Signature +#: locale/ipp-strings.c:756 +msgid "imposition-template.signature" +msgstr "" + +#. TRANSLATORS: Insert Page Number +#: locale/ipp-strings.c:758 +msgid "insert-after-page-number" +msgstr "" + +#. TRANSLATORS: Insert Count +#: locale/ipp-strings.c:760 +msgid "insert-count" +msgstr "" + +#. TRANSLATORS: Insert Sheet +#: locale/ipp-strings.c:762 +msgid "insert-sheet" +msgstr "" + +#: tools/ippeveprinter.c:4702 +#, c-format +msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." +msgstr "" + +#: tools/ippfind.c:2478 +#, c-format +msgid "ippfind: Bad regular expression: %s" +msgstr "" + +#: tools/ippfind.c:295 +msgid "ippfind: Cannot use --and after --or." +msgstr "" + +#: tools/ippfind.c:580 +#, c-format +msgid "ippfind: Expected key name after %s." +msgstr "" + +#: tools/ippfind.c:530 tools/ippfind.c:725 +#, c-format +msgid "ippfind: Expected port range after %s." +msgstr "" + +#: tools/ippfind.c:328 +#, c-format +msgid "ippfind: Expected program after %s." +msgstr "" + +#: tools/ippfind.c:345 +#, c-format +msgid "ippfind: Expected semi-colon after %s." +msgstr "" + +#: tools/ippfind.c:1981 +msgid "ippfind: Missing close brace in substitution." +msgstr "" + +#: tools/ippfind.c:1044 +msgid "ippfind: Missing close parenthesis." +msgstr "" + +#: tools/ippfind.c:302 +msgid "ippfind: Missing expression before \"--and\"." +msgstr "" + +#: tools/ippfind.c:427 +msgid "ippfind: Missing expression before \"--or\"." +msgstr "" + +#: tools/ippfind.c:862 +#, c-format +msgid "ippfind: Missing key name after %s." +msgstr "" + +#: tools/ippfind.c:396 tools/ippfind.c:712 +#, c-format +msgid "ippfind: Missing name after %s." +msgstr "" + +#: tools/ippfind.c:1015 +msgid "ippfind: Missing open parenthesis." +msgstr "" + +#: tools/ippfind.c:892 +#, c-format +msgid "ippfind: Missing program after %s." +msgstr "" + +#: tools/ippfind.c:314 tools/ippfind.c:368 tools/ippfind.c:409 +#: tools/ippfind.c:515 tools/ippfind.c:597 tools/ippfind.c:612 +#: tools/ippfind.c:779 tools/ippfind.c:794 tools/ippfind.c:817 +#: tools/ippfind.c:877 +#, c-format +msgid "ippfind: Missing regular expression after %s." +msgstr "" + +#: tools/ippfind.c:910 +#, c-format +msgid "ippfind: Missing semi-colon after %s." +msgstr "" + +#: tools/ippfind.c:1928 tools/ippfind.c:1953 +msgid "ippfind: Out of memory." +msgstr "" + +#: tools/ippfind.c:988 +msgid "ippfind: Too many parenthesis." +msgstr "" + +#: tools/ippfind.c:1287 tools/ippfind.c:1415 tools/ippfind.c:2570 +#, c-format +msgid "ippfind: Unable to browse or resolve: %s" +msgstr "" + +#: tools/ippfind.c:2051 tools/ippfind.c:2078 +#, c-format +msgid "ippfind: Unable to execute \"%s\": %s" +msgstr "" + +#: tools/ippfind.c:1134 tools/ippfind.c:1142 tools/ippfind.c:1153 +#, c-format +msgid "ippfind: Unable to use Bonjour: %s" +msgstr "" + +#: tools/ippfind.c:2010 +#, c-format +msgid "ippfind: Unknown variable \"{%s}\"." +msgstr "" + +#: tools/ipptool.c:566 tools/ipptool.c:588 +msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\"." +msgstr "" + +#: tools/ipptool.c:351 tools/ipptool.c:422 +msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." +msgstr "" + +#: tools/ipptool.c:634 +#, c-format +msgid "ipptool: Bad URI \"%s\"." +msgstr "" + +#: tools/ipptool.c:559 +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +#: tools/ipptool.c:623 +msgid "ipptool: May only specify a single URI." +msgstr "" + +#: tools/ipptool.c:580 +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +#: tools/ipptool.c:268 +msgid "ipptool: Missing filename for \"--ippserver\"." +msgstr "" + +#: tools/ipptool.c:456 +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +#: tools/ipptool.c:437 +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +#: tools/ipptool.c:551 +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +#: tools/ipptool.c:649 +msgid "ipptool: URI required before test file." +msgstr "" + +#. TRANSLATORS: Job Account ID +#: locale/ipp-strings.c:764 +msgid "job-account-id" +msgstr "" + +#. TRANSLATORS: Job Account Type +#: locale/ipp-strings.c:766 +msgid "job-account-type" +msgstr "" + +#. TRANSLATORS: General +#: locale/ipp-strings.c:768 +msgid "job-account-type.general" +msgstr "" + +#. TRANSLATORS: Group +#: locale/ipp-strings.c:770 +msgid "job-account-type.group" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:772 +msgid "job-account-type.none" +msgstr "" + +#. TRANSLATORS: Job Accounting Output Bin +#: locale/ipp-strings.c:774 +msgid "job-accounting-output-bin" +msgstr "" + +#. TRANSLATORS: Job Accounting Sheets +#: locale/ipp-strings.c:776 +msgid "job-accounting-sheets" +msgstr "" + +#. TRANSLATORS: Type of Job Accounting Sheets +#: locale/ipp-strings.c:778 +msgid "job-accounting-sheets-type" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:780 +msgid "job-accounting-sheets-type.none" +msgstr "" + +#. TRANSLATORS: Standard +#: locale/ipp-strings.c:782 +msgid "job-accounting-sheets-type.standard" +msgstr "" + +#. TRANSLATORS: Job Accounting User ID +#: locale/ipp-strings.c:784 +msgid "job-accounting-user-id" +msgstr "" + +#. TRANSLATORS: Job Cancel After +#: locale/ipp-strings.c:786 +msgid "job-cancel-after" +msgstr "" + +#. TRANSLATORS: Copies +#: locale/ipp-strings.c:788 +msgid "job-copies" +msgstr "" + +#. TRANSLATORS: Back Cover +#: locale/ipp-strings.c:790 +msgid "job-cover-back" +msgstr "" + +#. TRANSLATORS: Front Cover +#: locale/ipp-strings.c:792 +msgid "job-cover-front" +msgstr "" + +#. TRANSLATORS: Delay Output Until +#: locale/ipp-strings.c:794 +msgid "job-delay-output-until" +msgstr "" + +#. TRANSLATORS: Delay Output Until +#: locale/ipp-strings.c:796 +msgid "job-delay-output-until-time" +msgstr "" + +#. TRANSLATORS: Daytime +#: locale/ipp-strings.c:798 +msgid "job-delay-output-until.day-time" +msgstr "" + +#. TRANSLATORS: Evening +#: locale/ipp-strings.c:800 +msgid "job-delay-output-until.evening" +msgstr "" + +#. TRANSLATORS: Released +#: locale/ipp-strings.c:802 +msgid "job-delay-output-until.indefinite" +msgstr "" + +#. TRANSLATORS: Night +#: locale/ipp-strings.c:804 +msgid "job-delay-output-until.night" +msgstr "" + +#. TRANSLATORS: No Delay +#: locale/ipp-strings.c:806 +msgid "job-delay-output-until.no-delay-output" +msgstr "" + +#. TRANSLATORS: Second Shift +#: locale/ipp-strings.c:808 +msgid "job-delay-output-until.second-shift" +msgstr "" + +#. TRANSLATORS: Third Shift +#: locale/ipp-strings.c:810 +msgid "job-delay-output-until.third-shift" +msgstr "" + +#. TRANSLATORS: Weekend +#: locale/ipp-strings.c:812 +msgid "job-delay-output-until.weekend" +msgstr "" + +#. TRANSLATORS: On Error +#: locale/ipp-strings.c:814 +msgid "job-error-action" +msgstr "" + +#. TRANSLATORS: Abort Job +#: locale/ipp-strings.c:816 +msgid "job-error-action.abort-job" +msgstr "" + +#. TRANSLATORS: Cancel Job +#: locale/ipp-strings.c:818 +msgid "job-error-action.cancel-job" +msgstr "" + +#. TRANSLATORS: Continue Job +#: locale/ipp-strings.c:820 +msgid "job-error-action.continue-job" +msgstr "" + +#. TRANSLATORS: Suspend Job +#: locale/ipp-strings.c:822 +msgid "job-error-action.suspend-job" +msgstr "" + +#. TRANSLATORS: Print Error Sheet +#: locale/ipp-strings.c:824 +msgid "job-error-sheet" +msgstr "" + +#. TRANSLATORS: Type of Error Sheet +#: locale/ipp-strings.c:826 +msgid "job-error-sheet-type" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:828 +msgid "job-error-sheet-type.none" +msgstr "" + +#. TRANSLATORS: Standard +#: locale/ipp-strings.c:830 +msgid "job-error-sheet-type.standard" +msgstr "" + +#. TRANSLATORS: Print Error Sheet +#: locale/ipp-strings.c:832 +msgid "job-error-sheet-when" +msgstr "" + +#. TRANSLATORS: Always +#: locale/ipp-strings.c:834 +msgid "job-error-sheet-when.always" +msgstr "" + +#. TRANSLATORS: On Error +#: locale/ipp-strings.c:836 +msgid "job-error-sheet-when.on-error" +msgstr "" + +#. TRANSLATORS: Job Finishings +#: locale/ipp-strings.c:838 +msgid "job-finishings" +msgstr "" + +#. TRANSLATORS: Hold Until +#: locale/ipp-strings.c:840 +msgid "job-hold-until" +msgstr "" + +#. TRANSLATORS: Hold Until +#: locale/ipp-strings.c:842 +msgid "job-hold-until-time" +msgstr "" + +#. TRANSLATORS: Daytime +#: locale/ipp-strings.c:844 +msgid "job-hold-until.day-time" +msgstr "" + +#. TRANSLATORS: Evening +#: locale/ipp-strings.c:846 +msgid "job-hold-until.evening" +msgstr "" + +#. TRANSLATORS: Released +#: locale/ipp-strings.c:848 +msgid "job-hold-until.indefinite" +msgstr "" + +#. TRANSLATORS: Night +#: locale/ipp-strings.c:850 +msgid "job-hold-until.night" +msgstr "" + +#. TRANSLATORS: No Hold +#: locale/ipp-strings.c:852 +msgid "job-hold-until.no-hold" +msgstr "" + +#. TRANSLATORS: Second Shift +#: locale/ipp-strings.c:854 +msgid "job-hold-until.second-shift" +msgstr "" + +#. TRANSLATORS: Third Shift +#: locale/ipp-strings.c:856 +msgid "job-hold-until.third-shift" +msgstr "" + +#. TRANSLATORS: Weekend +#: locale/ipp-strings.c:858 +msgid "job-hold-until.weekend" +msgstr "" + +#. TRANSLATORS: Job Mandatory Attributes +#: locale/ipp-strings.c:860 +msgid "job-mandatory-attributes" +msgstr "" + +#. TRANSLATORS: Title +#: locale/ipp-strings.c:862 +msgid "job-name" +msgstr "" + +#. TRANSLATORS: Job Pages +#: locale/ipp-strings.c:864 +msgid "job-pages" +msgstr "" + +#. TRANSLATORS: Job Pages +#: locale/ipp-strings.c:866 +msgid "job-pages-col" +msgstr "" + +#. TRANSLATORS: Job Phone Number +#: locale/ipp-strings.c:868 +msgid "job-phone-number" +msgstr "" + +#: scheduler/ipp.c:8095 +msgid "job-printer-uri attribute missing." +msgstr "" + +#. TRANSLATORS: Job Priority +#: locale/ipp-strings.c:870 +msgid "job-priority" +msgstr "" + +#. TRANSLATORS: Job Privacy Attributes +#: locale/ipp-strings.c:872 +msgid "job-privacy-attributes" +msgstr "" + +#. TRANSLATORS: All +#: locale/ipp-strings.c:874 +msgid "job-privacy-attributes.all" +msgstr "" + +#. TRANSLATORS: Default +#: locale/ipp-strings.c:876 +msgid "job-privacy-attributes.default" +msgstr "" + +#. TRANSLATORS: Job Description +#: locale/ipp-strings.c:878 +msgid "job-privacy-attributes.job-description" +msgstr "" + +#. TRANSLATORS: Job Template +#: locale/ipp-strings.c:880 +msgid "job-privacy-attributes.job-template" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:882 +msgid "job-privacy-attributes.none" +msgstr "" + +#. TRANSLATORS: Job Privacy Scope +#: locale/ipp-strings.c:884 +msgid "job-privacy-scope" +msgstr "" + +#. TRANSLATORS: All +#: locale/ipp-strings.c:886 +msgid "job-privacy-scope.all" +msgstr "" + +#. TRANSLATORS: Default +#: locale/ipp-strings.c:888 +msgid "job-privacy-scope.default" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:890 +msgid "job-privacy-scope.none" +msgstr "" + +#. TRANSLATORS: Owner +#: locale/ipp-strings.c:892 +msgid "job-privacy-scope.owner" +msgstr "" + +#. TRANSLATORS: Job Recipient Name +#: locale/ipp-strings.c:894 +msgid "job-recipient-name" +msgstr "" + +#. TRANSLATORS: Job Retain Until +#: locale/ipp-strings.c:896 +msgid "job-retain-until" +msgstr "" + +#. TRANSLATORS: Job Retain Until Interval +#: locale/ipp-strings.c:898 +msgid "job-retain-until-interval" +msgstr "" + +#. TRANSLATORS: Job Retain Until Time +#: locale/ipp-strings.c:900 +msgid "job-retain-until-time" +msgstr "" + +#. TRANSLATORS: End Of Day +#: locale/ipp-strings.c:902 +msgid "job-retain-until.end-of-day" +msgstr "" + +#. TRANSLATORS: End Of Month +#: locale/ipp-strings.c:904 +msgid "job-retain-until.end-of-month" +msgstr "" + +#. TRANSLATORS: End Of Week +#: locale/ipp-strings.c:906 +msgid "job-retain-until.end-of-week" +msgstr "" + +#. TRANSLATORS: Indefinite +#: locale/ipp-strings.c:908 +msgid "job-retain-until.indefinite" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:910 +msgid "job-retain-until.none" +msgstr "" + +#. TRANSLATORS: Job Save Disposition +#: locale/ipp-strings.c:912 +msgid "job-save-disposition" +msgstr "" + +#. TRANSLATORS: Job Sheet Message +#: locale/ipp-strings.c:914 +msgid "job-sheet-message" +msgstr "" + +#. TRANSLATORS: Banner Page +#: locale/ipp-strings.c:916 +msgid "job-sheets" +msgstr "" + +#. TRANSLATORS: Banner Page +#: locale/ipp-strings.c:918 +msgid "job-sheets-col" +msgstr "" + +#. TRANSLATORS: First Page in Document +#: locale/ipp-strings.c:920 +msgid "job-sheets.first-print-stream-page" +msgstr "" + +#. TRANSLATORS: Start and End Sheets +#: locale/ipp-strings.c:922 +msgid "job-sheets.job-both-sheet" +msgstr "" + +#. TRANSLATORS: End Sheet +#: locale/ipp-strings.c:924 +msgid "job-sheets.job-end-sheet" +msgstr "" + +#. TRANSLATORS: Start Sheet +#: locale/ipp-strings.c:926 +msgid "job-sheets.job-start-sheet" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:928 +msgid "job-sheets.none" +msgstr "" + +#. TRANSLATORS: Standard +#: locale/ipp-strings.c:930 +msgid "job-sheets.standard" +msgstr "" + +#. TRANSLATORS: Job State +#: locale/ipp-strings.c:932 +msgid "job-state" +msgstr "" + +#. TRANSLATORS: Job State Message +#: locale/ipp-strings.c:934 +msgid "job-state-message" +msgstr "" + +#. TRANSLATORS: Detailed Job State +#: locale/ipp-strings.c:936 +msgid "job-state-reasons" +msgstr "" + +#. TRANSLATORS: Stopping +#: locale/ipp-strings.c:938 +msgid "job-state-reasons.aborted-by-system" +msgstr "" + +#. TRANSLATORS: Account Authorization Failed +#: locale/ipp-strings.c:940 +msgid "job-state-reasons.account-authorization-failed" +msgstr "" + +#. TRANSLATORS: Account Closed +#: locale/ipp-strings.c:942 +msgid "job-state-reasons.account-closed" +msgstr "" + +#. TRANSLATORS: Account Info Needed +#: locale/ipp-strings.c:944 +msgid "job-state-reasons.account-info-needed" +msgstr "" + +#. TRANSLATORS: Account Limit Reached +#: locale/ipp-strings.c:946 +msgid "job-state-reasons.account-limit-reached" +msgstr "" + +#. TRANSLATORS: Decompression error +#: locale/ipp-strings.c:948 +msgid "job-state-reasons.compression-error" +msgstr "" + +#. TRANSLATORS: Conflicting Attributes +#: locale/ipp-strings.c:950 +msgid "job-state-reasons.conflicting-attributes" +msgstr "" + +#. TRANSLATORS: Connected To Destination +#: locale/ipp-strings.c:952 +msgid "job-state-reasons.connected-to-destination" +msgstr "" + +#. TRANSLATORS: Connecting To Destination +#: locale/ipp-strings.c:954 +msgid "job-state-reasons.connecting-to-destination" +msgstr "" + +#. TRANSLATORS: Destination Uri Failed +#: locale/ipp-strings.c:956 +msgid "job-state-reasons.destination-uri-failed" +msgstr "" + +#. TRANSLATORS: Digital Signature Did Not Verify +#: locale/ipp-strings.c:958 +msgid "job-state-reasons.digital-signature-did-not-verify" +msgstr "" + +#. TRANSLATORS: Digital Signature Type Not Supported +#: locale/ipp-strings.c:960 +msgid "job-state-reasons.digital-signature-type-not-supported" +msgstr "" + +#. TRANSLATORS: Document Access Error +#: locale/ipp-strings.c:962 +msgid "job-state-reasons.document-access-error" +msgstr "" + +#. TRANSLATORS: Document Format Error +#: locale/ipp-strings.c:964 +msgid "job-state-reasons.document-format-error" +msgstr "" + +#. TRANSLATORS: Document Password Error +#: locale/ipp-strings.c:966 +msgid "job-state-reasons.document-password-error" +msgstr "" + +#. TRANSLATORS: Document Permission Error +#: locale/ipp-strings.c:968 +msgid "job-state-reasons.document-permission-error" +msgstr "" + +#. TRANSLATORS: Document Security Error +#: locale/ipp-strings.c:970 +msgid "job-state-reasons.document-security-error" +msgstr "" + +#. TRANSLATORS: Document Unprintable Error +#: locale/ipp-strings.c:972 +msgid "job-state-reasons.document-unprintable-error" +msgstr "" + +#. TRANSLATORS: Errors Detected +#: locale/ipp-strings.c:974 +msgid "job-state-reasons.errors-detected" +msgstr "" + +#. TRANSLATORS: Canceled at printer +#: locale/ipp-strings.c:976 +msgid "job-state-reasons.job-canceled-at-device" +msgstr "" + +#. TRANSLATORS: Canceled by operator +#: locale/ipp-strings.c:978 +msgid "job-state-reasons.job-canceled-by-operator" +msgstr "" + +#. TRANSLATORS: Canceled by user +#: locale/ipp-strings.c:980 +msgid "job-state-reasons.job-canceled-by-user" +msgstr "" + +#. TRANSLATORS: +#: locale/ipp-strings.c:982 +msgid "job-state-reasons.job-completed-successfully" +msgstr "" + +#. TRANSLATORS: Completed with errors +#: locale/ipp-strings.c:984 +msgid "job-state-reasons.job-completed-with-errors" +msgstr "" + +#. TRANSLATORS: Completed with warnings +#: locale/ipp-strings.c:986 +msgid "job-state-reasons.job-completed-with-warnings" +msgstr "" + +#. TRANSLATORS: Insufficient data +#: locale/ipp-strings.c:988 +msgid "job-state-reasons.job-data-insufficient" +msgstr "" + +#. TRANSLATORS: Job Delay Output Until Specified +#: locale/ipp-strings.c:990 +msgid "job-state-reasons.job-delay-output-until-specified" +msgstr "" + +#. TRANSLATORS: Job Digital Signature Wait +#: locale/ipp-strings.c:992 +msgid "job-state-reasons.job-digital-signature-wait" +msgstr "" + +#. TRANSLATORS: Job Fetchable +#: locale/ipp-strings.c:994 +msgid "job-state-reasons.job-fetchable" +msgstr "" + +#. TRANSLATORS: Job Held For Review +#: locale/ipp-strings.c:996 +msgid "job-state-reasons.job-held-for-review" +msgstr "" + +#. TRANSLATORS: Job held +#: locale/ipp-strings.c:998 +msgid "job-state-reasons.job-hold-until-specified" +msgstr "" + +#. TRANSLATORS: Incoming +#: locale/ipp-strings.c:1000 +msgid "job-state-reasons.job-incoming" +msgstr "" + +#. TRANSLATORS: Interpreting +#: locale/ipp-strings.c:1002 +msgid "job-state-reasons.job-interpreting" +msgstr "" + +#. TRANSLATORS: Outgoing +#: locale/ipp-strings.c:1004 +msgid "job-state-reasons.job-outgoing" +msgstr "" + +#. TRANSLATORS: Job Password Wait +#: locale/ipp-strings.c:1006 +msgid "job-state-reasons.job-password-wait" +msgstr "" + +#. TRANSLATORS: Job Printed Successfully +#: locale/ipp-strings.c:1008 +msgid "job-state-reasons.job-printed-successfully" +msgstr "" + +#. TRANSLATORS: Job Printed With Errors +#: locale/ipp-strings.c:1010 +msgid "job-state-reasons.job-printed-with-errors" +msgstr "" + +#. TRANSLATORS: Job Printed With Warnings +#: locale/ipp-strings.c:1012 +msgid "job-state-reasons.job-printed-with-warnings" +msgstr "" + +#. TRANSLATORS: Printing +#: locale/ipp-strings.c:1014 +msgid "job-state-reasons.job-printing" +msgstr "" + +#. TRANSLATORS: Preparing to print +#: locale/ipp-strings.c:1016 +msgid "job-state-reasons.job-queued" +msgstr "" + +#. TRANSLATORS: Processing document +#: locale/ipp-strings.c:1018 +msgid "job-state-reasons.job-queued-for-marker" +msgstr "" + +#. TRANSLATORS: Job Release Wait +#: locale/ipp-strings.c:1020 +msgid "job-state-reasons.job-release-wait" +msgstr "" + +#. TRANSLATORS: Restartable +#: locale/ipp-strings.c:1022 +msgid "job-state-reasons.job-restartable" +msgstr "" + +#. TRANSLATORS: Job Resuming +#: locale/ipp-strings.c:1024 +msgid "job-state-reasons.job-resuming" +msgstr "" + +#. TRANSLATORS: Job Saved Successfully +#: locale/ipp-strings.c:1026 +msgid "job-state-reasons.job-saved-successfully" +msgstr "" + +#. TRANSLATORS: Job Saved With Errors +#: locale/ipp-strings.c:1028 +msgid "job-state-reasons.job-saved-with-errors" +msgstr "" + +#. TRANSLATORS: Job Saved With Warnings +#: locale/ipp-strings.c:1030 +msgid "job-state-reasons.job-saved-with-warnings" +msgstr "" + +#. TRANSLATORS: Job Saving +#: locale/ipp-strings.c:1032 +msgid "job-state-reasons.job-saving" +msgstr "" + +#. TRANSLATORS: Job Spooling +#: locale/ipp-strings.c:1034 +msgid "job-state-reasons.job-spooling" +msgstr "" + +#. TRANSLATORS: Job Streaming +#: locale/ipp-strings.c:1036 +msgid "job-state-reasons.job-streaming" +msgstr "" + +#. TRANSLATORS: Suspended +#: locale/ipp-strings.c:1038 +msgid "job-state-reasons.job-suspended" +msgstr "" + +#. TRANSLATORS: Job Suspended By Operator +#: locale/ipp-strings.c:1040 +msgid "job-state-reasons.job-suspended-by-operator" +msgstr "" + +#. TRANSLATORS: Job Suspended By System +#: locale/ipp-strings.c:1042 +msgid "job-state-reasons.job-suspended-by-system" +msgstr "" + +#. TRANSLATORS: Job Suspended By User +#: locale/ipp-strings.c:1044 +msgid "job-state-reasons.job-suspended-by-user" +msgstr "" + +#. TRANSLATORS: Job Suspending +#: locale/ipp-strings.c:1046 +msgid "job-state-reasons.job-suspending" +msgstr "" + +#. TRANSLATORS: Job Transferring +#: locale/ipp-strings.c:1048 +msgid "job-state-reasons.job-transferring" +msgstr "" + +#. TRANSLATORS: Transforming +#: locale/ipp-strings.c:1050 +msgid "job-state-reasons.job-transforming" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:1052 +msgid "job-state-reasons.none" +msgstr "" + +#. TRANSLATORS: Printer offline +#: locale/ipp-strings.c:1054 +msgid "job-state-reasons.printer-stopped" +msgstr "" + +#. TRANSLATORS: Printer partially stopped +#: locale/ipp-strings.c:1056 +msgid "job-state-reasons.printer-stopped-partly" +msgstr "" + +#. TRANSLATORS: Stopping +#: locale/ipp-strings.c:1058 +msgid "job-state-reasons.processing-to-stop-point" +msgstr "" + +#. TRANSLATORS: Ready +#: locale/ipp-strings.c:1060 +msgid "job-state-reasons.queued-in-device" +msgstr "" + +#. TRANSLATORS: Resources Are Not Ready +#: locale/ipp-strings.c:1062 +msgid "job-state-reasons.resources-are-not-ready" +msgstr "" + +#. TRANSLATORS: Resources Are Not Supported +#: locale/ipp-strings.c:1064 +msgid "job-state-reasons.resources-are-not-supported" +msgstr "" + +#. TRANSLATORS: Service offline +#: locale/ipp-strings.c:1066 +msgid "job-state-reasons.service-off-line" +msgstr "" + +#. TRANSLATORS: Submission Interrupted +#: locale/ipp-strings.c:1068 +msgid "job-state-reasons.submission-interrupted" +msgstr "" + +#. TRANSLATORS: Unsupported Attributes Or Values +#: locale/ipp-strings.c:1070 +msgid "job-state-reasons.unsupported-attributes-or-values" +msgstr "" + +#. TRANSLATORS: Unsupported Compression +#: locale/ipp-strings.c:1072 +msgid "job-state-reasons.unsupported-compression" +msgstr "" + +#. TRANSLATORS: Unsupported Document Format +#: locale/ipp-strings.c:1074 +msgid "job-state-reasons.unsupported-document-format" +msgstr "" + +#. TRANSLATORS: Waiting For User Action +#: locale/ipp-strings.c:1076 +msgid "job-state-reasons.waiting-for-user-action" +msgstr "" + +#. TRANSLATORS: Warnings Detected +#: locale/ipp-strings.c:1078 +msgid "job-state-reasons.warnings-detected" +msgstr "" + +#. TRANSLATORS: Pending +#: locale/ipp-strings.c:1080 +msgid "job-state.3" +msgstr "" + +#. TRANSLATORS: Held +#: locale/ipp-strings.c:1082 +msgid "job-state.4" +msgstr "" + +#. TRANSLATORS: Processing +#: locale/ipp-strings.c:1084 +msgid "job-state.5" +msgstr "" + +#. TRANSLATORS: Stopped +#: locale/ipp-strings.c:1086 +msgid "job-state.6" +msgstr "" + +#. TRANSLATORS: Canceled +#: locale/ipp-strings.c:1088 +msgid "job-state.7" +msgstr "" + +#. TRANSLATORS: Aborted +#: locale/ipp-strings.c:1090 +msgid "job-state.8" +msgstr "" + +#. TRANSLATORS: Completed +#: locale/ipp-strings.c:1092 +msgid "job-state.9" +msgstr "" + +#. TRANSLATORS: Laminate Pages +#: locale/ipp-strings.c:1094 +msgid "laminating" +msgstr "" + +#. TRANSLATORS: Laminate +#: locale/ipp-strings.c:1096 +msgid "laminating-sides" +msgstr "" + +#. TRANSLATORS: Back Only +#: locale/ipp-strings.c:1098 +msgid "laminating-sides.back" +msgstr "" + +#. TRANSLATORS: Front and Back +#: locale/ipp-strings.c:1100 +msgid "laminating-sides.both" +msgstr "" + +#. TRANSLATORS: Front Only +#: locale/ipp-strings.c:1102 +msgid "laminating-sides.front" +msgstr "" + +#. TRANSLATORS: Type of Lamination +#: locale/ipp-strings.c:1104 +msgid "laminating-type" +msgstr "" + +#. TRANSLATORS: Archival +#: locale/ipp-strings.c:1106 +msgid "laminating-type.archival" +msgstr "" + +#. TRANSLATORS: Glossy +#: locale/ipp-strings.c:1108 +msgid "laminating-type.glossy" +msgstr "" + +#. TRANSLATORS: High Gloss +#: locale/ipp-strings.c:1110 +msgid "laminating-type.high-gloss" +msgstr "" + +#. TRANSLATORS: Matte +#: locale/ipp-strings.c:1112 +msgid "laminating-type.matte" +msgstr "" + +#. TRANSLATORS: Semi-gloss +#: locale/ipp-strings.c:1114 +msgid "laminating-type.semi-gloss" +msgstr "" + +#. TRANSLATORS: Translucent +#: locale/ipp-strings.c:1116 +msgid "laminating-type.translucent" +msgstr "" + +#. TRANSLATORS: Logo +#: locale/ipp-strings.c:1118 +msgid "logo" +msgstr "" + +#: systemv/lpadmin.c:123 systemv/lpadmin.c:378 +msgid "lpadmin: Class name can only contain printable characters." +msgstr "lpadmin: Klassenavn må kun indeholde tegn som kan vises." + +#: systemv/lpadmin.c:213 +#, c-format +msgid "lpadmin: Expected PPD after \"-%c\" option." +msgstr "lpadmin: Ventede PPD efter \"-%c\"-tilvalg." + +#: systemv/lpadmin.c:459 +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "lpadmin: Ventede \"allow/deny:brugerliste\" efter \"-u\"-tilvalg." + +#: systemv/lpadmin.c:369 +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "lpadmin: Ventede klasse efter \"-r\"-tilvag." + +#: systemv/lpadmin.c:113 +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "lpadmin: Ventede klassenavn efter \"-c\"-tilvalg." + +#: systemv/lpadmin.c:553 +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "lpadmin: Ventede beskrivelse efter \"-D\"-tilvalg." + +#: systemv/lpadmin.c:489 +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "lpadmin: Ventede enheds-URI efter \"-v\"-tilvalg." + +#: systemv/lpadmin.c:566 +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "lpadmin: Ventede filtype(r) efter \"-I\"-tilvalg." + +#: systemv/lpadmin.c:192 +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "lpadmin: Ventede værtsnavn efter \"-h\"-tilvalg." + +#: systemv/lpadmin.c:585 +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "lpadmin: Ventede placering efter \"-L\"-tilvalg." + +#: systemv/lpadmin.c:282 +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "lpadmin: Ventede model efter \"-m\"-tilvalg." + +#: systemv/lpadmin.c:417 +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "lpadmin: Ventede navn efter \"-R\"-tilvalg." + +#: systemv/lpadmin.c:302 +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "lpadmin: Ventede navn=værdi efter \"-o\"-tilvalg." + +#: systemv/lpadmin.c:322 +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "lpadmin: Ventede printer efter \"-p\"-tilvalg." + +#: systemv/lpadmin.c:155 +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "lpadmin: Ventede printernavn efter \"-d\"-tilvalg." + +#: systemv/lpadmin.c:522 +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "lpadmin: Ventede printer eller klasse efter \"-x\"-tilvalg." + +#: systemv/lpadmin.c:958 +msgid "lpadmin: No member names were seen." +msgstr "lpadmin: Så ingen medlemsnavne." + +#: systemv/lpadmin.c:752 +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "lpadmin: Printeren %s er allerede et medlem af klassen %s." + +#: systemv/lpadmin.c:972 +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "lpadmin: Printeren %s er ikke et medlem af klassen %s." + +#: systemv/lpadmin.c:637 +msgid "lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS." +msgstr "" +"lpadmin: Printerdrivere er udgåede og stopper med at virke i en fremtidig " +"version af CUPS." + +#: systemv/lpadmin.c:164 systemv/lpadmin.c:331 systemv/lpadmin.c:531 +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "lpadmin: Printernavn må kun indeholde tegn som kan vises." + +#: systemv/lpadmin.c:618 +msgid "lpadmin: Raw queues are deprecated and will stop working in a future version of CUPS." +msgstr "" +"lpadmin: Rå køer er udgåede og stopper med at virke i en fremtidig version " +"af CUPS." + +#: systemv/lpadmin.c:616 +msgid "lpadmin: Raw queues are no longer supported on macOS." +msgstr "lpadmin: Rå køer understøttes ikke længere på macOS." + +#: systemv/lpadmin.c:231 +msgid "lpadmin: System V interface scripts are no longer supported for security reasons." +msgstr "" +"lpadmin: System V-grænsefladescripts understøttes ikke længere af " +"sikkerhedsårsager." + +#: systemv/lpadmin.c:97 +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: Kan ikke tilføje en printer til klassen:\n" +" Du skal først angive et printernavn." + +#: systemv/lpadmin.c:89 systemv/lpadmin.c:139 systemv/lpadmin.c:261 +#: systemv/lpadmin.c:344 systemv/lpadmin.c:393 systemv/lpadmin.c:505 +#: systemv/lpadmin.c:656 +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "lpadmin: Kan ikke oprette forbindelse til server: %s" + +#: systemv/lpadmin.c:1442 +msgid "lpadmin: Unable to create temporary file" +msgstr "lpadmin: Kan ikke oprette midlertidig fil" + +#: systemv/lpadmin.c:401 +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: Kan ikke slette tilvalg:\n" +" Du skal først angive et printernavn." + +#: systemv/lpadmin.c:1453 +#, c-format +msgid "lpadmin: Unable to open PPD \"%s\": %s" +msgstr "lpadmin: Kan ikke åbne PPD'en \"%s\": %s" + +#: systemv/lpadmin.c:1433 +#, c-format +msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." +msgstr "lpadmin: Kan ikke åbne PPD'en \"%s\": %s på linje %d." + +#: systemv/lpadmin.c:353 +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: Kan ikke fjerne en printer fra klassen:\n" +" Du skal først angive et printernavn." + +#: systemv/lpadmin.c:645 +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: Kan ikke indstille printertilvalget:\n" +" Du skal først angive et printernavn." + +#: systemv/lpadmin.c:472 +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "lpadmin: Ukendt \"allow/deny\"-tilvalg \"%s\"." + +#: systemv/lpadmin.c:601 +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "lpadmin: Ukendt argument \"%s\"." + +#: systemv/lpadmin.c:594 +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "lpadmin: Ukendt tilvalg \"%c\"." + +#: systemv/lpadmin.c:622 +msgid "lpadmin: Use the 'everywhere' model for shared printers." +msgstr "lpadmin: Brug 'everywhere'-modellen til delte printere." + +#: systemv/lpadmin.c:570 +msgid "lpadmin: Warning - content type list ignored." +msgstr "lpadmin: Advarsel - indholdstypeliste ignoreret." + +#: berkeley/lpc.c:62 berkeley/lpc.c:90 berkeley/lpc.c:126 +msgid "lpc> " +msgstr "lpc> " + +#: systemv/lpinfo.c:80 +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "lpinfo: Ventede 1284 enheds-ID-streng efter \"--device-id\"." + +#: systemv/lpinfo.c:129 +msgid "lpinfo: Expected language after \"--language\"." +msgstr "lpinfo: Ventede sprog efter \"--language\"." + +#: systemv/lpinfo.c:144 +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "lpinfo: Ventede mærke og model efter \"--make-and-model\"." + +#: systemv/lpinfo.c:159 +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "lpinfo: Ventede produktstreng efter \"--product\"." + +#: systemv/lpinfo.c:96 +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "lpinfo: Ventede skemaliste efter \"--exclude-schemes\"." + +#: systemv/lpinfo.c:114 +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "lpinfo: Ventede skemaliste efter \"--include-schemes\"." + +#: systemv/lpinfo.c:174 +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "lpinfo: Ventede timeout efter \"--timeout\"." + +#: systemv/lpmove.c:129 +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "lpmove: Kan ikke oprette forbindelse til server: %s" + +#: systemv/lpmove.c:117 +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "lpmove: Ukendt argument \"%s\"." + +#: systemv/lpoptions.c:149 systemv/lpoptions.c:167 systemv/lpoptions.c:246 +msgid "lpoptions: No printers." +msgstr "lpoptions: Ingen printere." + +#: systemv/lpoptions.c:223 +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "lpoptions: Kan ikke tilføje printer eller instans: %s" + +#: systemv/lpoptions.c:492 systemv/lpoptions.c:501 +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "lpoptions: Kan ikke hente PPD-fil for %s: %s" + +#: systemv/lpoptions.c:511 +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "lpoptions: Kan ikke åbne PPD-fil for %s." + +#: systemv/lpoptions.c:95 +msgid "lpoptions: Unknown printer or class." +msgstr "lpoptions: Ukendt printer eller klasse." + +#: systemv/lpstat.c:1099 +#, c-format +msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"." +msgstr "" +"lpstat: fejl - miljøvariablen %s nævner den ikkeeksisterende destination \"%" +"s\"." + +#. TRANSLATORS: Amount of Material +#: locale/ipp-strings.c:1120 +msgid "material-amount" +msgstr "" + +#. TRANSLATORS: Amount Units +#: locale/ipp-strings.c:1122 +msgid "material-amount-units" +msgstr "" + +#. TRANSLATORS: Grams +#: locale/ipp-strings.c:1124 +msgid "material-amount-units.g" +msgstr "" + +#. TRANSLATORS: Kilograms +#: locale/ipp-strings.c:1126 +msgid "material-amount-units.kg" +msgstr "" + +#. TRANSLATORS: Liters +#: locale/ipp-strings.c:1128 +msgid "material-amount-units.l" +msgstr "" + +#. TRANSLATORS: Meters +#: locale/ipp-strings.c:1130 +msgid "material-amount-units.m" +msgstr "" + +#. TRANSLATORS: Milliliters +#: locale/ipp-strings.c:1132 +msgid "material-amount-units.ml" +msgstr "" + +#. TRANSLATORS: Millimeters +#: locale/ipp-strings.c:1134 +msgid "material-amount-units.mm" +msgstr "" + +#. TRANSLATORS: Material Color +#: locale/ipp-strings.c:1136 +msgid "material-color" +msgstr "" + +#. TRANSLATORS: Material Diameter +#: locale/ipp-strings.c:1138 +msgid "material-diameter" +msgstr "" + +#. TRANSLATORS: Material Diameter Tolerance +#: locale/ipp-strings.c:1140 +msgid "material-diameter-tolerance" +msgstr "" + +#. TRANSLATORS: Material Fill Density +#: locale/ipp-strings.c:1142 +msgid "material-fill-density" +msgstr "" + +#. TRANSLATORS: Material Name +#: locale/ipp-strings.c:1144 +msgid "material-name" +msgstr "" + +#. TRANSLATORS: Material Nozzle Diameter +#: locale/ipp-strings.c:1146 +msgid "material-nozzle-diameter" +msgstr "" + +#. TRANSLATORS: Use Material For +#: locale/ipp-strings.c:1148 +msgid "material-purpose" +msgstr "" + +#. TRANSLATORS: Everything +#: locale/ipp-strings.c:1150 +msgid "material-purpose.all" +msgstr "" + +#. TRANSLATORS: Base +#: locale/ipp-strings.c:1152 +msgid "material-purpose.base" +msgstr "" + +#. TRANSLATORS: In-fill +#: locale/ipp-strings.c:1154 +msgid "material-purpose.in-fill" +msgstr "" + +#. TRANSLATORS: Shell +#: locale/ipp-strings.c:1156 +msgid "material-purpose.shell" +msgstr "" + +#. TRANSLATORS: Supports +#: locale/ipp-strings.c:1158 +msgid "material-purpose.support" +msgstr "" + +#. TRANSLATORS: Feed Rate +#: locale/ipp-strings.c:1160 +msgid "material-rate" +msgstr "" + +#. TRANSLATORS: Feed Rate Units +#: locale/ipp-strings.c:1162 +msgid "material-rate-units" +msgstr "" + +#. TRANSLATORS: Milligrams per second +#: locale/ipp-strings.c:1164 +msgid "material-rate-units.mg_second" +msgstr "" + +#. TRANSLATORS: Milliliters per second +#: locale/ipp-strings.c:1166 +msgid "material-rate-units.ml_second" +msgstr "" + +#. TRANSLATORS: Millimeters per second +#: locale/ipp-strings.c:1168 +msgid "material-rate-units.mm_second" +msgstr "" + +#. TRANSLATORS: Material Retraction +#: locale/ipp-strings.c:1170 +msgid "material-retraction" +msgstr "" + +#. TRANSLATORS: Material Shell Thickness +#: locale/ipp-strings.c:1172 +msgid "material-shell-thickness" +msgstr "" + +#. TRANSLATORS: Material Temperature +#: locale/ipp-strings.c:1174 +msgid "material-temperature" +msgstr "" + +#. TRANSLATORS: Material Type +#: locale/ipp-strings.c:1176 +msgid "material-type" +msgstr "" + +#. TRANSLATORS: ABS +#: locale/ipp-strings.c:1178 +msgid "material-type.abs" +msgstr "" + +#. TRANSLATORS: Carbon Fiber ABS +#: locale/ipp-strings.c:1180 +msgid "material-type.abs-carbon-fiber" +msgstr "" + +#. TRANSLATORS: Carbon Nanotube ABS +#: locale/ipp-strings.c:1182 +msgid "material-type.abs-carbon-nanotube" +msgstr "" + +#. TRANSLATORS: Chocolate +#: locale/ipp-strings.c:1184 +msgid "material-type.chocolate" +msgstr "" + +#. TRANSLATORS: Gold +#: locale/ipp-strings.c:1186 +msgid "material-type.gold" +msgstr "" + +#. TRANSLATORS: Nylon +#: locale/ipp-strings.c:1188 +msgid "material-type.nylon" +msgstr "" + +#. TRANSLATORS: Pet +#: locale/ipp-strings.c:1190 +msgid "material-type.pet" +msgstr "" + +#. TRANSLATORS: Photopolymer +#: locale/ipp-strings.c:1192 +msgid "material-type.photopolymer" +msgstr "" + +#. TRANSLATORS: PLA +#: locale/ipp-strings.c:1194 +msgid "material-type.pla" +msgstr "" + +#. TRANSLATORS: Conductive PLA +#: locale/ipp-strings.c:1196 +msgid "material-type.pla-conductive" +msgstr "" + +#. TRANSLATORS: Pla Dissolvable +#: locale/ipp-strings.c:1198 +msgid "material-type.pla-dissolvable" +msgstr "" + +#. TRANSLATORS: Flexible PLA +#: locale/ipp-strings.c:1200 +msgid "material-type.pla-flexible" +msgstr "" + +#. TRANSLATORS: Magnetic PLA +#: locale/ipp-strings.c:1202 +msgid "material-type.pla-magnetic" +msgstr "" + +#. TRANSLATORS: Steel PLA +#: locale/ipp-strings.c:1204 +msgid "material-type.pla-steel" +msgstr "" + +#. TRANSLATORS: Stone PLA +#: locale/ipp-strings.c:1206 +msgid "material-type.pla-stone" +msgstr "" + +#. TRANSLATORS: Wood PLA +#: locale/ipp-strings.c:1208 +msgid "material-type.pla-wood" +msgstr "" + +#. TRANSLATORS: Polycarbonate +#: locale/ipp-strings.c:1210 +msgid "material-type.polycarbonate" +msgstr "" + +#. TRANSLATORS: Dissolvable PVA +#: locale/ipp-strings.c:1212 +msgid "material-type.pva-dissolvable" +msgstr "" + +#. TRANSLATORS: Silver +#: locale/ipp-strings.c:1214 +msgid "material-type.silver" +msgstr "" + +#. TRANSLATORS: Titanium +#: locale/ipp-strings.c:1216 +msgid "material-type.titanium" +msgstr "" + +#. TRANSLATORS: Wax +#: locale/ipp-strings.c:1218 +msgid "material-type.wax" +msgstr "" + +#. TRANSLATORS: Materials +#: locale/ipp-strings.c:1220 +msgid "materials-col" +msgstr "" + +#. TRANSLATORS: Media +#: locale/ipp-strings.c:1222 +msgid "media" +msgstr "" + +#. TRANSLATORS: Back Coating of Media +#: locale/ipp-strings.c:1224 +msgid "media-back-coating" +msgstr "" + +#. TRANSLATORS: Glossy +#: locale/ipp-strings.c:1226 +msgid "media-back-coating.glossy" +msgstr "" + +#. TRANSLATORS: High Gloss +#: locale/ipp-strings.c:1228 +msgid "media-back-coating.high-gloss" +msgstr "" + +#. TRANSLATORS: Matte +#: locale/ipp-strings.c:1230 +msgid "media-back-coating.matte" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:1232 +msgid "media-back-coating.none" +msgstr "" + +#. TRANSLATORS: Satin +#: locale/ipp-strings.c:1234 +msgid "media-back-coating.satin" +msgstr "" + +#. TRANSLATORS: Semi-gloss +#: locale/ipp-strings.c:1236 +msgid "media-back-coating.semi-gloss" +msgstr "" + +#. TRANSLATORS: Media Bottom Margin +#: locale/ipp-strings.c:1238 +msgid "media-bottom-margin" +msgstr "" + +#. TRANSLATORS: Media +#: locale/ipp-strings.c:1240 +msgid "media-col" +msgstr "" + +#. TRANSLATORS: Media Color +#: locale/ipp-strings.c:1242 +msgid "media-color" +msgstr "" + +#. TRANSLATORS: Black +#: locale/ipp-strings.c:1244 +msgid "media-color.black" +msgstr "" + +#. TRANSLATORS: Blue +#: locale/ipp-strings.c:1246 +msgid "media-color.blue" +msgstr "" + +#. TRANSLATORS: Brown +#: locale/ipp-strings.c:1248 +msgid "media-color.brown" +msgstr "" + +#. TRANSLATORS: Buff +#: locale/ipp-strings.c:1250 +msgid "media-color.buff" +msgstr "" + +#. TRANSLATORS: Clear Black +#: locale/ipp-strings.c:1252 +msgid "media-color.clear-black" +msgstr "" + +#. TRANSLATORS: Clear Blue +#: locale/ipp-strings.c:1254 +msgid "media-color.clear-blue" +msgstr "" + +#. TRANSLATORS: Clear Brown +#: locale/ipp-strings.c:1256 +msgid "media-color.clear-brown" +msgstr "" + +#. TRANSLATORS: Clear Buff +#: locale/ipp-strings.c:1258 +msgid "media-color.clear-buff" +msgstr "" + +#. TRANSLATORS: Clear Cyan +#: locale/ipp-strings.c:1260 +msgid "media-color.clear-cyan" +msgstr "" + +#. TRANSLATORS: Clear Gold +#: locale/ipp-strings.c:1262 +msgid "media-color.clear-gold" +msgstr "" + +#. TRANSLATORS: Clear Goldenrod +#: locale/ipp-strings.c:1264 +msgid "media-color.clear-goldenrod" +msgstr "" + +#. TRANSLATORS: Clear Gray +#: locale/ipp-strings.c:1266 +msgid "media-color.clear-gray" +msgstr "" + +#. TRANSLATORS: Clear Green +#: locale/ipp-strings.c:1268 +msgid "media-color.clear-green" +msgstr "" + +#. TRANSLATORS: Clear Ivory +#: locale/ipp-strings.c:1270 +msgid "media-color.clear-ivory" +msgstr "" + +#. TRANSLATORS: Clear Magenta +#: locale/ipp-strings.c:1272 +msgid "media-color.clear-magenta" +msgstr "" + +#. TRANSLATORS: Clear Multi Color +#: locale/ipp-strings.c:1274 +msgid "media-color.clear-multi-color" +msgstr "" + +#. TRANSLATORS: Clear Mustard +#: locale/ipp-strings.c:1276 +msgid "media-color.clear-mustard" +msgstr "" + +#. TRANSLATORS: Clear Orange +#: locale/ipp-strings.c:1278 +msgid "media-color.clear-orange" +msgstr "" + +#. TRANSLATORS: Clear Pink +#: locale/ipp-strings.c:1280 +msgid "media-color.clear-pink" +msgstr "" + +#. TRANSLATORS: Clear Red +#: locale/ipp-strings.c:1282 +msgid "media-color.clear-red" +msgstr "" + +#. TRANSLATORS: Clear Silver +#: locale/ipp-strings.c:1284 +msgid "media-color.clear-silver" +msgstr "" + +#. TRANSLATORS: Clear Turquoise +#: locale/ipp-strings.c:1286 +msgid "media-color.clear-turquoise" +msgstr "" + +#. TRANSLATORS: Clear Violet +#: locale/ipp-strings.c:1288 +msgid "media-color.clear-violet" +msgstr "" + +#. TRANSLATORS: Clear White +#: locale/ipp-strings.c:1290 +msgid "media-color.clear-white" +msgstr "" + +#. TRANSLATORS: Clear Yellow +#: locale/ipp-strings.c:1292 +msgid "media-color.clear-yellow" +msgstr "" + +#. TRANSLATORS: Cyan +#: locale/ipp-strings.c:1294 +msgid "media-color.cyan" +msgstr "" + +#. TRANSLATORS: Dark Blue +#: locale/ipp-strings.c:1296 +msgid "media-color.dark-blue" +msgstr "" + +#. TRANSLATORS: Dark Brown +#: locale/ipp-strings.c:1298 +msgid "media-color.dark-brown" +msgstr "" + +#. TRANSLATORS: Dark Buff +#: locale/ipp-strings.c:1300 +msgid "media-color.dark-buff" +msgstr "" + +#. TRANSLATORS: Dark Cyan +#: locale/ipp-strings.c:1302 +msgid "media-color.dark-cyan" +msgstr "" + +#. TRANSLATORS: Dark Gold +#: locale/ipp-strings.c:1304 +msgid "media-color.dark-gold" +msgstr "" + +#. TRANSLATORS: Dark Goldenrod +#: locale/ipp-strings.c:1306 +msgid "media-color.dark-goldenrod" +msgstr "" + +#. TRANSLATORS: Dark Gray +#: locale/ipp-strings.c:1308 +msgid "media-color.dark-gray" +msgstr "" + +#. TRANSLATORS: Dark Green +#: locale/ipp-strings.c:1310 +msgid "media-color.dark-green" +msgstr "" + +#. TRANSLATORS: Dark Ivory +#: locale/ipp-strings.c:1312 +msgid "media-color.dark-ivory" +msgstr "" + +#. TRANSLATORS: Dark Magenta +#: locale/ipp-strings.c:1314 +msgid "media-color.dark-magenta" +msgstr "" + +#. TRANSLATORS: Dark Mustard +#: locale/ipp-strings.c:1316 +msgid "media-color.dark-mustard" +msgstr "" + +#. TRANSLATORS: Dark Orange +#: locale/ipp-strings.c:1318 +msgid "media-color.dark-orange" +msgstr "" + +#. TRANSLATORS: Dark Pink +#: locale/ipp-strings.c:1320 +msgid "media-color.dark-pink" +msgstr "" + +#. TRANSLATORS: Dark Red +#: locale/ipp-strings.c:1322 +msgid "media-color.dark-red" +msgstr "" + +#. TRANSLATORS: Dark Silver +#: locale/ipp-strings.c:1324 +msgid "media-color.dark-silver" +msgstr "" + +#. TRANSLATORS: Dark Turquoise +#: locale/ipp-strings.c:1326 +msgid "media-color.dark-turquoise" +msgstr "" + +#. TRANSLATORS: Dark Violet +#: locale/ipp-strings.c:1328 +msgid "media-color.dark-violet" +msgstr "" + +#. TRANSLATORS: Dark Yellow +#: locale/ipp-strings.c:1330 +msgid "media-color.dark-yellow" +msgstr "" + +#. TRANSLATORS: Gold +#: locale/ipp-strings.c:1332 +msgid "media-color.gold" +msgstr "" + +#. TRANSLATORS: Goldenrod +#: locale/ipp-strings.c:1334 +msgid "media-color.goldenrod" +msgstr "" + +#. TRANSLATORS: Gray +#: locale/ipp-strings.c:1336 +msgid "media-color.gray" +msgstr "" + +#. TRANSLATORS: Green +#: locale/ipp-strings.c:1338 +msgid "media-color.green" +msgstr "" + +#. TRANSLATORS: Ivory +#: locale/ipp-strings.c:1340 +msgid "media-color.ivory" +msgstr "" + +#. TRANSLATORS: Light Black +#: locale/ipp-strings.c:1342 +msgid "media-color.light-black" +msgstr "" + +#. TRANSLATORS: Light Blue +#: locale/ipp-strings.c:1344 +msgid "media-color.light-blue" +msgstr "" + +#. TRANSLATORS: Light Brown +#: locale/ipp-strings.c:1346 +msgid "media-color.light-brown" +msgstr "" + +#. TRANSLATORS: Light Buff +#: locale/ipp-strings.c:1348 +msgid "media-color.light-buff" +msgstr "" + +#. TRANSLATORS: Light Cyan +#: locale/ipp-strings.c:1350 +msgid "media-color.light-cyan" +msgstr "" + +#. TRANSLATORS: Light Gold +#: locale/ipp-strings.c:1352 +msgid "media-color.light-gold" +msgstr "" + +#. TRANSLATORS: Light Goldenrod +#: locale/ipp-strings.c:1354 +msgid "media-color.light-goldenrod" +msgstr "" + +#. TRANSLATORS: Light Gray +#: locale/ipp-strings.c:1356 +msgid "media-color.light-gray" +msgstr "" + +#. TRANSLATORS: Light Green +#: locale/ipp-strings.c:1358 +msgid "media-color.light-green" +msgstr "" + +#. TRANSLATORS: Light Ivory +#: locale/ipp-strings.c:1360 +msgid "media-color.light-ivory" +msgstr "" + +#. TRANSLATORS: Light Magenta +#: locale/ipp-strings.c:1362 +msgid "media-color.light-magenta" +msgstr "" + +#. TRANSLATORS: Light Mustard +#: locale/ipp-strings.c:1364 +msgid "media-color.light-mustard" +msgstr "" + +#. TRANSLATORS: Light Orange +#: locale/ipp-strings.c:1366 +msgid "media-color.light-orange" +msgstr "" + +#. TRANSLATORS: Light Pink +#: locale/ipp-strings.c:1368 +msgid "media-color.light-pink" +msgstr "" + +#. TRANSLATORS: Light Red +#: locale/ipp-strings.c:1370 +msgid "media-color.light-red" +msgstr "" + +#. TRANSLATORS: Light Silver +#: locale/ipp-strings.c:1372 +msgid "media-color.light-silver" +msgstr "" + +#. TRANSLATORS: Light Turquoise +#: locale/ipp-strings.c:1374 +msgid "media-color.light-turquoise" +msgstr "" + +#. TRANSLATORS: Light Violet +#: locale/ipp-strings.c:1376 +msgid "media-color.light-violet" +msgstr "" + +#. TRANSLATORS: Light Yellow +#: locale/ipp-strings.c:1378 +msgid "media-color.light-yellow" +msgstr "" + +#. TRANSLATORS: Magenta +#: locale/ipp-strings.c:1380 +msgid "media-color.magenta" +msgstr "" + +#. TRANSLATORS: Multi-color +#: locale/ipp-strings.c:1382 +msgid "media-color.multi-color" +msgstr "" + +#. TRANSLATORS: Mustard +#: locale/ipp-strings.c:1384 +msgid "media-color.mustard" +msgstr "" + +#. TRANSLATORS: No Color +#: locale/ipp-strings.c:1386 +msgid "media-color.no-color" +msgstr "" + +#. TRANSLATORS: Orange +#: locale/ipp-strings.c:1388 +msgid "media-color.orange" +msgstr "" + +#. TRANSLATORS: Pink +#: locale/ipp-strings.c:1390 +msgid "media-color.pink" +msgstr "" + +#. TRANSLATORS: Red +#: locale/ipp-strings.c:1392 +msgid "media-color.red" +msgstr "" + +#. TRANSLATORS: Silver +#: locale/ipp-strings.c:1394 +msgid "media-color.silver" +msgstr "" + +#. TRANSLATORS: Turquoise +#: locale/ipp-strings.c:1396 +msgid "media-color.turquoise" +msgstr "" + +#. TRANSLATORS: Violet +#: locale/ipp-strings.c:1398 +msgid "media-color.violet" +msgstr "" + +#. TRANSLATORS: White +#: locale/ipp-strings.c:1400 +msgid "media-color.white" +msgstr "" + +#. TRANSLATORS: Yellow +#: locale/ipp-strings.c:1402 +msgid "media-color.yellow" +msgstr "" + +#. TRANSLATORS: Front Coating of Media +#: locale/ipp-strings.c:1404 +msgid "media-front-coating" +msgstr "" + +#. TRANSLATORS: Media Grain +#: locale/ipp-strings.c:1406 +msgid "media-grain" +msgstr "" + +#. TRANSLATORS: Cross-Feed Direction +#: locale/ipp-strings.c:1408 +msgid "media-grain.x-direction" +msgstr "" + +#. TRANSLATORS: Feed Direction +#: locale/ipp-strings.c:1410 +msgid "media-grain.y-direction" +msgstr "" + +#. TRANSLATORS: Media Hole Count +#: locale/ipp-strings.c:1412 +msgid "media-hole-count" +msgstr "" + +#. TRANSLATORS: Media Info +#: locale/ipp-strings.c:1414 +msgid "media-info" +msgstr "" + +#. TRANSLATORS: Force Media +#: locale/ipp-strings.c:1416 +msgid "media-input-tray-check" +msgstr "" + +#. TRANSLATORS: Media Left Margin +#: locale/ipp-strings.c:1418 +msgid "media-left-margin" +msgstr "" + +#. TRANSLATORS: Pre-printed Media +#: locale/ipp-strings.c:1420 +msgid "media-pre-printed" +msgstr "" + +#. TRANSLATORS: Blank +#: locale/ipp-strings.c:1422 +msgid "media-pre-printed.blank" +msgstr "" + +#. TRANSLATORS: Letterhead +#: locale/ipp-strings.c:1424 +msgid "media-pre-printed.letter-head" +msgstr "" + +#. TRANSLATORS: Pre-printed +#: locale/ipp-strings.c:1426 +msgid "media-pre-printed.pre-printed" +msgstr "" + +#. TRANSLATORS: Recycled Media +#: locale/ipp-strings.c:1428 +msgid "media-recycled" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:1430 +msgid "media-recycled.none" +msgstr "" + +#. TRANSLATORS: Standard +#: locale/ipp-strings.c:1432 +msgid "media-recycled.standard" +msgstr "" + +#. TRANSLATORS: Media Right Margin +#: locale/ipp-strings.c:1434 +msgid "media-right-margin" +msgstr "" + +#. TRANSLATORS: Media Dimensions +#: locale/ipp-strings.c:1436 +msgid "media-size" +msgstr "" + +#. TRANSLATORS: Media Name +#: locale/ipp-strings.c:1438 +msgid "media-size-name" +msgstr "" + +#. TRANSLATORS: Media Source +#: locale/ipp-strings.c:1440 +msgid "media-source" +msgstr "" + +#. TRANSLATORS: Alternate +#: locale/ipp-strings.c:1442 +msgid "media-source.alternate" +msgstr "" + +#. TRANSLATORS: Alternate Roll +#: locale/ipp-strings.c:1444 +msgid "media-source.alternate-roll" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:1446 +msgid "media-source.auto" +msgstr "" + +#. TRANSLATORS: Bottom +#: locale/ipp-strings.c:1448 +msgid "media-source.bottom" +msgstr "" + +#. TRANSLATORS: By-pass Tray +#: locale/ipp-strings.c:1450 +msgid "media-source.by-pass-tray" +msgstr "" + +#. TRANSLATORS: Center +#: locale/ipp-strings.c:1452 +msgid "media-source.center" +msgstr "" + +#. TRANSLATORS: Disc +#: locale/ipp-strings.c:1454 +msgid "media-source.disc" +msgstr "" + +#. TRANSLATORS: Envelope +#: locale/ipp-strings.c:1456 +msgid "media-source.envelope" +msgstr "" + +#. TRANSLATORS: Hagaki +#: locale/ipp-strings.c:1458 +msgid "media-source.hagaki" +msgstr "" + +#. TRANSLATORS: Large Capacity +#: locale/ipp-strings.c:1460 +msgid "media-source.large-capacity" +msgstr "" + +#. TRANSLATORS: Left +#: locale/ipp-strings.c:1462 +msgid "media-source.left" +msgstr "" + +#. TRANSLATORS: Main +#: locale/ipp-strings.c:1464 +msgid "media-source.main" +msgstr "" + +#. TRANSLATORS: Main Roll +#: locale/ipp-strings.c:1466 +msgid "media-source.main-roll" +msgstr "" + +#. TRANSLATORS: Manual +#: locale/ipp-strings.c:1468 +msgid "media-source.manual" +msgstr "" + +#. TRANSLATORS: Middle +#: locale/ipp-strings.c:1470 +msgid "media-source.middle" +msgstr "" + +#. TRANSLATORS: Photo +#: locale/ipp-strings.c:1472 +msgid "media-source.photo" +msgstr "" + +#. TRANSLATORS: Rear +#: locale/ipp-strings.c:1474 +msgid "media-source.rear" +msgstr "" + +#. TRANSLATORS: Right +#: locale/ipp-strings.c:1476 +msgid "media-source.right" +msgstr "" + +#. TRANSLATORS: Roll 1 +#: locale/ipp-strings.c:1478 +msgid "media-source.roll-1" +msgstr "" + +#. TRANSLATORS: Roll 10 +#: locale/ipp-strings.c:1480 +msgid "media-source.roll-10" +msgstr "" + +#. TRANSLATORS: Roll 2 +#: locale/ipp-strings.c:1482 +msgid "media-source.roll-2" +msgstr "" + +#. TRANSLATORS: Roll 3 +#: locale/ipp-strings.c:1484 +msgid "media-source.roll-3" +msgstr "" + +#. TRANSLATORS: Roll 4 +#: locale/ipp-strings.c:1486 +msgid "media-source.roll-4" +msgstr "" + +#. TRANSLATORS: Roll 5 +#: locale/ipp-strings.c:1488 +msgid "media-source.roll-5" +msgstr "" + +#. TRANSLATORS: Roll 6 +#: locale/ipp-strings.c:1490 +msgid "media-source.roll-6" +msgstr "" + +#. TRANSLATORS: Roll 7 +#: locale/ipp-strings.c:1492 +msgid "media-source.roll-7" +msgstr "" + +#. TRANSLATORS: Roll 8 +#: locale/ipp-strings.c:1494 +msgid "media-source.roll-8" +msgstr "" + +#. TRANSLATORS: Roll 9 +#: locale/ipp-strings.c:1496 +msgid "media-source.roll-9" +msgstr "" + +#. TRANSLATORS: Side +#: locale/ipp-strings.c:1498 +msgid "media-source.side" +msgstr "" + +#. TRANSLATORS: Top +#: locale/ipp-strings.c:1500 +msgid "media-source.top" +msgstr "" + +#. TRANSLATORS: Tray 1 +#: locale/ipp-strings.c:1502 +msgid "media-source.tray-1" +msgstr "" + +#. TRANSLATORS: Tray 10 +#: locale/ipp-strings.c:1504 +msgid "media-source.tray-10" +msgstr "" + +#. TRANSLATORS: Tray 11 +#: locale/ipp-strings.c:1506 +msgid "media-source.tray-11" +msgstr "" + +#. TRANSLATORS: Tray 12 +#: locale/ipp-strings.c:1508 +msgid "media-source.tray-12" +msgstr "" + +#. TRANSLATORS: Tray 13 +#: locale/ipp-strings.c:1510 +msgid "media-source.tray-13" +msgstr "" + +#. TRANSLATORS: Tray 14 +#: locale/ipp-strings.c:1512 +msgid "media-source.tray-14" +msgstr "" + +#. TRANSLATORS: Tray 15 +#: locale/ipp-strings.c:1514 +msgid "media-source.tray-15" +msgstr "" + +#. TRANSLATORS: Tray 16 +#: locale/ipp-strings.c:1516 +msgid "media-source.tray-16" +msgstr "" + +#. TRANSLATORS: Tray 17 +#: locale/ipp-strings.c:1518 +msgid "media-source.tray-17" +msgstr "" + +#. TRANSLATORS: Tray 18 +#: locale/ipp-strings.c:1520 +msgid "media-source.tray-18" +msgstr "" + +#. TRANSLATORS: Tray 19 +#: locale/ipp-strings.c:1522 +msgid "media-source.tray-19" +msgstr "" + +#. TRANSLATORS: Tray 2 +#: locale/ipp-strings.c:1524 +msgid "media-source.tray-2" +msgstr "" + +#. TRANSLATORS: Tray 20 +#: locale/ipp-strings.c:1526 +msgid "media-source.tray-20" +msgstr "" + +#. TRANSLATORS: Tray 3 +#: locale/ipp-strings.c:1528 +msgid "media-source.tray-3" +msgstr "" + +#. TRANSLATORS: Tray 4 +#: locale/ipp-strings.c:1530 +msgid "media-source.tray-4" +msgstr "" + +#. TRANSLATORS: Tray 5 +#: locale/ipp-strings.c:1532 +msgid "media-source.tray-5" +msgstr "" + +#. TRANSLATORS: Tray 6 +#: locale/ipp-strings.c:1534 +msgid "media-source.tray-6" +msgstr "" + +#. TRANSLATORS: Tray 7 +#: locale/ipp-strings.c:1536 +msgid "media-source.tray-7" +msgstr "" + +#. TRANSLATORS: Tray 8 +#: locale/ipp-strings.c:1538 +msgid "media-source.tray-8" +msgstr "" + +#. TRANSLATORS: Tray 9 +#: locale/ipp-strings.c:1540 +msgid "media-source.tray-9" +msgstr "" + +#. TRANSLATORS: Media Thickness +#: locale/ipp-strings.c:1542 +msgid "media-thickness" +msgstr "" + +#. TRANSLATORS: Media Tooth (Texture) +#: locale/ipp-strings.c:1544 +msgid "media-tooth" +msgstr "" + +#. TRANSLATORS: Antique +#: locale/ipp-strings.c:1546 +msgid "media-tooth.antique" +msgstr "" + +#. TRANSLATORS: Extra Smooth +#: locale/ipp-strings.c:1548 +msgid "media-tooth.calendared" +msgstr "" + +#. TRANSLATORS: Coarse +#: locale/ipp-strings.c:1550 +msgid "media-tooth.coarse" +msgstr "" + +#. TRANSLATORS: Fine +#: locale/ipp-strings.c:1552 +msgid "media-tooth.fine" +msgstr "" + +#. TRANSLATORS: Linen +#: locale/ipp-strings.c:1554 +msgid "media-tooth.linen" +msgstr "" + +#. TRANSLATORS: Medium +#: locale/ipp-strings.c:1556 +msgid "media-tooth.medium" +msgstr "" + +#. TRANSLATORS: Smooth +#: locale/ipp-strings.c:1558 +msgid "media-tooth.smooth" +msgstr "" + +#. TRANSLATORS: Stipple +#: locale/ipp-strings.c:1560 +msgid "media-tooth.stipple" +msgstr "" + +#. TRANSLATORS: Rough +#: locale/ipp-strings.c:1562 +msgid "media-tooth.uncalendared" +msgstr "" + +#. TRANSLATORS: Vellum +#: locale/ipp-strings.c:1564 +msgid "media-tooth.vellum" +msgstr "" + +#. TRANSLATORS: Media Top Margin +#: locale/ipp-strings.c:1566 +msgid "media-top-margin" +msgstr "" + +#. TRANSLATORS: Media Type +#: locale/ipp-strings.c:1568 +msgid "media-type" +msgstr "" + +#. TRANSLATORS: Aluminum +#: locale/ipp-strings.c:1570 +msgid "media-type.aluminum" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:1572 +msgid "media-type.auto" +msgstr "" + +#. TRANSLATORS: Back Print Film +#: locale/ipp-strings.c:1574 +msgid "media-type.back-print-film" +msgstr "" + +#. TRANSLATORS: Cardboard +#: locale/ipp-strings.c:1576 +msgid "media-type.cardboard" +msgstr "" + +#. TRANSLATORS: Cardstock +#: locale/ipp-strings.c:1578 +msgid "media-type.cardstock" +msgstr "" + +#. TRANSLATORS: CD +#: locale/ipp-strings.c:1580 +msgid "media-type.cd" +msgstr "" + +#. TRANSLATORS: Continuous +#: locale/ipp-strings.c:1582 +msgid "media-type.continuous" +msgstr "" + +#. TRANSLATORS: Continuous Long +#: locale/ipp-strings.c:1584 +msgid "media-type.continuous-long" +msgstr "" + +#. TRANSLATORS: Continuous Short +#: locale/ipp-strings.c:1586 +msgid "media-type.continuous-short" +msgstr "" + +#. TRANSLATORS: Corrugated Board +#: locale/ipp-strings.c:1588 +msgid "media-type.corrugated-board" +msgstr "" + +#. TRANSLATORS: Optical Disc +#: locale/ipp-strings.c:1590 +msgid "media-type.disc" +msgstr "" + +#. TRANSLATORS: Glossy Optical Disc +#: locale/ipp-strings.c:1592 +msgid "media-type.disc-glossy" +msgstr "" + +#. TRANSLATORS: High Gloss Optical Disc +#: locale/ipp-strings.c:1594 +msgid "media-type.disc-high-gloss" +msgstr "" + +#. TRANSLATORS: Matte Optical Disc +#: locale/ipp-strings.c:1596 +msgid "media-type.disc-matte" +msgstr "" + +#. TRANSLATORS: Satin Optical Disc +#: locale/ipp-strings.c:1598 +msgid "media-type.disc-satin" +msgstr "" + +#. TRANSLATORS: Semi-Gloss Optical Disc +#: locale/ipp-strings.c:1600 +msgid "media-type.disc-semi-gloss" +msgstr "" + +#. TRANSLATORS: Double Wall +#: locale/ipp-strings.c:1602 +msgid "media-type.double-wall" +msgstr "" + +#. TRANSLATORS: Dry Film +#: locale/ipp-strings.c:1604 +msgid "media-type.dry-film" +msgstr "" + +#. TRANSLATORS: DVD +#: locale/ipp-strings.c:1606 +msgid "media-type.dvd" +msgstr "" + +#. TRANSLATORS: Embossing Foil +#: locale/ipp-strings.c:1608 +msgid "media-type.embossing-foil" +msgstr "" + +#. TRANSLATORS: End Board +#: locale/ipp-strings.c:1610 +msgid "media-type.end-board" +msgstr "" + +#. TRANSLATORS: Envelope +#: locale/ipp-strings.c:1612 +msgid "media-type.envelope" +msgstr "" + +#. TRANSLATORS: Archival Envelope +#: locale/ipp-strings.c:1614 +msgid "media-type.envelope-archival" +msgstr "" + +#. TRANSLATORS: Bond Envelope +#: locale/ipp-strings.c:1616 +msgid "media-type.envelope-bond" +msgstr "" + +#. TRANSLATORS: Coated Envelope +#: locale/ipp-strings.c:1618 +msgid "media-type.envelope-coated" +msgstr "" + +#. TRANSLATORS: Cotton Envelope +#: locale/ipp-strings.c:1620 +msgid "media-type.envelope-cotton" +msgstr "" + +#. TRANSLATORS: Fine Envelope +#: locale/ipp-strings.c:1622 +msgid "media-type.envelope-fine" +msgstr "" + +#. TRANSLATORS: Heavyweight Envelope +#: locale/ipp-strings.c:1624 +msgid "media-type.envelope-heavyweight" +msgstr "" + +#. TRANSLATORS: Inkjet Envelope +#: locale/ipp-strings.c:1626 +msgid "media-type.envelope-inkjet" +msgstr "" + +#. TRANSLATORS: Lightweight Envelope +#: locale/ipp-strings.c:1628 +msgid "media-type.envelope-lightweight" +msgstr "" + +#. TRANSLATORS: Plain Envelope +#: locale/ipp-strings.c:1630 +msgid "media-type.envelope-plain" +msgstr "" + +#. TRANSLATORS: Preprinted Envelope +#: locale/ipp-strings.c:1632 +msgid "media-type.envelope-preprinted" +msgstr "" + +#. TRANSLATORS: Windowed Envelope +#: locale/ipp-strings.c:1634 +msgid "media-type.envelope-window" +msgstr "" + +#. TRANSLATORS: Fabric +#: locale/ipp-strings.c:1636 +msgid "media-type.fabric" +msgstr "" + +#. TRANSLATORS: Archival Fabric +#: locale/ipp-strings.c:1638 +msgid "media-type.fabric-archival" +msgstr "" + +#. TRANSLATORS: Glossy Fabric +#: locale/ipp-strings.c:1640 +msgid "media-type.fabric-glossy" +msgstr "" + +#. TRANSLATORS: High Gloss Fabric +#: locale/ipp-strings.c:1642 +msgid "media-type.fabric-high-gloss" +msgstr "" + +#. TRANSLATORS: Matte Fabric +#: locale/ipp-strings.c:1644 +msgid "media-type.fabric-matte" +msgstr "" + +#. TRANSLATORS: Semi-Gloss Fabric +#: locale/ipp-strings.c:1646 +msgid "media-type.fabric-semi-gloss" +msgstr "" + +#. TRANSLATORS: Waterproof Fabric +#: locale/ipp-strings.c:1648 +msgid "media-type.fabric-waterproof" +msgstr "" + +#. TRANSLATORS: Film +#: locale/ipp-strings.c:1650 +msgid "media-type.film" +msgstr "" + +#. TRANSLATORS: Flexo Base +#: locale/ipp-strings.c:1652 +msgid "media-type.flexo-base" +msgstr "" + +#. TRANSLATORS: Flexo Photo Polymer +#: locale/ipp-strings.c:1654 +msgid "media-type.flexo-photo-polymer" +msgstr "" + +#. TRANSLATORS: Flute +#: locale/ipp-strings.c:1656 +msgid "media-type.flute" +msgstr "" + +#. TRANSLATORS: Foil +#: locale/ipp-strings.c:1658 +msgid "media-type.foil" +msgstr "" + +#. TRANSLATORS: Full Cut Tabs +#: locale/ipp-strings.c:1660 +msgid "media-type.full-cut-tabs" +msgstr "" + +#. TRANSLATORS: Glass +#: locale/ipp-strings.c:1662 +msgid "media-type.glass" +msgstr "" + +#. TRANSLATORS: Glass Colored +#: locale/ipp-strings.c:1664 +msgid "media-type.glass-colored" +msgstr "" + +#. TRANSLATORS: Glass Opaque +#: locale/ipp-strings.c:1666 +msgid "media-type.glass-opaque" +msgstr "" + +#. TRANSLATORS: Glass Surfaced +#: locale/ipp-strings.c:1668 +msgid "media-type.glass-surfaced" +msgstr "" + +#. TRANSLATORS: Glass Textured +#: locale/ipp-strings.c:1670 +msgid "media-type.glass-textured" +msgstr "" + +#. TRANSLATORS: Gravure Cylinder +#: locale/ipp-strings.c:1672 +msgid "media-type.gravure-cylinder" +msgstr "" + +#. TRANSLATORS: Image Setter Paper +#: locale/ipp-strings.c:1674 +msgid "media-type.image-setter-paper" +msgstr "" + +#. TRANSLATORS: Imaging Cylinder +#: locale/ipp-strings.c:1676 +msgid "media-type.imaging-cylinder" +msgstr "" + +#. TRANSLATORS: Labels +#: locale/ipp-strings.c:1678 +msgid "media-type.labels" +msgstr "" + +#. TRANSLATORS: Colored Labels +#: locale/ipp-strings.c:1680 +msgid "media-type.labels-colored" +msgstr "" + +#. TRANSLATORS: Glossy Labels +#: locale/ipp-strings.c:1682 +msgid "media-type.labels-glossy" +msgstr "" + +#. TRANSLATORS: High Gloss Labels +#: locale/ipp-strings.c:1684 +msgid "media-type.labels-high-gloss" +msgstr "" + +#. TRANSLATORS: Inkjet Labels +#: locale/ipp-strings.c:1686 +msgid "media-type.labels-inkjet" +msgstr "" + +#. TRANSLATORS: Matte Labels +#: locale/ipp-strings.c:1688 +msgid "media-type.labels-matte" +msgstr "" + +#. TRANSLATORS: Permanent Labels +#: locale/ipp-strings.c:1690 +msgid "media-type.labels-permanent" +msgstr "" + +#. TRANSLATORS: Satin Labels +#: locale/ipp-strings.c:1692 +msgid "media-type.labels-satin" +msgstr "" + +#. TRANSLATORS: Security Labels +#: locale/ipp-strings.c:1694 +msgid "media-type.labels-security" +msgstr "" + +#. TRANSLATORS: Semi-Gloss Labels +#: locale/ipp-strings.c:1696 +msgid "media-type.labels-semi-gloss" +msgstr "" + +#. TRANSLATORS: Laminating Foil +#: locale/ipp-strings.c:1698 +msgid "media-type.laminating-foil" +msgstr "" + +#. TRANSLATORS: Letterhead +#: locale/ipp-strings.c:1700 +msgid "media-type.letterhead" +msgstr "" + +#. TRANSLATORS: Metal +#: locale/ipp-strings.c:1702 +msgid "media-type.metal" +msgstr "" + +#. TRANSLATORS: Metal Glossy +#: locale/ipp-strings.c:1704 +msgid "media-type.metal-glossy" +msgstr "" + +#. TRANSLATORS: Metal High Gloss +#: locale/ipp-strings.c:1706 +msgid "media-type.metal-high-gloss" +msgstr "" + +#. TRANSLATORS: Metal Matte +#: locale/ipp-strings.c:1708 +msgid "media-type.metal-matte" +msgstr "" + +#. TRANSLATORS: Metal Satin +#: locale/ipp-strings.c:1710 +msgid "media-type.metal-satin" +msgstr "" + +#. TRANSLATORS: Metal Semi Gloss +#: locale/ipp-strings.c:1712 +msgid "media-type.metal-semi-gloss" +msgstr "" + +#. TRANSLATORS: Mounting Tape +#: locale/ipp-strings.c:1714 +msgid "media-type.mounting-tape" +msgstr "" + +#. TRANSLATORS: Multi Layer +#: locale/ipp-strings.c:1716 +msgid "media-type.multi-layer" +msgstr "" + +#. TRANSLATORS: Multi Part Form +#: locale/ipp-strings.c:1718 +msgid "media-type.multi-part-form" +msgstr "" + +#. TRANSLATORS: Other +#: locale/ipp-strings.c:1720 +msgid "media-type.other" +msgstr "" + +#. TRANSLATORS: Paper +#: locale/ipp-strings.c:1722 +msgid "media-type.paper" +msgstr "" + +#. TRANSLATORS: Photo Paper +#: locale/ipp-strings.c:1724 +msgid "media-type.photographic" +msgstr "" + +#. TRANSLATORS: Photographic Archival +#: locale/ipp-strings.c:1726 +msgid "media-type.photographic-archival" +msgstr "" + +#. TRANSLATORS: Photo Film +#: locale/ipp-strings.c:1728 +msgid "media-type.photographic-film" +msgstr "" + +#. TRANSLATORS: Glossy Photo Paper +#: locale/ipp-strings.c:1730 +msgid "media-type.photographic-glossy" +msgstr "" + +#. TRANSLATORS: High Gloss Photo Paper +#: locale/ipp-strings.c:1732 +msgid "media-type.photographic-high-gloss" +msgstr "" + +#. TRANSLATORS: Matte Photo Paper +#: locale/ipp-strings.c:1734 +msgid "media-type.photographic-matte" +msgstr "" + +#. TRANSLATORS: Satin Photo Paper +#: locale/ipp-strings.c:1736 +msgid "media-type.photographic-satin" +msgstr "" + +#. TRANSLATORS: Semi-Gloss Photo Paper +#: locale/ipp-strings.c:1738 +msgid "media-type.photographic-semi-gloss" +msgstr "" + +#. TRANSLATORS: Plastic +#: locale/ipp-strings.c:1740 +msgid "media-type.plastic" +msgstr "" + +#. TRANSLATORS: Plastic Archival +#: locale/ipp-strings.c:1742 +msgid "media-type.plastic-archival" +msgstr "" + +#. TRANSLATORS: Plastic Colored +#: locale/ipp-strings.c:1744 +msgid "media-type.plastic-colored" +msgstr "" + +#. TRANSLATORS: Plastic Glossy +#: locale/ipp-strings.c:1746 +msgid "media-type.plastic-glossy" +msgstr "" + +#. TRANSLATORS: Plastic High Gloss +#: locale/ipp-strings.c:1748 +msgid "media-type.plastic-high-gloss" +msgstr "" + +#. TRANSLATORS: Plastic Matte +#: locale/ipp-strings.c:1750 +msgid "media-type.plastic-matte" +msgstr "" + +#. TRANSLATORS: Plastic Satin +#: locale/ipp-strings.c:1752 +msgid "media-type.plastic-satin" +msgstr "" + +#. TRANSLATORS: Plastic Semi Gloss +#: locale/ipp-strings.c:1754 +msgid "media-type.plastic-semi-gloss" +msgstr "" + +#. TRANSLATORS: Plate +#: locale/ipp-strings.c:1756 +msgid "media-type.plate" +msgstr "" + +#. TRANSLATORS: Polyester +#: locale/ipp-strings.c:1758 +msgid "media-type.polyester" +msgstr "" + +#. TRANSLATORS: Pre Cut Tabs +#: locale/ipp-strings.c:1760 +msgid "media-type.pre-cut-tabs" +msgstr "" + +#. TRANSLATORS: Roll +#: locale/ipp-strings.c:1762 +msgid "media-type.roll" +msgstr "" + +#. TRANSLATORS: Screen +#: locale/ipp-strings.c:1764 +msgid "media-type.screen" +msgstr "" + +#. TRANSLATORS: Screen Paged +#: locale/ipp-strings.c:1766 +msgid "media-type.screen-paged" +msgstr "" + +#. TRANSLATORS: Self Adhesive +#: locale/ipp-strings.c:1768 +msgid "media-type.self-adhesive" +msgstr "" + +#. TRANSLATORS: Self Adhesive Film +#: locale/ipp-strings.c:1770 +msgid "media-type.self-adhesive-film" +msgstr "" + +#. TRANSLATORS: Shrink Foil +#: locale/ipp-strings.c:1772 +msgid "media-type.shrink-foil" +msgstr "" + +#. TRANSLATORS: Single Face +#: locale/ipp-strings.c:1774 +msgid "media-type.single-face" +msgstr "" + +#. TRANSLATORS: Single Wall +#: locale/ipp-strings.c:1776 +msgid "media-type.single-wall" +msgstr "" + +#. TRANSLATORS: Sleeve +#: locale/ipp-strings.c:1778 +msgid "media-type.sleeve" +msgstr "" + +#. TRANSLATORS: Stationery +#: locale/ipp-strings.c:1780 +msgid "media-type.stationery" +msgstr "" + +#. TRANSLATORS: Stationery Archival +#: locale/ipp-strings.c:1782 +msgid "media-type.stationery-archival" +msgstr "" + +#. TRANSLATORS: Coated Paper +#: locale/ipp-strings.c:1784 +msgid "media-type.stationery-coated" +msgstr "" + +#. TRANSLATORS: Stationery Cotton +#: locale/ipp-strings.c:1786 +msgid "media-type.stationery-cotton" +msgstr "" + +#. TRANSLATORS: Vellum Paper +#: locale/ipp-strings.c:1788 +msgid "media-type.stationery-fine" +msgstr "" + +#. TRANSLATORS: Heavyweight Paper +#: locale/ipp-strings.c:1790 +msgid "media-type.stationery-heavyweight" +msgstr "" + +#. TRANSLATORS: Stationery Heavyweight Coated +#: locale/ipp-strings.c:1792 +msgid "media-type.stationery-heavyweight-coated" +msgstr "" + +#. TRANSLATORS: Stationery Inkjet Paper +#: locale/ipp-strings.c:1794 +msgid "media-type.stationery-inkjet" +msgstr "" + +#. TRANSLATORS: Letterhead +#: locale/ipp-strings.c:1796 +msgid "media-type.stationery-letterhead" +msgstr "" + +#. TRANSLATORS: Lightweight Paper +#: locale/ipp-strings.c:1798 +msgid "media-type.stationery-lightweight" +msgstr "" + +#. TRANSLATORS: Preprinted Paper +#: locale/ipp-strings.c:1800 +msgid "media-type.stationery-preprinted" +msgstr "" + +#. TRANSLATORS: Punched Paper +#: locale/ipp-strings.c:1802 +msgid "media-type.stationery-prepunched" +msgstr "" + +#. TRANSLATORS: Tab Stock +#: locale/ipp-strings.c:1804 +msgid "media-type.tab-stock" +msgstr "" + +#. TRANSLATORS: Tractor +#: locale/ipp-strings.c:1806 +msgid "media-type.tractor" +msgstr "" + +#. TRANSLATORS: Transfer +#: locale/ipp-strings.c:1808 +msgid "media-type.transfer" +msgstr "" + +#. TRANSLATORS: Transparency +#: locale/ipp-strings.c:1810 +msgid "media-type.transparency" +msgstr "" + +#. TRANSLATORS: Triple Wall +#: locale/ipp-strings.c:1812 +msgid "media-type.triple-wall" +msgstr "" + +#. TRANSLATORS: Wet Film +#: locale/ipp-strings.c:1814 +msgid "media-type.wet-film" +msgstr "" + +#. TRANSLATORS: Media Weight (grams per m²) +#: locale/ipp-strings.c:1816 +msgid "media-weight-metric" +msgstr "" + +#. TRANSLATORS: 28 x 40″ +#: locale/ipp-strings.c:1818 +msgid "media.asme_f_28x40in" +msgstr "" + +#. TRANSLATORS: A4 or US Letter +#: locale/ipp-strings.c:1820 +msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" +msgstr "" + +#. TRANSLATORS: 2a0 +#: locale/ipp-strings.c:1822 +msgid "media.iso_2a0_1189x1682mm" +msgstr "" + +#. TRANSLATORS: A0 +#: locale/ipp-strings.c:1824 +msgid "media.iso_a0_841x1189mm" +msgstr "" + +#. TRANSLATORS: A0x3 +#: locale/ipp-strings.c:1826 +msgid "media.iso_a0x3_1189x2523mm" +msgstr "" + +#. TRANSLATORS: A10 +#: locale/ipp-strings.c:1828 +msgid "media.iso_a10_26x37mm" +msgstr "" + +#. TRANSLATORS: A1 +#: locale/ipp-strings.c:1830 +msgid "media.iso_a1_594x841mm" +msgstr "" + +#. TRANSLATORS: A1x3 +#: locale/ipp-strings.c:1832 +msgid "media.iso_a1x3_841x1783mm" +msgstr "" + +#. TRANSLATORS: A1x4 +#: locale/ipp-strings.c:1834 +msgid "media.iso_a1x4_841x2378mm" +msgstr "" + +#. TRANSLATORS: A2 +#: locale/ipp-strings.c:1836 +msgid "media.iso_a2_420x594mm" +msgstr "" + +#. TRANSLATORS: A2x3 +#: locale/ipp-strings.c:1838 +msgid "media.iso_a2x3_594x1261mm" +msgstr "" + +#. TRANSLATORS: A2x4 +#: locale/ipp-strings.c:1840 +msgid "media.iso_a2x4_594x1682mm" +msgstr "" + +#. TRANSLATORS: A2x5 +#: locale/ipp-strings.c:1842 +msgid "media.iso_a2x5_594x2102mm" +msgstr "" + +#. TRANSLATORS: A3 (Extra) +#: locale/ipp-strings.c:1844 +msgid "media.iso_a3-extra_322x445mm" +msgstr "" + +#. TRANSLATORS: A3 +#: locale/ipp-strings.c:1846 +msgid "media.iso_a3_297x420mm" +msgstr "" + +#. TRANSLATORS: A3x3 +#: locale/ipp-strings.c:1848 +msgid "media.iso_a3x3_420x891mm" +msgstr "" + +#. TRANSLATORS: A3x4 +#: locale/ipp-strings.c:1850 +msgid "media.iso_a3x4_420x1189mm" +msgstr "" + +#. TRANSLATORS: A3x5 +#: locale/ipp-strings.c:1852 +msgid "media.iso_a3x5_420x1486mm" +msgstr "" + +#. TRANSLATORS: A3x6 +#: locale/ipp-strings.c:1854 +msgid "media.iso_a3x6_420x1783mm" +msgstr "" + +#. TRANSLATORS: A3x7 +#: locale/ipp-strings.c:1856 +msgid "media.iso_a3x7_420x2080mm" +msgstr "" + +#. TRANSLATORS: A4 (Extra) +#: locale/ipp-strings.c:1858 +msgid "media.iso_a4-extra_235.5x322.3mm" +msgstr "" + +#. TRANSLATORS: A4 (Tab) +#: locale/ipp-strings.c:1860 +msgid "media.iso_a4-tab_225x297mm" +msgstr "" + +#. TRANSLATORS: A4 +#: locale/ipp-strings.c:1862 +msgid "media.iso_a4_210x297mm" +msgstr "" + +#. TRANSLATORS: A4x3 +#: locale/ipp-strings.c:1864 +msgid "media.iso_a4x3_297x630mm" +msgstr "" + +#. TRANSLATORS: A4x4 +#: locale/ipp-strings.c:1866 +msgid "media.iso_a4x4_297x841mm" +msgstr "" + +#. TRANSLATORS: A4x5 +#: locale/ipp-strings.c:1868 +msgid "media.iso_a4x5_297x1051mm" +msgstr "" + +#. TRANSLATORS: A4x6 +#: locale/ipp-strings.c:1870 +msgid "media.iso_a4x6_297x1261mm" +msgstr "" + +#. TRANSLATORS: A4x7 +#: locale/ipp-strings.c:1872 +msgid "media.iso_a4x7_297x1471mm" +msgstr "" + +#. TRANSLATORS: A4x8 +#: locale/ipp-strings.c:1874 +msgid "media.iso_a4x8_297x1682mm" +msgstr "" + +#. TRANSLATORS: A4x9 +#: locale/ipp-strings.c:1876 +msgid "media.iso_a4x9_297x1892mm" +msgstr "" + +#. TRANSLATORS: A5 (Extra) +#: locale/ipp-strings.c:1878 +msgid "media.iso_a5-extra_174x235mm" +msgstr "" + +#. TRANSLATORS: A5 +#: locale/ipp-strings.c:1880 +msgid "media.iso_a5_148x210mm" +msgstr "" + +#. TRANSLATORS: A6 +#: locale/ipp-strings.c:1882 +msgid "media.iso_a6_105x148mm" +msgstr "" + +#. TRANSLATORS: A7 +#: locale/ipp-strings.c:1884 +msgid "media.iso_a7_74x105mm" +msgstr "" + +#. TRANSLATORS: A8 +#: locale/ipp-strings.c:1886 +msgid "media.iso_a8_52x74mm" +msgstr "" + +#. TRANSLATORS: A9 +#: locale/ipp-strings.c:1888 +msgid "media.iso_a9_37x52mm" +msgstr "" + +#. TRANSLATORS: B0 +#: locale/ipp-strings.c:1890 +msgid "media.iso_b0_1000x1414mm" +msgstr "" + +#. TRANSLATORS: B10 +#: locale/ipp-strings.c:1892 +msgid "media.iso_b10_31x44mm" +msgstr "" + +#. TRANSLATORS: B1 +#: locale/ipp-strings.c:1894 +msgid "media.iso_b1_707x1000mm" +msgstr "" + +#. TRANSLATORS: B2 +#: locale/ipp-strings.c:1896 +msgid "media.iso_b2_500x707mm" +msgstr "" + +#. TRANSLATORS: B3 +#: locale/ipp-strings.c:1898 +msgid "media.iso_b3_353x500mm" +msgstr "" + +#. TRANSLATORS: B4 +#: locale/ipp-strings.c:1900 +msgid "media.iso_b4_250x353mm" +msgstr "" + +#. TRANSLATORS: B5 (Extra) +#: locale/ipp-strings.c:1902 +msgid "media.iso_b5-extra_201x276mm" +msgstr "" + +#. TRANSLATORS: Envelope B5 +#: locale/ipp-strings.c:1904 +msgid "media.iso_b5_176x250mm" +msgstr "" + +#. TRANSLATORS: B6 +#: locale/ipp-strings.c:1906 +msgid "media.iso_b6_125x176mm" +msgstr "" + +#. TRANSLATORS: Envelope B6/C4 +#: locale/ipp-strings.c:1908 +msgid "media.iso_b6c4_125x324mm" +msgstr "" + +#. TRANSLATORS: B7 +#: locale/ipp-strings.c:1910 +msgid "media.iso_b7_88x125mm" +msgstr "" + +#. TRANSLATORS: B8 +#: locale/ipp-strings.c:1912 +msgid "media.iso_b8_62x88mm" +msgstr "" + +#. TRANSLATORS: B9 +#: locale/ipp-strings.c:1914 +msgid "media.iso_b9_44x62mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 0 +#: locale/ipp-strings.c:1916 +msgid "media.iso_c0_917x1297mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 10 +#: locale/ipp-strings.c:1918 +msgid "media.iso_c10_28x40mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 1 +#: locale/ipp-strings.c:1920 +msgid "media.iso_c1_648x917mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 2 +#: locale/ipp-strings.c:1922 +msgid "media.iso_c2_458x648mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 3 +#: locale/ipp-strings.c:1924 +msgid "media.iso_c3_324x458mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 4 +#: locale/ipp-strings.c:1926 +msgid "media.iso_c4_229x324mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 5 +#: locale/ipp-strings.c:1928 +msgid "media.iso_c5_162x229mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 6 +#: locale/ipp-strings.c:1930 +msgid "media.iso_c6_114x162mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 6c5 +#: locale/ipp-strings.c:1932 +msgid "media.iso_c6c5_114x229mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 7 +#: locale/ipp-strings.c:1934 +msgid "media.iso_c7_81x114mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 7c6 +#: locale/ipp-strings.c:1936 +msgid "media.iso_c7c6_81x162mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 8 +#: locale/ipp-strings.c:1938 +msgid "media.iso_c8_57x81mm" +msgstr "" + +#. TRANSLATORS: CEnvelope 9 +#: locale/ipp-strings.c:1940 +msgid "media.iso_c9_40x57mm" +msgstr "" + +#. TRANSLATORS: Envelope DL +#: locale/ipp-strings.c:1942 +msgid "media.iso_dl_110x220mm" +msgstr "" + +#. TRANSLATORS: Id-1 +#: locale/ipp-strings.c:1944 +msgid "media.iso_id-1_53.98x85.6mm" +msgstr "" + +#. TRANSLATORS: Id-3 +#: locale/ipp-strings.c:1946 +msgid "media.iso_id-3_88x125mm" +msgstr "" + +#. TRANSLATORS: ISO RA0 +#: locale/ipp-strings.c:1948 +msgid "media.iso_ra0_860x1220mm" +msgstr "" + +#. TRANSLATORS: ISO RA1 +#: locale/ipp-strings.c:1950 +msgid "media.iso_ra1_610x860mm" +msgstr "" + +#. TRANSLATORS: ISO RA2 +#: locale/ipp-strings.c:1952 +msgid "media.iso_ra2_430x610mm" +msgstr "" + +#. TRANSLATORS: ISO RA3 +#: locale/ipp-strings.c:1954 +msgid "media.iso_ra3_305x430mm" +msgstr "" + +#. TRANSLATORS: ISO RA4 +#: locale/ipp-strings.c:1956 +msgid "media.iso_ra4_215x305mm" +msgstr "" + +#. TRANSLATORS: ISO SRA0 +#: locale/ipp-strings.c:1958 +msgid "media.iso_sra0_900x1280mm" +msgstr "" + +#. TRANSLATORS: ISO SRA1 +#: locale/ipp-strings.c:1960 +msgid "media.iso_sra1_640x900mm" +msgstr "" + +#. TRANSLATORS: ISO SRA2 +#: locale/ipp-strings.c:1962 +msgid "media.iso_sra2_450x640mm" +msgstr "" + +#. TRANSLATORS: ISO SRA3 +#: locale/ipp-strings.c:1964 +msgid "media.iso_sra3_320x450mm" +msgstr "" + +#. TRANSLATORS: ISO SRA4 +#: locale/ipp-strings.c:1966 +msgid "media.iso_sra4_225x320mm" +msgstr "" + +#. TRANSLATORS: JIS B0 +#: locale/ipp-strings.c:1968 +msgid "media.jis_b0_1030x1456mm" +msgstr "" + +#. TRANSLATORS: JIS B10 +#: locale/ipp-strings.c:1970 +msgid "media.jis_b10_32x45mm" +msgstr "" + +#. TRANSLATORS: JIS B1 +#: locale/ipp-strings.c:1972 +msgid "media.jis_b1_728x1030mm" +msgstr "" + +#. TRANSLATORS: JIS B2 +#: locale/ipp-strings.c:1974 +msgid "media.jis_b2_515x728mm" +msgstr "" + +#. TRANSLATORS: JIS B3 +#: locale/ipp-strings.c:1976 +msgid "media.jis_b3_364x515mm" +msgstr "" + +#. TRANSLATORS: JIS B4 +#: locale/ipp-strings.c:1978 +msgid "media.jis_b4_257x364mm" +msgstr "" + +#. TRANSLATORS: JIS B5 +#: locale/ipp-strings.c:1980 +msgid "media.jis_b5_182x257mm" +msgstr "" + +#. TRANSLATORS: JIS B6 +#: locale/ipp-strings.c:1982 +msgid "media.jis_b6_128x182mm" +msgstr "" + +#. TRANSLATORS: JIS B7 +#: locale/ipp-strings.c:1984 +msgid "media.jis_b7_91x128mm" +msgstr "" + +#. TRANSLATORS: JIS B8 +#: locale/ipp-strings.c:1986 +msgid "media.jis_b8_64x91mm" +msgstr "" + +#. TRANSLATORS: JIS B9 +#: locale/ipp-strings.c:1988 +msgid "media.jis_b9_45x64mm" +msgstr "" + +#. TRANSLATORS: JIS Executive +#: locale/ipp-strings.c:1990 +msgid "media.jis_exec_216x330mm" +msgstr "" + +#. TRANSLATORS: Envelope Chou 2 +#: locale/ipp-strings.c:1992 +msgid "media.jpn_chou2_111.1x146mm" +msgstr "" + +#. TRANSLATORS: Envelope Chou 3 +#: locale/ipp-strings.c:1994 +msgid "media.jpn_chou3_120x235mm" +msgstr "" + +#. TRANSLATORS: Envelope Chou 40 +#: locale/ipp-strings.c:1996 +msgid "media.jpn_chou40_90x225mm" +msgstr "" + +#. TRANSLATORS: Envelope Chou 4 +#: locale/ipp-strings.c:1998 +msgid "media.jpn_chou4_90x205mm" +msgstr "" + +#. TRANSLATORS: Hagaki +#: locale/ipp-strings.c:2000 +msgid "media.jpn_hagaki_100x148mm" +msgstr "" + +#. TRANSLATORS: Envelope Kahu +#: locale/ipp-strings.c:2002 +msgid "media.jpn_kahu_240x322.1mm" +msgstr "" + +#. TRANSLATORS: 270 x 382mm +#: locale/ipp-strings.c:2004 +msgid "media.jpn_kaku1_270x382mm" +msgstr "" + +#. TRANSLATORS: Envelope Kahu 2 +#: locale/ipp-strings.c:2006 +msgid "media.jpn_kaku2_240x332mm" +msgstr "" + +#. TRANSLATORS: 216 x 277mm +#: locale/ipp-strings.c:2008 +msgid "media.jpn_kaku3_216x277mm" +msgstr "" + +#. TRANSLATORS: 197 x 267mm +#: locale/ipp-strings.c:2010 +msgid "media.jpn_kaku4_197x267mm" +msgstr "" + +#. TRANSLATORS: 190 x 240mm +#: locale/ipp-strings.c:2012 +msgid "media.jpn_kaku5_190x240mm" +msgstr "" + +#. TRANSLATORS: 142 x 205mm +#: locale/ipp-strings.c:2014 +msgid "media.jpn_kaku7_142x205mm" +msgstr "" + +#. TRANSLATORS: 119 x 197mm +#: locale/ipp-strings.c:2016 +msgid "media.jpn_kaku8_119x197mm" +msgstr "" + +#. TRANSLATORS: Oufuku Reply Postcard +#: locale/ipp-strings.c:2018 +msgid "media.jpn_oufuku_148x200mm" +msgstr "" + +#. TRANSLATORS: Envelope You 4 +#: locale/ipp-strings.c:2020 +msgid "media.jpn_you4_105x235mm" +msgstr "" + +#. TRANSLATORS: 10 x 11″ +#: locale/ipp-strings.c:2022 +msgid "media.na_10x11_10x11in" +msgstr "" + +#. TRANSLATORS: 10 x 13″ +#: locale/ipp-strings.c:2024 +msgid "media.na_10x13_10x13in" +msgstr "" + +#. TRANSLATORS: 10 x 14″ +#: locale/ipp-strings.c:2026 +msgid "media.na_10x14_10x14in" +msgstr "" + +#. TRANSLATORS: 10 x 15″ +#: locale/ipp-strings.c:2028 +msgid "media.na_10x15_10x15in" +msgstr "" + +#. TRANSLATORS: 11 x 12″ +#: locale/ipp-strings.c:2030 +msgid "media.na_11x12_11x12in" +msgstr "" + +#. TRANSLATORS: 11 x 15″ +#: locale/ipp-strings.c:2032 +msgid "media.na_11x15_11x15in" +msgstr "" + +#. TRANSLATORS: 12 x 19″ +#: locale/ipp-strings.c:2034 +msgid "media.na_12x19_12x19in" +msgstr "" + +#. TRANSLATORS: 5 x 7″ +#: locale/ipp-strings.c:2036 +msgid "media.na_5x7_5x7in" +msgstr "" + +#. TRANSLATORS: 6 x 9″ +#: locale/ipp-strings.c:2038 +msgid "media.na_6x9_6x9in" +msgstr "" + +#. TRANSLATORS: 7 x 9″ +#: locale/ipp-strings.c:2040 +msgid "media.na_7x9_7x9in" +msgstr "" + +#. TRANSLATORS: 9 x 11″ +#: locale/ipp-strings.c:2042 +msgid "media.na_9x11_9x11in" +msgstr "" + +#. TRANSLATORS: Envelope A2 +#: locale/ipp-strings.c:2044 +msgid "media.na_a2_4.375x5.75in" +msgstr "" + +#. TRANSLATORS: 9 x 12″ +#: locale/ipp-strings.c:2046 +msgid "media.na_arch-a_9x12in" +msgstr "" + +#. TRANSLATORS: 12 x 18″ +#: locale/ipp-strings.c:2048 +msgid "media.na_arch-b_12x18in" +msgstr "" + +#. TRANSLATORS: 18 x 24″ +#: locale/ipp-strings.c:2050 +msgid "media.na_arch-c_18x24in" +msgstr "" + +#. TRANSLATORS: 24 x 36″ +#: locale/ipp-strings.c:2052 +msgid "media.na_arch-d_24x36in" +msgstr "" + +#. TRANSLATORS: 26 x 38″ +#: locale/ipp-strings.c:2054 +msgid "media.na_arch-e2_26x38in" +msgstr "" + +#. TRANSLATORS: 27 x 39″ +#: locale/ipp-strings.c:2056 +msgid "media.na_arch-e3_27x39in" +msgstr "" + +#. TRANSLATORS: 36 x 48″ +#: locale/ipp-strings.c:2058 +msgid "media.na_arch-e_36x48in" +msgstr "" + +#. TRANSLATORS: 12 x 19.17″ +#: locale/ipp-strings.c:2060 +msgid "media.na_b-plus_12x19.17in" +msgstr "" + +#. TRANSLATORS: Envelope C5 +#: locale/ipp-strings.c:2062 +msgid "media.na_c5_6.5x9.5in" +msgstr "" + +#. TRANSLATORS: 17 x 22″ +#: locale/ipp-strings.c:2064 +msgid "media.na_c_17x22in" +msgstr "" + +#. TRANSLATORS: 22 x 34″ +#: locale/ipp-strings.c:2066 +msgid "media.na_d_22x34in" +msgstr "" + +#. TRANSLATORS: 34 x 44″ +#: locale/ipp-strings.c:2068 +msgid "media.na_e_34x44in" +msgstr "" + +#. TRANSLATORS: 11 x 14″ +#: locale/ipp-strings.c:2070 +msgid "media.na_edp_11x14in" +msgstr "" + +#. TRANSLATORS: 12 x 14″ +#: locale/ipp-strings.c:2072 +msgid "media.na_eur-edp_12x14in" +msgstr "" + +#. TRANSLATORS: Executive +#: locale/ipp-strings.c:2074 +msgid "media.na_executive_7.25x10.5in" +msgstr "" + +#. TRANSLATORS: 44 x 68″ +#: locale/ipp-strings.c:2076 +msgid "media.na_f_44x68in" +msgstr "" + +#. TRANSLATORS: European Fanfold +#: locale/ipp-strings.c:2078 +msgid "media.na_fanfold-eur_8.5x12in" +msgstr "" + +#. TRANSLATORS: US Fanfold +#: locale/ipp-strings.c:2080 +msgid "media.na_fanfold-us_11x14.875in" +msgstr "" + +#. TRANSLATORS: Foolscap +#: locale/ipp-strings.c:2082 +msgid "media.na_foolscap_8.5x13in" +msgstr "" + +#. TRANSLATORS: 8 x 13″ +#: locale/ipp-strings.c:2084 +msgid "media.na_govt-legal_8x13in" +msgstr "" + +#. TRANSLATORS: 8 x 10″ +#: locale/ipp-strings.c:2086 +msgid "media.na_govt-letter_8x10in" +msgstr "" + +#. TRANSLATORS: 3 x 5″ +#: locale/ipp-strings.c:2088 +msgid "media.na_index-3x5_3x5in" +msgstr "" + +#. TRANSLATORS: 6 x 8″ +#: locale/ipp-strings.c:2090 +msgid "media.na_index-4x6-ext_6x8in" +msgstr "" + +#. TRANSLATORS: 4 x 6″ +#: locale/ipp-strings.c:2092 +msgid "media.na_index-4x6_4x6in" +msgstr "" + +#. TRANSLATORS: 5 x 8″ +#: locale/ipp-strings.c:2094 +msgid "media.na_index-5x8_5x8in" +msgstr "" + +#. TRANSLATORS: Statement +#: locale/ipp-strings.c:2096 +msgid "media.na_invoice_5.5x8.5in" +msgstr "" + +#. TRANSLATORS: 11 x 17″ +#: locale/ipp-strings.c:2098 +msgid "media.na_ledger_11x17in" +msgstr "" + +#. TRANSLATORS: US Legal (Extra) +#: locale/ipp-strings.c:2100 +msgid "media.na_legal-extra_9.5x15in" +msgstr "" + +#. TRANSLATORS: US Legal +#: locale/ipp-strings.c:2102 +msgid "media.na_legal_8.5x14in" +msgstr "" + +#. TRANSLATORS: US Letter (Extra) +#: locale/ipp-strings.c:2104 +msgid "media.na_letter-extra_9.5x12in" +msgstr "" + +#. TRANSLATORS: US Letter (Plus) +#: locale/ipp-strings.c:2106 +msgid "media.na_letter-plus_8.5x12.69in" +msgstr "" + +#. TRANSLATORS: US Letter +#: locale/ipp-strings.c:2108 +msgid "media.na_letter_8.5x11in" +msgstr "" + +#. TRANSLATORS: Envelope Monarch +#: locale/ipp-strings.c:2110 +msgid "media.na_monarch_3.875x7.5in" +msgstr "" + +#. TRANSLATORS: Envelope #10 +#: locale/ipp-strings.c:2112 +msgid "media.na_number-10_4.125x9.5in" +msgstr "" + +#. TRANSLATORS: Envelope #11 +#: locale/ipp-strings.c:2114 +msgid "media.na_number-11_4.5x10.375in" +msgstr "" + +#. TRANSLATORS: Envelope #12 +#: locale/ipp-strings.c:2116 +msgid "media.na_number-12_4.75x11in" +msgstr "" + +#. TRANSLATORS: Envelope #14 +#: locale/ipp-strings.c:2118 +msgid "media.na_number-14_5x11.5in" +msgstr "" + +#. TRANSLATORS: Envelope #9 +#: locale/ipp-strings.c:2120 +msgid "media.na_number-9_3.875x8.875in" +msgstr "" + +#. TRANSLATORS: 8.5 x 13.4″ +#: locale/ipp-strings.c:2122 +msgid "media.na_oficio_8.5x13.4in" +msgstr "" + +#. TRANSLATORS: Envelope Personal +#: locale/ipp-strings.c:2124 +msgid "media.na_personal_3.625x6.5in" +msgstr "" + +#. TRANSLATORS: Quarto +#: locale/ipp-strings.c:2126 +msgid "media.na_quarto_8.5x10.83in" +msgstr "" + +#. TRANSLATORS: 8.94 x 14″ +#: locale/ipp-strings.c:2128 +msgid "media.na_super-a_8.94x14in" +msgstr "" + +#. TRANSLATORS: 13 x 19″ +#: locale/ipp-strings.c:2130 +msgid "media.na_super-b_13x19in" +msgstr "" + +#. TRANSLATORS: 30 x 42″ +#: locale/ipp-strings.c:2132 +msgid "media.na_wide-format_30x42in" +msgstr "" + +#. TRANSLATORS: 12 x 16″ +#: locale/ipp-strings.c:2134 +msgid "media.oe_12x16_12x16in" +msgstr "" + +#. TRANSLATORS: 14 x 17″ +#: locale/ipp-strings.c:2136 +msgid "media.oe_14x17_14x17in" +msgstr "" + +#. TRANSLATORS: 18 x 22″ +#: locale/ipp-strings.c:2138 +msgid "media.oe_18x22_18x22in" +msgstr "" + +#. TRANSLATORS: 17 x 24″ +#: locale/ipp-strings.c:2140 +msgid "media.oe_a2plus_17x24in" +msgstr "" + +#. TRANSLATORS: 2 x 3.5″ +#: locale/ipp-strings.c:2142 +msgid "media.oe_business-card_2x3.5in" +msgstr "" + +#. TRANSLATORS: 10 x 12″ +#: locale/ipp-strings.c:2144 +msgid "media.oe_photo-10r_10x12in" +msgstr "" + +#. TRANSLATORS: 20 x 24″ +#: locale/ipp-strings.c:2146 +msgid "media.oe_photo-20r_20x24in" +msgstr "" + +#. TRANSLATORS: 3.5 x 5″ +#: locale/ipp-strings.c:2148 +msgid "media.oe_photo-l_3.5x5in" +msgstr "" + +#. TRANSLATORS: 10 x 15″ +#: locale/ipp-strings.c:2150 +msgid "media.oe_photo-s10r_10x15in" +msgstr "" + +#. TRANSLATORS: 4 x 4″ +#: locale/ipp-strings.c:2152 +msgid "media.oe_square-photo_4x4in" +msgstr "" + +#. TRANSLATORS: 5 x 5″ +#: locale/ipp-strings.c:2154 +msgid "media.oe_square-photo_5x5in" +msgstr "" + +#. TRANSLATORS: 184 x 260mm +#: locale/ipp-strings.c:2156 +msgid "media.om_16k_184x260mm" +msgstr "" + +#. TRANSLATORS: 195 x 270mm +#: locale/ipp-strings.c:2158 +msgid "media.om_16k_195x270mm" +msgstr "" + +#. TRANSLATORS: 55 x 85mm +#: locale/ipp-strings.c:2160 +msgid "media.om_business-card_55x85mm" +msgstr "" + +#. TRANSLATORS: 55 x 91mm +#: locale/ipp-strings.c:2162 +msgid "media.om_business-card_55x91mm" +msgstr "" + +#. TRANSLATORS: 54 x 86mm +#: locale/ipp-strings.c:2164 +msgid "media.om_card_54x86mm" +msgstr "" + +#. TRANSLATORS: 275 x 395mm +#: locale/ipp-strings.c:2166 +msgid "media.om_dai-pa-kai_275x395mm" +msgstr "" + +#. TRANSLATORS: 89 x 119mm +#: locale/ipp-strings.c:2168 +msgid "media.om_dsc-photo_89x119mm" +msgstr "" + +#. TRANSLATORS: Folio +#: locale/ipp-strings.c:2170 +msgid "media.om_folio-sp_215x315mm" +msgstr "" + +#. TRANSLATORS: Folio (Special) +#: locale/ipp-strings.c:2172 +msgid "media.om_folio_210x330mm" +msgstr "" + +#. TRANSLATORS: Envelope Invitation +#: locale/ipp-strings.c:2174 +msgid "media.om_invite_220x220mm" +msgstr "" + +#. TRANSLATORS: Envelope Italian +#: locale/ipp-strings.c:2176 +msgid "media.om_italian_110x230mm" +msgstr "" + +#. TRANSLATORS: 198 x 275mm +#: locale/ipp-strings.c:2178 +msgid "media.om_juuro-ku-kai_198x275mm" +msgstr "" + +#. TRANSLATORS: 200 x 300 +#: locale/ipp-strings.c:2180 +msgid "media.om_large-photo_200x300" +msgstr "" + +#. TRANSLATORS: 130 x 180mm +#: locale/ipp-strings.c:2182 +msgid "media.om_medium-photo_130x180mm" +msgstr "" + +#. TRANSLATORS: 267 x 389mm +#: locale/ipp-strings.c:2184 +msgid "media.om_pa-kai_267x389mm" +msgstr "" + +#. TRANSLATORS: Envelope Postfix +#: locale/ipp-strings.c:2186 +msgid "media.om_postfix_114x229mm" +msgstr "" + +#. TRANSLATORS: 100 x 150mm +#: locale/ipp-strings.c:2188 +msgid "media.om_small-photo_100x150mm" +msgstr "" + +#. TRANSLATORS: 89 x 89mm +#: locale/ipp-strings.c:2190 +msgid "media.om_square-photo_89x89mm" +msgstr "" + +#. TRANSLATORS: 100 x 200mm +#: locale/ipp-strings.c:2192 +msgid "media.om_wide-photo_100x200mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #10 +#: locale/ipp-strings.c:2194 +msgid "media.prc_10_324x458mm" +msgstr "" + +#. TRANSLATORS: Chinese 16k +#: locale/ipp-strings.c:2196 +msgid "media.prc_16k_146x215mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #1 +#: locale/ipp-strings.c:2198 +msgid "media.prc_1_102x165mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #2 +#: locale/ipp-strings.c:2200 +msgid "media.prc_2_102x176mm" +msgstr "" + +#. TRANSLATORS: Chinese 32k +#: locale/ipp-strings.c:2202 +msgid "media.prc_32k_97x151mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #3 +#: locale/ipp-strings.c:2204 +msgid "media.prc_3_125x176mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #4 +#: locale/ipp-strings.c:2206 +msgid "media.prc_4_110x208mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #5 +#: locale/ipp-strings.c:2208 +msgid "media.prc_5_110x220mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #6 +#: locale/ipp-strings.c:2210 +msgid "media.prc_6_120x320mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #7 +#: locale/ipp-strings.c:2212 +msgid "media.prc_7_160x230mm" +msgstr "" + +#. TRANSLATORS: Envelope Chinese #8 +#: locale/ipp-strings.c:2214 +msgid "media.prc_8_120x309mm" +msgstr "" + +#. TRANSLATORS: ROC 16k +#: locale/ipp-strings.c:2216 +msgid "media.roc_16k_7.75x10.75in" +msgstr "" + +#. TRANSLATORS: ROC 8k +#: locale/ipp-strings.c:2218 +msgid "media.roc_8k_10.75x15.5in" +msgstr "" + +#: systemv/lpstat.c:1035 +#, c-format +msgid "members of class %s:" +msgstr "" + +#. TRANSLATORS: Multiple Document Handling +#: locale/ipp-strings.c:2220 +msgid "multiple-document-handling" +msgstr "" + +#. TRANSLATORS: Separate Documents Collated Copies +#: locale/ipp-strings.c:2222 +msgid "multiple-document-handling.separate-documents-collated-copies" +msgstr "" + +#. TRANSLATORS: Separate Documents Uncollated Copies +#: locale/ipp-strings.c:2224 +msgid "multiple-document-handling.separate-documents-uncollated-copies" +msgstr "" + +#. TRANSLATORS: Single Document +#: locale/ipp-strings.c:2226 +msgid "multiple-document-handling.single-document" +msgstr "" + +#. TRANSLATORS: Single Document New Sheet +#: locale/ipp-strings.c:2228 +msgid "multiple-document-handling.single-document-new-sheet" +msgstr "" + +#. TRANSLATORS: Multiple Object Handling +#: locale/ipp-strings.c:2230 +msgid "multiple-object-handling" +msgstr "" + +#. TRANSLATORS: Multiple Object Handling Actual +#: locale/ipp-strings.c:2232 +msgid "multiple-object-handling-actual" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:2234 +msgid "multiple-object-handling.auto" +msgstr "" + +#. TRANSLATORS: Best Fit +#: locale/ipp-strings.c:2236 +msgid "multiple-object-handling.best-fit" +msgstr "" + +#. TRANSLATORS: Best Quality +#: locale/ipp-strings.c:2238 +msgid "multiple-object-handling.best-quality" +msgstr "" + +#. TRANSLATORS: Best Speed +#: locale/ipp-strings.c:2240 +msgid "multiple-object-handling.best-speed" +msgstr "" + +#. TRANSLATORS: One At A Time +#: locale/ipp-strings.c:2242 +msgid "multiple-object-handling.one-at-a-time" +msgstr "" + +#. TRANSLATORS: On Timeout +#: locale/ipp-strings.c:2244 +msgid "multiple-operation-time-out-action" +msgstr "" + +#. TRANSLATORS: Abort Job +#: locale/ipp-strings.c:2246 +msgid "multiple-operation-time-out-action.abort-job" +msgstr "" + +#. TRANSLATORS: Hold Job +#: locale/ipp-strings.c:2248 +msgid "multiple-operation-time-out-action.hold-job" +msgstr "" + +#. TRANSLATORS: Process Job +#: locale/ipp-strings.c:2250 +msgid "multiple-operation-time-out-action.process-job" +msgstr "" + +#: berkeley/lpq.c:554 +msgid "no entries" +msgstr "" + +#: systemv/lpstat.c:1103 +msgid "no system default destination" +msgstr "" + +#. TRANSLATORS: Noise Removal +#: locale/ipp-strings.c:2252 +msgid "noise-removal" +msgstr "" + +#. TRANSLATORS: Notify Attributes +#: locale/ipp-strings.c:2254 +msgid "notify-attributes" +msgstr "" + +#. TRANSLATORS: Notify Charset +#: locale/ipp-strings.c:2256 +msgid "notify-charset" +msgstr "" + +#. TRANSLATORS: Notify Events +#: locale/ipp-strings.c:2258 +msgid "notify-events" +msgstr "" + +#: scheduler/ipp.c:5872 +msgid "notify-events not specified." +msgstr "" + +#. TRANSLATORS: Document Completed +#: locale/ipp-strings.c:2260 +msgid "notify-events.document-completed" +msgstr "" + +#. TRANSLATORS: Document Config Changed +#: locale/ipp-strings.c:2262 +msgid "notify-events.document-config-changed" +msgstr "" + +#. TRANSLATORS: Document Created +#: locale/ipp-strings.c:2264 +msgid "notify-events.document-created" +msgstr "" + +#. TRANSLATORS: Document Fetchable +#: locale/ipp-strings.c:2266 +msgid "notify-events.document-fetchable" +msgstr "" + +#. TRANSLATORS: Document State Changed +#: locale/ipp-strings.c:2268 +msgid "notify-events.document-state-changed" +msgstr "" + +#. TRANSLATORS: Document Stopped +#: locale/ipp-strings.c:2270 +msgid "notify-events.document-stopped" +msgstr "" + +#. TRANSLATORS: Job Completed +#: locale/ipp-strings.c:2272 +msgid "notify-events.job-completed" +msgstr "" + +#. TRANSLATORS: Job Config Changed +#: locale/ipp-strings.c:2274 +msgid "notify-events.job-config-changed" +msgstr "" + +#. TRANSLATORS: Job Created +#: locale/ipp-strings.c:2276 +msgid "notify-events.job-created" +msgstr "" + +#. TRANSLATORS: Job Fetchable +#: locale/ipp-strings.c:2278 +msgid "notify-events.job-fetchable" +msgstr "" + +#. TRANSLATORS: Job Progress +#: locale/ipp-strings.c:2280 +msgid "notify-events.job-progress" +msgstr "" + +#. TRANSLATORS: Job State Changed +#: locale/ipp-strings.c:2282 +msgid "notify-events.job-state-changed" +msgstr "" + +#. TRANSLATORS: Job Stopped +#: locale/ipp-strings.c:2284 +msgid "notify-events.job-stopped" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:2286 +msgid "notify-events.none" +msgstr "" + +#. TRANSLATORS: Printer Config Changed +#: locale/ipp-strings.c:2288 +msgid "notify-events.printer-config-changed" +msgstr "" + +#. TRANSLATORS: Printer Finishings Changed +#: locale/ipp-strings.c:2290 +msgid "notify-events.printer-finishings-changed" +msgstr "" + +#. TRANSLATORS: Printer Media Changed +#: locale/ipp-strings.c:2292 +msgid "notify-events.printer-media-changed" +msgstr "" + +#. TRANSLATORS: Printer Queue Order Changed +#: locale/ipp-strings.c:2294 +msgid "notify-events.printer-queue-order-changed" +msgstr "" + +#. TRANSLATORS: Printer Restarted +#: locale/ipp-strings.c:2296 +msgid "notify-events.printer-restarted" +msgstr "" + +#. TRANSLATORS: Printer Shutdown +#: locale/ipp-strings.c:2298 +msgid "notify-events.printer-shutdown" +msgstr "" + +#. TRANSLATORS: Printer State Changed +#: locale/ipp-strings.c:2300 +msgid "notify-events.printer-state-changed" +msgstr "" + +#. TRANSLATORS: Printer Stopped +#: locale/ipp-strings.c:2302 +msgid "notify-events.printer-stopped" +msgstr "" + +#. TRANSLATORS: Notify Get Interval +#: locale/ipp-strings.c:2304 +msgid "notify-get-interval" +msgstr "" + +#. TRANSLATORS: Notify Lease Duration +#: locale/ipp-strings.c:2306 +msgid "notify-lease-duration" +msgstr "" + +#. TRANSLATORS: Notify Natural Language +#: locale/ipp-strings.c:2308 +msgid "notify-natural-language" +msgstr "" + +#. TRANSLATORS: Notify Pull Method +#: locale/ipp-strings.c:2310 +msgid "notify-pull-method" +msgstr "" + +#. TRANSLATORS: Notify Recipient +#: locale/ipp-strings.c:2312 +msgid "notify-recipient-uri" +msgstr "" + +#: scheduler/ipp.c:2034 scheduler/ipp.c:5758 +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#: scheduler/ipp.c:2024 scheduler/ipp.c:5748 +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +#. TRANSLATORS: Notify Sequence Numbers +#: locale/ipp-strings.c:2314 +msgid "notify-sequence-numbers" +msgstr "" + +#. TRANSLATORS: Notify Subscription Ids +#: locale/ipp-strings.c:2316 +msgid "notify-subscription-ids" +msgstr "" + +#. TRANSLATORS: Notify Time Interval +#: locale/ipp-strings.c:2318 +msgid "notify-time-interval" +msgstr "" + +#. TRANSLATORS: Notify User Data +#: locale/ipp-strings.c:2320 +msgid "notify-user-data" +msgstr "" + +#. TRANSLATORS: Notify Wait +#: locale/ipp-strings.c:2322 +msgid "notify-wait" +msgstr "" + +#. TRANSLATORS: Number Of Retries +#: locale/ipp-strings.c:2324 +msgid "number-of-retries" +msgstr "" + +#. TRANSLATORS: Number-Up +#: locale/ipp-strings.c:2326 +msgid "number-up" +msgstr "" + +#. TRANSLATORS: Object Offset +#: locale/ipp-strings.c:2328 +msgid "object-offset" +msgstr "" + +#. TRANSLATORS: Object Size +#: locale/ipp-strings.c:2330 +msgid "object-size" +msgstr "" + +#. TRANSLATORS: Organization Name +#: locale/ipp-strings.c:2332 +msgid "organization-name" +msgstr "" + +#. TRANSLATORS: Orientation +#: locale/ipp-strings.c:2334 +msgid "orientation-requested" +msgstr "" + +#. TRANSLATORS: Portrait +#: locale/ipp-strings.c:2336 +msgid "orientation-requested.3" +msgstr "" + +#. TRANSLATORS: Landscape +#: locale/ipp-strings.c:2338 +msgid "orientation-requested.4" +msgstr "" + +#. TRANSLATORS: Reverse Landscape +#: locale/ipp-strings.c:2340 +msgid "orientation-requested.5" +msgstr "" + +#. TRANSLATORS: Reverse Portrait +#: locale/ipp-strings.c:2342 +msgid "orientation-requested.6" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:2344 +msgid "orientation-requested.7" +msgstr "" + +#. TRANSLATORS: Scanned Image Options +#: locale/ipp-strings.c:2346 +msgid "output-attributes" +msgstr "" + +#. TRANSLATORS: Output Tray +#: locale/ipp-strings.c:2348 +msgid "output-bin" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:2350 +msgid "output-bin.auto" +msgstr "" + +#. TRANSLATORS: Bottom +#: locale/ipp-strings.c:2352 +msgid "output-bin.bottom" +msgstr "" + +#. TRANSLATORS: Center +#: locale/ipp-strings.c:2354 +msgid "output-bin.center" +msgstr "" + +#. TRANSLATORS: Face Down +#: locale/ipp-strings.c:2356 +msgid "output-bin.face-down" +msgstr "" + +#. TRANSLATORS: Face Up +#: locale/ipp-strings.c:2358 +msgid "output-bin.face-up" +msgstr "" + +#. TRANSLATORS: Large Capacity +#: locale/ipp-strings.c:2360 +msgid "output-bin.large-capacity" +msgstr "" + +#. TRANSLATORS: Left +#: locale/ipp-strings.c:2362 +msgid "output-bin.left" +msgstr "" + +#. TRANSLATORS: Mailbox 1 +#: locale/ipp-strings.c:2364 +msgid "output-bin.mailbox-1" +msgstr "" + +#. TRANSLATORS: Mailbox 10 +#: locale/ipp-strings.c:2366 +msgid "output-bin.mailbox-10" +msgstr "" + +#. TRANSLATORS: Mailbox 2 +#: locale/ipp-strings.c:2368 +msgid "output-bin.mailbox-2" +msgstr "" + +#. TRANSLATORS: Mailbox 3 +#: locale/ipp-strings.c:2370 +msgid "output-bin.mailbox-3" +msgstr "" + +#. TRANSLATORS: Mailbox 4 +#: locale/ipp-strings.c:2372 +msgid "output-bin.mailbox-4" +msgstr "" + +#. TRANSLATORS: Mailbox 5 +#: locale/ipp-strings.c:2374 +msgid "output-bin.mailbox-5" +msgstr "" + +#. TRANSLATORS: Mailbox 6 +#: locale/ipp-strings.c:2376 +msgid "output-bin.mailbox-6" +msgstr "" + +#. TRANSLATORS: Mailbox 7 +#: locale/ipp-strings.c:2378 +msgid "output-bin.mailbox-7" +msgstr "" + +#. TRANSLATORS: Mailbox 8 +#: locale/ipp-strings.c:2380 +msgid "output-bin.mailbox-8" +msgstr "" + +#. TRANSLATORS: Mailbox 9 +#: locale/ipp-strings.c:2382 +msgid "output-bin.mailbox-9" +msgstr "" + +#. TRANSLATORS: Middle +#: locale/ipp-strings.c:2384 +msgid "output-bin.middle" +msgstr "" + +#. TRANSLATORS: My Mailbox +#: locale/ipp-strings.c:2386 +msgid "output-bin.my-mailbox" +msgstr "" + +#. TRANSLATORS: Rear +#: locale/ipp-strings.c:2388 +msgid "output-bin.rear" +msgstr "" + +#. TRANSLATORS: Right +#: locale/ipp-strings.c:2390 +msgid "output-bin.right" +msgstr "" + +#. TRANSLATORS: Side +#: locale/ipp-strings.c:2392 +msgid "output-bin.side" +msgstr "" + +#. TRANSLATORS: Stacker 1 +#: locale/ipp-strings.c:2394 +msgid "output-bin.stacker-1" +msgstr "" + +#. TRANSLATORS: Stacker 10 +#: locale/ipp-strings.c:2396 +msgid "output-bin.stacker-10" +msgstr "" + +#. TRANSLATORS: Stacker 2 +#: locale/ipp-strings.c:2398 +msgid "output-bin.stacker-2" +msgstr "" + +#. TRANSLATORS: Stacker 3 +#: locale/ipp-strings.c:2400 +msgid "output-bin.stacker-3" +msgstr "" + +#. TRANSLATORS: Stacker 4 +#: locale/ipp-strings.c:2402 +msgid "output-bin.stacker-4" +msgstr "" + +#. TRANSLATORS: Stacker 5 +#: locale/ipp-strings.c:2404 +msgid "output-bin.stacker-5" +msgstr "" + +#. TRANSLATORS: Stacker 6 +#: locale/ipp-strings.c:2406 +msgid "output-bin.stacker-6" +msgstr "" + +#. TRANSLATORS: Stacker 7 +#: locale/ipp-strings.c:2408 +msgid "output-bin.stacker-7" +msgstr "" + +#. TRANSLATORS: Stacker 8 +#: locale/ipp-strings.c:2410 +msgid "output-bin.stacker-8" +msgstr "" + +#. TRANSLATORS: Stacker 9 +#: locale/ipp-strings.c:2412 +msgid "output-bin.stacker-9" +msgstr "" + +#. TRANSLATORS: Top +#: locale/ipp-strings.c:2414 +msgid "output-bin.top" +msgstr "" + +#. TRANSLATORS: Tray 1 +#: locale/ipp-strings.c:2416 +msgid "output-bin.tray-1" +msgstr "" + +#. TRANSLATORS: Tray 10 +#: locale/ipp-strings.c:2418 +msgid "output-bin.tray-10" +msgstr "" + +#. TRANSLATORS: Tray 2 +#: locale/ipp-strings.c:2420 +msgid "output-bin.tray-2" +msgstr "" + +#. TRANSLATORS: Tray 3 +#: locale/ipp-strings.c:2422 +msgid "output-bin.tray-3" +msgstr "" + +#. TRANSLATORS: Tray 4 +#: locale/ipp-strings.c:2424 +msgid "output-bin.tray-4" +msgstr "" + +#. TRANSLATORS: Tray 5 +#: locale/ipp-strings.c:2426 +msgid "output-bin.tray-5" +msgstr "" + +#. TRANSLATORS: Tray 6 +#: locale/ipp-strings.c:2428 +msgid "output-bin.tray-6" +msgstr "" + +#. TRANSLATORS: Tray 7 +#: locale/ipp-strings.c:2430 +msgid "output-bin.tray-7" +msgstr "" + +#. TRANSLATORS: Tray 8 +#: locale/ipp-strings.c:2432 +msgid "output-bin.tray-8" +msgstr "" + +#. TRANSLATORS: Tray 9 +#: locale/ipp-strings.c:2434 +msgid "output-bin.tray-9" +msgstr "" + +#. TRANSLATORS: Scanned Image Quality +#: locale/ipp-strings.c:2436 +msgid "output-compression-quality-factor" +msgstr "" + +#. TRANSLATORS: Page Delivery +#: locale/ipp-strings.c:2438 +msgid "page-delivery" +msgstr "" + +#. TRANSLATORS: Reverse Order Face-down +#: locale/ipp-strings.c:2440 +msgid "page-delivery.reverse-order-face-down" +msgstr "" + +#. TRANSLATORS: Reverse Order Face-up +#: locale/ipp-strings.c:2442 +msgid "page-delivery.reverse-order-face-up" +msgstr "" + +#. TRANSLATORS: Same Order Face-down +#: locale/ipp-strings.c:2444 +msgid "page-delivery.same-order-face-down" +msgstr "" + +#. TRANSLATORS: Same Order Face-up +#: locale/ipp-strings.c:2446 +msgid "page-delivery.same-order-face-up" +msgstr "" + +#. TRANSLATORS: System Specified +#: locale/ipp-strings.c:2448 +msgid "page-delivery.system-specified" +msgstr "" + +#. TRANSLATORS: Page Order Received +#: locale/ipp-strings.c:2450 +msgid "page-order-received" +msgstr "" + +#. TRANSLATORS: 1 To N +#: locale/ipp-strings.c:2452 +msgid "page-order-received.1-to-n-order" +msgstr "" + +#. TRANSLATORS: N To 1 +#: locale/ipp-strings.c:2454 +msgid "page-order-received.n-to-1-order" +msgstr "" + +#. TRANSLATORS: Page Ranges +#: locale/ipp-strings.c:2456 +msgid "page-ranges" +msgstr "" + +#. TRANSLATORS: Pages +#: locale/ipp-strings.c:2458 +msgid "pages" +msgstr "" + +#. TRANSLATORS: Pages Per Subset +#: locale/ipp-strings.c:2460 +msgid "pages-per-subset" +msgstr "" + +#. TRANSLATORS: Pclm Raster Back Side +#: locale/ipp-strings.c:2462 +msgid "pclm-raster-back-side" +msgstr "" + +#. TRANSLATORS: Flipped +#: locale/ipp-strings.c:2464 +msgid "pclm-raster-back-side.flipped" +msgstr "" + +#. TRANSLATORS: Normal +#: locale/ipp-strings.c:2466 +msgid "pclm-raster-back-side.normal" +msgstr "" + +#. TRANSLATORS: Rotated +#: locale/ipp-strings.c:2468 +msgid "pclm-raster-back-side.rotated" +msgstr "" + +#. TRANSLATORS: Pclm Source Resolution +#: locale/ipp-strings.c:2470 +msgid "pclm-source-resolution" +msgstr "" + +#: cups/notify.c:74 +msgid "pending" +msgstr "" + +#. TRANSLATORS: Platform Shape +#: locale/ipp-strings.c:2472 +msgid "platform-shape" +msgstr "" + +#. TRANSLATORS: Round +#: locale/ipp-strings.c:2474 +msgid "platform-shape.ellipse" +msgstr "" + +#. TRANSLATORS: Rectangle +#: locale/ipp-strings.c:2476 +msgid "platform-shape.rectangle" +msgstr "" + +#. TRANSLATORS: Platform Temperature +#: locale/ipp-strings.c:2478 +msgid "platform-temperature" +msgstr "" + +#. TRANSLATORS: Post-dial String +#: locale/ipp-strings.c:2480 +msgid "post-dial-string" +msgstr "" + +#: ppdc/ppdc.cxx:102 ppdc/ppdpo.cxx:81 +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#: ppdc/ppdpo.cxx:124 +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:362 +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#: ppdc/ppdc-import.cxx:253 +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#: ppdc/ppdc-source.cxx:1748 +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1065 +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1985 +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2671 +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#: ppdc/ppdc-source.cxx:1650 +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:884 +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:907 +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:346 +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1045 +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:399 +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:387 +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:455 +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:444 +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:466 +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:647 +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2857 +#, c-format +msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:778 +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1029 +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1641 +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1157 +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2570 +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1454 +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1633 +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:305 +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3229 +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1010 +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3060 +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3093 +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3183 +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3246 +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1108 +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1197 +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1734 +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:431 +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1526 +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1560 +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1538 +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1717 +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#: ppdc/ppdc-catalog.cxx:385 ppdc/ppdc-catalog.cxx:397 +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:956 +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:524 +#, c-format +msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1815 +#, c-format +msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:313 +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1053 +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2746 +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3349 +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:680 +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:324 +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1037 +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:179 +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#: ppdc/ppdc-source.cxx:924 +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:916 +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:932 +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1580 +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1552 +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc.cxx:240 ppdc/ppdpo.cxx:111 +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#: ppdc/ppdc.cxx:176 +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#: ppdc/ppdc.cxx:115 +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#: ppdc/ppdc-source.cxx:2363 ppdc/ppdc-source.cxx:2595 +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#: ppdc/ppdc-source.cxx:2464 ppdc/ppdc-source.cxx:2499 +#: ppdc/ppdc-source.cxx:2529 +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#: ppdc/ppdc-catalog.cxx:462 +#, c-format +msgid "ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#: ppdc/ppdc-driver.cxx:707 +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1603 ppdc/ppdc-source.cxx:2834 +#: ppdc/ppdc-source.cxx:2920 ppdc/ppdc-source.cxx:3013 +#: ppdc/ppdc-source.cxx:3146 ppdc/ppdc-source.cxx:3279 +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1596 +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:657 +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2446 +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#: ppdc/ppdc.cxx:363 +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#: ppdc/ppdc.cxx:255 +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#: ppdc/ppdc.cxx:276 +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#: ppdc/ppdc.cxx:292 ppdc/ppdc.cxx:298 +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#: ppdc/ppdc-source.cxx:1682 +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2602 +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc.cxx:187 +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#: ppdc/ppdc.cxx:124 +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#: ppdc/ppdc-file.cxx:37 +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#: ppdc/ppdc-source.cxx:2006 +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#: ppdc/ppdc-catalog.cxx:479 +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2876 +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:858 +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3106 +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-catalog.cxx:507 +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#: ppdc/ppdc-source.cxx:3360 +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:966 +#, c-format +msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2116 +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#: ppdc/ppdc.cxx:354 +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#: ppdc/ppdc.cxx:369 +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#: ppdc/ppdc.cxx:137 +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#: ppdc/ppdmerge.cxx:126 +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#: ppdc/ppdmerge.cxx:163 +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#: ppdc/ppdmerge.cxx:147 +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#. TRANSLATORS: Pre-dial String +#: locale/ipp-strings.c:2482 +msgid "pre-dial-string" +msgstr "" + +#. TRANSLATORS: Number-Up Layout +#: locale/ipp-strings.c:2484 +msgid "presentation-direction-number-up" +msgstr "" + +#. TRANSLATORS: Top-bottom, Right-left +#: locale/ipp-strings.c:2486 +msgid "presentation-direction-number-up.tobottom-toleft" +msgstr "" + +#. TRANSLATORS: Top-bottom, Left-right +#: locale/ipp-strings.c:2488 +msgid "presentation-direction-number-up.tobottom-toright" +msgstr "" + +#. TRANSLATORS: Right-left, Top-bottom +#: locale/ipp-strings.c:2490 +msgid "presentation-direction-number-up.toleft-tobottom" +msgstr "" + +#. TRANSLATORS: Right-left, Bottom-top +#: locale/ipp-strings.c:2492 +msgid "presentation-direction-number-up.toleft-totop" +msgstr "" + +#. TRANSLATORS: Left-right, Top-bottom +#: locale/ipp-strings.c:2494 +msgid "presentation-direction-number-up.toright-tobottom" +msgstr "" + +#. TRANSLATORS: Left-right, Bottom-top +#: locale/ipp-strings.c:2496 +msgid "presentation-direction-number-up.toright-totop" +msgstr "" + +#. TRANSLATORS: Bottom-top, Right-left +#: locale/ipp-strings.c:2498 +msgid "presentation-direction-number-up.totop-toleft" +msgstr "" + +#. TRANSLATORS: Bottom-top, Left-right +#: locale/ipp-strings.c:2500 +msgid "presentation-direction-number-up.totop-toright" +msgstr "" + +#. TRANSLATORS: Print Accuracy +#: locale/ipp-strings.c:2502 +msgid "print-accuracy" +msgstr "" + +#. TRANSLATORS: Print Base +#: locale/ipp-strings.c:2504 +msgid "print-base" +msgstr "" + +#. TRANSLATORS: Print Base Actual +#: locale/ipp-strings.c:2506 +msgid "print-base-actual" +msgstr "" + +#. TRANSLATORS: Brim +#: locale/ipp-strings.c:2508 +msgid "print-base.brim" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:2510 +msgid "print-base.none" +msgstr "" + +#. TRANSLATORS: Raft +#: locale/ipp-strings.c:2512 +msgid "print-base.raft" +msgstr "" + +#. TRANSLATORS: Skirt +#: locale/ipp-strings.c:2514 +msgid "print-base.skirt" +msgstr "" + +#. TRANSLATORS: Standard +#: locale/ipp-strings.c:2516 +msgid "print-base.standard" +msgstr "" + +#. TRANSLATORS: Print Color Mode +#: locale/ipp-strings.c:2518 +msgid "print-color-mode" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:2520 +msgid "print-color-mode.auto" +msgstr "" + +#. TRANSLATORS: Auto Monochrome +#: locale/ipp-strings.c:2522 +msgid "print-color-mode.auto-monochrome" +msgstr "" + +#. TRANSLATORS: Text +#: locale/ipp-strings.c:2524 +msgid "print-color-mode.bi-level" +msgstr "" + +#. TRANSLATORS: Color +#: locale/ipp-strings.c:2526 +msgid "print-color-mode.color" +msgstr "" + +#. TRANSLATORS: Highlight +#: locale/ipp-strings.c:2528 +msgid "print-color-mode.highlight" +msgstr "" + +#. TRANSLATORS: Monochrome +#: locale/ipp-strings.c:2530 +msgid "print-color-mode.monochrome" +msgstr "" + +#. TRANSLATORS: Process Text +#: locale/ipp-strings.c:2532 +msgid "print-color-mode.process-bi-level" +msgstr "" + +#. TRANSLATORS: Process Monochrome +#: locale/ipp-strings.c:2534 +msgid "print-color-mode.process-monochrome" +msgstr "" + +#. TRANSLATORS: Print Optimization +#: locale/ipp-strings.c:2536 +msgid "print-content-optimize" +msgstr "" + +#. TRANSLATORS: Print Content Optimize Actual +#: locale/ipp-strings.c:2538 +msgid "print-content-optimize-actual" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:2540 +msgid "print-content-optimize.auto" +msgstr "" + +#. TRANSLATORS: Graphics +#: locale/ipp-strings.c:2542 +msgid "print-content-optimize.graphic" +msgstr "" + +#. TRANSLATORS: Graphics +#: locale/ipp-strings.c:2544 +msgid "print-content-optimize.graphics" +msgstr "" + +#. TRANSLATORS: Photo +#: locale/ipp-strings.c:2546 +msgid "print-content-optimize.photo" +msgstr "" + +#. TRANSLATORS: Text +#: locale/ipp-strings.c:2548 +msgid "print-content-optimize.text" +msgstr "" + +#. TRANSLATORS: Text and Graphics +#: locale/ipp-strings.c:2550 +msgid "print-content-optimize.text-and-graphic" +msgstr "" + +#. TRANSLATORS: Text And Graphics +#: locale/ipp-strings.c:2552 +msgid "print-content-optimize.text-and-graphics" +msgstr "" + +#. TRANSLATORS: Print Objects +#: locale/ipp-strings.c:2554 +msgid "print-objects" +msgstr "" + +#. TRANSLATORS: Print Quality +#: locale/ipp-strings.c:2556 +msgid "print-quality" +msgstr "" + +#. TRANSLATORS: Draft +#: locale/ipp-strings.c:2558 +msgid "print-quality.3" +msgstr "" + +#. TRANSLATORS: Normal +#: locale/ipp-strings.c:2560 +msgid "print-quality.4" +msgstr "" + +#. TRANSLATORS: High +#: locale/ipp-strings.c:2562 +msgid "print-quality.5" +msgstr "" + +#. TRANSLATORS: Print Rendering Intent +#: locale/ipp-strings.c:2564 +msgid "print-rendering-intent" +msgstr "" + +#. TRANSLATORS: Absolute +#: locale/ipp-strings.c:2566 +msgid "print-rendering-intent.absolute" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:2568 +msgid "print-rendering-intent.auto" +msgstr "" + +#. TRANSLATORS: Perceptual +#: locale/ipp-strings.c:2570 +msgid "print-rendering-intent.perceptual" +msgstr "" + +#. TRANSLATORS: Relative +#: locale/ipp-strings.c:2572 +msgid "print-rendering-intent.relative" +msgstr "" + +#. TRANSLATORS: Relative w/Black Point Compensation +#: locale/ipp-strings.c:2574 +msgid "print-rendering-intent.relative-bpc" +msgstr "" + +#. TRANSLATORS: Saturation +#: locale/ipp-strings.c:2576 +msgid "print-rendering-intent.saturation" +msgstr "" + +#. TRANSLATORS: Print Scaling +#: locale/ipp-strings.c:2578 +msgid "print-scaling" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:2580 +msgid "print-scaling.auto" +msgstr "" + +#. TRANSLATORS: Auto-fit +#: locale/ipp-strings.c:2582 +msgid "print-scaling.auto-fit" +msgstr "" + +#. TRANSLATORS: Fill +#: locale/ipp-strings.c:2584 +msgid "print-scaling.fill" +msgstr "" + +#. TRANSLATORS: Fit +#: locale/ipp-strings.c:2586 +msgid "print-scaling.fit" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:2588 +msgid "print-scaling.none" +msgstr "" + +#. TRANSLATORS: Print Supports +#: locale/ipp-strings.c:2590 +msgid "print-supports" +msgstr "" + +#. TRANSLATORS: Print Supports Actual +#: locale/ipp-strings.c:2592 +msgid "print-supports-actual" +msgstr "" + +#. TRANSLATORS: With Specified Material +#: locale/ipp-strings.c:2594 +msgid "print-supports.material" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:2596 +msgid "print-supports.none" +msgstr "" + +#. TRANSLATORS: Standard +#: locale/ipp-strings.c:2598 +msgid "print-supports.standard" +msgstr "" + +#: systemv/lpstat.c:1786 +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#: systemv/lpstat.c:1778 +#, c-format +msgid "printer %s is holding new jobs. enabled since %s" +msgstr "" + +#: systemv/lpstat.c:1780 +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#: systemv/lpstat.c:1783 +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#: systemv/lpstat.c:1904 +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#: systemv/lpstat.c:1890 +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#: systemv/lpstat.c:1897 +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +#. TRANSLATORS: Printer Kind +#: locale/ipp-strings.c:2600 +msgid "printer-kind" +msgstr "" + +#. TRANSLATORS: Disc +#: locale/ipp-strings.c:2602 +msgid "printer-kind.disc" +msgstr "" + +#. TRANSLATORS: Document +#: locale/ipp-strings.c:2604 +msgid "printer-kind.document" +msgstr "" + +#. TRANSLATORS: Envelope +#: locale/ipp-strings.c:2606 +msgid "printer-kind.envelope" +msgstr "" + +#. TRANSLATORS: Label +#: locale/ipp-strings.c:2608 +msgid "printer-kind.label" +msgstr "" + +#. TRANSLATORS: Large Format +#: locale/ipp-strings.c:2610 +msgid "printer-kind.large-format" +msgstr "" + +#. TRANSLATORS: Photo +#: locale/ipp-strings.c:2612 +msgid "printer-kind.photo" +msgstr "" + +#. TRANSLATORS: Postcard +#: locale/ipp-strings.c:2614 +msgid "printer-kind.postcard" +msgstr "" + +#. TRANSLATORS: Receipt +#: locale/ipp-strings.c:2616 +msgid "printer-kind.receipt" +msgstr "" + +#. TRANSLATORS: Roll +#: locale/ipp-strings.c:2618 +msgid "printer-kind.roll" +msgstr "" + +#. TRANSLATORS: Message From Operator +#: locale/ipp-strings.c:2620 +msgid "printer-message-from-operator" +msgstr "" + +#. TRANSLATORS: Print Resolution +#: locale/ipp-strings.c:2622 +msgid "printer-resolution" +msgstr "" + +#. TRANSLATORS: Printer State +#: locale/ipp-strings.c:2624 +msgid "printer-state" +msgstr "" + +#. TRANSLATORS: Detailed Printer State +#: locale/ipp-strings.c:2626 +msgid "printer-state-reasons" +msgstr "" + +#. TRANSLATORS: Old Alerts Have Been Removed +#: locale/ipp-strings.c:2628 +msgid "printer-state-reasons.alert-removal-of-binary-change-entry" +msgstr "" + +#. TRANSLATORS: Bander Added +#: locale/ipp-strings.c:2630 +msgid "printer-state-reasons.bander-added" +msgstr "" + +#. TRANSLATORS: Bander Almost Empty +#: locale/ipp-strings.c:2632 +msgid "printer-state-reasons.bander-almost-empty" +msgstr "" + +#. TRANSLATORS: Bander Almost Full +#: locale/ipp-strings.c:2634 +msgid "printer-state-reasons.bander-almost-full" +msgstr "" + +#. TRANSLATORS: Bander At Limit +#: locale/ipp-strings.c:2636 +msgid "printer-state-reasons.bander-at-limit" +msgstr "" + +#. TRANSLATORS: Bander Closed +#: locale/ipp-strings.c:2638 +msgid "printer-state-reasons.bander-closed" +msgstr "" + +#. TRANSLATORS: Bander Configuration Change +#: locale/ipp-strings.c:2640 +msgid "printer-state-reasons.bander-configuration-change" +msgstr "" + +#. TRANSLATORS: Bander Cover Closed +#: locale/ipp-strings.c:2642 +msgid "printer-state-reasons.bander-cover-closed" +msgstr "" + +#. TRANSLATORS: Bander Cover Open +#: locale/ipp-strings.c:2644 +msgid "printer-state-reasons.bander-cover-open" +msgstr "" + +#. TRANSLATORS: Bander Empty +#: locale/ipp-strings.c:2646 +msgid "printer-state-reasons.bander-empty" +msgstr "" + +#. TRANSLATORS: Bander Full +#: locale/ipp-strings.c:2648 +msgid "printer-state-reasons.bander-full" +msgstr "" + +#. TRANSLATORS: Bander Interlock Closed +#: locale/ipp-strings.c:2650 +msgid "printer-state-reasons.bander-interlock-closed" +msgstr "" + +#. TRANSLATORS: Bander Interlock Open +#: locale/ipp-strings.c:2652 +msgid "printer-state-reasons.bander-interlock-open" +msgstr "" + +#. TRANSLATORS: Bander Jam +#: locale/ipp-strings.c:2654 +msgid "printer-state-reasons.bander-jam" +msgstr "" + +#. TRANSLATORS: Bander Life Almost Over +#: locale/ipp-strings.c:2656 +msgid "printer-state-reasons.bander-life-almost-over" +msgstr "" + +#. TRANSLATORS: Bander Life Over +#: locale/ipp-strings.c:2658 +msgid "printer-state-reasons.bander-life-over" +msgstr "" + +#. TRANSLATORS: Bander Memory Exhausted +#: locale/ipp-strings.c:2660 +msgid "printer-state-reasons.bander-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Bander Missing +#: locale/ipp-strings.c:2662 +msgid "printer-state-reasons.bander-missing" +msgstr "" + +#. TRANSLATORS: Bander Motor Failure +#: locale/ipp-strings.c:2664 +msgid "printer-state-reasons.bander-motor-failure" +msgstr "" + +#. TRANSLATORS: Bander Near Limit +#: locale/ipp-strings.c:2666 +msgid "printer-state-reasons.bander-near-limit" +msgstr "" + +#. TRANSLATORS: Bander Offline +#: locale/ipp-strings.c:2668 +msgid "printer-state-reasons.bander-offline" +msgstr "" + +#. TRANSLATORS: Bander Opened +#: locale/ipp-strings.c:2670 +msgid "printer-state-reasons.bander-opened" +msgstr "" + +#. TRANSLATORS: Bander Over Temperature +#: locale/ipp-strings.c:2672 +msgid "printer-state-reasons.bander-over-temperature" +msgstr "" + +#. TRANSLATORS: Bander Power Saver +#: locale/ipp-strings.c:2674 +msgid "printer-state-reasons.bander-power-saver" +msgstr "" + +#. TRANSLATORS: Bander Recoverable Failure +#: locale/ipp-strings.c:2676 +msgid "printer-state-reasons.bander-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Bander Recoverable Storage +#: locale/ipp-strings.c:2678 +msgid "printer-state-reasons.bander-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Bander Removed +#: locale/ipp-strings.c:2680 +msgid "printer-state-reasons.bander-removed" +msgstr "" + +#. TRANSLATORS: Bander Resource Added +#: locale/ipp-strings.c:2682 +msgid "printer-state-reasons.bander-resource-added" +msgstr "" + +#. TRANSLATORS: Bander Resource Removed +#: locale/ipp-strings.c:2684 +msgid "printer-state-reasons.bander-resource-removed" +msgstr "" + +#. TRANSLATORS: Bander Thermistor Failure +#: locale/ipp-strings.c:2686 +msgid "printer-state-reasons.bander-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Bander Timing Failure +#: locale/ipp-strings.c:2688 +msgid "printer-state-reasons.bander-timing-failure" +msgstr "" + +#. TRANSLATORS: Bander Turned Off +#: locale/ipp-strings.c:2690 +msgid "printer-state-reasons.bander-turned-off" +msgstr "" + +#. TRANSLATORS: Bander Turned On +#: locale/ipp-strings.c:2692 +msgid "printer-state-reasons.bander-turned-on" +msgstr "" + +#. TRANSLATORS: Bander Under Temperature +#: locale/ipp-strings.c:2694 +msgid "printer-state-reasons.bander-under-temperature" +msgstr "" + +#. TRANSLATORS: Bander Unrecoverable Failure +#: locale/ipp-strings.c:2696 +msgid "printer-state-reasons.bander-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Bander Unrecoverable Storage Error +#: locale/ipp-strings.c:2698 +msgid "printer-state-reasons.bander-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Bander Warming Up +#: locale/ipp-strings.c:2700 +msgid "printer-state-reasons.bander-warming-up" +msgstr "" + +#. TRANSLATORS: Binder Added +#: locale/ipp-strings.c:2702 +msgid "printer-state-reasons.binder-added" +msgstr "" + +#. TRANSLATORS: Binder Almost Empty +#: locale/ipp-strings.c:2704 +msgid "printer-state-reasons.binder-almost-empty" +msgstr "" + +#. TRANSLATORS: Binder Almost Full +#: locale/ipp-strings.c:2706 +msgid "printer-state-reasons.binder-almost-full" +msgstr "" + +#. TRANSLATORS: Binder At Limit +#: locale/ipp-strings.c:2708 +msgid "printer-state-reasons.binder-at-limit" +msgstr "" + +#. TRANSLATORS: Binder Closed +#: locale/ipp-strings.c:2710 +msgid "printer-state-reasons.binder-closed" +msgstr "" + +#. TRANSLATORS: Binder Configuration Change +#: locale/ipp-strings.c:2712 +msgid "printer-state-reasons.binder-configuration-change" +msgstr "" + +#. TRANSLATORS: Binder Cover Closed +#: locale/ipp-strings.c:2714 +msgid "printer-state-reasons.binder-cover-closed" +msgstr "" + +#. TRANSLATORS: Binder Cover Open +#: locale/ipp-strings.c:2716 +msgid "printer-state-reasons.binder-cover-open" +msgstr "" + +#. TRANSLATORS: Binder Empty +#: locale/ipp-strings.c:2718 +msgid "printer-state-reasons.binder-empty" +msgstr "" + +#. TRANSLATORS: Binder Full +#: locale/ipp-strings.c:2720 +msgid "printer-state-reasons.binder-full" +msgstr "" + +#. TRANSLATORS: Binder Interlock Closed +#: locale/ipp-strings.c:2722 +msgid "printer-state-reasons.binder-interlock-closed" +msgstr "" + +#. TRANSLATORS: Binder Interlock Open +#: locale/ipp-strings.c:2724 +msgid "printer-state-reasons.binder-interlock-open" +msgstr "" + +#. TRANSLATORS: Binder Jam +#: locale/ipp-strings.c:2726 +msgid "printer-state-reasons.binder-jam" +msgstr "" + +#. TRANSLATORS: Binder Life Almost Over +#: locale/ipp-strings.c:2728 +msgid "printer-state-reasons.binder-life-almost-over" +msgstr "" + +#. TRANSLATORS: Binder Life Over +#: locale/ipp-strings.c:2730 +msgid "printer-state-reasons.binder-life-over" +msgstr "" + +#. TRANSLATORS: Binder Memory Exhausted +#: locale/ipp-strings.c:2732 +msgid "printer-state-reasons.binder-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Binder Missing +#: locale/ipp-strings.c:2734 +msgid "printer-state-reasons.binder-missing" +msgstr "" + +#. TRANSLATORS: Binder Motor Failure +#: locale/ipp-strings.c:2736 +msgid "printer-state-reasons.binder-motor-failure" +msgstr "" + +#. TRANSLATORS: Binder Near Limit +#: locale/ipp-strings.c:2738 +msgid "printer-state-reasons.binder-near-limit" +msgstr "" + +#. TRANSLATORS: Binder Offline +#: locale/ipp-strings.c:2740 +msgid "printer-state-reasons.binder-offline" +msgstr "" + +#. TRANSLATORS: Binder Opened +#: locale/ipp-strings.c:2742 +msgid "printer-state-reasons.binder-opened" +msgstr "" + +#. TRANSLATORS: Binder Over Temperature +#: locale/ipp-strings.c:2744 +msgid "printer-state-reasons.binder-over-temperature" +msgstr "" + +#. TRANSLATORS: Binder Power Saver +#: locale/ipp-strings.c:2746 +msgid "printer-state-reasons.binder-power-saver" +msgstr "" + +#. TRANSLATORS: Binder Recoverable Failure +#: locale/ipp-strings.c:2748 +msgid "printer-state-reasons.binder-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Binder Recoverable Storage +#: locale/ipp-strings.c:2750 +msgid "printer-state-reasons.binder-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Binder Removed +#: locale/ipp-strings.c:2752 +msgid "printer-state-reasons.binder-removed" +msgstr "" + +#. TRANSLATORS: Binder Resource Added +#: locale/ipp-strings.c:2754 +msgid "printer-state-reasons.binder-resource-added" +msgstr "" + +#. TRANSLATORS: Binder Resource Removed +#: locale/ipp-strings.c:2756 +msgid "printer-state-reasons.binder-resource-removed" +msgstr "" + +#. TRANSLATORS: Binder Thermistor Failure +#: locale/ipp-strings.c:2758 +msgid "printer-state-reasons.binder-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Binder Timing Failure +#: locale/ipp-strings.c:2760 +msgid "printer-state-reasons.binder-timing-failure" +msgstr "" + +#. TRANSLATORS: Binder Turned Off +#: locale/ipp-strings.c:2762 +msgid "printer-state-reasons.binder-turned-off" +msgstr "" + +#. TRANSLATORS: Binder Turned On +#: locale/ipp-strings.c:2764 +msgid "printer-state-reasons.binder-turned-on" +msgstr "" + +#. TRANSLATORS: Binder Under Temperature +#: locale/ipp-strings.c:2766 +msgid "printer-state-reasons.binder-under-temperature" +msgstr "" + +#. TRANSLATORS: Binder Unrecoverable Failure +#: locale/ipp-strings.c:2768 +msgid "printer-state-reasons.binder-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Binder Unrecoverable Storage Error +#: locale/ipp-strings.c:2770 +msgid "printer-state-reasons.binder-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Binder Warming Up +#: locale/ipp-strings.c:2772 +msgid "printer-state-reasons.binder-warming-up" +msgstr "" + +#. TRANSLATORS: Camera Failure +#: locale/ipp-strings.c:2774 +msgid "printer-state-reasons.camera-failure" +msgstr "" + +#. TRANSLATORS: Chamber Cooling +#: locale/ipp-strings.c:2776 +msgid "printer-state-reasons.chamber-cooling" +msgstr "" + +#. TRANSLATORS: Chamber Failure +#: locale/ipp-strings.c:2778 +msgid "printer-state-reasons.chamber-failure" +msgstr "" + +#. TRANSLATORS: Chamber Heating +#: locale/ipp-strings.c:2780 +msgid "printer-state-reasons.chamber-heating" +msgstr "" + +#. TRANSLATORS: Chamber Temperature High +#: locale/ipp-strings.c:2782 +msgid "printer-state-reasons.chamber-temperature-high" +msgstr "" + +#. TRANSLATORS: Chamber Temperature Low +#: locale/ipp-strings.c:2784 +msgid "printer-state-reasons.chamber-temperature-low" +msgstr "" + +#. TRANSLATORS: Cleaner Life Almost Over +#: locale/ipp-strings.c:2786 +msgid "printer-state-reasons.cleaner-life-almost-over" +msgstr "" + +#. TRANSLATORS: Cleaner Life Over +#: locale/ipp-strings.c:2788 +msgid "printer-state-reasons.cleaner-life-over" +msgstr "" + +#. TRANSLATORS: Configuration Change +#: locale/ipp-strings.c:2790 +msgid "printer-state-reasons.configuration-change" +msgstr "" + +#. TRANSLATORS: Connecting To Device +#: locale/ipp-strings.c:2792 +msgid "printer-state-reasons.connecting-to-device" +msgstr "" + +#. TRANSLATORS: Cover Open +#: locale/ipp-strings.c:2794 +msgid "printer-state-reasons.cover-open" +msgstr "" + +#. TRANSLATORS: Deactivated +#: locale/ipp-strings.c:2796 +msgid "printer-state-reasons.deactivated" +msgstr "" + +#. TRANSLATORS: Developer Empty +#: locale/ipp-strings.c:2798 +msgid "printer-state-reasons.developer-empty" +msgstr "" + +#. TRANSLATORS: Developer Low +#: locale/ipp-strings.c:2800 +msgid "printer-state-reasons.developer-low" +msgstr "" + +#. TRANSLATORS: Die Cutter Added +#: locale/ipp-strings.c:2802 +msgid "printer-state-reasons.die-cutter-added" +msgstr "" + +#. TRANSLATORS: Die Cutter Almost Empty +#: locale/ipp-strings.c:2804 +msgid "printer-state-reasons.die-cutter-almost-empty" +msgstr "" + +#. TRANSLATORS: Die Cutter Almost Full +#: locale/ipp-strings.c:2806 +msgid "printer-state-reasons.die-cutter-almost-full" +msgstr "" + +#. TRANSLATORS: Die Cutter At Limit +#: locale/ipp-strings.c:2808 +msgid "printer-state-reasons.die-cutter-at-limit" +msgstr "" + +#. TRANSLATORS: Die Cutter Closed +#: locale/ipp-strings.c:2810 +msgid "printer-state-reasons.die-cutter-closed" +msgstr "" + +#. TRANSLATORS: Die Cutter Configuration Change +#: locale/ipp-strings.c:2812 +msgid "printer-state-reasons.die-cutter-configuration-change" +msgstr "" + +#. TRANSLATORS: Die Cutter Cover Closed +#: locale/ipp-strings.c:2814 +msgid "printer-state-reasons.die-cutter-cover-closed" +msgstr "" + +#. TRANSLATORS: Die Cutter Cover Open +#: locale/ipp-strings.c:2816 +msgid "printer-state-reasons.die-cutter-cover-open" +msgstr "" + +#. TRANSLATORS: Die Cutter Empty +#: locale/ipp-strings.c:2818 +msgid "printer-state-reasons.die-cutter-empty" +msgstr "" + +#. TRANSLATORS: Die Cutter Full +#: locale/ipp-strings.c:2820 +msgid "printer-state-reasons.die-cutter-full" +msgstr "" + +#. TRANSLATORS: Die Cutter Interlock Closed +#: locale/ipp-strings.c:2822 +msgid "printer-state-reasons.die-cutter-interlock-closed" +msgstr "" + +#. TRANSLATORS: Die Cutter Interlock Open +#: locale/ipp-strings.c:2824 +msgid "printer-state-reasons.die-cutter-interlock-open" +msgstr "" + +#. TRANSLATORS: Die Cutter Jam +#: locale/ipp-strings.c:2826 +msgid "printer-state-reasons.die-cutter-jam" +msgstr "" + +#. TRANSLATORS: Die Cutter Life Almost Over +#: locale/ipp-strings.c:2828 +msgid "printer-state-reasons.die-cutter-life-almost-over" +msgstr "" + +#. TRANSLATORS: Die Cutter Life Over +#: locale/ipp-strings.c:2830 +msgid "printer-state-reasons.die-cutter-life-over" +msgstr "" + +#. TRANSLATORS: Die Cutter Memory Exhausted +#: locale/ipp-strings.c:2832 +msgid "printer-state-reasons.die-cutter-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Die Cutter Missing +#: locale/ipp-strings.c:2834 +msgid "printer-state-reasons.die-cutter-missing" +msgstr "" + +#. TRANSLATORS: Die Cutter Motor Failure +#: locale/ipp-strings.c:2836 +msgid "printer-state-reasons.die-cutter-motor-failure" +msgstr "" + +#. TRANSLATORS: Die Cutter Near Limit +#: locale/ipp-strings.c:2838 +msgid "printer-state-reasons.die-cutter-near-limit" +msgstr "" + +#. TRANSLATORS: Die Cutter Offline +#: locale/ipp-strings.c:2840 +msgid "printer-state-reasons.die-cutter-offline" +msgstr "" + +#. TRANSLATORS: Die Cutter Opened +#: locale/ipp-strings.c:2842 +msgid "printer-state-reasons.die-cutter-opened" +msgstr "" + +#. TRANSLATORS: Die Cutter Over Temperature +#: locale/ipp-strings.c:2844 +msgid "printer-state-reasons.die-cutter-over-temperature" +msgstr "" + +#. TRANSLATORS: Die Cutter Power Saver +#: locale/ipp-strings.c:2846 +msgid "printer-state-reasons.die-cutter-power-saver" +msgstr "" + +#. TRANSLATORS: Die Cutter Recoverable Failure +#: locale/ipp-strings.c:2848 +msgid "printer-state-reasons.die-cutter-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Die Cutter Recoverable Storage +#: locale/ipp-strings.c:2850 +msgid "printer-state-reasons.die-cutter-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Die Cutter Removed +#: locale/ipp-strings.c:2852 +msgid "printer-state-reasons.die-cutter-removed" +msgstr "" + +#. TRANSLATORS: Die Cutter Resource Added +#: locale/ipp-strings.c:2854 +msgid "printer-state-reasons.die-cutter-resource-added" +msgstr "" + +#. TRANSLATORS: Die Cutter Resource Removed +#: locale/ipp-strings.c:2856 +msgid "printer-state-reasons.die-cutter-resource-removed" +msgstr "" + +#. TRANSLATORS: Die Cutter Thermistor Failure +#: locale/ipp-strings.c:2858 +msgid "printer-state-reasons.die-cutter-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Die Cutter Timing Failure +#: locale/ipp-strings.c:2860 +msgid "printer-state-reasons.die-cutter-timing-failure" +msgstr "" + +#. TRANSLATORS: Die Cutter Turned Off +#: locale/ipp-strings.c:2862 +msgid "printer-state-reasons.die-cutter-turned-off" +msgstr "" + +#. TRANSLATORS: Die Cutter Turned On +#: locale/ipp-strings.c:2864 +msgid "printer-state-reasons.die-cutter-turned-on" +msgstr "" + +#. TRANSLATORS: Die Cutter Under Temperature +#: locale/ipp-strings.c:2866 +msgid "printer-state-reasons.die-cutter-under-temperature" +msgstr "" + +#. TRANSLATORS: Die Cutter Unrecoverable Failure +#: locale/ipp-strings.c:2868 +msgid "printer-state-reasons.die-cutter-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Die Cutter Unrecoverable Storage Error +#: locale/ipp-strings.c:2870 +msgid "printer-state-reasons.die-cutter-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Die Cutter Warming Up +#: locale/ipp-strings.c:2872 +msgid "printer-state-reasons.die-cutter-warming-up" +msgstr "" + +#. TRANSLATORS: Door Open +#: locale/ipp-strings.c:2874 +msgid "printer-state-reasons.door-open" +msgstr "" + +#. TRANSLATORS: Extruder Cooling +#: locale/ipp-strings.c:2876 +msgid "printer-state-reasons.extruder-cooling" +msgstr "" + +#. TRANSLATORS: Extruder Failure +#: locale/ipp-strings.c:2878 +msgid "printer-state-reasons.extruder-failure" +msgstr "" + +#. TRANSLATORS: Extruder Heating +#: locale/ipp-strings.c:2880 +msgid "printer-state-reasons.extruder-heating" +msgstr "" + +#. TRANSLATORS: Extruder Jam +#: locale/ipp-strings.c:2882 +msgid "printer-state-reasons.extruder-jam" +msgstr "" + +#. TRANSLATORS: Extruder Temperature High +#: locale/ipp-strings.c:2884 +msgid "printer-state-reasons.extruder-temperature-high" +msgstr "" + +#. TRANSLATORS: Extruder Temperature Low +#: locale/ipp-strings.c:2886 +msgid "printer-state-reasons.extruder-temperature-low" +msgstr "" + +#. TRANSLATORS: Fan Failure +#: locale/ipp-strings.c:2888 +msgid "printer-state-reasons.fan-failure" +msgstr "" + +#. TRANSLATORS: Fax Modem Life Almost Over +#: locale/ipp-strings.c:2890 +msgid "printer-state-reasons.fax-modem-life-almost-over" +msgstr "" + +#. TRANSLATORS: Fax Modem Life Over +#: locale/ipp-strings.c:2892 +msgid "printer-state-reasons.fax-modem-life-over" +msgstr "" + +#. TRANSLATORS: Fax Modem Missing +#: locale/ipp-strings.c:2894 +msgid "printer-state-reasons.fax-modem-missing" +msgstr "" + +#. TRANSLATORS: Fax Modem Turned Off +#: locale/ipp-strings.c:2896 +msgid "printer-state-reasons.fax-modem-turned-off" +msgstr "" + +#. TRANSLATORS: Fax Modem Turned On +#: locale/ipp-strings.c:2898 +msgid "printer-state-reasons.fax-modem-turned-on" +msgstr "" + +#. TRANSLATORS: Folder Added +#: locale/ipp-strings.c:2900 +msgid "printer-state-reasons.folder-added" +msgstr "" + +#. TRANSLATORS: Folder Almost Empty +#: locale/ipp-strings.c:2902 +msgid "printer-state-reasons.folder-almost-empty" +msgstr "" + +#. TRANSLATORS: Folder Almost Full +#: locale/ipp-strings.c:2904 +msgid "printer-state-reasons.folder-almost-full" +msgstr "" + +#. TRANSLATORS: Folder At Limit +#: locale/ipp-strings.c:2906 +msgid "printer-state-reasons.folder-at-limit" +msgstr "" + +#. TRANSLATORS: Folder Closed +#: locale/ipp-strings.c:2908 +msgid "printer-state-reasons.folder-closed" +msgstr "" + +#. TRANSLATORS: Folder Configuration Change +#: locale/ipp-strings.c:2910 +msgid "printer-state-reasons.folder-configuration-change" +msgstr "" + +#. TRANSLATORS: Folder Cover Closed +#: locale/ipp-strings.c:2912 +msgid "printer-state-reasons.folder-cover-closed" +msgstr "" + +#. TRANSLATORS: Folder Cover Open +#: locale/ipp-strings.c:2914 +msgid "printer-state-reasons.folder-cover-open" +msgstr "" + +#. TRANSLATORS: Folder Empty +#: locale/ipp-strings.c:2916 +msgid "printer-state-reasons.folder-empty" +msgstr "" + +#. TRANSLATORS: Folder Full +#: locale/ipp-strings.c:2918 +msgid "printer-state-reasons.folder-full" +msgstr "" + +#. TRANSLATORS: Folder Interlock Closed +#: locale/ipp-strings.c:2920 +msgid "printer-state-reasons.folder-interlock-closed" +msgstr "" + +#. TRANSLATORS: Folder Interlock Open +#: locale/ipp-strings.c:2922 +msgid "printer-state-reasons.folder-interlock-open" +msgstr "" + +#. TRANSLATORS: Folder Jam +#: locale/ipp-strings.c:2924 +msgid "printer-state-reasons.folder-jam" +msgstr "" + +#. TRANSLATORS: Folder Life Almost Over +#: locale/ipp-strings.c:2926 +msgid "printer-state-reasons.folder-life-almost-over" +msgstr "" + +#. TRANSLATORS: Folder Life Over +#: locale/ipp-strings.c:2928 +msgid "printer-state-reasons.folder-life-over" +msgstr "" + +#. TRANSLATORS: Folder Memory Exhausted +#: locale/ipp-strings.c:2930 +msgid "printer-state-reasons.folder-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Folder Missing +#: locale/ipp-strings.c:2932 +msgid "printer-state-reasons.folder-missing" +msgstr "" + +#. TRANSLATORS: Folder Motor Failure +#: locale/ipp-strings.c:2934 +msgid "printer-state-reasons.folder-motor-failure" +msgstr "" + +#. TRANSLATORS: Folder Near Limit +#: locale/ipp-strings.c:2936 +msgid "printer-state-reasons.folder-near-limit" +msgstr "" + +#. TRANSLATORS: Folder Offline +#: locale/ipp-strings.c:2938 +msgid "printer-state-reasons.folder-offline" +msgstr "" + +#. TRANSLATORS: Folder Opened +#: locale/ipp-strings.c:2940 +msgid "printer-state-reasons.folder-opened" +msgstr "" + +#. TRANSLATORS: Folder Over Temperature +#: locale/ipp-strings.c:2942 +msgid "printer-state-reasons.folder-over-temperature" +msgstr "" + +#. TRANSLATORS: Folder Power Saver +#: locale/ipp-strings.c:2944 +msgid "printer-state-reasons.folder-power-saver" +msgstr "" + +#. TRANSLATORS: Folder Recoverable Failure +#: locale/ipp-strings.c:2946 +msgid "printer-state-reasons.folder-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Folder Recoverable Storage +#: locale/ipp-strings.c:2948 +msgid "printer-state-reasons.folder-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Folder Removed +#: locale/ipp-strings.c:2950 +msgid "printer-state-reasons.folder-removed" +msgstr "" + +#. TRANSLATORS: Folder Resource Added +#: locale/ipp-strings.c:2952 +msgid "printer-state-reasons.folder-resource-added" +msgstr "" + +#. TRANSLATORS: Folder Resource Removed +#: locale/ipp-strings.c:2954 +msgid "printer-state-reasons.folder-resource-removed" +msgstr "" + +#. TRANSLATORS: Folder Thermistor Failure +#: locale/ipp-strings.c:2956 +msgid "printer-state-reasons.folder-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Folder Timing Failure +#: locale/ipp-strings.c:2958 +msgid "printer-state-reasons.folder-timing-failure" +msgstr "" + +#. TRANSLATORS: Folder Turned Off +#: locale/ipp-strings.c:2960 +msgid "printer-state-reasons.folder-turned-off" +msgstr "" + +#. TRANSLATORS: Folder Turned On +#: locale/ipp-strings.c:2962 +msgid "printer-state-reasons.folder-turned-on" +msgstr "" + +#. TRANSLATORS: Folder Under Temperature +#: locale/ipp-strings.c:2964 +msgid "printer-state-reasons.folder-under-temperature" +msgstr "" + +#. TRANSLATORS: Folder Unrecoverable Failure +#: locale/ipp-strings.c:2966 +msgid "printer-state-reasons.folder-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Folder Unrecoverable Storage Error +#: locale/ipp-strings.c:2968 +msgid "printer-state-reasons.folder-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Folder Warming Up +#: locale/ipp-strings.c:2970 +msgid "printer-state-reasons.folder-warming-up" +msgstr "" + +#. TRANSLATORS: Fuser temperature high +#: locale/ipp-strings.c:2972 +msgid "printer-state-reasons.fuser-over-temp" +msgstr "" + +#. TRANSLATORS: Fuser temperature low +#: locale/ipp-strings.c:2974 +msgid "printer-state-reasons.fuser-under-temp" +msgstr "" + +#. TRANSLATORS: Hold New Jobs +#: locale/ipp-strings.c:2976 +msgid "printer-state-reasons.hold-new-jobs" +msgstr "" + +#. TRANSLATORS: Identify Printer +#: locale/ipp-strings.c:2978 +msgid "printer-state-reasons.identify-printer-requested" +msgstr "" + +#. TRANSLATORS: Imprinter Added +#: locale/ipp-strings.c:2980 +msgid "printer-state-reasons.imprinter-added" +msgstr "" + +#. TRANSLATORS: Imprinter Almost Empty +#: locale/ipp-strings.c:2982 +msgid "printer-state-reasons.imprinter-almost-empty" +msgstr "" + +#. TRANSLATORS: Imprinter Almost Full +#: locale/ipp-strings.c:2984 +msgid "printer-state-reasons.imprinter-almost-full" +msgstr "" + +#. TRANSLATORS: Imprinter At Limit +#: locale/ipp-strings.c:2986 +msgid "printer-state-reasons.imprinter-at-limit" +msgstr "" + +#. TRANSLATORS: Imprinter Closed +#: locale/ipp-strings.c:2988 +msgid "printer-state-reasons.imprinter-closed" +msgstr "" + +#. TRANSLATORS: Imprinter Configuration Change +#: locale/ipp-strings.c:2990 +msgid "printer-state-reasons.imprinter-configuration-change" +msgstr "" + +#. TRANSLATORS: Imprinter Cover Closed +#: locale/ipp-strings.c:2992 +msgid "printer-state-reasons.imprinter-cover-closed" +msgstr "" + +#. TRANSLATORS: Imprinter Cover Open +#: locale/ipp-strings.c:2994 +msgid "printer-state-reasons.imprinter-cover-open" +msgstr "" + +#. TRANSLATORS: Imprinter Empty +#: locale/ipp-strings.c:2996 +msgid "printer-state-reasons.imprinter-empty" +msgstr "" + +#. TRANSLATORS: Imprinter Full +#: locale/ipp-strings.c:2998 +msgid "printer-state-reasons.imprinter-full" +msgstr "" + +#. TRANSLATORS: Imprinter Interlock Closed +#: locale/ipp-strings.c:3000 +msgid "printer-state-reasons.imprinter-interlock-closed" +msgstr "" + +#. TRANSLATORS: Imprinter Interlock Open +#: locale/ipp-strings.c:3002 +msgid "printer-state-reasons.imprinter-interlock-open" +msgstr "" + +#. TRANSLATORS: Imprinter Jam +#: locale/ipp-strings.c:3004 +msgid "printer-state-reasons.imprinter-jam" +msgstr "" + +#. TRANSLATORS: Imprinter Life Almost Over +#: locale/ipp-strings.c:3006 +msgid "printer-state-reasons.imprinter-life-almost-over" +msgstr "" + +#. TRANSLATORS: Imprinter Life Over +#: locale/ipp-strings.c:3008 +msgid "printer-state-reasons.imprinter-life-over" +msgstr "" + +#. TRANSLATORS: Imprinter Memory Exhausted +#: locale/ipp-strings.c:3010 +msgid "printer-state-reasons.imprinter-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Imprinter Missing +#: locale/ipp-strings.c:3012 +msgid "printer-state-reasons.imprinter-missing" +msgstr "" + +#. TRANSLATORS: Imprinter Motor Failure +#: locale/ipp-strings.c:3014 +msgid "printer-state-reasons.imprinter-motor-failure" +msgstr "" + +#. TRANSLATORS: Imprinter Near Limit +#: locale/ipp-strings.c:3016 +msgid "printer-state-reasons.imprinter-near-limit" +msgstr "" + +#. TRANSLATORS: Imprinter Offline +#: locale/ipp-strings.c:3018 +msgid "printer-state-reasons.imprinter-offline" +msgstr "" + +#. TRANSLATORS: Imprinter Opened +#: locale/ipp-strings.c:3020 +msgid "printer-state-reasons.imprinter-opened" +msgstr "" + +#. TRANSLATORS: Imprinter Over Temperature +#: locale/ipp-strings.c:3022 +msgid "printer-state-reasons.imprinter-over-temperature" +msgstr "" + +#. TRANSLATORS: Imprinter Power Saver +#: locale/ipp-strings.c:3024 +msgid "printer-state-reasons.imprinter-power-saver" +msgstr "" + +#. TRANSLATORS: Imprinter Recoverable Failure +#: locale/ipp-strings.c:3026 +msgid "printer-state-reasons.imprinter-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Imprinter Recoverable Storage +#: locale/ipp-strings.c:3028 +msgid "printer-state-reasons.imprinter-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Imprinter Removed +#: locale/ipp-strings.c:3030 +msgid "printer-state-reasons.imprinter-removed" +msgstr "" + +#. TRANSLATORS: Imprinter Resource Added +#: locale/ipp-strings.c:3032 +msgid "printer-state-reasons.imprinter-resource-added" +msgstr "" + +#. TRANSLATORS: Imprinter Resource Removed +#: locale/ipp-strings.c:3034 +msgid "printer-state-reasons.imprinter-resource-removed" +msgstr "" + +#. TRANSLATORS: Imprinter Thermistor Failure +#: locale/ipp-strings.c:3036 +msgid "printer-state-reasons.imprinter-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Imprinter Timing Failure +#: locale/ipp-strings.c:3038 +msgid "printer-state-reasons.imprinter-timing-failure" +msgstr "" + +#. TRANSLATORS: Imprinter Turned Off +#: locale/ipp-strings.c:3040 +msgid "printer-state-reasons.imprinter-turned-off" +msgstr "" + +#. TRANSLATORS: Imprinter Turned On +#: locale/ipp-strings.c:3042 +msgid "printer-state-reasons.imprinter-turned-on" +msgstr "" + +#. TRANSLATORS: Imprinter Under Temperature +#: locale/ipp-strings.c:3044 +msgid "printer-state-reasons.imprinter-under-temperature" +msgstr "" + +#. TRANSLATORS: Imprinter Unrecoverable Failure +#: locale/ipp-strings.c:3046 +msgid "printer-state-reasons.imprinter-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Imprinter Unrecoverable Storage Error +#: locale/ipp-strings.c:3048 +msgid "printer-state-reasons.imprinter-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Imprinter Warming Up +#: locale/ipp-strings.c:3050 +msgid "printer-state-reasons.imprinter-warming-up" +msgstr "" + +#. TRANSLATORS: Input Cannot Feed Size Selected +#: locale/ipp-strings.c:3052 +msgid "printer-state-reasons.input-cannot-feed-size-selected" +msgstr "" + +#. TRANSLATORS: Input Manual Input Request +#: locale/ipp-strings.c:3054 +msgid "printer-state-reasons.input-manual-input-request" +msgstr "" + +#. TRANSLATORS: Input Media Color Change +#: locale/ipp-strings.c:3056 +msgid "printer-state-reasons.input-media-color-change" +msgstr "" + +#. TRANSLATORS: Input Media Form Parts Change +#: locale/ipp-strings.c:3058 +msgid "printer-state-reasons.input-media-form-parts-change" +msgstr "" + +#. TRANSLATORS: Input Media Size Change +#: locale/ipp-strings.c:3060 +msgid "printer-state-reasons.input-media-size-change" +msgstr "" + +#. TRANSLATORS: Input Media Tray Failure +#: locale/ipp-strings.c:3062 +msgid "printer-state-reasons.input-media-tray-failure" +msgstr "" + +#. TRANSLATORS: Input Media Tray Feed Error +#: locale/ipp-strings.c:3064 +msgid "printer-state-reasons.input-media-tray-feed-error" +msgstr "" + +#. TRANSLATORS: Input Media Tray Jam +#: locale/ipp-strings.c:3066 +msgid "printer-state-reasons.input-media-tray-jam" +msgstr "" + +#. TRANSLATORS: Input Media Type Change +#: locale/ipp-strings.c:3068 +msgid "printer-state-reasons.input-media-type-change" +msgstr "" + +#. TRANSLATORS: Input Media Weight Change +#: locale/ipp-strings.c:3070 +msgid "printer-state-reasons.input-media-weight-change" +msgstr "" + +#. TRANSLATORS: Input Pick Roller Failure +#: locale/ipp-strings.c:3072 +msgid "printer-state-reasons.input-pick-roller-failure" +msgstr "" + +#. TRANSLATORS: Input Pick Roller Life Over +#: locale/ipp-strings.c:3074 +msgid "printer-state-reasons.input-pick-roller-life-over" +msgstr "" + +#. TRANSLATORS: Input Pick Roller Life Warn +#: locale/ipp-strings.c:3076 +msgid "printer-state-reasons.input-pick-roller-life-warn" +msgstr "" + +#. TRANSLATORS: Input Pick Roller Missing +#: locale/ipp-strings.c:3078 +msgid "printer-state-reasons.input-pick-roller-missing" +msgstr "" + +#. TRANSLATORS: Input Tray Elevation Failure +#: locale/ipp-strings.c:3080 +msgid "printer-state-reasons.input-tray-elevation-failure" +msgstr "" + +#. TRANSLATORS: Paper tray is missing +#: locale/ipp-strings.c:3082 +msgid "printer-state-reasons.input-tray-missing" +msgstr "" + +#. TRANSLATORS: Input Tray Position Failure +#: locale/ipp-strings.c:3084 +msgid "printer-state-reasons.input-tray-position-failure" +msgstr "" + +#. TRANSLATORS: Inserter Added +#: locale/ipp-strings.c:3086 +msgid "printer-state-reasons.inserter-added" +msgstr "" + +#. TRANSLATORS: Inserter Almost Empty +#: locale/ipp-strings.c:3088 +msgid "printer-state-reasons.inserter-almost-empty" +msgstr "" + +#. TRANSLATORS: Inserter Almost Full +#: locale/ipp-strings.c:3090 +msgid "printer-state-reasons.inserter-almost-full" +msgstr "" + +#. TRANSLATORS: Inserter At Limit +#: locale/ipp-strings.c:3092 +msgid "printer-state-reasons.inserter-at-limit" +msgstr "" + +#. TRANSLATORS: Inserter Closed +#: locale/ipp-strings.c:3094 +msgid "printer-state-reasons.inserter-closed" +msgstr "" + +#. TRANSLATORS: Inserter Configuration Change +#: locale/ipp-strings.c:3096 +msgid "printer-state-reasons.inserter-configuration-change" +msgstr "" + +#. TRANSLATORS: Inserter Cover Closed +#: locale/ipp-strings.c:3098 +msgid "printer-state-reasons.inserter-cover-closed" +msgstr "" + +#. TRANSLATORS: Inserter Cover Open +#: locale/ipp-strings.c:3100 +msgid "printer-state-reasons.inserter-cover-open" +msgstr "" + +#. TRANSLATORS: Inserter Empty +#: locale/ipp-strings.c:3102 +msgid "printer-state-reasons.inserter-empty" +msgstr "" + +#. TRANSLATORS: Inserter Full +#: locale/ipp-strings.c:3104 +msgid "printer-state-reasons.inserter-full" +msgstr "" + +#. TRANSLATORS: Inserter Interlock Closed +#: locale/ipp-strings.c:3106 +msgid "printer-state-reasons.inserter-interlock-closed" +msgstr "" + +#. TRANSLATORS: Inserter Interlock Open +#: locale/ipp-strings.c:3108 +msgid "printer-state-reasons.inserter-interlock-open" +msgstr "" + +#. TRANSLATORS: Inserter Jam +#: locale/ipp-strings.c:3110 +msgid "printer-state-reasons.inserter-jam" +msgstr "" + +#. TRANSLATORS: Inserter Life Almost Over +#: locale/ipp-strings.c:3112 +msgid "printer-state-reasons.inserter-life-almost-over" +msgstr "" + +#. TRANSLATORS: Inserter Life Over +#: locale/ipp-strings.c:3114 +msgid "printer-state-reasons.inserter-life-over" +msgstr "" + +#. TRANSLATORS: Inserter Memory Exhausted +#: locale/ipp-strings.c:3116 +msgid "printer-state-reasons.inserter-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Inserter Missing +#: locale/ipp-strings.c:3118 +msgid "printer-state-reasons.inserter-missing" +msgstr "" + +#. TRANSLATORS: Inserter Motor Failure +#: locale/ipp-strings.c:3120 +msgid "printer-state-reasons.inserter-motor-failure" +msgstr "" + +#. TRANSLATORS: Inserter Near Limit +#: locale/ipp-strings.c:3122 +msgid "printer-state-reasons.inserter-near-limit" +msgstr "" + +#. TRANSLATORS: Inserter Offline +#: locale/ipp-strings.c:3124 +msgid "printer-state-reasons.inserter-offline" +msgstr "" + +#. TRANSLATORS: Inserter Opened +#: locale/ipp-strings.c:3126 +msgid "printer-state-reasons.inserter-opened" +msgstr "" + +#. TRANSLATORS: Inserter Over Temperature +#: locale/ipp-strings.c:3128 +msgid "printer-state-reasons.inserter-over-temperature" +msgstr "" + +#. TRANSLATORS: Inserter Power Saver +#: locale/ipp-strings.c:3130 +msgid "printer-state-reasons.inserter-power-saver" +msgstr "" + +#. TRANSLATORS: Inserter Recoverable Failure +#: locale/ipp-strings.c:3132 +msgid "printer-state-reasons.inserter-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Inserter Recoverable Storage +#: locale/ipp-strings.c:3134 +msgid "printer-state-reasons.inserter-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Inserter Removed +#: locale/ipp-strings.c:3136 +msgid "printer-state-reasons.inserter-removed" +msgstr "" + +#. TRANSLATORS: Inserter Resource Added +#: locale/ipp-strings.c:3138 +msgid "printer-state-reasons.inserter-resource-added" +msgstr "" + +#. TRANSLATORS: Inserter Resource Removed +#: locale/ipp-strings.c:3140 +msgid "printer-state-reasons.inserter-resource-removed" +msgstr "" + +#. TRANSLATORS: Inserter Thermistor Failure +#: locale/ipp-strings.c:3142 +msgid "printer-state-reasons.inserter-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Inserter Timing Failure +#: locale/ipp-strings.c:3144 +msgid "printer-state-reasons.inserter-timing-failure" +msgstr "" + +#. TRANSLATORS: Inserter Turned Off +#: locale/ipp-strings.c:3146 +msgid "printer-state-reasons.inserter-turned-off" +msgstr "" + +#. TRANSLATORS: Inserter Turned On +#: locale/ipp-strings.c:3148 +msgid "printer-state-reasons.inserter-turned-on" +msgstr "" + +#. TRANSLATORS: Inserter Under Temperature +#: locale/ipp-strings.c:3150 +msgid "printer-state-reasons.inserter-under-temperature" +msgstr "" + +#. TRANSLATORS: Inserter Unrecoverable Failure +#: locale/ipp-strings.c:3152 +msgid "printer-state-reasons.inserter-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Inserter Unrecoverable Storage Error +#: locale/ipp-strings.c:3154 +msgid "printer-state-reasons.inserter-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Inserter Warming Up +#: locale/ipp-strings.c:3156 +msgid "printer-state-reasons.inserter-warming-up" +msgstr "" + +#. TRANSLATORS: Interlock Closed +#: locale/ipp-strings.c:3158 +msgid "printer-state-reasons.interlock-closed" +msgstr "" + +#. TRANSLATORS: Interlock Open +#: locale/ipp-strings.c:3160 +msgid "printer-state-reasons.interlock-open" +msgstr "" + +#. TRANSLATORS: Interpreter Cartridge Added +#: locale/ipp-strings.c:3162 +msgid "printer-state-reasons.interpreter-cartridge-added" +msgstr "" + +#. TRANSLATORS: Interpreter Cartridge Removed +#: locale/ipp-strings.c:3164 +msgid "printer-state-reasons.interpreter-cartridge-deleted" +msgstr "" + +#. TRANSLATORS: Interpreter Complex Page Encountered +#: locale/ipp-strings.c:3166 +msgid "printer-state-reasons.interpreter-complex-page-encountered" +msgstr "" + +#. TRANSLATORS: Interpreter Memory Decrease +#: locale/ipp-strings.c:3168 +msgid "printer-state-reasons.interpreter-memory-decrease" +msgstr "" + +#. TRANSLATORS: Interpreter Memory Increase +#: locale/ipp-strings.c:3170 +msgid "printer-state-reasons.interpreter-memory-increase" +msgstr "" + +#. TRANSLATORS: Interpreter Resource Added +#: locale/ipp-strings.c:3172 +msgid "printer-state-reasons.interpreter-resource-added" +msgstr "" + +#. TRANSLATORS: Interpreter Resource Deleted +#: locale/ipp-strings.c:3174 +msgid "printer-state-reasons.interpreter-resource-deleted" +msgstr "" + +#. TRANSLATORS: Printer resource unavailable +#: locale/ipp-strings.c:3176 +msgid "printer-state-reasons.interpreter-resource-unavailable" +msgstr "" + +#. TRANSLATORS: Lamp At End of Life +#: locale/ipp-strings.c:3178 +msgid "printer-state-reasons.lamp-at-eol" +msgstr "" + +#. TRANSLATORS: Lamp Failure +#: locale/ipp-strings.c:3180 +msgid "printer-state-reasons.lamp-failure" +msgstr "" + +#. TRANSLATORS: Lamp Near End of Life +#: locale/ipp-strings.c:3182 +msgid "printer-state-reasons.lamp-near-eol" +msgstr "" + +#. TRANSLATORS: Laser At End of Life +#: locale/ipp-strings.c:3184 +msgid "printer-state-reasons.laser-at-eol" +msgstr "" + +#. TRANSLATORS: Laser Failure +#: locale/ipp-strings.c:3186 +msgid "printer-state-reasons.laser-failure" +msgstr "" + +#. TRANSLATORS: Laser Near End of Life +#: locale/ipp-strings.c:3188 +msgid "printer-state-reasons.laser-near-eol" +msgstr "" + +#. TRANSLATORS: Envelope Maker Added +#: locale/ipp-strings.c:3190 +msgid "printer-state-reasons.make-envelope-added" +msgstr "" + +#. TRANSLATORS: Envelope Maker Almost Empty +#: locale/ipp-strings.c:3192 +msgid "printer-state-reasons.make-envelope-almost-empty" +msgstr "" + +#. TRANSLATORS: Envelope Maker Almost Full +#: locale/ipp-strings.c:3194 +msgid "printer-state-reasons.make-envelope-almost-full" +msgstr "" + +#. TRANSLATORS: Envelope Maker At Limit +#: locale/ipp-strings.c:3196 +msgid "printer-state-reasons.make-envelope-at-limit" +msgstr "" + +#. TRANSLATORS: Envelope Maker Closed +#: locale/ipp-strings.c:3198 +msgid "printer-state-reasons.make-envelope-closed" +msgstr "" + +#. TRANSLATORS: Envelope Maker Configuration Change +#: locale/ipp-strings.c:3200 +msgid "printer-state-reasons.make-envelope-configuration-change" +msgstr "" + +#. TRANSLATORS: Envelope Maker Cover Closed +#: locale/ipp-strings.c:3202 +msgid "printer-state-reasons.make-envelope-cover-closed" +msgstr "" + +#. TRANSLATORS: Envelope Maker Cover Open +#: locale/ipp-strings.c:3204 +msgid "printer-state-reasons.make-envelope-cover-open" +msgstr "" + +#. TRANSLATORS: Envelope Maker Empty +#: locale/ipp-strings.c:3206 +msgid "printer-state-reasons.make-envelope-empty" +msgstr "" + +#. TRANSLATORS: Envelope Maker Full +#: locale/ipp-strings.c:3208 +msgid "printer-state-reasons.make-envelope-full" +msgstr "" + +#. TRANSLATORS: Envelope Maker Interlock Closed +#: locale/ipp-strings.c:3210 +msgid "printer-state-reasons.make-envelope-interlock-closed" +msgstr "" + +#. TRANSLATORS: Envelope Maker Interlock Open +#: locale/ipp-strings.c:3212 +msgid "printer-state-reasons.make-envelope-interlock-open" +msgstr "" + +#. TRANSLATORS: Envelope Maker Jam +#: locale/ipp-strings.c:3214 +msgid "printer-state-reasons.make-envelope-jam" +msgstr "" + +#. TRANSLATORS: Envelope Maker Life Almost Over +#: locale/ipp-strings.c:3216 +msgid "printer-state-reasons.make-envelope-life-almost-over" +msgstr "" + +#. TRANSLATORS: Envelope Maker Life Over +#: locale/ipp-strings.c:3218 +msgid "printer-state-reasons.make-envelope-life-over" +msgstr "" + +#. TRANSLATORS: Envelope Maker Memory Exhausted +#: locale/ipp-strings.c:3220 +msgid "printer-state-reasons.make-envelope-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Envelope Maker Missing +#: locale/ipp-strings.c:3222 +msgid "printer-state-reasons.make-envelope-missing" +msgstr "" + +#. TRANSLATORS: Envelope Maker Motor Failure +#: locale/ipp-strings.c:3224 +msgid "printer-state-reasons.make-envelope-motor-failure" +msgstr "" + +#. TRANSLATORS: Envelope Maker Near Limit +#: locale/ipp-strings.c:3226 +msgid "printer-state-reasons.make-envelope-near-limit" +msgstr "" + +#. TRANSLATORS: Envelope Maker Offline +#: locale/ipp-strings.c:3228 +msgid "printer-state-reasons.make-envelope-offline" +msgstr "" + +#. TRANSLATORS: Envelope Maker Opened +#: locale/ipp-strings.c:3230 +msgid "printer-state-reasons.make-envelope-opened" +msgstr "" + +#. TRANSLATORS: Envelope Maker Over Temperature +#: locale/ipp-strings.c:3232 +msgid "printer-state-reasons.make-envelope-over-temperature" +msgstr "" + +#. TRANSLATORS: Envelope Maker Power Saver +#: locale/ipp-strings.c:3234 +msgid "printer-state-reasons.make-envelope-power-saver" +msgstr "" + +#. TRANSLATORS: Envelope Maker Recoverable Failure +#: locale/ipp-strings.c:3236 +msgid "printer-state-reasons.make-envelope-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Envelope Maker Recoverable Storage +#: locale/ipp-strings.c:3238 +msgid "printer-state-reasons.make-envelope-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Envelope Maker Removed +#: locale/ipp-strings.c:3240 +msgid "printer-state-reasons.make-envelope-removed" +msgstr "" + +#. TRANSLATORS: Envelope Maker Resource Added +#: locale/ipp-strings.c:3242 +msgid "printer-state-reasons.make-envelope-resource-added" +msgstr "" + +#. TRANSLATORS: Envelope Maker Resource Removed +#: locale/ipp-strings.c:3244 +msgid "printer-state-reasons.make-envelope-resource-removed" +msgstr "" + +#. TRANSLATORS: Envelope Maker Thermistor Failure +#: locale/ipp-strings.c:3246 +msgid "printer-state-reasons.make-envelope-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Envelope Maker Timing Failure +#: locale/ipp-strings.c:3248 +msgid "printer-state-reasons.make-envelope-timing-failure" +msgstr "" + +#. TRANSLATORS: Envelope Maker Turned Off +#: locale/ipp-strings.c:3250 +msgid "printer-state-reasons.make-envelope-turned-off" +msgstr "" + +#. TRANSLATORS: Envelope Maker Turned On +#: locale/ipp-strings.c:3252 +msgid "printer-state-reasons.make-envelope-turned-on" +msgstr "" + +#. TRANSLATORS: Envelope Maker Under Temperature +#: locale/ipp-strings.c:3254 +msgid "printer-state-reasons.make-envelope-under-temperature" +msgstr "" + +#. TRANSLATORS: Envelope Maker Unrecoverable Failure +#: locale/ipp-strings.c:3256 +msgid "printer-state-reasons.make-envelope-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Envelope Maker Unrecoverable Storage Error +#: locale/ipp-strings.c:3258 +msgid "printer-state-reasons.make-envelope-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Envelope Maker Warming Up +#: locale/ipp-strings.c:3260 +msgid "printer-state-reasons.make-envelope-warming-up" +msgstr "" + +#. TRANSLATORS: Marker Adjusting Print Quality +#: locale/ipp-strings.c:3262 +msgid "printer-state-reasons.marker-adjusting-print-quality" +msgstr "Markør til justering af udskrivningskvalitet" + +#. TRANSLATORS: Marker Cleaner Missing +#: locale/ipp-strings.c:3264 +msgid "printer-state-reasons.marker-cleaner-missing" +msgstr "Markør til renser mangler" + +#. TRANSLATORS: Marker Developer Almost Empty +#: locale/ipp-strings.c:3266 +msgid "printer-state-reasons.marker-developer-almost-empty" +msgstr "Markør til fremkalder næsten tom" + +#. TRANSLATORS: Marker Developer Empty +#: locale/ipp-strings.c:3268 +msgid "printer-state-reasons.marker-developer-empty" +msgstr "Markør til fremkalder tom" + +#. TRANSLATORS: Marker Developer Missing +#: locale/ipp-strings.c:3270 +msgid "printer-state-reasons.marker-developer-missing" +msgstr "Markør til fremkalder mangler" + +#. TRANSLATORS: Marker Fuser Missing +#: locale/ipp-strings.c:3272 +msgid "printer-state-reasons.marker-fuser-missing" +msgstr "Markør til \"fuser\" mangler" + +#. TRANSLATORS: Marker Fuser Thermistor Failure +#: locale/ipp-strings.c:3274 +msgid "printer-state-reasons.marker-fuser-thermistor-failure" +msgstr "Markør til fejl i temperatursensor for \"fuser\"" + +#. TRANSLATORS: Marker Fuser Timing Failure +#: locale/ipp-strings.c:3276 +msgid "printer-state-reasons.marker-fuser-timing-failure" +msgstr "Markør til fejl i timing af \"fuser\"" + +#. TRANSLATORS: Marker Ink Almost Empty +#: locale/ipp-strings.c:3278 +msgid "printer-state-reasons.marker-ink-almost-empty" +msgstr "Markør til blæk næsten tom" + +#. TRANSLATORS: Marker Ink Empty +#: locale/ipp-strings.c:3280 +msgid "printer-state-reasons.marker-ink-empty" +msgstr "Markør til blæk tom" + +#. TRANSLATORS: Marker Ink Missing +#: locale/ipp-strings.c:3282 +msgid "printer-state-reasons.marker-ink-missing" +msgstr "Markør til blæk mangler" + +#. TRANSLATORS: Marker Opc Missing +#: locale/ipp-strings.c:3284 +msgid "printer-state-reasons.marker-opc-missing" +msgstr "Markør til Opc mangler" + +#. TRANSLATORS: Marker Print Ribbon Almost Empty +#: locale/ipp-strings.c:3286 +msgid "printer-state-reasons.marker-print-ribbon-almost-empty" +msgstr "Markør til udskrivningsbånd næsten tom" + +#. TRANSLATORS: Marker Print Ribbon Empty +#: locale/ipp-strings.c:3288 +msgid "printer-state-reasons.marker-print-ribbon-empty" +msgstr "Markør til udskrivningsbånd tom" + +#. TRANSLATORS: Marker Print Ribbon Missing +#: locale/ipp-strings.c:3290 +msgid "printer-state-reasons.marker-print-ribbon-missing" +msgstr "Markør til udskrivningsbånd mangler" + +#. TRANSLATORS: Marker Supply Almost Empty +#: locale/ipp-strings.c:3292 +msgid "printer-state-reasons.marker-supply-almost-empty" +msgstr "Markør til forsyning næsten tom" + +#. TRANSLATORS: Ink/toner empty +#: locale/ipp-strings.c:3294 +msgid "printer-state-reasons.marker-supply-empty" +msgstr "Blæk/toner tom" + +#. TRANSLATORS: Ink/toner low +#: locale/ipp-strings.c:3296 +msgid "printer-state-reasons.marker-supply-low" +msgstr "Blæk/toner lav" + +#. TRANSLATORS: Marker Supply Missing +#: locale/ipp-strings.c:3298 +msgid "printer-state-reasons.marker-supply-missing" +msgstr "Markør til forsyning mangler" + +#. TRANSLATORS: Marker Toner Cartridge Missing +#: locale/ipp-strings.c:3300 +msgid "printer-state-reasons.marker-toner-cartridge-missing" +msgstr "Markør til tonerpatron mangler" + +#. TRANSLATORS: Marker Toner Missing +#: locale/ipp-strings.c:3302 +msgid "printer-state-reasons.marker-toner-missing" +msgstr "Markør til toner mangler" + +#. TRANSLATORS: Ink/toner waste bin almost full +#: locale/ipp-strings.c:3304 +msgid "printer-state-reasons.marker-waste-almost-full" +msgstr "Beholder til blæk-/tonerspild næsten fuld" + +#. TRANSLATORS: Ink/toner waste bin full +#: locale/ipp-strings.c:3306 +msgid "printer-state-reasons.marker-waste-full" +msgstr "Beholder til blæk-/tonerspild fuld" + +#. TRANSLATORS: Marker Waste Ink Receptacle Almost Full +#: locale/ipp-strings.c:3308 +msgid "printer-state-reasons.marker-waste-ink-receptacle-almost-full" +msgstr "Markør til beholder til blækspild næsten fuld" + +#. TRANSLATORS: Marker Waste Ink Receptacle Full +#: locale/ipp-strings.c:3310 +msgid "printer-state-reasons.marker-waste-ink-receptacle-full" +msgstr "Markør til beholder til blækspild fuld" + +#. TRANSLATORS: Marker Waste Ink Receptacle Missing +#: locale/ipp-strings.c:3312 +msgid "printer-state-reasons.marker-waste-ink-receptacle-missing" +msgstr "Markør til beholder til blækspild mangler" + +#. TRANSLATORS: Marker Waste Missing +#: locale/ipp-strings.c:3314 +msgid "printer-state-reasons.marker-waste-missing" +msgstr "Markør til beholder mangler" + +#. TRANSLATORS: Marker Waste Toner Receptacle Almost Full +#: locale/ipp-strings.c:3316 +msgid "printer-state-reasons.marker-waste-toner-receptacle-almost-full" +msgstr "Markør til beholder til tonerspild næsten fuld" + +#. TRANSLATORS: Marker Waste Toner Receptacle Full +#: locale/ipp-strings.c:3318 +msgid "printer-state-reasons.marker-waste-toner-receptacle-full" +msgstr "Markør til beholder til tonerspild fuld" + +#. TRANSLATORS: Marker Waste Toner Receptacle Missing +#: locale/ipp-strings.c:3320 +msgid "printer-state-reasons.marker-waste-toner-receptacle-missing" +msgstr "Markør til beholder til tonerspild mangler" + +#. TRANSLATORS: Material Empty +#: locale/ipp-strings.c:3322 +msgid "printer-state-reasons.material-empty" +msgstr "Materiel tom" + +#. TRANSLATORS: Material Low +#: locale/ipp-strings.c:3324 +msgid "printer-state-reasons.material-low" +msgstr "Materiel lav" + +#. TRANSLATORS: Material Needed +#: locale/ipp-strings.c:3326 +msgid "printer-state-reasons.material-needed" +msgstr "Materiel behøves" + +#. TRANSLATORS: Media Drying +#: locale/ipp-strings.c:3328 +msgid "printer-state-reasons.media-drying" +msgstr "Medie tørrer" + +#. TRANSLATORS: Paper tray is empty +#: locale/ipp-strings.c:3330 +msgid "printer-state-reasons.media-empty" +msgstr "Papirbakke er tom" + +#. TRANSLATORS: Paper jam +#: locale/ipp-strings.c:3332 +msgid "printer-state-reasons.media-jam" +msgstr "Papir sidder fast" + +#. TRANSLATORS: Paper tray is almost empty +#: locale/ipp-strings.c:3334 +msgid "printer-state-reasons.media-low" +msgstr "Papirbakke er næsten tom" + +#. TRANSLATORS: Load paper +#: locale/ipp-strings.c:3336 +msgid "printer-state-reasons.media-needed" +msgstr "Læg papir i" + +#. TRANSLATORS: Media Path Cannot Do 2-Sided Printing +#: locale/ipp-strings.c:3338 +msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" +msgstr "Mediesti kan ikke foretage tosidet udskrivning" + +#. TRANSLATORS: Media Path Failure +#: locale/ipp-strings.c:3340 +msgid "printer-state-reasons.media-path-failure" +msgstr "Fejl i mediesti" + +#. TRANSLATORS: Media Path Input Empty +#: locale/ipp-strings.c:3342 +msgid "printer-state-reasons.media-path-input-empty" +msgstr "Mediestiens input tom" + +#. TRANSLATORS: Media Path Input Feed Error +#: locale/ipp-strings.c:3344 +msgid "printer-state-reasons.media-path-input-feed-error" +msgstr "Fejl i mediestiens inputfødning" + +#. TRANSLATORS: Media Path Input Jam +#: locale/ipp-strings.c:3346 +msgid "printer-state-reasons.media-path-input-jam" +msgstr "Sidder fast i mediestiens input" + +#. TRANSLATORS: Media Path Input Request +#: locale/ipp-strings.c:3348 +msgid "printer-state-reasons.media-path-input-request" +msgstr "Mediestiens input anmodet" + +#. TRANSLATORS: Media Path Jam +#: locale/ipp-strings.c:3350 +msgid "printer-state-reasons.media-path-jam" +msgstr "Sidder fast i mediesti" + +#. TRANSLATORS: Media Path Media Tray Almost Full +#: locale/ipp-strings.c:3352 +msgid "printer-state-reasons.media-path-media-tray-almost-full" +msgstr "Mediestiens mediebakke næsten fuld" + +#. TRANSLATORS: Media Path Media Tray Full +#: locale/ipp-strings.c:3354 +msgid "printer-state-reasons.media-path-media-tray-full" +msgstr "Mediestiens mediebakke fuld" + +#. TRANSLATORS: Media Path Media Tray Missing +#: locale/ipp-strings.c:3356 +msgid "printer-state-reasons.media-path-media-tray-missing" +msgstr "Mediestiens mediebakke mangler" + +#. TRANSLATORS: Media Path Output Feed Error +#: locale/ipp-strings.c:3358 +msgid "printer-state-reasons.media-path-output-feed-error" +msgstr "Fejl i mediestiens outputfødning" + +#. TRANSLATORS: Media Path Output Full +#: locale/ipp-strings.c:3360 +msgid "printer-state-reasons.media-path-output-full" +msgstr "Mediestiens output fuld" + +#. TRANSLATORS: Media Path Output Jam +#: locale/ipp-strings.c:3362 +msgid "printer-state-reasons.media-path-output-jam" +msgstr "Sidder fast i mediestiens output" + +#. TRANSLATORS: Media Path Pick Roller Failure +#: locale/ipp-strings.c:3364 +msgid "printer-state-reasons.media-path-pick-roller-failure" +msgstr "Fejl i mediestiens vælgerrulle" + +#. TRANSLATORS: Media Path Pick Roller Life Over +#: locale/ipp-strings.c:3366 +msgid "printer-state-reasons.media-path-pick-roller-life-over" +msgstr "Mediestiens vælgerrulle er gammel" + +#. TRANSLATORS: Media Path Pick Roller Life Warn +#: locale/ipp-strings.c:3368 +msgid "printer-state-reasons.media-path-pick-roller-life-warn" +msgstr "Mediestiens vælgerrulle er ved at være gammel" + +#. TRANSLATORS: Media Path Pick Roller Missing +#: locale/ipp-strings.c:3370 +msgid "printer-state-reasons.media-path-pick-roller-missing" +msgstr "Mediestiens vælgerrulle mangler" + +#. TRANSLATORS: Motor Failure +#: locale/ipp-strings.c:3372 +msgid "printer-state-reasons.motor-failure" +msgstr "" + +#. TRANSLATORS: Printer going offline +#: locale/ipp-strings.c:3374 +msgid "printer-state-reasons.moving-to-paused" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:3376 +msgid "printer-state-reasons.none" +msgstr "" + +#. TRANSLATORS: Optical Photoconductor Life Over +#: locale/ipp-strings.c:3378 +msgid "printer-state-reasons.opc-life-over" +msgstr "" + +#. TRANSLATORS: OPC almost at end-of-life +#: locale/ipp-strings.c:3380 +msgid "printer-state-reasons.opc-near-eol" +msgstr "" + +#. TRANSLATORS: Check the printer for errors +#: locale/ipp-strings.c:3382 +msgid "printer-state-reasons.other" +msgstr "" + +#. TRANSLATORS: Output bin is almost full +#: locale/ipp-strings.c:3384 +msgid "printer-state-reasons.output-area-almost-full" +msgstr "" + +#. TRANSLATORS: Output bin is full +#: locale/ipp-strings.c:3386 +msgid "printer-state-reasons.output-area-full" +msgstr "" + +#. TRANSLATORS: Output Mailbox Select Failure +#: locale/ipp-strings.c:3388 +msgid "printer-state-reasons.output-mailbox-select-failure" +msgstr "" + +#. TRANSLATORS: Output Media Tray Failure +#: locale/ipp-strings.c:3390 +msgid "printer-state-reasons.output-media-tray-failure" +msgstr "" + +#. TRANSLATORS: Output Media Tray Feed Error +#: locale/ipp-strings.c:3392 +msgid "printer-state-reasons.output-media-tray-feed-error" +msgstr "" + +#. TRANSLATORS: Output Media Tray Jam +#: locale/ipp-strings.c:3394 +msgid "printer-state-reasons.output-media-tray-jam" +msgstr "" + +#. TRANSLATORS: Output tray is missing +#: locale/ipp-strings.c:3396 +msgid "printer-state-reasons.output-tray-missing" +msgstr "" + +#. TRANSLATORS: Paused +#: locale/ipp-strings.c:3398 +msgid "printer-state-reasons.paused" +msgstr "" + +#. TRANSLATORS: Perforater Added +#: locale/ipp-strings.c:3400 +msgid "printer-state-reasons.perforater-added" +msgstr "" + +#. TRANSLATORS: Perforater Almost Empty +#: locale/ipp-strings.c:3402 +msgid "printer-state-reasons.perforater-almost-empty" +msgstr "" + +#. TRANSLATORS: Perforater Almost Full +#: locale/ipp-strings.c:3404 +msgid "printer-state-reasons.perforater-almost-full" +msgstr "" + +#. TRANSLATORS: Perforater At Limit +#: locale/ipp-strings.c:3406 +msgid "printer-state-reasons.perforater-at-limit" +msgstr "" + +#. TRANSLATORS: Perforater Closed +#: locale/ipp-strings.c:3408 +msgid "printer-state-reasons.perforater-closed" +msgstr "" + +#. TRANSLATORS: Perforater Configuration Change +#: locale/ipp-strings.c:3410 +msgid "printer-state-reasons.perforater-configuration-change" +msgstr "" + +#. TRANSLATORS: Perforater Cover Closed +#: locale/ipp-strings.c:3412 +msgid "printer-state-reasons.perforater-cover-closed" +msgstr "" + +#. TRANSLATORS: Perforater Cover Open +#: locale/ipp-strings.c:3414 +msgid "printer-state-reasons.perforater-cover-open" +msgstr "" + +#. TRANSLATORS: Perforater Empty +#: locale/ipp-strings.c:3416 +msgid "printer-state-reasons.perforater-empty" +msgstr "" + +#. TRANSLATORS: Perforater Full +#: locale/ipp-strings.c:3418 +msgid "printer-state-reasons.perforater-full" +msgstr "" + +#. TRANSLATORS: Perforater Interlock Closed +#: locale/ipp-strings.c:3420 +msgid "printer-state-reasons.perforater-interlock-closed" +msgstr "" + +#. TRANSLATORS: Perforater Interlock Open +#: locale/ipp-strings.c:3422 +msgid "printer-state-reasons.perforater-interlock-open" +msgstr "" + +#. TRANSLATORS: Perforater Jam +#: locale/ipp-strings.c:3424 +msgid "printer-state-reasons.perforater-jam" +msgstr "" + +#. TRANSLATORS: Perforater Life Almost Over +#: locale/ipp-strings.c:3426 +msgid "printer-state-reasons.perforater-life-almost-over" +msgstr "" + +#. TRANSLATORS: Perforater Life Over +#: locale/ipp-strings.c:3428 +msgid "printer-state-reasons.perforater-life-over" +msgstr "" + +#. TRANSLATORS: Perforater Memory Exhausted +#: locale/ipp-strings.c:3430 +msgid "printer-state-reasons.perforater-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Perforater Missing +#: locale/ipp-strings.c:3432 +msgid "printer-state-reasons.perforater-missing" +msgstr "" + +#. TRANSLATORS: Perforater Motor Failure +#: locale/ipp-strings.c:3434 +msgid "printer-state-reasons.perforater-motor-failure" +msgstr "" + +#. TRANSLATORS: Perforater Near Limit +#: locale/ipp-strings.c:3436 +msgid "printer-state-reasons.perforater-near-limit" +msgstr "" + +#. TRANSLATORS: Perforater Offline +#: locale/ipp-strings.c:3438 +msgid "printer-state-reasons.perforater-offline" +msgstr "" + +#. TRANSLATORS: Perforater Opened +#: locale/ipp-strings.c:3440 +msgid "printer-state-reasons.perforater-opened" +msgstr "" + +#. TRANSLATORS: Perforater Over Temperature +#: locale/ipp-strings.c:3442 +msgid "printer-state-reasons.perforater-over-temperature" +msgstr "" + +#. TRANSLATORS: Perforater Power Saver +#: locale/ipp-strings.c:3444 +msgid "printer-state-reasons.perforater-power-saver" +msgstr "" + +#. TRANSLATORS: Perforater Recoverable Failure +#: locale/ipp-strings.c:3446 +msgid "printer-state-reasons.perforater-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Perforater Recoverable Storage +#: locale/ipp-strings.c:3448 +msgid "printer-state-reasons.perforater-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Perforater Removed +#: locale/ipp-strings.c:3450 +msgid "printer-state-reasons.perforater-removed" +msgstr "" + +#. TRANSLATORS: Perforater Resource Added +#: locale/ipp-strings.c:3452 +msgid "printer-state-reasons.perforater-resource-added" +msgstr "" + +#. TRANSLATORS: Perforater Resource Removed +#: locale/ipp-strings.c:3454 +msgid "printer-state-reasons.perforater-resource-removed" +msgstr "" + +#. TRANSLATORS: Perforater Thermistor Failure +#: locale/ipp-strings.c:3456 +msgid "printer-state-reasons.perforater-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Perforater Timing Failure +#: locale/ipp-strings.c:3458 +msgid "printer-state-reasons.perforater-timing-failure" +msgstr "" + +#. TRANSLATORS: Perforater Turned Off +#: locale/ipp-strings.c:3460 +msgid "printer-state-reasons.perforater-turned-off" +msgstr "" + +#. TRANSLATORS: Perforater Turned On +#: locale/ipp-strings.c:3462 +msgid "printer-state-reasons.perforater-turned-on" +msgstr "" + +#. TRANSLATORS: Perforater Under Temperature +#: locale/ipp-strings.c:3464 +msgid "printer-state-reasons.perforater-under-temperature" +msgstr "" + +#. TRANSLATORS: Perforater Unrecoverable Failure +#: locale/ipp-strings.c:3466 +msgid "printer-state-reasons.perforater-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Perforater Unrecoverable Storage Error +#: locale/ipp-strings.c:3468 +msgid "printer-state-reasons.perforater-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Perforater Warming Up +#: locale/ipp-strings.c:3470 +msgid "printer-state-reasons.perforater-warming-up" +msgstr "" + +#. TRANSLATORS: Platform Cooling +#: locale/ipp-strings.c:3472 +msgid "printer-state-reasons.platform-cooling" +msgstr "" + +#. TRANSLATORS: Platform Failure +#: locale/ipp-strings.c:3474 +msgid "printer-state-reasons.platform-failure" +msgstr "" + +#. TRANSLATORS: Platform Heating +#: locale/ipp-strings.c:3476 +msgid "printer-state-reasons.platform-heating" +msgstr "" + +#. TRANSLATORS: Platform Temperature High +#: locale/ipp-strings.c:3478 +msgid "printer-state-reasons.platform-temperature-high" +msgstr "" + +#. TRANSLATORS: Platform Temperature Low +#: locale/ipp-strings.c:3480 +msgid "printer-state-reasons.platform-temperature-low" +msgstr "" + +#. TRANSLATORS: Power Down +#: locale/ipp-strings.c:3482 +msgid "printer-state-reasons.power-down" +msgstr "" + +#. TRANSLATORS: Power Up +#: locale/ipp-strings.c:3484 +msgid "printer-state-reasons.power-up" +msgstr "" + +#. TRANSLATORS: Printer Reset Manually +#: locale/ipp-strings.c:3486 +msgid "printer-state-reasons.printer-manual-reset" +msgstr "" + +#. TRANSLATORS: Printer Reset Remotely +#: locale/ipp-strings.c:3488 +msgid "printer-state-reasons.printer-nms-reset" +msgstr "" + +#. TRANSLATORS: Printer Ready To Print +#: locale/ipp-strings.c:3490 +msgid "printer-state-reasons.printer-ready-to-print" +msgstr "" + +#. TRANSLATORS: Puncher Added +#: locale/ipp-strings.c:3492 +msgid "printer-state-reasons.puncher-added" +msgstr "" + +#. TRANSLATORS: Puncher Almost Empty +#: locale/ipp-strings.c:3494 +msgid "printer-state-reasons.puncher-almost-empty" +msgstr "" + +#. TRANSLATORS: Puncher Almost Full +#: locale/ipp-strings.c:3496 +msgid "printer-state-reasons.puncher-almost-full" +msgstr "" + +#. TRANSLATORS: Puncher At Limit +#: locale/ipp-strings.c:3498 +msgid "printer-state-reasons.puncher-at-limit" +msgstr "" + +#. TRANSLATORS: Puncher Closed +#: locale/ipp-strings.c:3500 +msgid "printer-state-reasons.puncher-closed" +msgstr "" + +#. TRANSLATORS: Puncher Configuration Change +#: locale/ipp-strings.c:3502 +msgid "printer-state-reasons.puncher-configuration-change" +msgstr "" + +#. TRANSLATORS: Puncher Cover Closed +#: locale/ipp-strings.c:3504 +msgid "printer-state-reasons.puncher-cover-closed" +msgstr "" + +#. TRANSLATORS: Puncher Cover Open +#: locale/ipp-strings.c:3506 +msgid "printer-state-reasons.puncher-cover-open" +msgstr "" + +#. TRANSLATORS: Puncher Empty +#: locale/ipp-strings.c:3508 +msgid "printer-state-reasons.puncher-empty" +msgstr "" + +#. TRANSLATORS: Puncher Full +#: locale/ipp-strings.c:3510 +msgid "printer-state-reasons.puncher-full" +msgstr "" + +#. TRANSLATORS: Puncher Interlock Closed +#: locale/ipp-strings.c:3512 +msgid "printer-state-reasons.puncher-interlock-closed" +msgstr "" + +#. TRANSLATORS: Puncher Interlock Open +#: locale/ipp-strings.c:3514 +msgid "printer-state-reasons.puncher-interlock-open" +msgstr "" + +#. TRANSLATORS: Puncher Jam +#: locale/ipp-strings.c:3516 +msgid "printer-state-reasons.puncher-jam" +msgstr "" + +#. TRANSLATORS: Puncher Life Almost Over +#: locale/ipp-strings.c:3518 +msgid "printer-state-reasons.puncher-life-almost-over" +msgstr "" + +#. TRANSLATORS: Puncher Life Over +#: locale/ipp-strings.c:3520 +msgid "printer-state-reasons.puncher-life-over" +msgstr "" + +#. TRANSLATORS: Puncher Memory Exhausted +#: locale/ipp-strings.c:3522 +msgid "printer-state-reasons.puncher-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Puncher Missing +#: locale/ipp-strings.c:3524 +msgid "printer-state-reasons.puncher-missing" +msgstr "" + +#. TRANSLATORS: Puncher Motor Failure +#: locale/ipp-strings.c:3526 +msgid "printer-state-reasons.puncher-motor-failure" +msgstr "" + +#. TRANSLATORS: Puncher Near Limit +#: locale/ipp-strings.c:3528 +msgid "printer-state-reasons.puncher-near-limit" +msgstr "" + +#. TRANSLATORS: Puncher Offline +#: locale/ipp-strings.c:3530 +msgid "printer-state-reasons.puncher-offline" +msgstr "" + +#. TRANSLATORS: Puncher Opened +#: locale/ipp-strings.c:3532 +msgid "printer-state-reasons.puncher-opened" +msgstr "" + +#. TRANSLATORS: Puncher Over Temperature +#: locale/ipp-strings.c:3534 +msgid "printer-state-reasons.puncher-over-temperature" +msgstr "" + +#. TRANSLATORS: Puncher Power Saver +#: locale/ipp-strings.c:3536 +msgid "printer-state-reasons.puncher-power-saver" +msgstr "" + +#. TRANSLATORS: Puncher Recoverable Failure +#: locale/ipp-strings.c:3538 +msgid "printer-state-reasons.puncher-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Puncher Recoverable Storage +#: locale/ipp-strings.c:3540 +msgid "printer-state-reasons.puncher-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Puncher Removed +#: locale/ipp-strings.c:3542 +msgid "printer-state-reasons.puncher-removed" +msgstr "" + +#. TRANSLATORS: Puncher Resource Added +#: locale/ipp-strings.c:3544 +msgid "printer-state-reasons.puncher-resource-added" +msgstr "" + +#. TRANSLATORS: Puncher Resource Removed +#: locale/ipp-strings.c:3546 +msgid "printer-state-reasons.puncher-resource-removed" +msgstr "" + +#. TRANSLATORS: Puncher Thermistor Failure +#: locale/ipp-strings.c:3548 +msgid "printer-state-reasons.puncher-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Puncher Timing Failure +#: locale/ipp-strings.c:3550 +msgid "printer-state-reasons.puncher-timing-failure" +msgstr "" + +#. TRANSLATORS: Puncher Turned Off +#: locale/ipp-strings.c:3552 +msgid "printer-state-reasons.puncher-turned-off" +msgstr "" + +#. TRANSLATORS: Puncher Turned On +#: locale/ipp-strings.c:3554 +msgid "printer-state-reasons.puncher-turned-on" +msgstr "" + +#. TRANSLATORS: Puncher Under Temperature +#: locale/ipp-strings.c:3556 +msgid "printer-state-reasons.puncher-under-temperature" +msgstr "" + +#. TRANSLATORS: Puncher Unrecoverable Failure +#: locale/ipp-strings.c:3558 +msgid "printer-state-reasons.puncher-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Puncher Unrecoverable Storage Error +#: locale/ipp-strings.c:3560 +msgid "printer-state-reasons.puncher-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Puncher Warming Up +#: locale/ipp-strings.c:3562 +msgid "printer-state-reasons.puncher-warming-up" +msgstr "" + +#. TRANSLATORS: Separation Cutter Added +#: locale/ipp-strings.c:3564 +msgid "printer-state-reasons.separation-cutter-added" +msgstr "" + +#. TRANSLATORS: Separation Cutter Almost Empty +#: locale/ipp-strings.c:3566 +msgid "printer-state-reasons.separation-cutter-almost-empty" +msgstr "" + +#. TRANSLATORS: Separation Cutter Almost Full +#: locale/ipp-strings.c:3568 +msgid "printer-state-reasons.separation-cutter-almost-full" +msgstr "" + +#. TRANSLATORS: Separation Cutter At Limit +#: locale/ipp-strings.c:3570 +msgid "printer-state-reasons.separation-cutter-at-limit" +msgstr "" + +#. TRANSLATORS: Separation Cutter Closed +#: locale/ipp-strings.c:3572 +msgid "printer-state-reasons.separation-cutter-closed" +msgstr "" + +#. TRANSLATORS: Separation Cutter Configuration Change +#: locale/ipp-strings.c:3574 +msgid "printer-state-reasons.separation-cutter-configuration-change" +msgstr "" + +#. TRANSLATORS: Separation Cutter Cover Closed +#: locale/ipp-strings.c:3576 +msgid "printer-state-reasons.separation-cutter-cover-closed" +msgstr "" + +#. TRANSLATORS: Separation Cutter Cover Open +#: locale/ipp-strings.c:3578 +msgid "printer-state-reasons.separation-cutter-cover-open" +msgstr "" + +#. TRANSLATORS: Separation Cutter Empty +#: locale/ipp-strings.c:3580 +msgid "printer-state-reasons.separation-cutter-empty" +msgstr "" + +#. TRANSLATORS: Separation Cutter Full +#: locale/ipp-strings.c:3582 +msgid "printer-state-reasons.separation-cutter-full" +msgstr "" + +#. TRANSLATORS: Separation Cutter Interlock Closed +#: locale/ipp-strings.c:3584 +msgid "printer-state-reasons.separation-cutter-interlock-closed" +msgstr "" + +#. TRANSLATORS: Separation Cutter Interlock Open +#: locale/ipp-strings.c:3586 +msgid "printer-state-reasons.separation-cutter-interlock-open" +msgstr "" + +#. TRANSLATORS: Separation Cutter Jam +#: locale/ipp-strings.c:3588 +msgid "printer-state-reasons.separation-cutter-jam" +msgstr "" + +#. TRANSLATORS: Separation Cutter Life Almost Over +#: locale/ipp-strings.c:3590 +msgid "printer-state-reasons.separation-cutter-life-almost-over" +msgstr "" + +#. TRANSLATORS: Separation Cutter Life Over +#: locale/ipp-strings.c:3592 +msgid "printer-state-reasons.separation-cutter-life-over" +msgstr "" + +#. TRANSLATORS: Separation Cutter Memory Exhausted +#: locale/ipp-strings.c:3594 +msgid "printer-state-reasons.separation-cutter-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Separation Cutter Missing +#: locale/ipp-strings.c:3596 +msgid "printer-state-reasons.separation-cutter-missing" +msgstr "" + +#. TRANSLATORS: Separation Cutter Motor Failure +#: locale/ipp-strings.c:3598 +msgid "printer-state-reasons.separation-cutter-motor-failure" +msgstr "" + +#. TRANSLATORS: Separation Cutter Near Limit +#: locale/ipp-strings.c:3600 +msgid "printer-state-reasons.separation-cutter-near-limit" +msgstr "" + +#. TRANSLATORS: Separation Cutter Offline +#: locale/ipp-strings.c:3602 +msgid "printer-state-reasons.separation-cutter-offline" +msgstr "" + +#. TRANSLATORS: Separation Cutter Opened +#: locale/ipp-strings.c:3604 +msgid "printer-state-reasons.separation-cutter-opened" +msgstr "" + +#. TRANSLATORS: Separation Cutter Over Temperature +#: locale/ipp-strings.c:3606 +msgid "printer-state-reasons.separation-cutter-over-temperature" +msgstr "" + +#. TRANSLATORS: Separation Cutter Power Saver +#: locale/ipp-strings.c:3608 +msgid "printer-state-reasons.separation-cutter-power-saver" +msgstr "" + +#. TRANSLATORS: Separation Cutter Recoverable Failure +#: locale/ipp-strings.c:3610 +msgid "printer-state-reasons.separation-cutter-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Separation Cutter Recoverable Storage +#: locale/ipp-strings.c:3612 +msgid "printer-state-reasons.separation-cutter-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Separation Cutter Removed +#: locale/ipp-strings.c:3614 +msgid "printer-state-reasons.separation-cutter-removed" +msgstr "" + +#. TRANSLATORS: Separation Cutter Resource Added +#: locale/ipp-strings.c:3616 +msgid "printer-state-reasons.separation-cutter-resource-added" +msgstr "" + +#. TRANSLATORS: Separation Cutter Resource Removed +#: locale/ipp-strings.c:3618 +msgid "printer-state-reasons.separation-cutter-resource-removed" +msgstr "" + +#. TRANSLATORS: Separation Cutter Thermistor Failure +#: locale/ipp-strings.c:3620 +msgid "printer-state-reasons.separation-cutter-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Separation Cutter Timing Failure +#: locale/ipp-strings.c:3622 +msgid "printer-state-reasons.separation-cutter-timing-failure" +msgstr "" + +#. TRANSLATORS: Separation Cutter Turned Off +#: locale/ipp-strings.c:3624 +msgid "printer-state-reasons.separation-cutter-turned-off" +msgstr "" + +#. TRANSLATORS: Separation Cutter Turned On +#: locale/ipp-strings.c:3626 +msgid "printer-state-reasons.separation-cutter-turned-on" +msgstr "" + +#. TRANSLATORS: Separation Cutter Under Temperature +#: locale/ipp-strings.c:3628 +msgid "printer-state-reasons.separation-cutter-under-temperature" +msgstr "" + +#. TRANSLATORS: Separation Cutter Unrecoverable Failure +#: locale/ipp-strings.c:3630 +msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Separation Cutter Unrecoverable Storage Error +#: locale/ipp-strings.c:3632 +msgid "printer-state-reasons.separation-cutter-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Separation Cutter Warming Up +#: locale/ipp-strings.c:3634 +msgid "printer-state-reasons.separation-cutter-warming-up" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Added +#: locale/ipp-strings.c:3636 +msgid "printer-state-reasons.sheet-rotator-added" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Almost Empty +#: locale/ipp-strings.c:3638 +msgid "printer-state-reasons.sheet-rotator-almost-empty" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Almost Full +#: locale/ipp-strings.c:3640 +msgid "printer-state-reasons.sheet-rotator-almost-full" +msgstr "" + +#. TRANSLATORS: Sheet Rotator At Limit +#: locale/ipp-strings.c:3642 +msgid "printer-state-reasons.sheet-rotator-at-limit" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Closed +#: locale/ipp-strings.c:3644 +msgid "printer-state-reasons.sheet-rotator-closed" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Configuration Change +#: locale/ipp-strings.c:3646 +msgid "printer-state-reasons.sheet-rotator-configuration-change" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Cover Closed +#: locale/ipp-strings.c:3648 +msgid "printer-state-reasons.sheet-rotator-cover-closed" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Cover Open +#: locale/ipp-strings.c:3650 +msgid "printer-state-reasons.sheet-rotator-cover-open" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Empty +#: locale/ipp-strings.c:3652 +msgid "printer-state-reasons.sheet-rotator-empty" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Full +#: locale/ipp-strings.c:3654 +msgid "printer-state-reasons.sheet-rotator-full" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Interlock Closed +#: locale/ipp-strings.c:3656 +msgid "printer-state-reasons.sheet-rotator-interlock-closed" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Interlock Open +#: locale/ipp-strings.c:3658 +msgid "printer-state-reasons.sheet-rotator-interlock-open" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Jam +#: locale/ipp-strings.c:3660 +msgid "printer-state-reasons.sheet-rotator-jam" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Life Almost Over +#: locale/ipp-strings.c:3662 +msgid "printer-state-reasons.sheet-rotator-life-almost-over" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Life Over +#: locale/ipp-strings.c:3664 +msgid "printer-state-reasons.sheet-rotator-life-over" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Memory Exhausted +#: locale/ipp-strings.c:3666 +msgid "printer-state-reasons.sheet-rotator-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Missing +#: locale/ipp-strings.c:3668 +msgid "printer-state-reasons.sheet-rotator-missing" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Motor Failure +#: locale/ipp-strings.c:3670 +msgid "printer-state-reasons.sheet-rotator-motor-failure" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Near Limit +#: locale/ipp-strings.c:3672 +msgid "printer-state-reasons.sheet-rotator-near-limit" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Offline +#: locale/ipp-strings.c:3674 +msgid "printer-state-reasons.sheet-rotator-offline" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Opened +#: locale/ipp-strings.c:3676 +msgid "printer-state-reasons.sheet-rotator-opened" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Over Temperature +#: locale/ipp-strings.c:3678 +msgid "printer-state-reasons.sheet-rotator-over-temperature" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Power Saver +#: locale/ipp-strings.c:3680 +msgid "printer-state-reasons.sheet-rotator-power-saver" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Recoverable Failure +#: locale/ipp-strings.c:3682 +msgid "printer-state-reasons.sheet-rotator-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Recoverable Storage +#: locale/ipp-strings.c:3684 +msgid "printer-state-reasons.sheet-rotator-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Removed +#: locale/ipp-strings.c:3686 +msgid "printer-state-reasons.sheet-rotator-removed" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Resource Added +#: locale/ipp-strings.c:3688 +msgid "printer-state-reasons.sheet-rotator-resource-added" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Resource Removed +#: locale/ipp-strings.c:3690 +msgid "printer-state-reasons.sheet-rotator-resource-removed" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Thermistor Failure +#: locale/ipp-strings.c:3692 +msgid "printer-state-reasons.sheet-rotator-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Timing Failure +#: locale/ipp-strings.c:3694 +msgid "printer-state-reasons.sheet-rotator-timing-failure" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Turned Off +#: locale/ipp-strings.c:3696 +msgid "printer-state-reasons.sheet-rotator-turned-off" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Turned On +#: locale/ipp-strings.c:3698 +msgid "printer-state-reasons.sheet-rotator-turned-on" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Under Temperature +#: locale/ipp-strings.c:3700 +msgid "printer-state-reasons.sheet-rotator-under-temperature" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Unrecoverable Failure +#: locale/ipp-strings.c:3702 +msgid "printer-state-reasons.sheet-rotator-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Unrecoverable Storage Error +#: locale/ipp-strings.c:3704 +msgid "printer-state-reasons.sheet-rotator-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Sheet Rotator Warming Up +#: locale/ipp-strings.c:3706 +msgid "printer-state-reasons.sheet-rotator-warming-up" +msgstr "" + +#. TRANSLATORS: Printer offline +#: locale/ipp-strings.c:3708 +msgid "printer-state-reasons.shutdown" +msgstr "" + +#. TRANSLATORS: Slitter Added +#: locale/ipp-strings.c:3710 +msgid "printer-state-reasons.slitter-added" +msgstr "" + +#. TRANSLATORS: Slitter Almost Empty +#: locale/ipp-strings.c:3712 +msgid "printer-state-reasons.slitter-almost-empty" +msgstr "" + +#. TRANSLATORS: Slitter Almost Full +#: locale/ipp-strings.c:3714 +msgid "printer-state-reasons.slitter-almost-full" +msgstr "" + +#. TRANSLATORS: Slitter At Limit +#: locale/ipp-strings.c:3716 +msgid "printer-state-reasons.slitter-at-limit" +msgstr "" + +#. TRANSLATORS: Slitter Closed +#: locale/ipp-strings.c:3718 +msgid "printer-state-reasons.slitter-closed" +msgstr "" + +#. TRANSLATORS: Slitter Configuration Change +#: locale/ipp-strings.c:3720 +msgid "printer-state-reasons.slitter-configuration-change" +msgstr "" + +#. TRANSLATORS: Slitter Cover Closed +#: locale/ipp-strings.c:3722 +msgid "printer-state-reasons.slitter-cover-closed" +msgstr "" + +#. TRANSLATORS: Slitter Cover Open +#: locale/ipp-strings.c:3724 +msgid "printer-state-reasons.slitter-cover-open" +msgstr "" + +#. TRANSLATORS: Slitter Empty +#: locale/ipp-strings.c:3726 +msgid "printer-state-reasons.slitter-empty" +msgstr "" + +#. TRANSLATORS: Slitter Full +#: locale/ipp-strings.c:3728 +msgid "printer-state-reasons.slitter-full" +msgstr "" + +#. TRANSLATORS: Slitter Interlock Closed +#: locale/ipp-strings.c:3730 +msgid "printer-state-reasons.slitter-interlock-closed" +msgstr "" + +#. TRANSLATORS: Slitter Interlock Open +#: locale/ipp-strings.c:3732 +msgid "printer-state-reasons.slitter-interlock-open" +msgstr "" + +#. TRANSLATORS: Slitter Jam +#: locale/ipp-strings.c:3734 +msgid "printer-state-reasons.slitter-jam" +msgstr "" + +#. TRANSLATORS: Slitter Life Almost Over +#: locale/ipp-strings.c:3736 +msgid "printer-state-reasons.slitter-life-almost-over" +msgstr "" + +#. TRANSLATORS: Slitter Life Over +#: locale/ipp-strings.c:3738 +msgid "printer-state-reasons.slitter-life-over" +msgstr "" + +#. TRANSLATORS: Slitter Memory Exhausted +#: locale/ipp-strings.c:3740 +msgid "printer-state-reasons.slitter-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Slitter Missing +#: locale/ipp-strings.c:3742 +msgid "printer-state-reasons.slitter-missing" +msgstr "" + +#. TRANSLATORS: Slitter Motor Failure +#: locale/ipp-strings.c:3744 +msgid "printer-state-reasons.slitter-motor-failure" +msgstr "" + +#. TRANSLATORS: Slitter Near Limit +#: locale/ipp-strings.c:3746 +msgid "printer-state-reasons.slitter-near-limit" +msgstr "" + +#. TRANSLATORS: Slitter Offline +#: locale/ipp-strings.c:3748 +msgid "printer-state-reasons.slitter-offline" +msgstr "" + +#. TRANSLATORS: Slitter Opened +#: locale/ipp-strings.c:3750 +msgid "printer-state-reasons.slitter-opened" +msgstr "" + +#. TRANSLATORS: Slitter Over Temperature +#: locale/ipp-strings.c:3752 +msgid "printer-state-reasons.slitter-over-temperature" +msgstr "" + +#. TRANSLATORS: Slitter Power Saver +#: locale/ipp-strings.c:3754 +msgid "printer-state-reasons.slitter-power-saver" +msgstr "" + +#. TRANSLATORS: Slitter Recoverable Failure +#: locale/ipp-strings.c:3756 +msgid "printer-state-reasons.slitter-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Slitter Recoverable Storage +#: locale/ipp-strings.c:3758 +msgid "printer-state-reasons.slitter-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Slitter Removed +#: locale/ipp-strings.c:3760 +msgid "printer-state-reasons.slitter-removed" +msgstr "" + +#. TRANSLATORS: Slitter Resource Added +#: locale/ipp-strings.c:3762 +msgid "printer-state-reasons.slitter-resource-added" +msgstr "" + +#. TRANSLATORS: Slitter Resource Removed +#: locale/ipp-strings.c:3764 +msgid "printer-state-reasons.slitter-resource-removed" +msgstr "" + +#. TRANSLATORS: Slitter Thermistor Failure +#: locale/ipp-strings.c:3766 +msgid "printer-state-reasons.slitter-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Slitter Timing Failure +#: locale/ipp-strings.c:3768 +msgid "printer-state-reasons.slitter-timing-failure" +msgstr "" + +#. TRANSLATORS: Slitter Turned Off +#: locale/ipp-strings.c:3770 +msgid "printer-state-reasons.slitter-turned-off" +msgstr "" + +#. TRANSLATORS: Slitter Turned On +#: locale/ipp-strings.c:3772 +msgid "printer-state-reasons.slitter-turned-on" +msgstr "" + +#. TRANSLATORS: Slitter Under Temperature +#: locale/ipp-strings.c:3774 +msgid "printer-state-reasons.slitter-under-temperature" +msgstr "" + +#. TRANSLATORS: Slitter Unrecoverable Failure +#: locale/ipp-strings.c:3776 +msgid "printer-state-reasons.slitter-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Slitter Unrecoverable Storage Error +#: locale/ipp-strings.c:3778 +msgid "printer-state-reasons.slitter-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Slitter Warming Up +#: locale/ipp-strings.c:3780 +msgid "printer-state-reasons.slitter-warming-up" +msgstr "" + +#. TRANSLATORS: Spool Area Full +#: locale/ipp-strings.c:3782 +msgid "printer-state-reasons.spool-area-full" +msgstr "" + +#. TRANSLATORS: Stacker Added +#: locale/ipp-strings.c:3784 +msgid "printer-state-reasons.stacker-added" +msgstr "" + +#. TRANSLATORS: Stacker Almost Empty +#: locale/ipp-strings.c:3786 +msgid "printer-state-reasons.stacker-almost-empty" +msgstr "" + +#. TRANSLATORS: Stacker Almost Full +#: locale/ipp-strings.c:3788 +msgid "printer-state-reasons.stacker-almost-full" +msgstr "" + +#. TRANSLATORS: Stacker At Limit +#: locale/ipp-strings.c:3790 +msgid "printer-state-reasons.stacker-at-limit" +msgstr "" + +#. TRANSLATORS: Stacker Closed +#: locale/ipp-strings.c:3792 +msgid "printer-state-reasons.stacker-closed" +msgstr "" + +#. TRANSLATORS: Stacker Configuration Change +#: locale/ipp-strings.c:3794 +msgid "printer-state-reasons.stacker-configuration-change" +msgstr "" + +#. TRANSLATORS: Stacker Cover Closed +#: locale/ipp-strings.c:3796 +msgid "printer-state-reasons.stacker-cover-closed" +msgstr "" + +#. TRANSLATORS: Stacker Cover Open +#: locale/ipp-strings.c:3798 +msgid "printer-state-reasons.stacker-cover-open" +msgstr "" + +#. TRANSLATORS: Stacker Empty +#: locale/ipp-strings.c:3800 +msgid "printer-state-reasons.stacker-empty" +msgstr "" + +#. TRANSLATORS: Stacker Full +#: locale/ipp-strings.c:3802 +msgid "printer-state-reasons.stacker-full" +msgstr "" + +#. TRANSLATORS: Stacker Interlock Closed +#: locale/ipp-strings.c:3804 +msgid "printer-state-reasons.stacker-interlock-closed" +msgstr "" + +#. TRANSLATORS: Stacker Interlock Open +#: locale/ipp-strings.c:3806 +msgid "printer-state-reasons.stacker-interlock-open" +msgstr "" + +#. TRANSLATORS: Stacker Jam +#: locale/ipp-strings.c:3808 +msgid "printer-state-reasons.stacker-jam" +msgstr "" + +#. TRANSLATORS: Stacker Life Almost Over +#: locale/ipp-strings.c:3810 +msgid "printer-state-reasons.stacker-life-almost-over" +msgstr "" + +#. TRANSLATORS: Stacker Life Over +#: locale/ipp-strings.c:3812 +msgid "printer-state-reasons.stacker-life-over" +msgstr "" + +#. TRANSLATORS: Stacker Memory Exhausted +#: locale/ipp-strings.c:3814 +msgid "printer-state-reasons.stacker-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Stacker Missing +#: locale/ipp-strings.c:3816 +msgid "printer-state-reasons.stacker-missing" +msgstr "" + +#. TRANSLATORS: Stacker Motor Failure +#: locale/ipp-strings.c:3818 +msgid "printer-state-reasons.stacker-motor-failure" +msgstr "" + +#. TRANSLATORS: Stacker Near Limit +#: locale/ipp-strings.c:3820 +msgid "printer-state-reasons.stacker-near-limit" +msgstr "" + +#. TRANSLATORS: Stacker Offline +#: locale/ipp-strings.c:3822 +msgid "printer-state-reasons.stacker-offline" +msgstr "" + +#. TRANSLATORS: Stacker Opened +#: locale/ipp-strings.c:3824 +msgid "printer-state-reasons.stacker-opened" +msgstr "" + +#. TRANSLATORS: Stacker Over Temperature +#: locale/ipp-strings.c:3826 +msgid "printer-state-reasons.stacker-over-temperature" +msgstr "" + +#. TRANSLATORS: Stacker Power Saver +#: locale/ipp-strings.c:3828 +msgid "printer-state-reasons.stacker-power-saver" +msgstr "" + +#. TRANSLATORS: Stacker Recoverable Failure +#: locale/ipp-strings.c:3830 +msgid "printer-state-reasons.stacker-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Stacker Recoverable Storage +#: locale/ipp-strings.c:3832 +msgid "printer-state-reasons.stacker-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Stacker Removed +#: locale/ipp-strings.c:3834 +msgid "printer-state-reasons.stacker-removed" +msgstr "" + +#. TRANSLATORS: Stacker Resource Added +#: locale/ipp-strings.c:3836 +msgid "printer-state-reasons.stacker-resource-added" +msgstr "" + +#. TRANSLATORS: Stacker Resource Removed +#: locale/ipp-strings.c:3838 +msgid "printer-state-reasons.stacker-resource-removed" +msgstr "" + +#. TRANSLATORS: Stacker Thermistor Failure +#: locale/ipp-strings.c:3840 +msgid "printer-state-reasons.stacker-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Stacker Timing Failure +#: locale/ipp-strings.c:3842 +msgid "printer-state-reasons.stacker-timing-failure" +msgstr "" + +#. TRANSLATORS: Stacker Turned Off +#: locale/ipp-strings.c:3844 +msgid "printer-state-reasons.stacker-turned-off" +msgstr "" + +#. TRANSLATORS: Stacker Turned On +#: locale/ipp-strings.c:3846 +msgid "printer-state-reasons.stacker-turned-on" +msgstr "" + +#. TRANSLATORS: Stacker Under Temperature +#: locale/ipp-strings.c:3848 +msgid "printer-state-reasons.stacker-under-temperature" +msgstr "" + +#. TRANSLATORS: Stacker Unrecoverable Failure +#: locale/ipp-strings.c:3850 +msgid "printer-state-reasons.stacker-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Stacker Unrecoverable Storage Error +#: locale/ipp-strings.c:3852 +msgid "printer-state-reasons.stacker-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Stacker Warming Up +#: locale/ipp-strings.c:3854 +msgid "printer-state-reasons.stacker-warming-up" +msgstr "" + +#. TRANSLATORS: Stapler Added +#: locale/ipp-strings.c:3856 +msgid "printer-state-reasons.stapler-added" +msgstr "" + +#. TRANSLATORS: Stapler Almost Empty +#: locale/ipp-strings.c:3858 +msgid "printer-state-reasons.stapler-almost-empty" +msgstr "" + +#. TRANSLATORS: Stapler Almost Full +#: locale/ipp-strings.c:3860 +msgid "printer-state-reasons.stapler-almost-full" +msgstr "" + +#. TRANSLATORS: Stapler At Limit +#: locale/ipp-strings.c:3862 +msgid "printer-state-reasons.stapler-at-limit" +msgstr "" + +#. TRANSLATORS: Stapler Closed +#: locale/ipp-strings.c:3864 +msgid "printer-state-reasons.stapler-closed" +msgstr "" + +#. TRANSLATORS: Stapler Configuration Change +#: locale/ipp-strings.c:3866 +msgid "printer-state-reasons.stapler-configuration-change" +msgstr "" + +#. TRANSLATORS: Stapler Cover Closed +#: locale/ipp-strings.c:3868 +msgid "printer-state-reasons.stapler-cover-closed" +msgstr "" + +#. TRANSLATORS: Stapler Cover Open +#: locale/ipp-strings.c:3870 +msgid "printer-state-reasons.stapler-cover-open" +msgstr "" + +#. TRANSLATORS: Stapler Empty +#: locale/ipp-strings.c:3872 +msgid "printer-state-reasons.stapler-empty" +msgstr "" + +#. TRANSLATORS: Stapler Full +#: locale/ipp-strings.c:3874 +msgid "printer-state-reasons.stapler-full" +msgstr "" + +#. TRANSLATORS: Stapler Interlock Closed +#: locale/ipp-strings.c:3876 +msgid "printer-state-reasons.stapler-interlock-closed" +msgstr "" + +#. TRANSLATORS: Stapler Interlock Open +#: locale/ipp-strings.c:3878 +msgid "printer-state-reasons.stapler-interlock-open" +msgstr "" + +#. TRANSLATORS: Stapler Jam +#: locale/ipp-strings.c:3880 +msgid "printer-state-reasons.stapler-jam" +msgstr "" + +#. TRANSLATORS: Stapler Life Almost Over +#: locale/ipp-strings.c:3882 +msgid "printer-state-reasons.stapler-life-almost-over" +msgstr "" + +#. TRANSLATORS: Stapler Life Over +#: locale/ipp-strings.c:3884 +msgid "printer-state-reasons.stapler-life-over" +msgstr "" + +#. TRANSLATORS: Stapler Memory Exhausted +#: locale/ipp-strings.c:3886 +msgid "printer-state-reasons.stapler-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Stapler Missing +#: locale/ipp-strings.c:3888 +msgid "printer-state-reasons.stapler-missing" +msgstr "" + +#. TRANSLATORS: Stapler Motor Failure +#: locale/ipp-strings.c:3890 +msgid "printer-state-reasons.stapler-motor-failure" +msgstr "" + +#. TRANSLATORS: Stapler Near Limit +#: locale/ipp-strings.c:3892 +msgid "printer-state-reasons.stapler-near-limit" +msgstr "" + +#. TRANSLATORS: Stapler Offline +#: locale/ipp-strings.c:3894 +msgid "printer-state-reasons.stapler-offline" +msgstr "" + +#. TRANSLATORS: Stapler Opened +#: locale/ipp-strings.c:3896 +msgid "printer-state-reasons.stapler-opened" +msgstr "" + +#. TRANSLATORS: Stapler Over Temperature +#: locale/ipp-strings.c:3898 +msgid "printer-state-reasons.stapler-over-temperature" +msgstr "" + +#. TRANSLATORS: Stapler Power Saver +#: locale/ipp-strings.c:3900 +msgid "printer-state-reasons.stapler-power-saver" +msgstr "" + +#. TRANSLATORS: Stapler Recoverable Failure +#: locale/ipp-strings.c:3902 +msgid "printer-state-reasons.stapler-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Stapler Recoverable Storage +#: locale/ipp-strings.c:3904 +msgid "printer-state-reasons.stapler-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Stapler Removed +#: locale/ipp-strings.c:3906 +msgid "printer-state-reasons.stapler-removed" +msgstr "" + +#. TRANSLATORS: Stapler Resource Added +#: locale/ipp-strings.c:3908 +msgid "printer-state-reasons.stapler-resource-added" +msgstr "" + +#. TRANSLATORS: Stapler Resource Removed +#: locale/ipp-strings.c:3910 +msgid "printer-state-reasons.stapler-resource-removed" +msgstr "" + +#. TRANSLATORS: Stapler Thermistor Failure +#: locale/ipp-strings.c:3912 +msgid "printer-state-reasons.stapler-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Stapler Timing Failure +#: locale/ipp-strings.c:3914 +msgid "printer-state-reasons.stapler-timing-failure" +msgstr "" + +#. TRANSLATORS: Stapler Turned Off +#: locale/ipp-strings.c:3916 +msgid "printer-state-reasons.stapler-turned-off" +msgstr "" + +#. TRANSLATORS: Stapler Turned On +#: locale/ipp-strings.c:3918 +msgid "printer-state-reasons.stapler-turned-on" +msgstr "" + +#. TRANSLATORS: Stapler Under Temperature +#: locale/ipp-strings.c:3920 +msgid "printer-state-reasons.stapler-under-temperature" +msgstr "" + +#. TRANSLATORS: Stapler Unrecoverable Failure +#: locale/ipp-strings.c:3922 +msgid "printer-state-reasons.stapler-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Stapler Unrecoverable Storage Error +#: locale/ipp-strings.c:3924 +msgid "printer-state-reasons.stapler-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Stapler Warming Up +#: locale/ipp-strings.c:3926 +msgid "printer-state-reasons.stapler-warming-up" +msgstr "" + +#. TRANSLATORS: Stitcher Added +#: locale/ipp-strings.c:3928 +msgid "printer-state-reasons.stitcher-added" +msgstr "" + +#. TRANSLATORS: Stitcher Almost Empty +#: locale/ipp-strings.c:3930 +msgid "printer-state-reasons.stitcher-almost-empty" +msgstr "" + +#. TRANSLATORS: Stitcher Almost Full +#: locale/ipp-strings.c:3932 +msgid "printer-state-reasons.stitcher-almost-full" +msgstr "" + +#. TRANSLATORS: Stitcher At Limit +#: locale/ipp-strings.c:3934 +msgid "printer-state-reasons.stitcher-at-limit" +msgstr "" + +#. TRANSLATORS: Stitcher Closed +#: locale/ipp-strings.c:3936 +msgid "printer-state-reasons.stitcher-closed" +msgstr "" + +#. TRANSLATORS: Stitcher Configuration Change +#: locale/ipp-strings.c:3938 +msgid "printer-state-reasons.stitcher-configuration-change" +msgstr "" + +#. TRANSLATORS: Stitcher Cover Closed +#: locale/ipp-strings.c:3940 +msgid "printer-state-reasons.stitcher-cover-closed" +msgstr "" + +#. TRANSLATORS: Stitcher Cover Open +#: locale/ipp-strings.c:3942 +msgid "printer-state-reasons.stitcher-cover-open" +msgstr "" + +#. TRANSLATORS: Stitcher Empty +#: locale/ipp-strings.c:3944 +msgid "printer-state-reasons.stitcher-empty" +msgstr "" + +#. TRANSLATORS: Stitcher Full +#: locale/ipp-strings.c:3946 +msgid "printer-state-reasons.stitcher-full" +msgstr "" + +#. TRANSLATORS: Stitcher Interlock Closed +#: locale/ipp-strings.c:3948 +msgid "printer-state-reasons.stitcher-interlock-closed" +msgstr "" + +#. TRANSLATORS: Stitcher Interlock Open +#: locale/ipp-strings.c:3950 +msgid "printer-state-reasons.stitcher-interlock-open" +msgstr "" + +#. TRANSLATORS: Stitcher Jam +#: locale/ipp-strings.c:3952 +msgid "printer-state-reasons.stitcher-jam" +msgstr "" + +#. TRANSLATORS: Stitcher Life Almost Over +#: locale/ipp-strings.c:3954 +msgid "printer-state-reasons.stitcher-life-almost-over" +msgstr "" + +#. TRANSLATORS: Stitcher Life Over +#: locale/ipp-strings.c:3956 +msgid "printer-state-reasons.stitcher-life-over" +msgstr "" + +#. TRANSLATORS: Stitcher Memory Exhausted +#: locale/ipp-strings.c:3958 +msgid "printer-state-reasons.stitcher-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Stitcher Missing +#: locale/ipp-strings.c:3960 +msgid "printer-state-reasons.stitcher-missing" +msgstr "" + +#. TRANSLATORS: Stitcher Motor Failure +#: locale/ipp-strings.c:3962 +msgid "printer-state-reasons.stitcher-motor-failure" +msgstr "" + +#. TRANSLATORS: Stitcher Near Limit +#: locale/ipp-strings.c:3964 +msgid "printer-state-reasons.stitcher-near-limit" +msgstr "" + +#. TRANSLATORS: Stitcher Offline +#: locale/ipp-strings.c:3966 +msgid "printer-state-reasons.stitcher-offline" +msgstr "" + +#. TRANSLATORS: Stitcher Opened +#: locale/ipp-strings.c:3968 +msgid "printer-state-reasons.stitcher-opened" +msgstr "" + +#. TRANSLATORS: Stitcher Over Temperature +#: locale/ipp-strings.c:3970 +msgid "printer-state-reasons.stitcher-over-temperature" +msgstr "" + +#. TRANSLATORS: Stitcher Power Saver +#: locale/ipp-strings.c:3972 +msgid "printer-state-reasons.stitcher-power-saver" +msgstr "" + +#. TRANSLATORS: Stitcher Recoverable Failure +#: locale/ipp-strings.c:3974 +msgid "printer-state-reasons.stitcher-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Stitcher Recoverable Storage +#: locale/ipp-strings.c:3976 +msgid "printer-state-reasons.stitcher-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Stitcher Removed +#: locale/ipp-strings.c:3978 +msgid "printer-state-reasons.stitcher-removed" +msgstr "" + +#. TRANSLATORS: Stitcher Resource Added +#: locale/ipp-strings.c:3980 +msgid "printer-state-reasons.stitcher-resource-added" +msgstr "" + +#. TRANSLATORS: Stitcher Resource Removed +#: locale/ipp-strings.c:3982 +msgid "printer-state-reasons.stitcher-resource-removed" +msgstr "" + +#. TRANSLATORS: Stitcher Thermistor Failure +#: locale/ipp-strings.c:3984 +msgid "printer-state-reasons.stitcher-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Stitcher Timing Failure +#: locale/ipp-strings.c:3986 +msgid "printer-state-reasons.stitcher-timing-failure" +msgstr "" + +#. TRANSLATORS: Stitcher Turned Off +#: locale/ipp-strings.c:3988 +msgid "printer-state-reasons.stitcher-turned-off" +msgstr "" + +#. TRANSLATORS: Stitcher Turned On +#: locale/ipp-strings.c:3990 +msgid "printer-state-reasons.stitcher-turned-on" +msgstr "" + +#. TRANSLATORS: Stitcher Under Temperature +#: locale/ipp-strings.c:3992 +msgid "printer-state-reasons.stitcher-under-temperature" +msgstr "" + +#. TRANSLATORS: Stitcher Unrecoverable Failure +#: locale/ipp-strings.c:3994 +msgid "printer-state-reasons.stitcher-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Stitcher Unrecoverable Storage Error +#: locale/ipp-strings.c:3996 +msgid "printer-state-reasons.stitcher-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Stitcher Warming Up +#: locale/ipp-strings.c:3998 +msgid "printer-state-reasons.stitcher-warming-up" +msgstr "" + +#. TRANSLATORS: Partially stopped +#: locale/ipp-strings.c:4000 +msgid "printer-state-reasons.stopped-partly" +msgstr "" + +#. TRANSLATORS: Stopping +#: locale/ipp-strings.c:4002 +msgid "printer-state-reasons.stopping" +msgstr "" + +#. TRANSLATORS: Subunit Added +#: locale/ipp-strings.c:4004 +msgid "printer-state-reasons.subunit-added" +msgstr "" + +#. TRANSLATORS: Subunit Almost Empty +#: locale/ipp-strings.c:4006 +msgid "printer-state-reasons.subunit-almost-empty" +msgstr "" + +#. TRANSLATORS: Subunit Almost Full +#: locale/ipp-strings.c:4008 +msgid "printer-state-reasons.subunit-almost-full" +msgstr "" + +#. TRANSLATORS: Subunit At Limit +#: locale/ipp-strings.c:4010 +msgid "printer-state-reasons.subunit-at-limit" +msgstr "" + +#. TRANSLATORS: Subunit Closed +#: locale/ipp-strings.c:4012 +msgid "printer-state-reasons.subunit-closed" +msgstr "" + +#. TRANSLATORS: Subunit Cooling Down +#: locale/ipp-strings.c:4014 +msgid "printer-state-reasons.subunit-cooling-down" +msgstr "" + +#. TRANSLATORS: Subunit Empty +#: locale/ipp-strings.c:4016 +msgid "printer-state-reasons.subunit-empty" +msgstr "" + +#. TRANSLATORS: Subunit Full +#: locale/ipp-strings.c:4018 +msgid "printer-state-reasons.subunit-full" +msgstr "" + +#. TRANSLATORS: Subunit Life Almost Over +#: locale/ipp-strings.c:4020 +msgid "printer-state-reasons.subunit-life-almost-over" +msgstr "" + +#. TRANSLATORS: Subunit Life Over +#: locale/ipp-strings.c:4022 +msgid "printer-state-reasons.subunit-life-over" +msgstr "" + +#. TRANSLATORS: Subunit Memory Exhausted +#: locale/ipp-strings.c:4024 +msgid "printer-state-reasons.subunit-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Subunit Missing +#: locale/ipp-strings.c:4026 +msgid "printer-state-reasons.subunit-missing" +msgstr "" + +#. TRANSLATORS: Subunit Motor Failure +#: locale/ipp-strings.c:4028 +msgid "printer-state-reasons.subunit-motor-failure" +msgstr "" + +#. TRANSLATORS: Subunit Near Limit +#: locale/ipp-strings.c:4030 +msgid "printer-state-reasons.subunit-near-limit" +msgstr "" + +#. TRANSLATORS: Subunit Offline +#: locale/ipp-strings.c:4032 +msgid "printer-state-reasons.subunit-offline" +msgstr "" + +#. TRANSLATORS: Subunit Opened +#: locale/ipp-strings.c:4034 +msgid "printer-state-reasons.subunit-opened" +msgstr "" + +#. TRANSLATORS: Subunit Over Temperature +#: locale/ipp-strings.c:4036 +msgid "printer-state-reasons.subunit-over-temperature" +msgstr "" + +#. TRANSLATORS: Subunit Power Saver +#: locale/ipp-strings.c:4038 +msgid "printer-state-reasons.subunit-power-saver" +msgstr "" + +#. TRANSLATORS: Subunit Recoverable Failure +#: locale/ipp-strings.c:4040 +msgid "printer-state-reasons.subunit-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Subunit Recoverable Storage +#: locale/ipp-strings.c:4042 +msgid "printer-state-reasons.subunit-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Subunit Removed +#: locale/ipp-strings.c:4044 +msgid "printer-state-reasons.subunit-removed" +msgstr "" + +#. TRANSLATORS: Subunit Resource Added +#: locale/ipp-strings.c:4046 +msgid "printer-state-reasons.subunit-resource-added" +msgstr "" + +#. TRANSLATORS: Subunit Resource Removed +#: locale/ipp-strings.c:4048 +msgid "printer-state-reasons.subunit-resource-removed" +msgstr "" + +#. TRANSLATORS: Subunit Thermistor Failure +#: locale/ipp-strings.c:4050 +msgid "printer-state-reasons.subunit-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Subunit Timing Failure +#: locale/ipp-strings.c:4052 +msgid "printer-state-reasons.subunit-timing-Failure" +msgstr "" + +#. TRANSLATORS: Subunit Turned Off +#: locale/ipp-strings.c:4054 +msgid "printer-state-reasons.subunit-turned-off" +msgstr "" + +#. TRANSLATORS: Subunit Turned On +#: locale/ipp-strings.c:4056 +msgid "printer-state-reasons.subunit-turned-on" +msgstr "" + +#. TRANSLATORS: Subunit Under Temperature +#: locale/ipp-strings.c:4058 +msgid "printer-state-reasons.subunit-under-temperature" +msgstr "" + +#. TRANSLATORS: Subunit Unrecoverable Failure +#: locale/ipp-strings.c:4060 +msgid "printer-state-reasons.subunit-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Subunit Unrecoverable Storage +#: locale/ipp-strings.c:4062 +msgid "printer-state-reasons.subunit-unrecoverable-storage" +msgstr "" + +#. TRANSLATORS: Subunit Warming Up +#: locale/ipp-strings.c:4064 +msgid "printer-state-reasons.subunit-warming-up" +msgstr "" + +#. TRANSLATORS: Printer stopped responding +#: locale/ipp-strings.c:4066 +msgid "printer-state-reasons.timed-out" +msgstr "" + +#. TRANSLATORS: Out of toner +#: locale/ipp-strings.c:4068 +msgid "printer-state-reasons.toner-empty" +msgstr "Ikke mere toner" + +#. TRANSLATORS: Toner low +#: locale/ipp-strings.c:4070 +msgid "printer-state-reasons.toner-low" +msgstr "Toner lav" + +#. TRANSLATORS: Trimmer Added +#: locale/ipp-strings.c:4072 +msgid "printer-state-reasons.trimmer-added" +msgstr "" + +#. TRANSLATORS: Trimmer Almost Empty +#: locale/ipp-strings.c:4074 +msgid "printer-state-reasons.trimmer-almost-empty" +msgstr "" + +#. TRANSLATORS: Trimmer Almost Full +#: locale/ipp-strings.c:4076 +msgid "printer-state-reasons.trimmer-almost-full" +msgstr "" + +#. TRANSLATORS: Trimmer At Limit +#: locale/ipp-strings.c:4078 +msgid "printer-state-reasons.trimmer-at-limit" +msgstr "" + +#. TRANSLATORS: Trimmer Closed +#: locale/ipp-strings.c:4080 +msgid "printer-state-reasons.trimmer-closed" +msgstr "" + +#. TRANSLATORS: Trimmer Configuration Change +#: locale/ipp-strings.c:4082 +msgid "printer-state-reasons.trimmer-configuration-change" +msgstr "" + +#. TRANSLATORS: Trimmer Cover Closed +#: locale/ipp-strings.c:4084 +msgid "printer-state-reasons.trimmer-cover-closed" +msgstr "" + +#. TRANSLATORS: Trimmer Cover Open +#: locale/ipp-strings.c:4086 +msgid "printer-state-reasons.trimmer-cover-open" +msgstr "" + +#. TRANSLATORS: Trimmer Empty +#: locale/ipp-strings.c:4088 +msgid "printer-state-reasons.trimmer-empty" +msgstr "" + +#. TRANSLATORS: Trimmer Full +#: locale/ipp-strings.c:4090 +msgid "printer-state-reasons.trimmer-full" +msgstr "" + +#. TRANSLATORS: Trimmer Interlock Closed +#: locale/ipp-strings.c:4092 +msgid "printer-state-reasons.trimmer-interlock-closed" +msgstr "" + +#. TRANSLATORS: Trimmer Interlock Open +#: locale/ipp-strings.c:4094 +msgid "printer-state-reasons.trimmer-interlock-open" +msgstr "" + +#. TRANSLATORS: Trimmer Jam +#: locale/ipp-strings.c:4096 +msgid "printer-state-reasons.trimmer-jam" +msgstr "" + +#. TRANSLATORS: Trimmer Life Almost Over +#: locale/ipp-strings.c:4098 +msgid "printer-state-reasons.trimmer-life-almost-over" +msgstr "" + +#. TRANSLATORS: Trimmer Life Over +#: locale/ipp-strings.c:4100 +msgid "printer-state-reasons.trimmer-life-over" +msgstr "" + +#. TRANSLATORS: Trimmer Memory Exhausted +#: locale/ipp-strings.c:4102 +msgid "printer-state-reasons.trimmer-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Trimmer Missing +#: locale/ipp-strings.c:4104 +msgid "printer-state-reasons.trimmer-missing" +msgstr "" + +#. TRANSLATORS: Trimmer Motor Failure +#: locale/ipp-strings.c:4106 +msgid "printer-state-reasons.trimmer-motor-failure" +msgstr "" + +#. TRANSLATORS: Trimmer Near Limit +#: locale/ipp-strings.c:4108 +msgid "printer-state-reasons.trimmer-near-limit" +msgstr "" + +#. TRANSLATORS: Trimmer Offline +#: locale/ipp-strings.c:4110 +msgid "printer-state-reasons.trimmer-offline" +msgstr "" + +#. TRANSLATORS: Trimmer Opened +#: locale/ipp-strings.c:4112 +msgid "printer-state-reasons.trimmer-opened" +msgstr "" + +#. TRANSLATORS: Trimmer Over Temperature +#: locale/ipp-strings.c:4114 +msgid "printer-state-reasons.trimmer-over-temperature" +msgstr "" + +#. TRANSLATORS: Trimmer Power Saver +#: locale/ipp-strings.c:4116 +msgid "printer-state-reasons.trimmer-power-saver" +msgstr "" + +#. TRANSLATORS: Trimmer Recoverable Failure +#: locale/ipp-strings.c:4118 +msgid "printer-state-reasons.trimmer-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Trimmer Recoverable Storage +#: locale/ipp-strings.c:4120 +msgid "printer-state-reasons.trimmer-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Trimmer Removed +#: locale/ipp-strings.c:4122 +msgid "printer-state-reasons.trimmer-removed" +msgstr "" + +#. TRANSLATORS: Trimmer Resource Added +#: locale/ipp-strings.c:4124 +msgid "printer-state-reasons.trimmer-resource-added" +msgstr "" + +#. TRANSLATORS: Trimmer Resource Removed +#: locale/ipp-strings.c:4126 +msgid "printer-state-reasons.trimmer-resource-removed" +msgstr "" + +#. TRANSLATORS: Trimmer Thermistor Failure +#: locale/ipp-strings.c:4128 +msgid "printer-state-reasons.trimmer-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Trimmer Timing Failure +#: locale/ipp-strings.c:4130 +msgid "printer-state-reasons.trimmer-timing-failure" +msgstr "" + +#. TRANSLATORS: Trimmer Turned Off +#: locale/ipp-strings.c:4132 +msgid "printer-state-reasons.trimmer-turned-off" +msgstr "" + +#. TRANSLATORS: Trimmer Turned On +#: locale/ipp-strings.c:4134 +msgid "printer-state-reasons.trimmer-turned-on" +msgstr "" + +#. TRANSLATORS: Trimmer Under Temperature +#: locale/ipp-strings.c:4136 +msgid "printer-state-reasons.trimmer-under-temperature" +msgstr "" + +#. TRANSLATORS: Trimmer Unrecoverable Failure +#: locale/ipp-strings.c:4138 +msgid "printer-state-reasons.trimmer-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Trimmer Unrecoverable Storage Error +#: locale/ipp-strings.c:4140 +msgid "printer-state-reasons.trimmer-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Trimmer Warming Up +#: locale/ipp-strings.c:4142 +msgid "printer-state-reasons.trimmer-warming-up" +msgstr "" + +#. TRANSLATORS: Unknown +#: locale/ipp-strings.c:4144 +msgid "printer-state-reasons.unknown" +msgstr "" + +#. TRANSLATORS: Wrapper Added +#: locale/ipp-strings.c:4146 +msgid "printer-state-reasons.wrapper-added" +msgstr "" + +#. TRANSLATORS: Wrapper Almost Empty +#: locale/ipp-strings.c:4148 +msgid "printer-state-reasons.wrapper-almost-empty" +msgstr "" + +#. TRANSLATORS: Wrapper Almost Full +#: locale/ipp-strings.c:4150 +msgid "printer-state-reasons.wrapper-almost-full" +msgstr "" + +#. TRANSLATORS: Wrapper At Limit +#: locale/ipp-strings.c:4152 +msgid "printer-state-reasons.wrapper-at-limit" +msgstr "" + +#. TRANSLATORS: Wrapper Closed +#: locale/ipp-strings.c:4154 +msgid "printer-state-reasons.wrapper-closed" +msgstr "" + +#. TRANSLATORS: Wrapper Configuration Change +#: locale/ipp-strings.c:4156 +msgid "printer-state-reasons.wrapper-configuration-change" +msgstr "" + +#. TRANSLATORS: Wrapper Cover Closed +#: locale/ipp-strings.c:4158 +msgid "printer-state-reasons.wrapper-cover-closed" +msgstr "" + +#. TRANSLATORS: Wrapper Cover Open +#: locale/ipp-strings.c:4160 +msgid "printer-state-reasons.wrapper-cover-open" +msgstr "" + +#. TRANSLATORS: Wrapper Empty +#: locale/ipp-strings.c:4162 +msgid "printer-state-reasons.wrapper-empty" +msgstr "" + +#. TRANSLATORS: Wrapper Full +#: locale/ipp-strings.c:4164 +msgid "printer-state-reasons.wrapper-full" +msgstr "" + +#. TRANSLATORS: Wrapper Interlock Closed +#: locale/ipp-strings.c:4166 +msgid "printer-state-reasons.wrapper-interlock-closed" +msgstr "" + +#. TRANSLATORS: Wrapper Interlock Open +#: locale/ipp-strings.c:4168 +msgid "printer-state-reasons.wrapper-interlock-open" +msgstr "" + +#. TRANSLATORS: Wrapper Jam +#: locale/ipp-strings.c:4170 +msgid "printer-state-reasons.wrapper-jam" +msgstr "" + +#. TRANSLATORS: Wrapper Life Almost Over +#: locale/ipp-strings.c:4172 +msgid "printer-state-reasons.wrapper-life-almost-over" +msgstr "" + +#. TRANSLATORS: Wrapper Life Over +#: locale/ipp-strings.c:4174 +msgid "printer-state-reasons.wrapper-life-over" +msgstr "" + +#. TRANSLATORS: Wrapper Memory Exhausted +#: locale/ipp-strings.c:4176 +msgid "printer-state-reasons.wrapper-memory-exhausted" +msgstr "" + +#. TRANSLATORS: Wrapper Missing +#: locale/ipp-strings.c:4178 +msgid "printer-state-reasons.wrapper-missing" +msgstr "" + +#. TRANSLATORS: Wrapper Motor Failure +#: locale/ipp-strings.c:4180 +msgid "printer-state-reasons.wrapper-motor-failure" +msgstr "" + +#. TRANSLATORS: Wrapper Near Limit +#: locale/ipp-strings.c:4182 +msgid "printer-state-reasons.wrapper-near-limit" +msgstr "" + +#. TRANSLATORS: Wrapper Offline +#: locale/ipp-strings.c:4184 +msgid "printer-state-reasons.wrapper-offline" +msgstr "" + +#. TRANSLATORS: Wrapper Opened +#: locale/ipp-strings.c:4186 +msgid "printer-state-reasons.wrapper-opened" +msgstr "" + +#. TRANSLATORS: Wrapper Over Temperature +#: locale/ipp-strings.c:4188 +msgid "printer-state-reasons.wrapper-over-temperature" +msgstr "" + +#. TRANSLATORS: Wrapper Power Saver +#: locale/ipp-strings.c:4190 +msgid "printer-state-reasons.wrapper-power-saver" +msgstr "" + +#. TRANSLATORS: Wrapper Recoverable Failure +#: locale/ipp-strings.c:4192 +msgid "printer-state-reasons.wrapper-recoverable-failure" +msgstr "" + +#. TRANSLATORS: Wrapper Recoverable Storage +#: locale/ipp-strings.c:4194 +msgid "printer-state-reasons.wrapper-recoverable-storage" +msgstr "" + +#. TRANSLATORS: Wrapper Removed +#: locale/ipp-strings.c:4196 +msgid "printer-state-reasons.wrapper-removed" +msgstr "" + +#. TRANSLATORS: Wrapper Resource Added +#: locale/ipp-strings.c:4198 +msgid "printer-state-reasons.wrapper-resource-added" +msgstr "" + +#. TRANSLATORS: Wrapper Resource Removed +#: locale/ipp-strings.c:4200 +msgid "printer-state-reasons.wrapper-resource-removed" +msgstr "" + +#. TRANSLATORS: Wrapper Thermistor Failure +#: locale/ipp-strings.c:4202 +msgid "printer-state-reasons.wrapper-thermistor-failure" +msgstr "" + +#. TRANSLATORS: Wrapper Timing Failure +#: locale/ipp-strings.c:4204 +msgid "printer-state-reasons.wrapper-timing-failure" +msgstr "" + +#. TRANSLATORS: Wrapper Turned Off +#: locale/ipp-strings.c:4206 +msgid "printer-state-reasons.wrapper-turned-off" +msgstr "" + +#. TRANSLATORS: Wrapper Turned On +#: locale/ipp-strings.c:4208 +msgid "printer-state-reasons.wrapper-turned-on" +msgstr "" + +#. TRANSLATORS: Wrapper Under Temperature +#: locale/ipp-strings.c:4210 +msgid "printer-state-reasons.wrapper-under-temperature" +msgstr "" + +#. TRANSLATORS: Wrapper Unrecoverable Failure +#: locale/ipp-strings.c:4212 +msgid "printer-state-reasons.wrapper-unrecoverable-failure" +msgstr "" + +#. TRANSLATORS: Wrapper Unrecoverable Storage Error +#: locale/ipp-strings.c:4214 +msgid "printer-state-reasons.wrapper-unrecoverable-storage-error" +msgstr "" + +#. TRANSLATORS: Wrapper Warming Up +#: locale/ipp-strings.c:4216 +msgid "printer-state-reasons.wrapper-warming-up" +msgstr "" + +#. TRANSLATORS: Idle +#: locale/ipp-strings.c:4218 +msgid "printer-state.3" +msgstr "" + +#. TRANSLATORS: Processing +#: locale/ipp-strings.c:4220 +msgid "printer-state.4" +msgstr "" + +#. TRANSLATORS: Stopped +#: locale/ipp-strings.c:4222 +msgid "printer-state.5" +msgstr "" + +#. TRANSLATORS: Printer Uptime +#: locale/ipp-strings.c:4224 +msgid "printer-up-time" +msgstr "" + +#: cups/notify.c:80 cups/notify.c:121 +msgid "processing" +msgstr "" + +#. TRANSLATORS: Proof Print +#: locale/ipp-strings.c:4226 +msgid "proof-print" +msgstr "" + +#. TRANSLATORS: Proof Print Copies +#: locale/ipp-strings.c:4228 +msgid "proof-print-copies" +msgstr "" + +#. TRANSLATORS: Punching +#: locale/ipp-strings.c:4230 +msgid "punching" +msgstr "" + +#. TRANSLATORS: Punching Locations +#: locale/ipp-strings.c:4232 +msgid "punching-locations" +msgstr "" + +#. TRANSLATORS: Punching Offset +#: locale/ipp-strings.c:4234 +msgid "punching-offset" +msgstr "" + +#. TRANSLATORS: Punch Edge +#: locale/ipp-strings.c:4236 +msgid "punching-reference-edge" +msgstr "" + +#. TRANSLATORS: Bottom +#: locale/ipp-strings.c:4238 +msgid "punching-reference-edge.bottom" +msgstr "" + +#. TRANSLATORS: Left +#: locale/ipp-strings.c:4240 +msgid "punching-reference-edge.left" +msgstr "" + +#. TRANSLATORS: Right +#: locale/ipp-strings.c:4242 +msgid "punching-reference-edge.right" +msgstr "" + +#. TRANSLATORS: Top +#: locale/ipp-strings.c:4244 +msgid "punching-reference-edge.top" +msgstr "" + +#: systemv/lp.c:642 +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +#: cups/snmp.c:974 +msgid "request-id uses indefinite length" +msgstr "" + +#. TRANSLATORS: Requested Attributes +#: locale/ipp-strings.c:4246 +msgid "requested-attributes" +msgstr "" + +#. TRANSLATORS: Retry Interval +#: locale/ipp-strings.c:4248 +msgid "retry-interval" +msgstr "" + +#. TRANSLATORS: Retry Timeout +#: locale/ipp-strings.c:4250 +msgid "retry-time-out" +msgstr "" + +#. TRANSLATORS: Save Disposition +#: locale/ipp-strings.c:4252 +msgid "save-disposition" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:4254 +msgid "save-disposition.none" +msgstr "" + +#. TRANSLATORS: Print and Save +#: locale/ipp-strings.c:4256 +msgid "save-disposition.print-save" +msgstr "" + +#. TRANSLATORS: Save Only +#: locale/ipp-strings.c:4258 +msgid "save-disposition.save-only" +msgstr "" + +#. TRANSLATORS: Save Document Format +#: locale/ipp-strings.c:4260 +msgid "save-document-format" +msgstr "" + +#. TRANSLATORS: Save Info +#: locale/ipp-strings.c:4262 +msgid "save-info" +msgstr "" + +#. TRANSLATORS: Save Location +#: locale/ipp-strings.c:4264 +msgid "save-location" +msgstr "" + +#. TRANSLATORS: Save Name +#: locale/ipp-strings.c:4266 +msgid "save-name" +msgstr "" + +#: systemv/lpstat.c:2032 +msgid "scheduler is not running" +msgstr "" + +#: systemv/lpstat.c:2028 +msgid "scheduler is running" +msgstr "" + +#. TRANSLATORS: Separator Sheets +#: locale/ipp-strings.c:4268 +msgid "separator-sheets" +msgstr "" + +#. TRANSLATORS: Type of Separator Sheets +#: locale/ipp-strings.c:4270 +msgid "separator-sheets-type" +msgstr "" + +#. TRANSLATORS: Start and End Sheets +#: locale/ipp-strings.c:4272 +msgid "separator-sheets-type.both-sheets" +msgstr "" + +#. TRANSLATORS: End Sheet +#: locale/ipp-strings.c:4274 +msgid "separator-sheets-type.end-sheet" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:4276 +msgid "separator-sheets-type.none" +msgstr "" + +#. TRANSLATORS: Slip Sheets +#: locale/ipp-strings.c:4278 +msgid "separator-sheets-type.slip-sheets" +msgstr "" + +#. TRANSLATORS: Start Sheet +#: locale/ipp-strings.c:4280 +msgid "separator-sheets-type.start-sheet" +msgstr "" + +#. TRANSLATORS: 2-Sided Printing +#: locale/ipp-strings.c:4282 +msgid "sides" +msgstr "" + +#. TRANSLATORS: Off +#: locale/ipp-strings.c:4284 +msgid "sides.one-sided" +msgstr "" + +#. TRANSLATORS: On (Portrait) +#: locale/ipp-strings.c:4286 +msgid "sides.two-sided-long-edge" +msgstr "" + +#. TRANSLATORS: On (Landscape) +#: locale/ipp-strings.c:4288 +msgid "sides.two-sided-short-edge" +msgstr "" + +#: cups/adminutil.c:1384 +#, c-format +msgid "stat of %s failed: %s" +msgstr "" + +#: berkeley/lpc.c:197 +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +#. TRANSLATORS: Status Message +#: locale/ipp-strings.c:4290 +msgid "status-message" +msgstr "" + +#. TRANSLATORS: Staple +#: locale/ipp-strings.c:4292 +msgid "stitching" +msgstr "" + +#. TRANSLATORS: Stitching Angle +#: locale/ipp-strings.c:4294 +msgid "stitching-angle" +msgstr "" + +#. TRANSLATORS: Stitching Locations +#: locale/ipp-strings.c:4296 +msgid "stitching-locations" +msgstr "" + +#. TRANSLATORS: Staple Method +#: locale/ipp-strings.c:4298 +msgid "stitching-method" +msgstr "" + +#. TRANSLATORS: Automatic +#: locale/ipp-strings.c:4300 +msgid "stitching-method.auto" +msgstr "" + +#. TRANSLATORS: Crimp +#: locale/ipp-strings.c:4302 +msgid "stitching-method.crimp" +msgstr "" + +#. TRANSLATORS: Wire +#: locale/ipp-strings.c:4304 +msgid "stitching-method.wire" +msgstr "" + +#. TRANSLATORS: Stitching Offset +#: locale/ipp-strings.c:4306 +msgid "stitching-offset" +msgstr "" + +#. TRANSLATORS: Staple Edge +#: locale/ipp-strings.c:4308 +msgid "stitching-reference-edge" +msgstr "" + +#. TRANSLATORS: Bottom +#: locale/ipp-strings.c:4310 +msgid "stitching-reference-edge.bottom" +msgstr "" + +#. TRANSLATORS: Left +#: locale/ipp-strings.c:4312 +msgid "stitching-reference-edge.left" +msgstr "" + +#. TRANSLATORS: Right +#: locale/ipp-strings.c:4314 +msgid "stitching-reference-edge.right" +msgstr "" + +#. TRANSLATORS: Top +#: locale/ipp-strings.c:4316 +msgid "stitching-reference-edge.top" +msgstr "" + +#: cups/notify.c:83 cups/notify.c:124 +msgid "stopped" +msgstr "" + +#. TRANSLATORS: Subject +#: locale/ipp-strings.c:4318 +msgid "subject" +msgstr "" + +#. TRANSLATORS: Subscription Privacy Attributes +#: locale/ipp-strings.c:4320 +msgid "subscription-privacy-attributes" +msgstr "" + +#. TRANSLATORS: All +#: locale/ipp-strings.c:4322 +msgid "subscription-privacy-attributes.all" +msgstr "" + +#. TRANSLATORS: Default +#: locale/ipp-strings.c:4324 +msgid "subscription-privacy-attributes.default" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:4326 +msgid "subscription-privacy-attributes.none" +msgstr "" + +#. TRANSLATORS: Subscription Description +#: locale/ipp-strings.c:4328 +msgid "subscription-privacy-attributes.subscription-description" +msgstr "" + +#. TRANSLATORS: Subscription Template +#: locale/ipp-strings.c:4330 +msgid "subscription-privacy-attributes.subscription-template" +msgstr "" + +#. TRANSLATORS: Subscription Privacy Scope +#: locale/ipp-strings.c:4332 +msgid "subscription-privacy-scope" +msgstr "" + +#. TRANSLATORS: All +#: locale/ipp-strings.c:4334 +msgid "subscription-privacy-scope.all" +msgstr "" + +#. TRANSLATORS: Default +#: locale/ipp-strings.c:4336 +msgid "subscription-privacy-scope.default" +msgstr "" + +#. TRANSLATORS: None +#: locale/ipp-strings.c:4338 +msgid "subscription-privacy-scope.none" +msgstr "" + +#. TRANSLATORS: Owner +#: locale/ipp-strings.c:4340 +msgid "subscription-privacy-scope.owner" +msgstr "" + +#: systemv/lpstat.c:1077 +#, c-format +msgid "system default destination: %s" +msgstr "" + +#: systemv/lpstat.c:1074 +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +#. TRANSLATORS: T33 Subaddress +#: locale/ipp-strings.c:4342 +msgid "t33-subaddress" +msgstr "" + +#. TRANSLATORS: To Name +#: locale/ipp-strings.c:4344 +msgid "to-name" +msgstr "" + +#. TRANSLATORS: Transmission Status +#: locale/ipp-strings.c:4346 +msgid "transmission-status" +msgstr "" + +#. TRANSLATORS: Pending +#: locale/ipp-strings.c:4348 +msgid "transmission-status.3" +msgstr "" + +#. TRANSLATORS: Pending Retry +#: locale/ipp-strings.c:4350 +msgid "transmission-status.4" +msgstr "" + +#. TRANSLATORS: Processing +#: locale/ipp-strings.c:4352 +msgid "transmission-status.5" +msgstr "" + +#. TRANSLATORS: Canceled +#: locale/ipp-strings.c:4354 +msgid "transmission-status.7" +msgstr "" + +#. TRANSLATORS: Aborted +#: locale/ipp-strings.c:4356 +msgid "transmission-status.8" +msgstr "" + +#. TRANSLATORS: Completed +#: locale/ipp-strings.c:4358 +msgid "transmission-status.9" +msgstr "" + +#. TRANSLATORS: Cut +#: locale/ipp-strings.c:4360 +msgid "trimming" +msgstr "" + +#. TRANSLATORS: Cut Position +#: locale/ipp-strings.c:4362 +msgid "trimming-offset" +msgstr "" + +#. TRANSLATORS: Cut Edge +#: locale/ipp-strings.c:4364 +msgid "trimming-reference-edge" +msgstr "" + +#. TRANSLATORS: Bottom +#: locale/ipp-strings.c:4366 +msgid "trimming-reference-edge.bottom" +msgstr "" + +#. TRANSLATORS: Left +#: locale/ipp-strings.c:4368 +msgid "trimming-reference-edge.left" +msgstr "" + +#. TRANSLATORS: Right +#: locale/ipp-strings.c:4370 +msgid "trimming-reference-edge.right" +msgstr "" + +#. TRANSLATORS: Top +#: locale/ipp-strings.c:4372 +msgid "trimming-reference-edge.top" +msgstr "" + +#. TRANSLATORS: Type of Cut +#: locale/ipp-strings.c:4374 +msgid "trimming-type" +msgstr "" + +#. TRANSLATORS: Draw Line +#: locale/ipp-strings.c:4376 +msgid "trimming-type.draw-line" +msgstr "" + +#. TRANSLATORS: Full +#: locale/ipp-strings.c:4378 +msgid "trimming-type.full" +msgstr "" + +#. TRANSLATORS: Partial +#: locale/ipp-strings.c:4380 +msgid "trimming-type.partial" +msgstr "" + +#. TRANSLATORS: Perforate +#: locale/ipp-strings.c:4382 +msgid "trimming-type.perforate" +msgstr "" + +#. TRANSLATORS: Score +#: locale/ipp-strings.c:4384 +msgid "trimming-type.score" +msgstr "" + +#. TRANSLATORS: Tab +#: locale/ipp-strings.c:4386 +msgid "trimming-type.tab" +msgstr "" + +#. TRANSLATORS: Cut After +#: locale/ipp-strings.c:4388 +msgid "trimming-when" +msgstr "" + +#. TRANSLATORS: Every Document +#: locale/ipp-strings.c:4390 +msgid "trimming-when.after-documents" +msgstr "" + +#. TRANSLATORS: Job +#: locale/ipp-strings.c:4392 +msgid "trimming-when.after-job" +msgstr "" + +#. TRANSLATORS: Every Set +#: locale/ipp-strings.c:4394 +msgid "trimming-when.after-sets" +msgstr "" + +#. TRANSLATORS: Every Page +#: locale/ipp-strings.c:4396 +msgid "trimming-when.after-sheets" +msgstr "" + +#: cups/notify.c:95 cups/notify.c:127 +msgid "unknown" +msgstr "" + +#: cups/notify.c:104 +msgid "untitled" +msgstr "" + +#: cups/snmp.c:999 +msgid "variable-bindings uses indefinite length" +msgstr "" + +#. TRANSLATORS: X Accuracy +#: locale/ipp-strings.c:4398 +msgid "x-accuracy" +msgstr "" + +#. TRANSLATORS: X Dimension +#: locale/ipp-strings.c:4400 +msgid "x-dimension" +msgstr "" + +#. TRANSLATORS: X Offset +#: locale/ipp-strings.c:4402 +msgid "x-offset" +msgstr "" + +#. TRANSLATORS: X Origin +#: locale/ipp-strings.c:4404 +msgid "x-origin" +msgstr "" + +#. TRANSLATORS: Y Accuracy +#: locale/ipp-strings.c:4406 +msgid "y-accuracy" +msgstr "" + +#. TRANSLATORS: Y Dimension +#: locale/ipp-strings.c:4408 +msgid "y-dimension" +msgstr "" + +#. TRANSLATORS: Y Offset +#: locale/ipp-strings.c:4410 +msgid "y-offset" +msgstr "" + +#. TRANSLATORS: Y Origin +#: locale/ipp-strings.c:4412 +msgid "y-origin" +msgstr "" + +#. TRANSLATORS: Z Accuracy +#: locale/ipp-strings.c:4414 +msgid "z-accuracy" +msgstr "" + +#. TRANSLATORS: Z Dimension +#: locale/ipp-strings.c:4416 +msgid "z-dimension" +msgstr "" + +#. TRANSLATORS: Z Offset +#: locale/ipp-strings.c:4418 +msgid "z-offset" +msgstr "" + +#: tools/ippfind.c:2814 +msgid "{service_domain} Domain name" +msgstr "" + +#: tools/ippfind.c:2815 +msgid "{service_hostname} Fully-qualified domain name" +msgstr "" + +#: tools/ippfind.c:2816 +msgid "{service_name} Service instance name" +msgstr "" + +#: tools/ippfind.c:2817 +msgid "{service_port} Port number" +msgstr "" + +#: tools/ippfind.c:2818 +msgid "{service_regtype} DNS-SD registration type" +msgstr "" + +#: tools/ippfind.c:2819 +msgid "{service_scheme} URI scheme" +msgstr "" + +#: tools/ippfind.c:2820 +msgid "{service_uri} URI" +msgstr "" + +#: tools/ippfind.c:2821 +msgid "{txt_*} Value of TXT record key" +msgstr "" + +#: tools/ippfind.c:2813 +msgid "{} URI" +msgstr "" + +#: cups/dest.c:1864 +msgid "~/.cups/lpoptions file names default destination that does not exist." +msgstr "" diff -Nru cups-2.3.3op2/locale/cups_de.po cups-2.4.1op1/locale/cups_de.po --- cups-2.3.3op2/locale/cups_de.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_de.po 2022-01-27 11:11:42.000000000 +0000 @@ -17,19 +17,23 @@ # ./checkpo cups_LL.po # # where "LL" is your locale. +# Joachim Schwender , 2021. +# Frederik Schwarzer , 2021. # msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" -"PO-Revision-Date: 2017-10-25 14:57+0200\n" -"Last-Translator: Joachim Schwender \n" -"Language-Team: German \n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" +"PO-Revision-Date: 2021-03-08 23:35+0100\n" +"Last-Translator: Joachim Schwender \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Generator: Gtranslator 3.38.0\n" msgid "\t\t(all)" msgstr "\t\t(alle)" @@ -56,7 +60,7 @@ msgstr "\tBanner erforderlich" msgid "\tCharset sets:" -msgstr "\tZeichensatz Set:" +msgstr "\tZeichensatz-Set:" msgid "\tConnection: direct" msgstr "\tVerbindung: direkt" @@ -68,7 +72,7 @@ msgstr "\tInhaltstypen: beliebig" msgid "\tDefault page size:" -msgstr "\tVoreingestellte Seitengrösse:" +msgstr "\tVoreingestellte Seitengröße:" msgid "\tDefault pitch:" msgstr "\tVoreingestellte Neigung:" @@ -81,7 +85,7 @@ msgstr "\tBeschreibung: %s" msgid "\tForm mounted:" -msgstr "\tGeladenes Formblatt" +msgstr "\tGeladenes Formblatt:" msgid "\tForms allowed:" msgstr "\tErlaubte Formblätter:" @@ -147,6 +151,8 @@ "\n" " DETAILED CONFORMANCE TEST RESULTS" msgstr "" +"\n" +" DETAILLIERTE ERGEBNISSE DES KONFORMITÄTSTESTS" msgid " REF: Page 15, section 3.1." msgstr " REF: Seite 15, Kap. 3.1." @@ -183,56 +189,56 @@ #, c-format msgid " %-39.39s %.0f bytes" -msgstr "" +msgstr " %-39.39s %.0f Bytes" #, c-format msgid " PASS Default%s" -msgstr "" +msgstr " BESTANDEN Default%s" msgid " PASS DefaultImageableArea" -msgstr "" +msgstr " BESTANDEN DefaultImageableArea" msgid " PASS DefaultPaperDimension" -msgstr "" +msgstr " BESTANDEN DefaultPaperDimension" msgid " PASS FileVersion" -msgstr "" +msgstr " BESTANDEN FileVersion" msgid " PASS FormatVersion" -msgstr "" +msgstr " BESTANDEN FormatVersion" msgid " PASS LanguageEncoding" -msgstr "" +msgstr " BESTANDEN LanguageEncoding" msgid " PASS LanguageVersion" -msgstr "" +msgstr " BESTANDEN LanguageVersion" msgid " PASS Manufacturer" -msgstr "" +msgstr " BESTANDEN Manufacturer" msgid " PASS ModelName" -msgstr "" +msgstr " BESTANDEN ModelName" msgid " PASS NickName" -msgstr "" +msgstr " BESTANDEN NickName" msgid " PASS PCFileName" -msgstr "" +msgstr " BESTANDEN PCFileName" msgid " PASS PSVersion" -msgstr "" +msgstr " BESTANDEN PSVersion" msgid " PASS PageRegion" -msgstr "" +msgstr " BESTANDEN PageRegion" msgid " PASS PageSize" -msgstr "" +msgstr " BESTANDEN PageSize" msgid " PASS Product" -msgstr "" +msgstr " BESTANDEN Product" msgid " PASS ShortNickName" -msgstr "" +msgstr " BESTANDEN ShortNickName" #, c-format msgid " WARN %s has no corresponding options." @@ -252,9 +258,13 @@ "be named Duplex.\n" " REF: Page 122, section 5.17" msgstr "" +" WARN Schlüsselwort für Duplex-Option %s funktioniert " +"möglicherweise nicht wie erwartet und sollte Duplex genannt werden.\n" +" REF: Seite 122, Abschnitt 5.17" msgid " WARN File contains a mix of CR, LF, and CR LF line endings." -msgstr " WARN Datei einthält gemischt CR, LF, und CR LF Zeilenenden." +msgstr "" +" WARN Datei enthält gemischt CR-, LF-, und CR-LF-Zeilenenden." msgid "" " WARN LanguageEncoding required by PPD 4.3 spec.\n" @@ -272,12 +282,14 @@ " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3." msgstr "" +" WARN Hersteller erforderlich gem. PPD 4.3.\n" +" REF: Seiten 58-59, Abschnitt 5.3." msgid "" " WARN Non-Windows PPD files should use lines ending with only LF, " "not CR LF." msgstr "" -" WARN Nicht-Windows PPD Dateien sollten ausschließlich LF " +" WARN Nicht-Windows-PPD-Dateien sollten ausschließlich LF-" "Zeilenenden verwenden, nicht CR LF." #, c-format @@ -285,33 +297,44 @@ " WARN Obsolete PPD version %.1f.\n" " REF: Page 42, section 5.2." msgstr "" -" WARN Veraltete PPD Version %.1f.\n" +" WARN Veraltete PPD-Version %.1f.\n" " REF: Seite 42, Kap. 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 länger als 8.3 verletzt die PPD Spezifikation.\n" +" REF: Seiten 61-62, Abschnitt 5.3." msgid "" " WARN PCFileName should contain a unique filename.\n" " REF: Pages 61-62, section 5.3." msgstr "" +" WARN PCFileName sollte einen eindeutigen Dateinamen enthalten.\n" +" REF: Seiten 61-62, Abschnitt 5.3." msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7." msgstr "" +" WARN Protocols enthält PJL aber JCL Attribute sind nicht " +"festgelegt.\n" +" REF: Seiten 78-79, Abschnitt 5.7." msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7." msgstr "" +" WARN Protocols enthalten PJL und BCP; erwartet wird TBCP.\n" +" REF: Seiten 78-79, Abschnitt 5.7." msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3." msgstr "" +" WARN ShortNickName erforderlich gem.PPD 4.3 Spezifikation.\n" +" REF: Seiten 64-65, Abschnitt 5.3." #, c-format msgid "" @@ -334,6 +357,8 @@ " %s Bad %s choice %s.\n" " REF: Page 122, section 5.17" msgstr "" +" %s Ungültige %s Auswahl %s.\n" +" Siehe: Seite 122, Kap. 5.17" #, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." @@ -381,10 +406,12 @@ #, c-format msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." msgstr "" +" %s Kann nicht sowohl APScanAppPath als auch APScanAppBundleID bereit " +"stellen." #, c-format msgid " %s Default choices conflicting." -msgstr " %s Wiedersprüchliche voreingestellte Auswahl." +msgstr " %s Widersprüchliche voreingestellte Auswahl." #, c-format msgid " %s Empty cupsUIConstraints %s" @@ -407,42 +434,48 @@ " %s Missing REQUIRED PageRegion option.\n" " REF: Page 100, section 5.14." msgstr "" +" %s Fehlende ERFORDERLICHE PageRegion Option.\n" +" REF: Seite 100, Abschnitt 5.14." #, c-format msgid "" " %s Missing REQUIRED PageSize option.\n" " REF: Page 99, section 5.14." msgstr "" +" %s Fehlende ERFORDERLICHE PageSize Option.\n" +" REF: Seite 99, Abschnitt 5.14." #, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." -msgstr "" +msgstr " %s Fehlende Auswahl *%s %s in UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" -msgstr "" +msgstr " %s Fehlende Auswahl *%s %s in cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s Missing cupsUIResolver %s" -msgstr "" +msgstr " %s cupsUIResolver %s fehlt" #, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." -msgstr "" +msgstr " %s Fehlende Option %s in UIConstraints \"*%s %s *%s %s\"." #, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" -msgstr "" +msgstr " %s Fehlende Option %s in cupsUIConstraints %s: \"%s\"" #, c-format msgid " %s No base translation \"%s\" is included in file." -msgstr "" +msgstr " %s Es ist keine Übersetzung \"%s\" in der Datei." #, c-format msgid "" " %s REQUIRED %s does not define choice None.\n" " REF: Page 122, section 5.17" msgstr "" +" %s ERFORDERLICHE %s definiert keine Auswahl.\n" +" REF: Seite 122, Abschnitt 5.17." #, c-format msgid " %s Size \"%s\" defined for %s but not for %s." @@ -454,15 +487,15 @@ #, c-format msgid " %s Size \"%s\" should be \"%s\"." -msgstr "" +msgstr " %s Größe \"%s\" sollte \"%s\" sein." #, c-format msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." -msgstr "" +msgstr " %s Size \"%s\" sollte der Adobe-Standard-Name \"%s\" sein." #, c-format msgid " %s cupsICCProfile %s hash value collides with %s." -msgstr "" +msgstr " %s cupsICCProfile %s Hashwert kollidiert mit %s." #, c-format msgid " %s cupsUIResolver %s causes a loop." @@ -570,6 +603,8 @@ " **FAIL** Default translation string for option %s contains 8-bit " "characters." msgstr "" +" **FEHLER** Voreingestellte Übersetzung für die Option %s enthält 8-" +"bit Zeichen." #, c-format msgid " **FAIL** Group names %s and %s differ only by case." @@ -607,11 +642,15 @@ " **FAIL** REQUIRED FileVersion\n" " REF: Page 56, section 5.3." msgstr "" +" **FEHLER** FileVersion ERFORDERLICH\n" +" REF: Seite 56, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED FormatVersion\n" " REF: Page 56, section 5.3." msgstr "" +" **FEHLER** FormatVersion ERFORDERLICH\n" +" REF: Seite 56, Abschnitt 5.3." #, c-format msgid "" @@ -624,52 +663,73 @@ " **FAIL** REQUIRED LanguageEncoding\n" " REF: Pages 56-57, section 5.3." msgstr "" +" **FEHLER** LanguageEncoding ERFORDERLICH\n" +" REF: Seiten 56-57, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED LanguageVersion\n" " REF: Pages 57-58, section 5.3." msgstr "" +" **FEHLER** LanguageVersion ERFORDERLICH\n" +" REF: Seiten 57-58, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED Manufacturer\n" " REF: Pages 58-59, section 5.3." msgstr "" +" **FEHLER** Manufacturer ERFORDERLICH\n" +" REF: Seiten 58-59, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED ModelName\n" " REF: Pages 59-60, section 5.3." msgstr "" +" **FEHLER** ModelName ERFORDERLICH\n" +" REF: Seiten 59-60, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED NickName\n" " REF: Page 60, section 5.3." msgstr "" +" **FEHLER** NickName ERFORDERLICH\n" +" REF: Seite 60, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED PCFileName\n" " REF: Pages 61-62, section 5.3." msgstr "" +" **FEHLER** PCFileName ERFORDERLICH\n" +" REF: Seiten 61-62, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED PSVersion\n" " REF: Pages 62-64, section 5.3." msgstr "" +" **FEHLER** PSVersion ERFORDERLICH\n" +" REF: Seiten 62-64, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED PageRegion\n" " REF: Page 100, section 5.14." msgstr "" +" **FEHLER** PageRegion ERFORDERLICH\n" +" REF: Seite 100, Abschnitt 5.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Page 41, section 5.\n" " REF: Page 99, section 5.14." msgstr "" +" **FEHLER** PageSize ERFORDERLICH\n" +" REF: Seite 41, Abschnitt 5.\n" +" Seite 99, Abschnitt 4.14." msgid "" " **FAIL** REQUIRED PageSize\n" " REF: Pages 99-100, section 5.14." msgstr "" +" **FEHLER** PageSize ERFORDERLICH\n" +" REF: Seiten 99-100, Abschnitt 5.14." #, c-format msgid "" @@ -677,20 +737,27 @@ " REF: Page 41, section 5.\n" " REF: Page 103, section 5.15." msgstr "" +" **FEHLER** PaperDimension für PageSize %s ERFORDERLICH\n" +" REF: Seite 41, Abschnitt 5.\n" +" Seite 103, Abschnitt 5.15." msgid "" " **FAIL** REQUIRED Product\n" " REF: Page 62, section 5.3." msgstr "" +" **FEHLER** Product ERFORDERLICH\n" +" REF: Seite 62, Abschnitt 5.3." msgid "" " **FAIL** REQUIRED ShortNickName\n" " REF: Page 64-65, section 5.3." msgstr "" +" **FEHLER** ShortNickName ERFORDERLICH\n" +" REF: Seiten 64-65, Abschnitt 5.3." #, c-format msgid " **FAIL** Unable to open PPD file - %s on line %d." -msgstr "" +msgstr " **FEHLER** Öffnen der PPD-Datei - %s in Zeile %d nicht möglich." #, c-format msgid " %d ERRORS FOUND" @@ -722,10 +789,10 @@ " -I Inklus.Verz. Inklusionsverzeichnis dem Suchpfad hinzufügen." msgid " -P filename.ppd Set PPD file." -msgstr " -P filename.ppd Lege PPD Datei fest." +msgstr " -P filename.ppd Lege PPD-Datei fest." msgid " -U username Specify username." -msgstr " -U username Gebe den Benutzernamen an." +msgstr " -U Benutzername Gebe den Benutzernamen an." msgid " -c catalog.po Load the specified message catalog." msgstr " -c Katalog.po Lade den angegebenen Nachrichtenkatalog." @@ -738,10 +805,10 @@ msgstr " -d AusgabeVerz. Angabe des Ausgabeverzeichnisses." msgid " -d printer Use the named printer." -msgstr " -d printer Benutze den genannten Drucker." +msgstr " -d Drucker Benutze den genannten Drucker." msgid " -e Use every filter from the PPD file." -msgstr " -e Benutzt jeden Filter der PPD Datei." +msgstr " -e Benutzt jeden Filter der PPD-Datei." msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" @@ -752,6 +819,8 @@ " -j job-id[,N] Filter file N from the specified job (default is " "file 1)." msgstr "" +" -j Auftrags-id[,N] Filterdatei N des angegebenen Auftrags " +"(Voreingestellt ist Datei 1)." msgid " -l lang[,lang,...] Specify the output language(s) (locale)." msgstr " -l lang[,lang,...] Spezifiziere die Ausgabesprache(n) (locale)." @@ -766,7 +835,7 @@ "application/pdf)." msgid " -n copies Set number of copies." -msgstr " -n copies Lege die Anzahl der Kopien fest." +msgstr " -n Kopien Lege die Anzahl der Kopien fest." msgid "" " -o filename.drv Set driver information file (otherwise ppdi.drv)." @@ -783,10 +852,10 @@ msgstr " -o Name=Wert Option(en) festlegen." msgid " -p filename.ppd Set PPD file." -msgstr " -p filename.ppd PPD-Datei festlegen." +msgstr " -p Dateiname.ppd PPD-Datei festlegen." msgid " -t Test PPDs instead of generating them." -msgstr " -t Teste PPDs anstelle sie zu erzeugen." +msgstr " -t Teste PPDs anstatt sie zu erzeugen." msgid " -t title Set title." msgstr " -t Titel Legt den Titel fest." @@ -799,16 +868,16 @@ msgid " -z Compress PPD files using GNU zip." msgstr "" -" -z Komprimiere PPD Datei unter Verwendung von GNU zip." +" -z Komprimiere PPD-Datei unter Verwendung von GNU zip." msgid " FAIL" -msgstr "" +msgstr " NICHT BESTANDEN" msgid " PASS" -msgstr "BESTANDEN" +msgstr " BESTANDEN" msgid "! expression Unary NOT of expression" -msgstr "" +msgstr "! expression Unäres NICHT des Ausdrucks" #, c-format msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)." @@ -834,7 +903,7 @@ #, c-format msgid "\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)." -msgstr "" +msgstr "\"%s\": Falscher logischer Wert %d (RFC 8011 Abschnitt 5.1.21)." #, c-format msgid "" @@ -847,46 +916,51 @@ msgid "" "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)." msgstr "" +"\"%s\": Falscher Zeichensatzwert \"%s\" - Falsche Länge %d (RFC 8011 " +"Abschnitt 5.1.8)." #, c-format msgid "\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)." -msgstr "" +msgstr "\"%s\": Falsche dateTime UTC Stunden %u (RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)." -msgstr "" +msgstr "\"%s\": Falsche dateTime UTC Minuten %u (RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)." msgstr "" +"\"%s\": Falsche dateTime UTC Vorzeichen'%c'.(RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)." -msgstr "" +msgstr "\"%s\": Falsche dateTime UTC Tag %u (RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)." -msgstr "" +msgstr "\"%s\": Falsche dateTime Dezisekunden %u (RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)." -msgstr "" +msgstr "\"%s\": Falsche dateTime Stunden %u (RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)." -msgstr "" +msgstr "\"%s\": Falsche dateTime Minuten %u (RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)." -msgstr "" +msgstr "\"%s\": Falscher dateTime Monat %u (RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)." -msgstr "" +msgstr "\"%s\": Falsche dateTime Sekunden %u (RFC 8011 Abschnitt 5.1.15)." #, c-format msgid "\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)." msgstr "" +"\"%s\": Falscher enum-Wert %d - Ausserhalb des Bereichs (RFC 8011 Abschnitt " +"5.1.5)." #, c-format msgid "" @@ -908,12 +982,16 @@ "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section " "5.1.10)." msgstr "" +"\"%s\": Falscher mimeMediaType Wert \"%s\" - Falsche Zeichen (RFC 8011 " +"section 5.1.10)." #, c-format msgid "" "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section " "5.1.10)." msgstr "" +"\"%s\": Falscher mimeMediaType Wert \"%s\" - Falsche Länge %d (RFC 8011 " +"section 5.1.10)." #, c-format msgid "" @@ -927,11 +1005,13 @@ "\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section " "8.1)." msgstr "" +"\"%s\": Falscher Namenswert \"%s\" - Falsches Steuerzeichen (PWG 5100.14 " +"Abschnitt 8.1)." #, c-format msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)." msgstr "" -"\"%s\": Falsches Namenswert \"%s\" - falsche Länge %d (RFC 8011 Abschnitt " +"\"%s\": Falscher Namenswert \"%s\" - falsche Länge %d (RFC 8011 Abschnitt " "5.1.3)." #, c-format @@ -939,12 +1019,16 @@ "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section " "5.1.9)." msgstr "" +"\"%s\": Falscher naturalLanguage Wert \"%s\" - ungültige Zeichen (RFC 8011 " +"Abschnitt 5.1.9)." #, c-format msgid "" "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section " "5.1.9)." msgstr "" +"\"%s\": Falscher naturalLanguage Wert \"%s\" - ungültige Länge %d (RFC 8011 " +"Abschnitt 5.1.9)." #, c-format msgid "" @@ -989,6 +1073,8 @@ "\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section " "8.3)." msgstr "" +"\"%s\": Falscher Textwert \"%s\" - falsches Steuerzeichen (PWG 5100.14 " +"Abschnitt 8.3)." #, c-format msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)." @@ -1011,10 +1097,10 @@ "Abschnitt 5.1.7)." msgid "\"requesting-user-name\" attribute in wrong group." -msgstr "" +msgstr "\"requesting-user-name\" Attribute in der falschen Gruppe." msgid "\"requesting-user-name\" attribute with wrong syntax." -msgstr "" +msgstr "\"requesting-user-name\" Attribute mit falscher Syntax." #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" @@ -1128,6 +1214,10 @@ "%s: Fehler - Umgebungsvariable %s benennt nicht existierendes Ziel \"%s\"." #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "%s: Fehler - Der Drucker oder die Klasse existiert nicht." + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Fehler - füge '/version=1.1' zum Servernamen hinzu." @@ -1148,7 +1238,15 @@ #, c-format msgid "%s: Error - copies must be 1 or more." -msgstr "%s: Fehler - Kopien müssen 1 oder mehr sein." +msgstr "%s: Fehler - Kopien muss 1 oder mehr sein." + +#, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "%s: Fehler - \"Benutzername\" nach der \"-U\" Option erwartet." + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "%s: Fehler - PPD-Datei nach der Option \"-%c\" erwartet." #, c-format msgid "%s: Error - expected character set after \"-S\" option." @@ -1167,6 +1265,10 @@ msgstr "%s: Fehler - Kopienzahl nach der Option \"-n\" erwartet." #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Fehler - Zielangabe nach der Option \"-P\" erwartet." @@ -1175,10 +1277,14 @@ msgstr "%s: Fehler - Zielangabe nach der Option \"-d\" erwartet." #, c-format -msgid "%s: Error - expected form after \"-f\" option." +msgid "%s: Error - expected filename after \"-c\" option." msgstr "" #, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "%s: Fehler - erwarte form nach \"-f\" Option." + +#, c-format msgid "%s: Error - expected hold name after \"-H\" option." msgstr "%s: Fehler - erwarte hold name nach \"-H\" Option." @@ -1191,6 +1297,14 @@ msgstr "%s: Fehler - Hostname nach der Option \"-h\" erwartet." #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Fehler - Modusliste nach der Option \"-y\" erwartet." @@ -1199,6 +1313,18 @@ msgstr "%s: Fehler - Name nach der Option \"-%c\" erwartet." #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: Fehler - Option=Wert nach der Option \"-o\" erwartet." @@ -1207,6 +1333,10 @@ msgstr "%s: Fehler - Seitenliste nach der Option \"-P\" erwartet." #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Fehler - Priorität nach der Option \"-%c\" erwartet." @@ -1215,6 +1345,14 @@ msgstr "%s: Fehler - Grund nach der Option \"-r\" erwartet." #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Fehler - Titel nach der Option \"-t\" erwartet." @@ -1260,7 +1398,7 @@ #, c-format msgid "%s: Error - unable to queue from stdin - %s." -msgstr "" +msgstr "%s: Fehler - Empfang von stdin nicht möglich - %s." #, c-format msgid "%s: Error - unknown destination \"%s\"." @@ -1279,6 +1417,10 @@ msgstr "%s: Fehler - unbekannte Option \"%s\"." #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "%s: Fehler - unbekannte Option \"%c\"." + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: Auftrags-ID nach der Option \"-i\" erwartet." @@ -1320,7 +1462,7 @@ #, c-format msgid "%s: Unable to connect to \"%s:%d\": %s" -msgstr "%s: Verbindung zu \"%s:%d\": %s nicht möglich" +msgstr "%s: Verbindung zu \"%s:%d\" nicht möglich: %s" #, c-format msgid "%s: Unable to connect to server." @@ -1332,7 +1474,7 @@ #, c-format msgid "%s: Unable to create PPD file: %s" -msgstr "%s: Erzeugung der PPD Datei nicht möglich: %s" +msgstr "%s: Erzeugung der PPD-Datei nicht möglich: %s" #, c-format msgid "%s: Unable to determine MIME type of \"%s\"." @@ -1340,11 +1482,11 @@ #, c-format msgid "%s: Unable to open \"%s\": %s" -msgstr "%s: Öffnen von \"%s\": %s nicht möglich" +msgstr "%s: Öffnen von \"%s\" nicht möglich: %s" #, c-format msgid "%s: Unable to open %s: %s" -msgstr "%s: Öffnen von %s: %s nicht möglich" +msgstr "%s: Öffnen von %s nicht möglich: %s" #, c-format msgid "%s: Unable to open PPD file: %s on line %d." @@ -1352,7 +1494,7 @@ #, c-format msgid "%s: Unable to query printer: %s" -msgstr "" +msgstr "%s: Abfrage des Druckers %s nicht möglich" #, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." @@ -1395,6 +1537,8 @@ "%s: Warning - \"%c\" format modifier not supported - output may not be " "correct." msgstr "" +"%s: Warnung - \"%c\" Formatänderung nicht unterstützt - Ausgabe könnte " +"unkorrekt sein." #, c-format msgid "%s: Warning - character set option ignored." @@ -1406,32 +1550,33 @@ #, c-format msgid "%s: Warning - form option ignored." -msgstr "" +msgstr "%s: Warnung - form Option ignoriert." #, c-format msgid "%s: Warning - mode option ignored." msgstr "%s: Warnung - Modusoption ignoriert." msgid "( expressions ) Group expressions" -msgstr "" +msgstr "( expressions ) gruppierter Ausdruck" msgid "- Cancel all jobs" -msgstr "" +msgstr "- Abbruch aller Aufträge" msgid "-# num-copies Specify the number of copies to print" msgstr "" +"-# Kopienzahl Angabe der Anzahl der auszugebenden Druckexemplare" msgid "--[no-]debug-logging Turn debug logging on/off" -msgstr "" +msgstr "--[no-]debug-logging Debug-Logging aus/ein-schalten" msgid "--[no-]remote-admin Turn remote administration on/off" -msgstr "" +msgstr "--[no-]remote-admin Fernadministration ein/ausschalten" msgid "--[no-]remote-any Allow/prevent access from the Internet" -msgstr "" +msgstr "--[no-]remote-any erlaube/sperre Zugriff aus dem Internet" msgid "--[no-]share-printers Turn printer sharing on/off" -msgstr "" +msgstr "--[no-]share-printers Mitbenutzung ein/ausschalten" msgid "--[no-]user-cancel-any Allow/prevent users to cancel any job" msgstr "" @@ -1454,16 +1599,16 @@ msgstr "" msgid "--false Always false" -msgstr "" +msgstr "--false Immer falsch" msgid "--help Show program help" -msgstr "" +msgstr "--help Zeige Programmhilfe" msgid "--hold Hold new jobs" -msgstr "" +msgstr "--hold Neue Aufträge anhalten" msgid "--host regex Match hostname to regular expression" -msgstr "" +msgstr "--host regex Vergleiche Hostname mit Regulärem Ausdruck" msgid "" "--include-schemes scheme-list\n" @@ -1471,23 +1616,24 @@ msgstr "" msgid "--ippserver filename Produce ippserver attribute file" -msgstr "" +msgstr "--ippserver Dateiname Erstelle eine ippserver Attribut-Datei" msgid "--language locale Show models matching the given locale" msgstr "" +"--language locale Zeige Modelle auf die die angegebene locale passt" msgid "--local True if service is local" -msgstr "" +msgstr "--local Wahr wenn der Dienst lokal ist" msgid "--ls List attributes" -msgstr "" +msgstr "--ls Liste Attribute" msgid "" "--make-and-model name Show models matching the given make and model name" msgstr "" msgid "--name regex Match service name to regular expression" -msgstr "" +msgstr "--name Regex Prüfe Dienstname mit regulärem Ausdruck" msgid "--no-web-forms Disable web forms for media and supplies" msgstr "" @@ -1499,13 +1645,13 @@ msgstr "" msgid "--path regex Match resource path to regular expression" -msgstr "" +msgstr "--path Regex Prüfe Ressourcenpfad mit regulärem Ausdruck" msgid "--port number[-number] Match port to number or range" msgstr "" msgid "--print Print URI if true" -msgstr "" +msgstr "--print Drucke URI wenn wahr" msgid "--print-name Print service name if true" msgstr "" @@ -1518,7 +1664,7 @@ msgstr "" msgid "--release Release previously held jobs" -msgstr "" +msgstr "--release Angehaltene Aufträge freigeben" msgid "--remote True if service is remote" msgstr "" @@ -1532,24 +1678,27 @@ "--timeout seconds Specify the maximum number of seconds to discover " "devices" msgstr "" +"--timeout Sekunden Angabe der maximalen Anzahl der Sekunden zum " +"Detektieren von Geräten" msgid "--true Always true" -msgstr "" +msgstr "--true Immer wahr" msgid "--txt key True if the TXT record contains the key" msgstr "" msgid "--txt-* regex Match TXT record key to regular expression" msgstr "" +"--txt-* Regex Prüfe TXT-Schlüssel-Eintrag mit regulärem Ausdruck" msgid "--uri regex Match URI to regular expression" -msgstr "" +msgstr "--uri Regex Prüfe URI mit regulärem Ausdruck" msgid "--version Show program version" -msgstr "" +msgstr "--version zeige Programmversion" msgid "--version Show version" -msgstr "" +msgstr "--version zeige Version" msgid "-1" msgstr "-1" @@ -1591,7 +1740,7 @@ msgstr "-2" msgid "-2 Set 2-sided printing support (default=1-sided)" -msgstr "" +msgstr "-2 Duplex einschalten (Voreinstellung=Simplex)" msgid "-20" msgstr "-20" @@ -1612,7 +1761,7 @@ msgstr "-4" msgid "-4 Connect using IPv4" -msgstr "" +msgstr "-4 Verbinde mit IPv4" msgid "-40" msgstr "-40" @@ -1633,7 +1782,7 @@ msgstr "-6" msgid "-6 Connect using IPv6" -msgstr "" +msgstr "-6 Verbinde mit IPv6" msgid "-60" msgstr "-60" @@ -1669,130 +1818,151 @@ msgstr "-95" msgid "-A Enable authentication" -msgstr "" +msgstr "-A Authentication einschalten" msgid "-C Send requests using chunking (default)" msgstr "" +"-C Sende Anfragen mittels chunking (Voreinstellung)" msgid "-D description Specify the textual description of the printer" -msgstr "" +msgstr "-D Beschreibung Angabe der Textbeschreibung des Druckers" msgid "-D device-uri Set the device URI for the printer" -msgstr "" +msgstr "-D Geräte-uri Angabe der Geräte-URI für den Drucker" msgid "" "-E Enable and accept jobs on the printer (after -p)" msgstr "" +"-E Freigabe für Aufträge an den Drucker einschalten " +"(nach -p)" msgid "-E Encrypt the connection to the server" -msgstr "" +msgstr "-E Verbindung zum Server verschlüsseln" msgid "-E Test with encryption using HTTP Upgrade to TLS" msgstr "" +"-E Teste mit Hochstufung der HTTP Verschlüsselung auf " +"TLS" msgid "-F Run in the foreground but detach from console." msgstr "" +"-F Läuft im Vordergrund, aber gelöst von der Konsole." msgid "-F output-type/subtype Set the output format for the printer" -msgstr "" +msgstr "-F output-type/subtype Setze das Ausgabeformat für den Drucker" msgid "-H Show the default server and port" -msgstr "" +msgstr "-H Zeige den voreingestellten Server und Port" msgid "-H HH:MM Hold the job until the specified UTC time" -msgstr "" +msgstr "-H HH:MM Auftrag anhalten biz zur angegeben UTC Uhrzeit" msgid "-H hold Hold the job until released/resumed" msgstr "" +"-H hold Auftrag anhalten bis zur Freigabe/Wiederaufnahme" msgid "-H immediate Print the job as soon as possible" -msgstr "" +msgstr "-H immediate Drucke den Auftrag so bald als möglich" msgid "-H restart Reprint the job" -msgstr "" +msgstr "-H restart Auftrag erneut drucken" msgid "-H resume Resume a held job" -msgstr "" +msgstr "-H resume Wiederaufnahme eines angehaltenen Auftrags" msgid "-H server[:port] Connect to the named server and port" -msgstr "" +msgstr "-H server[:port] Verbinde zum genannten Server und Port" msgid "-I Ignore errors" -msgstr "" +msgstr "-I Ignoriere Fehler" msgid "" "-I {filename,filters,none,profiles}\n" " Ignore specific warnings" msgstr "" +"-I {filename,filters,none,profiles}\n" +" Ignoriere spezifische Warnungen" msgid "" "-K keypath Set location of server X.509 certificates and keys." msgstr "" +"-K Pfad Lege den Pfad für Server X.509 Zertifikate und " +"Schlüssel fest." msgid "-L Send requests using content-length" -msgstr "" +msgstr "-L Sende Anfragen mit content-length" msgid "-L location Specify the textual location of the printer" -msgstr "" +msgstr "-L Ort Textbeschreibung für den Ort des Druckers" msgid "-M manufacturer Set manufacturer name (default=Test)" -msgstr "" +msgstr "-M Hersteller Herstellername angeben (Voreinstellung=Test)" msgid "-P destination Show status for the specified destination" -msgstr "" +msgstr "-P Ziel Zeige den Status für das angegebene Ziel" msgid "-P destination Specify the destination" -msgstr "" +msgstr "-P Ziel Angabe des Ziels" msgid "" "-P filename.plist Produce XML plist to a file and test report to " "standard output" msgstr "" +"-P Dateiname.plist Erzeuge XML-plist in eine Datei und ein Testreport " +"an die Standardausgabe" msgid "-P filename.ppd Load printer attributes from PPD file" -msgstr "" +msgstr "-P Dateiname.ppd Lade die Druckerattribute von der PPD Datei" msgid "-P number[-number] Match port to number or range" -msgstr "" +msgstr "-P Nummer[-Nummer] Vergleiche mit Portnummer oder Portbereich" msgid "-P page-list Specify a list of pages to print" -msgstr "" +msgstr "-P Seitenliste Angabe einer Liste zu druckender Seiten" msgid "-R Show the ranking of jobs" -msgstr "" +msgstr "-R Zeige die Rangfolge der Aufträge" msgid "-R name-default Remove the default value for the named option" msgstr "" +"-R name-default Entferne voreingestellten Wert für die angegebene " +"Option" msgid "-R root-directory Set alternate root" -msgstr "" +msgstr "-R Wurzelverzeichnis Gebe alternatives Wurzelverzeichnis an" msgid "-S Test with encryption using HTTPS" -msgstr "" +msgstr "-S Test mit HTTPS-Verschlüsselung" msgid "-T seconds Set the browse timeout in seconds" msgstr "" +"-T Sekunden Lege die Zeitüberschreitung für Browsing in Sekunden " +"fest" msgid "-T seconds Set the receive/send timeout in seconds" msgstr "" +"-T Sekunden Lege die Zeitüberschreitung für Senden/Empfangen in " +"Sekunden fest" msgid "-T title Specify the job title" -msgstr "" +msgstr "-T Titel Angabe eines Auftragstitels" msgid "-U username Specify the username to use for authentication" msgstr "" +"-U Benutzername Angabe des Benutzernamens zur Authentifizierung" msgid "-U username Specify username to use for authentication" msgstr "" +"-U Benutzername Angabe eines Benutzernamens zur Authentifizierung" msgid "-V version Set default IPP version" -msgstr "" +msgstr "-V version Setze die Voreinstellung der IPP-Version" msgid "-W completed Show completed jobs" -msgstr "" +msgstr "-W completed Zeige abgeschlossene Aufträge" msgid "-W not-completed Show pending jobs" -msgstr "" +msgstr "-W not-completed Zeige anstehende Aufträge" msgid "" "-W {all,none,constraints,defaults,duplex,filters,profiles,sizes," @@ -1801,153 +1971,163 @@ msgstr "" msgid "-X Produce XML plist instead of plain text" -msgstr "" +msgstr "-X Generiere XML-plist anstelle von Text" msgid "-a Cancel all jobs" -msgstr "" +msgstr "-a Alle Aufträge abbrechen" msgid "-a Show jobs on all destinations" -msgstr "" +msgstr "-a Zeige Aufträge für alle Ziele" msgid "-a [destination(s)] Show the accepting state of destinations" msgstr "" +"-a [Ziel(e)] Zeige den Akzeptanzstatus der angegebenen Ziele" msgid "-a filename.conf Load printer attributes from conf file" -msgstr "" +msgstr "-a Dateiname.conf Lade Druckerattribute von der conf Datei" msgid "-c Make a copy of the print file(s)" -msgstr "" +msgstr "-c Erzeuge eine Kopie der Druckdatei(en)" msgid "-c Produce CSV output" -msgstr "" +msgstr "-c Erzeuge CSV-Ausgabe" msgid "-c [class(es)] Show classes and their member printers" -msgstr "" +msgstr "-c [class(es)] Zeige Klassen und deren Drucker-Mitglieder" msgid "-c class Add the named destination to a class" -msgstr "" +msgstr "-c Klasse Füge das genannte Ziel zu einer Klasse hinzu" msgid "-c command Set print command" -msgstr "" +msgstr "-c Befehl Bestimme Druckerbefehl" msgid "-c cupsd.conf Set cupsd.conf file to use." -msgstr "" +msgstr "-c cupsd.conf Bestimme zu benutzende cupsd.conf-Datei." msgid "-d Show the default destination" -msgstr "" +msgstr "-d Zeige das voreingestellte Ziel" msgid "-d destination Set default destination" -msgstr "" +msgstr "-d Lege voreingestelltes Ziel fest" msgid "-d destination Set the named destination as the server default" msgstr "" +"-d Ziel Bestimme das benannte Ziel als Voreinstellung für " +"den Server" msgid "-d destination Specify the destination" -msgstr "" +msgstr "-d Ziel Bestimme das Ziel" msgid "-d name=value Set named variable to value" -msgstr "" +msgstr "-d Name=Wert Gebe der benannten Variablen einen Wert" msgid "-d regex Match domain to regular expression" msgstr "" +"-d Regex Vergleiche die Domäne mit dem Regulären Ausdruck" msgid "-d spool-directory Set spool directory" -msgstr "" +msgstr "-d Spoolverzeichnis Lege das Spoolverzeichnis fest" msgid "-e Show available destinations on the network" -msgstr "" +msgstr "-e Zeige im Netz verfügbare Ziele" msgid "-f Run in the foreground." -msgstr "" +msgstr "-f Starte im Vordergrund." msgid "-f filename Set default request filename" msgstr "" +"-f Dateiname Lege den voreingestellten Dateinamen der Anfrage fest" msgid "-f type/subtype[,...] Set supported file types" -msgstr "" +msgstr "-f Typ/Untertyp[,...] Legt unterstützte Dateitypen fest" msgid "-h Show this usage message." -msgstr "" +msgstr "-h Zeige diesen Hinweis." msgid "-h Validate HTTP response headers" -msgstr "" +msgstr "-h Validiere HTTP-Antwort-Header" msgid "-h regex Match hostname to regular expression" -msgstr "" +msgstr "-h Regex Prüft den Hostnamen gegen regulären Ausdruck" msgid "-h server[:port] Connect to the named server and port" -msgstr "" +msgstr "-h Server[:Port] Verbinde mit genanntem Server und Port" msgid "-i iconfile.png Set icon file" -msgstr "" +msgstr "-i iconfile.png Lege Icon-Datei fest" msgid "-i id Specify an existing job ID to modify" -msgstr "" +msgstr "-i id Gib eine zu modifizierende Auftrags-ID an" msgid "-i ppd-file Specify a PPD file for the printer" -msgstr "" +msgstr "-i ppd-Datei Gib eine PPD-Datei für den Drucker an" msgid "" "-i seconds Repeat the last file with the given time interval" msgstr "" +"-i Sekunden Wiederhole die letzte Datei mit dem angegebenen " +"Intervall" msgid "-k Keep job spool files" -msgstr "" +msgstr "-k Spooldateien beibehalten" msgid "-l List attributes" -msgstr "" +msgstr "-l Liste attribute" msgid "-l Produce plain text output" -msgstr "" +msgstr "-l Generiere Reintext-Ausgabe" msgid "-l Run cupsd on demand." -msgstr "" +msgstr "-l Starte cupsd bei Bedarf." msgid "-l Show supported options and values" -msgstr "" +msgstr "-l Zeige unterstützte Optionen und Werte" msgid "-l Show verbose (long) output" -msgstr "" +msgstr "-l Zeige ausführliche (lange) Ausgabe" msgid "-l location Set location of printer" -msgstr "" +msgstr "-l Ort Bestimme den Ort des Druckers" msgid "" "-m Send an email notification when the job completes" -msgstr "" +msgstr "-m Sende nach Auftragsabschluss eine eMail" msgid "-m Show models" -msgstr "" +msgstr "-m Zeige Modelle" msgid "" "-m everywhere Specify the printer is compatible with IPP Everywhere" msgstr "" +"-m everywhere Gib an dass der Drucker mit IPP Everywhere " +"kompatibel ist" msgid "-m model Set model name (default=Printer)" -msgstr "" +msgstr "-m Modell Lege Modellname fest (Voreinstellung=Printer)" msgid "" "-m model Specify a standard model/PPD file for the printer" -msgstr "" +msgstr "-m Modell Gib eine Standard-Model/PPD-Datei für den Drucker an" msgid "-n count Repeat the last file the given number of times" msgstr "" +"-n Anzahl Wiederhole die letzte Datei so oft wie angegeben" msgid "-n hostname Set hostname for printer" -msgstr "" +msgstr "-n Hostname Lege den Hostnamen des Druckers fest" msgid "-n num-copies Specify the number of copies to print" -msgstr "" +msgstr "-n Kopien Gib die Anzahl der zu druckenden Kopien an" msgid "-n regex Match service name to regular expression" -msgstr "" +msgstr "-n Regex Prüfe Dienstname gegen regulären Ausdruck" msgid "" "-o Name=Value Specify the default value for the named PPD option " msgstr "" msgid "-o [destination(s)] Show jobs" -msgstr "" +msgstr "-o [Ziel(e)] Zeige Aufträge" msgid "" "-o cupsIPPSupplies=false\n" @@ -1969,10 +2149,10 @@ msgstr "" msgid "-o job-sheets=standard Print a banner page with the job" -msgstr "" +msgstr "-o job-sheets=standard Drucke eine Bannerseite mit dem Auftrag" msgid "-o media=size Specify the media size to use" -msgstr "" +msgstr "-o media=size Gebe die zu verwendende Mediengröße an" msgid "-o name-default=value Specify the default value for the named option" msgstr "" @@ -1986,17 +2166,21 @@ msgstr "" msgid "-o option[=value] Specify a printer-specific option" -msgstr "" +msgstr "-o Option[=Wert] Gib eine Druckerspezifische Option an" msgid "" "-o orientation-requested=N\n" " Specify portrait (3) or landscape (4) orientation" msgstr "" +"-o orientation-requested=N\n" +" Gebe die Ausrichtung hochkant (3) oder quer (4) an" msgid "" "-o print-quality=N Specify the print quality - draft (3), normal (4), " "or best (5)" msgstr "" +"-o print-quality=N Gebe die Druckqualität an - Entwurf (3), Normal (4), " +"oder Bestmöglich (5)" msgid "" "-o printer-error-policy=name\n" @@ -2014,38 +2198,42 @@ msgstr "" msgid "-o sides=one-sided Specify 1-sided printing" -msgstr "" +msgstr "-o sides=one-sided 1-seitiger Druck" msgid "" "-o sides=two-sided-long-edge\n" " Specify 2-sided portrait printing" msgstr "" +"-o sides=two-sided-long-edge\n" +" 2-seitiger Druck in Hochformat" msgid "" "-o sides=two-sided-short-edge\n" " Specify 2-sided landscape printing" msgstr "" +"-o sides=two-sided-short-edge\n" +" 2-seitiger Druck in Querformat" msgid "-p Print URI if true" msgstr "" msgid "-p [printer(s)] Show the processing state of destinations" -msgstr "" +msgstr "-p [Drucker] Zeige den Bearbeitungsstatus der Drucker-Ziele" msgid "-p destination Specify a destination" -msgstr "" +msgstr "-p Ziel Bestimme ein Ziel" msgid "-p destination Specify/add the named destination" -msgstr "" +msgstr "-p Ziel Gebe das benannte Ziel an/füge hinzu" msgid "-p port Set port number for printer" -msgstr "" +msgstr "-p Port Bestimme die Portnummer für den Drucker" msgid "-q Quietly report match via exit code" msgstr "" msgid "-q Run silently" -msgstr "" +msgstr "-q Laufe leise" msgid "-q Specify the job should be held for printing" msgstr "" @@ -2069,47 +2257,51 @@ msgstr "" msgid "-r reason Specify a reason message that others can see" -msgstr "" +msgstr "-r Grund Gib eine Begründung an den andere sehen können" msgid "-r subtype,[subtype] Set DNS-SD service subtype" msgstr "" msgid "-s Be silent" -msgstr "" +msgstr "-s Sei still" msgid "-s Print service name if true" msgstr "" msgid "-s Show a status summary" -msgstr "" +msgstr "-s Zeige eine Statuszusammenfassung" msgid "-s cups-files.conf Set cups-files.conf file to use." msgstr "" +"-s cups-files.conf Gebe die zu verwendende cups-files.conf-Datei an." msgid "-s speed[,color-speed] Set speed in pages per minute" msgstr "" msgid "-t Produce a test report" -msgstr "" +msgstr "-t Generiere einen Testreport" msgid "-t Show all status information" -msgstr "" +msgstr "-t Zeige alle Statusinformationen" msgid "-t Test the configuration file." -msgstr "" +msgstr "-t Teste die Konfigurationsdatei." msgid "-t key True if the TXT record contains the key" msgstr "" +"-t Schlüssel Wahr wenn der TXT-Eintrag den Schlüssel enthält" msgid "-t title Specify the job title" -msgstr "" +msgstr "-t Titel Lege den Auftragstitel fest" msgid "" "-u [user(s)] Show jobs queued by the current or specified users" msgstr "" +"-u [Benutzer] Zeige anstehende Aufträge des aktuellen oder " +"angegebenen Benutzers an" msgid "-u allow:all Allow all users to print" -msgstr "" +msgstr "-u allow:all Erlaube allen Benutzern das Drucken" msgid "" "-u allow:list Allow the list of users or groups (@name) to print" @@ -2120,34 +2312,36 @@ msgstr "" msgid "-u owner Specify the owner to use for jobs" -msgstr "" +msgstr "-u Besitzer Gebe den Besitzer für Aufträge an" msgid "-u regex Match URI to regular expression" -msgstr "" +msgstr "-u Regex Prüfe URI gegen regulären Ausdruck" msgid "-v Be verbose" -msgstr "" +msgstr "-v ausführliche Ausgabe" msgid "-v Show devices" -msgstr "" +msgstr "-v Zeige Geräte" msgid "-v [printer(s)] Show the devices for each destination" -msgstr "" +msgstr "-v [Drucker] Zeige die Geräte für jedes Druckerziel" msgid "-v device-uri Specify the device URI for the printer" -msgstr "" +msgstr "-v Geräte-uri Gib die Geräte-URI für den Drucker an" msgid "-vv Be very verbose" -msgstr "" +msgstr "-vv sehr ausführliche Ausgabe" msgid "-x Purge jobs rather than just canceling" -msgstr "" +msgstr "-x Entferne Aufträge anstatt sie nur abzubrechen" msgid "-x destination Remove default options for destination" msgstr "" +"-x Ziel Entferne die voreingestellten Optionen für das " +"genannte Ziel" msgid "-x destination Remove the named destination" -msgstr "" +msgstr "-x Ziel Entferne das genannte Ziel" msgid "" "-x utility [argument ...] ;\n" @@ -2156,6 +2350,8 @@ msgid "/etc/cups/lpoptions file names default destination that does not exist." msgstr "" +"/etc/cups/lpoptions Datei enthält ein nicht existierendes voreingestelltes " +"Ziel." msgid "0" msgstr "0" @@ -2174,22 +2370,22 @@ msgstr "1,25×0,25 inch" msgid "1.25x2.25\"" -msgstr "1,25 × 2,25 inch" +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" +msgstr "1,50×0,25 inch" msgid "1.50x0.50\"" -msgstr "1,50 × 0,50 inch" +msgstr "1,50×0,50 inch" msgid "1.50x1.00\"" -msgstr "1,50 × 1,00 inch" +msgstr "1,50×1,00 inch" msgid "1.50x2.00\"" -msgstr "1,50 × 2,00 inch" +msgstr "1,50×2,00 inch" msgid "10" msgstr "10" @@ -2199,13 +2395,13 @@ msgstr "10 inch/s" msgid "10 x 11" -msgstr "10 × 11 inch" +msgstr "10×11 inch" msgid "10 x 13" -msgstr "10 × 13 inch" +msgstr "10×13 inch" msgid "10 x 14" -msgstr "10 × 14 inch" +msgstr "10×14 inch" msgid "100" msgstr "100" @@ -2235,7 +2431,7 @@ msgstr "12 inch/s" msgid "12 x 11" -msgstr "12 × 11 inch" +msgstr "12×11 inch" msgid "120" msgstr "120" @@ -2244,10 +2440,10 @@ msgstr "120 mm/s" msgid "120x60dpi" -msgstr "120 × 60 dpi" +msgstr "120×60 dpi" msgid "120x72dpi" -msgstr "120 × 72 dpi" +msgstr "120×72 dpi" msgid "13" msgstr "13" @@ -2265,7 +2461,7 @@ msgstr "15 mm/s" msgid "15 x 11" -msgstr "15 x 11" +msgstr "15x11 inch" msgid "150 mm/sec." msgstr "150 mm/s" @@ -2295,61 +2491,61 @@ msgstr "2 inch/s" msgid "2-Sided Printing" -msgstr "Doppelseitig drucken" +msgstr "Doppelseitiger Druck" msgid "2.00x0.37\"" -msgstr "2,00 × 0,37 inch" +msgstr "2,00×0,37 inch" msgid "2.00x0.50\"" -msgstr "2,00 × 0,50 inch" +msgstr "2,00×0,50 inch" msgid "2.00x1.00\"" -msgstr "2,00 × 1,00 inch" +msgstr "2,00×1,00 inch" msgid "2.00x1.25\"" -msgstr "2,00 × 1,25 inch" +msgstr "2,00×1,25 inch" msgid "2.00x2.00\"" -msgstr "2,00 × 2,00 inch" +msgstr "2,00×2,00 inch" msgid "2.00x3.00\"" -msgstr "2,00 × 3,00 inch" +msgstr "2,00×3,00 inch" msgid "2.00x4.00\"" -msgstr "2,00 × 4,00 inch" +msgstr "2,00×4,00 inch" msgid "2.00x5.50\"" -msgstr "2,00 × 5,50 inch" +msgstr "2,00×5,50 inch" msgid "2.25x0.50\"" -msgstr "2,25 × 0,50 inch" +msgstr "2,25×0,50 inch" msgid "2.25x1.25\"" -msgstr "2,25 × 1,25 inch" +msgstr "2,25×1,25 inch" msgid "2.25x4.00\"" -msgstr "2,25 × 4,00 inch" +msgstr "2,25×4,00 inch" msgid "2.25x5.50\"" -msgstr "2,25 × 5,50 inch" +msgstr "2,25×5,50 inch" msgid "2.38x5.50\"" -msgstr "2,38 × 5,50 inch" +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" +msgstr "2,50×1,00 inch" msgid "2.50x2.00\"" -msgstr "2,50 × 2,00 inch" +msgstr "2,50×2,00 inch" msgid "2.75x1.25\"" -msgstr "2,75 × 1,25 inch" +msgstr "2,75×1,25 inch" msgid "2.9 x 1\"" -msgstr "2.9 × 1 inch" +msgstr "2.9×1 inch" msgid "20" msgstr "20" @@ -2379,7 +2575,7 @@ msgstr "24-Pin Serie" msgid "240x72dpi" -msgstr "240 × 72 dpi" +msgstr "240×72 dpi" msgid "25" msgstr "25" @@ -2406,46 +2602,46 @@ msgstr "3 inch/s" msgid "3 x 5" -msgstr "3 × 5" +msgstr "3×5" msgid "3.00x1.00\"" -msgstr "3,00 × 1,00 inch" +msgstr "3,00×1,00 inch" msgid "3.00x1.25\"" -msgstr "3,00 × 1,25 inch" +msgstr "3,00×1,25 inch" msgid "3.00x2.00\"" -msgstr "3,00 × 2,00 inch" +msgstr "3,00×2,00 inch" msgid "3.00x3.00\"" -msgstr "3,00 × 3,00 inch" +msgstr "3,00×3,00 inch" msgid "3.00x5.00\"" -msgstr "3,00 × 5,00 inch" +msgstr "3,00×5,00 inch" msgid "3.25x2.00\"" -msgstr "3,25 × 2,00 inch" +msgstr "3,25×2,00 inch" msgid "3.25x5.00\"" -msgstr "3,25 × 5,00 inch" +msgstr "3,25×5,00 inch" msgid "3.25x5.50\"" -msgstr "3,25 × 5,50 inch" +msgstr "3,25×5,50 inch" msgid "3.25x5.83\"" -msgstr "3,25 × 5,83 inch" +msgstr "3,25×5,83 inch" msgid "3.25x7.83\"" -msgstr "3,25 × 7,83 inch" +msgstr "3,25×7,83 inch" msgid "3.5 x 5" -msgstr "3,5 × 5 inch" +msgstr "3,5×5 inch" msgid "3.5\" Disk" msgstr "3,5 inch Disk" msgid "3.50x1.00\"" -msgstr "3,50 × 1,00 inch" +msgstr "3,50×1,00 inch" msgid "30" msgstr "30" @@ -2460,7 +2656,7 @@ msgstr "300 dpi" msgid "30859 Paint Can Label" -msgstr "" +msgstr "30859 Aufkleber für Farbfässer" msgid "35" msgstr "35" @@ -2469,7 +2665,7 @@ msgstr "360 dpi" msgid "360x180dpi" -msgstr "360 × 180 dpi" +msgstr "360×180 dpi" msgid "4" msgstr "4" @@ -2478,31 +2674,31 @@ msgstr "4 inch/s" msgid "4.00x1.00\"" -msgstr "4,00 × 1,00 inch" +msgstr "4,00×1,00 inch" msgid "4.00x13.00\"" -msgstr "4,00 × 13,00 inch" +msgstr "4,00×13,00 inch" msgid "4.00x2.00\"" -msgstr "4,00 × 2,00 inch" +msgstr "4,00×2,00 inch" msgid "4.00x2.50\"" -msgstr "4,00 × 2,50 inch" +msgstr "4,00×2,50 inch" msgid "4.00x3.00\"" -msgstr "4,00 × 3,00 inch" +msgstr "4,00×3,00 inch" msgid "4.00x4.00\"" -msgstr "4,00 × 4,00 inch" +msgstr "4,00×4,00 inch" msgid "4.00x5.00\"" -msgstr "4,00 × 5,00 inch" +msgstr "4,00×5,00 inch" msgid "4.00x6.00\"" -msgstr "4,00 × 6,00 inch" +msgstr "4,00×6,00 inch" msgid "4.00x6.50\"" -msgstr "4,00 × 6,50 inch" +msgstr "4,00×6,50 inch" msgid "40" msgstr "40" @@ -2520,7 +2716,7 @@ msgstr "5 inch/s" msgid "5 x 7" -msgstr "5 × 7" +msgstr "5×7" msgid "50" msgstr "50" @@ -2535,25 +2731,25 @@ msgstr "6 inch/s" msgid "6.00x1.00\"" -msgstr "6,00 × 1,00 inch" +msgstr "6,00×1,00 inch" msgid "6.00x2.00\"" -msgstr "6,00 × 2,00 inch" +msgstr "6,00×2,00 inch" msgid "6.00x3.00\"" -msgstr "6,00 × 3,00 inch" +msgstr "6,00×3,00 inch" msgid "6.00x4.00\"" -msgstr "6,00 × 4,00 inch" +msgstr "6,00×4,00 inch" msgid "6.00x5.00\"" -msgstr "6,00 × 5,00 inch" +msgstr "6,00×5,00 inch" msgid "6.00x6.00\"" -msgstr "6,00 × 6,00 inch" +msgstr "6,00×6,00 inch" msgid "6.00x6.50\"" -msgstr "6,00 × 6,50 inch" +msgstr "6,00×6,50 inch" msgid "60" msgstr "60" @@ -2568,7 +2764,7 @@ msgstr "60 dpi" msgid "60x72dpi" -msgstr "60 × 72 dpi" +msgstr "60×72 dpi" msgid "65" msgstr "65" @@ -2580,7 +2776,7 @@ msgstr "7 inch/s" msgid "7 x 9" -msgstr "7 × 9" +msgstr "7×9" msgid "70" msgstr "70" @@ -2595,28 +2791,28 @@ msgstr "8 inch/s" msgid "8 x 10" -msgstr "8 × 10 inch" +msgstr "8×10 inch" msgid "8.00x1.00\"" -msgstr "8,00 × 1,00 inch" +msgstr "8,00×1,00 inch" msgid "8.00x2.00\"" -msgstr "8,00 × 2,00 inch" +msgstr "8,00×2,00 inch" msgid "8.00x3.00\"" -msgstr "8,00 × 3,00 inch" +msgstr "8,00×3,00 inch" msgid "8.00x4.00\"" -msgstr "8,00 × 4,00 inch" +msgstr "8,00×4,00 inch" msgid "8.00x5.00\"" -msgstr "8,00 × 5,00 inch" +msgstr "8,00×5,00 inch" msgid "8.00x6.00\"" -msgstr "8,00 × 6,00 inch" +msgstr "8,00×6,00 inch" msgid "8.00x6.50\"" -msgstr "8,00 × 6,50 inch" +msgstr "8,00×6,50 inch" msgid "80" msgstr "80" @@ -2790,7 +2986,7 @@ #, 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." +msgstr "Versuch den %s Druckerstatus auf einen ungültigen Wert %d zu setzen." #, c-format msgid "Attribute \"%s\" is in the wrong group." @@ -2842,18 +3038,18 @@ #, c-format msgid "Bad \"printer-id\" value %d." -msgstr "Falscher \"printer-id\" Wert %d." +msgstr "Falscher \"printer-id\"-Wert %d." #, c-format msgid "Bad '%s' value." -msgstr "" +msgstr "Ungültiger Wert '%s'." #, c-format msgid "Bad 'document-format' value \"%s\"." -msgstr "Fehlerhafter 'document-format' Wert \"%s\"." +msgstr "Fehlerhafter 'document-format'-Wert \"%s\"." msgid "Bad CloseUI/JCLCloseUI" -msgstr "" +msgstr "Ungültiger Wert CloseUI/JCLCloseUI" msgid "Bad NULL dests pointer" msgstr "Ungültiger NULL-Dests-Zeiger" @@ -2883,7 +3079,7 @@ msgstr "Ungültige UIConstraints" msgid "Bad URI." -msgstr "" +msgstr "Ungültige URI." msgid "Bad arguments to function" msgstr "Ungültige Argumente an Funktion" @@ -2951,7 +3147,7 @@ #, c-format msgid "Bad notify-user-data \"%s\"." -msgstr "" +msgstr "Ungültige notify-user-data \"%s\"." #, c-format msgid "Bad number-up value %d." @@ -2987,7 +3183,7 @@ msgstr "Ungültige Resource in URI" msgid "Bad scheme in URI" -msgstr "Ungültiges Scheman in URI" +msgstr "Ungültiges Schema in URI" msgid "Bad username in URI" msgstr "Ungültiger Benutzername in URI" @@ -3009,7 +3205,7 @@ #, c-format msgid "Boolean expected for waiteof option \"%s\"." -msgstr "Boolesch erwartet für waitof Option \"%s\"." +msgstr "Bool erwartet für waitof-Option \"%s\"." msgid "Buffer overflow detected, aborting." msgstr "Pufferüberlauf festgestellt, Abbruch." @@ -3027,7 +3223,7 @@ msgstr "Auftrag wird abgebrochen." msgid "Cannot change printer-is-shared for remote queues." -msgstr "" +msgstr "Kann für entfernte Warteschlangen die Mitbenutzung nicht ändern." msgid "Cannot share a remote Kerberized printer." msgstr "Freigabe eines entfernten kerberisierten Druckers nicht möglich" @@ -3091,7 +3287,7 @@ msgstr "Erstellt" msgid "Credentials do not validate against site CA certificate." -msgstr "Anmeldedaten validieren nicht gegen das CA Zertifikat der Seite" +msgstr "Anmeldedaten validieren nicht gegen das CA-Zertifikat der Seite" msgid "Credentials have expired." msgstr "Berechtigung ist abgelaufen" @@ -3112,7 +3308,7 @@ msgstr "Abschneider" msgid "DYMO" -msgstr "" +msgstr "DYMO" msgid "Dark" msgstr "Dunkel" @@ -3124,10 +3320,10 @@ msgstr "Datendatei erfolgreich gesendet." msgid "Deep Color" -msgstr "Tiefe Farbe" +msgstr "kräftige Farben" msgid "Deep Gray" -msgstr "" +msgstr "Dunkelgrau" msgid "Delete Class" msgstr "Klasse löschen" @@ -3143,13 +3339,13 @@ msgstr "Ziel „%s“ akzeptiert keine Druckaufträge." msgid "Device CMYK" -msgstr "" +msgstr "Geräte-CMYK" msgid "Device Gray" -msgstr "" +msgstr "Geräte-Grau" msgid "Device RGB" -msgstr "" +msgstr "Geräte-RGB" #, c-format msgid "" @@ -3213,11 +3409,11 @@ msgstr "Konfigurationsdatei bearbeiten" msgid "Encryption is not supported." -msgstr "Verschlüsselung ist nicht unterstüzt." +msgstr "Verschlüsselung ist nicht unterstützt." #. TRANSLATORS: Banner/cover sheet after the print job. msgid "Ending Banner" -msgstr "Banner beenden" +msgstr "Endbanner" msgid "English" msgstr "Deutsch" @@ -3228,7 +3424,7 @@ "valid Kerberos ticket." msgstr "" "Geben Sie Ihren Benutzernamen und das Passwort oder den root-Benutzernamen " -"und -passwort ein, um auf diese Seite zuzugreifen. Falls Sie die Kerberos-" +"und -Passwort ein, um auf diese Seite zuzugreifen. Falls Sie die Kerberos-" "Authentifizierung verwenden, stellen Sie sicher, dass Sie ein gültiges " "Kerberos-Ticket haben." @@ -3485,6 +3681,8 @@ "File device URIs have been disabled. To enable, see the FileDevice directive " "in \"%s/cups-files.conf\"." msgstr "" +"Datei-Geräte-URI sind gesperrt. Um sie zu entsperren siehe FileDevice " +"Directive in \"%s/cups-files.conf\"." #, c-format msgid "Finished page %d." @@ -3520,6 +3718,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "Drucker-URI Attribut empfangen aber keine Auftrags-ID." +msgid "GrayScale" +msgstr "Graustufen" + msgid "Grayscale" msgstr "Graustufen" @@ -3551,7 +3752,7 @@ msgstr "IPP begCollection Wert nicht 0 Byte." msgid "IPP boolean value not 1 byte." -msgstr "IPP boolescher Wert nicht 1 Byte." +msgstr "IPP boolscher Wert nicht 1 Byte." msgid "IPP date value not 11 bytes." msgstr "IPP-Datenwert nicht 11 Byte." @@ -3563,7 +3764,7 @@ msgstr "IPP enum Wert nicht 4 Byte." msgid "IPP extension tag larger than 0x7FFFFFFF." -msgstr "IPP Erweiterung grösser als 0x7FFFFFFF." +msgstr "IPP-Erweiterung größer als 0x7FFFFFFF." msgid "IPP integer value not 4 bytes." msgstr "IPP Integer-Wert nicht 4 Bytes." @@ -3581,7 +3782,7 @@ msgstr "IPP-Mitgliedsnamenwert ist leer." msgid "IPP memberName with no attribute." -msgstr "IPP-Mitgliedsname ohne Attribute." +msgstr "IPP-Mitgliedsname ohne Attribut." msgid "IPP name larger than 32767 bytes." msgstr "IPP Name länger als 32767 Byte" @@ -3608,30 +3809,32 @@ msgstr "IPP-Wert länger als 32767 Bytes." msgid "IPPFIND_SERVICE_DOMAIN Domain name" -msgstr "" +msgstr "IPPFIND_SERVICE_DOMAIN Domänenname" msgid "" "IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" +"IPPFIND_SERVICE_HOSTNAME\n" +" Vollqualifizierter Domänenname" msgid "IPPFIND_SERVICE_NAME Service instance name" -msgstr "" +msgstr "IPPFIND_SERVICE_NAME Name der Dienstinstanz" msgid "IPPFIND_SERVICE_PORT Port number" -msgstr "" +msgstr "IPPFIND_SERVICE_PORT Portnummer" msgid "IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" msgid "IPPFIND_SERVICE_SCHEME URI scheme" -msgstr "" +msgstr "IPPFIND_SERVICE_SCHEME URI Schema" msgid "IPPFIND_SERVICE_URI URI" -msgstr "" +msgstr "IPPFIND_SERVICE_URI URI" msgid "IPPFIND_TXT_* Value of TXT record key" -msgstr "" +msgstr "IPPFIND_TXT_* Wert des TXT Schlüssel-Eintrags" msgid "ISOLatin1" msgstr "ISOLatin1" @@ -3679,7 +3882,7 @@ msgstr "Internet Printing Protocol" msgid "Invalid group tag." -msgstr "" +msgstr "Ungültiges Gruppen-Tag." msgid "Invalid media name arguments." msgstr "Ungültige Argumente des Mediennamens." @@ -3688,7 +3891,7 @@ msgstr "Ungültige Mediengröße." msgid "Invalid named IPP attribute in collection." -msgstr "" +msgstr "Ungültiger IPP-Attributname in der Folge." msgid "Invalid ppd-name value." msgstr "Ungültgier Wert ppd-name" @@ -3794,13 +3997,13 @@ msgstr "Auftrag ist abgeschlossen und kann nicht geändert werden." msgid "Job operation failed" -msgstr "Auftrag fehlgeschlagen:" +msgstr "Auftrag fehlgeschlagen" msgid "Job state cannot be changed." msgstr "Auftragsstatus kann nicht geändert werden." msgid "Job subscriptions cannot be renewed." -msgstr "Auftragssubskiptionen können nicht erneuert werden." +msgstr "Auftragssubskriptionen können nicht erneuert werden." msgid "Jobs" msgstr "Aufträge" @@ -3846,10 +4049,10 @@ #, c-format msgid "Listening on port %d." -msgstr "" +msgstr "Lausche auf Port %d." msgid "Local printer created." -msgstr "Lokalen Drucker erzeugt." +msgstr "Lokaler Drucker erzeugt." msgid "Long-Edge (Portrait)" msgstr "Lange Kante (Hochformat)" @@ -3858,7 +4061,7 @@ msgstr "Suche nach Drucker." msgid "Main Roll" -msgstr "" +msgstr "Hauptrolle" msgid "Manual Feed" msgstr "Manuelle Papierzufuhr" @@ -3885,7 +4088,7 @@ msgstr "Fehlendes CloseGroup" msgid "Missing CloseUI/JCLCloseUI" -msgstr "" +msgstr "Fehlendes CloseUI/JCLCloseUI" msgid "Missing PPD-Adobe-4.x header" msgstr "PPD-Adobe-4.x Header fehlt" @@ -3897,19 +4100,19 @@ msgstr "Fehlendes Attribut zur Dokumentennummer." msgid "Missing form variable" -msgstr "Fehlende form Variable" +msgstr "Fehlende form-Variable" msgid "Missing last-document attribute in request." -msgstr "Fehlendes Letzte-Sete Attribut in der Anfrage." +msgstr "Fehlendes Letzte-Seite-Attribut in der Anfrage." msgid "Missing media or media-col." -msgstr "" +msgstr "Fehlende Medien oder Medien-col." msgid "Missing media-size in media-col." -msgstr "" +msgstr "Fehlende Mediengröße oder Medien-col." msgid "Missing notify-subscription-ids attribute." -msgstr "" +msgstr "Fehlendes notify-subscription-ids Attribut." msgid "Missing option keyword" msgstr "Fehlende Option Schlüsselwort" @@ -3985,7 +4188,7 @@ msgstr "Neue Anmeldedaten sind für den Namen ungültig." msgid "New credentials are older than stored credentials." -msgstr "Neue Anmeldedaten sind läter als die gespeicherten Anmeldedaten" +msgstr "Neue Anmeldedaten sind älter als die gespeicherten Anmeldedaten" msgid "No" msgstr "Nein" @@ -4065,7 +4268,7 @@ msgstr "Keine Drucker-URI gefunden für die Klasse" msgid "No printer-uri in request." -msgstr "" +msgstr "Keine Drucker-URI in der Anfrage." msgid "No request URI." msgstr "Keine Anfrage-URI." @@ -4204,6 +4407,7 @@ msgid "" "PRINTER environment variable names default destination that does not exist." msgstr "" +"PRINTER Umgebungsvariable für ein voreingestelltes Ziel existiert nicht." msgid "Packet does not contain a Get-Response-PDU" msgstr "Paket enthält kein Get-Response-PDU" @@ -4335,6 +4539,8 @@ msgid "Printer does not support required IPP attributes or document formats." msgstr "" +"Drucker unterstützt die erforderlichenIPP-Attribute oder Dokumentformate " +"nicht" msgid "Printer:" msgstr "Drucker:" @@ -4397,7 +4603,7 @@ msgstr "SSL/TLS Verhandlungsfehler" msgid "Second Roll (DUO/Twin Only)" -msgstr "" +msgstr "Zweite Rolle (nur Doppelrolle)" msgid "See Other" msgstr "Siehe auch" @@ -4542,7 +4748,7 @@ 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." +msgstr "Die PPD-Datei konnte nicht geöffnet werden." msgid "" "The class name may only contain up to 127 printable characters and may not " @@ -4559,7 +4765,7 @@ #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." -msgstr "Der WErt für notify-user-data ist zu groß (%d > 63 octets)." +msgstr "Der Wert für notify-user-data ist zu groß (%d > 63 octets)." msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" @@ -4591,13 +4797,16 @@ msgstr "Der Drucker ist derzeit nicht erreichbar." msgid "The printer may not exist or is unavailable at this time." -msgstr "Der Drucker existiert nicht oder ist zur Zeit nicht verfügbar." +msgstr "Der Drucker existiert nicht oder ist zurzeit nicht verfügbar." msgid "" "The printer name may only contain up to 127 printable characters and may not " "contain spaces, slashes (/ \\), quotes (' \"), question mark (?), or the " "pound sign (#)." msgstr "" +"Der Druckername kann maximal 127 druckbare Zeichen umfassen aber keinesfalls " +"Leerzeichen, Slashes (/ \\), Anführungszeichen (' \"), Fragezeichen (?), " +"oder Rautezeichen (#)." msgid "The printer or class does not exist." msgstr "Der Drucker oder die Klasse existiert nicht." @@ -4610,7 +4819,7 @@ msgstr "Die Drucker-URI »%s« enthält ungültige Zeichen." msgid "The printer-uri attribute is required." -msgstr "Das printer-uri Attribut ist erforderlich." +msgstr "Das printer-uri-Attribut ist erforderlich." msgid "" "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." @@ -4628,7 +4837,7 @@ "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " "enable it." msgstr "" -"Die Web-Schnittstelle ist derzeit abgeschaltet. Das Einschalten kann mitdem " +"Die Web-Schnittstelle ist derzeit abgeschaltet. Das Einschalten kann mit dem " "Befehl »cupsctl WebInterface=yes« erfolgen." #, c-format @@ -4639,7 +4848,7 @@ msgstr "Es gibt zu viele Subskriptionen." msgid "There was an unrecoverable USB error." -msgstr "Ein nicht zu behebender USB Fehler ist aufgetreten." +msgstr "Ein nicht zu behebender USB-Fehler ist aufgetreten." msgid "Thermal Transfer Media" msgstr "Thermotransferpapier" @@ -4649,11 +4858,11 @@ #, c-format msgid "Too many job-sheets values (%d > 2)." -msgstr "Zu viele job-sheets Werte (%d > 2)." +msgstr "Zu viele job-sheets-Werte (%d > 2)." #, c-format msgid "Too many printer-state-reasons values (%d > %d)." -msgstr "Zu viele printer-state-reasons Werte (%d > %d)." +msgstr "Zu viele printer-state-reasons-Werte (%d > %d)." msgid "Transparency" msgstr "Transparenz" @@ -4738,7 +4947,7 @@ msgstr "Speicher für Seitenmatrix kann nicht belegt werden" msgid "Unable to allocate memory for printer" -msgstr "" +msgstr "Speicher für den Drucker kann nicht belegt werden" msgid "Unable to cancel print job." msgstr "Druckauftrag kann nicht abgebrochen werden." @@ -4750,12 +4959,12 @@ msgstr "Attribut „printer-is-shared“ konnte nicht geändert werden" msgid "Unable to change server settings" -msgstr "Servereinstellungen konnten nicht geändert werden :" +msgstr "Servereinstellungen konnten nicht geändert werden" #, c-format msgid "Unable to compile mimeMediaType regular expression: %s." msgstr "" -"Der regulären Ausdruck %s für mimeMediaType kann nicht kompiliert werden." +"Der regulären Ausdruck für mimeMediaType kann nicht kompiliert werden: %s." #, c-format msgid "Unable to compile naturalLanguage regular expression: %s." @@ -4775,10 +4984,10 @@ #, c-format msgid "Unable to copy PPD file - %s" -msgstr "PPD Datei %s kann nicht kopiert werden" +msgstr "PPD-Datei kann nicht kopiert werden - %s" msgid "Unable to copy PPD file." -msgstr "PPD Datei kann nicht kopiert werden" +msgstr "PPD-Datei kann nicht kopiert werden." msgid "Unable to create credentials from array." msgstr "Anmeldedaten aus dem Array können nicht erzeugt werden." @@ -4794,7 +5003,7 @@ #, c-format msgid "Unable to create spool directory \"%s\": %s" -msgstr "" +msgstr "Anlegen des spool-Verzeichnisses \"%s\" nicht möglich: %s" msgid "Unable to create temporary file" msgstr "Temporäre Datei konnte nicht erstellt werden" @@ -4809,11 +5018,11 @@ msgstr "Wartungsbefehl konnte nicht ausgeführt werden" msgid "Unable to edit cupsd.conf files larger than 1MB" -msgstr "cupsd.conf Dateien grösser als 1MB können nicht bearbeitet werden" +msgstr "cupsd.conf-Dateien größer als 1MB können nicht bearbeitet werden" #, c-format msgid "Unable to establish a secure connection to host (%d)." -msgstr "" +msgstr "Herstellen einer sicheren Verbindung zum Host (%d) nicht möglich." msgid "" "Unable to establish a secure connection to host (certificate chain invalid)." @@ -4854,7 +5063,7 @@ #, c-format msgid "Unable to execute command \"%s\": %s" -msgstr "" +msgstr "Befehl \"%s\" kann nicht ausgeführt werden: %s" msgid "Unable to find destination for job" msgstr "Das Ziel für den Auftrag kann nicht gefunden werden" @@ -4869,47 +5078,47 @@ msgstr "Der Backend-Rückgabewert kann nicht ermittelt werden." msgid "Unable to get class list" -msgstr "Klassenliste konnte nicht ermittelt werden:" +msgstr "Klassenliste konnte nicht ermittelt werden" msgid "Unable to get class status" -msgstr "Klassenstatus konnte nicht ermittelt werden:" +msgstr "Klassenstatus konnte nicht ermittelt werden" msgid "Unable to get list of printer drivers" -msgstr "Liste der Druckertreiber konnte nicht ermittel werden:" +msgstr "Liste der Druckertreiber konnte nicht ermittel werden" msgid "Unable to get printer attributes" -msgstr "Druckerattribute konnten nicht ermittelt werden:" +msgstr "Druckerattribute konnten nicht ermittelt werden" msgid "Unable to get printer list" -msgstr "Druckerliste konnte nicht ermittelt werden:" +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:" +msgstr "Druckerstatus konnte nicht ermittelt werden." msgid "Unable to load help index." msgstr "Hilfeindex kann nicht geladen werden." #, c-format msgid "Unable to locate printer \"%s\"." -msgstr "Der Drucker »%s« kann nicht lokalisiert werden" +msgstr "Der Drucker »%s« kann nicht lokalisiert werden." msgid "Unable to locate printer." -msgstr "Der Drucker kann nicht lokalisiert werden" +msgstr "Der Drucker kann nicht lokalisiert werden." msgid "Unable to modify class" -msgstr "Klasse konnte nicht verändert werden:" +msgstr "Klasse konnte nicht verändert werden" msgid "Unable to modify printer" -msgstr "Drucker kann nicht verändert werden:" +msgstr "Drucker kann nicht verändert werden" msgid "Unable to move job" -msgstr "Druckauftrag kann nicht bewegt werden" +msgstr "Druckauftrag kann nicht verschoben werden" msgid "Unable to move jobs" -msgstr "Druckaufträge können nicht bewegt werden" +msgstr "Druckaufträge können nicht verschoben werden" msgid "Unable to open PPD file" msgstr "PPD Datei kann nicht geöffnet werden" @@ -4925,7 +5134,7 @@ msgstr "Das Dokument #%d in Auftrag #%d kann nicht geöffnet werden." msgid "Unable to open help file." -msgstr "Die Hilfe-Datei kann nicht geöffnet werden" +msgstr "Die Hilfe-Datei kann nicht geöffnet werden." msgid "Unable to open print file" msgstr "Die Druckdatei kann nicht geöffnet werden" @@ -4941,7 +5150,7 @@ #, c-format msgid "Unable to register \"%s.%s\": %d" -msgstr "" +msgstr "Kann \"%s.%s\" nicht registrieren: %d" msgid "Unable to rename job document file." msgstr "Auftragsdatei kann nicht umbenannt werden." @@ -4959,16 +5168,16 @@ msgstr "Kann Daten nicht zum Drucker senden." msgid "Unable to set options" -msgstr "Optionen konnten nicht festgelegt werden:" +msgstr "Optionen konnten nicht festgelegt werden" msgid "Unable to set server default" -msgstr "Standardeinstellungen für Server konnten nicht festgelegt werden:" +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:" +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." @@ -4978,7 +5187,7 @@ #, c-format msgid "Unable to write uncompressed print data: %s" -msgstr "Unkomprimierte Druckdaten %s können nicht geschrieben werden." +msgstr "Unkomprimierte Druckdaten können nicht geschrieben werden: %s" msgid "Unauthorized" msgstr "Nicht berechtigt" @@ -4995,7 +5204,7 @@ #, c-format msgid "Unknown directive \"%s\" on line %d of \"%s\" ignored." -msgstr "" +msgstr "Unbekannte Anweisung \"%s\" in Zeile %d in \"%s\" wird ignoriert." #, c-format msgid "Unknown encryption option value: \"%s\"." @@ -5010,7 +5219,7 @@ msgstr "Unbekanntes Formatzeichen: \"%c\"." msgid "Unknown hash algorithm." -msgstr "Unbekannter Hashalgorithmus." +msgstr "Unbekannter Hash-Algorithmus." msgid "Unknown media size name." msgstr "Unbekannter Name der Mediengröße." @@ -5039,7 +5248,7 @@ msgstr "Unbekannte Anfragemethode." msgid "Unknown request version." -msgstr "Unbekannte Anfrageversion" +msgstr "Unbekannte Anfrageversion." msgid "Unknown scheme in URI" msgstr "Unbekanntes Schema in URI" @@ -5060,7 +5269,7 @@ msgstr "Nicht unterstützter Wert des 'document-format' \"%s\"." msgid "Unsupported 'job-hold-until' value." -msgstr "" +msgstr "Nicht unterstützter Wert für 'job-hold-until'" msgid "Unsupported 'job-name' value." msgstr "Nicht unterstützter 'job-name' Wert." @@ -5116,34 +5325,39 @@ #, c-format msgid "Usage: %s [options] destination(s)" -msgstr "" +msgstr "Verwendung: %s [Optionen] Ziel(e)" #, c-format msgid "Usage: %s job-id user title copies options [file]" -msgstr "Aufruf: %s Auftrags-ID Benutzer Titel Kopien Optionen [Datei]" +msgstr "Verwendung: %s Auftrags-ID Benutzer Titel Kopien Optionen [Datei]" msgid "" "Usage: cancel [options] [id]\n" " cancel [options] [destination]\n" " cancel [options] [destination-id]" msgstr "" +"Verwendung: cancel [Optionen] [id]\n" +" cancel [Optionen] [Ziel]\n" +" cancel [Optionen] [Ziel-id]" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" -msgstr "Aufruf: cupsctl [Optionen] [Parameter=Wert ... ParameterN=WertN]" +msgstr "Verwendung: cupsctl [Optionen] [Parameter=Wert ... ParameterN=WertN]" msgid "Usage: cupsd [options]" -msgstr "Aufruf: cupsd [Optionen]" +msgstr "Verwendung: cupsd [Optionen]" msgid "Usage: cupsfilter [ options ] [ -- ] filename" -msgstr "Aufruf: cupsfilter [ Optionen ] [ -- ] Dateiname" +msgstr "Verwendung: cupsfilter [ Optionen ] [ -- ] Dateiname" msgid "" "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [options] -" msgstr "" +"Verwendung: cupstestppd [Optionen] Datei1.ppd[.gz] [... DateiN.ppd[.gz]]\n" +" Programm | cupstestppd [Optionen] -" msgid "Usage: ippeveprinter [options] \"name\"" -msgstr "" +msgstr "Verwendung: ippeveprinter [Optionen] \"Name\"" msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" @@ -5151,14 +5365,20 @@ " ippfind --help\n" " ippfind --version" msgstr "" +"Verwendung: ippfind [Optionen] regtype[,subtype][.domain.] ... [Ausdruck]\n" +" ippfind [Optionen] name[.regtype[.domain.]] ... [Ausdruck]\n" +" ippfind --help\n" +" ippfind --version" msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" -msgstr "Aufruf: ipptool [Optionen] URI Dateiname [ ... DateinameN ]" +msgstr "Verwendung: ipptool [Optionen] URI Dateiname [ ... DateinameN ]" msgid "" "Usage: lp [options] [--] [file(s)]\n" " lp [options] -i id" msgstr "" +"Verwendung: lp [Optionen] [--] [Datei(en)]\n" +" lp [Optionen] -i id" msgid "" "Usage: lpadmin [options] -d destination\n" @@ -5167,16 +5387,25 @@ " lpadmin [options] -p destination -r class\n" " lpadmin [options] -x destination" msgstr "" +"Verwendung: lpadmin [Optionen] -d Ziel\n" +" lpadmin [Optionen] -p Ziel\n" +" lpadmin [Optionen] -p Ziel -c Klasse\n" +" lpadmin [Optionen] -p Ziel -r Klasse\n" +" lpadmin [Optionen] -x Ziel" msgid "" "Usage: lpinfo [options] -m\n" " lpinfo [options] -v" msgstr "" +"Verwendung: lpinfo [Optionen] -m\n" +" lpinfo [Optionen] -v" msgid "" "Usage: lpmove [options] job destination\n" " lpmove [options] source-destination destination" msgstr "" +"Verwendugn: lpmove [Optionen] Auftrag Ziel\n" +" lpmove [Optionen] Quelle Ziel" msgid "" "Usage: lpoptions [options] -d destination\n" @@ -5184,20 +5413,26 @@ " lpoptions [options] [-p destination] -o option[=value]\n" " lpoptions [options] -x destination" msgstr "" +"Verwendung: lpoptions [Optionen] -d Ziel\n" +" lpoptions [Optionen] [-p Ziel] [-l]\n" +" lpoptions [Optionen] [-p Ziel] -o option[=Wert]\n" +" lpoptions [Optionen] -x Ziel" msgid "Usage: lpq [options] [+interval]" -msgstr "" +msgstr "Verwendung: lpq [Optionen] [+Intervall]" msgid "Usage: lpr [options] [file(s)]" -msgstr "" +msgstr "Verwendung: lpr [Optionen] [Datei(en)]" msgid "" "Usage: lprm [options] [id]\n" " lprm [options] -" msgstr "" +"Verwendung: lprm [Optionen] [id]\n" +" lprm [Optionen] -" msgid "Usage: lpstat [options]" -msgstr "" +msgstr "Verwendung: lpstat [Optionen]" msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" msgstr "Verwendung: ppdc [Optionen] Dateiname.drv [ ... DateinameN.drv ]" @@ -5214,14 +5449,15 @@ msgid "" "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" msgstr "" -"Aufruf: ppdpo [Optionen] -o Dateiname.po Dateiname.drv [ ... DateinameN.drv ]" +"Verwendung: ppdpo [Optionen] -o Dateiname.po Dateiname.drv [ ... DateinameN." +"drv ]" msgid "Usage: snmp [host-or-ip-address]" msgstr "Verwendung: snmp [Host-oder-IP-Adresse]" #, c-format msgid "Using spool directory \"%s\"." -msgstr "" +msgstr "Verwende Spoolverzeichnis \"%s\"." msgid "Value uses indefinite length" msgstr "Wert hat unbestimmte Länge" @@ -5243,6 +5479,8 @@ msgid "Warning: This program will be removed in a future version of CUPS." msgstr "" +"Warnung: Dieses Programm wird in einer zukünftigen Version von CUPS entfernt " +"werden." msgid "Web Interface is Disabled" msgstr "Web-Schnittstelle ist deaktiviert" @@ -5251,14 +5489,14 @@ msgstr "Ja" msgid "You cannot access this page." -msgstr "" +msgstr "Sie können auf diese Seite nicht zugreifen" #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "Auf diese Seite greifen Sie zu über die URL https://%s:%d%s." msgid "Your account does not have the necessary privileges." -msgstr "" +msgstr "Dein Konto hat nicht die notwendigen Privilegien" msgid "ZPL Label Printer" msgstr "ZPL-Etikettendrucker" @@ -5271,19 +5509,19 @@ #. TRANSLATORS: Accuracy Units msgid "accuracy-units" -msgstr "" +msgstr "Genauigkeit" #. TRANSLATORS: Millimeters msgid "accuracy-units.mm" -msgstr "" +msgstr "Millimeter" #. TRANSLATORS: Nanometers msgid "accuracy-units.nm" -msgstr "" +msgstr "Nanometer" #. TRANSLATORS: Micrometers msgid "accuracy-units.um" -msgstr "" +msgstr "Mikrometer" #. TRANSLATORS: Bale Output msgid "baling" @@ -5311,225 +5549,225 @@ #. TRANSLATORS: Job msgid "baling-when.after-job" -msgstr "" +msgstr "nach dem Auftrag" #. TRANSLATORS: Sets msgid "baling-when.after-sets" -msgstr "" +msgstr "nach den Sets" #. TRANSLATORS: Bind Output msgid "binding" -msgstr "" +msgstr "Bindung" #. TRANSLATORS: Bind Edge msgid "binding-reference-edge" -msgstr "" +msgstr "Bindungskante" #. TRANSLATORS: Bottom msgid "binding-reference-edge.bottom" -msgstr "" +msgstr "unterer Rand" #. TRANSLATORS: Left msgid "binding-reference-edge.left" -msgstr "" +msgstr "linker Rand" #. TRANSLATORS: Right msgid "binding-reference-edge.right" -msgstr "" +msgstr "rechter Rand" #. TRANSLATORS: Top msgid "binding-reference-edge.top" -msgstr "" +msgstr "oberer Rand" #. TRANSLATORS: Binder Type msgid "binding-type" -msgstr "" +msgstr "Bindungstyp" #. TRANSLATORS: Adhesive msgid "binding-type.adhesive" -msgstr "" +msgstr "Kleber" #. TRANSLATORS: Comb msgid "binding-type.comb" -msgstr "" +msgstr "Kamm" #. TRANSLATORS: Flat msgid "binding-type.flat" -msgstr "" +msgstr "Flach" #. TRANSLATORS: Padding msgid "binding-type.padding" -msgstr "" +msgstr "Auspolstern" #. TRANSLATORS: Perfect msgid "binding-type.perfect" -msgstr "" +msgstr "Perfekt" #. TRANSLATORS: Spiral msgid "binding-type.spiral" -msgstr "" +msgstr "Spirale" #. TRANSLATORS: Tape msgid "binding-type.tape" -msgstr "" +msgstr "Band" #. TRANSLATORS: Velo msgid "binding-type.velo" -msgstr "" +msgstr "Fahrrad" msgid "canceled" msgstr "abgebrochen" #. TRANSLATORS: Chamber Humidity msgid "chamber-humidity" -msgstr "" +msgstr "Kammerfeuchtigkeit" #. TRANSLATORS: Chamber Temperature msgid "chamber-temperature" -msgstr "" +msgstr "Kammertemperatur" #. TRANSLATORS: Print Job Cost msgid "charge-info-message" -msgstr "" +msgstr "Druckkosten" #. TRANSLATORS: Coat Sheets msgid "coating" -msgstr "" +msgstr "Deckblätter" #. TRANSLATORS: Add Coating To msgid "coating-sides" -msgstr "" +msgstr "Deckblatt" #. TRANSLATORS: Back msgid "coating-sides.back" -msgstr "" +msgstr "Rückseitig" #. TRANSLATORS: Front and Back msgid "coating-sides.both" -msgstr "" +msgstr "Vorder- und Rückseitig" #. TRANSLATORS: Front msgid "coating-sides.front" -msgstr "" +msgstr "Vorderseitig" #. TRANSLATORS: Type of Coating msgid "coating-type" -msgstr "" +msgstr "Deckblattyp" #. TRANSLATORS: Archival msgid "coating-type.archival" -msgstr "" +msgstr "Archivfähig" #. TRANSLATORS: Archival Glossy msgid "coating-type.archival-glossy" -msgstr "" +msgstr "Glänzend archivfähig" #. TRANSLATORS: Archival Matte msgid "coating-type.archival-matte" -msgstr "" +msgstr "Matt archivfähig" #. TRANSLATORS: Archival Semi Gloss msgid "coating-type.archival-semi-gloss" -msgstr "" +msgstr "Seidenglanz archivfähig" #. TRANSLATORS: Glossy msgid "coating-type.glossy" -msgstr "" +msgstr "Glänzend" #. TRANSLATORS: High Gloss msgid "coating-type.high-gloss" -msgstr "" +msgstr "Hochglänzend" #. TRANSLATORS: Matte msgid "coating-type.matte" -msgstr "" +msgstr "Matt" #. TRANSLATORS: Semi-gloss msgid "coating-type.semi-gloss" -msgstr "" +msgstr "Seidenglänzend" #. TRANSLATORS: Silicone msgid "coating-type.silicone" -msgstr "" +msgstr "Silikon" #. TRANSLATORS: Translucent msgid "coating-type.translucent" -msgstr "" +msgstr "Durchscheinend" msgid "completed" msgstr "abgeschlossen" #. TRANSLATORS: Print Confirmation Sheet msgid "confirmation-sheet-print" -msgstr "" +msgstr "Druckbestätigung" #. TRANSLATORS: Copies msgid "copies" -msgstr "" +msgstr "Kopien" #. TRANSLATORS: Back Cover msgid "cover-back" -msgstr "" +msgstr "Deckblatt hinten" #. TRANSLATORS: Front Cover msgid "cover-front" -msgstr "" +msgstr "Deckblatt vorne" #. TRANSLATORS: Cover Sheet Info msgid "cover-sheet-info" -msgstr "" +msgstr "Deckblatt Information" #. TRANSLATORS: Date Time msgid "cover-sheet-info-supported.date-time" -msgstr "" +msgstr "Datum Zeit" #. TRANSLATORS: From Name msgid "cover-sheet-info-supported.from-name" -msgstr "" +msgstr "Name Auftraggeber" #. TRANSLATORS: Logo msgid "cover-sheet-info-supported.logo" -msgstr "" +msgstr "Logo" #. TRANSLATORS: Message msgid "cover-sheet-info-supported.message" -msgstr "" +msgstr "Nachricht" #. TRANSLATORS: Organization msgid "cover-sheet-info-supported.organization" -msgstr "" +msgstr "Organisation" #. TRANSLATORS: Subject msgid "cover-sheet-info-supported.subject" -msgstr "" +msgstr "Thema" #. TRANSLATORS: To Name msgid "cover-sheet-info-supported.to-name" -msgstr "" +msgstr "Name Adressat" #. TRANSLATORS: Printed Cover msgid "cover-type" -msgstr "" +msgstr "gedrucktes Deckblatt" #. TRANSLATORS: No Cover msgid "cover-type.no-cover" -msgstr "" +msgstr "Keines" #. TRANSLATORS: Back Only msgid "cover-type.print-back" -msgstr "" +msgstr "nur hinten" #. TRANSLATORS: Front and Back msgid "cover-type.print-both" -msgstr "" +msgstr "vorne und hinten" #. TRANSLATORS: Front Only msgid "cover-type.print-front" -msgstr "" +msgstr "nur vorne" #. TRANSLATORS: None msgid "cover-type.print-none" -msgstr "" +msgstr "Kein" #. TRANSLATORS: Cover Output msgid "covering" @@ -5537,11 +5775,11 @@ #. TRANSLATORS: Add Cover msgid "covering-name" -msgstr "" +msgstr "Abdeckung" #. TRANSLATORS: Plain msgid "covering-name.plain" -msgstr "" +msgstr "Blanko" #. TRANSLATORS: Pre-cut msgid "covering-name.pre-cut" @@ -5549,7 +5787,7 @@ #. TRANSLATORS: Pre-printed msgid "covering-name.pre-printed" -msgstr "" +msgstr "Vordruck" msgid "cups-deviced failed to execute." msgstr "„cups-deviced“ konnte nicht ausgeführt werden." @@ -5559,11 +5797,11 @@ #, c-format msgid "cupsctl: Cannot set %s directly." -msgstr "" +msgstr "cupsctl: kann %s nicht direkt bestimmen" #, c-format msgid "cupsctl: Unable to connect to server: %s" -msgstr "cupsctl: Kann nicht mit dem Server %s verbinden" +msgstr "cupsctl: Kann nicht mit dem Server verbinden: %s" #, c-format msgid "cupsctl: Unknown option \"%s\"" @@ -5623,7 +5861,7 @@ #. TRANSLATORS: Detailed Status Message msgid "detailed-status-message" -msgstr "" +msgstr "Detaillierte Statusnachricht" #, c-format msgid "device for %s/%s: %s" @@ -5635,103 +5873,103 @@ #. TRANSLATORS: Copies msgid "document-copies" -msgstr "" +msgstr "Kopien" #. TRANSLATORS: Document Privacy Attributes msgid "document-privacy-attributes" -msgstr "" +msgstr "Dokument Datenschutzattribute" #. TRANSLATORS: All msgid "document-privacy-attributes.all" -msgstr "" +msgstr "Alle" #. TRANSLATORS: Default msgid "document-privacy-attributes.default" -msgstr "" +msgstr "Voreingestellt" #. TRANSLATORS: Document Description msgid "document-privacy-attributes.document-description" -msgstr "" +msgstr "Dokumentenbeschreibung" #. TRANSLATORS: Document Template msgid "document-privacy-attributes.document-template" -msgstr "" +msgstr "Dokumentvorlage" #. TRANSLATORS: None msgid "document-privacy-attributes.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Document Privacy Scope msgid "document-privacy-scope" -msgstr "" +msgstr "Dokument Datenschutzgeltungsbereich" #. TRANSLATORS: All msgid "document-privacy-scope.all" -msgstr "" +msgstr "Alles" #. TRANSLATORS: Default msgid "document-privacy-scope.default" -msgstr "" +msgstr "Voreingestellt" #. TRANSLATORS: None msgid "document-privacy-scope.none" -msgstr "" +msgstr "Nichts" #. TRANSLATORS: Owner msgid "document-privacy-scope.owner" -msgstr "" +msgstr "Eigentümer" #. TRANSLATORS: Document State msgid "document-state" -msgstr "" +msgstr "Dokumentenstatus" #. TRANSLATORS: Detailed Document State msgid "document-state-reasons" -msgstr "" +msgstr "Detaillierter Dokumentenstatus" #. TRANSLATORS: Aborted By System msgid "document-state-reasons.aborted-by-system" -msgstr "" +msgstr "Abbruch durch das System" #. TRANSLATORS: Canceled At Device msgid "document-state-reasons.canceled-at-device" -msgstr "" +msgstr "Am Gerät abgebrochen" #. TRANSLATORS: Canceled By Operator msgid "document-state-reasons.canceled-by-operator" -msgstr "" +msgstr "Durch Bediener abgebrochen" #. TRANSLATORS: Canceled By User msgid "document-state-reasons.canceled-by-user" -msgstr "" +msgstr "Durch Benutzer abgebrochen" #. TRANSLATORS: Completed Successfully msgid "document-state-reasons.completed-successfully" -msgstr "" +msgstr "erfolgreich abgeschlossen" #. TRANSLATORS: Completed With Errors msgid "document-state-reasons.completed-with-errors" -msgstr "" +msgstr "mit Fehler abgeschlossen" #. TRANSLATORS: Completed With Warnings msgid "document-state-reasons.completed-with-warnings" -msgstr "" +msgstr "mit Warnung abgeschlossen" #. TRANSLATORS: Compression Error msgid "document-state-reasons.compression-error" -msgstr "" +msgstr "Kompressionsfehler" #. TRANSLATORS: Data Insufficient msgid "document-state-reasons.data-insufficient" -msgstr "" +msgstr "Daten ungenügend" #. TRANSLATORS: Digital Signature Did Not Verify msgid "document-state-reasons.digital-signature-did-not-verify" -msgstr "" +msgstr "Digitale Signatur ungültig" #. TRANSLATORS: Digital Signature Type Not Supported msgid "document-state-reasons.digital-signature-type-not-supported" -msgstr "" +msgstr "Digitaler Signaturtyp nicht unterstützt" #. TRANSLATORS: Digital Signature Wait msgid "document-state-reasons.digital-signature-wait" @@ -5739,7 +5977,7 @@ #. TRANSLATORS: Document Access Error msgid "document-state-reasons.document-access-error" -msgstr "" +msgstr "Fehler des Dokumentenzugriffs" #. TRANSLATORS: Document Fetchable msgid "document-state-reasons.document-fetchable" @@ -5747,55 +5985,55 @@ #. TRANSLATORS: Document Format Error msgid "document-state-reasons.document-format-error" -msgstr "" +msgstr "Fehler des Dokumentformats" #. TRANSLATORS: Document Password Error msgid "document-state-reasons.document-password-error" -msgstr "" +msgstr "Fehler des Dokumentpassworts" #. TRANSLATORS: Document Permission Error msgid "document-state-reasons.document-permission-error" -msgstr "" +msgstr "Fehler der Dokumentenberechtigung" #. TRANSLATORS: Document Security Error msgid "document-state-reasons.document-security-error" -msgstr "" +msgstr "Fehler der Dokumentensicherheit" #. TRANSLATORS: Document Unprintable Error msgid "document-state-reasons.document-unprintable-error" -msgstr "" +msgstr "Fehler: Dokument undruckbar" #. TRANSLATORS: Errors Detected msgid "document-state-reasons.errors-detected" -msgstr "" +msgstr "Fehler festgestellt" #. TRANSLATORS: Incoming msgid "document-state-reasons.incoming" -msgstr "" +msgstr "Eingehend" #. TRANSLATORS: Interpreting msgid "document-state-reasons.interpreting" -msgstr "" +msgstr "interpretiere Seitenbeschreibung" #. TRANSLATORS: None msgid "document-state-reasons.none" -msgstr "" +msgstr "Nichts" #. TRANSLATORS: Outgoing msgid "document-state-reasons.outgoing" -msgstr "" +msgstr "Ausgehend" #. TRANSLATORS: Printing msgid "document-state-reasons.printing" -msgstr "" +msgstr "im Druck" #. TRANSLATORS: Processing To Stop Point msgid "document-state-reasons.processing-to-stop-point" -msgstr "" +msgstr "Verarbeitung bis zum Haltepunkt" #. TRANSLATORS: Queued msgid "document-state-reasons.queued" -msgstr "" +msgstr "in der Warteschlange" #. TRANSLATORS: Queued For Marker msgid "document-state-reasons.queued-for-marker" @@ -5803,47 +6041,47 @@ #. TRANSLATORS: Queued In Device msgid "document-state-reasons.queued-in-device" -msgstr "" +msgstr "im Gerät in der Warteschlange" #. TRANSLATORS: Resources Are Not Ready msgid "document-state-reasons.resources-are-not-ready" -msgstr "" +msgstr "Resourcen nicht bereit" #. TRANSLATORS: Resources Are Not Supported msgid "document-state-reasons.resources-are-not-supported" -msgstr "" +msgstr "Resourcen nicht unterstützt" #. TRANSLATORS: Submission Interrupted msgid "document-state-reasons.submission-interrupted" -msgstr "" +msgstr "Übermittlung unterbrochen" #. TRANSLATORS: Transforming msgid "document-state-reasons.transforming" -msgstr "" +msgstr "in Transformation" #. TRANSLATORS: Unsupported Compression msgid "document-state-reasons.unsupported-compression" -msgstr "" +msgstr "Nicht unterstützte Kompression" #. TRANSLATORS: Unsupported Document Format msgid "document-state-reasons.unsupported-document-format" -msgstr "" +msgstr "Nicht unterstütztes Dokumentenformat" #. TRANSLATORS: Warnings Detected msgid "document-state-reasons.warnings-detected" -msgstr "" +msgstr "Warnungen festgestellt" #. TRANSLATORS: Pending msgid "document-state.3" -msgstr "" +msgstr "Anstehend" #. TRANSLATORS: Processing msgid "document-state.5" -msgstr "" +msgstr "in Verarbeitung" #. TRANSLATORS: Stopped msgid "document-state.6" -msgstr "" +msgstr "Angehalten" #. TRANSLATORS: Canceled msgid "document-state.7" @@ -5851,11 +6089,11 @@ #. TRANSLATORS: Aborted msgid "document-state.8" -msgstr "" +msgstr "Abgebrochen" #. TRANSLATORS: Completed msgid "document-state.9" -msgstr "" +msgstr "Fertiggestellt" msgid "error-index uses indefinite length" msgstr "Fehlerindex hat unbestimmte Länge" @@ -5867,30 +6105,34 @@ "expression --and expression\n" " Logical AND" msgstr "" +"Ausdruck --and Ausdruck\n" +" Logisches UND" msgid "" "expression --or expression\n" " Logical OR" msgstr "" +"Ausdruck --or Ausdruck\n" +" Logisches ODER" msgid "expression expression Logical AND" -msgstr "" +msgstr "Asudruck Ausdruck Logisches UND" #. TRANSLATORS: Feed Orientation msgid "feed-orientation" -msgstr "" +msgstr "Einzugsrichtung" #. TRANSLATORS: Long Edge First msgid "feed-orientation.long-edge-first" -msgstr "" +msgstr "Lange Kante voran" #. TRANSLATORS: Short Edge First msgid "feed-orientation.short-edge-first" -msgstr "" +msgstr "Kurze Kante voran" #. TRANSLATORS: Fetch Status Code msgid "fetch-status-code" -msgstr "" +msgstr "Abrufstatus" #. TRANSLATORS: Finishing Template msgid "finishing-template" @@ -5922,7 +6164,7 @@ #. TRANSLATORS: Booklet Maker msgid "finishing-template.booklet-maker" -msgstr "" +msgstr "Broschüren" #. TRANSLATORS: Coat msgid "finishing-template.coat" @@ -5934,35 +6176,35 @@ #. TRANSLATORS: Edge Stitch msgid "finishing-template.edge-stitch" -msgstr "" +msgstr "Randnaht" #. TRANSLATORS: Edge Stitch Bottom msgid "finishing-template.edge-stitch-bottom" -msgstr "" +msgstr "Randnaht unten" #. TRANSLATORS: Edge Stitch Left msgid "finishing-template.edge-stitch-left" -msgstr "" +msgstr "Randnaht links" #. TRANSLATORS: Edge Stitch Right msgid "finishing-template.edge-stitch-right" -msgstr "" +msgstr "Randnaht rechts" #. TRANSLATORS: Edge Stitch Top msgid "finishing-template.edge-stitch-top" -msgstr "" +msgstr "Randnaht oben" #. TRANSLATORS: Fold msgid "finishing-template.fold" -msgstr "" +msgstr "Falz" #. TRANSLATORS: Accordion Fold msgid "finishing-template.fold-accordion" -msgstr "" +msgstr "Akkordeonfalz" #. TRANSLATORS: Double Gate Fold msgid "finishing-template.fold-double-gate" -msgstr "" +msgstr "Altarfalz" #. TRANSLATORS: Engineering Z Fold msgid "finishing-template.fold-engineering-z" @@ -6366,175 +6608,175 @@ #. TRANSLATORS: Laminate msgid "finishing-template.laminate" -msgstr "" +msgstr "Laminat" #. TRANSLATORS: Punch msgid "finishing-template.punch" -msgstr "" +msgstr "Lochung" #. TRANSLATORS: Punch Bottom Left msgid "finishing-template.punch-bottom-left" -msgstr "" +msgstr "Lochung unten links" #. TRANSLATORS: Punch Bottom Right msgid "finishing-template.punch-bottom-right" -msgstr "" +msgstr "Lochung unten rechts" #. TRANSLATORS: 2-hole Punch Bottom msgid "finishing-template.punch-dual-bottom" -msgstr "" +msgstr "Doppellochung unten" #. TRANSLATORS: 2-hole Punch Left msgid "finishing-template.punch-dual-left" -msgstr "" +msgstr "Doppellochung links" #. TRANSLATORS: 2-hole Punch Right msgid "finishing-template.punch-dual-right" -msgstr "" +msgstr "Doppellochung rechts" #. TRANSLATORS: 2-hole Punch Top msgid "finishing-template.punch-dual-top" -msgstr "" +msgstr "Doppellochung oben" #. TRANSLATORS: Multi-hole Punch Bottom msgid "finishing-template.punch-multiple-bottom" -msgstr "" +msgstr "Mehrfachlochung unten" #. TRANSLATORS: Multi-hole Punch Left msgid "finishing-template.punch-multiple-left" -msgstr "" +msgstr "Mehrfachlochung links" #. TRANSLATORS: Multi-hole Punch Right msgid "finishing-template.punch-multiple-right" -msgstr "" +msgstr "Mehrfachlochung rechts" #. TRANSLATORS: Multi-hole Punch Top msgid "finishing-template.punch-multiple-top" -msgstr "" +msgstr "Mehrfachlochung oben" #. TRANSLATORS: 4-hole Punch Bottom msgid "finishing-template.punch-quad-bottom" -msgstr "" +msgstr "4-fach-Lochung unten" #. TRANSLATORS: 4-hole Punch Left msgid "finishing-template.punch-quad-left" -msgstr "" +msgstr "4-fach-Lochung links" #. TRANSLATORS: 4-hole Punch Right msgid "finishing-template.punch-quad-right" -msgstr "" +msgstr "4-fach-Lochung rechts" #. TRANSLATORS: 4-hole Punch Top msgid "finishing-template.punch-quad-top" -msgstr "" +msgstr "4-fach-Lochung oben" #. TRANSLATORS: Punch Top Left msgid "finishing-template.punch-top-left" -msgstr "" +msgstr "Lochung oben links" #. TRANSLATORS: Punch Top Right msgid "finishing-template.punch-top-right" -msgstr "" +msgstr "Lochung oben rechts" #. TRANSLATORS: 3-hole Punch Bottom msgid "finishing-template.punch-triple-bottom" -msgstr "" +msgstr "3-Fach-Lochung unten" #. TRANSLATORS: 3-hole Punch Left msgid "finishing-template.punch-triple-left" -msgstr "" +msgstr "3-Fach-Lochung links" #. TRANSLATORS: 3-hole Punch Right msgid "finishing-template.punch-triple-right" -msgstr "" +msgstr "3-Fach-Lochung rechts" #. TRANSLATORS: 3-hole Punch Top msgid "finishing-template.punch-triple-top" -msgstr "" +msgstr "3-Fach-Lochung oben" #. TRANSLATORS: Saddle Stitch msgid "finishing-template.saddle-stitch" -msgstr "" +msgstr "Spezialheftung" #. TRANSLATORS: Staple msgid "finishing-template.staple" -msgstr "" +msgstr "Heftung" #. TRANSLATORS: Staple Bottom Left msgid "finishing-template.staple-bottom-left" -msgstr "" +msgstr "Heftung unten links" #. TRANSLATORS: Staple Bottom Right msgid "finishing-template.staple-bottom-right" -msgstr "" +msgstr "Heftung unten rechts" #. TRANSLATORS: 2 Staples on Bottom msgid "finishing-template.staple-dual-bottom" -msgstr "" +msgstr "Doppelheftung unten" #. TRANSLATORS: 2 Staples on Left msgid "finishing-template.staple-dual-left" -msgstr "" +msgstr "Doppelheftung links" #. TRANSLATORS: 2 Staples on Right msgid "finishing-template.staple-dual-right" -msgstr "" +msgstr "Doppelheftung rechts" #. TRANSLATORS: 2 Staples on Top msgid "finishing-template.staple-dual-top" -msgstr "" +msgstr "Doppelheftung oben" #. TRANSLATORS: Staple Top Left msgid "finishing-template.staple-top-left" -msgstr "" +msgstr "Heftung oben links" #. TRANSLATORS: Staple Top Right msgid "finishing-template.staple-top-right" -msgstr "" +msgstr "Heftung oben rechts" #. TRANSLATORS: 3 Staples on Bottom msgid "finishing-template.staple-triple-bottom" -msgstr "" +msgstr "Dreifachheftung unten" #. TRANSLATORS: 3 Staples on Left msgid "finishing-template.staple-triple-left" -msgstr "" +msgstr "Dreifachheftung links" #. TRANSLATORS: 3 Staples on Right msgid "finishing-template.staple-triple-right" -msgstr "" +msgstr "Dreifachheftung rechts" #. TRANSLATORS: 3 Staples on Top msgid "finishing-template.staple-triple-top" -msgstr "" +msgstr "Dreifachheftung unten" #. TRANSLATORS: Trim msgid "finishing-template.trim" -msgstr "" +msgstr "Beschnitt" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-copies" -msgstr "" +msgstr "nach Kopien" #. TRANSLATORS: Trim After Every Document msgid "finishing-template.trim-after-documents" -msgstr "" +msgstr "nach Dokument" #. TRANSLATORS: Trim After Job msgid "finishing-template.trim-after-job" -msgstr "" +msgstr "nach Auftrag" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-pages" -msgstr "" +msgstr "nach Seiten" #. TRANSLATORS: Trim After Every Set msgid "finishing-template.trim-after-sets" -msgstr "" +msgstr "nach Sets" #. TRANSLATORS: Trim After Every Page msgid "finishing-template.trim-after-sheets" -msgstr "" +msgstr "nach Blättern" #. TRANSLATORS: Finishings msgid "finishings" @@ -6586,15 +6828,15 @@ #. TRANSLATORS: Staple Bottom Left msgid "finishings.21" -msgstr "" +msgstr "Klammer unten links" #. TRANSLATORS: Staple Top Right msgid "finishings.22" -msgstr "" +msgstr "Klammer oben rechts" #. TRANSLATORS: Staple Bottom Right msgid "finishings.23" -msgstr "" +msgstr "Klammer unten rechts" #. TRANSLATORS: Edge Stitch Left msgid "finishings.24" @@ -6626,15 +6868,15 @@ #. TRANSLATORS: 2 Staples on Right msgid "finishings.30" -msgstr "" +msgstr "2 Klammern rechts" #. TRANSLATORS: 2 Staples on Bottom msgid "finishings.31" -msgstr "" +msgstr "2 Klammern unten" #. TRANSLATORS: 3 Staples on Left msgid "finishings.32" -msgstr "" +msgstr "3 Klammern links" #. TRANSLATORS: 3 Staples on Top msgid "finishings.33" @@ -6826,43 +7068,43 @@ #. TRANSLATORS: Fold msgid "folding" -msgstr "" +msgstr "Falzung" #. TRANSLATORS: Fold Direction msgid "folding-direction" -msgstr "" +msgstr "Falzrichtung" #. TRANSLATORS: Inward msgid "folding-direction.inward" -msgstr "" +msgstr "einwärts" #. TRANSLATORS: Outward msgid "folding-direction.outward" -msgstr "" +msgstr "auswärts" #. TRANSLATORS: Fold Position msgid "folding-offset" -msgstr "" +msgstr "Falzposition" #. TRANSLATORS: Fold Edge msgid "folding-reference-edge" -msgstr "" +msgstr "Falzreferenzkante" #. TRANSLATORS: Bottom msgid "folding-reference-edge.bottom" -msgstr "" +msgstr "unten" #. TRANSLATORS: Left msgid "folding-reference-edge.left" -msgstr "" +msgstr "links" #. TRANSLATORS: Right msgid "folding-reference-edge.right" -msgstr "" +msgstr "rechts" #. TRANSLATORS: Top msgid "folding-reference-edge.top" -msgstr "" +msgstr "oben" #. TRANSLATORS: Font Name msgid "font-name-requested" @@ -6878,13 +7120,13 @@ #. TRANSLATORS: From Name msgid "from-name" -msgstr "" +msgstr "Name Absender" msgid "held" msgstr "gehalten" msgid "help\t\tGet help on commands." -msgstr "" +msgstr "help\t\tHilfe zu Befehlen." msgid "idle" msgstr "inaktiv" @@ -6899,19 +7141,19 @@ #. TRANSLATORS: Signature msgid "imposition-template.signature" -msgstr "" +msgstr "Signatur" #. TRANSLATORS: Insert Page Number msgid "insert-after-page-number" -msgstr "" +msgstr "Seitennnummer einfügen" #. TRANSLATORS: Insert Count msgid "insert-count" -msgstr "" +msgstr "Zählung einfügen" #. TRANSLATORS: Insert Sheet msgid "insert-sheet" -msgstr "" +msgstr "Blatt einfügen" #, c-format msgid "ippeveprinter: Unable to open \"%s\": %s on line %d." @@ -6941,39 +7183,39 @@ msgstr "ippfind: Erwarte Semikolon nach %s." msgid "ippfind: Missing close brace in substitution." -msgstr "" +msgstr "ippfind: Fehlende schließende Klammer in Ersetzung." msgid "ippfind: Missing close parenthesis." msgstr "ippfind: Fehlende Schlussklammer." msgid "ippfind: Missing expression before \"--and\"." -msgstr "ippfind: Fehlender Ausdruck vor \"--and\"." +msgstr "ippfind: Fehlender Ausdruck vor \"--and\"." msgid "ippfind: Missing expression before \"--or\"." -msgstr "ippfind: Fehlender Ausdruck vor \"--or\"." +msgstr "ippfind: Fehlender Ausdruck vor \"--or\"." #, c-format msgid "ippfind: Missing key name after %s." -msgstr "" +msgstr "ippfind: Fehlender Schlüsselname nach %s." #, c-format msgid "ippfind: Missing name after %s." -msgstr "" +msgstr "ippfind: Fehlender Name nach %s." msgid "ippfind: Missing open parenthesis." -msgstr "" +msgstr "ippfind: Fehlende offene Klammer" #, c-format msgid "ippfind: Missing program after %s." -msgstr "" +msgstr "ippfind: Fehlendes Programm nach %s." #, c-format msgid "ippfind: Missing regular expression after %s." -msgstr "" +msgstr "ippfind: Fehlender regulärer Ausdruck nach %s." #, c-format msgid "ippfind: Missing semi-colon after %s." -msgstr "" +msgstr "ippfind: Fehlendes Semikolon nach %s." msgid "ippfind: Out of memory." msgstr "ippfind: zu wenig Speicher." @@ -6987,15 +7229,15 @@ #, c-format msgid "ippfind: Unable to execute \"%s\": %s" -msgstr "" +msgstr "ippfind: Ausführung nicht möglich \"%s\": %s" #, c-format msgid "ippfind: Unable to use Bonjour: %s" -msgstr "" +msgstr "ippfind: Bonjour kann nicht verwendet werden: %s" #, c-format msgid "ippfind: Unknown variable \"{%s}\"." -msgstr "" +msgstr "ippfind: Unbekannte Variable \"{%s}\"." msgid "" "ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", " @@ -7007,10 +7249,10 @@ #, c-format msgid "ipptool: Bad URI \"%s\"." -msgstr "" +msgstr "ipptool: Falsche URI \"%s\"." msgid "ipptool: Invalid seconds for \"-i\"." -msgstr "" +msgstr "ipptool: Ungültige Sekundenzahl für \"-i\"." msgid "ipptool: May only specify a single URI." msgstr "" @@ -7028,38 +7270,38 @@ msgstr "" msgid "ipptool: Missing seconds for \"-i\"." -msgstr "" +msgstr "ipptool: Fehlende Sekundenzahl für \"-i\"." msgid "ipptool: URI required before test file." -msgstr "" +msgstr "ipptool: URI muss vor der Testdatei angegeben werden." #. TRANSLATORS: Job Account ID msgid "job-account-id" -msgstr "" +msgstr "Auftragskonto-ID" #. TRANSLATORS: Job Account Type msgid "job-account-type" -msgstr "" +msgstr "Auftragskontotyp" #. TRANSLATORS: General msgid "job-account-type.general" -msgstr "" +msgstr "Allgemein" #. TRANSLATORS: Group msgid "job-account-type.group" -msgstr "" +msgstr "Gruppe" #. TRANSLATORS: None msgid "job-account-type.none" -msgstr "" +msgstr "Kein" #. TRANSLATORS: Job Accounting Output Bin msgid "job-accounting-output-bin" -msgstr "" +msgstr "Ausgabefach für Auftragsabrechnung" #. TRANSLATORS: Job Accounting Sheets msgid "job-accounting-sheets" -msgstr "" +msgstr "Blätter für Auftragsabrechnung" #. TRANSLATORS: Type of Job Accounting Sheets msgid "job-accounting-sheets-type" @@ -7083,226 +7325,226 @@ #. TRANSLATORS: Copies msgid "job-copies" -msgstr "" +msgstr "Kopien" #. TRANSLATORS: Back Cover msgid "job-cover-back" -msgstr "" +msgstr "Rückseitenumschlag" #. TRANSLATORS: Front Cover msgid "job-cover-front" -msgstr "" +msgstr "Vorderumschlag" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until" -msgstr "" +msgstr "Ausgabeverzögerung bis" #. TRANSLATORS: Delay Output Until msgid "job-delay-output-until-time" -msgstr "" +msgstr "Ausgabeverzögerung bis" #. TRANSLATORS: Daytime msgid "job-delay-output-until.day-time" -msgstr "" +msgstr "Tagsüber" #. TRANSLATORS: Evening msgid "job-delay-output-until.evening" -msgstr "" +msgstr "Abends" #. TRANSLATORS: Released msgid "job-delay-output-until.indefinite" -msgstr "" +msgstr "Freigabe" #. TRANSLATORS: Night msgid "job-delay-output-until.night" -msgstr "" +msgstr "Nachts" #. TRANSLATORS: No Delay msgid "job-delay-output-until.no-delay-output" -msgstr "" +msgstr "Keine Verzögerung" #. TRANSLATORS: Second Shift msgid "job-delay-output-until.second-shift" -msgstr "" +msgstr "Zweite Schicht" #. TRANSLATORS: Third Shift msgid "job-delay-output-until.third-shift" -msgstr "" +msgstr "Dritte Schicht" #. TRANSLATORS: Weekend msgid "job-delay-output-until.weekend" -msgstr "" +msgstr "Wochenende" #. TRANSLATORS: On Error msgid "job-error-action" -msgstr "" +msgstr "Bei Fehler" #. TRANSLATORS: Abort Job msgid "job-error-action.abort-job" -msgstr "" +msgstr "Auftrag abbrechen" #. TRANSLATORS: Cancel Job msgid "job-error-action.cancel-job" -msgstr "" +msgstr "Auftrag abbrechen" #. TRANSLATORS: Continue Job msgid "job-error-action.continue-job" -msgstr "" +msgstr "Auftrag fortführen" #. TRANSLATORS: Suspend Job msgid "job-error-action.suspend-job" -msgstr "" +msgstr "Auftrag aussetzen" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet" -msgstr "" +msgstr "Fehlerblatt drucken" #. TRANSLATORS: Type of Error Sheet msgid "job-error-sheet-type" -msgstr "" +msgstr "Typ des Fehlerblatts" #. TRANSLATORS: None msgid "job-error-sheet-type.none" -msgstr "" +msgstr "Keines" #. TRANSLATORS: Standard msgid "job-error-sheet-type.standard" -msgstr "" +msgstr "Standard" #. TRANSLATORS: Print Error Sheet msgid "job-error-sheet-when" -msgstr "" +msgstr "Drucke Fehlerblatt" #. TRANSLATORS: Always msgid "job-error-sheet-when.always" -msgstr "" +msgstr "immer" #. TRANSLATORS: On Error msgid "job-error-sheet-when.on-error" -msgstr "" +msgstr "bei Fehlern" #. TRANSLATORS: Job Finishings msgid "job-finishings" -msgstr "" +msgstr "Auftragsabschluss" #. TRANSLATORS: Hold Until msgid "job-hold-until" -msgstr "" +msgstr "Anhalten bis" #. TRANSLATORS: Hold Until msgid "job-hold-until-time" -msgstr "" +msgstr "Anhalten bis" #. TRANSLATORS: Daytime msgid "job-hold-until.day-time" -msgstr "" +msgstr "Tageszeit" #. TRANSLATORS: Evening msgid "job-hold-until.evening" -msgstr "" +msgstr "Abends" #. TRANSLATORS: Released msgid "job-hold-until.indefinite" -msgstr "" +msgstr "Freigabe" #. TRANSLATORS: Night msgid "job-hold-until.night" -msgstr "" +msgstr "Nachts" #. TRANSLATORS: No Hold msgid "job-hold-until.no-hold" -msgstr "" +msgstr "Kein" #. TRANSLATORS: Second Shift msgid "job-hold-until.second-shift" -msgstr "" +msgstr "zweite Schicht" #. TRANSLATORS: Third Shift msgid "job-hold-until.third-shift" -msgstr "" +msgstr "dritte Schicht" #. TRANSLATORS: Weekend msgid "job-hold-until.weekend" -msgstr "" +msgstr "Wochenende" #. TRANSLATORS: Job Mandatory Attributes msgid "job-mandatory-attributes" -msgstr "" +msgstr "Pflichtattribute der Aufträge" #. TRANSLATORS: Title msgid "job-name" -msgstr "" +msgstr "Titel" #. TRANSLATORS: Job Pages msgid "job-pages" -msgstr "" +msgstr "Auftragsseiten" #. TRANSLATORS: Job Pages msgid "job-pages-col" -msgstr "" +msgstr "Auftragszeilen" #. TRANSLATORS: Job Phone Number msgid "job-phone-number" -msgstr "" +msgstr "Auftrags-Telefonnummer" msgid "job-printer-uri attribute missing." msgstr "job-printer-uri Attribut fehlt." #. TRANSLATORS: Job Priority msgid "job-priority" -msgstr "" +msgstr "Auftragspriorität" #. TRANSLATORS: Job Privacy Attributes msgid "job-privacy-attributes" -msgstr "" +msgstr "Auftrags-Datenschutzattribute" #. TRANSLATORS: All msgid "job-privacy-attributes.all" -msgstr "" +msgstr "Alle" #. TRANSLATORS: Default msgid "job-privacy-attributes.default" -msgstr "" +msgstr "Voreingestellt" #. TRANSLATORS: Job Description msgid "job-privacy-attributes.job-description" -msgstr "" +msgstr "Auftragsbeschreibung" #. TRANSLATORS: Job Template msgid "job-privacy-attributes.job-template" -msgstr "" +msgstr "Auftragsvorlage" #. TRANSLATORS: None msgid "job-privacy-attributes.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Job Privacy Scope msgid "job-privacy-scope" -msgstr "" +msgstr "Auftrag Datenschutzbezug" #. TRANSLATORS: All msgid "job-privacy-scope.all" -msgstr "" +msgstr "Alles" #. TRANSLATORS: Default msgid "job-privacy-scope.default" -msgstr "" +msgstr "Voreinstellung" #. TRANSLATORS: None msgid "job-privacy-scope.none" -msgstr "" +msgstr "Kein" #. TRANSLATORS: Owner msgid "job-privacy-scope.owner" -msgstr "" +msgstr "Besitzer" #. TRANSLATORS: Job Recipient Name msgid "job-recipient-name" -msgstr "" +msgstr "Name Auftragsempfänger" #. TRANSLATORS: Job Retain Until msgid "job-retain-until" -msgstr "" +msgstr "Auftrag zurückhalten bis" #. TRANSLATORS: Job Retain Until Interval msgid "job-retain-until-interval" @@ -7314,19 +7556,19 @@ #. TRANSLATORS: End Of Day msgid "job-retain-until.end-of-day" -msgstr "" +msgstr "Tagesende" #. TRANSLATORS: End Of Month msgid "job-retain-until.end-of-month" -msgstr "" +msgstr "Monatsende" #. TRANSLATORS: End Of Week msgid "job-retain-until.end-of-week" -msgstr "" +msgstr "Ende der Woche" #. TRANSLATORS: Indefinite msgid "job-retain-until.indefinite" -msgstr "" +msgstr "Unbestimmt" #. TRANSLATORS: None msgid "job-retain-until.none" @@ -7338,19 +7580,19 @@ #. TRANSLATORS: Job Sheet Message msgid "job-sheet-message" -msgstr "" +msgstr "Nachricht Auftragsbanner" #. TRANSLATORS: Banner Page msgid "job-sheets" -msgstr "" +msgstr "Bannerseite" #. TRANSLATORS: Banner Page msgid "job-sheets-col" -msgstr "" +msgstr "Bannerseite" #. TRANSLATORS: First Page in Document msgid "job-sheets.first-print-stream-page" -msgstr "" +msgstr "Erste Seite im Dokument" #. TRANSLATORS: Start and End Sheets msgid "job-sheets.job-both-sheet" @@ -7366,59 +7608,59 @@ #. TRANSLATORS: None msgid "job-sheets.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Standard msgid "job-sheets.standard" -msgstr "" +msgstr "Standard" #. TRANSLATORS: Job State msgid "job-state" -msgstr "" +msgstr "Auftragsstatus" #. TRANSLATORS: Job State Message msgid "job-state-message" -msgstr "" +msgstr "Auftrags-Statusnachricht" #. TRANSLATORS: Detailed Job State msgid "job-state-reasons" -msgstr "" +msgstr "Auftragsstatus-Grund" #. TRANSLATORS: Stopping msgid "job-state-reasons.aborted-by-system" -msgstr "" +msgstr "Angehalten" #. TRANSLATORS: Account Authorization Failed msgid "job-state-reasons.account-authorization-failed" -msgstr "" +msgstr "Autorisierung fehlt" #. TRANSLATORS: Account Closed msgid "job-state-reasons.account-closed" -msgstr "" +msgstr "Konto geschlossen" #. TRANSLATORS: Account Info Needed msgid "job-state-reasons.account-info-needed" -msgstr "" +msgstr "Kontoinformation benötigt" #. TRANSLATORS: Account Limit Reached msgid "job-state-reasons.account-limit-reached" -msgstr "" +msgstr "Kontenbeschränkung erreicht" #. TRANSLATORS: Decompression error msgid "job-state-reasons.compression-error" -msgstr "" +msgstr "Dekompressionsfehler" #. TRANSLATORS: Conflicting Attributes msgid "job-state-reasons.conflicting-attributes" -msgstr "" +msgstr "Widersprüchliche Attribute" #. TRANSLATORS: Connected To Destination msgid "job-state-reasons.connected-to-destination" -msgstr "" +msgstr "Verbunden zum Ziel" #. TRANSLATORS: Connecting To Destination msgid "job-state-reasons.connecting-to-destination" -msgstr "" +msgstr "Verbinde zum Ziel" #. TRANSLATORS: Destination Uri Failed msgid "job-state-reasons.destination-uri-failed" @@ -7430,63 +7672,63 @@ #. TRANSLATORS: Digital Signature Type Not Supported msgid "job-state-reasons.digital-signature-type-not-supported" -msgstr "" +msgstr "Typ der digitalen Signatur nicht unterstützt" #. TRANSLATORS: Document Access Error msgid "job-state-reasons.document-access-error" -msgstr "" +msgstr "Dokumenten-Zugriffsfehler" #. TRANSLATORS: Document Format Error msgid "job-state-reasons.document-format-error" -msgstr "" +msgstr "Dokument-Formatfehler" #. TRANSLATORS: Document Password Error msgid "job-state-reasons.document-password-error" -msgstr "" +msgstr "Dokument-Passwortfehler" #. TRANSLATORS: Document Permission Error msgid "job-state-reasons.document-permission-error" -msgstr "" +msgstr "Dokument-Erlaubnisfehler" #. TRANSLATORS: Document Security Error msgid "job-state-reasons.document-security-error" -msgstr "" +msgstr "Fehler der Dokumentensicherheit" #. TRANSLATORS: Document Unprintable Error msgid "job-state-reasons.document-unprintable-error" -msgstr "" +msgstr "Dokument nicht druckbar" #. TRANSLATORS: Errors Detected msgid "job-state-reasons.errors-detected" -msgstr "" +msgstr "Fehler aufgetreten" #. TRANSLATORS: Canceled at printer msgid "job-state-reasons.job-canceled-at-device" -msgstr "" +msgstr "Am Drucker angehalten" #. TRANSLATORS: Canceled by operator msgid "job-state-reasons.job-canceled-by-operator" -msgstr "" +msgstr "Vom Bediener angehalten" #. TRANSLATORS: Canceled by user msgid "job-state-reasons.job-canceled-by-user" -msgstr "" +msgstr "vom Benutzer angehalten" #. TRANSLATORS: msgid "job-state-reasons.job-completed-successfully" -msgstr "" +msgstr "Erfolgreich abgeschlossen" #. TRANSLATORS: Completed with errors msgid "job-state-reasons.job-completed-with-errors" -msgstr "" +msgstr "Abschluss mit Fehlern" #. TRANSLATORS: Completed with warnings msgid "job-state-reasons.job-completed-with-warnings" -msgstr "" +msgstr "Abschluss mit Warnungen" #. TRANSLATORS: Insufficient data msgid "job-state-reasons.job-data-insufficient" -msgstr "" +msgstr "Ungenügende Auftragsdaten" #. TRANSLATORS: Job Delay Output Until Specified msgid "job-state-reasons.job-delay-output-until-specified" @@ -7502,15 +7744,15 @@ #. TRANSLATORS: Job Held For Review msgid "job-state-reasons.job-held-for-review" -msgstr "" +msgstr "Auftrag zur Prüfung angehalten" #. TRANSLATORS: Job held msgid "job-state-reasons.job-hold-until-specified" -msgstr "" +msgstr "Auftrag angehalten" #. TRANSLATORS: Incoming msgid "job-state-reasons.job-incoming" -msgstr "" +msgstr "Eingehend" #. TRANSLATORS: Interpreting msgid "job-state-reasons.job-interpreting" @@ -7518,131 +7760,131 @@ #. TRANSLATORS: Outgoing msgid "job-state-reasons.job-outgoing" -msgstr "" +msgstr "Ausgehend" #. TRANSLATORS: Job Password Wait msgid "job-state-reasons.job-password-wait" -msgstr "" +msgstr "Warte auf Auftragspasswort" #. TRANSLATORS: Job Printed Successfully msgid "job-state-reasons.job-printed-successfully" -msgstr "" +msgstr "Auftrag erfolgreich gedruckt" #. TRANSLATORS: Job Printed With Errors msgid "job-state-reasons.job-printed-with-errors" -msgstr "" +msgstr "Auftrag mit Fehlern gedruckt" #. TRANSLATORS: Job Printed With Warnings msgid "job-state-reasons.job-printed-with-warnings" -msgstr "" +msgstr "Auftrag mit Warnungen gedruckt" #. TRANSLATORS: Printing msgid "job-state-reasons.job-printing" -msgstr "" +msgstr "Drucke" #. TRANSLATORS: Preparing to print msgid "job-state-reasons.job-queued" -msgstr "" +msgstr "Druckvorbereitung" #. TRANSLATORS: Processing document msgid "job-state-reasons.job-queued-for-marker" -msgstr "" +msgstr "Verarbeite Dokument" #. TRANSLATORS: Job Release Wait msgid "job-state-reasons.job-release-wait" -msgstr "" +msgstr "Warte auf Auftragsfreigabe" #. TRANSLATORS: Restartable msgid "job-state-reasons.job-restartable" -msgstr "" +msgstr "Kann erneut gestartet werden" #. TRANSLATORS: Job Resuming msgid "job-state-reasons.job-resuming" -msgstr "" +msgstr "Auftrags-Wiederaufnahme" #. TRANSLATORS: Job Saved Successfully msgid "job-state-reasons.job-saved-successfully" -msgstr "" +msgstr "Auftrag erfolgreich gespeichert" #. TRANSLATORS: Job Saved With Errors msgid "job-state-reasons.job-saved-with-errors" -msgstr "" +msgstr "Auftrag mit Fehlern gespeichert" #. TRANSLATORS: Job Saved With Warnings msgid "job-state-reasons.job-saved-with-warnings" -msgstr "" +msgstr "Auftrag mit Warnungen gespeichert" #. TRANSLATORS: Job Saving msgid "job-state-reasons.job-saving" -msgstr "" +msgstr "Auftragsspeicherung" #. TRANSLATORS: Job Spooling msgid "job-state-reasons.job-spooling" -msgstr "" +msgstr "Auftragsspooling" #. TRANSLATORS: Job Streaming msgid "job-state-reasons.job-streaming" -msgstr "" +msgstr "Auftrags-Streaming" #. TRANSLATORS: Suspended msgid "job-state-reasons.job-suspended" -msgstr "" +msgstr "Unterbrochen" #. TRANSLATORS: Job Suspended By Operator msgid "job-state-reasons.job-suspended-by-operator" -msgstr "" +msgstr "Auftrag vom Bediener unterbrochen" #. TRANSLATORS: Job Suspended By System msgid "job-state-reasons.job-suspended-by-system" -msgstr "" +msgstr "Auftrag vom System unterbrochen" #. TRANSLATORS: Job Suspended By User msgid "job-state-reasons.job-suspended-by-user" -msgstr "" +msgstr "Auftrag vom Benutzer unterbrochen" #. TRANSLATORS: Job Suspending msgid "job-state-reasons.job-suspending" -msgstr "" +msgstr "Auftragsunterbrechung" #. TRANSLATORS: Job Transferring msgid "job-state-reasons.job-transferring" -msgstr "" +msgstr "Auftragsverschiebung" #. TRANSLATORS: Transforming msgid "job-state-reasons.job-transforming" -msgstr "" +msgstr "Auftragstransformation" #. TRANSLATORS: None msgid "job-state-reasons.none" -msgstr "" +msgstr "Nichts" #. TRANSLATORS: Printer offline msgid "job-state-reasons.printer-stopped" -msgstr "" +msgstr "Drucker offline" #. TRANSLATORS: Printer partially stopped msgid "job-state-reasons.printer-stopped-partly" -msgstr "" +msgstr "Drucker teilweise angehalten" #. TRANSLATORS: Stopping msgid "job-state-reasons.processing-to-stop-point" -msgstr "" +msgstr "Wird angehalten" #. TRANSLATORS: Ready msgid "job-state-reasons.queued-in-device" -msgstr "" +msgstr "Bereit" #. TRANSLATORS: Resources Are Not Ready msgid "job-state-reasons.resources-are-not-ready" -msgstr "" +msgstr "Ressourcen sind nicht bereit" #. TRANSLATORS: Resources Are Not Supported msgid "job-state-reasons.resources-are-not-supported" -msgstr "" +msgstr "Ressourcen werden nicht unterstützt" #. TRANSLATORS: Service offline msgid "job-state-reasons.service-off-line" -msgstr "" +msgstr "Dienst offline" #. TRANSLATORS: Submission Interrupted msgid "job-state-reasons.submission-interrupted" @@ -7650,103 +7892,103 @@ #. TRANSLATORS: Unsupported Attributes Or Values msgid "job-state-reasons.unsupported-attributes-or-values" -msgstr "" +msgstr "Nicht unterstützte Attribute oder Werte" #. TRANSLATORS: Unsupported Compression msgid "job-state-reasons.unsupported-compression" -msgstr "" +msgstr "Nicht unterstützte Kompression" #. TRANSLATORS: Unsupported Document Format msgid "job-state-reasons.unsupported-document-format" -msgstr "" +msgstr "Nicht unterstütztes Dokumentenformat" #. TRANSLATORS: Waiting For User Action msgid "job-state-reasons.waiting-for-user-action" -msgstr "" +msgstr "Warte auf Benutzeraktion" #. TRANSLATORS: Warnings Detected msgid "job-state-reasons.warnings-detected" -msgstr "" +msgstr "Warnung aufgetreten" #. TRANSLATORS: Pending msgid "job-state.3" -msgstr "" +msgstr "Ausstehend" #. TRANSLATORS: Held msgid "job-state.4" -msgstr "" +msgstr "Angehalten" #. TRANSLATORS: Processing msgid "job-state.5" -msgstr "" +msgstr "Verarbeitend" #. TRANSLATORS: Stopped msgid "job-state.6" -msgstr "" +msgstr "Angehalten" #. TRANSLATORS: Canceled msgid "job-state.7" -msgstr "" +msgstr "Abgebrochen" #. TRANSLATORS: Aborted msgid "job-state.8" -msgstr "" +msgstr "Abgebrochen" #. TRANSLATORS: Completed msgid "job-state.9" -msgstr "" +msgstr "Fertig" #. TRANSLATORS: Laminate Pages msgid "laminating" -msgstr "" +msgstr "Seitenlaminierung" #. TRANSLATORS: Laminate msgid "laminating-sides" -msgstr "" +msgstr "Laminierung" #. TRANSLATORS: Back Only msgid "laminating-sides.back" -msgstr "" +msgstr "Nur Rückseite" #. TRANSLATORS: Front and Back msgid "laminating-sides.both" -msgstr "" +msgstr "Vor- und Rückseite" #. TRANSLATORS: Front Only msgid "laminating-sides.front" -msgstr "" +msgstr "nur Vorderseite" #. TRANSLATORS: Type of Lamination msgid "laminating-type" -msgstr "" +msgstr "Typ der Laminierung" #. TRANSLATORS: Archival msgid "laminating-type.archival" -msgstr "" +msgstr "Archivfähig" #. TRANSLATORS: Glossy msgid "laminating-type.glossy" -msgstr "" +msgstr "Glänzend" #. TRANSLATORS: High Gloss msgid "laminating-type.high-gloss" -msgstr "" +msgstr "Hochglänzend" #. TRANSLATORS: Matte msgid "laminating-type.matte" -msgstr "" +msgstr "Matt" #. TRANSLATORS: Semi-gloss msgid "laminating-type.semi-gloss" -msgstr "" +msgstr "Halbglänzend" #. TRANSLATORS: Translucent msgid "laminating-type.translucent" -msgstr "" +msgstr "Durchscheinend" #. TRANSLATORS: Logo msgid "logo" -msgstr "" +msgstr "Logo" msgid "lpadmin: Class name can only contain printable characters." msgstr "lpadmin: Klassenname darf nur druckbare Zeichen enthalten." @@ -7766,13 +8008,13 @@ msgstr "lpadmin: Klasse nach der \"-c\" Option erwartet." msgid "lpadmin: Expected description after \"-D\" option." -msgstr "lpadmin: BEschreibung nach der \"-D\" Option erwartet." +msgstr "lpadmin: Beschreibung nach der \"-D\" Option erwartet." msgid "lpadmin: Expected device URI after \"-v\" option." msgstr "lpadmin: Geräte-URI nach der \"-v\" Option erwartet." msgid "lpadmin: Expected file type(s) after \"-I\" option." -msgstr "lpadmin: Dateitype nach der \"-I\" Option erwartet." +msgstr "lpadmin: Dateityp nach der \"-I\" Option erwartet." msgid "lpadmin: Expected hostname after \"-h\" option." msgstr "lpadmin: Hostname nach der \"-h\" Option erwartet." @@ -7799,7 +8041,7 @@ msgstr "lpadmin: Drucker oder Klasse nach der \"-x\" Option erwartet." msgid "lpadmin: No member names were seen." -msgstr "lpadmin: Keine Mitgleidernamen erkennbar." +msgstr "lpadmin: Keine Mitgliedernamen erkennbar." #, c-format msgid "lpadmin: Printer %s is already a member of class %s." @@ -7813,6 +8055,8 @@ "lpadmin: Printer drivers are deprecated and will stop working in a future " "version of CUPS." msgstr "" +"lpadmin: Druckertreiber sind veraltet und werden in einer zukünftigen Version " +"von CUPS nicht mehr funktionieren." msgid "lpadmin: Printer name can only contain printable characters." msgstr "lpadmin: Druckername darf nur druckbare Zeichen enthalten." @@ -7821,14 +8065,18 @@ "lpadmin: Raw queues are deprecated and will stop working in a future version " "of CUPS." msgstr "" +"lpadmin: Roh-Warteschlangen sind veraltet und werden in einer " +"zukünftigen Version von CUPS nicht mehr funktionieren." msgid "lpadmin: Raw queues are no longer supported on macOS." -msgstr "" +msgstr "lpadmin: Roh-Warteschlangen sind unter macOS nicht mehr unterstützt." msgid "" "lpadmin: System V interface scripts are no longer supported for security " "reasons." msgstr "" +"lpadmin: System V Schnittstellenskripte sind aus Sicherheitsgründen nicht " +"mehr unterstützt." msgid "" "lpadmin: Unable to add a printer to the class:\n" @@ -7839,7 +8087,7 @@ #, c-format msgid "lpadmin: Unable to connect to server: %s" -msgstr "lpadmin: Kann nicht mit dem Server %s verbinden." +msgstr "lpadmin: Kann nicht mit dem Server verbinden: %s" msgid "lpadmin: Unable to create temporary file" msgstr "lpadmin: Temporäre Datei kann nicht angelegt werden" @@ -7848,10 +8096,12 @@ "lpadmin: Unable to delete option:\n" " You must specify a printer name first." msgstr "" +"lpadmin: Löschen der Option nicht möglich:\n" +" Sie müssen zuerst einen Druckernamen angeben." #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s" -msgstr "" +msgstr "lpadmin: Öffnen der PPD \"%s\": %s nicht möglich." #, c-format msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d." @@ -7885,6 +8135,7 @@ msgid "lpadmin: Use the 'everywhere' model for shared printers." msgstr "" +"lpadmin: Benutzen sie das 'everywhere' Modell für freigegebene Drucker." msgid "lpadmin: Warning - content type list ignored." msgstr "lpadmin: Warnung - Inhaltstypliste ignoriert." @@ -7902,7 +8153,7 @@ msgstr "" msgid "lpinfo: Expected product string after \"--product\"." -msgstr "" +msgstr "lpinfo: Produkt-Zeichenkette nach \"--product\" erwartet." msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." msgstr "" @@ -7915,7 +8166,7 @@ #, c-format msgid "lpmove: Unable to connect to server: %s" -msgstr "lpmove: Verbindung zum Server »%s« nicht möglich" +msgstr "lpmove: Verbindung zum Server nicht möglich: %s" #, c-format msgid "lpmove: Unknown argument \"%s\"." @@ -7930,7 +8181,7 @@ #, c-format msgid "lpoptions: Unable to get PPD file for %s: %s" -msgstr "lpoptions: Keine PPD-Datei für %s: %s verfügbar" +msgstr "lpoptions: Keine PPD-Datei für %s verfügbar: %s" #, c-format msgid "lpoptions: Unable to open PPD file for %s." @@ -7947,75 +8198,75 @@ #. TRANSLATORS: Amount of Material msgid "material-amount" -msgstr "" +msgstr "Materialmenge" #. TRANSLATORS: Amount Units msgid "material-amount-units" -msgstr "" +msgstr "Einheiten" #. TRANSLATORS: Grams msgid "material-amount-units.g" -msgstr "" +msgstr "Gramm" #. TRANSLATORS: Kilograms msgid "material-amount-units.kg" -msgstr "" +msgstr "Kilogramm" #. TRANSLATORS: Liters msgid "material-amount-units.l" -msgstr "" +msgstr "Liter" #. TRANSLATORS: Meters msgid "material-amount-units.m" -msgstr "" +msgstr "Meter" #. TRANSLATORS: Milliliters msgid "material-amount-units.ml" -msgstr "" +msgstr "Milliliter" #. TRANSLATORS: Millimeters msgid "material-amount-units.mm" -msgstr "" +msgstr "Millimeter" #. TRANSLATORS: Material Color msgid "material-color" -msgstr "" +msgstr "Materialfarbe" #. TRANSLATORS: Material Diameter msgid "material-diameter" -msgstr "" +msgstr "Materialdurchmesser" #. TRANSLATORS: Material Diameter Tolerance msgid "material-diameter-tolerance" -msgstr "" +msgstr "Material-Durchmessertoleranz" #. TRANSLATORS: Material Fill Density msgid "material-fill-density" -msgstr "" +msgstr "Material-Fülldichte" #. TRANSLATORS: Material Name msgid "material-name" -msgstr "" +msgstr "Materialname" #. TRANSLATORS: Material Nozzle Diameter msgid "material-nozzle-diameter" -msgstr "" +msgstr "Material-Düsendurchmesser" #. TRANSLATORS: Use Material For msgid "material-purpose" -msgstr "" +msgstr "Materialverwendung für" #. TRANSLATORS: Everything msgid "material-purpose.all" -msgstr "" +msgstr "Alles" #. TRANSLATORS: Base msgid "material-purpose.base" -msgstr "" +msgstr "Untergrund" #. TRANSLATORS: In-fill msgid "material-purpose.in-fill" -msgstr "" +msgstr "Füllung" #. TRANSLATORS: Shell msgid "material-purpose.shell" @@ -8023,31 +8274,31 @@ #. TRANSLATORS: Supports msgid "material-purpose.support" -msgstr "" +msgstr "Unterstützt" #. TRANSLATORS: Feed Rate msgid "material-rate" -msgstr "" +msgstr "Vorschubgeschwindigkeit" #. TRANSLATORS: Feed Rate Units msgid "material-rate-units" -msgstr "" +msgstr "Einheiten der Vorschubgeschwindigkeit" #. TRANSLATORS: Milligrams per second msgid "material-rate-units.mg_second" -msgstr "" +msgstr "Milligramm pro Sekunde" #. TRANSLATORS: Milliliters per second msgid "material-rate-units.ml_second" -msgstr "" +msgstr "Milliliter pro Sekunde" #. TRANSLATORS: Millimeters per second msgid "material-rate-units.mm_second" -msgstr "" +msgstr "Millimeter pro Sekunde" #. TRANSLATORS: Material Retraction msgid "material-retraction" -msgstr "" +msgstr "Materialrückführung" #. TRANSLATORS: Material Shell Thickness msgid "material-shell-thickness" @@ -8055,131 +8306,131 @@ #. TRANSLATORS: Material Temperature msgid "material-temperature" -msgstr "" +msgstr "Materialtemperatur" #. TRANSLATORS: Material Type msgid "material-type" -msgstr "" +msgstr "Materialtyp" #. TRANSLATORS: ABS msgid "material-type.abs" -msgstr "" +msgstr "ABS" #. TRANSLATORS: Carbon Fiber ABS msgid "material-type.abs-carbon-fiber" -msgstr "" +msgstr "Kohlefaser-ABS" #. TRANSLATORS: Carbon Nanotube ABS msgid "material-type.abs-carbon-nanotube" -msgstr "" +msgstr "Kohlenstoff-Nanoröhren-ABS" #. TRANSLATORS: Chocolate msgid "material-type.chocolate" -msgstr "" +msgstr "Schokolade" #. TRANSLATORS: Gold msgid "material-type.gold" -msgstr "" +msgstr "material-type.Gold" #. TRANSLATORS: Nylon msgid "material-type.nylon" -msgstr "" +msgstr "Nylon" #. TRANSLATORS: Pet msgid "material-type.pet" -msgstr "" +msgstr "PET" #. TRANSLATORS: Photopolymer msgid "material-type.photopolymer" -msgstr "" +msgstr "Photopolymer" #. TRANSLATORS: PLA msgid "material-type.pla" -msgstr "" +msgstr "PLA" #. TRANSLATORS: Conductive PLA msgid "material-type.pla-conductive" -msgstr "" +msgstr "Leitfähiges PLA" #. TRANSLATORS: Pla Dissolvable msgid "material-type.pla-dissolvable" -msgstr "" +msgstr "Lösliches PLA" #. TRANSLATORS: Flexible PLA msgid "material-type.pla-flexible" -msgstr "" +msgstr "Flexibles PLA" #. TRANSLATORS: Magnetic PLA msgid "material-type.pla-magnetic" -msgstr "" +msgstr "Magnetisches PLA" #. TRANSLATORS: Steel PLA msgid "material-type.pla-steel" -msgstr "" +msgstr "Stahl PLA" #. TRANSLATORS: Stone PLA msgid "material-type.pla-stone" -msgstr "" +msgstr "Stein-PLA" #. TRANSLATORS: Wood PLA msgid "material-type.pla-wood" -msgstr "" +msgstr "Holz-PLA" #. TRANSLATORS: Polycarbonate msgid "material-type.polycarbonate" -msgstr "" +msgstr "PC" #. TRANSLATORS: Dissolvable PVA msgid "material-type.pva-dissolvable" -msgstr "" +msgstr "lösliches PLA" #. TRANSLATORS: Silver msgid "material-type.silver" -msgstr "" +msgstr "Silber" #. TRANSLATORS: Titanium msgid "material-type.titanium" -msgstr "" +msgstr "Titan" #. TRANSLATORS: Wax msgid "material-type.wax" -msgstr "" +msgstr "Wachs" #. TRANSLATORS: Materials msgid "materials-col" -msgstr "" +msgstr "Materialien" #. TRANSLATORS: Media msgid "media" -msgstr "" +msgstr "Medien" #. TRANSLATORS: Back Coating of Media msgid "media-back-coating" -msgstr "" +msgstr "Beschichtung der Rückseite" #. TRANSLATORS: Glossy msgid "media-back-coating.glossy" -msgstr "" +msgstr "Glänzend" #. TRANSLATORS: High Gloss msgid "media-back-coating.high-gloss" -msgstr "" +msgstr "Hochglänzend" #. TRANSLATORS: Matte msgid "media-back-coating.matte" -msgstr "" +msgstr "Matt" #. TRANSLATORS: None msgid "media-back-coating.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Satin msgid "media-back-coating.satin" -msgstr "" +msgstr "Satin" #. TRANSLATORS: Semi-gloss msgid "media-back-coating.semi-gloss" -msgstr "" +msgstr "Seidenglänzend" #. TRANSLATORS: Media Bottom Margin msgid "media-bottom-margin" @@ -8187,347 +8438,347 @@ #. TRANSLATORS: Media msgid "media-col" -msgstr "" +msgstr "Medien" #. TRANSLATORS: Media Color msgid "media-color" -msgstr "" +msgstr "Medienfarbe" #. TRANSLATORS: Black msgid "media-color.black" -msgstr "" +msgstr "Schwarz" #. TRANSLATORS: Blue msgid "media-color.blue" -msgstr "" +msgstr "Blau" #. TRANSLATORS: Brown msgid "media-color.brown" -msgstr "" +msgstr "Braun" #. TRANSLATORS: Buff msgid "media-color.buff" -msgstr "" +msgstr "gelbbraun" #. TRANSLATORS: Clear Black msgid "media-color.clear-black" -msgstr "" +msgstr "klarschwarz" #. TRANSLATORS: Clear Blue msgid "media-color.clear-blue" -msgstr "" +msgstr "klarblau" #. TRANSLATORS: Clear Brown msgid "media-color.clear-brown" -msgstr "" +msgstr "klarbraun" #. TRANSLATORS: Clear Buff msgid "media-color.clear-buff" -msgstr "" +msgstr "klargelbbraun" #. TRANSLATORS: Clear Cyan msgid "media-color.clear-cyan" -msgstr "" +msgstr "klarcyan" #. TRANSLATORS: Clear Gold msgid "media-color.clear-gold" -msgstr "" +msgstr "klargold" #. TRANSLATORS: Clear Goldenrod msgid "media-color.clear-goldenrod" -msgstr "" +msgstr "Klar-Goldenrod" #. TRANSLATORS: Clear Gray msgid "media-color.clear-gray" -msgstr "" +msgstr "klargrau" #. TRANSLATORS: Clear Green msgid "media-color.clear-green" -msgstr "" +msgstr "klargrün" #. TRANSLATORS: Clear Ivory msgid "media-color.clear-ivory" -msgstr "" +msgstr "klarelfenbein" #. TRANSLATORS: Clear Magenta msgid "media-color.clear-magenta" -msgstr "" +msgstr "klarmagenta" #. TRANSLATORS: Clear Multi Color msgid "media-color.clear-multi-color" -msgstr "" +msgstr "klar mehrfarbig" #. TRANSLATORS: Clear Mustard msgid "media-color.clear-mustard" -msgstr "" +msgstr "klarsenf" #. TRANSLATORS: Clear Orange msgid "media-color.clear-orange" -msgstr "" +msgstr "klarorange" #. TRANSLATORS: Clear Pink msgid "media-color.clear-pink" -msgstr "" +msgstr "klarpink" #. TRANSLATORS: Clear Red msgid "media-color.clear-red" -msgstr "" +msgstr "klarrot" #. TRANSLATORS: Clear Silver msgid "media-color.clear-silver" -msgstr "" +msgstr "silber" #. TRANSLATORS: Clear Turquoise msgid "media-color.clear-turquoise" -msgstr "" +msgstr "klartürkis" #. TRANSLATORS: Clear Violet msgid "media-color.clear-violet" -msgstr "" +msgstr "klarviolet" #. TRANSLATORS: Clear White msgid "media-color.clear-white" -msgstr "" +msgstr "klarweiß" #. TRANSLATORS: Clear Yellow msgid "media-color.clear-yellow" -msgstr "" +msgstr "klargelb" #. TRANSLATORS: Cyan msgid "media-color.cyan" -msgstr "" +msgstr "cyan" #. TRANSLATORS: Dark Blue msgid "media-color.dark-blue" -msgstr "" +msgstr "dunkelblau" #. TRANSLATORS: Dark Brown msgid "media-color.dark-brown" -msgstr "" +msgstr "dunkelbraun" #. TRANSLATORS: Dark Buff msgid "media-color.dark-buff" -msgstr "" +msgstr "dunkelgelbbraun" #. TRANSLATORS: Dark Cyan msgid "media-color.dark-cyan" -msgstr "" +msgstr "dunkelcyan" #. TRANSLATORS: Dark Gold msgid "media-color.dark-gold" -msgstr "" +msgstr "dunkelgold" #. TRANSLATORS: Dark Goldenrod msgid "media-color.dark-goldenrod" -msgstr "" +msgstr "dunkel-Goldenrod" #. TRANSLATORS: Dark Gray msgid "media-color.dark-gray" -msgstr "" +msgstr "dunkelgrau" #. TRANSLATORS: Dark Green msgid "media-color.dark-green" -msgstr "" +msgstr "dunkelgrün" #. TRANSLATORS: Dark Ivory msgid "media-color.dark-ivory" -msgstr "" +msgstr "dunkelelfenbein" #. TRANSLATORS: Dark Magenta msgid "media-color.dark-magenta" -msgstr "" +msgstr "dunkelmagenta" #. TRANSLATORS: Dark Mustard msgid "media-color.dark-mustard" -msgstr "" +msgstr "dunkelsenf" #. TRANSLATORS: Dark Orange msgid "media-color.dark-orange" -msgstr "" +msgstr "dunkelorange" #. TRANSLATORS: Dark Pink msgid "media-color.dark-pink" -msgstr "" +msgstr "dunkelpink" #. TRANSLATORS: Dark Red msgid "media-color.dark-red" -msgstr "" +msgstr "dunkelrot" #. TRANSLATORS: Dark Silver msgid "media-color.dark-silver" -msgstr "" +msgstr "dunkelsilber" #. TRANSLATORS: Dark Turquoise msgid "media-color.dark-turquoise" -msgstr "" +msgstr "dunkeltürkis" #. TRANSLATORS: Dark Violet msgid "media-color.dark-violet" -msgstr "" +msgstr "dunkelviolet" #. TRANSLATORS: Dark Yellow msgid "media-color.dark-yellow" -msgstr "" +msgstr "dunkelgelb" #. TRANSLATORS: Gold msgid "media-color.gold" -msgstr "" +msgstr "gold" #. TRANSLATORS: Goldenrod msgid "media-color.goldenrod" -msgstr "" +msgstr "media-color.goldrute" #. TRANSLATORS: Gray msgid "media-color.gray" -msgstr "" +msgstr "grau" #. TRANSLATORS: Green msgid "media-color.green" -msgstr "" +msgstr "grün" #. TRANSLATORS: Ivory msgid "media-color.ivory" -msgstr "" +msgstr "elfenbein" #. TRANSLATORS: Light Black msgid "media-color.light-black" -msgstr "" +msgstr "hellschwarz" #. TRANSLATORS: Light Blue msgid "media-color.light-blue" -msgstr "" +msgstr "hellblau" #. TRANSLATORS: Light Brown msgid "media-color.light-brown" -msgstr "" +msgstr "hellbraun" #. TRANSLATORS: Light Buff msgid "media-color.light-buff" -msgstr "" +msgstr "media-color.hell-gelbbraun" #. TRANSLATORS: Light Cyan msgid "media-color.light-cyan" -msgstr "" +msgstr "hellcyan" #. TRANSLATORS: Light Gold msgid "media-color.light-gold" -msgstr "" +msgstr "hellgold" #. TRANSLATORS: Light Goldenrod msgid "media-color.light-goldenrod" -msgstr "" +msgstr "hell-Goldenrod" #. TRANSLATORS: Light Gray msgid "media-color.light-gray" -msgstr "" +msgstr "hellgrau" #. TRANSLATORS: Light Green msgid "media-color.light-green" -msgstr "" +msgstr "hellgrün" #. TRANSLATORS: Light Ivory msgid "media-color.light-ivory" -msgstr "" +msgstr "hellelfenbein" #. TRANSLATORS: Light Magenta msgid "media-color.light-magenta" -msgstr "" +msgstr "hellmagenta" #. TRANSLATORS: Light Mustard msgid "media-color.light-mustard" -msgstr "" +msgstr "hellsenf" #. TRANSLATORS: Light Orange msgid "media-color.light-orange" -msgstr "" +msgstr "hellorange" #. TRANSLATORS: Light Pink msgid "media-color.light-pink" -msgstr "" +msgstr "hellpink" #. TRANSLATORS: Light Red msgid "media-color.light-red" -msgstr "" +msgstr "hellrot" #. TRANSLATORS: Light Silver msgid "media-color.light-silver" -msgstr "" +msgstr "hellsilber" #. TRANSLATORS: Light Turquoise msgid "media-color.light-turquoise" -msgstr "" +msgstr "helltürkis" #. TRANSLATORS: Light Violet msgid "media-color.light-violet" -msgstr "" +msgstr "hellviolet" #. TRANSLATORS: Light Yellow msgid "media-color.light-yellow" -msgstr "" +msgstr "hellgelb" #. TRANSLATORS: Magenta msgid "media-color.magenta" -msgstr "" +msgstr "magenta" #. TRANSLATORS: Multi-color msgid "media-color.multi-color" -msgstr "" +msgstr "mehrfarbig" #. TRANSLATORS: Mustard msgid "media-color.mustard" -msgstr "" +msgstr "senf" #. TRANSLATORS: No Color msgid "media-color.no-color" -msgstr "" +msgstr "farblos" #. TRANSLATORS: Orange msgid "media-color.orange" -msgstr "" +msgstr "orange" #. TRANSLATORS: Pink msgid "media-color.pink" -msgstr "" +msgstr "pink" #. TRANSLATORS: Red msgid "media-color.red" -msgstr "" +msgstr "rot" #. TRANSLATORS: Silver msgid "media-color.silver" -msgstr "" +msgstr "silber" #. TRANSLATORS: Turquoise msgid "media-color.turquoise" -msgstr "" +msgstr "türkis" #. TRANSLATORS: Violet msgid "media-color.violet" -msgstr "" +msgstr "violett" #. TRANSLATORS: White msgid "media-color.white" -msgstr "" +msgstr "weiß" #. TRANSLATORS: Yellow msgid "media-color.yellow" -msgstr "" +msgstr "gelb" #. TRANSLATORS: Front Coating of Media msgid "media-front-coating" -msgstr "" +msgstr "Beschichtung der Medien-Vorderseite" #. TRANSLATORS: Media Grain msgid "media-grain" -msgstr "" +msgstr "Medienkörnung" #. TRANSLATORS: Cross-Feed Direction msgid "media-grain.x-direction" -msgstr "" +msgstr "media-grain.x-Richtung" #. TRANSLATORS: Feed Direction msgid "media-grain.y-direction" -msgstr "" +msgstr "media-grain.y-Richtung" #. TRANSLATORS: Media Hole Count msgid "media-hole-count" @@ -8535,7 +8786,7 @@ #. TRANSLATORS: Media Info msgid "media-info" -msgstr "" +msgstr "Medieninfo" #. TRANSLATORS: Force Media msgid "media-input-tray-check" @@ -8543,287 +8794,287 @@ #. TRANSLATORS: Media Left Margin msgid "media-left-margin" -msgstr "" +msgstr "linker Rand des Mediums" #. TRANSLATORS: Pre-printed Media msgid "media-pre-printed" -msgstr "" +msgstr "Vorbedruckte Medien" #. TRANSLATORS: Blank msgid "media-pre-printed.blank" -msgstr "" +msgstr "Blanko" #. TRANSLATORS: Letterhead msgid "media-pre-printed.letter-head" -msgstr "" +msgstr "Briefkopf" #. TRANSLATORS: Pre-printed msgid "media-pre-printed.pre-printed" -msgstr "" +msgstr "Vorbedruckt" #. TRANSLATORS: Recycled Media msgid "media-recycled" -msgstr "" +msgstr "Recyclat" #. TRANSLATORS: None msgid "media-recycled.none" -msgstr "" +msgstr "Kein" #. TRANSLATORS: Standard msgid "media-recycled.standard" -msgstr "" +msgstr "Standard" #. TRANSLATORS: Media Right Margin msgid "media-right-margin" -msgstr "" +msgstr "Medien rechter Rand" #. TRANSLATORS: Media Dimensions msgid "media-size" -msgstr "" +msgstr "Mediengröße" #. TRANSLATORS: Media Name msgid "media-size-name" -msgstr "" +msgstr "Medienname" #. TRANSLATORS: Media Source msgid "media-source" -msgstr "" +msgstr "Medienquelle" #. TRANSLATORS: Alternate msgid "media-source.alternate" -msgstr "" +msgstr "Alternativer Einzug" #. TRANSLATORS: Alternate Roll msgid "media-source.alternate-roll" -msgstr "" +msgstr "Alternative Rolle" #. TRANSLATORS: Automatic msgid "media-source.auto" -msgstr "" +msgstr "automatisch" #. TRANSLATORS: Bottom msgid "media-source.bottom" -msgstr "" +msgstr "unten" #. TRANSLATORS: By-pass Tray msgid "media-source.by-pass-tray" -msgstr "" +msgstr "Handeinzugsfach" #. TRANSLATORS: Center msgid "media-source.center" -msgstr "" +msgstr "mitte" #. TRANSLATORS: Disc msgid "media-source.disc" -msgstr "" +msgstr "Scheibe" #. TRANSLATORS: Envelope msgid "media-source.envelope" -msgstr "" +msgstr "Umschlag" #. TRANSLATORS: Hagaki msgid "media-source.hagaki" -msgstr "" +msgstr "Hagaki" #. TRANSLATORS: Large Capacity msgid "media-source.large-capacity" -msgstr "" +msgstr "Großvolumen" #. TRANSLATORS: Left msgid "media-source.left" -msgstr "" +msgstr "links" #. TRANSLATORS: Main msgid "media-source.main" -msgstr "" +msgstr "Haupteinzug" #. TRANSLATORS: Main Roll msgid "media-source.main-roll" -msgstr "" +msgstr "Hauptrolle" #. TRANSLATORS: Manual msgid "media-source.manual" -msgstr "" +msgstr "Manuell" #. TRANSLATORS: Middle msgid "media-source.middle" -msgstr "" +msgstr "mitte" #. TRANSLATORS: Photo msgid "media-source.photo" -msgstr "" +msgstr "foto" #. TRANSLATORS: Rear msgid "media-source.rear" -msgstr "" +msgstr "Rückseite" #. TRANSLATORS: Right msgid "media-source.right" -msgstr "" +msgstr "rechts" #. TRANSLATORS: Roll 1 msgid "media-source.roll-1" -msgstr "" +msgstr "Rolle 1" #. TRANSLATORS: Roll 10 msgid "media-source.roll-10" -msgstr "" +msgstr "Rolle 10" #. TRANSLATORS: Roll 2 msgid "media-source.roll-2" -msgstr "" +msgstr "Rolle 2" #. TRANSLATORS: Roll 3 msgid "media-source.roll-3" -msgstr "" +msgstr "Rolle 3" #. TRANSLATORS: Roll 4 msgid "media-source.roll-4" -msgstr "" +msgstr "Rolle 4" #. TRANSLATORS: Roll 5 msgid "media-source.roll-5" -msgstr "" +msgstr "Rolle 5" #. TRANSLATORS: Roll 6 msgid "media-source.roll-6" -msgstr "" +msgstr "Rolle 6" #. TRANSLATORS: Roll 7 msgid "media-source.roll-7" -msgstr "" +msgstr "Rolle 7" #. TRANSLATORS: Roll 8 msgid "media-source.roll-8" -msgstr "" +msgstr "Rolle 8" #. TRANSLATORS: Roll 9 msgid "media-source.roll-9" -msgstr "" +msgstr "Rolle 9" #. TRANSLATORS: Side msgid "media-source.side" -msgstr "" +msgstr "seitlich" #. TRANSLATORS: Top msgid "media-source.top" -msgstr "" +msgstr "oben" #. TRANSLATORS: Tray 1 msgid "media-source.tray-1" -msgstr "" +msgstr "Fach 1" #. TRANSLATORS: Tray 10 msgid "media-source.tray-10" -msgstr "" +msgstr "Fach 10" #. TRANSLATORS: Tray 11 msgid "media-source.tray-11" -msgstr "" +msgstr "Fach 11" #. TRANSLATORS: Tray 12 msgid "media-source.tray-12" -msgstr "" +msgstr "Fach 12" #. TRANSLATORS: Tray 13 msgid "media-source.tray-13" -msgstr "" +msgstr "Fach 13" #. TRANSLATORS: Tray 14 msgid "media-source.tray-14" -msgstr "" +msgstr "Fach 14" #. TRANSLATORS: Tray 15 msgid "media-source.tray-15" -msgstr "" +msgstr "Fach 15" #. TRANSLATORS: Tray 16 msgid "media-source.tray-16" -msgstr "" +msgstr "Fach 16" #. TRANSLATORS: Tray 17 msgid "media-source.tray-17" -msgstr "" +msgstr "Fach 17" #. TRANSLATORS: Tray 18 msgid "media-source.tray-18" -msgstr "" +msgstr "Fach 18" #. TRANSLATORS: Tray 19 msgid "media-source.tray-19" -msgstr "" +msgstr "Fach 19" #. TRANSLATORS: Tray 2 msgid "media-source.tray-2" -msgstr "" +msgstr "Fach 2" #. TRANSLATORS: Tray 20 msgid "media-source.tray-20" -msgstr "" +msgstr "Fach 20" #. TRANSLATORS: Tray 3 msgid "media-source.tray-3" -msgstr "" +msgstr "Fach 3" #. TRANSLATORS: Tray 4 msgid "media-source.tray-4" -msgstr "" +msgstr "Fach 4" #. TRANSLATORS: Tray 5 msgid "media-source.tray-5" -msgstr "" +msgstr "Fach 5" #. TRANSLATORS: Tray 6 msgid "media-source.tray-6" -msgstr "" +msgstr "Fach 6" #. TRANSLATORS: Tray 7 msgid "media-source.tray-7" -msgstr "" +msgstr "Fach 7" #. TRANSLATORS: Tray 8 msgid "media-source.tray-8" -msgstr "" +msgstr "Fach 8" #. TRANSLATORS: Tray 9 msgid "media-source.tray-9" -msgstr "" +msgstr "Fach 9" #. TRANSLATORS: Media Thickness msgid "media-thickness" -msgstr "" +msgstr "Medienstärke" #. TRANSLATORS: Media Tooth (Texture) msgid "media-tooth" -msgstr "" +msgstr "Medientextur" #. TRANSLATORS: Antique msgid "media-tooth.antique" -msgstr "" +msgstr "Antik" #. TRANSLATORS: Extra Smooth msgid "media-tooth.calendared" -msgstr "" +msgstr "Extra fein" #. TRANSLATORS: Coarse msgid "media-tooth.coarse" -msgstr "" +msgstr "media-tooth.grob" #. TRANSLATORS: Fine msgid "media-tooth.fine" -msgstr "" +msgstr "Fein" #. TRANSLATORS: Linen msgid "media-tooth.linen" -msgstr "" +msgstr "Linien" #. TRANSLATORS: Medium msgid "media-tooth.medium" -msgstr "" +msgstr "Mittel" #. TRANSLATORS: Smooth msgid "media-tooth.smooth" -msgstr "" +msgstr "Fein" #. TRANSLATORS: Stipple msgid "media-tooth.stipple" @@ -8831,27 +9082,27 @@ #. TRANSLATORS: Rough msgid "media-tooth.uncalendared" -msgstr "" +msgstr "Rauh" #. TRANSLATORS: Vellum msgid "media-tooth.vellum" -msgstr "" +msgstr "Pergament" #. TRANSLATORS: Media Top Margin msgid "media-top-margin" -msgstr "" +msgstr "Oberer Rand des Mediums" #. TRANSLATORS: Media Type msgid "media-type" -msgstr "" +msgstr "Medientyp" #. TRANSLATORS: Aluminum msgid "media-type.aluminum" -msgstr "" +msgstr "Aluminium" #. TRANSLATORS: Automatic msgid "media-type.auto" -msgstr "" +msgstr "Automatisch" #. TRANSLATORS: Back Print Film msgid "media-type.back-print-film" @@ -8859,107 +9110,107 @@ #. TRANSLATORS: Cardboard msgid "media-type.cardboard" -msgstr "" +msgstr "Karton" #. TRANSLATORS: Cardstock msgid "media-type.cardstock" -msgstr "" +msgstr "Postkarte" #. TRANSLATORS: CD msgid "media-type.cd" -msgstr "" +msgstr "CD" #. TRANSLATORS: Photo Advanced Paper msgid "media-type.com.hp.advanced-photo" -msgstr "" +msgstr "Foto Spezial" #. TRANSLATORS: Brochure Glossy Paper msgid "media-type.com.hp.brochure-glossy" -msgstr "" +msgstr "Broschüren Glanzpapier" #. TRANSLATORS: Brochure Matte Paper msgid "media-type.com.hp.brochure-matte" -msgstr "" +msgstr "Broschüren Mattpapier" #. TRANSLATORS: Matte Coverstock msgid "media-type.com.hp.cover-matte" -msgstr "" +msgstr "Umschlag Matt" #. TRANSLATORS: EcoSMART Lite Paper msgid "media-type.com.hp.ecosmart-lite" -msgstr "" +msgstr "EcoSMART Leichtpapier" #. TRANSLATORS: Everyday Glossy Paper msgid "media-type.com.hp.everyday-glossy" -msgstr "" +msgstr "gewöhnliches Glanzpapier" #. TRANSLATORS: Everyday Matte Paper msgid "media-type.com.hp.everyday-matte" -msgstr "" +msgstr "gewöhnliches Mattpapier" #. TRANSLATORS: Extra Heavyweight Paper msgid "media-type.com.hp.extra-heavy" -msgstr "" +msgstr "Extraschwer" #. TRANSLATORS: Intermediate Paper msgid "media-type.com.hp.intermediate" -msgstr "" +msgstr "Mittel" #. TRANSLATORS: Mid-Weight Paper msgid "media-type.com.hp.mid-weight" -msgstr "" +msgstr "Mittelschweres Papier" #. TRANSLATORS: Inkjet Premium Paper msgid "media-type.com.hp.premium-inkjet" -msgstr "" +msgstr "Premium Inkjet Papier" #. TRANSLATORS: Photo Premium Paper msgid "media-type.com.hp.premium-photo" -msgstr "" +msgstr "Premium Fotopapier" #. TRANSLATORS: Premium Matte Presentation Paper msgid "media-type.com.hp.premium-presentation-matte" -msgstr "" +msgstr "Premium mattes Präsentationspapier" #. TRANSLATORS: Continuous msgid "media-type.continuous" -msgstr "" +msgstr "Endlos" #. TRANSLATORS: Continuous Long msgid "media-type.continuous-long" -msgstr "" +msgstr "Endlos Lang" #. TRANSLATORS: Continuous Short msgid "media-type.continuous-short" -msgstr "" +msgstr "Endlos Kurz" #. TRANSLATORS: Corrugated Board msgid "media-type.corrugated-board" -msgstr "" +msgstr "Geriffelter Karton" #. TRANSLATORS: Optical Disc msgid "media-type.disc" -msgstr "" +msgstr "Optische Scheibe" #. TRANSLATORS: Glossy Optical Disc msgid "media-type.disc-glossy" -msgstr "" +msgstr "Glänzend" #. TRANSLATORS: High Gloss Optical Disc msgid "media-type.disc-high-gloss" -msgstr "" +msgstr "Hochgänzend" #. TRANSLATORS: Matte Optical Disc msgid "media-type.disc-matte" -msgstr "" +msgstr "Matt" #. TRANSLATORS: Satin Optical Disc msgid "media-type.disc-satin" -msgstr "" +msgstr "Satin" #. TRANSLATORS: Semi-Gloss Optical Disc msgid "media-type.disc-semi-gloss" -msgstr "" +msgstr "Halbglänzend" #. TRANSLATORS: Double Wall msgid "media-type.double-wall" @@ -8967,15 +9218,15 @@ #. TRANSLATORS: Dry Film msgid "media-type.dry-film" -msgstr "" +msgstr "trockender Film" #. TRANSLATORS: DVD msgid "media-type.dvd" -msgstr "" +msgstr "DVD" #. TRANSLATORS: Embossing Foil msgid "media-type.embossing-foil" -msgstr "" +msgstr "Prägefolie" #. TRANSLATORS: End Board msgid "media-type.end-board" @@ -8983,11 +9234,11 @@ #. TRANSLATORS: Envelope msgid "media-type.envelope" -msgstr "" +msgstr "Umschlag" #. TRANSLATORS: Archival Envelope msgid "media-type.envelope-archival" -msgstr "" +msgstr "Umschlag archivfähig" #. TRANSLATORS: Bond Envelope msgid "media-type.envelope-bond" @@ -8995,71 +9246,71 @@ #. TRANSLATORS: Coated Envelope msgid "media-type.envelope-coated" -msgstr "" +msgstr "Beschichteter Umschlag" #. TRANSLATORS: Cotton Envelope msgid "media-type.envelope-cotton" -msgstr "" +msgstr "Baumwollumschlag" #. TRANSLATORS: Fine Envelope msgid "media-type.envelope-fine" -msgstr "" +msgstr "Feiner Umschlag" #. TRANSLATORS: Heavyweight Envelope msgid "media-type.envelope-heavyweight" -msgstr "" +msgstr "schwerer Umschlag" #. TRANSLATORS: Inkjet Envelope msgid "media-type.envelope-inkjet" -msgstr "" +msgstr "Inkjet Umschlag" #. TRANSLATORS: Lightweight Envelope msgid "media-type.envelope-lightweight" -msgstr "" +msgstr "Leichter Umschlag" #. TRANSLATORS: Plain Envelope msgid "media-type.envelope-plain" -msgstr "" +msgstr "blanko Umschlag" #. TRANSLATORS: Preprinted Envelope msgid "media-type.envelope-preprinted" -msgstr "" +msgstr "vorbedruckter Umschlag" #. TRANSLATORS: Windowed Envelope msgid "media-type.envelope-window" -msgstr "" +msgstr "Fensterumschlag" #. TRANSLATORS: Fabric msgid "media-type.fabric" -msgstr "" +msgstr "Gewebe" #. TRANSLATORS: Archival Fabric msgid "media-type.fabric-archival" -msgstr "" +msgstr "Gewebe archivfähig" #. TRANSLATORS: Glossy Fabric msgid "media-type.fabric-glossy" -msgstr "" +msgstr "Glänzendes Gewebe" #. TRANSLATORS: High Gloss Fabric msgid "media-type.fabric-high-gloss" -msgstr "" +msgstr "Hochglanzgewebe" #. TRANSLATORS: Matte Fabric msgid "media-type.fabric-matte" -msgstr "" +msgstr "Mattes Gewebe" #. TRANSLATORS: Semi-Gloss Fabric msgid "media-type.fabric-semi-gloss" -msgstr "" +msgstr "Halbglänzendes Gewebe" #. TRANSLATORS: Waterproof Fabric msgid "media-type.fabric-waterproof" -msgstr "" +msgstr "Wasserfestes Gewebe" #. TRANSLATORS: Film msgid "media-type.film" -msgstr "" +msgstr "Film" #. TRANSLATORS: Flexo Base msgid "media-type.flexo-base" @@ -9067,7 +9318,7 @@ #. TRANSLATORS: Flexo Photo Polymer msgid "media-type.flexo-photo-polymer" -msgstr "" +msgstr "Flexo-Fotopolymer" #. TRANSLATORS: Flute msgid "media-type.flute" @@ -9075,7 +9326,7 @@ #. TRANSLATORS: Foil msgid "media-type.foil" -msgstr "" +msgstr "Folie" #. TRANSLATORS: Full Cut Tabs msgid "media-type.full-cut-tabs" @@ -9083,131 +9334,131 @@ #. TRANSLATORS: Glass msgid "media-type.glass" -msgstr "" +msgstr "Glas" #. TRANSLATORS: Glass Colored msgid "media-type.glass-colored" -msgstr "" +msgstr "farbiges Glas" #. TRANSLATORS: Glass Opaque msgid "media-type.glass-opaque" -msgstr "" +msgstr "opakes Glas" #. TRANSLATORS: Glass Surfaced msgid "media-type.glass-surfaced" -msgstr "" +msgstr "Mit Glas überzogen" #. TRANSLATORS: Glass Textured msgid "media-type.glass-textured" -msgstr "" +msgstr "Texturiertes Glas" #. TRANSLATORS: Gravure Cylinder msgid "media-type.gravure-cylinder" -msgstr "" +msgstr "Gravurtrommel" #. TRANSLATORS: Image Setter Paper msgid "media-type.image-setter-paper" -msgstr "" +msgstr "Belichterpapier" #. TRANSLATORS: Imaging Cylinder msgid "media-type.imaging-cylinder" -msgstr "" +msgstr "Bildtrommel" #. TRANSLATORS: Photo Paper Plus Glossy II msgid "media-type.jp.co.canon-photo-paper-plus-glossy-ii" -msgstr "" +msgstr "Fotopapier Plus Glossy II" #. TRANSLATORS: Photo Paper Pro Platinum msgid "media-type.jp.co.canon-photo-paper-pro-platinum" -msgstr "" +msgstr "Fotopapier Pro Platinum" #. TRANSLATORS: Photo Paper Plus Glossy II msgid "media-type.jp.co.canon_photo-paper-plus-glossy-ii" -msgstr "" +msgstr "Fotopapier Plus Glossy I" #. TRANSLATORS: Photo Paper Pro Platinum msgid "media-type.jp.co.canon_photo-paper-pro-platinum" -msgstr "" +msgstr "Fotopapier Pro Platinum" #. TRANSLATORS: Labels msgid "media-type.labels" -msgstr "" +msgstr "Aufkleber" #. TRANSLATORS: Colored Labels msgid "media-type.labels-colored" -msgstr "" +msgstr "farbige Aufkleber" #. TRANSLATORS: Glossy Labels msgid "media-type.labels-glossy" -msgstr "" +msgstr "glänzende Aufkleber" #. TRANSLATORS: High Gloss Labels msgid "media-type.labels-high-gloss" -msgstr "" +msgstr "hochglanz Aufkleber" #. TRANSLATORS: Inkjet Labels msgid "media-type.labels-inkjet" -msgstr "" +msgstr "Inkjet Aufkleber" #. TRANSLATORS: Matte Labels msgid "media-type.labels-matte" -msgstr "" +msgstr "Aufkleber matt" #. TRANSLATORS: Permanent Labels msgid "media-type.labels-permanent" -msgstr "" +msgstr "permanente Aufkleber" #. TRANSLATORS: Satin Labels msgid "media-type.labels-satin" -msgstr "" +msgstr "Satin Aufkleber" #. TRANSLATORS: Security Labels msgid "media-type.labels-security" -msgstr "" +msgstr "Sicherheitsaufkleber" #. TRANSLATORS: Semi-Gloss Labels msgid "media-type.labels-semi-gloss" -msgstr "" +msgstr "Seidenmatte Aufkleber" #. TRANSLATORS: Laminating Foil msgid "media-type.laminating-foil" -msgstr "" +msgstr "Laminatfolie" #. TRANSLATORS: Letterhead msgid "media-type.letterhead" -msgstr "" +msgstr "Briefkopf" #. TRANSLATORS: Metal msgid "media-type.metal" -msgstr "" +msgstr "Metall" #. TRANSLATORS: Metal Glossy msgid "media-type.metal-glossy" -msgstr "" +msgstr "glänzendes Metall" #. TRANSLATORS: Metal High Gloss msgid "media-type.metal-high-gloss" -msgstr "" +msgstr "Hochglanz Metall" #. TRANSLATORS: Metal Matte msgid "media-type.metal-matte" -msgstr "" +msgstr "Mattes Metall" #. TRANSLATORS: Metal Satin msgid "media-type.metal-satin" -msgstr "" +msgstr "Seidenglanz Metall" #. TRANSLATORS: Metal Semi Gloss msgid "media-type.metal-semi-gloss" -msgstr "" +msgstr "Halbglänzendes Metall" #. TRANSLATORS: Mounting Tape msgid "media-type.mounting-tape" -msgstr "" +msgstr "Befestigungsband" #. TRANSLATORS: Multi Layer msgid "media-type.multi-layer" -msgstr "" +msgstr "Mehrlagig" #. TRANSLATORS: Multi Part Form msgid "media-type.multi-part-form" @@ -9215,75 +9466,75 @@ #. TRANSLATORS: Other msgid "media-type.other" -msgstr "" +msgstr "Andere" #. TRANSLATORS: Paper msgid "media-type.paper" -msgstr "" +msgstr "Papier" #. TRANSLATORS: Photo Paper msgid "media-type.photographic" -msgstr "" +msgstr "Fotopapier" #. TRANSLATORS: Photographic Archival msgid "media-type.photographic-archival" -msgstr "" +msgstr "Fotopapier archivfähig" #. TRANSLATORS: Photo Film msgid "media-type.photographic-film" -msgstr "" +msgstr "Fotofilm" #. TRANSLATORS: Glossy Photo Paper msgid "media-type.photographic-glossy" -msgstr "" +msgstr "Fotopapier glänzend" #. TRANSLATORS: High Gloss Photo Paper msgid "media-type.photographic-high-gloss" -msgstr "" +msgstr "Fotopapier hochglänzend" #. TRANSLATORS: Matte Photo Paper msgid "media-type.photographic-matte" -msgstr "" +msgstr "Fotopapier matt" #. TRANSLATORS: Satin Photo Paper msgid "media-type.photographic-satin" -msgstr "" +msgstr "Fotopapier satin" #. TRANSLATORS: Semi-Gloss Photo Paper msgid "media-type.photographic-semi-gloss" -msgstr "" +msgstr "Foropapier halbglänzend" #. TRANSLATORS: Plastic msgid "media-type.plastic" -msgstr "" +msgstr "Kunststoff" #. TRANSLATORS: Plastic Archival msgid "media-type.plastic-archival" -msgstr "" +msgstr "Kunststoff archivfähig" #. TRANSLATORS: Plastic Colored msgid "media-type.plastic-colored" -msgstr "" +msgstr "Kunststoff gefärbt" #. TRANSLATORS: Plastic Glossy msgid "media-type.plastic-glossy" -msgstr "" +msgstr "Kunststoff glänzend" #. TRANSLATORS: Plastic High Gloss msgid "media-type.plastic-high-gloss" -msgstr "" +msgstr "Kunststoff hochglanz" #. TRANSLATORS: Plastic Matte msgid "media-type.plastic-matte" -msgstr "" +msgstr "Kunststoff matt" #. TRANSLATORS: Plastic Satin msgid "media-type.plastic-satin" -msgstr "" +msgstr "Kunststoff satin" #. TRANSLATORS: Plastic Semi Gloss msgid "media-type.plastic-semi-gloss" -msgstr "" +msgstr "Kunststoff halbglänzend" #. TRANSLATORS: Plate msgid "media-type.plate" @@ -9291,7 +9542,7 @@ #. TRANSLATORS: Polyester msgid "media-type.polyester" -msgstr "" +msgstr "PE" #. TRANSLATORS: Pre Cut Tabs msgid "media-type.pre-cut-tabs" @@ -9299,11 +9550,11 @@ #. TRANSLATORS: Roll msgid "media-type.roll" -msgstr "" +msgstr "Rolle" #. TRANSLATORS: Screen msgid "media-type.screen" -msgstr "" +msgstr "Bildschirm" #. TRANSLATORS: Screen Paged msgid "media-type.screen-paged" @@ -9311,15 +9562,15 @@ #. TRANSLATORS: Self Adhesive msgid "media-type.self-adhesive" -msgstr "" +msgstr "Selbstklebend" #. TRANSLATORS: Self Adhesive Film msgid "media-type.self-adhesive-film" -msgstr "" +msgstr "Selbstklebende Folie" #. TRANSLATORS: Shrink Foil msgid "media-type.shrink-foil" -msgstr "" +msgstr "Schrumpffolie" #. TRANSLATORS: Single Face msgid "media-type.single-face" @@ -9335,51 +9586,51 @@ #. TRANSLATORS: Stationery msgid "media-type.stationery" -msgstr "" +msgstr "Normalpapier" #. TRANSLATORS: Stationery Archival msgid "media-type.stationery-archival" -msgstr "" +msgstr "Normalpapier archivfähig" #. TRANSLATORS: Coated Paper msgid "media-type.stationery-coated" -msgstr "" +msgstr "beschichtetes Papier" #. TRANSLATORS: Stationery Cotton msgid "media-type.stationery-cotton" -msgstr "" +msgstr "Normalpapier Baumwolle" #. TRANSLATORS: Vellum Paper msgid "media-type.stationery-fine" -msgstr "" +msgstr "Pergamentpapier" #. TRANSLATORS: Heavyweight Paper msgid "media-type.stationery-heavyweight" -msgstr "" +msgstr "schweres Papier" #. TRANSLATORS: Stationery Heavyweight Coated msgid "media-type.stationery-heavyweight-coated" -msgstr "" +msgstr "schweres, beschichtetes Normalpapier" #. TRANSLATORS: Stationery Inkjet Paper msgid "media-type.stationery-inkjet" -msgstr "" +msgstr "Tintenstrahl-Normalpapier" #. TRANSLATORS: Letterhead msgid "media-type.stationery-letterhead" -msgstr "" +msgstr "Briefkopf" #. TRANSLATORS: Lightweight Paper msgid "media-type.stationery-lightweight" -msgstr "" +msgstr "leichtes Papier" #. TRANSLATORS: Preprinted Paper msgid "media-type.stationery-preprinted" -msgstr "" +msgstr "vorbedrucktes Papier" #. TRANSLATORS: Punched Paper msgid "media-type.stationery-prepunched" -msgstr "" +msgstr "gelochtes Papier" #. TRANSLATORS: Tab Stock msgid "media-type.tab-stock" @@ -9395,823 +9646,823 @@ #. TRANSLATORS: Transparency msgid "media-type.transparency" -msgstr "" +msgstr "Transparentfolie" #. TRANSLATORS: Triple Wall msgid "media-type.triple-wall" -msgstr "" +msgstr "Dreilagenpapier" #. TRANSLATORS: Wet Film msgid "media-type.wet-film" -msgstr "" +msgstr "Nassfilm" #. TRANSLATORS: Media Weight (grams per m²) msgid "media-weight-metric" -msgstr "" +msgstr "spezifisches Mediengewicht (g/m²)" #. TRANSLATORS: 28 x 40″ msgid "media.asme_f_28x40in" -msgstr "" +msgstr "20×40" #. TRANSLATORS: A4 or US Letter msgid "media.choice_iso_a4_210x297mm_na_letter_8.5x11in" -msgstr "" +msgstr "A4 oder US Letter" #. TRANSLATORS: 2a0 msgid "media.iso_2a0_1189x1682mm" -msgstr "" +msgstr "2A0" #. TRANSLATORS: A0 msgid "media.iso_a0_841x1189mm" -msgstr "" +msgstr "A0" #. TRANSLATORS: A0x3 msgid "media.iso_a0x3_1189x2523mm" -msgstr "" +msgstr "A0x3" #. TRANSLATORS: A10 msgid "media.iso_a10_26x37mm" -msgstr "" +msgstr "A10" #. TRANSLATORS: A1 msgid "media.iso_a1_594x841mm" -msgstr "" +msgstr "A1" #. TRANSLATORS: A1x3 msgid "media.iso_a1x3_841x1783mm" -msgstr "" +msgstr "A1x3" #. TRANSLATORS: A1x4 msgid "media.iso_a1x4_841x2378mm" -msgstr "" +msgstr "A1x4" #. TRANSLATORS: A2 msgid "media.iso_a2_420x594mm" -msgstr "" +msgstr "A2" #. TRANSLATORS: A2x3 msgid "media.iso_a2x3_594x1261mm" -msgstr "" +msgstr "A2x3" #. TRANSLATORS: A2x4 msgid "media.iso_a2x4_594x1682mm" -msgstr "" +msgstr "A2x4" #. TRANSLATORS: A2x5 msgid "media.iso_a2x5_594x2102mm" -msgstr "" +msgstr "A2x5" #. TRANSLATORS: A3 (Extra) msgid "media.iso_a3-extra_322x445mm" -msgstr "" +msgstr "A3 extra" #. TRANSLATORS: A3 msgid "media.iso_a3_297x420mm" -msgstr "" +msgstr "A3" #. TRANSLATORS: A3x3 msgid "media.iso_a3x3_420x891mm" -msgstr "" +msgstr "A3x3" #. TRANSLATORS: A3x4 msgid "media.iso_a3x4_420x1189mm" -msgstr "" +msgstr "A3x4" #. TRANSLATORS: A3x5 msgid "media.iso_a3x5_420x1486mm" -msgstr "" +msgstr "A3x5" #. TRANSLATORS: A3x6 msgid "media.iso_a3x6_420x1783mm" -msgstr "" +msgstr "A3x6" #. TRANSLATORS: A3x7 msgid "media.iso_a3x7_420x2080mm" -msgstr "" +msgstr "A3x7" #. TRANSLATORS: A4 (Extra) msgid "media.iso_a4-extra_235.5x322.3mm" -msgstr "" +msgstr "A4 extra" #. TRANSLATORS: A4 (Tab) msgid "media.iso_a4-tab_225x297mm" -msgstr "" +msgstr "A4 tag" #. TRANSLATORS: A4 msgid "media.iso_a4_210x297mm" -msgstr "" +msgstr "A4" #. TRANSLATORS: A4x3 msgid "media.iso_a4x3_297x630mm" -msgstr "" +msgstr "A4x3" #. TRANSLATORS: A4x4 msgid "media.iso_a4x4_297x841mm" -msgstr "" +msgstr "A4x4" #. TRANSLATORS: A4x5 msgid "media.iso_a4x5_297x1051mm" -msgstr "" +msgstr "A4x5" #. TRANSLATORS: A4x6 msgid "media.iso_a4x6_297x1261mm" -msgstr "" +msgstr "A5x6" #. TRANSLATORS: A4x7 msgid "media.iso_a4x7_297x1471mm" -msgstr "" +msgstr "A4x7" #. TRANSLATORS: A4x8 msgid "media.iso_a4x8_297x1682mm" -msgstr "" +msgstr "A4x8" #. TRANSLATORS: A4x9 msgid "media.iso_a4x9_297x1892mm" -msgstr "" +msgstr "A4x9" #. TRANSLATORS: A5 (Extra) msgid "media.iso_a5-extra_174x235mm" -msgstr "" +msgstr "A5 extra" #. TRANSLATORS: A5 msgid "media.iso_a5_148x210mm" -msgstr "" +msgstr "A5" #. TRANSLATORS: A6 msgid "media.iso_a6_105x148mm" -msgstr "" +msgstr "A6" #. TRANSLATORS: A7 msgid "media.iso_a7_74x105mm" -msgstr "" +msgstr "A7" #. TRANSLATORS: A8 msgid "media.iso_a8_52x74mm" -msgstr "" +msgstr "A8" #. TRANSLATORS: A9 msgid "media.iso_a9_37x52mm" -msgstr "" +msgstr "A9" #. TRANSLATORS: B0 msgid "media.iso_b0_1000x1414mm" -msgstr "" +msgstr "B0" #. TRANSLATORS: B10 msgid "media.iso_b10_31x44mm" -msgstr "" +msgstr "B10" #. TRANSLATORS: B1 msgid "media.iso_b1_707x1000mm" -msgstr "" +msgstr "B1" #. TRANSLATORS: B2 msgid "media.iso_b2_500x707mm" -msgstr "" +msgstr "B2" #. TRANSLATORS: B3 msgid "media.iso_b3_353x500mm" -msgstr "" +msgstr "B3" #. TRANSLATORS: B4 msgid "media.iso_b4_250x353mm" -msgstr "" +msgstr "B4" #. TRANSLATORS: B5 (Extra) msgid "media.iso_b5-extra_201x276mm" -msgstr "" +msgstr "B5 extra" #. TRANSLATORS: Envelope B5 msgid "media.iso_b5_176x250mm" -msgstr "" +msgstr "Umschlag B5" #. TRANSLATORS: B6 msgid "media.iso_b6_125x176mm" -msgstr "" +msgstr "B6" #. TRANSLATORS: Envelope B6/C4 msgid "media.iso_b6c4_125x324mm" -msgstr "" +msgstr "Umschlag B6/C4" #. TRANSLATORS: B7 msgid "media.iso_b7_88x125mm" -msgstr "" +msgstr "B7" #. TRANSLATORS: B8 msgid "media.iso_b8_62x88mm" -msgstr "" +msgstr "B8" #. TRANSLATORS: B9 msgid "media.iso_b9_44x62mm" -msgstr "" +msgstr "B9" #. TRANSLATORS: CEnvelope 0 msgid "media.iso_c0_917x1297mm" -msgstr "" +msgstr "Umschlag C0" #. TRANSLATORS: CEnvelope 10 msgid "media.iso_c10_28x40mm" -msgstr "" +msgstr "Umschlag C10" #. TRANSLATORS: CEnvelope 1 msgid "media.iso_c1_648x917mm" -msgstr "" +msgstr "Umschlag C1" #. TRANSLATORS: CEnvelope 2 msgid "media.iso_c2_458x648mm" -msgstr "" +msgstr "Umschlag C2" #. TRANSLATORS: CEnvelope 3 msgid "media.iso_c3_324x458mm" -msgstr "" +msgstr "Umschlag C3" #. TRANSLATORS: CEnvelope 4 msgid "media.iso_c4_229x324mm" -msgstr "" +msgstr "Umschlag C4" #. TRANSLATORS: CEnvelope 5 msgid "media.iso_c5_162x229mm" -msgstr "" +msgstr "Umschlag C5" #. TRANSLATORS: CEnvelope 6 msgid "media.iso_c6_114x162mm" -msgstr "" +msgstr "Umschlag C6" #. TRANSLATORS: CEnvelope 6c5 msgid "media.iso_c6c5_114x229mm" -msgstr "" +msgstr "Umschlag 6C5" #. TRANSLATORS: CEnvelope 7 msgid "media.iso_c7_81x114mm" -msgstr "" +msgstr "Umschlag C7" #. TRANSLATORS: CEnvelope 7c6 msgid "media.iso_c7c6_81x162mm" -msgstr "" +msgstr "Umschlag 7C6" #. TRANSLATORS: CEnvelope 8 msgid "media.iso_c8_57x81mm" -msgstr "" +msgstr "Umschlag C8" #. TRANSLATORS: CEnvelope 9 msgid "media.iso_c9_40x57mm" -msgstr "" +msgstr "Umschlag C9" #. TRANSLATORS: Envelope DL msgid "media.iso_dl_110x220mm" -msgstr "" +msgstr "Umschlag DL" #. TRANSLATORS: Id-1 msgid "media.iso_id-1_53.98x85.6mm" -msgstr "" +msgstr "ID-1" #. TRANSLATORS: Id-3 msgid "media.iso_id-3_88x125mm" -msgstr "" +msgstr "ID-3" #. TRANSLATORS: ISO RA0 msgid "media.iso_ra0_860x1220mm" -msgstr "" +msgstr "ISO RA0" #. TRANSLATORS: ISO RA1 msgid "media.iso_ra1_610x860mm" -msgstr "" +msgstr "ISO RA1" #. TRANSLATORS: ISO RA2 msgid "media.iso_ra2_430x610mm" -msgstr "" +msgstr "ISO RA2" #. TRANSLATORS: ISO RA3 msgid "media.iso_ra3_305x430mm" -msgstr "" +msgstr "ISO RA3" #. TRANSLATORS: ISO RA4 msgid "media.iso_ra4_215x305mm" -msgstr "" +msgstr "ISO RA4" #. TRANSLATORS: ISO SRA0 msgid "media.iso_sra0_900x1280mm" -msgstr "" +msgstr "ISO SRA0" #. TRANSLATORS: ISO SRA1 msgid "media.iso_sra1_640x900mm" -msgstr "" +msgstr "ISO SRA1" #. TRANSLATORS: ISO SRA2 msgid "media.iso_sra2_450x640mm" -msgstr "" +msgstr "ISO SRA2" #. TRANSLATORS: ISO SRA3 msgid "media.iso_sra3_320x450mm" -msgstr "" +msgstr "ISO SRA3" #. TRANSLATORS: ISO SRA4 msgid "media.iso_sra4_225x320mm" -msgstr "" +msgstr "ISO SRA4" #. TRANSLATORS: JIS B0 msgid "media.jis_b0_1030x1456mm" -msgstr "" +msgstr "JIS B0" #. TRANSLATORS: JIS B10 msgid "media.jis_b10_32x45mm" -msgstr "" +msgstr "JIS B10" #. TRANSLATORS: JIS B1 msgid "media.jis_b1_728x1030mm" -msgstr "" +msgstr "JIS B1" #. TRANSLATORS: JIS B2 msgid "media.jis_b2_515x728mm" -msgstr "" +msgstr "JIS B2" #. TRANSLATORS: JIS B3 msgid "media.jis_b3_364x515mm" -msgstr "" +msgstr "JIS B3" #. TRANSLATORS: JIS B4 msgid "media.jis_b4_257x364mm" -msgstr "" +msgstr "JIS B4" #. TRANSLATORS: JIS B5 msgid "media.jis_b5_182x257mm" -msgstr "" +msgstr "JIS B5" #. TRANSLATORS: JIS B6 msgid "media.jis_b6_128x182mm" -msgstr "" +msgstr "JIS B6" #. TRANSLATORS: JIS B7 msgid "media.jis_b7_91x128mm" -msgstr "" +msgstr "JIS B7" #. TRANSLATORS: JIS B8 msgid "media.jis_b8_64x91mm" -msgstr "" +msgstr "JIS B8" #. TRANSLATORS: JIS B9 msgid "media.jis_b9_45x64mm" -msgstr "" +msgstr "JIS B9" #. TRANSLATORS: JIS Executive msgid "media.jis_exec_216x330mm" -msgstr "" +msgstr "JIS Executive" #. TRANSLATORS: Envelope Chou 2 msgid "media.jpn_chou2_111.1x146mm" -msgstr "" +msgstr "Umschlag Chou 2" #. TRANSLATORS: Envelope Chou 3 msgid "media.jpn_chou3_120x235mm" -msgstr "" +msgstr "Umschlag Chou 3" #. TRANSLATORS: Envelope Chou 40 msgid "media.jpn_chou40_90x225mm" -msgstr "" +msgstr "Umschlag Chou 40" #. TRANSLATORS: Envelope Chou 4 msgid "media.jpn_chou4_90x205mm" -msgstr "" +msgstr "Umschlag Chou 4" #. TRANSLATORS: Hagaki msgid "media.jpn_hagaki_100x148mm" -msgstr "" +msgstr "Hagaki" #. TRANSLATORS: Envelope Kahu msgid "media.jpn_kahu_240x322.1mm" -msgstr "" +msgstr "Umschlag Kahu 240×322 mm" #. TRANSLATORS: 270 x 382mm msgid "media.jpn_kaku1_270x382mm" -msgstr "" +msgstr "Umschlag Kahu 270×382 mm" #. TRANSLATORS: Envelope Kahu 2 msgid "media.jpn_kaku2_240x332mm" -msgstr "" +msgstr "Umschlag Kahu 240×332 mm" #. TRANSLATORS: 216 x 277mm msgid "media.jpn_kaku3_216x277mm" -msgstr "" +msgstr "Umschlag Kahu 216×277 mm" #. TRANSLATORS: 197 x 267mm msgid "media.jpn_kaku4_197x267mm" -msgstr "" +msgstr "Umschlag Kahu 197×297 mm" #. TRANSLATORS: 190 x 240mm msgid "media.jpn_kaku5_190x240mm" -msgstr "" +msgstr "Umschlag Kahu 190×240 mm" #. TRANSLATORS: 142 x 205mm msgid "media.jpn_kaku7_142x205mm" -msgstr "" +msgstr "Umschlag Kahu 142×205 mm" #. TRANSLATORS: 119 x 197mm msgid "media.jpn_kaku8_119x197mm" -msgstr "" +msgstr "Umschlag Kahu 119×197 mm" #. TRANSLATORS: Oufuku Reply Postcard msgid "media.jpn_oufuku_148x200mm" -msgstr "" +msgstr "Oufuku Postkarte" #. TRANSLATORS: Envelope You 4 msgid "media.jpn_you4_105x235mm" -msgstr "" +msgstr "Umschlag You 4" #. TRANSLATORS: 10 x 11″ msgid "media.na_10x11_10x11in" -msgstr "" +msgstr "10×11 inch" #. TRANSLATORS: 10 x 13″ msgid "media.na_10x13_10x13in" -msgstr "" +msgstr "10×13 inch" #. TRANSLATORS: 10 x 14″ msgid "media.na_10x14_10x14in" -msgstr "" +msgstr "10×14 inch" #. TRANSLATORS: 10 x 15″ msgid "media.na_10x15_10x15in" -msgstr "" +msgstr "10×15 inch" #. TRANSLATORS: 11 x 12″ msgid "media.na_11x12_11x12in" -msgstr "" +msgstr "10×12 inch" #. TRANSLATORS: 11 x 15″ msgid "media.na_11x15_11x15in" -msgstr "" +msgstr "11×15 inch" #. TRANSLATORS: 12 x 19″ msgid "media.na_12x19_12x19in" -msgstr "" +msgstr "12×19 inch" #. TRANSLATORS: 5 x 7″ msgid "media.na_5x7_5x7in" -msgstr "" +msgstr "5×7 inch" #. TRANSLATORS: 6 x 9″ msgid "media.na_6x9_6x9in" -msgstr "" +msgstr "6×9 inch" #. TRANSLATORS: 7 x 9″ msgid "media.na_7x9_7x9in" -msgstr "" +msgstr "7×9 inch" #. TRANSLATORS: 9 x 11″ msgid "media.na_9x11_9x11in" -msgstr "" +msgstr "9×11 inch" #. TRANSLATORS: Envelope A2 msgid "media.na_a2_4.375x5.75in" -msgstr "" +msgstr "Umschlag A2" #. TRANSLATORS: 9 x 12″ msgid "media.na_arch-a_9x12in" -msgstr "" +msgstr "9×12 inch" #. TRANSLATORS: 12 x 18″ msgid "media.na_arch-b_12x18in" -msgstr "" +msgstr "12×18 inch" #. TRANSLATORS: 18 x 24″ msgid "media.na_arch-c_18x24in" -msgstr "" +msgstr "18×24 inch" #. TRANSLATORS: 24 x 36″ msgid "media.na_arch-d_24x36in" -msgstr "" +msgstr "24×36 inch" #. TRANSLATORS: 26 x 38″ msgid "media.na_arch-e2_26x38in" -msgstr "" +msgstr "26×38 inch" #. TRANSLATORS: 27 x 39″ msgid "media.na_arch-e3_27x39in" -msgstr "" +msgstr "27×39 inch" #. TRANSLATORS: 36 x 48″ msgid "media.na_arch-e_36x48in" -msgstr "" +msgstr "36×48 inch" #. TRANSLATORS: 12 x 19.17″ msgid "media.na_b-plus_12x19.17in" -msgstr "" +msgstr "Bplus 12×19 inch" #. TRANSLATORS: Envelope C5 msgid "media.na_c5_6.5x9.5in" -msgstr "" +msgstr "C5 6,5×9,5 inch" #. TRANSLATORS: 17 x 22″ msgid "media.na_c_17x22in" -msgstr "" +msgstr "17×22 inch" #. TRANSLATORS: 22 x 34″ msgid "media.na_d_22x34in" -msgstr "" +msgstr "22×34 inch" #. TRANSLATORS: 34 x 44″ msgid "media.na_e_34x44in" -msgstr "" +msgstr "34×44 inch" #. TRANSLATORS: 11 x 14″ msgid "media.na_edp_11x14in" -msgstr "" +msgstr "11×14 inch" #. TRANSLATORS: 12 x 14″ msgid "media.na_eur-edp_12x14in" -msgstr "" +msgstr "12×14 inch" #. TRANSLATORS: Executive msgid "media.na_executive_7.25x10.5in" -msgstr "" +msgstr "Executive 7,25×10,5 inch" #. TRANSLATORS: 44 x 68″ msgid "media.na_f_44x68in" -msgstr "" +msgstr "44×68 inch" #. TRANSLATORS: European Fanfold msgid "media.na_fanfold-eur_8.5x12in" -msgstr "" +msgstr "8,5×12 inch" #. TRANSLATORS: US Fanfold msgid "media.na_fanfold-us_11x14.875in" -msgstr "" +msgstr "11×14,875 inch" #. TRANSLATORS: Foolscap msgid "media.na_foolscap_8.5x13in" -msgstr "" +msgstr "8,5×13 inch" #. TRANSLATORS: 8 x 13″ msgid "media.na_govt-legal_8x13in" -msgstr "" +msgstr "8×13 inch" #. TRANSLATORS: 8 x 10″ msgid "media.na_govt-letter_8x10in" -msgstr "" +msgstr "Letter 8×10 inch" #. TRANSLATORS: 3 x 5″ msgid "media.na_index-3x5_3x5in" -msgstr "" +msgstr "Index 3×5 inch" #. TRANSLATORS: 6 x 8″ msgid "media.na_index-4x6-ext_6x8in" -msgstr "" +msgstr "Index 4×6,6×8 inch" #. TRANSLATORS: 4 x 6″ msgid "media.na_index-4x6_4x6in" -msgstr "" +msgstr "Index 4×6 inch" #. TRANSLATORS: 5 x 8″ msgid "media.na_index-5x8_5x8in" -msgstr "" +msgstr "Index 5×8 inch" #. TRANSLATORS: Statement msgid "media.na_invoice_5.5x8.5in" -msgstr "" +msgstr "Invoice 5,5×8,5 inch" #. TRANSLATORS: 11 x 17″ msgid "media.na_ledger_11x17in" -msgstr "" +msgstr "Ledger 11×17 inch" #. TRANSLATORS: US Legal (Extra) msgid "media.na_legal-extra_9.5x15in" -msgstr "" +msgstr "Legal Extra 9,5×15 inch" #. TRANSLATORS: US Legal msgid "media.na_legal_8.5x14in" -msgstr "" +msgstr "Legal 8,5×14 inch" #. TRANSLATORS: US Letter (Extra) msgid "media.na_letter-extra_9.5x12in" -msgstr "" +msgstr "Letter Extra 9,5×12 inch" #. TRANSLATORS: US Letter (Plus) msgid "media.na_letter-plus_8.5x12.69in" -msgstr "" +msgstr "Letter Plus 8,5×12,69 inch" #. TRANSLATORS: US Letter msgid "media.na_letter_8.5x11in" -msgstr "" +msgstr "US Letter" #. TRANSLATORS: Envelope Monarch msgid "media.na_monarch_3.875x7.5in" -msgstr "" +msgstr "Umschlag Monarch" #. TRANSLATORS: Envelope #10 msgid "media.na_number-10_4.125x9.5in" -msgstr "" +msgstr "Umschlag #10" #. TRANSLATORS: Envelope #11 msgid "media.na_number-11_4.5x10.375in" -msgstr "" +msgstr "Umschlag #11" #. TRANSLATORS: Envelope #12 msgid "media.na_number-12_4.75x11in" -msgstr "" +msgstr "Umschlag #12" #. TRANSLATORS: Envelope #14 msgid "media.na_number-14_5x11.5in" -msgstr "" +msgstr "Umschlag #14" #. TRANSLATORS: Envelope #9 msgid "media.na_number-9_3.875x8.875in" -msgstr "" +msgstr "Umschlag #9" #. TRANSLATORS: 8.5 x 13.4″ msgid "media.na_oficio_8.5x13.4in" -msgstr "" +msgstr "8,5×13,4 inch" #. TRANSLATORS: Envelope Personal msgid "media.na_personal_3.625x6.5in" -msgstr "" +msgstr "3,625×6,5 inch" #. TRANSLATORS: Quarto msgid "media.na_quarto_8.5x10.83in" -msgstr "" +msgstr "Quadro" #. TRANSLATORS: 8.94 x 14″ msgid "media.na_super-a_8.94x14in" -msgstr "" +msgstr "8,94×14 inch" #. TRANSLATORS: 13 x 19″ msgid "media.na_super-b_13x19in" -msgstr "" +msgstr "13×19 inch" #. TRANSLATORS: 30 x 42″ msgid "media.na_wide-format_30x42in" -msgstr "" +msgstr "30×42 inch" #. TRANSLATORS: 12 x 16″ msgid "media.oe_12x16_12x16in" -msgstr "" +msgstr "12×16 inch" #. TRANSLATORS: 14 x 17″ msgid "media.oe_14x17_14x17in" -msgstr "" +msgstr "14×17 inch" #. TRANSLATORS: 18 x 22″ msgid "media.oe_18x22_18x22in" -msgstr "" +msgstr "18×22 inch" #. TRANSLATORS: 17 x 24″ msgid "media.oe_a2plus_17x24in" -msgstr "" +msgstr "17×24 inch" #. TRANSLATORS: 2 x 3.5″ msgid "media.oe_business-card_2x3.5in" -msgstr "" +msgstr "Visitenkarte 2×3,5 inch" #. TRANSLATORS: 10 x 12″ msgid "media.oe_photo-10r_10x12in" -msgstr "" +msgstr "10×12 inch" #. TRANSLATORS: 20 x 24″ msgid "media.oe_photo-20r_20x24in" -msgstr "" +msgstr "20×24 inch" #. TRANSLATORS: 3.5 x 5″ msgid "media.oe_photo-l_3.5x5in" -msgstr "" +msgstr "3,5×5 inch" #. TRANSLATORS: 10 x 15″ msgid "media.oe_photo-s10r_10x15in" -msgstr "" +msgstr "10×15 inch" #. TRANSLATORS: 4 x 4″ msgid "media.oe_square-photo_4x4in" -msgstr "" +msgstr "4×4 inch" #. TRANSLATORS: 5 x 5″ msgid "media.oe_square-photo_5x5in" -msgstr "" +msgstr "5×5 inch" #. TRANSLATORS: 184 x 260mm -msgid "media.om_16k_184x260mm" -msgstr "" +msgid "media.om_16k_184x260 mm" +msgstr "184×260 mm" #. TRANSLATORS: 195 x 270mm -msgid "media.om_16k_195x270mm" -msgstr "" +msgid "media.om_16k_195x270 mm" +msgstr "195×270 mm" #. TRANSLATORS: 55 x 85mm msgid "media.om_business-card_55x85mm" -msgstr "" +msgstr "Visitenkarte 55×85 mm" #. TRANSLATORS: 55 x 91mm msgid "media.om_business-card_55x91mm" -msgstr "" +msgstr "Visitenkarte 55×91 mm" #. TRANSLATORS: 54 x 86mm msgid "media.om_card_54x86mm" -msgstr "" +msgstr "54×86 mm" #. TRANSLATORS: 275 x 395mm msgid "media.om_dai-pa-kai_275x395mm" -msgstr "" +msgstr "275×395 mm" #. TRANSLATORS: 89 x 119mm msgid "media.om_dsc-photo_89x119mm" -msgstr "" +msgstr "89×119 mm" #. TRANSLATORS: Folio msgid "media.om_folio-sp_215x315mm" -msgstr "" +msgstr "Folio (215×315 mm)" #. TRANSLATORS: Folio (Special) msgid "media.om_folio_210x330mm" -msgstr "" +msgstr "Folio spezial (210×330 mm)" #. TRANSLATORS: Envelope Invitation msgid "media.om_invite_220x220mm" -msgstr "" +msgstr "Umschlag Einladung (220×220 mm)" #. TRANSLATORS: Envelope Italian msgid "media.om_italian_110x230mm" -msgstr "" +msgstr "Umschlag italienisch (110×230 mm)" #. TRANSLATORS: 198 x 275mm msgid "media.om_juuro-ku-kai_198x275mm" -msgstr "" +msgstr "KuKai 198×275 mm" #. TRANSLATORS: 200 x 300 msgid "media.om_large-photo_200x300" -msgstr "" +msgstr "Foto 200×300 mm" #. TRANSLATORS: 130 x 180mm msgid "media.om_medium-photo_130x180mm" -msgstr "" +msgstr "Foto 130×180 mm" #. TRANSLATORS: 267 x 389mm msgid "media.om_pa-kai_267x389mm" -msgstr "" +msgstr "267×389 mm" #. TRANSLATORS: Envelope Postfix msgid "media.om_postfix_114x229mm" -msgstr "" +msgstr "114×229 mm" #. TRANSLATORS: 100 x 150mm msgid "media.om_small-photo_100x150mm" -msgstr "" +msgstr "100×150 mm" #. TRANSLATORS: 89 x 89mm msgid "media.om_square-photo_89x89mm" -msgstr "" +msgstr "89 mm quadratisch" #. TRANSLATORS: 100 x 200mm msgid "media.om_wide-photo_100x200mm" -msgstr "" +msgstr "100×200 mm" #. TRANSLATORS: Envelope Chinese #10 msgid "media.prc_10_324x458mm" -msgstr "" +msgstr "Umschlag CN, 324×458 mm" #. TRANSLATORS: Chinese 16k msgid "media.prc_16k_146x215mm" -msgstr "" +msgstr "16k 146×215 mm" #. TRANSLATORS: Envelope Chinese #1 msgid "media.prc_1_102x165mm" -msgstr "" +msgstr "PRC 102×165 mm" #. TRANSLATORS: Envelope Chinese #2 msgid "media.prc_2_102x176mm" -msgstr "" +msgstr "PRC 102×176 mm" #. TRANSLATORS: Chinese 32k msgid "media.prc_32k_97x151mm" -msgstr "" +msgstr "PRC 97×151 mm" #. TRANSLATORS: Envelope Chinese #3 msgid "media.prc_3_125x176mm" -msgstr "" +msgstr "PRC 125×176 mm" #. TRANSLATORS: Envelope Chinese #4 msgid "media.prc_4_110x208mm" -msgstr "" +msgstr "PRC 110×208 mm" #. TRANSLATORS: Envelope Chinese #5 msgid "media.prc_5_110x220mm" -msgstr "" +msgstr "PRC 110×220 mm" #. TRANSLATORS: Envelope Chinese #6 msgid "media.prc_6_120x320mm" -msgstr "" +msgstr "PRC 120×320 mm" #. TRANSLATORS: Envelope Chinese #7 msgid "media.prc_7_160x230mm" -msgstr "" +msgstr "PRC 160×230 mm" #. TRANSLATORS: Envelope Chinese #8 msgid "media.prc_8_120x309mm" -msgstr "" +msgstr "PRC 120×309 mm" #. TRANSLATORS: ROC 16k msgid "media.roc_16k_7.75x10.75in" -msgstr "" +msgstr "ROC 7,75×10,75 inch" #. TRANSLATORS: ROC 8k msgid "media.roc_8k_10.75x15.5in" -msgstr "" +msgstr "ROC 10,75×15,5 inch" #, c-format msgid "members of class %s:" @@ -10219,27 +10470,27 @@ #. TRANSLATORS: Multiple Document Handling msgid "multiple-document-handling" -msgstr "" +msgstr "Behandlung mehrere Dokumente" #. TRANSLATORS: Separate Documents Collated Copies msgid "multiple-document-handling.separate-documents-collated-copies" -msgstr "" +msgstr "gruppierte Kopien" #. TRANSLATORS: Separate Documents Uncollated Copies msgid "multiple-document-handling.separate-documents-uncollated-copies" -msgstr "" +msgstr "ungruppierte Kopien" #. TRANSLATORS: Single Document msgid "multiple-document-handling.single-document" -msgstr "" +msgstr "Dokument einzeln" #. TRANSLATORS: Single Document New Sheet msgid "multiple-document-handling.single-document-new-sheet" -msgstr "" +msgstr "Einzeldokument, neues Blatt" #. TRANSLATORS: Multiple Object Handling msgid "multiple-object-handling" -msgstr "" +msgstr "Handhabung mehrerer Objekte" #. TRANSLATORS: Multiple Object Handling Actual msgid "multiple-object-handling-actual" @@ -10247,152 +10498,152 @@ #. TRANSLATORS: Automatic msgid "multiple-object-handling.auto" -msgstr "" +msgstr "Automatisch" #. TRANSLATORS: Best Fit msgid "multiple-object-handling.best-fit" -msgstr "" +msgstr "beste Anpassung" #. TRANSLATORS: Best Quality msgid "multiple-object-handling.best-quality" -msgstr "" +msgstr "höchste Qualität" #. TRANSLATORS: Best Speed msgid "multiple-object-handling.best-speed" -msgstr "" +msgstr "schnellste Verarbeitung" #. TRANSLATORS: One At A Time msgid "multiple-object-handling.one-at-a-time" -msgstr "" +msgstr "Einzeln" #. TRANSLATORS: On Timeout msgid "multiple-operation-time-out-action" -msgstr "" +msgstr "Bei Zeitüberschreitung" #. TRANSLATORS: Abort Job msgid "multiple-operation-time-out-action.abort-job" -msgstr "" +msgstr "Auftrag abbrechen" #. TRANSLATORS: Hold Job msgid "multiple-operation-time-out-action.hold-job" -msgstr "" +msgstr "Auftrag anhalten" #. TRANSLATORS: Process Job msgid "multiple-operation-time-out-action.process-job" -msgstr "" +msgstr "Auftrag verarbeiten" msgid "no entries" -msgstr "Keine Einträge" +msgstr "keine Einträge" msgid "no system default destination" -msgstr "Keine systemvoreingestellten Ziele" +msgstr "keine systemvoreingestellten Ziele" #. TRANSLATORS: Noise Removal msgid "noise-removal" -msgstr "" +msgstr "Lärmreduziert" #. TRANSLATORS: Notify Attributes msgid "notify-attributes" -msgstr "" +msgstr "Benachrichtigungsattribute" #. TRANSLATORS: Notify Charset msgid "notify-charset" -msgstr "" +msgstr "Benachrichtigungszeichensatz" #. TRANSLATORS: Notify Events msgid "notify-events" -msgstr "" +msgstr "Benachrichtigungsereignisse" msgid "notify-events not specified." -msgstr "" +msgstr "Benachrichtigungsereignisse nicht angegeben." #. TRANSLATORS: Document Completed msgid "notify-events.document-completed" -msgstr "" +msgstr "Dokument fertig" #. TRANSLATORS: Document Config Changed msgid "notify-events.document-config-changed" -msgstr "" +msgstr "Dokumentkonfiguration geändert" #. TRANSLATORS: Document Created msgid "notify-events.document-created" -msgstr "" +msgstr "Dokument erstellt" #. TRANSLATORS: Document Fetchable msgid "notify-events.document-fetchable" -msgstr "" +msgstr "Dokument abholbereit" #. TRANSLATORS: Document State Changed msgid "notify-events.document-state-changed" -msgstr "" +msgstr "Dokumentenstatus geändert" #. TRANSLATORS: Document Stopped msgid "notify-events.document-stopped" -msgstr "" +msgstr "Dokument angehalten" #. TRANSLATORS: Job Completed msgid "notify-events.job-completed" -msgstr "" +msgstr "Auftrag abgeschlossen" #. TRANSLATORS: Job Config Changed msgid "notify-events.job-config-changed" -msgstr "" +msgstr "Auftragskonfiguration geändert" #. TRANSLATORS: Job Created msgid "notify-events.job-created" -msgstr "" +msgstr "Auftrag erstellt" #. TRANSLATORS: Job Fetchable msgid "notify-events.job-fetchable" -msgstr "" +msgstr "Auftrag abholbar" #. TRANSLATORS: Job Progress msgid "notify-events.job-progress" -msgstr "" +msgstr "Auftragsfortschritt" #. TRANSLATORS: Job State Changed msgid "notify-events.job-state-changed" -msgstr "" +msgstr "Auftragsstatus geändert" #. TRANSLATORS: Job Stopped msgid "notify-events.job-stopped" -msgstr "" +msgstr "Auftrag angehalten" #. TRANSLATORS: None msgid "notify-events.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Printer Config Changed msgid "notify-events.printer-config-changed" -msgstr "" +msgstr "Druckerkonfiguration geändert" #. TRANSLATORS: Printer Finishings Changed msgid "notify-events.printer-finishings-changed" -msgstr "" +msgstr "Endverarbeitung geändert" #. TRANSLATORS: Printer Media Changed msgid "notify-events.printer-media-changed" -msgstr "" +msgstr "Druckmedien geändert" #. TRANSLATORS: Printer Queue Order Changed msgid "notify-events.printer-queue-order-changed" -msgstr "" +msgstr "Reihenfolge der Warteschlange geändert" #. TRANSLATORS: Printer Restarted msgid "notify-events.printer-restarted" -msgstr "" +msgstr "Drucker neu gestartet" #. TRANSLATORS: Printer Shutdown msgid "notify-events.printer-shutdown" -msgstr "" +msgstr "Drucker heruntergefahren" #. TRANSLATORS: Printer State Changed msgid "notify-events.printer-state-changed" -msgstr "" +msgstr "Druckerstatus geändert" #. TRANSLATORS: Printer Stopped msgid "notify-events.printer-stopped" -msgstr "" +msgstr "Drucker angehalten" #. TRANSLATORS: Notify Get Interval msgid "notify-get-interval" @@ -10412,15 +10663,15 @@ #. TRANSLATORS: Notify Recipient msgid "notify-recipient-uri" -msgstr "" +msgstr "Benachrichtigungsempfänger" #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." -msgstr "" +msgstr "notify-recipient-uri URI \"%s\" wird bereits benutzt." #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." -msgstr "" +msgstr "notify-recipient-uri URI \"%s\" benutzt unbekanntes Schema." #. TRANSLATORS: Notify Sequence Numbers msgid "notify-sequence-numbers" @@ -10432,7 +10683,7 @@ #. TRANSLATORS: Notify Time Interval msgid "notify-time-interval" -msgstr "" +msgstr "Benachrichtigungszeitintervall" #. TRANSLATORS: Notify User Data msgid "notify-user-data" @@ -10444,279 +10695,279 @@ #. TRANSLATORS: Number Of Retries msgid "number-of-retries" -msgstr "" +msgstr "Anzahl der Wiederholungen" #. TRANSLATORS: Number-Up msgid "number-up" -msgstr "" +msgstr "Drucke pro Seite" #. TRANSLATORS: Object Offset msgid "object-offset" -msgstr "" +msgstr "Objektversatz" #. TRANSLATORS: Object Size msgid "object-size" -msgstr "" +msgstr "Objektgröße" #. TRANSLATORS: Organization Name msgid "organization-name" -msgstr "" +msgstr "Name der Organisation" #. TRANSLATORS: Orientation msgid "orientation-requested" -msgstr "" +msgstr "Ausrichtung" #. TRANSLATORS: Portrait msgid "orientation-requested.3" -msgstr "" +msgstr "Hochformat" #. TRANSLATORS: Landscape msgid "orientation-requested.4" -msgstr "" +msgstr "Querformat" #. TRANSLATORS: Reverse Landscape msgid "orientation-requested.5" -msgstr "" +msgstr "umgekehrtes Querformat" #. TRANSLATORS: Reverse Portrait msgid "orientation-requested.6" -msgstr "" +msgstr "umgekehrtes Hochformat" #. TRANSLATORS: None msgid "orientation-requested.7" -msgstr "" +msgstr "Keines" #. TRANSLATORS: Scanned Image Options msgid "output-attributes" -msgstr "" +msgstr "Ausgabeattribute" #. TRANSLATORS: Output Tray msgid "output-bin" -msgstr "" +msgstr "Ausgabefach" #. TRANSLATORS: Automatic msgid "output-bin.auto" -msgstr "" +msgstr "Automatisch" #. TRANSLATORS: Bottom msgid "output-bin.bottom" -msgstr "" +msgstr "unten" #. TRANSLATORS: Center msgid "output-bin.center" -msgstr "" +msgstr "mitte" #. TRANSLATORS: Face Down msgid "output-bin.face-down" -msgstr "" +msgstr "Schriftseite nach unten" #. TRANSLATORS: Face Up msgid "output-bin.face-up" -msgstr "" +msgstr "Schriftseite nach oben" #. TRANSLATORS: Large Capacity msgid "output-bin.large-capacity" -msgstr "" +msgstr "Große Kapazität" #. TRANSLATORS: Left msgid "output-bin.left" -msgstr "" +msgstr "links" #. TRANSLATORS: Mailbox 1 msgid "output-bin.mailbox-1" -msgstr "" +msgstr "Postfach 1" #. TRANSLATORS: Mailbox 10 msgid "output-bin.mailbox-10" -msgstr "" +msgstr "Postfach 10" #. TRANSLATORS: Mailbox 2 msgid "output-bin.mailbox-2" -msgstr "" +msgstr "Postfach 2" #. TRANSLATORS: Mailbox 3 msgid "output-bin.mailbox-3" -msgstr "" +msgstr "Postfach 3" #. TRANSLATORS: Mailbox 4 msgid "output-bin.mailbox-4" -msgstr "" +msgstr "Postfach 4" #. TRANSLATORS: Mailbox 5 msgid "output-bin.mailbox-5" -msgstr "" +msgstr "Postfach 5" #. TRANSLATORS: Mailbox 6 msgid "output-bin.mailbox-6" -msgstr "" +msgstr "Postfach 6" #. TRANSLATORS: Mailbox 7 msgid "output-bin.mailbox-7" -msgstr "" +msgstr "Postfach 7" #. TRANSLATORS: Mailbox 8 msgid "output-bin.mailbox-8" -msgstr "" +msgstr "Postfach 8" #. TRANSLATORS: Mailbox 9 msgid "output-bin.mailbox-9" -msgstr "" +msgstr "Postfach 9" #. TRANSLATORS: Middle msgid "output-bin.middle" -msgstr "" +msgstr "mitte" #. TRANSLATORS: My Mailbox msgid "output-bin.my-mailbox" -msgstr "" +msgstr "Mein Postfach" #. TRANSLATORS: Rear msgid "output-bin.rear" -msgstr "" +msgstr "hinten" #. TRANSLATORS: Right msgid "output-bin.right" -msgstr "" +msgstr "rechts" #. TRANSLATORS: Side msgid "output-bin.side" -msgstr "" +msgstr "seitlich" #. TRANSLATORS: Stacker 1 msgid "output-bin.stacker-1" -msgstr "" +msgstr "Ausgabefach 1" #. TRANSLATORS: Stacker 10 msgid "output-bin.stacker-10" -msgstr "" +msgstr "Ausgabefach 10" #. TRANSLATORS: Stacker 2 msgid "output-bin.stacker-2" -msgstr "" +msgstr "Ausgabefach 2" #. TRANSLATORS: Stacker 3 msgid "output-bin.stacker-3" -msgstr "" +msgstr "Ausgabefach 3" #. TRANSLATORS: Stacker 4 msgid "output-bin.stacker-4" -msgstr "" +msgstr "Ausgabefach 4" #. TRANSLATORS: Stacker 5 msgid "output-bin.stacker-5" -msgstr "" +msgstr "Ausgabefach 5" #. TRANSLATORS: Stacker 6 msgid "output-bin.stacker-6" -msgstr "" +msgstr "Ausgabefach 6" #. TRANSLATORS: Stacker 7 msgid "output-bin.stacker-7" -msgstr "" +msgstr "Ausgabefach 7" #. TRANSLATORS: Stacker 8 msgid "output-bin.stacker-8" -msgstr "" +msgstr "Ausgabefach 8" #. TRANSLATORS: Stacker 9 msgid "output-bin.stacker-9" -msgstr "" +msgstr "Ausgabefach 9" #. TRANSLATORS: Top msgid "output-bin.top" -msgstr "" +msgstr "Oben" #. TRANSLATORS: Tray 1 msgid "output-bin.tray-1" -msgstr "" +msgstr "Fach 1" #. TRANSLATORS: Tray 10 msgid "output-bin.tray-10" -msgstr "" +msgstr "Fach 10" #. TRANSLATORS: Tray 2 msgid "output-bin.tray-2" -msgstr "" +msgstr "Fach 2" #. TRANSLATORS: Tray 3 msgid "output-bin.tray-3" -msgstr "" +msgstr "Fach 3" #. TRANSLATORS: Tray 4 msgid "output-bin.tray-4" -msgstr "" +msgstr "Fach 4" #. TRANSLATORS: Tray 5 msgid "output-bin.tray-5" -msgstr "" +msgstr "Fach 5" #. TRANSLATORS: Tray 6 msgid "output-bin.tray-6" -msgstr "" +msgstr "Fach 6" #. TRANSLATORS: Tray 7 msgid "output-bin.tray-7" -msgstr "" +msgstr "Fach 7" #. TRANSLATORS: Tray 8 msgid "output-bin.tray-8" -msgstr "" +msgstr "Fach 8" #. TRANSLATORS: Tray 9 msgid "output-bin.tray-9" -msgstr "" +msgstr "Fach 9" #. TRANSLATORS: Scanned Image Quality msgid "output-compression-quality-factor" -msgstr "" +msgstr "Bildqualität des Scans" #. TRANSLATORS: Page Delivery msgid "page-delivery" -msgstr "" +msgstr "Ausgabeorientierung" #. TRANSLATORS: Reverse Order Face-down msgid "page-delivery.reverse-order-face-down" -msgstr "" +msgstr "Umgekehrte Reihenfolge mit der Vorderseite nach unten" #. TRANSLATORS: Reverse Order Face-up msgid "page-delivery.reverse-order-face-up" -msgstr "" +msgstr "Umgekehrte Reihenfolge mit der Vorderseite nach oben" #. TRANSLATORS: Same Order Face-down msgid "page-delivery.same-order-face-down" -msgstr "" +msgstr "Gleiche Reihenfolge mit der Vorderseite nach unten" #. TRANSLATORS: Same Order Face-up msgid "page-delivery.same-order-face-up" -msgstr "" +msgstr "Gleiche Reihenfolge mit der Vorderseite nach oben" #. TRANSLATORS: System Specified msgid "page-delivery.system-specified" -msgstr "" +msgstr "System angegeben" #. TRANSLATORS: Page Order Received msgid "page-order-received" -msgstr "" +msgstr "Seitenreihenfolge erhalten" #. TRANSLATORS: 1 To N msgid "page-order-received.1-to-n-order" -msgstr "" +msgstr "1 zu N" #. TRANSLATORS: N To 1 msgid "page-order-received.n-to-1-order" -msgstr "" +msgstr "N zu 1" #. TRANSLATORS: Page Ranges msgid "page-ranges" -msgstr "" +msgstr "Seitenbereiche" #. TRANSLATORS: Pages msgid "pages" -msgstr "" +msgstr "Seiten" #. TRANSLATORS: Pages Per Subset msgid "pages-per-subset" -msgstr "" +msgstr "Seiten pro Teilsatz" #. TRANSLATORS: Pclm Raster Back Side msgid "pclm-raster-back-side" @@ -10728,18 +10979,18 @@ #. TRANSLATORS: Normal msgid "pclm-raster-back-side.normal" -msgstr "" +msgstr "normal" #. TRANSLATORS: Rotated msgid "pclm-raster-back-side.rotated" -msgstr "" +msgstr "gedreht" #. TRANSLATORS: Pclm Source Resolution msgid "pclm-source-resolution" msgstr "" msgid "pending" -msgstr "in Verarbeitung" +msgstr "ausstehend" #. TRANSLATORS: Platform Shape msgid "platform-shape" @@ -10747,15 +10998,15 @@ #. TRANSLATORS: Round msgid "platform-shape.ellipse" -msgstr "" +msgstr "rund" #. TRANSLATORS: Rectangle msgid "platform-shape.rectangle" -msgstr "" +msgstr "Rechteck" #. TRANSLATORS: Platform Temperature msgid "platform-temperature" -msgstr "" +msgstr "Plattformtemperatur" #. TRANSLATORS: Post-dial String msgid "post-dial-string" @@ -10767,11 +11018,11 @@ #, c-format msgid "ppdc: Adding/updating UI text from %s." -msgstr "" +msgstr "ppdc: UI-Text von %s wird hinzugefügt/aktualisiert." #, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s." -msgstr "" +msgstr "ppdc: Falscher boolescher Wert (%s) in Zeile %d von %s." #, c-format msgid "ppdc: Bad font attribute: %s" @@ -10783,7 +11034,7 @@ #, c-format msgid "ppdc: Bad status keyword %s on line %d of %s." -msgstr "" +msgstr "ppdc: Falsches Statusschlüsselwort %s in Zeile %d von %s." #, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." @@ -11125,7 +11376,7 @@ #, c-format msgid "ppdc: Writing %s." -msgstr "ppdc: Schreibe: %s." +msgstr "ppdc: Schreibe %s." #, c-format msgid "ppdc: Writing PPD files to directory \"%s\"." @@ -11185,7 +11436,7 @@ #. TRANSLATORS: Print Accuracy msgid "print-accuracy" -msgstr "" +msgstr "Druckgenauigkeit" #. TRANSLATORS: Print Base msgid "print-base" @@ -11213,75 +11464,75 @@ #. TRANSLATORS: Standard msgid "print-base.standard" -msgstr "" +msgstr "Standard" #. TRANSLATORS: Print Color Mode msgid "print-color-mode" -msgstr "" +msgstr "Farbdruckmodus" #. TRANSLATORS: Automatic msgid "print-color-mode.auto" -msgstr "" +msgstr "Automatisch" #. TRANSLATORS: Auto Monochrome msgid "print-color-mode.auto-monochrome" -msgstr "" +msgstr "automatisch monochrom" #. TRANSLATORS: Text msgid "print-color-mode.bi-level" -msgstr "" +msgstr "Text, 2-farbig" #. TRANSLATORS: Color msgid "print-color-mode.color" -msgstr "" +msgstr "Farbe" #. TRANSLATORS: Highlight msgid "print-color-mode.highlight" -msgstr "" +msgstr "Betont" #. TRANSLATORS: Monochrome msgid "print-color-mode.monochrome" -msgstr "" +msgstr "Monochrom" #. TRANSLATORS: Process Text msgid "print-color-mode.process-bi-level" -msgstr "" +msgstr "Text, 2-farbig" #. TRANSLATORS: Process Monochrome msgid "print-color-mode.process-monochrome" -msgstr "" +msgstr "Monochrom" #. TRANSLATORS: Print Optimization msgid "print-content-optimize" -msgstr "" +msgstr "Druckoptimierung" #. TRANSLATORS: Print Content Optimize Actual msgid "print-content-optimize-actual" -msgstr "" +msgstr "derzeitige Druckoptimierung" #. TRANSLATORS: Automatic msgid "print-content-optimize.auto" -msgstr "" +msgstr "automatisch" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphic" -msgstr "" +msgstr "Grafik" #. TRANSLATORS: Graphics msgid "print-content-optimize.graphics" -msgstr "" +msgstr "Grafiken" #. TRANSLATORS: Photo msgid "print-content-optimize.photo" -msgstr "" +msgstr "Foto" #. TRANSLATORS: Text msgid "print-content-optimize.text" -msgstr "" +msgstr "Text" #. TRANSLATORS: Text and Graphics msgid "print-content-optimize.text-and-graphic" -msgstr "" +msgstr "Text und Grafik" #. TRANSLATORS: Text And Graphics msgid "print-content-optimize.text-and-graphics" @@ -11293,71 +11544,71 @@ #. TRANSLATORS: Print Quality msgid "print-quality" -msgstr "" +msgstr "Druckqualität" #. TRANSLATORS: Draft msgid "print-quality.3" -msgstr "" +msgstr "Entwurf" #. TRANSLATORS: Normal msgid "print-quality.4" -msgstr "" +msgstr "Normal" #. TRANSLATORS: High msgid "print-quality.5" -msgstr "" +msgstr "Hoch" #. TRANSLATORS: Print Rendering Intent msgid "print-rendering-intent" -msgstr "" +msgstr "Renderingziel" #. TRANSLATORS: Absolute msgid "print-rendering-intent.absolute" -msgstr "" +msgstr "Absolut" #. TRANSLATORS: Automatic msgid "print-rendering-intent.auto" -msgstr "" +msgstr "Automatisch" #. TRANSLATORS: Perceptual msgid "print-rendering-intent.perceptual" -msgstr "" +msgstr "Wahrnehmungsgemäß" #. TRANSLATORS: Relative msgid "print-rendering-intent.relative" -msgstr "" +msgstr "Relativ" #. TRANSLATORS: Relative w/Black Point Compensation msgid "print-rendering-intent.relative-bpc" -msgstr "" +msgstr "Relative Schwarzwert Kompensation" #. TRANSLATORS: Saturation msgid "print-rendering-intent.saturation" -msgstr "" +msgstr "Sättigung" #. TRANSLATORS: Print Scaling msgid "print-scaling" -msgstr "" +msgstr "Druckskalierung" #. TRANSLATORS: Automatic msgid "print-scaling.auto" -msgstr "" +msgstr "Automatisch" #. TRANSLATORS: Auto-fit msgid "print-scaling.auto-fit" -msgstr "" +msgstr "automatisch passend" #. TRANSLATORS: Fill msgid "print-scaling.fill" -msgstr "" +msgstr "Füllend" #. TRANSLATORS: Fit msgid "print-scaling.fit" -msgstr "" +msgstr "Passend" #. TRANSLATORS: None msgid "print-scaling.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Print Supports msgid "print-supports" @@ -11381,11 +11632,11 @@ #, c-format msgid "printer %s disabled since %s -" -msgstr "Drucker %s ist deaktiviert seit %s" +msgstr "Drucker %s ist deaktiviert seit %s -" #, c-format msgid "printer %s is holding new jobs. enabled since %s" -msgstr "" +msgstr "Drucker %s hält Druckaufträge zurück. Aktiviert seit %s" #, c-format msgid "printer %s is idle. enabled since %s" @@ -11397,7 +11648,7 @@ #, c-format msgid "printer %s/%s disabled since %s -" -msgstr "Drucker %s/%s deaktiviert seit %s" +msgstr "Drucker %s/%s deaktiviert seit %s -" #, c-format msgid "printer %s/%s is idle. enabled since %s" @@ -11409,87 +11660,87 @@ #. TRANSLATORS: Printer Kind msgid "printer-kind" -msgstr "" +msgstr "Art des Druckers" #. TRANSLATORS: Disc msgid "printer-kind.disc" -msgstr "" +msgstr "Scheibe" #. TRANSLATORS: Document msgid "printer-kind.document" -msgstr "" +msgstr "Document" #. TRANSLATORS: Envelope msgid "printer-kind.envelope" -msgstr "" +msgstr "Umschlag" #. TRANSLATORS: Label msgid "printer-kind.label" -msgstr "" +msgstr "Aufkleber" #. TRANSLATORS: Large Format msgid "printer-kind.large-format" -msgstr "" +msgstr "Großformat" #. TRANSLATORS: Photo msgid "printer-kind.photo" -msgstr "" +msgstr "Foto" #. TRANSLATORS: Postcard msgid "printer-kind.postcard" -msgstr "" +msgstr "Postkarte" #. TRANSLATORS: Receipt msgid "printer-kind.receipt" -msgstr "" +msgstr "Quittung" #. TRANSLATORS: Roll msgid "printer-kind.roll" -msgstr "" +msgstr "Rolle" #. TRANSLATORS: Message From Operator msgid "printer-message-from-operator" -msgstr "" +msgstr "Nachricht vom Bediener" #. TRANSLATORS: Print Resolution msgid "printer-resolution" -msgstr "" +msgstr "Druckauflösung" #. TRANSLATORS: Printer State msgid "printer-state" -msgstr "" +msgstr "Druckerstatus" #. TRANSLATORS: Detailed Printer State msgid "printer-state-reasons" -msgstr "" +msgstr "Detaillierter Druckerstatus" #. TRANSLATORS: Old Alerts Have Been Removed msgid "printer-state-reasons.alert-removal-of-binary-change-entry" -msgstr "" +msgstr "Alte Alarme wurden gelöscht" #. TRANSLATORS: Bander Added msgid "printer-state-reasons.bander-added" -msgstr "" +msgstr "Banderolierer hinzugefügt" #. TRANSLATORS: Bander Almost Empty msgid "printer-state-reasons.bander-almost-empty" -msgstr "" +msgstr "Banderolierer fast leer" #. TRANSLATORS: Bander Almost Full msgid "printer-state-reasons.bander-almost-full" -msgstr "" +msgstr "Banderolierer fast voll" #. TRANSLATORS: Bander At Limit msgid "printer-state-reasons.bander-at-limit" -msgstr "" +msgstr "Banderolierer am Limit" #. TRANSLATORS: Bander Closed msgid "printer-state-reasons.bander-closed" -msgstr "" +msgstr "Banderolierer geschlossen" #. TRANSLATORS: Bander Configuration Change msgid "printer-state-reasons.bander-configuration-change" -msgstr "" +msgstr "Banderoliererkonfiguration geändert" #. TRANSLATORS: Bander Cover Closed msgid "printer-state-reasons.bander-cover-closed" @@ -11505,7 +11756,7 @@ #. TRANSLATORS: Bander Full msgid "printer-state-reasons.bander-full" -msgstr "" +msgstr "Banderolierer voll" #. TRANSLATORS: Bander Interlock Closed msgid "printer-state-reasons.bander-interlock-closed" @@ -11517,27 +11768,27 @@ #. TRANSLATORS: Bander Jam msgid "printer-state-reasons.bander-jam" -msgstr "" +msgstr "Banderolierer-Blockade" #. TRANSLATORS: Bander Life Almost Over msgid "printer-state-reasons.bander-life-almost-over" -msgstr "" +msgstr "Banderolierer fast am Lebensdauerende" #. TRANSLATORS: Bander Life Over msgid "printer-state-reasons.bander-life-over" -msgstr "" +msgstr "Banderolierer am Lebensdauerende" #. TRANSLATORS: Bander Memory Exhausted msgid "printer-state-reasons.bander-memory-exhausted" -msgstr "" +msgstr "Banderolierer Speicher aufgebraucht" #. TRANSLATORS: Bander Missing msgid "printer-state-reasons.bander-missing" -msgstr "" +msgstr "Banderolierer fehlt" #. TRANSLATORS: Bander Motor Failure msgid "printer-state-reasons.bander-motor-failure" -msgstr "" +msgstr "Banderolierer Motorfehler" #. TRANSLATORS: Bander Near Limit msgid "printer-state-reasons.bander-near-limit" @@ -11545,15 +11796,15 @@ #. TRANSLATORS: Bander Offline msgid "printer-state-reasons.bander-offline" -msgstr "" +msgstr "Banderolierer offline" #. TRANSLATORS: Bander Opened msgid "printer-state-reasons.bander-opened" -msgstr "" +msgstr "Banderolierer geöffnet" #. TRANSLATORS: Bander Over Temperature msgid "printer-state-reasons.bander-over-temperature" -msgstr "" +msgstr "Banderolierer überhitzt" #. TRANSLATORS: Bander Power Saver msgid "printer-state-reasons.bander-power-saver" @@ -11569,7 +11820,7 @@ #. TRANSLATORS: Bander Removed msgid "printer-state-reasons.bander-removed" -msgstr "" +msgstr "Banderolierer entfernt" #. TRANSLATORS: Bander Resource Added msgid "printer-state-reasons.bander-resource-added" @@ -11589,19 +11840,19 @@ #. TRANSLATORS: Bander Turned Off msgid "printer-state-reasons.bander-turned-off" -msgstr "" +msgstr "Banderolierer ausgeschaltet" #. TRANSLATORS: Bander Turned On msgid "printer-state-reasons.bander-turned-on" -msgstr "" +msgstr "Banderolierer eingeschaltet" #. TRANSLATORS: Bander Under Temperature msgid "printer-state-reasons.bander-under-temperature" -msgstr "" +msgstr "Banderolierer zu kalt" #. TRANSLATORS: Bander Unrecoverable Failure msgid "printer-state-reasons.bander-unrecoverable-failure" -msgstr "" +msgstr "Banderolierer nicht behebbarer Fehler" #. TRANSLATORS: Bander Unrecoverable Storage Error msgid "printer-state-reasons.bander-unrecoverable-storage-error" @@ -11609,7 +11860,7 @@ #. TRANSLATORS: Bander Warming Up msgid "printer-state-reasons.bander-warming-up" -msgstr "" +msgstr "Banderolierer in Aufwärmphase" #. TRANSLATORS: Binder Added msgid "printer-state-reasons.binder-added" @@ -11789,19 +12040,19 @@ #. TRANSLATORS: Configuration Change msgid "printer-state-reasons.configuration-change" -msgstr "" +msgstr "Konfigurationsänderung" #. TRANSLATORS: Connecting To Device msgid "printer-state-reasons.connecting-to-device" -msgstr "" +msgstr "Verbinde zum Gerät" #. TRANSLATORS: Cover Open msgid "printer-state-reasons.cover-open" -msgstr "" +msgstr "Abdeckung offen" #. TRANSLATORS: Deactivated msgid "printer-state-reasons.deactivated" -msgstr "" +msgstr "Deaktiviert" #. TRANSLATORS: Developer Empty msgid "printer-state-reasons.developer-empty" @@ -11813,39 +12064,39 @@ #. TRANSLATORS: Die Cutter Added msgid "printer-state-reasons.die-cutter-added" -msgstr "" +msgstr "Stanze hinzugefügt" #. TRANSLATORS: Die Cutter Almost Empty msgid "printer-state-reasons.die-cutter-almost-empty" -msgstr "" +msgstr "Stanzer fast leer" #. TRANSLATORS: Die Cutter Almost Full msgid "printer-state-reasons.die-cutter-almost-full" -msgstr "" +msgstr "Stanzer fast voll" #. TRANSLATORS: Die Cutter At Limit msgid "printer-state-reasons.die-cutter-at-limit" -msgstr "" +msgstr "Stanzer an der Grenze" #. TRANSLATORS: Die Cutter Closed msgid "printer-state-reasons.die-cutter-closed" -msgstr "" +msgstr "Stanzer aus" #. TRANSLATORS: Die Cutter Configuration Change msgid "printer-state-reasons.die-cutter-configuration-change" -msgstr "" +msgstr "Stanzerkonfigurationsänderung" #. TRANSLATORS: Die Cutter Cover Closed msgid "printer-state-reasons.die-cutter-cover-closed" -msgstr "" +msgstr "Stanzer-Abdeckung geschlossen" #. TRANSLATORS: Die Cutter Cover Open msgid "printer-state-reasons.die-cutter-cover-open" -msgstr "" +msgstr "Stanzer-Abdeckung offen" #. TRANSLATORS: Die Cutter Empty msgid "printer-state-reasons.die-cutter-empty" -msgstr "" +msgstr "Stanzer leer" #. TRANSLATORS: Die Cutter Full msgid "printer-state-reasons.die-cutter-full" @@ -11861,15 +12112,15 @@ #. TRANSLATORS: Die Cutter Jam msgid "printer-state-reasons.die-cutter-jam" -msgstr "" +msgstr "Stanzer gestört" #. TRANSLATORS: Die Cutter Life Almost Over msgid "printer-state-reasons.die-cutter-life-almost-over" -msgstr "" +msgstr "Lebensdauer des Stanzers fast vorüber" #. TRANSLATORS: Die Cutter Life Over msgid "printer-state-reasons.die-cutter-life-over" -msgstr "" +msgstr "Lebensdauer des Stanzers vorüber" #. TRANSLATORS: Die Cutter Memory Exhausted msgid "printer-state-reasons.die-cutter-memory-exhausted" @@ -11877,31 +12128,31 @@ #. TRANSLATORS: Die Cutter Missing msgid "printer-state-reasons.die-cutter-missing" -msgstr "" +msgstr "Stanzer nicht vorhanden" #. TRANSLATORS: Die Cutter Motor Failure msgid "printer-state-reasons.die-cutter-motor-failure" -msgstr "" +msgstr "Motorfehler des Stanzers" #. TRANSLATORS: Die Cutter Near Limit msgid "printer-state-reasons.die-cutter-near-limit" -msgstr "" +msgstr "Stanzer im Grenzbereich" #. TRANSLATORS: Die Cutter Offline msgid "printer-state-reasons.die-cutter-offline" -msgstr "" +msgstr "Stanzer offline" #. TRANSLATORS: Die Cutter Opened msgid "printer-state-reasons.die-cutter-opened" -msgstr "" +msgstr "Stanzer geöffnet" #. TRANSLATORS: Die Cutter Over Temperature msgid "printer-state-reasons.die-cutter-over-temperature" -msgstr "" +msgstr "Temperaturüberschreitung am Stanzer" #. TRANSLATORS: Die Cutter Power Saver msgid "printer-state-reasons.die-cutter-power-saver" -msgstr "" +msgstr "Stanzer im Stromsparmodus" #. TRANSLATORS: Die Cutter Recoverable Failure msgid "printer-state-reasons.die-cutter-recoverable-failure" @@ -11913,7 +12164,7 @@ #. TRANSLATORS: Die Cutter Removed msgid "printer-state-reasons.die-cutter-removed" -msgstr "" +msgstr "Stanzer entfernt" #. TRANSLATORS: Die Cutter Resource Added msgid "printer-state-reasons.die-cutter-resource-added" @@ -11925,7 +12176,7 @@ #. TRANSLATORS: Die Cutter Thermistor Failure msgid "printer-state-reasons.die-cutter-thermistor-failure" -msgstr "" +msgstr "thermistorfehler am Stanzer" #. TRANSLATORS: Die Cutter Timing Failure msgid "printer-state-reasons.die-cutter-timing-failure" @@ -11933,11 +12184,11 @@ #. TRANSLATORS: Die Cutter Turned Off msgid "printer-state-reasons.die-cutter-turned-off" -msgstr "" +msgstr "Stanzer ausgeschaltet" #. TRANSLATORS: Die Cutter Turned On msgid "printer-state-reasons.die-cutter-turned-on" -msgstr "" +msgstr "Stanzer eingeschaltet" #. TRANSLATORS: Die Cutter Under Temperature msgid "printer-state-reasons.die-cutter-under-temperature" @@ -11953,59 +12204,59 @@ #. TRANSLATORS: Die Cutter Warming Up msgid "printer-state-reasons.die-cutter-warming-up" -msgstr "" +msgstr "Stanzer in Aufwärmphase" #. TRANSLATORS: Door Open msgid "printer-state-reasons.door-open" -msgstr "" +msgstr "Tür offen" #. TRANSLATORS: Extruder Cooling msgid "printer-state-reasons.extruder-cooling" -msgstr "" +msgstr "Extruderkühlung" #. TRANSLATORS: Extruder Failure msgid "printer-state-reasons.extruder-failure" -msgstr "" +msgstr "Extruderfehler" #. TRANSLATORS: Extruder Heating msgid "printer-state-reasons.extruder-heating" -msgstr "" +msgstr "Extruder heizt" #. TRANSLATORS: Extruder Jam msgid "printer-state-reasons.extruder-jam" -msgstr "" +msgstr "Extruder gestört" #. TRANSLATORS: Extruder Temperature High msgid "printer-state-reasons.extruder-temperature-high" -msgstr "" +msgstr "Extrudertemperatur hoch" #. TRANSLATORS: Extruder Temperature Low msgid "printer-state-reasons.extruder-temperature-low" -msgstr "" +msgstr "Extrudertemperatur niedrig" #. TRANSLATORS: Fan Failure msgid "printer-state-reasons.fan-failure" -msgstr "" +msgstr "Lüfterfehler" #. TRANSLATORS: Fax Modem Life Almost Over msgid "printer-state-reasons.fax-modem-life-almost-over" -msgstr "" +msgstr "Modemlebensdauer fast erreicht" #. TRANSLATORS: Fax Modem Life Over msgid "printer-state-reasons.fax-modem-life-over" -msgstr "" +msgstr "Modemlebensdauer erreicht" #. TRANSLATORS: Fax Modem Missing msgid "printer-state-reasons.fax-modem-missing" -msgstr "" +msgstr "Modem nicht vorhanden" #. TRANSLATORS: Fax Modem Turned Off msgid "printer-state-reasons.fax-modem-turned-off" -msgstr "" +msgstr "Modem ausgeschaltet" #. TRANSLATORS: Fax Modem Turned On msgid "printer-state-reasons.fax-modem-turned-on" -msgstr "" +msgstr "Modem eingeschaltet" #. TRANSLATORS: Folder Added msgid "printer-state-reasons.folder-added" @@ -12153,19 +12404,19 @@ #. TRANSLATORS: Fuser temperature high msgid "printer-state-reasons.fuser-over-temp" -msgstr "" +msgstr "Fixiertemperatur hoch" #. TRANSLATORS: Fuser temperature low msgid "printer-state-reasons.fuser-under-temp" -msgstr "" +msgstr "Fixiertemperatur niedrig" #. TRANSLATORS: Hold New Jobs msgid "printer-state-reasons.hold-new-jobs" -msgstr "" +msgstr "Neue Aufträge halten" #. TRANSLATORS: Identify Printer msgid "printer-state-reasons.identify-printer-requested" -msgstr "" +msgstr "Drucker identifizieren" #. TRANSLATORS: Imprinter Added msgid "printer-state-reasons.imprinter-added" @@ -12329,7 +12580,7 @@ #. TRANSLATORS: Input Media Size Change msgid "printer-state-reasons.input-media-size-change" -msgstr "" +msgstr "Größe des Einzugsmediums geändert" #. TRANSLATORS: Input Media Tray Failure msgid "printer-state-reasons.input-media-tray-failure" @@ -12373,7 +12624,7 @@ #. TRANSLATORS: Paper tray is missing msgid "printer-state-reasons.input-tray-missing" -msgstr "" +msgstr "Einzugsschacht fehlt" #. TRANSLATORS: Input Tray Position Failure msgid "printer-state-reasons.input-tray-position-failure" @@ -12525,11 +12776,11 @@ #. TRANSLATORS: Interlock Closed msgid "printer-state-reasons.interlock-closed" -msgstr "" +msgstr "Sicherheitssperre geschlossen" #. TRANSLATORS: Interlock Open msgid "printer-state-reasons.interlock-open" -msgstr "" +msgstr "Sicherheitssperre offen" #. TRANSLATORS: Interpreter Cartridge Added msgid "printer-state-reasons.interpreter-cartridge-added" @@ -12565,27 +12816,27 @@ #. TRANSLATORS: Lamp At End of Life msgid "printer-state-reasons.lamp-at-eol" -msgstr "" +msgstr "Lampe am Lebensdauerende" #. TRANSLATORS: Lamp Failure msgid "printer-state-reasons.lamp-failure" -msgstr "" +msgstr "Lampenfehler" #. TRANSLATORS: Lamp Near End of Life msgid "printer-state-reasons.lamp-near-eol" -msgstr "" +msgstr "Lampe fast am Lebensdauerende" #. TRANSLATORS: Laser At End of Life msgid "printer-state-reasons.laser-at-eol" -msgstr "" +msgstr "Laser am Lebensdauerende" #. TRANSLATORS: Laser Failure msgid "printer-state-reasons.laser-failure" -msgstr "" +msgstr "Laserfehler" #. TRANSLATORS: Laser Near End of Life msgid "printer-state-reasons.laser-near-eol" -msgstr "" +msgstr "Laser fast am Lebensdauerende" #. TRANSLATORS: Envelope Maker Added msgid "printer-state-reasons.make-envelope-added" @@ -12797,11 +13048,11 @@ #. TRANSLATORS: Ink/toner empty msgid "printer-state-reasons.marker-supply-empty" -msgstr "" +msgstr "Tinte/Toner leer" #. TRANSLATORS: Ink/toner low msgid "printer-state-reasons.marker-supply-low" -msgstr "" +msgstr "Tinte/Toner niedrig" #. TRANSLATORS: Marker Supply Missing msgid "printer-state-reasons.marker-supply-missing" @@ -12853,55 +13104,55 @@ #. TRANSLATORS: Material Empty msgid "printer-state-reasons.material-empty" -msgstr "" +msgstr "Material leer" #. TRANSLATORS: Material Low msgid "printer-state-reasons.material-low" -msgstr "" +msgstr "Niedriger Materialstand" #. TRANSLATORS: Material Needed msgid "printer-state-reasons.material-needed" -msgstr "" +msgstr "Material benötigt" #. TRANSLATORS: Media Drying msgid "printer-state-reasons.media-drying" -msgstr "" +msgstr "Medientrocknung" #. TRANSLATORS: Paper tray is empty msgid "printer-state-reasons.media-empty" -msgstr "" +msgstr "Papierfach ist leer" #. TRANSLATORS: Paper jam msgid "printer-state-reasons.media-jam" -msgstr "" +msgstr "Papierstau" #. TRANSLATORS: Paper tray is almost empty msgid "printer-state-reasons.media-low" -msgstr "" +msgstr "Papierfach ist fast leer" #. TRANSLATORS: Load paper msgid "printer-state-reasons.media-needed" -msgstr "" +msgstr "Papier nachladen" #. TRANSLATORS: Media Path Cannot Do 2-Sided Printing msgid "printer-state-reasons.media-path-cannot-duplex-media-selected" -msgstr "" +msgstr "Medienpfad kann keinen Duplexdruck" #. TRANSLATORS: Media Path Failure msgid "printer-state-reasons.media-path-failure" -msgstr "" +msgstr "Fehler im Medienpfad" #. TRANSLATORS: Media Path Input Empty msgid "printer-state-reasons.media-path-input-empty" -msgstr "" +msgstr "Medieneinzugspfad leer" #. TRANSLATORS: Media Path Input Feed Error msgid "printer-state-reasons.media-path-input-feed-error" -msgstr "" +msgstr "Einzugsfehler" #. TRANSLATORS: Media Path Input Jam msgid "printer-state-reasons.media-path-input-jam" -msgstr "" +msgstr "Einzugsstau im Medienpfad" #. TRANSLATORS: Media Path Input Request msgid "printer-state-reasons.media-path-input-request" @@ -12909,7 +13160,7 @@ #. TRANSLATORS: Media Path Jam msgid "printer-state-reasons.media-path-jam" -msgstr "" +msgstr "Stau im Medienpfad" #. TRANSLATORS: Media Path Media Tray Almost Full msgid "printer-state-reasons.media-path-media-tray-almost-full" @@ -12929,11 +13180,11 @@ #. TRANSLATORS: Media Path Output Full msgid "printer-state-reasons.media-path-output-full" -msgstr "" +msgstr "Ausgabepfad voll" #. TRANSLATORS: Media Path Output Jam msgid "printer-state-reasons.media-path-output-jam" -msgstr "" +msgstr "Stau im Ausgabepfad" #. TRANSLATORS: Media Path Pick Roller Failure msgid "printer-state-reasons.media-path-pick-roller-failure" @@ -12953,7 +13204,7 @@ #. TRANSLATORS: Motor Failure msgid "printer-state-reasons.motor-failure" -msgstr "" +msgstr "Motorstörung" #. TRANSLATORS: Printer going offline msgid "printer-state-reasons.moving-to-paused" @@ -12965,23 +13216,23 @@ #. TRANSLATORS: Optical Photoconductor Life Over msgid "printer-state-reasons.opc-life-over" -msgstr "" +msgstr "Lebensdauer des OPC überschritten" #. TRANSLATORS: OPC almost at end-of-life msgid "printer-state-reasons.opc-near-eol" -msgstr "" +msgstr "Lebensdauer des OPC fast zu Ende" #. TRANSLATORS: Check the printer for errors msgid "printer-state-reasons.other" -msgstr "" +msgstr "Andere, bitte am Drucker prüfen" #. TRANSLATORS: Output bin is almost full msgid "printer-state-reasons.output-area-almost-full" -msgstr "" +msgstr "Ausgabefach ist fast voll" #. TRANSLATORS: Output bin is full msgid "printer-state-reasons.output-area-full" -msgstr "" +msgstr "Ausgabefach ist voll" #. TRANSLATORS: Output Mailbox Select Failure msgid "printer-state-reasons.output-mailbox-select-failure" @@ -12989,7 +13240,7 @@ #. TRANSLATORS: Output Media Tray Failure msgid "printer-state-reasons.output-media-tray-failure" -msgstr "" +msgstr "Fehler im Ausgabefach" #. TRANSLATORS: Output Media Tray Feed Error msgid "printer-state-reasons.output-media-tray-feed-error" @@ -13001,31 +13252,31 @@ #. TRANSLATORS: Output tray is missing msgid "printer-state-reasons.output-tray-missing" -msgstr "" +msgstr "Ausgabefach fehlt" #. TRANSLATORS: Paused msgid "printer-state-reasons.paused" -msgstr "" +msgstr "Pausiert" #. TRANSLATORS: Perforater Added msgid "printer-state-reasons.perforater-added" -msgstr "" +msgstr "Perforierer hinzugefügt" #. TRANSLATORS: Perforater Almost Empty msgid "printer-state-reasons.perforater-almost-empty" -msgstr "" +msgstr "Perforierer fast leer" #. TRANSLATORS: Perforater Almost Full msgid "printer-state-reasons.perforater-almost-full" -msgstr "" +msgstr "Perforierer fast voll" #. TRANSLATORS: Perforater At Limit msgid "printer-state-reasons.perforater-at-limit" -msgstr "" +msgstr "Perforierer am Limit" #. TRANSLATORS: Perforater Closed msgid "printer-state-reasons.perforater-closed" -msgstr "" +msgstr "Perforierer geschlossen" #. TRANSLATORS: Perforater Configuration Change msgid "printer-state-reasons.perforater-configuration-change" @@ -13033,19 +13284,19 @@ #. TRANSLATORS: Perforater Cover Closed msgid "printer-state-reasons.perforater-cover-closed" -msgstr "" +msgstr "Perforiererabdeckung geschlossen" #. TRANSLATORS: Perforater Cover Open msgid "printer-state-reasons.perforater-cover-open" -msgstr "" +msgstr "Perforiererabdeckung offen" #. TRANSLATORS: Perforater Empty msgid "printer-state-reasons.perforater-empty" -msgstr "" +msgstr "Perforierer leer" #. TRANSLATORS: Perforater Full msgid "printer-state-reasons.perforater-full" -msgstr "" +msgstr "Perforierer voll" #. TRANSLATORS: Perforater Interlock Closed msgid "printer-state-reasons.perforater-interlock-closed" @@ -13057,7 +13308,7 @@ #. TRANSLATORS: Perforater Jam msgid "printer-state-reasons.perforater-jam" -msgstr "" +msgstr "Stau im Perforierer" #. TRANSLATORS: Perforater Life Almost Over msgid "printer-state-reasons.perforater-life-almost-over" @@ -13073,11 +13324,11 @@ #. TRANSLATORS: Perforater Missing msgid "printer-state-reasons.perforater-missing" -msgstr "" +msgstr "Perforierer fehlt" #. TRANSLATORS: Perforater Motor Failure msgid "printer-state-reasons.perforater-motor-failure" -msgstr "" +msgstr "Perforierer-Motorstörung" #. TRANSLATORS: Perforater Near Limit msgid "printer-state-reasons.perforater-near-limit" @@ -13089,11 +13340,11 @@ #. TRANSLATORS: Perforater Opened msgid "printer-state-reasons.perforater-opened" -msgstr "" +msgstr "Perforierer geöffnet" #. TRANSLATORS: Perforater Over Temperature msgid "printer-state-reasons.perforater-over-temperature" -msgstr "" +msgstr "Perforierer über Temperatur" #. TRANSLATORS: Perforater Power Saver msgid "printer-state-reasons.perforater-power-saver" @@ -13109,7 +13360,7 @@ #. TRANSLATORS: Perforater Removed msgid "printer-state-reasons.perforater-removed" -msgstr "" +msgstr "Perforierer entfernt" #. TRANSLATORS: Perforater Resource Added msgid "printer-state-reasons.perforater-resource-added" @@ -13129,15 +13380,15 @@ #. TRANSLATORS: Perforater Turned Off msgid "printer-state-reasons.perforater-turned-off" -msgstr "" +msgstr "Perforierer ausgeschaltet" #. TRANSLATORS: Perforater Turned On msgid "printer-state-reasons.perforater-turned-on" -msgstr "" +msgstr "Perforierer eingeschaltet" #. TRANSLATORS: Perforater Under Temperature msgid "printer-state-reasons.perforater-under-temperature" -msgstr "" +msgstr "Perforierer unter Temperatur" #. TRANSLATORS: Perforater Unrecoverable Failure msgid "printer-state-reasons.perforater-unrecoverable-failure" @@ -13149,87 +13400,87 @@ #. TRANSLATORS: Perforater Warming Up msgid "printer-state-reasons.perforater-warming-up" -msgstr "" +msgstr "Perforater Warming Up" #. TRANSLATORS: Platform Cooling msgid "printer-state-reasons.platform-cooling" -msgstr "" +msgstr "Plattformkühlung" #. TRANSLATORS: Platform Failure msgid "printer-state-reasons.platform-failure" -msgstr "" +msgstr "Plattformstörung" #. TRANSLATORS: Platform Heating msgid "printer-state-reasons.platform-heating" -msgstr "" +msgstr "Plattformheizung" #. TRANSLATORS: Platform Temperature High msgid "printer-state-reasons.platform-temperature-high" -msgstr "" +msgstr "Plattformtemperatur hoch" #. TRANSLATORS: Platform Temperature Low msgid "printer-state-reasons.platform-temperature-low" -msgstr "" +msgstr "Plattformtemperatur niedrig" #. TRANSLATORS: Power Down msgid "printer-state-reasons.power-down" -msgstr "" +msgstr "Herunterfahren" #. TRANSLATORS: Power Up msgid "printer-state-reasons.power-up" -msgstr "" +msgstr "Hochfahren" #. TRANSLATORS: Printer Reset Manually msgid "printer-state-reasons.printer-manual-reset" -msgstr "" +msgstr "Drucker manuell zurücksetzen" #. TRANSLATORS: Printer Reset Remotely msgid "printer-state-reasons.printer-nms-reset" -msgstr "" +msgstr "Drucker aus der Ferne zurücksetzen" #. TRANSLATORS: Printer Ready To Print msgid "printer-state-reasons.printer-ready-to-print" -msgstr "" +msgstr "Drucker bereit zum Drucken" #. TRANSLATORS: Puncher Added msgid "printer-state-reasons.puncher-added" -msgstr "" +msgstr "Locher hinzugefügt" #. TRANSLATORS: Puncher Almost Empty msgid "printer-state-reasons.puncher-almost-empty" -msgstr "" +msgstr "Locher fast leer" #. TRANSLATORS: Puncher Almost Full msgid "printer-state-reasons.puncher-almost-full" -msgstr "" +msgstr "Locher fast voll" #. TRANSLATORS: Puncher At Limit msgid "printer-state-reasons.puncher-at-limit" -msgstr "" +msgstr "Locher im Grenzbereich" #. TRANSLATORS: Puncher Closed msgid "printer-state-reasons.puncher-closed" -msgstr "" +msgstr "Locher geschlossen" #. TRANSLATORS: Puncher Configuration Change msgid "printer-state-reasons.puncher-configuration-change" -msgstr "" +msgstr "Konfiguration des Lochers geändert" #. TRANSLATORS: Puncher Cover Closed msgid "printer-state-reasons.puncher-cover-closed" -msgstr "" +msgstr "Locherabdeckung geschlossen" #. TRANSLATORS: Puncher Cover Open msgid "printer-state-reasons.puncher-cover-open" -msgstr "" +msgstr "Locherabdeckung offen" #. TRANSLATORS: Puncher Empty msgid "printer-state-reasons.puncher-empty" -msgstr "" +msgstr "Locher leer" #. TRANSLATORS: Puncher Full msgid "printer-state-reasons.puncher-full" -msgstr "" +msgstr "Locher voll" #. TRANSLATORS: Puncher Interlock Closed msgid "printer-state-reasons.puncher-interlock-closed" @@ -13241,15 +13492,15 @@ #. TRANSLATORS: Puncher Jam msgid "printer-state-reasons.puncher-jam" -msgstr "" +msgstr "Stau im Locher" #. TRANSLATORS: Puncher Life Almost Over msgid "printer-state-reasons.puncher-life-almost-over" -msgstr "" +msgstr "Lebensdauer des Lochers fast überschritten" #. TRANSLATORS: Puncher Life Over msgid "printer-state-reasons.puncher-life-over" -msgstr "" +msgstr "Lebensdauer des Lochers überschritten" #. TRANSLATORS: Puncher Memory Exhausted msgid "printer-state-reasons.puncher-memory-exhausted" @@ -13257,11 +13508,11 @@ #. TRANSLATORS: Puncher Missing msgid "printer-state-reasons.puncher-missing" -msgstr "" +msgstr "Locher fehlt" #. TRANSLATORS: Puncher Motor Failure msgid "printer-state-reasons.puncher-motor-failure" -msgstr "" +msgstr "Locher-Motorstörung" #. TRANSLATORS: Puncher Near Limit msgid "printer-state-reasons.puncher-near-limit" @@ -13269,15 +13520,15 @@ #. TRANSLATORS: Puncher Offline msgid "printer-state-reasons.puncher-offline" -msgstr "" +msgstr "Locher Offline" #. TRANSLATORS: Puncher Opened msgid "printer-state-reasons.puncher-opened" -msgstr "" +msgstr "Locher geöffnet" #. TRANSLATORS: Puncher Over Temperature msgid "printer-state-reasons.puncher-over-temperature" -msgstr "" +msgstr "Übertemperatur am Locher" #. TRANSLATORS: Puncher Power Saver msgid "printer-state-reasons.puncher-power-saver" @@ -13293,7 +13544,7 @@ #. TRANSLATORS: Puncher Removed msgid "printer-state-reasons.puncher-removed" -msgstr "" +msgstr "Locher entfernt" #. TRANSLATORS: Puncher Resource Added msgid "printer-state-reasons.puncher-resource-added" @@ -13313,15 +13564,15 @@ #. TRANSLATORS: Puncher Turned Off msgid "printer-state-reasons.puncher-turned-off" -msgstr "" +msgstr "Locher ausgeschaltet" #. TRANSLATORS: Puncher Turned On msgid "printer-state-reasons.puncher-turned-on" -msgstr "" +msgstr "Locher eingeschaltet" #. TRANSLATORS: Puncher Under Temperature msgid "printer-state-reasons.puncher-under-temperature" -msgstr "" +msgstr "Locher unter Temperatur" #. TRANSLATORS: Puncher Unrecoverable Failure msgid "printer-state-reasons.puncher-unrecoverable-failure" @@ -13333,19 +13584,19 @@ #. TRANSLATORS: Puncher Warming Up msgid "printer-state-reasons.puncher-warming-up" -msgstr "" +msgstr "Locher wärmt sich auf" #. TRANSLATORS: Separation Cutter Added msgid "printer-state-reasons.separation-cutter-added" -msgstr "" +msgstr "Trennschneider hinzugefügt" #. TRANSLATORS: Separation Cutter Almost Empty msgid "printer-state-reasons.separation-cutter-almost-empty" -msgstr "" +msgstr "Trennschneider fast leer" #. TRANSLATORS: Separation Cutter Almost Full msgid "printer-state-reasons.separation-cutter-almost-full" -msgstr "" +msgstr "Trennschneider fast voll" #. TRANSLATORS: Separation Cutter At Limit msgid "printer-state-reasons.separation-cutter-at-limit" @@ -13353,7 +13604,7 @@ #. TRANSLATORS: Separation Cutter Closed msgid "printer-state-reasons.separation-cutter-closed" -msgstr "" +msgstr "Trennschneider geschlossen" #. TRANSLATORS: Separation Cutter Configuration Change msgid "printer-state-reasons.separation-cutter-configuration-change" @@ -13361,19 +13612,19 @@ #. TRANSLATORS: Separation Cutter Cover Closed msgid "printer-state-reasons.separation-cutter-cover-closed" -msgstr "" +msgstr "Trennschneiderabdeckung geschlossen" #. TRANSLATORS: Separation Cutter Cover Open msgid "printer-state-reasons.separation-cutter-cover-open" -msgstr "" +msgstr "Trennschneiderabdeckung offen" #. TRANSLATORS: Separation Cutter Empty msgid "printer-state-reasons.separation-cutter-empty" -msgstr "" +msgstr "Trennschneider leer" #. TRANSLATORS: Separation Cutter Full msgid "printer-state-reasons.separation-cutter-full" -msgstr "" +msgstr "Trennschneider voll" #. TRANSLATORS: Separation Cutter Interlock Closed msgid "printer-state-reasons.separation-cutter-interlock-closed" @@ -13385,7 +13636,7 @@ #. TRANSLATORS: Separation Cutter Jam msgid "printer-state-reasons.separation-cutter-jam" -msgstr "" +msgstr "Stau im Trennschneider" #. TRANSLATORS: Separation Cutter Life Almost Over msgid "printer-state-reasons.separation-cutter-life-almost-over" @@ -13401,11 +13652,11 @@ #. TRANSLATORS: Separation Cutter Missing msgid "printer-state-reasons.separation-cutter-missing" -msgstr "" +msgstr "Trennschneider fehlt" #. TRANSLATORS: Separation Cutter Motor Failure msgid "printer-state-reasons.separation-cutter-motor-failure" -msgstr "" +msgstr "Trennschneider-Motorstörung" #. TRANSLATORS: Separation Cutter Near Limit msgid "printer-state-reasons.separation-cutter-near-limit" @@ -13417,11 +13668,11 @@ #. TRANSLATORS: Separation Cutter Opened msgid "printer-state-reasons.separation-cutter-opened" -msgstr "" +msgstr "Trennschneider geöffnet" #. TRANSLATORS: Separation Cutter Over Temperature msgid "printer-state-reasons.separation-cutter-over-temperature" -msgstr "" +msgstr "Trennschneider über Temperatur" #. TRANSLATORS: Separation Cutter Power Saver msgid "printer-state-reasons.separation-cutter-power-saver" @@ -13437,7 +13688,7 @@ #. TRANSLATORS: Separation Cutter Removed msgid "printer-state-reasons.separation-cutter-removed" -msgstr "" +msgstr "Trennschneider entfernt" #. TRANSLATORS: Separation Cutter Resource Added msgid "printer-state-reasons.separation-cutter-resource-added" @@ -13457,15 +13708,15 @@ #. TRANSLATORS: Separation Cutter Turned Off msgid "printer-state-reasons.separation-cutter-turned-off" -msgstr "" +msgstr "Trennschneider ausgeschaltet" #. TRANSLATORS: Separation Cutter Turned On msgid "printer-state-reasons.separation-cutter-turned-on" -msgstr "" +msgstr "Trennschneider eingeschaltet" #. TRANSLATORS: Separation Cutter Under Temperature msgid "printer-state-reasons.separation-cutter-under-temperature" -msgstr "" +msgstr "Trennschneider unter Temperatur" #. TRANSLATORS: Separation Cutter Unrecoverable Failure msgid "printer-state-reasons.separation-cutter-unrecoverable-failure" @@ -13477,7 +13728,7 @@ #. TRANSLATORS: Separation Cutter Warming Up msgid "printer-state-reasons.separation-cutter-warming-up" -msgstr "" +msgstr "Trennschneider wärmt sich auf" #. TRANSLATORS: Sheet Rotator Added msgid "printer-state-reasons.sheet-rotator-added" @@ -13625,27 +13876,27 @@ #. TRANSLATORS: Printer offline msgid "printer-state-reasons.shutdown" -msgstr "" +msgstr "Herunterfahren" #. TRANSLATORS: Slitter Added msgid "printer-state-reasons.slitter-added" -msgstr "" +msgstr "Schneidvorrichtung hinzugefügt" #. TRANSLATORS: Slitter Almost Empty msgid "printer-state-reasons.slitter-almost-empty" -msgstr "" +msgstr "Schneidvorrichtung fast leer" #. TRANSLATORS: Slitter Almost Full msgid "printer-state-reasons.slitter-almost-full" -msgstr "" +msgstr "Schneidvorrichtung fast voll" #. TRANSLATORS: Slitter At Limit msgid "printer-state-reasons.slitter-at-limit" -msgstr "" +msgstr "Schneidvorrichtung am Limit" #. TRANSLATORS: Slitter Closed msgid "printer-state-reasons.slitter-closed" -msgstr "" +msgstr "Schneidvorrichtung geschlossen" #. TRANSLATORS: Slitter Configuration Change msgid "printer-state-reasons.slitter-configuration-change" @@ -13661,11 +13912,11 @@ #. TRANSLATORS: Slitter Empty msgid "printer-state-reasons.slitter-empty" -msgstr "" +msgstr "Schneidvorrichtung leer" #. TRANSLATORS: Slitter Full msgid "printer-state-reasons.slitter-full" -msgstr "" +msgstr "Schneidvorrichtung voll" #. TRANSLATORS: Slitter Interlock Closed msgid "printer-state-reasons.slitter-interlock-closed" @@ -13677,15 +13928,15 @@ #. TRANSLATORS: Slitter Jam msgid "printer-state-reasons.slitter-jam" -msgstr "" +msgstr "Schneidvorrichtung blockiert" #. TRANSLATORS: Slitter Life Almost Over msgid "printer-state-reasons.slitter-life-almost-over" -msgstr "" +msgstr "Schneidvorrichtung nahe am Lebensdauerende" #. TRANSLATORS: Slitter Life Over msgid "printer-state-reasons.slitter-life-over" -msgstr "" +msgstr "Schneidvorrichtung am Lebensdauerende" #. TRANSLATORS: Slitter Memory Exhausted msgid "printer-state-reasons.slitter-memory-exhausted" @@ -13709,15 +13960,15 @@ #. TRANSLATORS: Slitter Opened msgid "printer-state-reasons.slitter-opened" -msgstr "" +msgstr "Schneidvorrichtung geöffnet" #. TRANSLATORS: Slitter Over Temperature msgid "printer-state-reasons.slitter-over-temperature" -msgstr "" +msgstr "Schneidvorrichtung überhitzt" #. TRANSLATORS: Slitter Power Saver msgid "printer-state-reasons.slitter-power-saver" -msgstr "" +msgstr "Schneidvorrichtung im Energiesparmodus" #. TRANSLATORS: Slitter Recoverable Failure msgid "printer-state-reasons.slitter-recoverable-failure" @@ -13729,7 +13980,7 @@ #. TRANSLATORS: Slitter Removed msgid "printer-state-reasons.slitter-removed" -msgstr "" +msgstr "Schneidvorrichtung entfernt" #. TRANSLATORS: Slitter Resource Added msgid "printer-state-reasons.slitter-resource-added" @@ -13773,7 +14024,7 @@ #. TRANSLATORS: Spool Area Full msgid "printer-state-reasons.spool-area-full" -msgstr "" +msgstr "Spoolbereich voll" #. TRANSLATORS: Stacker Added msgid "printer-state-reasons.stacker-added" @@ -14209,23 +14460,23 @@ #. TRANSLATORS: Partially stopped msgid "printer-state-reasons.stopped-partly" -msgstr "" +msgstr "Teilweise angehalten" #. TRANSLATORS: Stopping msgid "printer-state-reasons.stopping" -msgstr "" +msgstr "Wird angehalten" #. TRANSLATORS: Subunit Added msgid "printer-state-reasons.subunit-added" -msgstr "" +msgstr "Untereinheit hinzugefügt" #. TRANSLATORS: Subunit Almost Empty msgid "printer-state-reasons.subunit-almost-empty" -msgstr "" +msgstr "Untereinheit fast leer" #. TRANSLATORS: Subunit Almost Full msgid "printer-state-reasons.subunit-almost-full" -msgstr "" +msgstr "Untereinheit fast voll" #. TRANSLATORS: Subunit At Limit msgid "printer-state-reasons.subunit-at-limit" @@ -14233,19 +14484,19 @@ #. TRANSLATORS: Subunit Closed msgid "printer-state-reasons.subunit-closed" -msgstr "" +msgstr "Untereinheit geschlossen" #. TRANSLATORS: Subunit Cooling Down msgid "printer-state-reasons.subunit-cooling-down" -msgstr "" +msgstr "Untereinheit kühlt ab" #. TRANSLATORS: Subunit Empty msgid "printer-state-reasons.subunit-empty" -msgstr "" +msgstr "Untereinheit leer" #. TRANSLATORS: Subunit Full msgid "printer-state-reasons.subunit-full" -msgstr "" +msgstr "Untereinheit voll" #. TRANSLATORS: Subunit Life Almost Over msgid "printer-state-reasons.subunit-life-almost-over" @@ -14261,11 +14512,11 @@ #. TRANSLATORS: Subunit Missing msgid "printer-state-reasons.subunit-missing" -msgstr "" +msgstr "Untereinheit fehlt" #. TRANSLATORS: Subunit Motor Failure msgid "printer-state-reasons.subunit-motor-failure" -msgstr "" +msgstr "Untereinheit-Motorstörung" #. TRANSLATORS: Subunit Near Limit msgid "printer-state-reasons.subunit-near-limit" @@ -14277,11 +14528,11 @@ #. TRANSLATORS: Subunit Opened msgid "printer-state-reasons.subunit-opened" -msgstr "" +msgstr "Untereinheit geöffnet" #. TRANSLATORS: Subunit Over Temperature msgid "printer-state-reasons.subunit-over-temperature" -msgstr "" +msgstr "Untereinheit über Temperatur" #. TRANSLATORS: Subunit Power Saver msgid "printer-state-reasons.subunit-power-saver" @@ -14297,7 +14548,7 @@ #. TRANSLATORS: Subunit Removed msgid "printer-state-reasons.subunit-removed" -msgstr "" +msgstr "Untereinheit entfernt" #. TRANSLATORS: Subunit Resource Added msgid "printer-state-reasons.subunit-resource-added" @@ -14317,15 +14568,15 @@ #. TRANSLATORS: Subunit Turned Off msgid "printer-state-reasons.subunit-turned-off" -msgstr "" +msgstr "Untereinheit ausgeschaltet" #. TRANSLATORS: Subunit Turned On msgid "printer-state-reasons.subunit-turned-on" -msgstr "" +msgstr "Untereinheit eingeschaltet" #. TRANSLATORS: Subunit Under Temperature msgid "printer-state-reasons.subunit-under-temperature" -msgstr "" +msgstr "Untereinheit unter Temperatur" #. TRANSLATORS: Subunit Unrecoverable Failure msgid "printer-state-reasons.subunit-unrecoverable-failure" @@ -14337,19 +14588,19 @@ #. TRANSLATORS: Subunit Warming Up msgid "printer-state-reasons.subunit-warming-up" -msgstr "" +msgstr "Untereinheit wärmt sich auf" #. TRANSLATORS: Printer stopped responding msgid "printer-state-reasons.timed-out" -msgstr "" +msgstr "Drucker reagiert nicht mehr" #. TRANSLATORS: Out of toner msgid "printer-state-reasons.toner-empty" -msgstr "" +msgstr "Toner leer" #. TRANSLATORS: Toner low msgid "printer-state-reasons.toner-low" -msgstr "" +msgstr "Tonerstand niedrig" #. TRANSLATORS: Trimmer Added msgid "printer-state-reasons.trimmer-added" @@ -14497,7 +14748,7 @@ #. TRANSLATORS: Unknown msgid "printer-state-reasons.unknown" -msgstr "" +msgstr "Unbekannt" #. TRANSLATORS: Wrapper Added msgid "printer-state-reasons.wrapper-added" @@ -14645,62 +14896,62 @@ #. TRANSLATORS: Idle msgid "printer-state.3" -msgstr "" +msgstr "Untätig" #. TRANSLATORS: Processing msgid "printer-state.4" -msgstr "" +msgstr "In Bearbeitung" #. TRANSLATORS: Stopped msgid "printer-state.5" -msgstr "" +msgstr "Angehalten" #. TRANSLATORS: Printer Uptime msgid "printer-up-time" -msgstr "" +msgstr "Drucker-Betriebszeit" msgid "processing" msgstr "in Verarbeitung" #. TRANSLATORS: Proof Print msgid "proof-print" -msgstr "" +msgstr "Korrekturdruck" #. TRANSLATORS: Proof Print Copies msgid "proof-print-copies" -msgstr "" +msgstr "Anzahl Korrekturdrucke" #. TRANSLATORS: Punching msgid "punching" -msgstr "" +msgstr "Lochung" #. TRANSLATORS: Punching Locations msgid "punching-locations" -msgstr "" +msgstr "Lochpositionen" #. TRANSLATORS: Punching Offset msgid "punching-offset" -msgstr "" +msgstr "Lochversatz" #. TRANSLATORS: Punch Edge msgid "punching-reference-edge" -msgstr "" +msgstr "Lochrand" #. TRANSLATORS: Bottom msgid "punching-reference-edge.bottom" -msgstr "" +msgstr "unten" #. TRANSLATORS: Left msgid "punching-reference-edge.left" -msgstr "" +msgstr "links" #. TRANSLATORS: Right msgid "punching-reference-edge.right" -msgstr "" +msgstr "rechts" #. TRANSLATORS: Top msgid "punching-reference-edge.top" -msgstr "" +msgstr "oben" #, c-format msgid "request id is %s-%d (%d file(s))" @@ -14711,15 +14962,15 @@ #. TRANSLATORS: Requested Attributes msgid "requested-attributes" -msgstr "" +msgstr "Angefragte Attribute" #. TRANSLATORS: Retry Interval msgid "retry-interval" -msgstr "" +msgstr "Intervall für Wiederholung" #. TRANSLATORS: Retry Timeout msgid "retry-time-out" -msgstr "" +msgstr "Zeitlimit für Wiederholung" #. TRANSLATORS: Save Disposition msgid "save-disposition" @@ -14727,31 +14978,31 @@ #. TRANSLATORS: None msgid "save-disposition.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Print and Save msgid "save-disposition.print-save" -msgstr "" +msgstr "Drucken und speichern" #. TRANSLATORS: Save Only msgid "save-disposition.save-only" -msgstr "" +msgstr "Nur speichern" #. TRANSLATORS: Save Document Format msgid "save-document-format" -msgstr "" +msgstr "Speicherformat" #. TRANSLATORS: Save Info msgid "save-info" -msgstr "" +msgstr "Speicherinformationen" #. TRANSLATORS: Save Location msgid "save-location" -msgstr "" +msgstr "Speicherort" #. TRANSLATORS: Save Name msgid "save-name" -msgstr "" +msgstr "Speichername" msgid "scheduler is not running" msgstr "Zeitplandienst läuft nicht" @@ -14761,47 +15012,47 @@ #. TRANSLATORS: Separator Sheets msgid "separator-sheets" -msgstr "" +msgstr "Trennblätter" #. TRANSLATORS: Type of Separator Sheets msgid "separator-sheets-type" -msgstr "" +msgstr "Typ der Trennblätter" #. TRANSLATORS: Start and End Sheets msgid "separator-sheets-type.both-sheets" -msgstr "" +msgstr "Anfangs- und Endblatt" #. TRANSLATORS: End Sheet msgid "separator-sheets-type.end-sheet" -msgstr "" +msgstr "Endblatt" #. TRANSLATORS: None msgid "separator-sheets-type.none" -msgstr "" +msgstr "Keines" #. TRANSLATORS: Slip Sheets msgid "separator-sheets-type.slip-sheets" -msgstr "" +msgstr "Trennblatt" #. TRANSLATORS: Start Sheet msgid "separator-sheets-type.start-sheet" -msgstr "" +msgstr "Anfangsblatt" #. TRANSLATORS: 2-Sided Printing msgid "sides" -msgstr "" +msgstr "Duplexdruck" #. TRANSLATORS: Off msgid "sides.one-sided" -msgstr "" +msgstr "Aus" #. TRANSLATORS: On (Portrait) msgid "sides.two-sided-long-edge" -msgstr "" +msgstr "Ein (Hochformat)" #. TRANSLATORS: On (Landscape) msgid "sides.two-sided-short-edge" -msgstr "" +msgstr "Duplex querformat" #, c-format msgid "stat of %s failed: %s" @@ -14812,7 +15063,7 @@ #. TRANSLATORS: Status Message msgid "status-message" -msgstr "" +msgstr "Statusnachricht" #. TRANSLATORS: Staple msgid "stitching" @@ -14832,7 +15083,7 @@ #. TRANSLATORS: Automatic msgid "stitching-method.auto" -msgstr "" +msgstr "Automatisch" #. TRANSLATORS: Crimp msgid "stitching-method.crimp" @@ -14840,7 +15091,7 @@ #. TRANSLATORS: Wire msgid "stitching-method.wire" -msgstr "" +msgstr "Draht" #. TRANSLATORS: Stitching Offset msgid "stitching-offset" @@ -14852,26 +15103,26 @@ #. TRANSLATORS: Bottom msgid "stitching-reference-edge.bottom" -msgstr "" +msgstr "unten" #. TRANSLATORS: Left msgid "stitching-reference-edge.left" -msgstr "" +msgstr "links" #. TRANSLATORS: Right msgid "stitching-reference-edge.right" -msgstr "" +msgstr "rechts" #. TRANSLATORS: Top msgid "stitching-reference-edge.top" -msgstr "" +msgstr "oben" msgid "stopped" msgstr "angehalten" #. TRANSLATORS: Subject msgid "subject" -msgstr "" +msgstr "Thema" #. TRANSLATORS: Subscription Privacy Attributes msgid "subscription-privacy-attributes" @@ -14879,23 +15130,23 @@ #. TRANSLATORS: All msgid "subscription-privacy-attributes.all" -msgstr "" +msgstr "Alle" #. TRANSLATORS: Default msgid "subscription-privacy-attributes.default" -msgstr "" +msgstr "Standard" #. TRANSLATORS: None msgid "subscription-privacy-attributes.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Subscription Description msgid "subscription-privacy-attributes.subscription-description" -msgstr "" +msgstr "Subskriptionsbeschreibung" #. TRANSLATORS: Subscription Template msgid "subscription-privacy-attributes.subscription-template" -msgstr "" +msgstr "Subskriptionsvorlage" #. TRANSLATORS: Subscription Privacy Scope msgid "subscription-privacy-scope" @@ -14903,19 +15154,19 @@ #. TRANSLATORS: All msgid "subscription-privacy-scope.all" -msgstr "" +msgstr "Alle" #. TRANSLATORS: Default msgid "subscription-privacy-scope.default" -msgstr "" +msgstr "Voreinstellung" #. TRANSLATORS: None msgid "subscription-privacy-scope.none" -msgstr "" +msgstr "Keine" #. TRANSLATORS: Owner msgid "subscription-privacy-scope.owner" -msgstr "" +msgstr "Eigentümer" #, c-format msgid "system default destination: %s" @@ -14927,87 +15178,87 @@ #. TRANSLATORS: T33 Subaddress msgid "t33-subaddress" -msgstr "T33 Subaddress" +msgstr "T33-Subadresse" #. TRANSLATORS: To Name msgid "to-name" -msgstr "" +msgstr "An Name" #. TRANSLATORS: Transmission Status msgid "transmission-status" -msgstr "" +msgstr "Übertragungsstatus" #. TRANSLATORS: Pending msgid "transmission-status.3" -msgstr "" +msgstr "ausstehend" #. TRANSLATORS: Pending Retry msgid "transmission-status.4" -msgstr "" +msgstr "Wiederholung ausstehend" #. TRANSLATORS: Processing msgid "transmission-status.5" -msgstr "" +msgstr "in Bearbeitung" #. TRANSLATORS: Canceled msgid "transmission-status.7" -msgstr "" +msgstr "Abgebrochen" #. TRANSLATORS: Aborted msgid "transmission-status.8" -msgstr "" +msgstr "Abgebrochen" #. TRANSLATORS: Completed msgid "transmission-status.9" -msgstr "" +msgstr "Fertig" #. TRANSLATORS: Cut msgid "trimming" -msgstr "" +msgstr "Schnitt" #. TRANSLATORS: Cut Position msgid "trimming-offset" -msgstr "" +msgstr "Schnittposition" #. TRANSLATORS: Cut Edge msgid "trimming-reference-edge" -msgstr "" +msgstr "Schnittkante" #. TRANSLATORS: Bottom msgid "trimming-reference-edge.bottom" -msgstr "" +msgstr "unten" #. TRANSLATORS: Left msgid "trimming-reference-edge.left" -msgstr "" +msgstr "links" #. TRANSLATORS: Right msgid "trimming-reference-edge.right" -msgstr "" +msgstr "rechts" #. TRANSLATORS: Top msgid "trimming-reference-edge.top" -msgstr "" +msgstr "oben" #. TRANSLATORS: Type of Cut msgid "trimming-type" -msgstr "" +msgstr "Schnittyp" #. TRANSLATORS: Draw Line msgid "trimming-type.draw-line" -msgstr "" +msgstr "Linie zeichnen" #. TRANSLATORS: Full msgid "trimming-type.full" -msgstr "" +msgstr "voll" #. TRANSLATORS: Partial msgid "trimming-type.partial" -msgstr "" +msgstr "teilweise" #. TRANSLATORS: Perforate msgid "trimming-type.perforate" -msgstr "" +msgstr "perforieren" #. TRANSLATORS: Score msgid "trimming-type.score" @@ -15015,27 +15266,27 @@ #. TRANSLATORS: Tab msgid "trimming-type.tab" -msgstr "" +msgstr "Tabulator" #. TRANSLATORS: Cut After msgid "trimming-when" -msgstr "" +msgstr "Schnitt nach" #. TRANSLATORS: Every Document msgid "trimming-when.after-documents" -msgstr "" +msgstr "Dokument" #. TRANSLATORS: Job msgid "trimming-when.after-job" -msgstr "" +msgstr "Auftrag" #. TRANSLATORS: Every Set msgid "trimming-when.after-sets" -msgstr "" +msgstr "jedem Satz" #. TRANSLATORS: Every Page msgid "trimming-when.after-sheets" -msgstr "" +msgstr "jeder Seite" msgid "unknown" msgstr "Unbekannt" @@ -15048,74 +15299,74 @@ #. TRANSLATORS: X Accuracy msgid "x-accuracy" -msgstr "" +msgstr "x-Genauigkeit" #. TRANSLATORS: X Dimension msgid "x-dimension" -msgstr "" +msgstr "x-Dimension" #. TRANSLATORS: X Offset msgid "x-offset" -msgstr "" +msgstr "x-Versatz" #. TRANSLATORS: X Origin msgid "x-origin" -msgstr "" +msgstr "x-Ursprung" #. TRANSLATORS: Y Accuracy msgid "y-accuracy" -msgstr "" +msgstr "y-Genauigkeit" #. TRANSLATORS: Y Dimension msgid "y-dimension" -msgstr "" +msgstr "y-Dimension" #. TRANSLATORS: Y Offset msgid "y-offset" -msgstr "" +msgstr "y-Versatz" #. TRANSLATORS: Y Origin msgid "y-origin" -msgstr "" +msgstr "y-Ursprung" #. TRANSLATORS: Z Accuracy msgid "z-accuracy" -msgstr "" +msgstr "z-Genauigkeit" #. TRANSLATORS: Z Dimension msgid "z-dimension" -msgstr "" +msgstr "z-Dimension" #. TRANSLATORS: Z Offset msgid "z-offset" -msgstr "" +msgstr "z-Versatz" msgid "{service_domain} Domain name" -msgstr "" +msgstr "{service_domain} Domänenname" msgid "{service_hostname} Fully-qualified domain name" -msgstr "" +msgstr "{service_hostname} Voll qualifizierter Domänenname" msgid "{service_name} Service instance name" msgstr "" msgid "{service_port} Port number" -msgstr "" +msgstr "{service_port} Portnummer" msgid "{service_regtype} DNS-SD registration type" msgstr "" msgid "{service_scheme} URI scheme" -msgstr "" +msgstr "{service_scheme} URI-Schema" msgid "{service_uri} URI" -msgstr "" +msgstr "{service_uri} URI" msgid "{txt_*} Value of TXT record key" msgstr "" msgid "{} URI" -msgstr "" +msgstr "{} URI" msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "" diff -Nru cups-2.3.3op2/locale/cups_en.po cups-2.4.1op1/locale/cups_en.po --- cups-2.3.3op2/locale/cups_en.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_en.po 2022-01-27 11:11:42.000000000 +0000 @@ -23,8 +23,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3.0\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: English\n" @@ -1225,6 +1225,10 @@ "%s: Error - %s environment variable names non-existent destination \"%s\"." #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Error - add '/version=1.1' to server name." @@ -1245,6 +1249,14 @@ msgstr "%s: Error - copies must be 1 or more." #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Error - expected character set after \"-S\" option." @@ -1261,6 +1273,10 @@ msgstr "%s: Error - expected copies after \"-n\" option." #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Error - expected destination after \"-P\" option." @@ -1269,6 +1285,10 @@ msgstr "%s: Error - expected destination after \"-d\" option." #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: Error - expected form after \"-f\" option." @@ -1285,6 +1305,14 @@ msgstr "%s: Error - expected hostname after \"-h\" option." #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Error - expected mode list after \"-y\" option." @@ -1293,6 +1321,18 @@ msgstr "%s: Error - expected name after \"-%c\" option." #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: Error - expected option=value after \"-o\" option." @@ -1301,6 +1341,10 @@ msgstr "%s: Error - expected page list after \"-P\" option." #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Error - expected priority after \"-%c\" option." @@ -1309,6 +1353,14 @@ msgstr "%s: Error - expected reason text after \"-r\" option." #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Error - expected title after \"-t\" option." @@ -1373,6 +1425,10 @@ msgstr "%s: Error - unknown option \"%s\"." #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: Expected job ID after \"-i\" option." @@ -1579,6 +1635,9 @@ msgid "--language locale Show models matching the given locale" msgstr "--language locale Show models matching the given locale" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "--local True if service is local" @@ -1851,6 +1910,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "-M manufacturer Set manufacturer name (default=Test)" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "-P destination Show status for the specified destination" @@ -1885,6 +1947,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "-S Test with encryption using HTTPS" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "-T seconds Set the browse timeout in seconds" @@ -1997,8 +2062,8 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "-h server[:port] Connect to the named server and port" -msgid "-i iconfile.png Set icon file" -msgstr "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" +msgstr "" msgid "-i id Specify an existing job ID to modify" msgstr "-i id Specify an existing job ID to modify" @@ -2566,9 +2631,18 @@ msgid "3.00x3.00\"" msgstr "3.00x3.00\"" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3.00x5.00\"" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3.25x2.00\"" @@ -2650,6 +2724,9 @@ msgid "4.00x6.50\"" msgstr "4.00x6.50\"" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2701,6 +2778,9 @@ msgid "6.00x6.50\"" msgstr "6.00x6.50\"" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2764,12 +2844,18 @@ msgid "8.00x6.50\"" msgstr "8.00x6.50\"" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/sec." +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3667,6 +3753,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "Got a printer-uri attribute but no job-id." +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "Grayscale" @@ -15305,5 +15394,8 @@ msgid "~/.cups/lpoptions file names default destination that does not exist." msgstr "~/.cups/lpoptions file names default destination that does not exist." +#~ msgid "-i iconfile.png Set icon file" +#~ msgstr "-i iconfile.png Set icon file" + #~ msgid "Dymo" #~ msgstr "Dymo" diff -Nru cups-2.3.3op2/locale/cups_es.po cups-2.4.1op1/locale/cups_es.po --- cups-2.3.3op2/locale/cups_es.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_es.po 2022-01-27 11:11:42.000000000 +0000 @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2016-06-26 21:17+0100\n" "Last-Translator: Juan Pablo González Riopedre \n" "Language-Team: Spanish\n" @@ -1211,6 +1211,10 @@ "%s: Error - %s nombres de variables de entorno no existen en destino \"%s\"." #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Error - añada '/version=1.1' al nombre del servidor." @@ -1235,6 +1239,14 @@ msgstr "%s: Error - número de copias debe ser 1 o más." #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Error - se esperaba un juego de caracteres tras la opción \"-S\"." @@ -1251,6 +1263,10 @@ msgstr "%s: Error - se esperaba número de copias tras la opción \"-n\"." #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Error - se esperaba un destino tras la opción \"-P\"." @@ -1259,6 +1275,10 @@ msgstr "%s: Error - se esperaba un destino tras la opción \"-d\"." #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: Error - se esperaba un formulario tras la opción \"-f\"." @@ -1275,6 +1295,14 @@ msgstr "%s: Error - se esperaba un nombre de equipo tras la opción \"-h\"." #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Error - se esperaba una lista de modos tras la opción \"-y\"." @@ -1283,6 +1311,18 @@ msgstr "%s: Error - se esperaba un nombre tras la opción \"-%c\"." #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: Error - se esperaba opción=valor tras la opción \"-o\"." @@ -1291,6 +1331,10 @@ msgstr "%s: Error - se esperaba una lista de páginas tras la opción \"-P\"." #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Error - se esperaba un valor de prioridad tras la opción \"-%c\"." @@ -1299,6 +1343,14 @@ msgstr "%s: Error - se esperaba un texto con una razón tras la opción \"-r\"." #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Error - se esperaba un título tras la opción \"-t\"." @@ -1363,6 +1415,10 @@ msgstr "%s: Error - opción \"%s\" desconocida." #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: Se esperaba una ID de trabajo tras la opción \"-i\"." @@ -1563,6 +1619,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1825,6 +1884,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1857,6 +1919,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1965,7 +2030,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2502,9 +2567,18 @@ msgid "3.00x3.00\"" msgstr "3.00x3.00 pulg." +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3.00x5.00 pulg." +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3.25x2.00 pulg." @@ -2586,6 +2660,9 @@ msgid "4.00x6.50\"" msgstr "4.00x6.50 pulg." +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2637,6 +2714,9 @@ msgid "6.00x6.50\"" msgstr "6.00x6.50 pulg." +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2700,12 +2780,18 @@ msgid "8.00x6.50\"" msgstr "8.00x6.50 pulg." +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/seg" +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3604,6 +3690,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "Se ha obtenido el atributo printer-uri pero no el job-id." +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "Escale de grises" diff -Nru cups-2.3.3op2/locale/cups_fr.po cups-2.4.1op1/locale/cups_fr.po --- cups-2.3.3op2/locale/cups_fr.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_fr.po 2022-01-27 11:11:42.000000000 +0000 @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2012-12-12 11:12+0100\n" "Last-Translator: Stéphane Blondon \n" "Language-Team: French \n" @@ -1077,6 +1077,10 @@ msgstr "" #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s : erreur - ajouter « /version=1.1 » au nom du serveur." @@ -1097,6 +1101,14 @@ msgstr "%s : erreur - les copies doivent être supérieures ou égales à 1." #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s : erreur - jeu de caractères attendu après l'option « -S »." @@ -1113,6 +1125,10 @@ msgstr "%s : erreur - copies attendues après l'option « -n »." #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s : erreur - destination attendue après l'option « -P »." @@ -1121,6 +1137,10 @@ msgstr "%s : erreur - destination attendue après l'option « -d »." #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "" @@ -1137,6 +1157,14 @@ msgstr "%s : erreur - nom d'hôte attendu après l'option « -h »." #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "" @@ -1145,6 +1173,18 @@ msgstr "%s : erreur - nom attendu après l'option « -%c »." #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s : erreur - option=valeur attendu après l'option « -o »." @@ -1153,6 +1193,10 @@ msgstr "%s : erreur - liste de page attendue après l'option « -P »." #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s : erreur - priorité attendue après l'option « -%c »." @@ -1161,6 +1205,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s : erreur - titre attendu après l'option « -t »." @@ -1223,6 +1275,10 @@ msgstr "%s : erreur - option inconnue - « %s »." #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "" @@ -1420,6 +1476,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1682,6 +1741,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1714,6 +1776,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1822,7 +1887,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2359,9 +2424,18 @@ msgid "3.00x3.00\"" msgstr "3,00 x 3,00\"" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3,00 x 5,00\"" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3,25 x 2,00\"" @@ -2443,6 +2517,9 @@ msgid "4.00x6.50\"" msgstr "4,00 x 6,50\"" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2494,6 +2571,9 @@ msgid "6.00x6.50\"" msgstr "6,00 x 6,50\"" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2557,12 +2637,18 @@ msgid "8.00x6.50\"" msgstr "8,00 x 6,50\"" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/s" +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3451,6 +3537,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "" +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "Niveaux de gris" diff -Nru cups-2.3.3op2/locale/cups_it.po cups-2.4.1op1/locale/cups_it.po --- cups-2.3.3op2/locale/cups_it.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_it.po 2022-01-27 11:11:42.000000000 +0000 @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2013-07-14 12:00+0200\n" "Last-Translator: Giovanni Scafora \n" "Language-Team: Italian - Arch Linux Italian Team \n" @@ -1205,6 +1205,10 @@ "ambiente \"%s\"." #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: errore - aggiungere '/version=1.1' al nome del server." @@ -1229,6 +1233,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: errore - è previsto un set di caratteri dopo l'opzione \"-S\"." @@ -1245,6 +1257,10 @@ msgstr "%s: errore - sono previste delle copie dopo l'opzione \"-n\"." #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: errore - è prevista una destinazione dopo l'opzione \"-P\"." @@ -1253,6 +1269,10 @@ msgstr "%s: errore - è prevista una destinazione dopo l'opzione \"-d\"." #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: errore - è previsto un modulo dopo l'opzione \"-f\"." @@ -1269,6 +1289,14 @@ msgstr "%s: errore - è previsto un hostname dopo l'opzione \"-h\"." #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, 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" @@ -1279,6 +1307,18 @@ msgstr "%s: errore - è previsto un nome dopo l'opzione \"-%c\"." #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: errore - è previsto un opzione=valore dopo l'opzione \"-o\"." @@ -1287,6 +1327,10 @@ msgstr "%s: errore - è previsto un elenco di pagine dopo l'opzione \"-P\"." #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: errore - è prevista una priorità dopo l'opzione \"-%c\"." @@ -1295,6 +1339,14 @@ msgstr "%s: errore - è previsto un testo del motivo dopo l'opzione \"-r\"." #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: errore - è previsto un titolo dopo l'opzione \"-t\"." @@ -1359,6 +1411,10 @@ msgstr "%s: errore - opzione sconosciuta \"%s\"." #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: è previsto un ID del processo dopo l'opzione \"-i\"." @@ -1560,6 +1616,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1822,6 +1881,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1854,6 +1916,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1962,7 +2027,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2499,9 +2564,18 @@ msgid "3.00x3.00\"" msgstr "3.00x3.00\"" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3.00x5.00\"" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3.25x2.00\"" @@ -2583,6 +2657,9 @@ msgid "4.00x6.50\"" msgstr "4.00x6.50\"" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2634,6 +2711,9 @@ msgid "6.00x6.50\"" msgstr "6.00x6.50\"" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2697,12 +2777,18 @@ msgid "8.00x6.50\"" msgstr "8.00x6.50\"" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/sec." +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3601,6 +3687,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "Esiste un attributo printer-uri ma nessun job-id." +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "Scala di grigi" diff -Nru cups-2.3.3op2/locale/cups_ja.po cups-2.4.1op1/locale/cups_ja.po --- cups-2.3.3op2/locale/cups_ja.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_ja.po 2022-01-27 11:11:42.000000000 +0000 @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2014-11-15 19:27+0900\n" "Last-Translator: OPFC TRANSCUPS \n" "Language-Team: Japanese - OPFC TRANSCUPS \n" @@ -1203,6 +1203,10 @@ msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指しています。" #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: エラー - '/version=1.1' をサーバー名に付与してください。" @@ -1226,6 +1230,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: エラー - \"-S\" オプションのあとには文字セットが必要です。" @@ -1242,6 +1254,10 @@ msgstr "%s: エラー - \"-n\" オプションのあとにはコピー数が必要です。" #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: エラー - \"-P\" オプションのあとには宛先が必要です。" @@ -1250,6 +1266,10 @@ msgstr "%s: エラー - \"-d\" オプションのあとにはプリンター名が必要です。" #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: エラー - \"-f\" オプションのあとには用紙名が必要です。" @@ -1266,6 +1286,14 @@ msgstr "%s: エラー - \"-h\" オプションのあとにはホスト名が必要です。" #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: エラー - \"-y\" オプションのあとにはモードリストが必要です。" @@ -1274,6 +1302,18 @@ msgstr "%s: エラー - \"-%c\" オプションのあとには名前が必要です。" #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: エラー - \"-o\" オプションのあとには オプション=値 が必要です。" @@ -1282,6 +1322,10 @@ msgstr "%s: エラー - \"-P\" オプションのあとにはページリストが必要です。" #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: エラー - \"-%c\" オプションのあとには優先度が必要です。" @@ -1290,6 +1334,14 @@ msgstr "%s: エラー - \"-r\" のあとには理由のテキストが必要です。" #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: エラー - \"-t\" オプションのあとにはタイトルが必要です。" @@ -1354,6 +1406,10 @@ msgstr "%s: エラー - '%s' は未知のオプションです。" #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: '-i' オプションのあとにはジョブ ID が必要です。" @@ -1554,6 +1610,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1816,6 +1875,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1848,6 +1910,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1956,7 +2021,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2493,9 +2558,18 @@ msgid "3.00x3.00\"" msgstr "3.00x3.00インチ" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3.00x5.00 インチ" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3.25x2.00 インチ" @@ -2577,6 +2651,9 @@ msgid "4.00x6.50\"" msgstr "4.00x6.50 インチ" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2628,6 +2705,9 @@ msgid "6.00x6.50\"" msgstr "6.00x6.50 インチ" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2691,12 +2771,18 @@ msgid "8.00x6.50\"" msgstr "8.00x6.50 インチ" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 ミリメートル/秒" +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3599,6 +3685,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "printer-uri 属性を取得しましたが、job-id を取得できませんでした。" +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "グレースケール" diff -Nru cups-2.3.3op2/locale/cups_pt_BR.po cups-2.4.1op1/locale/cups_pt_BR.po --- cups-2.3.3op2/locale/cups_pt_BR.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_pt_BR.po 2022-01-27 11:11:42.000000000 +0000 @@ -21,8 +21,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2016-01-31 16:45-0200\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" @@ -1216,6 +1216,10 @@ "%s: Erro - A variável de ambiente %s contém destino inexistente \"%s\"." #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Erro - adicione '/version=1.1' ao nome do servidor." @@ -1240,6 +1244,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Erro - esperava uma codificação de caracteres após a opção \"-S\"." @@ -1256,6 +1268,10 @@ msgstr "%s: Erro - esperava cópias após a opção \"-n\"." #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Erro - esperava um destino após a opção \"-P\"." @@ -1264,6 +1280,10 @@ msgstr "%s: Erro - esperava um destino após a opção \"-d\"." #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: Erro - esperava um formulário após a opção \"-f\"." @@ -1280,6 +1300,14 @@ msgstr "%s: Erro - esperava o nome da máquina após a opção \"-h\"." #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Erro - esperava uma lista de modos após a opção \"-y\"." @@ -1288,6 +1316,18 @@ msgstr "%s: Erro - esperava um nome após a opção \"-%c\"." #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s: Erro - esperava opção=valor após a opção \"-o\"." @@ -1296,6 +1336,10 @@ msgstr "%s: Erro - esperava uma lista de página após a opção \"-P\"." #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Erro - esperava uma prioridade após a opção \"-%c\"." @@ -1304,6 +1348,14 @@ msgstr "%s: Erro - esperava um texto com motivo após a opção \"-r\"." #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Erro - esperava um título após a opção \"-t\"." @@ -1368,6 +1420,10 @@ msgstr "%s: Erro - opção desconhecida \"%s\"." #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: Esperava ID do trabalho após a \"-i\"." @@ -1567,6 +1623,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1829,6 +1888,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1861,6 +1923,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1969,7 +2034,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2506,9 +2571,18 @@ msgid "3.00x3.00\"" msgstr "3.00x3.00\"" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3.00x5.00\"" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3.25x2.00\"" @@ -2590,6 +2664,9 @@ msgid "4.00x6.50\"" msgstr "4.00x6.50\"" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2641,6 +2718,9 @@ msgid "6.00x6.50\"" msgstr "6.00x6.50\"" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2704,12 +2784,18 @@ msgid "8.00x6.50\"" msgstr "8.00x6.50\"" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 mm/s" +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3608,6 +3694,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "Atributo printer-ui obtido, mas nenhum job-id." +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "Escalas de cinza" diff -Nru cups-2.3.3op2/locale/cups_ru.po cups-2.4.1op1/locale/cups_ru.po --- cups-2.3.3op2/locale/cups_ru.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_ru.po 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.0\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2015-01-28 12:00-0800\n" "Last-Translator: Aleksandr Proklov\n" "Language-Team: Russian - PuppyRus Linux Team\n" @@ -1177,6 +1177,10 @@ "\"%s\"." #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s: Ошибка - добавьте '/version=1.1' к имени сервера." @@ -1200,6 +1204,14 @@ msgstr "" #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s: Ошибка - после параметра \"-S\" должен идти набор символов." @@ -1219,6 +1231,10 @@ "%s: Ошибка - после параметра \"-n\" должно быть указано количество копий." #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s: Ошибка - после параметра \"-P\" должно быть указано назначение." @@ -1227,6 +1243,10 @@ msgstr "%s: Ошибка - после параметра \"-d\" должно быть указано назначение." #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s: Ошибка - после параметра \"-f\" должна быть указана форма." @@ -1243,6 +1263,14 @@ msgstr "%s: Ошибка - после параметра \"-h\" должно быть указано имя хоста." #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s: Ошибка - после параметра \"-y\" должен быть указан список режимов." @@ -1251,6 +1279,18 @@ msgstr "%s: Ошибка - после параметра \"-%c\" должно быть указано имя." #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "" "%s: Ошибка - после параметра '-o' должна быть указана строка вида " @@ -1261,6 +1301,10 @@ msgstr "%s: Ошибка – после параметра \"-P\" должен идти список страниц." #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s: Ошибка - после параметра \"-%c\" должен быть указан приоритет." @@ -1269,6 +1313,14 @@ msgstr "%s: Ошибка - после параметра \"-r\" должен идти текст причины." #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s: Ошибка - после параметра \"-t\" должен быть указан заголовок." @@ -1335,6 +1387,10 @@ msgstr "%s: Ошибка - неизвестный параметр \"%s\"." #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s: После параметра \"-i\" должен быть указан ID задания." @@ -1535,6 +1591,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1797,6 +1856,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1829,6 +1891,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1937,7 +2002,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2474,9 +2539,18 @@ msgid "3.00x3.00\"" msgstr "3,00x3,00\"" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3,00x5,00\"" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3,25x2,00\"" @@ -2558,6 +2632,9 @@ msgid "4.00x6.50\"" msgstr "4,00x6,50\"" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2609,6 +2686,9 @@ msgid "6.00x6.50\"" msgstr "6,00x6,50\"" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2672,12 +2752,18 @@ msgid "8.00x6.50\"" msgstr "8,00x6,50\"" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 мм/с" +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3569,6 +3655,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "Получен атрибут printer-uri, но не job-id" +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "Оттенки серого" diff -Nru cups-2.3.3op2/locale/cups_zh_CN.po cups-2.4.1op1/locale/cups_zh_CN.po --- cups-2.3.3op2/locale/cups_zh_CN.po 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/locale/cups_zh_CN.po 2022-01-27 11:11:42.000000000 +0000 @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 2.3\n" -"Report-Msgid-Bugs-To: https://github.com/apple/cups/issues\n" -"POT-Creation-Date: 2019-12-18 20:19-0500\n" +"Report-Msgid-Bugs-To: https://github.com/openprinting/cups/issues\n" +"POT-Creation-Date: 2021-03-07 10:33-0500\n" "PO-Revision-Date: 2018-10-09 00:21-0500\n" "Last-Translator: Mingcong Bai \n" "Language-Team: Chinese (Simplified)\n" @@ -1176,6 +1176,10 @@ msgstr "%s:错误 — %s 环境变量指定了不存在的目的地“%s”。" #, c-format +msgid "%s: Error - The printer or class does not exist." +msgstr "" + +#, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "%s:错误 — 请将“/version=1.1”添加到服务器名称。" @@ -1196,6 +1200,14 @@ msgstr "%s:错误 — 副本数必须为至少 1。" #, c-format +msgid "%s: Error - expected \"username\" after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected PPD file after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected character set after \"-S\" option." msgstr "%s:错误 — 在“-S”选项后预期字符集。" @@ -1212,6 +1224,10 @@ msgstr "%s:错误 — 在“-n”选项后预期副本数量。" #, c-format +msgid "%s: Error - expected destination MIME type after \"-m\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected destination after \"-P\" option." msgstr "%s:错误 — 在“-P”选项后预期目的地。" @@ -1220,6 +1236,10 @@ msgstr "%s:错误 — 在“-d”选项后预期目的地。" #, c-format +msgid "%s: Error - expected filename after \"-c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected form after \"-f\" option." msgstr "%s:错误 — 在“-f”选项后预期表单。" @@ -1236,6 +1256,14 @@ msgstr "%s:错误 — 在“-h”选项后预期主机名。" #, c-format +msgid "%s: Error - expected input file after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected job-id after \"-j\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected mode list after \"-y\" option." msgstr "%s:错误 — 在“-y”选项后预期模式列表。" @@ -1244,6 +1272,18 @@ msgstr "%s:错误 — 在“-%c”选项后预期名称。" #, c-format +msgid "%s: Error - expected name=value after \"-a\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected number of copies after \"-n\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected option=value after \"-o\" option." msgstr "%s:错误 — 在“-o”选项后预期选项=赋值。" @@ -1252,6 +1292,10 @@ msgstr "%s:错误 — 在“-P”选项后预期页码列表。" #, c-format +msgid "%s: Error - expected printer name after \"-d\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected priority after \"-%c\" option." msgstr "%s:错误 — 在“-%c”选项后预期优先级。" @@ -1260,6 +1304,14 @@ msgstr "%s:错误 — 在“-r”选项后预期理由文本。" #, c-format +msgid "%s: Error - expected source MIME type after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-%c\" option." +msgstr "" + +#, c-format msgid "%s: Error - expected title after \"-t\" option." msgstr "%s:错误 — 在“-t”选项后预期标题。" @@ -1322,6 +1374,10 @@ msgstr "%s:错误 — 未知选项“%s”。" #, c-format +msgid "%s: Error - unknown option \"-%c\"." +msgstr "" + +#, c-format msgid "%s: Expected job ID after \"-i\" option." msgstr "%s:在选项“-i”后预期任务 ID。" @@ -1519,6 +1575,9 @@ msgid "--language locale Show models matching the given locale" msgstr "" +msgid "--literal-name name Match service name to literal name value" +msgstr "" + msgid "--local True if service is local" msgstr "" @@ -1781,6 +1840,9 @@ msgid "-M manufacturer Set manufacturer name (default=Test)" msgstr "" +msgid "-N name Match service name to literal name value" +msgstr "" + msgid "-P destination Show status for the specified destination" msgstr "" @@ -1813,6 +1875,9 @@ msgid "-S Test with encryption using HTTPS" msgstr "" +msgid "-S filename.strings Set strings file" +msgstr "" + msgid "-T seconds Set the browse timeout in seconds" msgstr "" @@ -1921,7 +1986,7 @@ msgid "-h server[:port] Connect to the named server and port" msgstr "" -msgid "-i iconfile.png Set icon file" +msgid "-i iconfile.png[,...] Set icon file(s)" msgstr "" msgid "-i id Specify an existing job ID to modify" @@ -2458,9 +2523,18 @@ msgid "3.00x3.00\"" msgstr "3.00×3.00 英寸" +msgid "3.00x4.00\"" +msgstr "" + msgid "3.00x5.00\"" msgstr "3.00×5.00 英寸" +msgid "3.00x6.00\"" +msgstr "" + +msgid "3.00x8.00\"" +msgstr "" + msgid "3.25x2.00\"" msgstr "3.25×2.00 英寸" @@ -2542,6 +2616,9 @@ msgid "4.00x6.50\"" msgstr "4.00×6.50 英寸" +msgid "4.00x8.00\"" +msgstr "" + msgid "40" msgstr "40" @@ -2593,6 +2670,9 @@ msgid "6.00x6.50\"" msgstr "6.00×6.50 英寸" +msgid "6.00x8.00\"" +msgstr "" + msgid "60" msgstr "60" @@ -2656,12 +2736,18 @@ msgid "8.00x6.50\"" msgstr "8.00×6.50 英寸" +msgid "8.26x1.00\"" +msgstr "" + msgid "80" msgstr "80" msgid "80 mm/sec." msgstr "80 毫米/秒" +msgid "80x50mm" +msgstr "" + msgid "85" msgstr "85" @@ -3558,6 +3644,9 @@ msgid "Got a printer-uri attribute but no job-id." msgstr "获取到了 printer-uri 属性却未获取到 job-id。" +msgid "GrayScale" +msgstr "" + msgid "Grayscale" msgstr "灰度" diff -Nru cups-2.3.3op2/man/backend.7 cups-2.4.1op1/man/backend.7 --- cups-2.3.3op2/man/backend.7 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/backend.7 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" Backend man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH backend 7 "CUPS" "26 April 2019" "Apple Inc." +.TH backend 7 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME backend \- cups backend transmission interfaces .SH SYNOPSIS @@ -217,4 +218,4 @@ .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cancel.1 cups-2.4.1op1/man/cancel.1 --- cups-2.3.3op2/man/cancel.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cancel.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" cancel man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cancel 1 "CUPS" "26 April 2019" "Apple Inc." +.TH cancel 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cancel \- cancel jobs .SH SYNOPSIS @@ -88,4 +89,4 @@ .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/classes.conf.5 cups-2.4.1op1/man/classes.conf.5 --- cups-2.3.3op2/man/classes.conf.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/classes.conf.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" classes.conf man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH classes.conf 5 "CUPS" "26 April 2019" "Apple Inc." +.TH classes.conf 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME classes.conf \- class configuration file for cups .SH DESCRIPTION @@ -27,4 +28,4 @@ .BR subscriptions.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/client.conf.5 cups-2.4.1op1/man/client.conf.5 --- cups-2.3.3op2/man/client.conf.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/client.conf.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" client.conf man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH client.conf 5 "CUPS" "15 October 2019" "Apple Inc." +.TH client.conf 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME client.conf \- client configuration file for cups (deprecated on macos) .SH DESCRIPTION @@ -140,4 +141,4 @@ .BR default (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cups-config.1 cups-2.4.1op1/man/cups-config.1 --- cups-2.3.3op2/man/cups-config.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cups-config.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,15 +1,16 @@ .\" .\" cups-config man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cups-config 1 "CUPS" "26 April 2019" "Apple Inc." +.TH cups-config 1 "CUPS" "2021-03-10" "OpenPrinting" .SH NAME -cups\-config \- get cups api, compiler, directory, and link information. +cups\-config \- get cups api, compiler, directory, and link information (deprecated). .SH SYNOPSIS .B cups\-config .I \-\-api\-version @@ -49,6 +50,11 @@ .SH DESCRIPTION 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. +.B Note: +This command is deprecated and will be removed in a future version of CUPS. +The +.BR pkg-config (1) +command should be used instead. .SH OPTIONS The \fBcups-config\fR command accepts the following command-line options: .TP 5 @@ -104,6 +110,7 @@ Formerly used to add the CUPS imaging library to the list of libraries. .SH SEE ALSO .BR cups (1), +.BR pkg-config (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cups-files.conf.5 cups-2.4.1op1/man/cups-files.conf.5 --- cups-2.3.3op2/man/cups-files.conf.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cups-files.conf.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,14 +1,14 @@ .\" .\" cups-files.conf man page for CUPS. .\" -.\" Copyright © 2020 by Michael R Sweet +.\" Copyright © 2020-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cups-files.conf 5 "CUPS" "14 November 2020" "Apple Inc." +.TH cups-files.conf 5 "CUPS" "2021-03-06" "OpenPrinting" .SH NAME cups\-files.conf \- file and directory configuration file for cups .SH DESCRIPTION @@ -245,18 +245,6 @@ File devices cannot be used with "raw" print queues - a PPD file is required. The specified file is overwritten for every print job. Writing to directories is not supported. -.\"#FontPath -.TP 5 -\fBFontPath \fIdirectory[:...:directoryN]\fR -Specifies a colon separated list of directories where fonts can be found. -On Linux the -.BR font-config (1) -mechanism is used instead. -On macOS the Font Book application manages system-installed fonts. -.\"#LPDConfigFile -.TP 5 -\fB LPDConfigFile \fIfilename\fR -Specifies the LPD service configuration file to update. .\"#Printcap .TP 5 \fBPrintcap \fIfilename\fR @@ -272,10 +260,6 @@ "bsd" is the historical LPD printcap file format. "plist" is the Apple plist file format. "solaris" is the historical Solaris LPD printcap file format. -.\"#SMBConfigFile -.TP 5 -\fBSMBConfigFile \fIfilename\fR -Specifies the SMB service configuration file to update. .SH NOTES The scheduler MUST be restarted manually after making changes to the \fBcups-files.conf\fR file. On Linux this is typically done using the @@ -294,6 +278,4 @@ .BR subscriptions.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2020 by Michael R Sweet -.br -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2020-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cups-lpd.8 cups-2.4.1op1/man/cups-lpd.8 --- cups-2.3.3op2/man/cups-lpd.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cups-lpd.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,14 +1,14 @@ .\" .\" cups-lpd man page for CUPS. .\" -.\" Copyright © 2020 by Michael R Sweet +.\" Copyright © 2020-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cups-lpd 8 "CUPS" "14 November 2020" "Apple Inc." +.TH cups-lpd 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cups-lpd \- receive print jobs and report printer status to lpd clients (deprecated) .SH SYNOPSIS @@ -114,5 +114,4 @@ CUPS Online Help (http://localhost:631/help), RFC 2569 .SH COPYRIGHT -Copyright \[co] 2020 by Michael R Sweet -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2020-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cups-snmp.8 cups-2.4.1op1/man/cups-snmp.8 --- cups-2.3.3op2/man/cups-snmp.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cups-snmp.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" SNMP backend man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2012-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cups-snmp 8 "CUPS" "26 April 2019" "Apple Inc." +.TH cups-snmp 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME snmp \- cups snmp backend (deprecated) .SH SYNOPSIS @@ -53,4 +54,4 @@ .BR lpinfo (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cups-snmp.conf.5 cups-2.4.1op1/man/cups-snmp.conf.5 --- cups-2.3.3op2/man/cups-snmp.conf.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cups-snmp.conf.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" snmp.conf man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH snmp.conf 5 "CUPS" "26 April 2019" "Apple Inc." +.TH snmp.conf 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME snmp.conf \- snmp configuration file for cups (deprecated) .SH DESCRIPTION @@ -63,4 +64,4 @@ .BR cups-snmp (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cups.1 cups-2.4.1op1/man/cups.1 --- cups-2.3.3op2/man/cups.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cups.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" cups (intro) man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cups 1 "CUPS" "26 April 2019" "Apple Inc." +.TH cups 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cups \- a standards-based, open source printing system .SH DESCRIPTION @@ -51,8 +52,8 @@ 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 +.B OpenPrinting CUPS +web site (https://openprinting.github.io/cups) provides access to the .I cups and .I cups-devel @@ -125,7 +126,7 @@ .BR ippeveprinter (1). .SH SEE ALSO .BR cancel (1), -.BR client.conf (7), +.BR client.conf (5), .BR cupsctl (8), .BR cupsd (8), .BR lp (1), @@ -137,7 +138,7 @@ .BR lpq (1), .BR lpstat (1), CUPS Online Help (http://localhost:631/help), -CUPS Web Site (http://www.CUPS.org), +OpenPrinting CUPS Web Site (https://openprinting.github.io/cups), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupsaccept.8 cups-2.4.1op1/man/cupsaccept.8 --- cups-2.3.3op2/man/cupsaccept.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupsaccept.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" cupsaccept/reject man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupsaccept 8 "CUPS" "26 April 2019" "Apple Inc." +.TH cupsaccept 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cupsaccept/cupsreject \- accept/reject jobs sent to a destination .SH SYNOPSIS @@ -83,4 +84,4 @@ .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupsctl.8 cups-2.4.1op1/man/cupsctl.8 --- cups-2.3.3op2/man/cupsctl.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupsctl.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" cupsctl man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupsctl 8 "CUPS" "26 April 2019" "Apple Inc." +.TH cupsctl 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cupsctl \- configure cupsd.conf options .SH SYNOPSIS @@ -95,4 +96,4 @@ .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupsd-helper.8 cups-2.4.1op1/man/cupsd-helper.8 --- cups-2.3.3op2/man/cupsd-helper.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupsd-helper.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" cupsd-helper man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright 2007-2019 by Apple Inc. .\" Copyright 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupsd-helper 8 "CUPS" "26 April 2019" "Apple Inc." +.TH cupsd-helper 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cupsd\-helper \- cupsd helper programs (deprecated) .SH SYNOPSIS @@ -87,4 +88,4 @@ .BR ppdcfile (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupsd-logs.5 cups-2.4.1op1/man/cupsd-logs.5 --- cups-2.3.3op2/man/cupsd-logs.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupsd-logs.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" cupsd-logs man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupsd-logs 5 "CUPS" "26 April 2019" "Apple Inc." +.TH cupsd-logs 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cupsd\-logs \- cupsd log files (access_log, error_log, and page_log) .SH DESCRIPTION @@ -219,4 +220,4 @@ .BR cups-files.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupsd.8 cups-2.4.1op1/man/cupsd.8 --- cups-2.3.3op2/man/cupsd.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupsd.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" cupsd man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupsd 8 "CUPS" "26 April 2019" "Apple Inc." +.TH cupsd 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cupsd \- cups scheduler .SH SYNOPSIS @@ -123,4 +124,4 @@ .BR systemd (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupsd.conf.5 cups-2.4.1op1/man/cupsd.conf.5 --- cups-2.3.3op2/man/cupsd.conf.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupsd.conf.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,14 +1,14 @@ .\" .\" cupsd.conf man page for CUPS. .\" -.\" Copyright © 2020 by Michael R Sweet +.\" Copyright © 2020-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupsd.conf 5 "CUPS" "28 November 2020" "Apple Inc." +.TH cupsd.conf 5 "CUPS" "2021-10-01" "OpenPrinting" .SH NAME cupsd.conf \- server configuration file for cups .SH DESCRIPTION @@ -80,8 +80,6 @@ .\"#DefaultAuthType .TP 5 \fBDefaultAuthType Basic\fR -.TP 5 -\fBDefaultAuthType Negotiate\fR .br Specifies the default type of authentication to use. The default is "Basic". @@ -109,6 +107,7 @@ 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". +Note: The default paper size must use a size name from the PPD file and not a PWG self-describing media size name. .\"#DefaultPolicy .TP 5 \fBDefaultPolicy \fIpolicy-name\fR @@ -162,11 +161,6 @@ 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 @@ -213,11 +207,6 @@ \fBKeepAlive No\fR Specifies whether to support HTTP keep-alive connections. The default is "Yes". -.\"#KeepAliveTimeout -.TP 5 -\fBKeepAliveTimeout \fIseconds\fR -Specifies how long an idle client connection remains open. -The default is "30". .\"#LimitIPP .TP 5 \fB \fR... \fB\fR @@ -247,13 +236,6 @@ 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. Note: "Listen *:\fIport\fR" and "Port \fIport\fR" effectively listen on all IP addresses, so you cannot combine them with Listen directives for explicit IPv4 or IPv6 addresses on the same port. -.\"#ListenBackLog -.TP 5 -\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 \fB \fR... \fB\fR @@ -343,6 +325,27 @@ Specifies the maximum size of the log files before they are rotated. The value "0" disables log rotation. The default is "1048576" (1MB). +.\"#MaxSubscriptions +.TP 5 +\fBMaxSubscriptions \fInumber\fR +Specifies the maximum number of simultaneous event subscriptions that are allowed. +Set to "0" to allow an unlimited number of subscriptions. +The default is "100". +.\"#MaxSubscriptionsPerJob +.TP 5 +\fBMaxSubscriptionsPerJob \fInumber\fR +Specifies the maximum number of simultaneous event subscriptions that are allowed per job. +The default is "0" which allows up to MaxSubscriptions subscriptions per job. +.\"#MaxSubscriptionsPerPrinter +.TP 5 +\fBMaxSubscriptionsPerPrinter \fInumber\fR +Specifies the maximum number of simultaneous event subscriptions that are allowed per printer. +The default is "0" which allows up to MaxSubscriptions subscriptions per printer. +.\"#MaxSubscriptionsPerUser +.TP 5 +\fBMaxSubscriptionsPerUser \fInumber\fR +Specifies the maximum number of simultaneous event subscriptions that are allowed per user. +The default is "0" which allows up to MaxSubscriptions subscriptions per user. .\"#MultipleOperationTimeout .TP 5 \fBMultipleOperationTimeout \fIseconds\fR @@ -377,6 +380,13 @@ 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". +.\"#ReadyPaperSizes +.TP 5 +\fBReadyPaperSizes \fIsizename[,...]\fR +Specifies a list of potential paper sizes that are reported as "ready" (loaded). +The actual list will only contain sizes that each printer supports. +The default is "Letter,Legal,Tabloid,4x6,Env10" when the default paper size is "Letter" and "A3,A4,A5,A6,EnvDL" otherwise. +Note: Paper sizes must use the size names from the PPD file and not PWG self-describing media size names. .\"#ReloadTimeout .TP 5 \fBReloadTimeout \fIseconds\fR @@ -701,8 +711,6 @@ \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 @@ -816,6 +824,9 @@ The "default" values are "notify-events", "notify-pull-method", "notify-recipient-uri", "notify-subscriber-user-name", and "notify-user-data". .SS DEPRECATED DIRECTIVES The following directives are deprecated and will be removed in a future release of CUPS: +.TP 5 +\fBAuthType Negotiate\fR +Specifies Kerberos authentication is required. .\"#Classification .TP 5 \fBClassification \fIbanner\fR @@ -831,6 +842,14 @@ .br Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option. The default is "No". +.TP 5 +\fBDefaultAuthType Negotiate\fR +Specifies that Kerberos authentication is required by default. +.\"#GSSServiceName +.TP 5 +\fBGSSServiceName \fIname\fR +Specifies the service name when using Kerberos authentication. +The default service name is "http." .\"#PageLogFormat .TP 5 \fBPageLogFormat \fIformat-string\fR @@ -852,11 +871,6 @@ 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. Use "%{job-impressions-completed}" to insert the number of pages (sides) that were printed, or "%{job-media-sheets-completed}" to insert the number of sheets that were printed. -.\"#RIPCache -.TP 5 -\fBRIPCache \fIsize\fR -Specifies the maximum amount of memory to use when converting documents into bitmaps for a printer. -The default is "128m". .SH NOTES 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) @@ -904,6 +918,4 @@ .BR subscriptions.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2020 by Michael R Sweet -.br -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2020-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupsenable.8 cups-2.4.1op1/man/cupsenable.8 --- cups-2.3.3op2/man/cupsenable.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupsenable.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" cupsenable/cupsdisable man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupsenable 8 "CUPS" "26 April 2019" "Apple Inc." +.TH cupsenable 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cupsdisable, cupsenable \- stop/start printers and classes .SH SYNOPSIS @@ -94,4 +95,4 @@ .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupsfilter.8 cups-2.4.1op1/man/cupsfilter.8 --- cups-2.3.3op2/man/cupsfilter.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupsfilter.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" cupsfilter man page for CUPS. .\" -.\" Copyright 2007-2019 by Apple Inc. +.\" Copyright © 2021-2022 by OpenPrinting. +.\" Copyright © 2007-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupsfilter 8 "CUPS" "26 April 2019" "Apple Inc." +.TH cupsfilter 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME cupsfilter \- convert a file to another format using cups filters (deprecated) .SH SYNOPSIS @@ -136,4 +137,4 @@ .BR mime.types (7), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/cupstestppd.1 cups-2.4.1op1/man/cupstestppd.1 --- cups-2.3.3op2/man/cupstestppd.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/cupstestppd.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,15 +1,16 @@ .\" .\" cupstestppd man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH cupstestppd 1 "CUPS" "26 April 2019" "Apple Inc." +.TH cupstestppd 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME -cupstestppd \- test conformance of ppd files +cupstestppd \- test conformance of ppd files (deprecated) .SH SYNOPSIS .B cupstestppd [ @@ -144,4 +145,4 @@ CUPS Online Help (http://localhost:631/help), Adobe PostScript Printer Description File Format Specification, Version 4.3. .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/filter.7 cups-2.4.1op1/man/filter.7 --- cups-2.3.3op2/man/filter.7 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/filter.7 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" filter man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH filter 7 "CUPS" "26 April 2019" "Apple Inc." +.TH filter 7 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME filter \- cups file conversion filter interface .SH SYNOPSIS @@ -218,4 +219,4 @@ .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ippevepcl.7 cups-2.4.1op1/man/ippevepcl.7 --- cups-2.3.3op2/man/ippevepcl.7 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ippevepcl.7 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" ippevepcl/ps man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ippevepcl/ps 7 "CUPS" "24 April 2019" "Apple Inc." +.TH ippevepcl/ps 7 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME ippevepcl/ps \- pcl and postscript print commands for ippeveprinter .SH SYNOPSIS @@ -45,4 +46,4 @@ .SH SEE ALSO .BR ippeveprinter (8) .SH COPYRIGHT -Copyright \[co] 2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ippeveprinter.1 cups-2.4.1op1/man/ippeveprinter.1 --- cups-2.3.3op2/man/ippeveprinter.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ippeveprinter.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" ippeveprinter man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2014-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ippeveprinter 1 "CUPS" "2 December 2019" "Apple Inc." +.TH ippeveprinter 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME ippeveprinter \- an ipp everywhere printer application for cups .SH SYNOPSIS @@ -270,4 +271,4 @@ .BR ippeveps (7), PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ippfind.1 cups-2.4.1op1/man/ippfind.1 --- cups-2.3.3op2/man/ippfind.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ippfind.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" ippfind man page. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2013-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ippfind 1 "ippsample" "26 April 2019" "Apple Inc." +.TH ippfind 1 "ippsample" "2021-02-28" "OpenPrinting" .SH NAME ippfind \- find internet printing protocol printers .SH SYNOPSIS @@ -255,4 +256,4 @@ .SH SEE ALSO .BR ipptool (1) .SH COPYRIGHT -Copyright \[co] 2013-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ipptool.1 cups-2.4.1op1/man/ipptool.1 --- cups-2.3.3op2/man/ipptool.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ipptool.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" ipptool man page. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2010-2019 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ipptool 1 "CUPS" "26 April 2019" "Apple Inc." +.TH ipptool 1 "CUPS" "2021-10-20" "OpenPrinting" .SH NAME ipptool \- perform internet printing protocol requests .SH SYNOPSIS @@ -59,6 +60,8 @@ .B \-i .I seconds ] [ +.B \-j +] [ .B \-n .I repeat-count ] [ @@ -170,6 +173,11 @@ should be repeated at the specified interval. This option is incompatible with the \fB\-X\fR (XML plist output) option. .TP 5 +.B \-j +Specifies that +.B ipptool +will produce JSON output. +.TP 5 .B \-l Specifies that plain text output is desired. .TP 5 @@ -195,36 +203,37 @@ .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 + + 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\-notifications.test + get\-printer\-attributes.test + get\-subscriptions.test + gray.jpg + ipp\-1.1.test + ipp\-2.0.test + ipp\-2.1.test + ipp\-2.2.test + ipp\-everywhere.test + onepage\-a4.pdf + onepage\-a4.ps + onepage\-letter.pdf + onepage\-letter.ps + print\-job.test + print\-job\-deflate.test + print\-job\-gzip.test + testfile.jpg + testfile.pcl + testfile.pdf + testfile.ps + testfile.txt + validate\-job.test .fi .SH CONFORMING TO The @@ -245,8 +254,8 @@ .fi .SH SEE ALSO .BR ipptoolfile (5), -IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations), -PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) -RFC 8011 (http://tools.ietf.org/html/rfc8011), +IANA IPP Registry (https://www.iana.org/assignments/ipp\-registrations), +PWG Internet Printing Protocol Workgroup (https://www.pwg.org/ipp) +RFC 8011 (https://datatracker.ietf.org/doc/html/rfc8011), .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ipptoolfile.5 cups-2.4.1op1/man/ipptoolfile.5 --- cups-2.3.3op2/man/ipptoolfile.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ipptoolfile.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" ipptoolfile man page. .\" -.\" Copyright © 2010-2019 by Apple Inc. +.\" Copyright © 2021-2022 by OpenPrinting. +.\" Copyright © 2010-2021 by Apple Inc. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ipptoolfile 5 "CUPS" "15 August 2019" "Apple Inc." +.TH ipptoolfile 5 "CUPS" "2021-09-20" "OpenPrinting" .SH NAME ipptoolfile \- ipptool file format .SH DESCRIPTION @@ -214,12 +215,21 @@ .BR ipptool (8) will ignore errors and continue with subsequent tests. .TP 5 +\fBMONITOR-PRINTER-STATE \fR[ \fIprinter-uri \fR] \fB{ EXPECT \fIattribute-name \fR[ \fIpredicate(s) \fR] \fB}\fR +Specifies printer state monitoring tests to run in parallel with the test operation. +The monitoring tests will run until all of the \fBEXPECT\fR conditions are satisfied or the primary test operation has completed, whichever occurs first. +.TP 5 \fBNAME "\fIliteral string\fB"\fR Specifies the human-readable name of the test. .TP 5 \fBOPERATION \fIoperation-code\fR Specifies the operation to be performed. .TP 5 +\fBPASS\-IF\-DEFINED \fIvariable-name\fR +.TP 5 +\fBPASS\-IF\-NOT\-DEFINED \fIvariable-name\fR +Specifies that the current test should be passed automatically when the variable is or is not defined. +.TP 5 \fBPAUSE "\fImessage\fB"\fR Displays the provided message and waits for the user to press a key to continue. .TP 5 @@ -277,13 +287,19 @@ Requires the \fBEXPECT\fR attribute to have the specified number of values. .TP 5 \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. +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 \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. +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 \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. +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 +\fBDISPLAY\-MATCH \fI"message"\fR +Displays the specified message when the \fBEXPECT\fR condition matches. .TP 5 \fBIF\-DEFINED \fIvariable-name\fR Makes the \fBEXPECT\fR conditions apply only if the specified variable is defined. @@ -294,8 +310,9 @@ \fBIN\-GROUP \fItag\fR Requires the \fBEXPECT\fR attribute to be in the specified group tag. .TP 5 -\fBOF\-TYPE \fItag[|tag,...]\fR +\fBOF\-TYPE \fItag[(limits)|tag|...]\fR Requires the \fBEXPECT\fR attribute to use one of the specified value tag(s). +Most value tags also support the specification of limits in parenthesis, for example "name(42)" would allow nameWith/WithoutLanguage strings up to 42 octets in length, "name(4:MAX)" would allow nameWith/WithoutLanguage strings between 4 and 255 octets in length, and "integer(-273:MAX)" would allow integers between -273 and 2147483647. .TP 5 \fBREPEAT\-LIMIT \fInumber\fR .br @@ -342,7 +359,13 @@ Requires that all values of the \fBEXPECT\fR attribute match the boolean value given. .TP 5 \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. +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 +\fBWITH\-DISTINCT\-VALUES\fR +Requires that all values of the \fBEXPECT\fR attribute are unique. +Comparisons are case-sensitive. +Only charset, collection, enum, integer, keyword, mimeMediaType, naturalLanguage, rangeOfInteger, resolution, uriScheme attributes support this predicate. .TP 5 \fBWITH\-HOSTNAME "\fIliteral string\fB"\fR .TP 5 @@ -410,11 +433,32 @@ .BR ipptool (8): .nf + Acknowledge\-Document + Acknowledge\-Identify\-Printer + Acknowledge\-Job Activate\-Printer + Add\-Document\-Images + Allocate\-Printer\-Resources + Cancel\-Current\-Job + Cancel\-Job + Cancel\-Jobs + Cancel\-My\-Jobs + Cancel\-Resource + Cancel\-Subscription + Close\-Job + Create\-Job + Create\-Job\-Subscriptions + Create\-Printer + Create\-Printer\-Subscriptions + Create\-Resource + Create\-Resource\-Subscriptions + Create\-System\-Subscriptions + CUPS\-Accept\-Jobs CUPS\-Accept\-Jobs CUPS\-Add\-Modify\-Class CUPS\-Add\-Modify\-Printer CUPS\-Authenticate\-Job + CUPS\-Create\-Local\-Printer CUPS\-Delete\-Class CUPS\-Delete\-Printer CUPS\-Get\-Classes @@ -427,54 +471,74 @@ 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 + Deallocate\-Printer\-Resources + Delete\-Printer + Deregister\-Output\-Device + Disable\-All\-Printers Disable\-Printer + Enable\-All\-Printers Enable\-Printer + Fetch\-Document + Fetch\-Job Get\-Job\-Attributes Get\-Jobs + Get\-Next\-Document\-Data Get\-Notifications + Get\-Output\-Device\-Attributes Get\-Printer\-Attributes Get\-Printer\-Support\-Files Get\-Printer\-Supported\-Values + Get\-Printers Get\-Subscription\-Attributes Get\-Subscriptions + Get\-System\-Attributes + Get\-System\-Supported\-Values Hold\-Job Hold\-New\-Jobs Identify\-Printer + Install\-Resource + Pause\-All\-Printers + Pause\-All\-Printers\-After\-Current\-Job Pause\-Printer Pause\-Printer\-After\-Current\-Job Print\-Job Print\-URI Promote\-Job Purge\-Jobs + Register\-Output\-Device Release\-Held\-New\-Jobs Release\-Job Renew\-Subscription Reprocess\-Job Restart\-Job Restart\-Printer + Restart\-System Resubmit\-Job + Resume\-All\-Printers Resume\-Job Resume\-Printer Schedule\-Job\-After Send\-Document Send\-Hardcopy\-Document Send\-Notifications + Send\-Resource\-Data Send\-URI Set\-Job\-Attributes Set\-Printer\-Attributes + Set\-Resource\-Attributes + Set\-System\-Attributes + Shutdown\-All\-Printers + Shutdown\-One\-Printer Shutdown\-Printer + Startup\-All\-Printers + Startup\-One\-Printer Startup\-Printer Suspend\-Current\-Job + Update\-Active\-Jobs + Update\-Document\-Status + Update\-Job\-Status + Update\-Output\-Device\-Attributes Validate\-Document Validate\-Job .fi @@ -507,6 +571,7 @@ client\-error\-ignored\-all\-subscriptions client\-error\-not\-authenticated client\-error\-not\-authorized + client\-error\-not\-fetchable client\-error\-not\-found client\-error\-not\-possible client\-error\-print\-support\-file\-not\-found @@ -547,10 +612,12 @@ document\-attributes\-tag event\-notification\-attributes\-tag - job\-attributes\-tag - operation\-attributes\-tag - printer\-attributes\-tag + job | job\-attributes\-tag + operation | operation\-attributes\-tag + printer | printer\-attributes\-tag + resource\-attributes\-tag subscription\-attributes\-tag + system\-attributes\-tag unsupported\-attributes\-tag .fi .LP @@ -560,24 +627,22 @@ admin\-define boolean charset - collection + collection | begCollection dateTime default delete\-attribute enum integer keyword - mimeMediaType - nameWithLanguage - nameWithoutLanguage - naturalLanguage + language | naturalLanguage + mimetype | mimeMediaType + name | nameWithLanguage | nameWithoutLanguage no\-value not\-settable octetString rangeOfInteger resolution - textWithLanguage - textWithoutLanguage + text | textWithLanguage | textWithoutLanguage unknown unsupported uri @@ -648,8 +713,8 @@ Inserts the current user's login name. .SH SEE ALSO .BR ipptool (1), -IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations), -PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp), -RFC 8011 (http://tools.ietf.org/html/rfc8011) +IANA IPP Registry (https://www.iana.org/assignments/ipp-registrations), +PWG Internet Printing Protocol Workgroup (https://www.pwg.org/ipp), +RFC 8011 (https://datatracker.ietf.org/doc/html/rfc8011) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lp.1 cups-2.4.1op1/man/lp.1 --- cups-2.3.3op2/man/lp.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lp.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lp man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lp 1 "CUPS" "26 April 2019" "Apple Inc." +.TH lp 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lp \- print files .SH SYNOPSIS @@ -226,4 +227,4 @@ .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lpadmin.8 cups-2.4.1op1/man/lpadmin.8 --- cups-2.3.3op2/man/lpadmin.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lpadmin.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lpadmin man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lpadmin 8 "CUPS" "26 April 2019" "Apple Inc." +.TH lpadmin 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lpadmin \- configure cups printers and classes .SH SYNOPSIS @@ -228,4 +229,4 @@ .BR lpoptions (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lpc.8 cups-2.4.1op1/man/lpc.8 --- cups-2.3.3op2/man/lpc.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lpc.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lpc man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lpc 8 "CUPS" "26 April 2019" "Apple Inc." +.TH lpc 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lpc \- line printer control program (deprecated) .SH SYNOPSIS @@ -55,4 +56,4 @@ .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lpinfo.8 cups-2.4.1op1/man/lpinfo.8 --- cups-2.3.3op2/man/lpinfo.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lpinfo.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lpinfo man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lpinfo 8 "CUPS" "26 April 2019" "Apple Inc." +.TH lpinfo 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lpinfo \- show available devices or drivers (deprecated) .SH SYNOPSIS @@ -122,4 +123,4 @@ .BR lpadmin (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lpmove.8 cups-2.4.1op1/man/lpmove.8 --- cups-2.3.3op2/man/lpmove.8 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lpmove.8 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lpmove man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lpmove 8 "CUPS" "26 April 2019" "Apple Inc." +.TH lpmove 8 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lpmove \- move a job or all jobs to a new destination .SH SYNOPSIS @@ -71,4 +72,4 @@ .br CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lpoptions.1 cups-2.4.1op1/man/lpoptions.1 --- cups-2.3.3op2/man/lpoptions.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lpoptions.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lpoptions man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lpoptions 1 "CUPS" "26 April 2019" "Apple Inc." +.TH lpoptions 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lpoptions \- display or set printer options and defaults .SH SYNOPSIS @@ -115,4 +116,4 @@ .BR lprm (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lpq.1 cups-2.4.1op1/man/lpq.1 --- cups-2.3.3op2/man/lpq.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lpq.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lpq man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lpq 1 "CUPS" "26 April 2019" "Apple Inc." +.TH lpq 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lpq \- show printer queue status .SH SYNOPSIS @@ -61,4 +62,4 @@ .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lpr.1 cups-2.4.1op1/man/lpr.1 --- cups-2.3.3op2/man/lpr.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lpr.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lpr man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lpr 1 "CUPS" "26 April 2019" "Apple Inc." +.TH lpr 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lpr \- print files .SH SYNOPSIS @@ -178,4 +179,4 @@ .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lprm.1 cups-2.4.1op1/man/lprm.1 --- cups-2.3.3op2/man/lprm.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lprm.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" lprm man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH lprm 1 "CUPS" "26 April 2019" "Apple Inc." +.TH lprm 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lprm \- cancel print jobs .SH SYNOPSIS @@ -79,4 +80,4 @@ .BR lpstat (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/lpstat.1 cups-2.4.1op1/man/lpstat.1 --- cups-2.3.3op2/man/lpstat.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/lpstat.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" lpstat man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright 2007-2019 by Apple Inc. .\" Copyright 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more information. .\" -.TH lpstat 1 "CUPS" "26 April 2019" "Apple Inc." +.TH lpstat 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME lpstat \- print cups status information .SH SYNOPSIS @@ -145,4 +146,4 @@ .BR lprm (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/mailto.conf.5 cups-2.4.1op1/man/mailto.conf.5 --- cups-2.3.3op2/man/mailto.conf.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/mailto.conf.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" mailto.conf man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH mailto.conf 5 "CUPS" "26 April 2019" "Apple Inc." +.TH mailto.conf 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME mailto.conf \- configuration file for cups email notifier .SH DESCRIPTION @@ -41,4 +42,4 @@ .BR cupsd (8), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/mantohtml.c cups-2.4.1op1/man/mantohtml.c --- cups-2.3.3op2/man/mantohtml.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/mantohtml.c 2022-01-27 11:11:42.000000000 +0000 @@ -850,6 +850,13 @@ * Process man page text... */ + if (pre == 1) + { + pre ++; + if (!line[0]) + continue; // Skip initial blank line + } + html_fputs(line, &font, outfile); putc('\n', outfile); @@ -932,27 +939,20 @@ 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 */ + // "name (section)" - 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); - + snprintf(manfile, sizeof(manfile), "%s.%d", name, atoi(next + 1)); if (!access(manfile, 0)) { - /* - * Local man page, do a link... - */ - + // Local man page, do a link... fprintf(fp, "", manurl); link = 1; } @@ -1164,21 +1164,31 @@ * 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 --; + char temp[1024], // Temporary string + *tempptr; // Pointer into temporary string - strlcpy(temp, s, sizeof(temp)); - if ((size_t)(end -s) < sizeof(temp)) - temp[end - s] = '\0'; + for (tempptr = temp; *s && !isspace(*s & 255) && tempptr < (temp + sizeof(temp) - 1); s ++) + { + if (strchr(",.)", *s) && strchr(",. \n\r\t", s[1])) + { + // End of URL + break; + } + else if (*s == '\\' && s[1]) + { + // Escaped character + s ++; + *tempptr++ = *s; + } + else + { + // Regular character... + *tempptr++ = *s; + } + } + *tempptr = '\0'; fprintf(fp, "%s", temp, temp); - s = end; } else html_putc(*s++ & 255, fp); diff -Nru cups-2.3.3op2/man/mime.convs.5 cups-2.4.1op1/man/mime.convs.5 --- cups-2.3.3op2/man/mime.convs.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/mime.convs.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" mime.convs man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH mime.convs 5 "CUPS" "26 April 2019" "Apple Inc." +.TH mime.convs 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME mime.convs \- mime type conversion file for cups (deprecated) .SH DESCRIPTION @@ -59,4 +60,4 @@ .BR mime.types (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/mime.types.5 cups-2.4.1op1/man/mime.types.5 --- cups-2.3.3op2/man/mime.types.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/mime.types.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" mime.types man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH mime.types 5 "CUPS" "26 April 2019" "Apple Inc." +.TH mime.types 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME mime.types \- mime type description file for cups .SH DESCRIPTION @@ -105,4 +106,4 @@ .BR mime.convs (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/notifier.7 cups-2.4.1op1/man/notifier.7 --- cups-2.3.3op2/man/notifier.7 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/notifier.7 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" notifier man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH notifier 7 "CUPS" "26 April 2019" "Apple Inc." +.TH notifier 7 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME notifier \- cups notification interface .SH SYNOPSIS @@ -33,4 +34,4 @@ .BR filter (7), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ppdc.1 cups-2.4.1op1/man/ppdc.1 --- cups-2.3.3op2/man/ppdc.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ppdc.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" ppdc man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ppdc 1 "CUPS" "28 October 2020" "Apple Inc." +.TH ppdc 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME ppdc \- cups ppd compiler (deprecated) .SH SYNOPSIS @@ -99,4 +100,4 @@ .BR ppdcfile (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ppdcfile.5 cups-2.4.1op1/man/ppdcfile.5 --- cups-2.3.3op2/man/ppdcfile.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ppdcfile.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" ppdcfile man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ppdcfile 5 "CUPS" "26 April 2019" "Apple Inc." +.TH ppdcfile 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME ppdcfile \- cups ppd compiler source file format (deprecated) .SH DESCRIPTION @@ -158,4 +159,4 @@ .BR ppdpo (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ppdhtml.1 cups-2.4.1op1/man/ppdhtml.1 --- cups-2.3.3op2/man/ppdhtml.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ppdhtml.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" ppdhtml man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ppdhtml 1 "CUPS" "26 April 2019" "Apple Inc." +.TH ppdhtml 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME ppdhtml \- cups html summary generator (deprecated) .SH SYNOPSIS @@ -44,4 +45,4 @@ .BR ppdpo (1), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ppdi.1 cups-2.4.1op1/man/ppdi.1 --- cups-2.3.3op2/man/ppdi.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ppdi.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" ppdi man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ppdi 1 "CUPS" "26 April 2019" "Apple Inc." +.TH ppdi 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME ppdi \- import ppd files (deprecated) .SH SYNOPSIS @@ -51,4 +52,4 @@ .BR ppdcfile (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ppdmerge.1 cups-2.4.1op1/man/ppdmerge.1 --- cups-2.3.3op2/man/ppdmerge.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ppdmerge.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" ppdmerge man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ppdmerge 1 "CUPS" "26 April 2019" "Apple Inc." +.TH ppdmerge 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME ppdmerge \- merge ppd files (deprecated) .SH SYNOPSIS @@ -47,4 +48,4 @@ .BR ppdcfile (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/ppdpo.1 cups-2.4.1op1/man/ppdpo.1 --- cups-2.3.3op2/man/ppdpo.1 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/ppdpo.1 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" ppdpo man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2007 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH ppdpo 1 "CUPS" "26 April 2019" "Apple Inc." +.TH ppdpo 1 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME ppdpo \- ppd message catalog generator (deprecated) .SH SYNOPSIS @@ -51,4 +52,4 @@ .BR ppdcfile(5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/printers.conf.5 cups-2.4.1op1/man/printers.conf.5 --- cups-2.3.3op2/man/printers.conf.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/printers.conf.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,13 @@ .\" .\" printers.conf man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright 2007-2019 by Apple Inc. .\" Copyright 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more information. .\" -.TH printers.conf 5 "CUPS" "26 April 2019" "Apple Inc." +.TH printers.conf 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME printers.conf \- printer configuration file for cups .SH DESCRIPTION @@ -25,4 +26,4 @@ .BR subscriptions.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/man/subscriptions.conf.5 cups-2.4.1op1/man/subscriptions.conf.5 --- cups-2.3.3op2/man/subscriptions.conf.5 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/man/subscriptions.conf.5 2022-01-27 11:11:42.000000000 +0000 @@ -1,13 +1,14 @@ .\" .\" subscriptions.conf man page for CUPS. .\" +.\" Copyright © 2021-2022 by OpenPrinting. .\" Copyright © 2007-2019 by Apple Inc. .\" Copyright © 1997-2006 by Easy Software Products. .\" .\" Licensed under Apache License v2.0. See the file "LICENSE" for more .\" information. .\" -.TH subscriptions.conf 5 "CUPS" "26 April 2019" "Apple Inc." +.TH subscriptions.conf 5 "CUPS" "2021-02-28" "OpenPrinting" .SH NAME subscriptions.conf \- subscription configuration file for cups .SH DESCRIPTION @@ -28,4 +29,4 @@ .BR printers.conf (5), CUPS Online Help (http://localhost:631/help) .SH COPYRIGHT -Copyright \[co] 2007-2019 by Apple Inc. +Copyright \[co] 2021-2022 by OpenPrinting. diff -Nru cups-2.3.3op2/notifier/rss.c cups-2.4.1op1/notifier/rss.c --- cups-2.3.3op2/notifier/rss.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/notifier/rss.c 2022-01-27 11:11:42.000000000 +0000 @@ -46,7 +46,7 @@ */ static int compare_rss(_cups_rss_t *a, _cups_rss_t *b); -static void delete_message(_cups_rss_t *rss); +static void delete_message(_cups_rss_t *msg); static void load_rss(cups_array_t *rss, const char *filename); static _cups_rss_t *new_message(int sequence_number, char *subject, char *text, char *link_url, @@ -566,7 +566,17 @@ if ((msg = calloc(1, sizeof(_cups_rss_t))) == NULL) + { +#ifdef __clang_analyzer__ + // These free calls are really unnecessary (a failure here ultimately causes + // an exit, which frees all memory much faster) but it makes Clang happy... + free(subject); + free(text); + free(link_url); +#endif // __clang_analyzer__ + return (NULL); + } msg->sequence_number = sequence_number; msg->subject = subject; diff -Nru cups-2.3.3op2/packaging/cups.list.in cups-2.4.1op1/packaging/cups.list.in --- cups-2.3.3op2/packaging/cups.list.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/packaging/cups.list.in 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ # # ESP Package Manager (EPM) file list for CUPS. # -# Copyright © 2020 by Michael R Sweet +# Copyright © 2020-2022 by OpenPrinting # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products, all rights reserved. # @@ -348,12 +348,12 @@ %system darwin f 0555 root sys $LIBDIR/libcups.2.dylib cups/libcups.2.dylib nostrip() l 0755 root sys $LIBDIR/libcups.dylib libcups.2.dylib -f 0555 root sys $LIBDIR/libcupsimage.2.dylib filter/libcupsimage.2.dylib nostrip() +f 0555 root sys $LIBDIR/libcupsimage.2.dylib cups/libcupsimage.2.dylib nostrip() l 0755 root sys $LIBDIR/libcupsimage.dylib libcupsimage.2.dylib %system !darwin f 0555 root sys $LIBDIR/libcups.so.2 cups/libcups.so.2 nostrip() l 0755 root sys $LIBDIR/libcups.so libcups.so.2 -f 0555 root sys $LIBDIR/libcupsimage.so.2 filter/libcupsimage.so.2 nostrip() +f 0555 root sys $LIBDIR/libcupsimage.so.2 cups/libcupsimage.so.2 nostrip() l 0755 root sys $LIBDIR/libcupsimage.so libcupsimage.so.2 %system all %subpackage @@ -508,7 +508,7 @@ %if INSTALLSTATIC f 0444 root sys $LIBDIR/libcups.a cups/libcups.a -f 0444 root sys $LIBDIR/libcupsimage.a filter/libcupsimage.a +f 0444 root sys $LIBDIR/libcupsimage.a cups/libcupsimage.a %endif d 0755 root sys $DOCDIR/help - diff -Nru cups-2.3.3op2/packaging/cups.spec cups-2.4.1op1/packaging/cups.spec --- cups-2.3.3op2/packaging/cups.spec 2021-02-01 21:10:49.000000000 +0000 +++ cups-2.4.1op1/packaging/cups.spec 2022-01-27 11:11:49.000000000 +0000 @@ -3,7 +3,7 @@ # # Original version by Jason McMullan . # -# Copyright © 2020 by Michael R Sweet +# Copyright © 2020-2022 by OpenPrinting # Copyright © 2007-2019 by Apple Inc. # Copyright © 1999-2007 by Easy Software Products, all rights reserved. # @@ -41,12 +41,12 @@ Summary: CUPS Name: cups -Version: 2.3.3op2 +Version: 2.4.1 Release: 0 Epoch: 1 License: GPL Group: System Environment/Daemons -Source: https://github.com/openprinting/cups/releases/download/v2.3.3op2/cups-2.3.3op2-source.tar.gz +Source: https://github.com/openprinting/cups/releases/download/v2.4.1/cups-2.4.1-source.tar.gz Url: http://www.cups.org Packager: Anonymous Vendor: OpenPrinting diff -Nru cups-2.3.3op2/packaging/cups.spec.in cups-2.4.1op1/packaging/cups.spec.in --- cups-2.3.3op2/packaging/cups.spec.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/packaging/cups.spec.in 2022-01-27 11:11:42.000000000 +0000 @@ -3,7 +3,7 @@ # # Original version by Jason McMullan . # -# Copyright © 2020 by Michael R Sweet +# Copyright © 2020-2022 by OpenPrinting # Copyright © 2007-2019 by Apple Inc. # Copyright © 1999-2007 by Easy Software Products, all rights reserved. # diff -Nru cups-2.3.3op2/ppdc/ppdc-import.cxx cups-2.4.1op1/ppdc/ppdc-import.cxx --- cups-2.3.3op2/ppdc/ppdc-import.cxx 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/ppdc/ppdc-import.cxx 2022-01-27 11:11:42.000000000 +0000 @@ -57,274 +57,276 @@ } // See if the driver has already been imported... - if ((driver = find_driver(ppd->pcfilename)) == NULL) + if (find_driver(ppd->pcfilename)) { - // Create a new PPD file... - if ((fp = cupsFileOpen(f, "r")) == NULL) - { - ppdClose(ppd); - return (0); - } - - driver = new ppdcDriver(); - driver->type = PPDC_DRIVER_PS; - - drivers->add(driver); + ppdClose(ppd); + return (1); + } - // Read the initial comments from the PPD file and use them as the - // copyright/license text... - cupsFileGets(fp, line, sizeof(line)); - // Skip *PPD-Adobe-M.m - - while (cupsFileGets(fp, line, sizeof(line))) - if (strncmp(line, "*%", 2)) - break; - else if (strncmp(line, "*%%%% ", 6)) - { - for (ptr = line + 2; isspace(*ptr); ptr ++); + // Create a new PPD file... + if ((fp = cupsFileOpen(f, "r")) == NULL) + { + ppdClose(ppd); + return (0); + } - driver->add_copyright(ptr); - } + driver = new ppdcDriver(); + driver->type = PPDC_DRIVER_PS; - cupsFileClose(fp); + drivers->add(driver); - // Then add the stuff from the PPD file... - if (ppd->modelname && ppd->manufacturer && - !_cups_strncasecmp(ppd->modelname, ppd->manufacturer, - strlen(ppd->manufacturer))) + // Read the initial comments from the PPD file and use them as the + // copyright/license text... + cupsFileGets(fp, line, sizeof(line)); + // Skip *PPD-Adobe-M.m + + while (cupsFileGets(fp, line, sizeof(line))) + if (strncmp(line, "*%", 2)) + break; + else if (strncmp(line, "*%%%% ", 6)) { - ptr = ppd->modelname + strlen(ppd->manufacturer); + for (ptr = line + 2; isspace(*ptr); ptr ++); - while (isspace(*ptr)) - ptr ++; + driver->add_copyright(ptr); } - else - ptr = ppd->modelname; - if (ppd->nickname) - driver->add_attr(new ppdcAttr("NickName", NULL, NULL, ppd->nickname)); + cupsFileClose(fp); - if (ppd->shortnickname) - driver->add_attr(new ppdcAttr("ShortNickName", NULL, NULL, - ppd->shortnickname)); - - driver->manufacturer = new ppdcString(ppd->manufacturer); - driver->model_name = new ppdcString(ptr); - driver->pc_file_name = new ppdcString(ppd->pcfilename); - attr = ppdFindAttr(ppd, "FileVersion", NULL); - driver->version = new ppdcString(attr ? attr->value : NULL); - driver->model_number = ppd->model_number; - driver->manual_copies = ppd->manual_copies; - driver->color_device = ppd->color_device; - driver->throughput = ppd->throughput; - driver->variable_paper_size = ppd->variable_sizes; - driver->max_width = ppd->custom_max[0]; - driver->max_length = ppd->custom_max[1]; - driver->min_width = ppd->custom_min[0]; - driver->min_length = ppd->custom_min[1]; - driver->left_margin = ppd->custom_margins[0]; - driver->bottom_margin = ppd->custom_margins[1]; - driver->right_margin = ppd->custom_margins[2]; - driver->top_margin = ppd->custom_margins[3]; + // Then add the stuff from the PPD file... + if (ppd->modelname && ppd->manufacturer && + !_cups_strncasecmp(ppd->modelname, ppd->manufacturer, + strlen(ppd->manufacturer))) + { + ptr = ppd->modelname + strlen(ppd->manufacturer); - for (i = 0; i < ppd->num_filters; i ++) - { - strlcpy(line, ppd->filters[i], sizeof(line)); + while (isspace(*ptr)) + ptr ++; + } + else + ptr = ppd->modelname; - for (ptr = line; *ptr; ptr ++) - if (isspace(*ptr & 255)) - break; - *ptr++ = '\0'; + if (ppd->nickname) + driver->add_attr(new ppdcAttr("NickName", NULL, NULL, ppd->nickname)); - cost = strtol(ptr, &ptr, 10); + if (ppd->shortnickname) + driver->add_attr(new ppdcAttr("ShortNickName", NULL, NULL, + ppd->shortnickname)); + + driver->manufacturer = new ppdcString(ppd->manufacturer); + driver->model_name = new ppdcString(ptr); + driver->pc_file_name = new ppdcString(ppd->pcfilename); + attr = ppdFindAttr(ppd, "FileVersion", NULL); + driver->version = new ppdcString(attr ? attr->value : NULL); + driver->model_number = ppd->model_number; + driver->manual_copies = ppd->manual_copies; + driver->color_device = ppd->color_device; + driver->throughput = ppd->throughput; + driver->variable_paper_size = ppd->variable_sizes; + driver->max_width = ppd->custom_max[0]; + driver->max_length = ppd->custom_max[1]; + driver->min_width = ppd->custom_min[0]; + driver->min_length = ppd->custom_min[1]; + driver->left_margin = ppd->custom_margins[0]; + driver->bottom_margin = ppd->custom_margins[1]; + driver->right_margin = ppd->custom_margins[2]; + driver->top_margin = ppd->custom_margins[3]; - while (isspace(*ptr & 255)) - ptr ++; + for (i = 0; i < ppd->num_filters; i ++) + { + strlcpy(line, ppd->filters[i], sizeof(line)); - filter = new ppdcFilter(line, ptr, cost); - driver->add_filter(filter); - } + for (ptr = line; *ptr; ptr ++) + if (isspace(*ptr & 255)) + break; + *ptr++ = '\0'; - attr = ppdFindAttr(ppd, "DefaultFont", NULL); - driver->default_font = new ppdcString(attr ? attr->value : NULL); + cost = strtol(ptr, &ptr, 10); - // Collect media sizes... - ppd_option_t *region_option, // PageRegion option - *size_option; // PageSize option - ppd_choice_t *region_choice, // PageRegion choice - *size_choice; // PageSize choice + while (isspace(*ptr & 255)) + ptr ++; - region_option = ppdFindOption(ppd, "PageRegion"); - size_option = ppdFindOption(ppd, "PageSize"); + filter = new ppdcFilter(line, ptr, cost); + driver->add_filter(filter); + } - for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) - { - // Don't do custom size here... - if (!_cups_strcasecmp(size->name, "Custom")) - continue; - - // Get the code for the PageSize and PageRegion options... - region_choice = ppdFindChoice(region_option, size->name); - size_choice = ppdFindChoice(size_option, size->name); - - // Create a new media size record and add it to the driver... - csize = new ppdcMediaSize(size->name, size_choice->text, size->width, - size->length, size->left, size->bottom, - size->width - size->right, - size->length - size->top, - size_choice->code, region_choice->code); + attr = ppdFindAttr(ppd, "DefaultFont", NULL); + driver->default_font = new ppdcString(attr ? attr->value : NULL); - driver->add_size(csize); + // Collect media sizes... + ppd_option_t *region_option, // PageRegion option + *size_option; // PageSize option + ppd_choice_t *region_choice, // PageRegion choice + *size_choice; // PageSize choice - if (!_cups_strcasecmp(size_option->defchoice, size->name)) - driver->set_default_size(csize); - } + region_option = ppdFindOption(ppd, "PageRegion"); + size_option = ppdFindOption(ppd, "PageSize"); - // Now all of the options... - for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) - { - cgroup = new ppdcGroup(group->name, group->text); - driver->add_group(cgroup); + for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) + { + // Don't do custom size here... + if (!_cups_strcasecmp(size->name, "Custom")) + continue; + + // Get the code for the PageSize and PageRegion options... + region_choice = ppdFindChoice(region_option, size->name); + size_choice = ppdFindChoice(size_option, size->name); + + // Create a new media size record and add it to the driver... + csize = new ppdcMediaSize(size->name, size_choice->text, size->width, + size->length, size->left, size->bottom, + size->width - size->right, + size->length - size->top, + size_choice->code, region_choice->code); - for (j = group->num_options, option = group->options; j > 0; j --, option ++) - { - if (!strcmp(option->keyword, "PageSize") || !strcmp(option->keyword, "PageRegion")) - continue; + driver->add_size(csize); - coption = new ppdcOption((ppdcOptType)option->ui, option->keyword, - option->text, (ppdcOptSection)option->section, - option->order); - cgroup->add_option(coption); - - for (k = option->num_choices, choice = option->choices; k > 0; k --, choice ++) - { - if (!strcmp(choice->choice, "Custom")) - continue; - - cchoice = new ppdcChoice(choice->choice, choice->text, choice->code); - coption->add_choice(cchoice); - - if (!_cups_strcasecmp(option->defchoice, choice->choice)) - coption->set_defchoice(cchoice); - } - } - } + if (!_cups_strcasecmp(size_option->defchoice, size->name)) + driver->set_default_size(csize); + } - // Now the constraints... - for (i = ppd->num_consts, constraint = ppd->consts; - i > 0; - i --, constraint ++) - { - // Look for mirrored constraints... - for (j = i - 1, constraint2 = constraint + 1; - j > 0; - j --, constraint2 ++) - if (!strcmp(constraint->option1, constraint2->option2) && - !strcmp(constraint->choice1, constraint2->choice2) && - !strcmp(constraint->option2, constraint2->option1) && - !strcmp(constraint->choice2, constraint2->choice1)) - break; - - if (j) - continue; - - cconstraint = new ppdcConstraint(constraint->option2, constraint->choice2, - constraint->option1, constraint->choice1); - driver->add_constraint(cconstraint); - } + // Now all of the options... + for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) + { + cgroup = new ppdcGroup(group->name, group->text); + driver->add_group(cgroup); - for (i = 0; i < ppd->num_attrs; i ++) + for (j = group->num_options, option = group->options; j > 0; j --, option ++) { - attr = ppd->attrs[i]; + if (!strcmp(option->keyword, "PageSize") || !strcmp(option->keyword, "PageRegion")) + continue; - if (!strcmp(attr->name, "Font")) + coption = new ppdcOption((ppdcOptType)option->ui, option->keyword, + option->text, (ppdcOptSection)option->section, + option->order); + cgroup->add_option(coption); + + for (k = option->num_choices, choice = option->choices; k > 0; k --, choice ++) { - // Font... - char encoding[256], // Encoding string - version[256], // Version string - charset[256], // Charset string - status[256]; // Status string - ppdcFontStatus fstatus; // Status enumeration + if (!strcmp(choice->choice, "Custom")) + continue; + cchoice = new ppdcChoice(choice->choice, choice->text, choice->code); + coption->add_choice(cchoice); - if (sscanf(attr->value, "%s%*[^\"]\"%[^\"]\"%s%s", encoding, version, - charset, status) != 4) - { - _cupsLangPrintf(stderr, _("ppdc: Bad font attribute: %s"), - attr->value); - continue; - } + if (!_cups_strcasecmp(option->defchoice, choice->choice)) + coption->set_defchoice(cchoice); + } + } + } + + // Now the constraints... + for (i = ppd->num_consts, constraint = ppd->consts; + i > 0; + i --, constraint ++) + { + // Look for mirrored constraints... + for (j = i - 1, constraint2 = constraint + 1; + j > 0; + j --, constraint2 ++) + if (!strcmp(constraint->option1, constraint2->option2) && + !strcmp(constraint->choice1, constraint2->choice2) && + !strcmp(constraint->option2, constraint2->option1) && + !strcmp(constraint->choice2, constraint2->choice1)) + break; + + if (j) + continue; + + cconstraint = new ppdcConstraint(constraint->option2, constraint->choice2, + constraint->option1, constraint->choice1); + driver->add_constraint(cconstraint); + } - if (!strcmp(status, "ROM")) - fstatus = PPDC_FONT_ROM; - else - fstatus = PPDC_FONT_DISK; + for (i = 0; i < ppd->num_attrs; i ++) + { + attr = ppd->attrs[i]; - font = new ppdcFont(attr->spec, encoding, version, charset, fstatus); + if (!strcmp(attr->name, "Font")) + { + // Font... + char encoding[256], // Encoding string + version[256], // Version string + charset[256], // Charset string + status[256]; // Status string + ppdcFontStatus fstatus; // Status enumeration - driver->add_font(font); - } - else if (!strcmp(attr->name, "CustomPageSize")) - { - driver->set_custom_size_code(attr->value); - } - else if ((strncmp(attr->name, "Default", 7) || - !strcmp(attr->name, "DefaultColorSpace")) && - strcmp(attr->name, "ColorDevice") && - strcmp(attr->name, "Manufacturer") && - strcmp(attr->name, "ModelName") && - strcmp(attr->name, "MaxMediaHeight") && - strcmp(attr->name, "MaxMediaWidth") && - strcmp(attr->name, "NickName") && - strcmp(attr->name, "ParamCustomPageSize") && - strcmp(attr->name, "ShortNickName") && - strcmp(attr->name, "Throughput") && - strcmp(attr->name, "PCFileName") && - strcmp(attr->name, "FileVersion") && - strcmp(attr->name, "FormatVersion") && - strcmp(attr->name, "HWMargins") && - strcmp(attr->name, "VariablePaperSize") && - strcmp(attr->name, "LanguageEncoding") && - strcmp(attr->name, "LanguageVersion") && - strcmp(attr->name, "cupsFilter") && - strcmp(attr->name, "cupsFlipDuplex") && - strcmp(attr->name, "cupsLanguages") && - strcmp(attr->name, "cupsManualCopies") && - strcmp(attr->name, "cupsModelNumber") && - strcmp(attr->name, "cupsVersion")) + + if (sscanf(attr->value, "%s%*[^\"]\"%[^\"]\"%s%s", encoding, version, + charset, status) != 4) { - if ((ptr = strchr(attr->name, '.')) != NULL && - ((ptr - attr->name) == 2 || (ptr - attr->name) == 5)) - { - // Might be a localization attribute; test further... - if (isalpha(attr->name[0] & 255) && - isalpha(attr->name[1] & 255) && - (attr->name[2] == '.' || - (attr->name[2] == '_' && isalpha(attr->name[3] & 255) && - isalpha(attr->name[4] & 255)))) - continue; - } - - // Attribute... - driver->add_attr(new ppdcAttr(attr->name, attr->spec, attr->text, - attr->value)); + _cupsLangPrintf(stderr, _("ppdc: Bad font attribute: %s"), + attr->value); + continue; } - else if (!strncmp(attr->name, "Default", 7) && - !ppdFindOption(ppd, attr->name + 7) && - strcmp(attr->name, "DefaultFont") && - strcmp(attr->name, "DefaultImageableArea") && - strcmp(attr->name, "DefaultPaperDimension") && - strcmp(attr->name, "DefaultFont")) + + if (!strcmp(status, "ROM")) + fstatus = PPDC_FONT_ROM; + else + fstatus = PPDC_FONT_DISK; + + font = new ppdcFont(attr->spec, encoding, version, charset, fstatus); + + driver->add_font(font); + } + else if (!strcmp(attr->name, "CustomPageSize")) + { + driver->set_custom_size_code(attr->value); + } + else if ((strncmp(attr->name, "Default", 7) || + !strcmp(attr->name, "DefaultColorSpace")) && + strcmp(attr->name, "ColorDevice") && + strcmp(attr->name, "Manufacturer") && + strcmp(attr->name, "ModelName") && + strcmp(attr->name, "MaxMediaHeight") && + strcmp(attr->name, "MaxMediaWidth") && + strcmp(attr->name, "NickName") && + strcmp(attr->name, "ParamCustomPageSize") && + strcmp(attr->name, "ShortNickName") && + strcmp(attr->name, "Throughput") && + strcmp(attr->name, "PCFileName") && + strcmp(attr->name, "FileVersion") && + strcmp(attr->name, "FormatVersion") && + strcmp(attr->name, "HWMargins") && + strcmp(attr->name, "VariablePaperSize") && + strcmp(attr->name, "LanguageEncoding") && + strcmp(attr->name, "LanguageVersion") && + strcmp(attr->name, "cupsFilter") && + strcmp(attr->name, "cupsFlipDuplex") && + strcmp(attr->name, "cupsLanguages") && + strcmp(attr->name, "cupsManualCopies") && + strcmp(attr->name, "cupsModelNumber") && + strcmp(attr->name, "cupsVersion")) + { + if ((ptr = strchr(attr->name, '.')) != NULL && + ((ptr - attr->name) == 2 || (ptr - attr->name) == 5)) { - // Default attribute... - driver->add_attr(new ppdcAttr(attr->name, attr->spec, attr->text, - attr->value)); + // Might be a localization attribute; test further... + if (isalpha(attr->name[0] & 255) && + isalpha(attr->name[1] & 255) && + (attr->name[2] == '.' || + (attr->name[2] == '_' && isalpha(attr->name[3] & 255) && + isalpha(attr->name[4] & 255)))) + continue; } + + // Attribute... + driver->add_attr(new ppdcAttr(attr->name, attr->spec, attr->text, + attr->value)); + } + else if (!strncmp(attr->name, "Default", 7) && + !ppdFindOption(ppd, attr->name + 7) && + strcmp(attr->name, "DefaultFont") && + strcmp(attr->name, "DefaultImageableArea") && + strcmp(attr->name, "DefaultPaperDimension") && + strcmp(attr->name, "DefaultFont")) + { + // Default attribute... + driver->add_attr(new ppdcAttr(attr->name, attr->spec, attr->text, + attr->value)); } } - if (ppd) - ppdClose(ppd); + ppdClose(ppd); return (1); } diff -Nru cups-2.3.3op2/ppdc/ppdc-source.cxx cups-2.4.1op1/ppdc/ppdc-source.cxx --- cups-2.3.3op2/ppdc/ppdc-source.cxx 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/ppdc/ppdc-source.cxx 2022-01-27 11:11:42.000000000 +0000 @@ -537,7 +537,7 @@ for (i = 0; i < 9; i ++) m[i] = get_float(fp); - return (new ppdcProfile(resolution, media_type, g, d, m)); + return (new ppdcProfile(resolution, media_type, d, g, m)); } @@ -1880,7 +1880,7 @@ } // Return the new profile... - return (new ppdcProfile(resolution, media_type, g, kd, m)); + return (new ppdcProfile(resolution, media_type, kd, g, m)); } @@ -2792,7 +2792,7 @@ if (have_cutter <= 0 || cond_state) continue; - if ((o = d->find_option("CutMedia")) == NULL) + if (!d->find_option("CutMedia")) { o = new ppdcOption(PPDC_BOOLEAN, "CutMedia", "Cut Media", PPDC_SECTION_ANY, 10.0f); @@ -2805,9 +2805,8 @@ c = new ppdcChoice("True", NULL, "<>setpagedevice"); o->add_choice(c); + o = NULL; } - - o = NULL; } else if (!_cups_strcasecmp(temp, "Darkness")) { diff -Nru cups-2.3.3op2/ppdc/ppdc.cxx cups-2.4.1op1/ppdc/ppdc.cxx --- cups-2.3.3op2/ppdc/ppdc.cxx 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/ppdc/ppdc.cxx 2022-01-27 11:11:42.000000000 +0000 @@ -21,7 +21,7 @@ // Local functions... // -static void usage(void); +static void usage(void) _CUPS_NORETURN; // @@ -229,7 +229,6 @@ default : // Unknown usage(); - break; } } else @@ -393,7 +392,7 @@ return (1); } - if (templocales != locales) + if (templocales && templocales != locales) templocales->release(); cupsFileClose(fp); diff -Nru cups-2.3.3op2/ppdc/ppdhtml.cxx cups-2.4.1op1/ppdc/ppdhtml.cxx --- cups-2.3.3op2/ppdc/ppdhtml.cxx 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/ppdc/ppdhtml.cxx 2022-01-27 11:11:42.000000000 +0000 @@ -20,7 +20,7 @@ // Local functions... // -static void usage(void); +static void usage(void) _CUPS_NORETURN; // @@ -80,7 +80,6 @@ default : // Unknown usage(); - break; } } else @@ -100,7 +99,7 @@ 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) + if (!composite->find_option(o->name->value)) composite->add_option(new ppdcOption(o)); } diff -Nru cups-2.3.3op2/ppdc/ppdi.cxx cups-2.4.1op1/ppdc/ppdi.cxx --- cups-2.3.3op2/ppdc/ppdi.cxx 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/ppdc/ppdi.cxx 2022-01-27 11:11:42.000000000 +0000 @@ -21,7 +21,7 @@ // Local functions... // -static void usage(void); +static void usage(void) _CUPS_NORETURN; // @@ -71,7 +71,6 @@ default : // Unknown usage(); - break; } } else diff -Nru cups-2.3.3op2/ppdc/ppdmerge.cxx cups-2.4.1op1/ppdc/ppdmerge.cxx --- cups-2.3.3op2/ppdc/ppdmerge.cxx 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/ppdc/ppdmerge.cxx 2022-01-27 11:11:42.000000000 +0000 @@ -22,7 +22,7 @@ // static const char *ppd_locale(ppd_file_t *ppd); -static void usage(void); +static void usage(void) _CUPS_NORETURN; // @@ -75,7 +75,6 @@ default : // Unknown usage(); - break; } } else diff -Nru cups-2.3.3op2/ppdc/ppdpo.cxx cups-2.4.1op1/ppdc/ppdpo.cxx --- cups-2.3.3op2/ppdc/ppdpo.cxx 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/ppdc/ppdpo.cxx 2022-01-27 11:11:42.000000000 +0000 @@ -21,7 +21,7 @@ // static void add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog); -static void usage(void); +static void usage(void) _CUPS_NORETURN; // @@ -100,7 +100,6 @@ default : // Unknown usage(); - break; } } else diff -Nru cups-2.3.3op2/ppdc/sample.drv cups-2.4.1op1/ppdc/sample.drv --- cups-2.3.3op2/ppdc/sample.drv 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/ppdc/sample.drv 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ // // Driver info file for CUPS-supplied PPDs. // +// Copyright © 2021-2022 by OpenPrinting. // Copyright © 2007-2019 by Apple Inc. // Copyright © 1993-2006 by Easy Software Products. // @@ -56,6 +57,7 @@ #media "w108h36/1.50x0.50\"" 108 36 #media "w108h72/1.50x1.00\"" 108 72 #media "w108h144/1.50x2.00\"" 108 144 +#media "w142h227/80x50mm" 142 227 #media "w144h26/2.00x0.37\"" 144 26 #media "w144h36/2.00x0.50\"" 144 36 #media "w144h72/2.00x1.00\"" 144 72 @@ -78,7 +80,10 @@ #media "w216h90/3.00x1.25\"" 216 90 #media "w216h144/3.00x2.00\"" 216 144 #media "w216h216/3.00x3.00\"" 216 216 +#media "w216h288/3.00x4.00\"" 216 288 #media "w216h360/3.00x5.00\"" 216 360 +#media "w216h432/3.00x6.00\"" 216 432 +#media "w216h576/3.00x8.00\"" 216 576 #media "w234h144/3.25x2.00\"" 234 144 #media "w234h360/3.25x5.00\"" 234 360 #media "w234h396/3.25x5.50\"" 234 396 @@ -93,6 +98,7 @@ #media "w288h360/4.00x5.00\"" 288 360 #media "w288h432/4.00x6.00\"" 288 432 #media "w288h468/4.00x6.50\"" 288 468 +#media "w288h576/4.00x8.00\"" 288 576 #media "w288h936/4.00x13.00\"" 288 936 #media "w432h72/6.00x1.00\"" 432 72 #media "w432h144/6.00x2.00\"" 432 144 @@ -101,6 +107,7 @@ #media "w432h360/6.00x5.00\"" 432 360 #media "w432h432/6.00x6.00\"" 432 432 #media "w432h468/6.00x6.50\"" 432 468 +#media "w432h576/6.00x8.00\"" 432 576 #media "w576h72/8.00x1.00\"" 576 72 #media "w576h144/8.00x2.00\"" 576 144 #media "w576h216/8.00x3.00\"" 576 216 @@ -108,13 +115,15 @@ #media "w576h360/8.00x5.00\"" 576 360 #media "w576h432/8.00x6.00\"" 576 432 #media "w576h468/8.00x6.50\"" 576 468 +#media "w595h72/8.26x1.00\"" 595 72 // Common stuff for all drivers... -Attribute "cupsVersion" "" "2.3" +Attribute "cupsVersion" "" "2.4" Attribute "FileSystem" "" "False" Attribute "LandscapeOrientation" "" "Plus90" Attribute "TTRasterizer" "" "Type42" +Copyright "Copyright (c) 2021-2022 by OpenPrinting." Copyright "Copyright (c) 2007-2019 by Apple Inc." Copyright "Copyright (c) 1997-2007 by Easy Software Products." Copyright "" @@ -123,7 +132,7 @@ Font * -Version "2.3" +Version "2.4" // DYMO Label Printer { @@ -936,12 +945,16 @@ MinSize 36 36 MaxSize 576 3600 + MediaSize A4 + MediaSize A5 + MediaSize A5Rotated MediaSize w90h18 MediaSize w90h162 MediaSize w108h18 MediaSize w108h36 MediaSize w108h72 MediaSize w108h144 + MediaSize w142h227 MediaSize w144h26 MediaSize w144h36 MediaSize w144h72 @@ -959,8 +972,11 @@ MediaSize w216h72 MediaSize w216h90 MediaSize w216h144 + MediaSize w216h288 MediaSize w216h216 MediaSize w216h360 + MediaSize w216h432 + MediaSize w216h576 MediaSize w234h144 MediaSize w234h360 MediaSize w234h396 @@ -975,6 +991,7 @@ *MediaSize w288h360 MediaSize w288h432 MediaSize w288h468 + MediaSize w288h576 MediaSize w288h936 MediaSize w432h72 MediaSize w432h144 @@ -983,6 +1000,7 @@ MediaSize w432h360 MediaSize w432h432 MediaSize w432h468 + MediaSize w432h576 MediaSize w576h72 MediaSize w576h144 MediaSize w576h216 @@ -990,6 +1008,7 @@ MediaSize w576h360 MediaSize w576h432 MediaSize w576h468 + MediaSize w595h72 *Resolution k 1 0 0 0 203dpi Resolution k 1 0 0 0 300dpi diff -Nru cups-2.3.3op2/scheduler/Makefile cups-2.4.1op1/scheduler/Makefile --- cups-2.3.3op2/scheduler/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ # # Scheduler Makefile for CUPS. # -# Copyright © 2020 by Michael R Sweet +# Copyright © 2020-2022 by OpenPrinting # Copyright © 2007-2019 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products, all rights reserved. # @@ -324,7 +324,8 @@ cupsd-static: $(CUPSDOBJS) libcupsmime.a ../cups/$(LIBCUPSSTATIC) echo Linking $@... $(LD_CC) $(ALL_LDFLAGS) -o cupsd-static $(CUPSDOBJS) libcupsmime.a \ - $(PAMLIBS) $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(ONDEMANDLIBS) \ $(LIBWRAP) $(LINKCUPSSTATIC) + $(PAMLIBS) $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(ONDEMANDLIBS) \ + $(LIBWRAP) $(LINKCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ diff -Nru cups-2.3.3op2/scheduler/auth.c cups-2.4.1op1/scheduler/auth.c --- cups-2.3.3op2/scheduler/auth.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/auth.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Authorization routines for the CUPS scheduler. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -51,12 +52,20 @@ # endif # define CUPSD_UCRED_UID(c) (c).uid #endif /* HAVE_SYS_UCRED_H */ +#ifdef HAVE_LIBAPPARMOR +# include +#endif /* HAVE_LIBAPPARMOR */ +#ifdef HAVE_LIBSNAPDGLIB +# include +# include +#endif /* HAVE_LIBSNAPDGLIB */ /* * Local functions... */ +static int check_admin_access(cupsd_client_t *con); #ifdef HAVE_AUTHORIZATION_H static int check_authref(cupsd_client_t *con, const char *right); #endif /* HAVE_AUTHORIZATION_H */ @@ -202,7 +211,6 @@ if (ifptr >= ifname && *ifptr == ')') { - ifptr --; *ifptr = '\0'; } @@ -725,7 +733,6 @@ /* Output token for username */ gss_name_t client_name; /* Client name */ - # ifdef __APPLE__ /* * If the weak-linked GSSAPI/Kerberos library is not present, don't try @@ -1629,7 +1636,7 @@ if (auth == CUPSD_AUTH_DENY && best->satisfy == CUPSD_AUTH_SATISFY_ALL) return (HTTP_FORBIDDEN); -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * See if encryption is required... */ @@ -1646,7 +1653,7 @@ "cupsdIsAuthorized: Need upgrade to TLS..."); return (HTTP_UPGRADE_REQUIRED); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Now see what access level is required... @@ -1714,12 +1721,9 @@ /* * OK, got a username. See if we need normal user access, or group - * access... (root always matches) + * access... */ - if (!strcmp(username, "root")) - return (HTTP_OK); - /* * Strip any @domain or @KDC from the username and owner... */ @@ -1749,6 +1753,21 @@ else pw = NULL; + /* + * For matching user and group memberships below we will first go + * through all names except @SYSTEM to authorize the task as + * non-administrative, like printing or deleting one's own job, if this + * fails we will check whether we can authorize via the special name + * @SYSTEM, as an administrative task, like creating a print queue or + * deleting someone else's job. + * Note that tasks are considered as administrative by the policies + * in cupsd.conf, when they require the user or group @SYSTEM. + * We do this separation because if the client is a Snap connecting via + * domain socket, we need to additionally check whether it plugs to us + * through the "cups-control" interface which allows administration and + * not through the "cups" interface which allows only printing. + */ + if (best->level == CUPSD_AUTH_USER) { /* @@ -1779,8 +1798,14 @@ { if (!_cups_strncasecmp(name, "@AUTHKEY(", 9) && check_authref(con, name + 9)) return (HTTP_OK); - else if (!_cups_strcasecmp(name, "@SYSTEM") && SystemGroupAuthKey && - check_authref(con, SystemGroupAuthKey)) + } + + for (name = (char *)cupsArrayFirst(best->names); + name; + name = (char *)cupsArrayNext(best->names)) + { + if (!_cups_strcasecmp(name, "@SYSTEM") && SystemGroupAuthKey && + check_authref(con, SystemGroupAuthKey)) return (HTTP_OK); } @@ -1797,9 +1822,8 @@ return (HTTP_OK); else if (!_cups_strcasecmp(name, "@SYSTEM")) { - for (i = 0; i < NumSystemGroups; i ++) - if (cupsdCheckGroup(username, pw, SystemGroups[i])) - return (HTTP_OK); + /* Do @SYSTEM later, when every other entry fails */ + continue; } else if (name[0] == '@') { @@ -1810,6 +1834,18 @@ return (HTTP_OK); } + for (name = (char *)cupsArrayFirst(best->names); + name; + name = (char *)cupsArrayNext(best->names)) + { + if (!_cups_strcasecmp(name, "@SYSTEM")) + { + for (i = 0; i < NumSystemGroups; i ++) + if (cupsdCheckGroup(username, pw, SystemGroups[i]) && check_admin_access(con)) + return (HTTP_OK); + } + } + return (con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED); } @@ -1827,16 +1863,30 @@ name; name = (char *)cupsArrayNext(best->names)) { + if (!_cups_strcasecmp(name, "@SYSTEM")) + { + /* Do @SYSTEM later, when every other entry fails */ + continue; + } + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking group \"%s\" membership...", name); + if (cupsdCheckGroup(username, pw, name)) + return (HTTP_OK); + } + + for (name = (char *)cupsArrayFirst(best->names); + name; + name = (char *)cupsArrayNext(best->names)) + { if (!_cups_strcasecmp(name, "@SYSTEM")) { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking group \"%s\" membership...", name); + for (i = 0; i < NumSystemGroups; i ++) - if (cupsdCheckGroup(username, pw, SystemGroups[i])) + if (cupsdCheckGroup(username, pw, SystemGroups[i]) && check_admin_access(con)) return (HTTP_OK); } - else if (cupsdCheckGroup(username, pw, name)) - return (HTTP_OK); } /* @@ -1889,6 +1939,219 @@ } +/* + * 'check_admin_access()' - Verify that the client has administrative access. + */ + +static int // O - 1 if authorized, 0 otherwise +check_admin_access(cupsd_client_t *con) // I - Client connection +{ +#if defined(HAVE_LIBAPPARMOR) && defined(HAVE_LIBSNAPDGLIB) + /* + * If the client accesses locally via domain socket, find out whether it + * is a Snap. Grant access if it is not a Snap, if it is a classic Snap + * or if it is a confined Snap which plugs "cups-control". Otherwise deny + * access. + */ + + int fd = httpGetFd(con->http); + // Client socket file descriptor + char *context = NULL; // AppArmor profile name of client + SnapdClient *client = NULL; // Data structure of snapd access + GError *error = NULL; // Glib error + int ret = 1; // Return value +# if !CUPS_SNAP + SnapdSnap *snap = NULL; // Data structure of client Snap +# endif // !CUPS_SNAP + + +# ifdef AF_LOCAL + // Only check domain sockets... + if (httpAddrFamily(con->http->hostaddr) != AF_LOCAL) + return (1); +# endif // AF_LOCAL + +# if !CUPS_SNAP + // If AppArmor is not enabled, then we can't identify the client... + if (!aa_is_enabled()) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "AppArmor not in use."); + return (1); + } +# endif /* !CUPS_SNAP */ + + // Get the client's AppArmor context using the socket... + if (aa_getpeercon(fd, &context, NULL) < 0) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "AppArmor profile could not be retrieved: %s", strerror(errno)); + return (1); + } + else + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "AppArmor profile is '%s'.", context); + } + + // Allow access from "cups" snap... + if (!strncmp(context, "snap.cups.", 10)) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Client from the CUPS Snap itself - allowed."); + goto done; + } + +# if CUPS_SNAP && defined(HAVE_SNAPD_CLIENT_RUN_SNAPCTL2_SYNC) + /* + * CUPS is snapped, so check whether the client is also snapped. If so, + * determine whether the client snap has a "cups-control" plug which allows + * the application to perform CUPS administrative tasks. + */ + + const char *cookie; // snapd access cookie + int status = 65535; // Status of client Snap context check + const char *args[] = // snapctl arguments + { + "is-connected", + "--apparmor-label", + NULL, + "cups-control", + NULL + }; + + // Connect to snapd + if ((client = snapd_client_new()) == NULL) + { + cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to connect to snapd."); + ret = 0; + goto done; + } + + // snapctl commands are sent over a domain socket + snapd_client_set_socket_path(client, "/run/snapd-snap.socket"); + + // Take cookie from the environment if available + if ((cookie = g_getenv("SNAP_COOKIE")) == NULL) + { + cookie = ""; + cupsdLogClient(con, CUPSD_LOG_WARN, "No SNAP_COOKIE set in the Snap environment."); + } + + // Do the client Snap context check... + args[2] = context; + + if (!snapd_client_run_snapctl2_sync(client, cookie, (char **)args, NULL, NULL, &status, NULL, &error)) + { + cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to check snap context: %s", error->message); + ret = 0; + goto done; + } + + switch (status) + { + case 0 : // The client is a confined Snap and plugs cups-control + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Snap with cups-control plug - allowed."); + break; + case 1 : // The client is a confined Snap and does not plug cups-control + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Snap without cups-control plug - denied."); + ret = 0; + break; + case 10 : // The client is a classic Snap + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Classic snap - allowed."); + break; + case 11 : // The client is not a Snap + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Not a snap - allowed."); + break; + default : // Unexpected status... + cupsdLogClient(con, CUPSD_LOG_ERROR, "Snap check returned unexpected status %d - denied.", status); + ret = 0; + break; + } + +# elif !CUPS_SNAP + /* + * If CUPS is not snapped, check whether the client is snapped and if it has + * the "cups-control" plug. + */ + + // Is the client a snapped application? + if (strncmp(context, "snap.", 5)) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Not a snap - allowed."); + goto done; + } + + // Extract the snap name from the context (snap.name.instance) + char *snap_name = strdup(context + 5);// Snap name follows "snap." + char *ptr = strchr(snap_name, '.'); // instance follows the name... + if (!ptr) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Malformed snapd AppArmor profile name '%s' - denied.", context); + free(snap_name); + ret = 0; + goto done; + } + + *ptr = '\0'; + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Client snap is '%s'.", snap_name); + + // Connect to snapd + if ((client = snapd_client_new()) == NULL) + { + cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to connect to snapd."); + free(snap_name); + ret = 0; + goto done; + } + + // Check whether the client Snap is under classic confinement + GPtrArray *plugs = NULL; // List of plugs for snap + + if ((snap = snapd_client_get_snap_sync(client, snap_name, NULL, &error)) == NULL) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Unable to get client Snap data: %s", error->message); + ret = 0; + } + // Snaps using classic confinement are granted access + else if (snapd_snap_get_confinement(snap) == SNAPD_CONFINEMENT_CLASSIC) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Classic snap - allowed."); + } + // Check whether the client Snap has the cups-control plug + else if (!snapd_client_get_connections2_sync(client, SNAPD_GET_CONNECTIONS_FLAGS_NONE, snap_name, "cups-control", NULL, NULL, &plugs, NULL, NULL, &error)) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Unable to get client Snap plugs: %s", error->message); + ret = 0; + } + else if (!plugs || plugs->len <= 0) + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Snap without cups-control plug - denied."); + ret = 0; + } + else + { + cupsdLogClient(con, CUPSD_LOG_DEBUG, "Snap with cups-control plug - allowed."); + } + + if (plugs) + g_ptr_array_unref(plugs); + + free(snap_name); + g_clear_object(&snap); + +# endif // CUPS_SNAP + + done: + + free(context); + g_clear_object(&client); + + return (ret); + +#else + // No AppArmor/snapd to deal with... + return (1); +#endif // HAVE_LIBAPPARMOR && HAVE_LIBSNAPDGLIB +} + + #ifdef HAVE_AUTHORIZATION_H /* * 'check_authref()' - Check if an authorization services reference has the diff -Nru cups-2.3.3op2/scheduler/auth.h cups-2.4.1op1/scheduler/auth.h --- cups-2.3.3op2/scheduler/auth.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/auth.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * Authorization definitions for the CUPS scheduler. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2006 by Easy Software Products, all rights reserved. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -105,10 +107,10 @@ VAR cups_array_t *Locations VALUE(NULL); /* Authorization locations */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS VAR http_encryption_t DefaultEncryption VALUE(HTTP_ENCRYPT_REQUIRED); /* Default encryption for authentication */ -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* diff -Nru cups-2.3.3op2/scheduler/cert.c cups-2.4.1op1/scheduler/cert.c --- cups-2.3.3op2/scheduler/cert.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/cert.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * Authentication certificate routines for the CUPS scheduler. * - * Copyright 2007-2016 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2016 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -83,7 +85,7 @@ if (pid == 0) { -#ifdef HAVE_ACL_INIT +#if defined(HAVE_ACL_INIT) && !CUPS_SNAP acl_t acl; /* ACL information */ acl_entry_t entry; /* ACL entry */ acl_permset_t permset; /* Permissions */ @@ -92,7 +94,7 @@ # endif /* HAVE_MBR_UID_TO_UUID */ static int acls_not_supported = 0; /* Only warn once */ -#endif /* HAVE_ACL_INIT */ +#endif /* HAVE_ACL_INIT && !CUPS_SNAP */ /* @@ -100,11 +102,18 @@ */ fchmod(fd, 0440); + + /* ACLs do not work when cupsd is running in a Snap, and certificates + need root as group owner to be only accessible for CUPS and not the + unprivileged sub-processes */ +#if CUPS_SNAP + fchown(fd, RunUser, 0); +#else fchown(fd, RunUser, SystemGroupIDs[0]); cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddCert: NumSystemGroups=%d", NumSystemGroups); -#ifdef HAVE_ACL_INIT +# ifdef HAVE_ACL_INIT if (NumSystemGroups > 1) { /* @@ -114,7 +123,7 @@ int j; /* Looping var */ -# ifdef HAVE_MBR_UID_TO_UUID +# ifdef HAVE_MBR_UID_TO_UUID /* * On macOS, ACLs use UUIDs instead of GIDs... */ @@ -143,7 +152,7 @@ acl_set_permset(entry, permset); } -# else +# else /* * POSIX ACLs need permissions for owner, group, other, and mask * in addition to the rest of the system groups... @@ -215,7 +224,7 @@ cupsdLogMessage(CUPSD_LOG_ERROR, "ACL: %s", text); acl_free(text); } -# endif /* HAVE_MBR_UID_TO_UUID */ +# endif /* HAVE_MBR_UID_TO_UUID */ if (acl_set_fd(fd, acl)) { @@ -230,7 +239,8 @@ acl_free(acl); } -#endif /* HAVE_ACL_INIT */ +# endif /* HAVE_ACL_INIT */ +#endif /* CUPS_SNAP */ RootCertTime = time(NULL); } diff -Nru cups-2.3.3op2/scheduler/classes.c cups-2.4.1op1/scheduler/classes.c --- cups-2.3.3op2/scheduler/classes.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/classes.c 2022-01-27 11:11:42.000000000 +0000 @@ -658,13 +658,10 @@ { cups_file_t *fp; /* classes.conf file */ char filename[1024], /* classes.conf filename */ - temp[1024], /* Temporary string */ value[2048], /* Value string */ *name; /* Current user name */ cupsd_printer_t *pclass; /* Current printer class */ int i; /* Looping var */ - time_t curtime; /* Current time */ - struct tm curdate; /* Current date */ cups_option_t *option; /* Current option */ @@ -683,10 +680,6 @@ * Write a small header to the file... */ - time(&curtime); - localtime_r(&curtime, &curdate); - strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate); - cupsFilePuts(fp, "# Class configuration file for " CUPS_SVERSION "\n"); cupsFilePrintf(fp, "# Written by cupsd\n"); cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n"); diff -Nru cups-2.3.3op2/scheduler/client.c cups-2.4.1op1/scheduler/client.c --- cups-2.3.3op2/scheduler/client.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/client.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * Client routines for the CUPS scheduler. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * This file contains Kerberos support code, copyright 2006 by @@ -35,9 +36,9 @@ struct stat *filestats); static int compare_clients(cupsd_client_t *a, cupsd_client_t *b, void *data); -#ifdef HAVE_SSL +#ifdef HAVE_TLS static int cupsd_start_tls(cupsd_client_t *con, http_encryption_t e); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ static char *get_file(cupsd_client_t *con, struct stat *filestats, char *filename, size_t len); static http_status_t install_cupsd_conf(cupsd_client_t *con); @@ -353,7 +354,7 @@ if (cupsArrayCount(Clients) == MaxClients) cupsdPauseListening(); -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * See if we are connecting on a secure port... */ @@ -369,7 +370,7 @@ } else con->auto_ssl = 1; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } @@ -440,14 +441,14 @@ cupsArrayRemove(ActiveClients, con); cupsdSetBusyState(0); -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * Shutdown encryption as needed... */ if (httpIsEncrypted(con->http)) partial = 1; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ if (partial) { @@ -589,7 +590,7 @@ return; } -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (con->auto_ssl) { /* @@ -613,7 +614,7 @@ return; } } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ switch (httpGetState(con->http)) { @@ -923,7 +924,7 @@ 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 +#ifdef HAVE_TLS /* * Do encryption stuff... */ @@ -947,7 +948,7 @@ cupsdCloseClient(con); return; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } httpClearFields(con->http); @@ -979,7 +980,7 @@ if (!_cups_strcasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION), "Upgrade") && !httpIsEncrypted(con->http)) { -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * Do encryption stuff... */ @@ -1004,7 +1005,7 @@ cupsdCloseClient(con); return; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ } if ((status = cupsdIsAuthorized(con, NULL)) != HTTP_STATUS_OK) @@ -1751,7 +1752,8 @@ { if (con->file >= 0) { - fstat(con->file, &filestats); + if (fstat(con->file, &filestats)) + filestats.st_size = 0; close(con->file); con->file = -1; @@ -1918,7 +1920,7 @@ cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cupsdSendError code=%d, auth_type=%d", code, auth_type); -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * Force client to upgrade for authentication if that is how the * server is configured... @@ -1931,7 +1933,7 @@ { code = HTTP_STATUS_UPGRADE_REQUIRED; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Put the request in the access_log file... @@ -2109,18 +2111,13 @@ } else if (auth_type == CUPSD_AUTH_NEGOTIATE) { -#if defined(SO_PEERCRED) && defined(AF_LOCAL) - if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL) - strlcpy(auth_str, "PeerCred", sizeof(auth_str)); - else -#endif /* SO_PEERCRED && AF_LOCAL */ strlcpy(auth_str, "Negotiate", sizeof(auth_str)); } - if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost")) + if (con->best && !con->is_browser && !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost")) { /* - * Add a "trc" (try root certification) parameter for local non-Kerberos + * Add a "trc" (try root certification) parameter for local * requests when the request requires system group membership - then the * client knows the root certificate can/should be used. * @@ -2656,7 +2653,7 @@ } -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * 'cupsd_start_tls()' - Start encryption on a connection. */ @@ -2675,7 +2672,7 @@ cupsdLogClient(con, CUPSD_LOG_DEBUG, "Connection now encrypted."); return (0); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* @@ -2938,7 +2935,7 @@ */ if (language[3]) - language[0] = '\0'; /* Strip country code */ + language[3] = '\0'; /* Strip country code */ else language[0] = '\0'; /* Strip language */ } @@ -3124,8 +3121,7 @@ return (0); } - if (!_cups_strcasecmp(type->type, "x-httpd-cgi") && - (filestats->st_mode & 0111)) + if (!_cups_strcasecmp(type->type, "x-httpd-cgi") && (filestats->st_mode & 0111) && (getuid() || !(filestats->st_mode & 022))) { /* * "application/x-httpd-cgi" is a CGI script. @@ -3594,7 +3590,7 @@ !strcmp(con->clientname, "[::1]")); } -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD /* * Check if the hostname is something.local (Bonjour); if so, allow it. */ @@ -3612,7 +3608,7 @@ if (end && (!_cups_strcasecmp(end, ".local") || !_cups_strcasecmp(end, ".local."))) return (1); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ /* * Check if the hostname is an IP address... @@ -3666,7 +3662,7 @@ } } -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD for (a = (cupsd_alias_t *)cupsArrayFirst(DNSSDAlias); a; a = (cupsd_alias_t *)cupsArrayNext(DNSSDAlias)) @@ -3690,7 +3686,7 @@ return (1); } } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ /* * Check for interface hostname matches... diff -Nru cups-2.3.3op2/scheduler/client.h cups-2.4.1op1/scheduler/client.h --- cups-2.3.3op2/scheduler/client.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/client.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Client definitions for the CUPS scheduler. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -48,9 +49,9 @@ header_used; /* Number of header bytes used */ char header[2048]; /* Header from CGI program */ cups_lang_t *language; /* Language to use */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS int auto_ssl; /* Automatic test for SSL/TLS */ -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ 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 */ @@ -89,8 +90,6 @@ VAR int LastClientNumber VALUE(0), /* Last client connection number */ - ListenBackLog VALUE(SOMAXCONN), - /* Max backlog of pending connections */ LocalPort VALUE(631), /* Local port to use */ RemotePort VALUE(0); @@ -137,7 +136,7 @@ extern void cupsdUpdateCGI(void); extern void cupsdWriteClient(cupsd_client_t *con); -#ifdef HAVE_SSL +#ifdef HAVE_TLS extern int cupsdEndTLS(cupsd_client_t *con); extern int cupsdStartTLS(cupsd_client_t *con); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ diff -Nru cups-2.3.3op2/scheduler/colorman.c cups-2.4.1op1/scheduler/colorman.c --- cups-2.3.3op2/scheduler/colorman.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/colorman.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,12 +1,14 @@ /* * Color management routines for the CUPS scheduler. * - * Copyright 2007-2014 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2014 by Apple Inc. + * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. * - * 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 @@ -900,8 +902,6 @@ DBusError error; /* D-Bus error */ const char *device_path; /* Device object path */ const char *profile_path; /* Profile path */ - char *default_profile_path = NULL; - /* Default profile path */ char device_id[1024]; /* Device ID as understood by colord */ char format_str[1024]; /* Qualifier format as a string */ @@ -982,10 +982,7 @@ colord_device_add_profile(device_path, profile_path, relation); } -out: - - if (default_profile_path) - free(default_profile_path); + out: if (message) dbus_message_unref(message); diff -Nru cups-2.3.3op2/scheduler/conf.c cups-2.4.1op1/scheduler/conf.c --- cups-2.3.3op2/scheduler/conf.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/conf.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Configuration routines for the CUPS scheduler. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -67,9 +68,9 @@ static const cupsd_var_t cupsd_vars[] = { { "AutoPurgeJobs", &JobAutoPurge, CUPSD_VARTYPE_BOOLEAN }, -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD { "BrowseDNSSDSubTypes", &DNSSDSubTypes, CUPSD_VARTYPE_STRING }, -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ { "BrowseWebIF", &BrowseWebIF, CUPSD_VARTYPE_BOOLEAN }, { "Browsing", &Browsing, CUPSD_VARTYPE_BOOLEAN }, { "Classification", &Classification, CUPSD_VARTYPE_STRING }, @@ -80,9 +81,9 @@ { "DefaultPolicy", &DefaultPolicy, CUPSD_VARTYPE_STRING }, { "DefaultShared", &DefaultShared, CUPSD_VARTYPE_BOOLEAN }, { "DirtyCleanInterval", &DirtyCleanInterval, CUPSD_VARTYPE_TIME }, -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD { "DNSSDHostName", &DNSSDHostName, CUPSD_VARTYPE_STRING }, -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ { "ErrorPolicy", &ErrorPolicy, CUPSD_VARTYPE_STRING }, { "FilterLimit", &FilterLimit, CUPSD_VARTYPE_INTEGER }, { "FilterNice", &FilterNice, CUPSD_VARTYPE_INTEGER }, @@ -95,13 +96,11 @@ { "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", &IdleExitTimeout, CUPSD_VARTYPE_TIME }, #endif /* HAVE_LAUNCHD */ { "LimitRequestBody", &MaxRequestSize, CUPSD_VARTYPE_INTEGER }, - { "ListenBackLog", &ListenBackLog, CUPSD_VARTYPE_INTEGER }, { "LogDebugHistory", &LogDebugHistory, CUPSD_VARTYPE_INTEGER }, { "MaxActiveJobs", &MaxActiveJobs, CUPSD_VARTYPE_INTEGER }, { "MaxClients", &MaxClients, CUPSD_VARTYPE_INTEGER }, @@ -125,7 +124,6 @@ { "PreserveJobFiles", &JobFiles, CUPSD_VARTYPE_TIME }, { "PreserveJobHistory", &JobHistory, CUPSD_VARTYPE_TIME }, { "ReloadTimeout", &ReloadTimeout, CUPSD_VARTYPE_TIME }, - { "RIPCache", &RIPCache, CUPSD_VARTYPE_STRING }, { "RootCertDuration", &RootCertDuration, CUPSD_VARTYPE_TIME }, { "ServerAdmin", &ServerAdmin, CUPSD_VARTYPE_STRING }, { "ServerName", &ServerName, CUPSD_VARTYPE_STRING }, @@ -138,26 +136,23 @@ { "AccessLog", &AccessLog, CUPSD_VARTYPE_STRING }, { "CacheDir", &CacheDir, CUPSD_VARTYPE_STRING }, { "ConfigFilePerm", &ConfigFilePerm, CUPSD_VARTYPE_PERM }, -#ifdef HAVE_SSL +#ifdef HAVE_TLS { "CreateSelfSignedCerts", &CreateSelfSignedCerts, CUPSD_VARTYPE_BOOLEAN }, -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ { "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_PERM }, - { "LPDConfigFile", &LPDConfigFile, CUPSD_VARTYPE_STRING }, { "PageLog", &PageLog, CUPSD_VARTYPE_STRING }, { "Printcap", &Printcap, CUPSD_VARTYPE_STRING }, { "RemoteRoot", &RemoteRoot, CUPSD_VARTYPE_STRING }, { "RequestRoot", &RequestRoot, CUPSD_VARTYPE_STRING }, { "ServerBin", &ServerBin, CUPSD_VARTYPE_PATHNAME }, -#ifdef HAVE_SSL +#ifdef HAVE_TLS { "ServerKeychain", &ServerKeychain, CUPSD_VARTYPE_PATHNAME }, -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ { "ServerRoot", &ServerRoot, CUPSD_VARTYPE_PATHNAME }, - { "SMBConfigFile", &SMBConfigFile, CUPSD_VARTYPE_STRING }, { "StateDir", &StateDir, CUPSD_VARTYPE_STRING }, { "SyncOnClose", &SyncOnClose, CUPSD_VARTYPE_BOOLEAN }, #ifdef HAVE_AUTHORIZATION_H @@ -587,7 +582,6 @@ "%p %u %j %T %P %C %{job-billing} " "%{job-originating-host-name} %{job-name} %{media} %{sides}"); cupsdSetString(&Printcap, CUPS_DEFAULT_PRINTCAP); - cupsdSetString(&FontPath, CUPS_FONTPATH); cupsdSetString(&RemoteRoot, "remroot"); cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR); @@ -610,7 +604,7 @@ cupsdClearString(&Classification); ClassifyOverride = 0; -#ifdef HAVE_SSL +#ifdef HAVE_TLS # ifdef HAVE_GNUTLS cupsdSetString(&ServerKeychain, "ssl"); # else @@ -618,7 +612,7 @@ # endif /* HAVE_GNUTLS */ _httpTLSSetOptions(_HTTP_TLS_NONE, _HTTP_TLS_1_0, _HTTP_TLS_MAX); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ language = cupsLangDefault(); @@ -628,8 +622,8 @@ cupsdSetString(&DefaultLanguage, language->language); cupsdClearString(&DefaultPaperSize); - - cupsdSetString(&RIPCache, "128m"); + cupsArrayDelete(ReadyPaperSizes); + ReadyPaperSizes = NULL; cupsdSetString(&TempDir, NULL); @@ -705,10 +699,10 @@ ConfigFilePerm = CUPS_DEFAULT_CONFIG_FILE_PERM; FatalErrors = parse_fatal_errors(CUPS_DEFAULT_FATAL_ERRORS); default_auth_type = CUPSD_AUTH_BASIC; -#ifdef HAVE_SSL +#ifdef HAVE_TLS CreateSelfSignedCerts = TRUE; DefaultEncryption = HTTP_ENCRYPT_REQUIRED; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ DirtyCleanInterval = DEFAULT_KEEPALIVE; JobKillDelay = DEFAULT_TIMEOUT; JobRetryLimit = 5; @@ -719,8 +713,6 @@ FilterNice = 0; HostNameLookups = FALSE; KeepAlive = TRUE; - KeepAliveTimeout = DEFAULT_KEEPALIVE; - ListenBackLog = SOMAXCONN; LogDebugHistory = 200; LogFilePerm = CUPS_DEFAULT_LOG_FILE_PERM; LogFileGroup = Group; @@ -749,13 +741,10 @@ Browsing = CUPS_DEFAULT_BROWSING; DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED; -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) - cupsdSetString(&DNSSDSubTypes, "_cups,_print"); +#ifdef HAVE_DNSSD + cupsdSetString(&DNSSDSubTypes, "_cups,_print,_universal"); cupsdClearString(&DNSSDHostName); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ - - cupsdSetString(&LPDConfigFile, CUPS_DEFAULT_LPD_CONFIG_FILE); - cupsdSetString(&SMBConfigFile, CUPS_DEFAULT_SMB_CONFIG_FILE); +#endif /* HAVE_DNSSD */ cupsdSetString(&ErrorPolicy, CUPS_DEFAULT_ERROR_POLICY); @@ -1105,7 +1094,7 @@ if (CacheDir[0] != '/') cupsdSetStringf(&CacheDir, "%s/%s", ServerRoot, CacheDir); -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (!_cups_strcasecmp(ServerKeychain, "internal")) cupsdClearString(&ServerKeychain); else if (ServerKeychain[0] != '/') @@ -1115,7 +1104,7 @@ if (!CreateSelfSignedCerts) cupsdLogMessage(CUPSD_LOG_DEBUG, "Self-signed TLS certificate generation is disabled."); cupsSetServerCredentials(ServerKeychain, ServerName, CreateSelfSignedCerts); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Make sure that directories and config files are owned and @@ -1132,8 +1121,11 @@ Group, 1, 1) < 0 || cupsdCheckPermissions(StateDir, NULL, 0755, RunUser, Group, 1, 1) < 0 || - cupsdCheckPermissions(StateDir, "certs", RunUser ? 0711 : 0511, User, - SystemGroupIDs[0], 1, 1) < 0 || +#if CUPS_SNAP + cupsdCheckPermissions(StateDir, "certs", 0711, RunUser, 0, 1, 1) < 0 || +#else + cupsdCheckPermissions(StateDir, "certs", RunUser ? 0711 : 0511, User, SystemGroupIDs[0], 1, 1) < 0 || +#endif /* CUPS_SNAP */ cupsdCheckPermissions(ServerRoot, NULL, 0755, RunUser, Group, 1, 0) < 0 || cupsdCheckPermissions(ServerRoot, "ppd", 0755, RunUser, @@ -1275,6 +1267,17 @@ cupsdSetString(&DefaultPaperSize, "A4"); } + if (!ReadyPaperSizes) + { + // Build default list of common sizes for North America and worldwide... + if (!strcasecmp(DefaultPaperSize, "Letter")) + ReadyPaperSizes = _cupsArrayNewStrings("Letter,Legal,Tabloid,4x6,Env10", ','); + else if (!strcasecmp(DefaultPaperSize, "A4")) + ReadyPaperSizes = _cupsArrayNewStrings("A4,A3,A5,A6,EnvDL", ','); + else + ReadyPaperSizes = _cupsArrayNewStrings(DefaultPaperSize, ','); + } + /* * Update classification setting as needed... */ @@ -2989,7 +2992,7 @@ "FaxRetryLimit is deprecated; use " "JobRetryLimit on line %d of %s.", linenum, ConfigurationFile); } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (!_cups_strcasecmp(line, "SSLOptions")) { /* @@ -3057,11 +3060,11 @@ _httpTLSSetOptions(options, min_version, max_version); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ else if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen") -#ifdef HAVE_SSL +#ifdef HAVE_TLS || !_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen") -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ ) && value) { /* @@ -3147,10 +3150,10 @@ memcpy(&(lis->address), &(addr->addr), sizeof(lis->address)); lis->fd = -1; -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (!_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen")) lis->encryption = HTTP_ENCRYPT_ALWAYS; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ httpAddrString(&lis->address, temp, sizeof(temp)); @@ -3216,7 +3219,7 @@ return (0); } } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (!_cups_strcasecmp(line, "DefaultEncryption")) { /* @@ -3238,7 +3241,7 @@ return (0); } } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ else if (!_cups_strcasecmp(line, "HostNameLookups") && value) { /* @@ -3319,6 +3322,17 @@ cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d of %s.", value, linenum, ConfigurationFile); } + else if (!_cups_strcasecmp(line, "ReadyPaperSizes") && value) + { + /* + * ReadyPaperSizes sizename[,sizename,...] + */ + + if (ReadyPaperSizes) + _cupsArrayAddStrings(ReadyPaperSizes, value, ','); + else + ReadyPaperSizes = _cupsArrayNewStrings(value, ','); + } else if (!_cups_strcasecmp(line, "ServerTokens") && value) { /* @@ -3387,10 +3401,8 @@ !_cups_strcasecmp(line, "ErrorLog") || !_cups_strcasecmp(line, "FatalErrors") || !_cups_strcasecmp(line, "FileDevice") || - !_cups_strcasecmp(line, "FontPath") || !_cups_strcasecmp(line, "Group") || !_cups_strcasecmp(line, "LogFilePerm") || - !_cups_strcasecmp(line, "LPDConfigFile") || !_cups_strcasecmp(line, "PageLog") || !_cups_strcasecmp(line, "PassEnv") || !_cups_strcasecmp(line, "Printcap") || @@ -3403,7 +3415,6 @@ !_cups_strcasecmp(line, "ServerKeychain") || !_cups_strcasecmp(line, "ServerRoot") || !_cups_strcasecmp(line, "SetEnv") || - !_cups_strcasecmp(line, "SMBConfigFile") || !_cups_strcasecmp(line, "StateDir") || !_cups_strcasecmp(line, "SystemGroup") || !_cups_strcasecmp(line, "SystemGroupAuthKey") || diff -Nru cups-2.3.3op2/scheduler/conf.h cups-2.4.1op1/scheduler/conf.h --- cups-2.3.3op2/scheduler/conf.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/conf.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Configuration file definitions for the CUPS scheduler. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -139,18 +140,16 @@ /* Default paper size */ *ErrorPolicy VALUE(NULL), /* Default printer-error-policy */ - *RIPCache VALUE(NULL), - /* Amount of memory for RIPs */ *TempDir VALUE(NULL), /* Temporary directory */ *Printcap VALUE(NULL), /* Printcap file */ - *FontPath VALUE(NULL), - /* Font search path */ *RemoteRoot VALUE(NULL), /* Remote root user */ *Classification VALUE(NULL); /* Classification of system */ +VAR cups_array_t *ReadyPaperSizes VALUE(NULL); + /* List of paper sizes to list as ready */ VAR uid_t User VALUE(1), /* User ID for server */ RunUser VALUE(0); @@ -201,8 +200,6 @@ /* Timeout during requests */ KeepAlive VALUE(TRUE), /* Support the Keep-Alive option? */ - KeepAliveTimeout VALUE(DEFAULT_KEEPALIVE), - /* Timeout between requests */ FileDevice VALUE(FALSE), /* Allow file: devices? */ FilterLimit VALUE(0), @@ -238,12 +235,12 @@ VAR const char **MimeTypes VALUE(NULL); /* Array of MIME types */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS VAR int CreateSelfSignedCerts VALUE(TRUE); /* Automatically create self-signed certs? */ VAR char *ServerKeychain VALUE(NULL); /* Keychain holding cert + key */ -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ #ifdef HAVE_ONDEMAND VAR int IdleExitTimeout VALUE(60); diff -Nru cups-2.3.3op2/scheduler/cups-driverd.cxx cups-2.4.1op1/scheduler/cups-driverd.cxx --- cups-2.3.3op2/scheduler/cups-driverd.cxx 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/cups-driverd.cxx 2022-01-27 11:11:42.000000000 +0000 @@ -5,6 +5,7 @@ * created from driver information files, and dynamically generated PPD files * using driver helper programs. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * @@ -669,7 +670,10 @@ } if (cupsFileTell(fp) != next) - cupsFileSeek(fp, next); + { + if (cupsFileSeek(fp, next) != next) + break; + } } cupsFileClose(fp); diff -Nru cups-2.3.3op2/scheduler/cups-exec.c cups-2.4.1op1/scheduler/cups-exec.c --- cups-2.3.3op2/scheduler/cups-exec.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/cups-exec.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,9 +1,11 @@ /* * Sandbox helper for CUPS. * - * Copyright 2007-2014 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2014 by Apple Inc. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. * * Usage: * @@ -129,7 +131,11 @@ if (setgid(gid)) exit(errno + 100); +# if CUPS_SNAP + if (setgroups(0, NULL)) +# else if (setgroups(1, &gid)) +# endif /* CUPS_SNAP */ exit(errno + 100); if (uid && setuid(uid)) diff -Nru cups-2.3.3op2/scheduler/cups-lpd.c cups-2.4.1op1/scheduler/cups-lpd.c --- cups-2.3.3op2/scheduler/cups-lpd.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/cups-lpd.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * Line Printer Daemon interface for CUPS. * - * Copyright 2007-2016 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2016 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products, all rights reserved. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -283,24 +285,19 @@ break; case 0x05 : /* Remove jobs */ - if (list) - { - /* - * Grab the agent and skip to the list of users and/or jobs. - */ - - agent = list; - - for (; *list && !isspace(*list & 255); list ++); - while (isspace(*list & 255)) - *list++ = '\0'; - - syslog(LOG_INFO, "Remove jobs %s on %s by %s", list, dest, agent); - - status = (char)remove_jobs(dest, agent, list); - } - else - status = 1; + /* + * Grab the agent and skip to the list of users and/or jobs. + */ + + agent = list; + + for (; *list && !isspace(*list & 255); list ++); + while (isspace(*list & 255)) + *list++ = '\0'; + + syslog(LOG_INFO, "Remove jobs %s on %s by %s", list, dest, agent); + + status = (char)remove_jobs(dest, agent, list); putchar(status); break; @@ -1100,9 +1097,6 @@ &options); break; } - - if (status) - break; } /* diff -Nru cups-2.3.3op2/scheduler/cups.service.in cups-2.4.1op1/scheduler/cups.service.in --- cups-2.3.3op2/scheduler/cups.service.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/cups.service.in 2022-01-27 11:11:42.000000000 +0000 @@ -1,14 +1,15 @@ [Unit] Description=CUPS Scheduler Documentation=man:cupsd(8) -After=network.target sssd.service ypbind.service nslcd.service +After=network.target nss-user-lookup.target nslcd.service Requires=cups.socket [Service] ExecStart=@sbindir@/cupsd -l Type=notify Restart=on-failure +@TIMEOUTSTARTSEC@ [Install] Also=cups.socket cups.path -WantedBy=printer.target +WantedBy=@SYSTEMD_WANTED_BY@ diff -Nru cups-2.3.3op2/scheduler/cupsfilter.c cups-2.4.1op1/scheduler/cupsfilter.c --- cups-2.3.3op2/scheduler/cupsfilter.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/cupsfilter.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,9 @@ /* * Filtering program for CUPS. * - * Copyright 2007-2016 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting + * Copyright © 2007-2016 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ @@ -30,8 +31,6 @@ */ static char *DataDir = NULL;/* CUPS_DATADIR environment variable */ -static char *FontPath = NULL; - /* CUPS_FONTPATH environment variable */ static mime_filter_t GZIPFilter = /* gziptoany filter */ { NULL, /* Source type */ @@ -44,8 +43,6 @@ /* CUPS_SERVERBIN environment variable */ static char *ServerRoot = NULL; /* CUPS_SERVERROOT environment variable */ -static char *RIPCache = NULL; - /* RIP_MAX_CACHE environment variable */ static char TempFile[1024] = ""; /* Temporary file */ @@ -183,9 +180,14 @@ case 'a' : /* Specify option... */ i ++; if (i < argc) + { num_options = cupsParseOptions(argv[i], num_options, &options); + } else + { + _cupsLangPrintf(stderr, _("%s: Error - expected name=value after \"-a\" option."), argv[0]); usage(opt); + } break; case 'c' : /* Specify cups-files.conf file location... */ @@ -198,15 +200,23 @@ strlcpy(cupsfilesconf, argv[i], sizeof(cupsfilesconf)); } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected filename after \"-c\" option."), argv[0]); + usage(NULL); + } break; case 'd' : /* Specify the real printer name */ i ++; if (i < argc) + { printer = argv[i]; + } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected printer name after \"-d\" option."), argv[0]); + usage(NULL); + } break; case 'D' : /* Delete input file after conversion */ @@ -220,9 +230,14 @@ case 'f' : /* Specify input file... */ i ++; if (i < argc && !infile) + { infile = argv[i]; + } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected input file after \"-f\" option."), argv[0]); + usage(NULL); + } break; case 'i' : /* Specify source MIME type... */ @@ -235,7 +250,10 @@ srctype = argv[i]; } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected source MIME type after \"-i\" option."), argv[0]); + usage(NULL); + } break; case 'j' : /* Get job file or specify destination MIME type... */ @@ -248,8 +266,10 @@ infile = TempFile; } else - usage(opt); - + { + _cupsLangPrintf(stdout, _("%s: Error - expected job-id after \"-j\" option."), argv[0]); + usage(NULL); + } break; } @@ -263,15 +283,23 @@ dsttype = argv[i]; } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected destination MIME type after \"-m\" option."), argv[0]); + usage(NULL); + } break; case 'n' : /* Specify number of copies... */ i ++; if (i < argc) + { num_options = cupsAddOption("copies", argv[i], num_options, &options); + } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected number of copies after \"-n\" option."), argv[0]); + usage(NULL); + } break; case 'o' : /* Specify option(s) or output filename */ @@ -286,28 +314,43 @@ outfile = argv[i]; } else + { num_options = cupsParseOptions(argv[i], num_options, &options); + } } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected name=value after \"-o\" option."), argv[0]); + usage(NULL); + } break; case 'p' : /* Specify PPD file... */ case 'P' : /* Specify PPD file... */ i ++; if (i < argc) + { ppdfile = argv[i]; + } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected PPD file after \"-%c\" option."), argv[0], *opt); + usage(NULL); + } break; case 't' : /* Specify title... */ case 'J' : /* Specify title... */ i ++; if (i < argc) + { title = argv[i]; + } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected title after \"-%c\" option."), argv[0], *opt); + usage(NULL); + } break; case 'u' : /* Delete PPD file after conversion */ @@ -317,14 +360,19 @@ case 'U' : /* Specify username... */ i ++; if (i < argc) + { user = argv[i]; + } else - usage(opt); + { + _cupsLangPrintf(stderr, _("%s: Error - expected \"username\" after \"-U\" option."), argv[0]); + usage(NULL); + } break; default : /* Something we don't understand... */ - usage(opt); - break; + _cupsLangPrintf(stderr, _("%s: Error - unknown option \"-%c\"."), argv[0], *opt); + usage(NULL); } } } @@ -338,8 +386,7 @@ } else { - _cupsLangPuts(stderr, - _("cupsfilter: Only one filename can be specified.")); + _cupsLangPuts(stderr, _("cupsfilter: Only one filename can be specified.")); usage(NULL); } } @@ -373,10 +420,7 @@ if (!mime) { - _cupsLangPrintf(stderr, - _("%s: Unable to read MIME database from \"%s\" or " - "\"%s\"."), - command, mimedir, ServerRoot); + _cupsLangPrintf(stderr, _("%s: Unable to read MIME database from \"%s\" or \"%s\"."), command, mimedir, ServerRoot); return (1); } @@ -921,7 +965,7 @@ { int i; /* Looping var */ const char *argv[8], /* Command-line arguments */ - *envp[17], /* Environment variables */ + *envp[21], /* Environment variables */ *temp; /* Temporary string */ char *optstr, /* Filter options */ content_type[1024], /* CONTENT_TYPE */ @@ -937,8 +981,14 @@ printer_info[255], /* PRINTER_INFO env variable */ printer_location[255], /* PRINTER_LOCATION env variable */ printer_name[255], /* PRINTER env variable */ - rip_max_cache[1024], /* RIP_MAX_CACHE */ userenv[1024], /* USER */ +#if CUPS_SNAP + fontconfig_file[1024], /* FONTCONFIG_FILE */ + fontconfig_path[1024], /* FONTCONFIG_PATH */ + fontconfig_sysroot[1024], + /* FONTCONFIG_SYSROOT */ + ld_library_path[2048], /* LD_LIBRARY_PATH */ +#endif /* CUPS_SNAP */ program[1024]; /* Program to run */ mime_filter_t *filter, /* Current filter */ *next; /* Next filter */ @@ -995,7 +1045,6 @@ snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s", srctype->super, srctype->type); snprintf(cups_datadir, sizeof(cups_datadir), "CUPS_DATADIR=%s", DataDir); - snprintf(cups_fontpath, sizeof(cups_fontpath), "CUPS_FONTPATH=%s", FontPath); snprintf(cups_serverbin, sizeof(cups_serverbin), "CUPS_SERVERBIN=%s", ServerBin); snprintf(cups_serverroot, sizeof(cups_serverroot), "CUPS_SERVERROOT=%s", @@ -1020,9 +1069,9 @@ "Versions/A/Frameworks/PrintCore.framework/Versions/A/" "Resources/Generic.ppd", sizeof(ppd)); #else - snprintf(ppd, sizeof(ppd), "PPD=%s/model/laserjet.ppd", DataDir); + snprintf(ppd, sizeof(ppd), "PPD=%s/model/laserjet.ppd", DataDir); #endif /* __APPLE__ */ - snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache); + snprintf(userenv, sizeof(userenv), "USER=%s", user); if (printer && @@ -1065,31 +1114,53 @@ if (!argv[4]) argv[4] = "1"; - envp[0] = ""; - envp[1] = content_type; - envp[2] = cups_datadir; - envp[3] = cups_fontpath; - envp[4] = cups_serverbin; - envp[5] = cups_serverroot; - envp[6] = lang; - envp[7] = path; - envp[8] = ppd; - envp[9] = printer_info; - envp[10] = printer_location; - envp[11] = printer_name; - envp[12] = rip_max_cache; - envp[13] = userenv; - envp[14] = "CHARSET=utf-8"; + for (i = 0; argv[i]; i ++) + fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); + + i = 0; +#ifdef __APPLE__ + envp[i ++] = ""; +#endif /* __APPLE__ */ + envp[i ++] = content_type; + envp[i ++] = cups_datadir; + envp[i ++] = cups_fontpath; + envp[i ++] = cups_serverbin; + envp[i ++] = cups_serverroot; + envp[i ++] = lang; + envp[i ++] = path; + envp[i ++] = ppd; + envp[i ++] = printer_info; + envp[i ++] = printer_location; + envp[i ++] = printer_name; + envp[i ++] = userenv; + envp[i ++] = "CHARSET=utf-8"; if (final_content_type[0]) + envp[i ++] = final_content_type; + +#if CUPS_SNAP + if ((temp = getenv("FONTCONFIG_FILE")) != NULL) { - envp[15] = final_content_type; - envp[16] = NULL; + snprintf(fontconfig_file, sizeof(fontconfig_file), "FONTCONFIG_FILE=%s", temp); + envp[i ++] = fontconfig_file; } - else - envp[15] = NULL; + if ((temp = getenv("FONTCONFIG_PATH")) != NULL) + { + snprintf(fontconfig_path, sizeof(fontconfig_path), "FONTCONFIG_PATH=%s", temp); + envp[i ++] = fontconfig_path; + } + if ((temp = getenv("FONTCONFIG_SYSROOT")) != NULL) + { + snprintf(fontconfig_sysroot, sizeof(fontconfig_sysroot), "FONTCONFIG_SYSROOT=%s", temp); + envp[i ++] = fontconfig_sysroot; + } + if ((temp = getenv("LD_LIBRARY_PATH")) != NULL) + { + snprintf(ld_library_path, sizeof(ld_library_path), "LD_LIBRARY_PATH=%s", temp); + envp[i ++] = ld_library_path; + } +#endif /* CUPS_SNAP */ - for (i = 0; argv[i]; i ++) - fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); + envp[i] = NULL; for (i = 0; envp[i]; i ++) fprintf(stderr, "DEBUG: envp[%d]=\"%s\"\n", i, envp[i]); @@ -1377,13 +1448,6 @@ else set_string(&DataDir, CUPS_DATADIR); - if ((temp = getenv("CUPS_FONTPATH")) != NULL) - set_string(&FontPath, temp); - else - set_string(&FontPath, CUPS_FONTPATH); - - set_string(&RIPCache, "128m"); - if ((temp = getenv("CUPS_SERVERBIN")) != NULL) set_string(&ServerBin, temp); else @@ -1405,10 +1469,6 @@ { if (!_cups_strcasecmp(line, "DataDir")) set_string(&DataDir, ptr); - else if (!_cups_strcasecmp(line, "FontPath")) - set_string(&FontPath, ptr); - else if (!_cups_strcasecmp(line, "RIPCache")) - set_string(&RIPCache, ptr); else if (!_cups_strcasecmp(line, "ServerBin")) set_string(&ServerBin, ptr); else if (!_cups_strcasecmp(line, "ServerRoot")) @@ -1418,6 +1478,11 @@ cupsFileClose(fp); } +#if CUPS_SNAP + if ((temp = getenv("PATH")) != NULL) + snprintf(line, sizeof(line), "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":%s", ServerBin, temp); + else +#endif /* CUPS_SNAP */ snprintf(line, sizeof(line), "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", ServerBin); set_string(&Path, line); diff -Nru cups-2.3.3op2/scheduler/dirsvc.c cups-2.4.1op1/scheduler/dirsvc.c --- cups-2.3.3op2/scheduler/dirsvc.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/dirsvc.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Directory services routines for the CUPS scheduler. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -15,11 +16,11 @@ #include "cupsd.h" #include -#if defined(HAVE_DNSSD) && defined(__APPLE__) +#if defined(HAVE_MDNSRESPONDER) && defined(__APPLE__) # include # include # include -#endif /* HAVE_DNSSD && __APPLE__ */ +#endif /* HAVE_MDNSRESPONDER && __APPLE__ */ /* @@ -35,23 +36,14 @@ * Local functions... */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD static char *get_auth_info_required(cupsd_printer_t *p, char *buffer, size_t bufsize); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ -#ifdef __APPLE__ -static int get_hostconfig(const char *name); -#endif /* __APPLE__ */ -static void update_lpd(int onoff); -static void update_smb(int onoff); - - -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) # ifdef __APPLE__ 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 cupsd_txt_t dnssdBuildTxtRecord(cupsd_printer_t *p); # ifdef HAVE_AVAHI static void dnssdClientCallback(AvahiClient *c, AvahiClientState state, void *userdata); # endif /* HAVE_AVAHI */ @@ -61,7 +53,7 @@ static const char *dnssdErrorString(int error); static void dnssdFreeTxtRecord(cupsd_txt_t *txt); static void dnssdRegisterAllPrinters(int from_callback); -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER static void dnssdRegisterCallback(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, @@ -73,15 +65,15 @@ static void dnssdRegisterCallback(AvahiEntryGroup *p, AvahiEntryGroupState state, void *context); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ 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 +# ifdef HAVE_MDNSRESPONDER static void dnssdUpdate(void); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ static void dnssdUpdateDNSSDName(int from_callback); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ /* @@ -111,10 +103,10 @@ * Announce the deletion... */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster) dnssdDeregisterPrinter(p, 1, 0); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ } @@ -133,10 +125,10 @@ (p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER))) return; -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster) dnssdRegisterPrinter(p, 0); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ } @@ -150,10 +142,10 @@ if (!Browsing || !BrowseLocalProtocols) return; -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD if (BrowseLocalProtocols & BROWSE_DNSSD) { -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER DNSServiceErrorType error; /* Error from service creation */ /* @@ -218,27 +210,15 @@ else avahi_threaded_poll_start(DNSSDMaster); } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ - - /* - * Enable LPD and SMB printer sharing as needed through external programs... - */ - - if (BrowseLocalProtocols & BROWSE_LPD) - update_lpd(1); - - if (BrowseLocalProtocols & BROWSE_SMB) - update_smb(1); -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) /* * Register the individual printers */ dnssdRegisterAllPrinters(0); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ } @@ -252,7 +232,7 @@ if (!Browsing || !BrowseLocalProtocols) return; -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD /* * De-register the individual printers */ @@ -265,21 +245,11 @@ if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster) dnssdStop(); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ - - /* - * Disable LPD and SMB printer sharing as needed through external programs... - */ - - if (BrowseLocalProtocols & BROWSE_LPD) - update_lpd(0); - - if (BrowseLocalProtocols & BROWSE_SMB) - update_smb(0); +#endif /* HAVE_DNSSD */ } -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD /* * 'cupsdUpdateDNSSDName()' - Update the computer name we use for browsing... */ @@ -338,23 +308,22 @@ static cupsd_txt_t /* O - TXT record */ dnssdBuildTxtRecord( - cupsd_printer_t *p, /* I - Printer information */ - int for_lpd) /* I - 1 = LPD, 0 = IPP */ + cupsd_printer_t *p) /* I - Printer information */ { int i, /* Looping var */ count; /* Count of key/value pairs */ char admin_hostname[256], /* Hostname for admin page */ adminurl_str[256], /* URL for the admin page */ type_str[32], /* Type to string buffer */ - state_str[32], /* State to string buffer */ - rp_str[1024], /* Queue name string buffer */ - air_str[1024], /* auth-info-required string buffer */ + rp_str[256], /* Queue name string buffer */ + air_str[256], /* auth-info-required string buffer */ + urf_str[256], /* URF string buffer */ *keyvalue[32][2], /* Table of key/value pairs */ *ptr; /* Pointer in string */ cupsd_txt_t txt; /* TXT record */ cupsd_listener_t *lis; /* Current listener */ const char *admin_scheme = "http"; /* Admin page URL scheme */ - + ipp_attribute_t *urf_supported; /* urf-supported attribute */ /* * Load up the key value pairs... @@ -362,175 +331,190 @@ count = 0; - if (!for_lpd || (BrowseLocalProtocols & BROWSE_LPD)) - { - keyvalue[count ][0] = "txtvers"; - keyvalue[count++][1] = "1"; + keyvalue[count ][0] = "txtvers"; + keyvalue[count++][1] = "1"; - keyvalue[count ][0] = "qtotal"; - keyvalue[count++][1] = "1"; + keyvalue[count ][0] = "qtotal"; + keyvalue[count++][1] = "1"; - keyvalue[count ][0] = "rp"; - keyvalue[count++][1] = rp_str; - if (for_lpd) - strlcpy(rp_str, p->name, sizeof(rp_str)); - else - snprintf(rp_str, sizeof(rp_str), "%s/%s", - (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", - p->name); + keyvalue[count ][0] = "rp"; + keyvalue[count++][1] = rp_str; + snprintf(rp_str, sizeof(rp_str), "%s/%s", (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", p->name); - keyvalue[count ][0] = "ty"; - keyvalue[count++][1] = p->make_model ? p->make_model : "Unknown"; + keyvalue[count ][0] = "ty"; + keyvalue[count++][1] = p->make_model ? p->make_model : "Unknown"; + /* + * Get the hostname for the admin page... + */ + + if (strchr(DNSSDHostName, '.')) + { /* - * Get the hostname for the admin page... + * Use the provided hostname, but make sure it ends with a period... */ - if (strchr(DNSSDHostName, '.')) - { - /* - * Use the provided hostname, but make sure it ends with a period... - */ - - if ((ptr = DNSSDHostName + strlen(DNSSDHostName) - 1) >= DNSSDHostName && *ptr == '.') - strlcpy(admin_hostname, DNSSDHostName, sizeof(admin_hostname)); - else - snprintf(admin_hostname, sizeof(admin_hostname), "%s.", DNSSDHostName); - } + if ((ptr = DNSSDHostName + strlen(DNSSDHostName) - 1) >= DNSSDHostName && *ptr == '.') + strlcpy(admin_hostname, DNSSDHostName, sizeof(admin_hostname)); else - { - /* - * Unqualified hostname gets ".local." added to it... - */ - - snprintf(admin_hostname, sizeof(admin_hostname), "%s.local.", DNSSDHostName); - } - + snprintf(admin_hostname, sizeof(admin_hostname), "%s.", DNSSDHostName); + } + else + { /* - * Get the URL scheme for the admin page... + * Unqualified hostname gets ".local." added to it... */ -# ifdef HAVE_SSL - for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); lis; lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) - { - if (lis->encryption != HTTP_ENCRYPTION_NEVER) - { - admin_scheme = "https"; - break; - } - } -# endif /* HAVE_SSL */ + snprintf(admin_hostname, sizeof(admin_hostname), "%s.local.", DNSSDHostName); + } - httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl_str, sizeof(adminurl_str), admin_scheme, NULL, admin_hostname, DNSSDPort, "/%s/%s", (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", p->name); - keyvalue[count ][0] = "adminurl"; - keyvalue[count++][1] = adminurl_str; + /* + * Get the URL scheme for the admin page... + */ - if (p->location) +# ifdef HAVE_TLS + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); lis; lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + { + if (lis->encryption != HTTP_ENCRYPTION_NEVER) { - keyvalue[count ][0] = "note"; - keyvalue[count++][1] = p->location; + admin_scheme = "https"; + break; } + } +# endif /* HAVE_TLS */ - keyvalue[count ][0] = "priority"; - keyvalue[count++][1] = for_lpd ? "100" : "0"; + httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl_str, sizeof(adminurl_str), admin_scheme, NULL, admin_hostname, DNSSDPort, "/%s/%s", (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", p->name); + keyvalue[count ][0] = "adminurl"; + keyvalue[count++][1] = adminurl_str; - keyvalue[count ][0] = "product"; - keyvalue[count++][1] = p->pc && p->pc->product ? p->pc->product : "Unknown"; + if (p->location) + { + keyvalue[count ][0] = "note"; + keyvalue[count++][1] = p->location; + } - keyvalue[count ][0] = "pdl"; - keyvalue[count++][1] = p->pdl ? p->pdl : "application/postscript"; + keyvalue[count ][0] = "priority"; + keyvalue[count++][1] = "0"; - if (get_auth_info_required(p, air_str, sizeof(air_str))) - { - keyvalue[count ][0] = "air"; - keyvalue[count++][1] = air_str; - } + keyvalue[count ][0] = "product"; + keyvalue[count++][1] = p->pc && p->pc->product ? p->pc->product : "Unknown"; - keyvalue[count ][0] = "UUID"; - keyvalue[count++][1] = p->uuid + 9; + keyvalue[count ][0] = "pdl"; + keyvalue[count++][1] = p->pdl ? p->pdl : "application/postscript"; - #ifdef HAVE_SSL - keyvalue[count ][0] = "TLS"; - keyvalue[count++][1] = "1.2"; - #endif /* HAVE_SSL */ + if (get_auth_info_required(p, air_str, sizeof(air_str))) + { + keyvalue[count ][0] = "air"; + keyvalue[count++][1] = air_str; + } - if (p->type & CUPS_PRINTER_FAX) - { - keyvalue[count ][0] = "Fax"; - keyvalue[count++][1] = "T"; - keyvalue[count ][0] = "rfo"; - keyvalue[count++][1] = rp_str; - } + keyvalue[count ][0] = "UUID"; + keyvalue[count++][1] = p->uuid + 9; - if (p->type & CUPS_PRINTER_COLOR) - { - keyvalue[count ][0] = "Color"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_COLOR) ? "T" : "F"; - } +#ifdef HAVE_TLS + keyvalue[count ][0] = "TLS"; + keyvalue[count++][1] = "1.2"; +#endif /* HAVE_TLS */ - if (p->type & CUPS_PRINTER_DUPLEX) - { - keyvalue[count ][0] = "Duplex"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_DUPLEX) ? "T" : "F"; - } + if ((urf_supported = ippFindAttribute(p->ppd_attrs, "urf-supported", IPP_TAG_KEYWORD)) != NULL) + { + int urf_count = ippGetCount(urf_supported); + // Number of URF values - if (p->type & CUPS_PRINTER_STAPLE) + urf_str[0] = '\0'; + for (i = 0, ptr = urf_str; i < urf_count; i ++) { - keyvalue[count ][0] = "Staple"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_STAPLE) ? "T" : "F"; - } + const char *value = ippGetString(urf_supported, i, NULL); - if (p->type & CUPS_PRINTER_COPIES) - { - keyvalue[count ][0] = "Copies"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_COPIES) ? "T" : "F"; - } + if (ptr > urf_str && ptr < (urf_str + sizeof(urf_str) - 1)) + *ptr++ = ','; - if (p->type & CUPS_PRINTER_COLLATE) - { - keyvalue[count ][0] = "Collate"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_COLLATE) ? "T" : "F"; - } + strlcpy(ptr, value, sizeof(urf_str) - (size_t)(ptr - urf_str)); + ptr += strlen(ptr); - if (p->type & CUPS_PRINTER_PUNCH) - { - keyvalue[count ][0] = "Punch"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_PUNCH) ? "T" : "F"; + if (ptr >= (urf_str + sizeof(urf_str) - 1)) + break; } - if (p->type & CUPS_PRINTER_BIND) - { - keyvalue[count ][0] = "Bind"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_BIND) ? "T" : "F"; - } + keyvalue[count ][0] = "URF"; + keyvalue[count++][1] = urf_str; + } - if (p->type & CUPS_PRINTER_SORT) - { - keyvalue[count ][0] = "Sort"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_SORT) ? "T" : "F"; - } + keyvalue[count ][0] = "mopria-certified"; + keyvalue[count++][1] = "1.3"; - if (p->type & CUPS_PRINTER_MFP) - { - keyvalue[count ][0] = "Scan"; - keyvalue[count++][1] = (p->type & CUPS_PRINTER_MFP) ? "T" : "F"; - } + if (p->type & CUPS_PRINTER_FAX) + { + keyvalue[count ][0] = "Fax"; + keyvalue[count++][1] = "T"; + keyvalue[count ][0] = "rfo"; + keyvalue[count++][1] = rp_str; + } + + if (p->type & CUPS_PRINTER_COLOR) + { + keyvalue[count ][0] = "Color"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_COLOR) ? "T" : "F"; + } + + if (p->type & CUPS_PRINTER_DUPLEX) + { + keyvalue[count ][0] = "Duplex"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_DUPLEX) ? "T" : "F"; + } + + if (p->type & CUPS_PRINTER_STAPLE) + { + keyvalue[count ][0] = "Staple"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_STAPLE) ? "T" : "F"; + } + + if (p->type & CUPS_PRINTER_COPIES) + { + keyvalue[count ][0] = "Copies"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_COPIES) ? "T" : "F"; + } + + if (p->type & CUPS_PRINTER_COLLATE) + { + keyvalue[count ][0] = "Collate"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_COLLATE) ? "T" : "F"; + } - snprintf(type_str, sizeof(type_str), "0x%X", p->type | CUPS_PRINTER_REMOTE); - snprintf(state_str, sizeof(state_str), "%d", p->state); + if (p->type & CUPS_PRINTER_PUNCH) + { + keyvalue[count ][0] = "Punch"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_PUNCH) ? "T" : "F"; + } - keyvalue[count ][0] = "printer-state"; - keyvalue[count++][1] = state_str; + if (p->type & CUPS_PRINTER_BIND) + { + keyvalue[count ][0] = "Bind"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_BIND) ? "T" : "F"; + } - keyvalue[count ][0] = "printer-type"; - keyvalue[count++][1] = type_str; + if (p->type & CUPS_PRINTER_SORT) + { + keyvalue[count ][0] = "Sort"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_SORT) ? "T" : "F"; } + if (p->type & CUPS_PRINTER_MFP) + { + keyvalue[count ][0] = "Scan"; + keyvalue[count++][1] = (p->type & CUPS_PRINTER_MFP) ? "T" : "F"; + } + + snprintf(type_str, sizeof(type_str), "0x%X", p->type | CUPS_PRINTER_REMOTE); + + keyvalue[count ][0] = "printer-type"; + keyvalue[count++][1] = type_str; + /* * Then pack them into a proper txt record... */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER TXTRecordCreate(&txt, 0, NULL); for (i = 0; i < count; i ++) @@ -545,7 +529,7 @@ for (i = 0, txt = NULL; i < count; i ++) txt = avahi_string_list_add_printf(txt, "%s=%s", keyvalue[i][0], keyvalue[i][1]); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ return (txt); } @@ -690,7 +674,7 @@ if (!srv || !*srv) return; -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER (void)from_callback; DNSServiceRefDeallocate(*srv); @@ -709,7 +693,7 @@ if (!from_callback) avahi_threaded_poll_unlock(DNSSDMaster); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } @@ -732,12 +716,12 @@ { dnssdDeregisterInstance(&p->ipp_srv, from_callback); -# ifdef HAVE_DNSSD -# ifdef HAVE_SSL +# ifdef HAVE_MDNSRESPONDER +# ifdef HAVE_TLS dnssdDeregisterInstance(&p->ipps_srv, from_callback); -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ dnssdDeregisterInstance(&p->printer_srv, from_callback); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } /* @@ -763,7 +747,7 @@ static const char * /* O - Error message */ dnssdErrorString(int error) /* I - Error number */ { -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER switch (error) { case kDNSServiceErr_NoError : @@ -866,7 +850,7 @@ # else /* HAVE_AVAHI */ return (avahi_strerror(error)); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } @@ -877,13 +861,13 @@ static void dnssdFreeTxtRecord(cupsd_txt_t *txt) /* I - TXT record */ { -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER TXTRecordDeallocate(txt); # else /* HAVE_AVAHI */ avahi_string_list_free(*txt); *txt = NULL; -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } @@ -912,7 +896,7 @@ * 'dnssdRegisterCallback()' - DNSServiceRegister callback. */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER static void dnssdRegisterCallback( DNSServiceRef sdRef, /* I - DNS Service reference */ @@ -972,7 +956,7 @@ /* TODO: Handle collisions with avahi_alternate_service_name(p->reg_name)? */ } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ /* @@ -996,9 +980,9 @@ int error; /* Any error */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER (void)from_callback; -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ cupsdLogMessage(CUPSD_LOG_DEBUG, "Registering \"%s\" with DNS-SD type \"%s\".", name, type); @@ -1008,22 +992,22 @@ * Assign the correct pointer for "srv"... */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER if (!strcmp(type, "_printer._tcp")) srv = &p->printer_srv; /* Target LPD service */ -# ifdef HAVE_SSL +# ifdef HAVE_TLS else if (!strcmp(type, "_ipps._tcp")) srv = &p->ipps_srv; /* Target IPPS service */ -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ else srv = &p->ipp_srv; /* Target IPP service */ # else /* HAVE_AVAHI */ srv = &p->ipp_srv; /* Target service group */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER (void)commit; # else /* HAVE_AVAHI */ @@ -1041,7 +1025,7 @@ name, dnssdErrorString(avahi_client_errno(DNSSDClient))); return (0); } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ /* * Make sure the name is <= 63 octets, and when we truncate be sure to @@ -1065,7 +1049,7 @@ * Register the service... */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER if (subtypes) snprintf(temp, sizeof(temp), "%s,%s", type, subtypes); else @@ -1154,7 +1138,7 @@ if (!from_callback) avahi_threaded_poll_unlock(DNSSDMaster); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ if (error) { @@ -1180,10 +1164,8 @@ int from_callback) /* I - Called from callback? */ { char name[256]; /* Service name */ - int printer_port; /* LPD port number */ int status; /* Registration status */ - cupsd_txt_t ipp_txt, /* IPP(S) TXT record */ - printer_txt; /* LPD TXT record */ + cupsd_txt_t ipp_txt; /* IPP(S) TXT record */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name, @@ -1230,24 +1212,17 @@ * Register IPP and LPD... * * We always must register the "_printer" service type in order to reserve - * our name, but use port number 0 if we haven't actually configured cups-lpd - * to share via LPD... + * our name, but use port number 0 so that we don't have clients using LPD... */ - ipp_txt = dnssdBuildTxtRecord(p, 0); - printer_txt = dnssdBuildTxtRecord(p, 1); + ipp_txt = dnssdBuildTxtRecord(p); - if (BrowseLocalProtocols & BROWSE_LPD) - printer_port = 515; - else - printer_port = 0; - - status = dnssdRegisterInstance(NULL, p, name, "_printer._tcp", NULL, printer_port, &printer_txt, 0, from_callback); + status = dnssdRegisterInstance(NULL, p, name, "_printer._tcp", NULL, 0, NULL, 0, from_callback); -# ifdef HAVE_SSL +# ifdef HAVE_TLS if (status) dnssdRegisterInstance(NULL, p, name, "_ipps._tcp", DNSSDSubTypes, DNSSDPort, &ipp_txt, 0, from_callback); -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ if (status) { @@ -1262,7 +1237,6 @@ } dnssdFreeTxtRecord(&ipp_txt); - dnssdFreeTxtRecord(&printer_txt); if (status) { @@ -1282,12 +1256,12 @@ dnssdDeregisterInstance(&p->ipp_srv, from_callback); -# ifdef HAVE_DNSSD -# ifdef HAVE_SSL +# ifdef HAVE_MDNSRESPONDER +# ifdef HAVE_TLS dnssdDeregisterInstance(&p->ipps_srv, from_callback); -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ dnssdDeregisterInstance(&p->printer_srv, from_callback); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } } @@ -1317,7 +1291,7 @@ dnssdDeregisterInstance(&WebIFSrv, 0); -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER cupsdRemoveSelect(DNSServiceRefSockFD(DNSSDMaster)); DNSServiceRefDeallocate(DNSSDMaster); @@ -1338,7 +1312,7 @@ avahi_threaded_poll_free(DNSSDMaster); DNSSDMaster = NULL; } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ cupsArrayDelete(DNSSDPrinters); DNSSDPrinters = NULL; @@ -1347,7 +1321,7 @@ } -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER /* * 'dnssdUpdate()' - Handle DNS-SD queries. */ @@ -1366,7 +1340,7 @@ dnssdStop(); } } -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ /* @@ -1649,220 +1623,4 @@ return ("none"); } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ - - -#ifdef __APPLE__ -/* - * 'get_hostconfig()' - Get an /etc/hostconfig service setting. - */ - -static int /* O - 1 for YES or AUTOMATIC, 0 for NO */ -get_hostconfig(const char *name) /* I - Name of service */ -{ - cups_file_t *fp; /* Hostconfig file */ - char line[1024], /* Line from file */ - *ptr; /* Pointer to value */ - int state = 1; /* State of service */ - - - /* - * Try opening the /etc/hostconfig file; if we can't open it, assume that - * the service is enabled/auto. - */ - - if ((fp = cupsFileOpen("/etc/hostconfig", "r")) != NULL) - { - /* - * Read lines from the file until we find the service... - */ - - while (cupsFileGets(fp, line, sizeof(line))) - { - if (line[0] == '#' || (ptr = strchr(line, '=')) == NULL) - continue; - - *ptr++ = '\0'; - - if (!_cups_strcasecmp(line, name)) - { - /* - * Found the service, see if it is set to "-NO-"... - */ - - if (!_cups_strncasecmp(ptr, "-NO-", 4)) - state = 0; - break; - } - } - - cupsFileClose(fp); - } - - return (state); -} -#endif /* __APPLE__ */ - - -/* - * 'update_lpd()' - Update the LPD configuration as needed. - */ - -static void -update_lpd(int onoff) /* - 1 = turn on, 0 = turn off */ -{ - if (!LPDConfigFile) - return; - -#ifdef __APPLE__ - /* - * Allow /etc/hostconfig CUPS_LPD service setting to override cupsd.conf - * setting for backwards-compatibility. - */ - - if (onoff && !get_hostconfig("CUPS_LPD")) - onoff = 0; -#endif /* __APPLE__ */ - - if (!strncmp(LPDConfigFile, "xinetd:///", 10)) - { - /* - * Enable/disable LPD via the xinetd.d config file for cups-lpd... - */ - - char newfile[1024]; /* New cups-lpd.N file */ - cups_file_t *ofp, /* Original file pointer */ - *nfp; /* New file pointer */ - char line[1024]; /* Line from file */ - - - snprintf(newfile, sizeof(newfile), "%s.N", LPDConfigFile + 9); - - if ((ofp = cupsFileOpen(LPDConfigFile + 9, "r")) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"%s\" - %s", - LPDConfigFile + 9, strerror(errno)); - return; - } - - if ((nfp = cupsFileOpen(newfile, "w")) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create \"%s\" - %s", - newfile, strerror(errno)); - cupsFileClose(ofp); - return; - } - - /* - * Copy all of the lines from the cups-lpd file... - */ - - while (cupsFileGets(ofp, line, sizeof(line))) - { - if (line[0] == '{') - { - cupsFilePrintf(nfp, "%s\n", line); - snprintf(line, sizeof(line), "\tdisable = %s", - onoff ? "no" : "yes"); - } - else if (!strstr(line, "disable =")) - cupsFilePrintf(nfp, "%s\n", line); - } - - cupsFileClose(nfp); - cupsFileClose(ofp); - rename(newfile, LPDConfigFile + 9); - } -#ifdef __APPLE__ - else if (!strncmp(LPDConfigFile, "launchd:///", 11)) - { - /* - * Enable/disable LPD via the launchctl command... - */ - - char *argv[5], /* Arguments for command */ - *envp[MAX_ENV]; /* Environment for command */ - int pid; /* Process ID */ - - - cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); - argv[0] = (char *)"launchctl"; - argv[1] = (char *)(onoff ? "load" : "unload"); - argv[2] = (char *)"-w"; - argv[3] = LPDConfigFile + 10; - argv[4] = NULL; - - cupsdStartProcess("/bin/launchctl", argv, envp, -1, -1, -1, -1, -1, 1, - NULL, NULL, &pid); - } -#endif /* __APPLE__ */ - else - cupsdLogMessage(CUPSD_LOG_INFO, "Unknown LPDConfigFile scheme!"); -} - - -/* - * 'update_smb()' - Update the SMB configuration as needed. - */ - -static void -update_smb(int onoff) /* I - 1 = turn on, 0 = turn off */ -{ - if (!SMBConfigFile) - return; - - if (!strncmp(SMBConfigFile, "samba:///", 9)) - { - /* - * Enable/disable SMB via the specified smb.conf config file... - */ - - char newfile[1024]; /* New smb.conf.N file */ - cups_file_t *ofp, /* Original file pointer */ - *nfp; /* New file pointer */ - char line[1024]; /* Line from file */ - int in_printers; /* In [printers] section? */ - - - snprintf(newfile, sizeof(newfile), "%s.N", SMBConfigFile + 8); - - if ((ofp = cupsFileOpen(SMBConfigFile + 8, "r")) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"%s\" - %s", - SMBConfigFile + 8, strerror(errno)); - return; - } - - if ((nfp = cupsFileOpen(newfile, "w")) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create \"%s\" - %s", - newfile, strerror(errno)); - cupsFileClose(ofp); - return; - } - - /* - * Copy all of the lines from the smb.conf file... - */ - - in_printers = 0; - - while (cupsFileGets(ofp, line, sizeof(line))) - { - if (in_printers && strstr(line, "printable =")) - snprintf(line, sizeof(line), " printable = %s", - onoff ? "yes" : "no"); - - cupsFilePrintf(nfp, "%s\n", line); - - if (line[0] == '[') - in_printers = !strcmp(line, "[printers]"); - } - - cupsFileClose(nfp); - cupsFileClose(ofp); - rename(newfile, SMBConfigFile + 8); - } - else - cupsdLogMessage(CUPSD_LOG_INFO, "Unknown SMBConfigFile scheme!"); -} +#endif /* HAVE_DNSSD */ diff -Nru cups-2.3.3op2/scheduler/dirsvc.h cups-2.4.1op1/scheduler/dirsvc.h --- cups-2.3.3op2/scheduler/dirsvc.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/dirsvc.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * Directory services definitions for the CUPS scheduler. * - * Copyright 2007-2017 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2017 by Apple Inc. + * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -12,9 +14,7 @@ */ #define BROWSE_DNSSD 1 /* DNS Service Discovery (aka Bonjour) */ -#define BROWSE_SMB 2 /* SMB/Samba */ -#define BROWSE_LPD 4 /* LPD via xinetd or launchd */ -#define BROWSE_ALL 7 /* All protocols */ +#define BROWSE_ALL 1 /* All protocols */ /* @@ -28,7 +28,7 @@ BrowseLocalProtocols VALUE(BROWSE_ALL); /* Protocols to support for local printers */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD VAR char *DNSSDComputerName VALUE(NULL), /* Computer/server name */ *DNSSDHostName VALUE(NULL), @@ -41,7 +41,7 @@ /* Port number to register */ VAR cups_array_t *DNSSDPrinters VALUE(NULL); /* Printers we have registered */ -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER VAR DNSServiceRef DNSSDMaster VALUE(NULL); /* Master DNS-SD service reference */ # else /* HAVE_AVAHI */ @@ -49,15 +49,10 @@ /* Master polling interface for Avahi */ VAR AvahiClient *DNSSDClient VALUE(NULL); /* Client information */ -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ VAR cupsd_srv_t WebIFSrv VALUE(NULL); /* Service reference for the web interface */ -#endif /* HAVE_DNSSD || HAVE_AVAHI */ - -VAR char *LPDConfigFile VALUE(NULL), - /* LPD configuration file */ - *SMBConfigFile VALUE(NULL); - /* SMB configuration file */ +#endif /* HAVE_DNSSD */ /* @@ -68,6 +63,6 @@ extern void cupsdRegisterPrinter(cupsd_printer_t *p); extern void cupsdStartBrowsing(void); extern void cupsdStopBrowsing(void); -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD extern void cupsdUpdateDNSSDName(void); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ diff -Nru cups-2.3.3op2/scheduler/env.c cups-2.4.1op1/scheduler/env.c --- cups-2.3.3op2/scheduler/env.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/env.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * Environment management routines for the CUPS scheduler. * - * Copyright 2007-2016 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * Copyright © 2021 by OpenPrinting. + * Copyright © 2007-2016 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products, all rights reserved. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -114,11 +116,13 @@ return; /* - * Do not allow dynamic linker variables when running as root... + * Do not allow dynamic linker variables when running as root outside a Snap... */ +#if !CUPS_SNAP if (!RunUser && (!strncmp(name, "DYLD_", 5) || !strncmp(name, "LD_", 3))) return; +#endif /* !CUPS_SNAP */ /* * See if this variable has already been defined... @@ -196,7 +200,6 @@ set_if_undefined("CUPS_CACHEDIR", CacheDir); set_if_undefined("CUPS_DATADIR", DataDir); set_if_undefined("CUPS_DOCROOT", DocumentRoot); - set_if_undefined("CUPS_FONTPATH", FontPath); set_if_undefined("CUPS_REQUESTROOT", RequestRoot); set_if_undefined("CUPS_SERVERBIN", ServerBin); set_if_undefined("CUPS_SERVERROOT", ServerRoot); @@ -209,8 +212,16 @@ set_if_undefined("LD_PRELOAD", NULL); set_if_undefined("NLSPATH", NULL); if (find_env("PATH") < 0) - cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR - ":/bin:/usr/bin", ServerBin); + { +#if CUPS_SNAP + const char *path; // PATH environment variable + + if ((path = getenv("PATH")) != NULL) + cupsdSetEnvf("PATH", "%s/filter:%s", ServerBin, path); + else +#endif /* CUPS_SNAP */ + cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", ServerBin); + } set_if_undefined("SERVER_ADMIN", ServerAdmin); set_if_undefined("SHLIB_PATH", NULL); set_if_undefined("SOFTWARE", CUPS_MINIMAL); diff -Nru cups-2.3.3op2/scheduler/ipp.c cups-2.4.1op1/scheduler/ipp.c --- cups-2.3.3op2/scheduler/ipp.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/ipp.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,8 @@ /* * IPP routines for the CUPS scheduler. * - * Copyright © 2020 by Michael R Sweet - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2020-2022 by OpenPrinting + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * * This file contains Kerberos support code, copyright 2006 by @@ -73,6 +73,7 @@ cups_array_t *ra, cups_array_t *exclude); static void create_job(cupsd_client_t *con, ipp_attribute_t *uri); +static void *create_local_bg_thread(cupsd_printer_t *printer); static void create_local_printer(cupsd_client_t *con); static cups_array_t *create_requested_array(ipp_t *request); static void create_subscriptions(cupsd_client_t *con, ipp_attribute_t *uri); @@ -881,7 +882,7 @@ * Class doesn't exist; see if we have a printer of the same name... */ - if ((pclass = cupsdFindPrinter(resource + 9)) != NULL) + if (cupsdFindPrinter(resource + 9)) { /* * Yes, return an error... @@ -1279,7 +1280,7 @@ send_http_error(con, HTTP_UNAUTHORIZED, printer); return (NULL); } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (auth_info && !con->http->tls && !httpAddrLocalhost(con->http->hostaddr)) { @@ -1290,7 +1291,7 @@ send_http_error(con, HTTP_UPGRADE_REQUIRED, printer); return (NULL); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * See if the printer is accepting jobs... @@ -2206,7 +2207,7 @@ ipp_attribute_t *uri) /* I - URI of printer */ { http_status_t status; /* Policy status */ - int i; /* Looping var */ + int i = 0; /* Looping var */ char scheme[HTTP_MAX_URI], /* Method portion of URI */ username[HTTP_MAX_URI], /* Username portion of URI */ host[HTTP_MAX_URI], /* Host portion of URI */ @@ -2274,7 +2275,7 @@ * Printer doesn't exist; see if we have a class of the same name... */ - if ((printer = cupsdFindClass(resource + 10)) != NULL) + if (cupsdFindClass(resource + 10)) { /* * Yes, return an error... @@ -2692,7 +2693,22 @@ need_restart_job = 1; changed_driver = 1; - if (!strcmp(ppd_name, "raw")) + if (!strcmp(ppd_name, "everywhere")) + { + // Create IPP Everywhere PPD... + if (!printer->device_uri || (strncmp(printer->device_uri, "dnssd://", 8) && strncmp(printer->device_uri, "ipp://", 6) && strncmp(printer->device_uri, "ipps://", 7) && strncmp(printer->device_uri, "ippusb://", 9))) + { + send_ipp_status(con, IPP_INTERNAL_ERROR, _("IPP Everywhere driver requires an IPP connection.")); + if (!modify) + cupsdDeletePrinter(printer, 0); + + return; + } + + // Run a background thread to create the PPD... + _cupsThreadCreate((_cups_thread_func_t)create_local_bg_thread, printer); + } + else if (!strcmp(ppd_name, "raw")) { /* * Raw driver, remove any existing PPD file. @@ -2719,7 +2735,6 @@ if (copy_model(con, ppd_name, dstfile)) { - send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to copy PPD file.")); if (!modify) cupsdDeletePrinter(printer, 0); @@ -4468,9 +4483,15 @@ snprintf(buffer, sizeof(buffer), "%s/daemon/cups-driverd", ServerBin); 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)) + if ((tempfd = open(tempfile, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0) return (-1); + if (cupsdOpenPipe(temppipe)) + { + close(tempfd); + unlink(tempfile); + + return (-1); + } cupsdLogMessage(CUPSD_LOG_DEBUG, "copy_model: Running \"cups-driverd cat %s\"...", from); @@ -4478,6 +4499,7 @@ if (!cupsdStartProcess(buffer, argv, envp, -1, temppipe[1], CGIPipes[1], -1, -1, 0, DefaultProfile, NULL, &temppid)) { + send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to run cups-driverd: %s"), strerror(errno)); close(tempfd); unlink(tempfile); @@ -4557,6 +4579,7 @@ */ cupsdLogMessage(CUPSD_LOG_ERROR, "copy_model: empty PPD file"); + send_ipp_status(con, IPP_INTERNAL_ERROR, _("cups-driverd failed to get PPD file - see error_log for details.")); unlink(tempfile); return (-1); } @@ -4650,6 +4673,7 @@ if ((dst = cupsdCreateConfFile(to, ConfigFilePerm)) == NULL) { + send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to save PPD file: %s"), strerror(errno)); cupsFreeOptions(num_defaults, defaults); cupsFileClose(src); unlink(tempfile); @@ -4703,7 +4727,15 @@ unlink(tempfile); - return (cupsdCloseCreatedConfFile(dst, to)); + if (cupsdCloseCreatedConfFile(dst, to)) + { + send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to commit PPD file: %s"), strerror(errno)); + return (-1); + } + else + { + return (0); + } } @@ -4906,7 +4938,7 @@ if (!ra || cupsArrayFind(ra, "printer-current-time")) ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(curtime)); -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD if (!ra || cupsArrayFind(ra, "printer-dns-sd-name")) { if (printer->reg_name) @@ -4914,7 +4946,7 @@ else ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "printer-dns-sd-name", 0); } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ if (!ra || cupsArrayFind(ra, "printer-error-policy")) ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-error-policy", NULL, printer->error_policy); @@ -6758,6 +6790,7 @@ { send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), job_ids->values[i].integer); + cupsArrayDelete(ra); return; } @@ -9357,11 +9390,10 @@ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Restarted by \"%s\" with job-hold-until=%s.", username, attr->values[0].string.text); - cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0); - - cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE, - NULL, job, "Job restarted by user with job-hold-until=%s", - attr->values[0].string.text); + cupsdSetJobHoldUntil(job, attr->values[0].string.text, 1); + cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, + "Job restarted by user with job-hold-until=%s", + attr->values[0].string.text); } else { @@ -11228,9 +11260,9 @@ { http_status_t status; /* Policy status */ ipp_attribute_t *attr; /* Current attribute */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS ipp_attribute_t *auth_info; /* auth-info attribute */ -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ ipp_attribute_t *format, /* Document-format attribute */ *name; /* Job-name attribute */ cups_ptype_t dtype; /* Destination type (printer/class) */ @@ -11350,9 +11382,9 @@ * Check policy... */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) { @@ -11366,7 +11398,7 @@ send_http_error(con, HTTP_UNAUTHORIZED, printer); return; } -#ifdef HAVE_SSL +#ifdef HAVE_TLS else if (auth_info && !con->http->tls && !httpAddrLocalhost(con->http->hostaddr)) { @@ -11377,7 +11409,7 @@ send_http_error(con, HTTP_UPGRADE_REQUIRED, printer); return; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Everything was ok, so return OK status... diff -Nru cups-2.3.3op2/scheduler/job.c cups-2.4.1op1/scheduler/job.c --- cups-2.3.3op2/scheduler/job.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/job.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Job management routines for the CUPS scheduler. * + * Copyright © 2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -501,6 +502,7 @@ int backroot; /* Run backend as root? */ int pid; /* Process ID of new filter process */ int banner_page; /* 1 if banner page, 0 otherwise */ + int raw_file; /* 1 if file type is vnd.cups-raw */ int filterfds[2][2] = { { -1, -1 }, { -1, -1 } }; /* Pipes used between filters */ int envc; /* Number of environment variables */ @@ -540,10 +542,8 @@ /* PRINTER_LOCATION env variable */ printer_name[255], /* PRINTER env variable */ - *printer_state_reasons = NULL, + *printer_state_reasons = NULL; /* PRINTER_STATE_REASONS env var */ - rip_max_cache[255]; - /* RIP_MAX_CACHE env variable */ cupsdLogMessage(CUPSD_LOG_DEBUG2, @@ -746,8 +746,11 @@ * Add decompression/raw filter as needed... */ + raw_file = !strcmp(job->filetypes[job->current_file]->super, "application") && + !strcmp(job->filetypes[job->current_file]->type, "vnd.cups-raw"); + if ((job->compressions[job->current_file] && (!job->printer->remote || job->num_files == 1)) || - (!job->printer->remote && job->printer->raw && job->num_files > 1)) + (!job->printer->remote && (job->printer->raw || raw_file) && job->num_files > 1)) { /* * Add gziptoany filter to the front of the list... @@ -1012,7 +1015,6 @@ } } } - snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache); if (job->printer->num_auth_info_required == 1) snprintf(auth_info_required, sizeof(auth_info_required), @@ -1048,7 +1050,6 @@ envp[envc ++] = apple_language; #endif /* __APPLE__ */ envp[envc ++] = ppd; - envp[envc ++] = rip_max_cache; envp[envc ++] = content_type; envp[envc ++] = device_uri; envp[envc ++] = printer_info; @@ -2179,11 +2180,8 @@ { int i; /* Looping var */ cups_file_t *fp; /* job.cache file */ - char filename[1024], /* job.cache filename */ - temp[1024]; /* Temporary string */ + char filename[1024]; /* job.cache filename */ cupsd_job_t *job; /* Current job */ - time_t curtime; /* Current time */ - struct tm curdate; /* Current date */ snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir); @@ -2196,10 +2194,6 @@ * Write a small header to the file... */ - time(&curtime); - localtime_r(&curtime, &curdate); - strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate); - cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n"); cupsFilePrintf(fp, "# Written by cupsd\n"); cupsFilePrintf(fp, "NextJobId %d\n", NextJobId); @@ -3119,8 +3113,7 @@ * rarely have current information for network devices... */ - if (strncmp(job->printer->device_uri, "usb:", 4) && - strncmp(job->printer->device_uri, "ippusb:", 7)) + if (!strstr(job->printer->device_uri, "usb:")) cupsdSetPrinterReasons(job->printer, "-offline-report"); /* diff -Nru cups-2.3.3op2/scheduler/log.c cups-2.4.1op1/scheduler/log.c --- cups-2.3.3op2/scheduler/log.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/log.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Log file routines for the CUPS scheduler. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -569,11 +570,7 @@ * Format and write the log message... */ -#ifdef HAVE_SYSTEMD_SD_JOURNAL_H - if (job && strcmp(ErrorLog, "syslog")) -#else if (job) -#endif /* HAVE_SYSTEMD_SD_JOURNAL_H */ snprintf(jobmsg, sizeof(jobmsg), "[Job %d] %s", job->id, message); else strlcpy(jobmsg, message, sizeof(jobmsg)); @@ -919,8 +916,11 @@ { 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; + if (pwg) + { + strlcpy(bufptr, pwg->pwg, sizeof(buffer) - (size_t)(bufptr - buffer)); + break; + } } } diff -Nru cups-2.3.3op2/scheduler/main.c cups-2.4.1op1/scheduler/main.c --- cups-2.3.3op2/scheduler/main.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/main.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Main loop for the CUPS scheduler. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -232,7 +233,6 @@ case 'h' : /* Show usage/help */ usage(0); - break; case 'l' : /* Started by launchd/systemd/upstart... */ #ifdef HAVE_ONDEMAND @@ -312,7 +312,6 @@ _cupsLangPrintf(stderr, _("cupsd: Unknown option \"%c\" - " "aborting."), *opt); usage(1); - break; } } } @@ -581,7 +580,7 @@ * Clean out old temp files and printer cache data. */ - if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot))) + if (!RequestRoot || !strncmp(TempDir, RequestRoot, strlen(RequestRoot))) cupsdCleanFiles(TempDir, NULL); cupsdCleanFiles(CacheDir, "*.ipp"); @@ -859,9 +858,9 @@ * Got an error from select! */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD cupsd_printer_t *p; /* Current printer */ -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ if (errno == EINTR) /* Just interrupted by a signal */ continue; @@ -901,13 +900,13 @@ job->print_pipes[0], job->print_pipes[1], job->back_pipes[0], job->back_pipes[1]); -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); p; p = (cupsd_printer_t *)cupsArrayNext(Printers)) cupsdLogMessage(CUPSD_LOG_EMERG, "printer[%s] reg_name=\"%s\"", p->name, p->reg_name ? p->reg_name : "(null)"); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ break; } @@ -1730,6 +1729,11 @@ /* * Check for any job activity... */ + if (JobHistoryUpdate && timeout > JobHistoryUpdate) + { + timeout = JobHistoryUpdate; + why = "update job history"; + } for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); job; @@ -1897,7 +1901,6 @@ { cupsdLogMessage(CUPSD_LOG_ERROR, "service_add_listener: Unable to allocate listener: %s.", strerror(errno)); exit(EXIT_FAILURE); - return; } cupsArrayAdd(Listeners, lis); @@ -1908,10 +1911,10 @@ lis->fd = fd; lis->on_demand = 1; -# ifdef HAVE_SSL +# ifdef HAVE_TLS if (httpAddrPort(&(lis->address)) == 443) lis->encryption = HTTP_ENCRYPT_ALWAYS; -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ } #endif /* HAVE_ONDEMAND */ @@ -1949,7 +1952,6 @@ { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(error)); exit(EXIT_FAILURE); - return; /* anti-compiler-warning */ } /* @@ -1982,7 +1984,6 @@ { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(-count)); exit(EXIT_FAILURE); - return; /* anti-compiler-warning */ } /* @@ -2006,21 +2007,18 @@ { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: We did not get started via Upstart."); exit(EXIT_FAILURE); - return; } if (strcasecmp(e, "socket")) { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: We did not get triggered via an Upstart socket event."); exit(EXIT_FAILURE); - return; } if ((e = getenv("UPSTART_FDS")) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets from UPSTART_FDS."); exit(EXIT_FAILURE); - return; } cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: UPSTART_FDS=%s", e); @@ -2030,7 +2028,6 @@ { cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Could not parse UPSTART_FDS: %s", strerror(errno)); exit(EXIT_FAILURE); - return; } /* diff -Nru cups-2.3.3op2/scheduler/printers.c cups-2.4.1op1/scheduler/printers.c --- cups-2.3.3op2/scheduler/printers.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/printers.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * Printer routines for the CUPS scheduler. * - * Copyright © 2020 by Michael R Sweet + * Copyright © 2020-2022 by OpenPrinting * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * @@ -851,10 +851,10 @@ cupsdClearString(&p->alert); cupsdClearString(&p->alert_description); -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD cupsdClearString(&p->pdl); cupsdClearString(&p->reg_name); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ cupsArrayDelete(p->filetypes); @@ -944,6 +944,8 @@ *value, /* Pointer to value */ *valueptr; /* Pointer into value */ cupsd_printer_t *p; /* Current printer */ + int found_raw = 0; /* Flag whether raw queue is installed */ + int found_driver = 0; /* Flag whether queue with classic driver is installed */ /* @@ -1019,6 +1021,30 @@ cupsdSetPrinterAttrs(p); + if ((p->device_uri && strncmp(p->device_uri, "ipp:", 4) && strncmp(p->device_uri, "ipps:", 5) && strncmp(p->device_uri, "implicitclass:", 14)) || + !p->make_model || + (p->make_model && strstr(p->make_model, "IPP Everywhere") == NULL && strstr(p->make_model, "driverless") == NULL)) + { + /* + * Warn users about printer drivers and raw queues will be deprecated. + * It will warn users in the following scenarios: + * - the queue doesn't use ipp, ipps or implicitclass backend, which means + * it doesn't communicate via IPP and is raw or uses a driver for sure + * - the queue doesn't have make_model - it is raw + * - the queue uses a correct backend, but the model is not IPP Everywhere/driverless + */ + if (!p->make_model) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Queue %s is a raw queue, which is deprecated.", p->name); + found_raw = 1; + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Queue %s uses a printer driver, which is deprecated.", p->name); + found_driver = 1; + } + } + if (strncmp(p->device_uri, "file:", 5) && p->state != IPP_PRINTER_STOPPED) { /* @@ -1409,6 +1435,12 @@ } } + if (found_raw) + cupsdLogMessage(CUPSD_LOG_WARN, "Raw queues are deprecated and will stop working in a future version of CUPS. See https://github.com/OpenPrinting/cups/issues/103"); + + if (found_driver) + cupsdLogMessage(CUPSD_LOG_WARN, "Printer drivers are deprecated and will stop working in a future version of CUPS. See https://github.com/OpenPrinting/cups/issues/103"); + cupsFileClose(fp); } @@ -1476,13 +1508,10 @@ int i; /* Looping var */ cups_file_t *fp; /* printers.conf file */ char filename[1024], /* printers.conf filename */ - temp[1024], /* Temporary string */ value[2048], /* Value string */ *ptr, /* Pointer into value */ *name; /* Current user/group name */ cupsd_printer_t *printer; /* Current printer class */ - time_t curtime; /* Current time */ - struct tm curdate; /* Current date */ cups_option_t *option; /* Current option */ ipp_attribute_t *marker; /* Current marker attribute */ @@ -1502,10 +1531,6 @@ * Write a small header to the file... */ - time(&curtime); - localtime_r(&curtime, &curdate); - strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate); - cupsFilePuts(fp, "# Printer configuration file for " CUPS_SVERSION "\n"); cupsFilePrintf(fp, "# Written by cupsd\n"); cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n"); @@ -3370,6 +3395,7 @@ cupsArrayAdd(CommonDefaults, _cupsStrAlloc("notify-events-default")); cupsArrayAdd(CommonDefaults, _cupsStrAlloc("number-up-default")); cupsArrayAdd(CommonDefaults, _cupsStrAlloc("orientation-requested-default")); + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("print-color-mode-default")); cupsArrayAdd(CommonDefaults, _cupsStrAlloc("print-quality-default")); } @@ -3381,9 +3407,7 @@ i > 0; i --, option ++) { - if (strcmp(option->name, "ipp-options") && - strcmp(option->name, "job-sheets") && - strcmp(option->name, "lease-duration")) + if (strcmp(option->name, "ipp-options") && strcmp(option->name, "job-sheets") && strcmp(option->name, "lease-duration")) { snprintf(name, sizeof(name), "%s-default", option->name); num_options = cupsAddOption(name, option->value, num_options, &options); @@ -3405,44 +3429,37 @@ */ if (!cupsGetOption("copies", p->num_options, p->options)) - ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", - 1); + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", 1); if (!cupsGetOption("document-format", p->num_options, p->options)) - ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE, - "document-format-default", NULL, "application/octet-stream"); + 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, MaxJobTime > 0 ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE, - "job-cancel-after-default", MaxJobTime); + ippAddInteger(p->attrs, IPP_TAG_PRINTER, MaxJobTime > 0 ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE, "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"); + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "job-hold-until-default", NULL, "no-hold"); if (!cupsGetOption("job-priority", p->num_options, p->options)) - ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, - "job-priority-default", 50); + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-default", 50); if (!cupsGetOption("number-up", p->num_options, p->options)) - ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, - "number-up-default", 1); + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "number-up-default", 1); if (!cupsGetOption("notify-lease-duration", p->num_options, p->options)) - ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, - "notify-lease-duration-default", DefaultLeaseDuration); + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "notify-lease-duration-default", DefaultLeaseDuration); if (!cupsGetOption("notify-events", p->num_options, p->options)) - ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, - "notify-events-default", NULL, "job-completed"); + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "notify-events-default", NULL, "job-completed"); if (!cupsGetOption("orientation-requested", p->num_options, p->options)) - ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, - "orientation-requested-default", NULL, NULL); + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "orientation-requested-default", NULL, NULL); + + if (!cupsGetOption("print-color-mode", p->num_options, p->options)) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "print-color-mode-default", NULL, (p->type & CUPS_PRINTER_COLOR) ? "color" : "monochrome"); if (!cupsGetOption("print-quality", p->num_options, p->options)) - ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, - "print-quality-default", IPP_QUALITY_NORMAL); + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-default", IPP_QUALITY_NORMAL); } @@ -3610,6 +3627,8 @@ ipp_attribute_t *attr; /* document-format-supported attribute */ char mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE + 2]; /* MIME type name */ + const char *preferred = "image/urf"; + /* document-format-preferred value */ /* @@ -3655,6 +3674,9 @@ cupsArrayDelete(filters); cupsArrayAdd(p->filetypes, type); + + if (!strcasecmp(mimetype, "application/pdf")) + preferred = "application/pdf"; } else cupsdLogMessage(CUPSD_LOG_DEBUG2, @@ -3692,7 +3714,9 @@ attr->values[i].string.text = _cupsStrAlloc(mimetype); } -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_MIMETYPE), "document-format-preferred", NULL, preferred); + +#ifdef HAVE_DNSSD { char pdl[1024]; /* Buffer to build pdl list */ mime_filter_t *filter; /* MIME filter looping var */ @@ -3713,9 +3737,6 @@ pdl[0] = '\0'; - if (!filter && mimeType(MimeDatabase, "application", "octet-stream")) - strlcat(pdl, "application/octet-stream,", sizeof(pdl)); - /* * Then list a bunch of formats that are supported by the printer... */ @@ -3739,15 +3760,19 @@ strlcat(pdl, "image/png,", sizeof(pdl)); else if (!_cups_strcasecmp(type->type, "pwg-raster")) strlcat(pdl, "image/pwg-raster,", sizeof(pdl)); + else if (!_cups_strcasecmp(type->type, "urf")) + strlcat(pdl, "image/urf,", sizeof(pdl)); } } if (pdl[0]) pdl[strlen(pdl) - 1] = '\0'; /* Remove trailing comma */ + cupsdLogMessage(CUPSD_LOG_DEBUG, "%s: pdl='%s'", p->name, pdl); + cupsdSetString(&p->pdl, pdl); } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ } @@ -3873,6 +3898,15 @@ margins[16]; /* media-*-margin-supported values */ const char *filter, /* Current filter */ *mandatory; /* Current mandatory attribute */ + ipp_attribute_t *media_col_ready, /* media-col-ready attribute */ + *media_ready; /* media-ready attribute */ + int num_urf; /* Number of urf-supported values */ + const char *urf[16], /* urf-supported values */ + *urf_prefix; /* Prefix string for value */ + char *urf_ptr, /* Pointer into value */ + urf_fn[64], /* FN (finishings) value */ + urf_pq[32], /* PQ (print-quality) value */ + urf_rs[32]; /* RS (resolution) value */ static const char * const pwg_raster_document_types[] = { "black_1", @@ -4087,6 +4121,19 @@ else cupsdClearString(&p->strings); + num_urf = 0; + urf[num_urf ++] = "V1.4"; + urf[num_urf ++] = "CP1"; + urf[num_urf ++] = "W8"; + + for (i = 0, urf_ptr = urf_pq, urf_prefix = "PQ"; i < num_qualities; i ++) + { + snprintf(urf_ptr, sizeof(urf_pq) - (size_t)(urf_ptr - urf_pq), "%s%d", urf_prefix, qualities[i]); + urf_prefix = "-"; + urf_ptr += strlen(urf_ptr); + } + urf[num_urf ++] = urf_pq; + /* * Add media options from the PPD file... */ @@ -4335,8 +4382,40 @@ ippDelete(col); } } + + /* + * media[-col]-ready + */ + + for (media_col_ready = NULL, media_ready = NULL, i = p->pc->num_sizes, pwgsize = p->pc->sizes; i > 0; i --, pwgsize ++) + { + ipp_t *col; // media-col-ready value + + // Skip printer sizes that don't have a PPD size or aren't in the ready + // sizes array... + if (!pwgsize->map.ppd || !cupsArrayFind(ReadyPaperSizes, pwgsize->map.ppd)) + continue; + + // Add or append a media-ready value + if (media_ready) + ippSetString(p->ppd_attrs, &media_ready, ippGetCount(media_ready), pwgsize->map.pwg); + else + media_ready = ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-ready", NULL, pwgsize->map.pwg); + + // Add or append a media-col-ready value + col = new_media_col(pwgsize); + + if (media_col_ready) + ippSetCollection(p->ppd_attrs, &media_col_ready, ippGetCount(media_col_ready), col); + else + media_col_ready = ippAddCollection(p->ppd_attrs, IPP_TAG_PRINTER, "media-col-ready", col); + + ippDelete(col); + } } + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "mopria-certified", NULL, "1.3"); + /* * Output bin... */ @@ -4387,6 +4466,8 @@ "output-bin-supported", NULL, "face-up"); ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "output-bin-default", NULL, "face-up"); + + urf[num_urf ++] = "OFU0"; } else { @@ -4408,18 +4489,25 @@ "color" }; - ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, - "print-color-mode-supported", 2, NULL, color_modes); - ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, - "print-color-mode-default", NULL, "color"); + ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "print-color-mode-supported", 2, NULL, color_modes); ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "pwg-raster-document-type-supported", 3, NULL, pwg_raster_document_types); + + urf[num_urf ++] = "SRGB24"; + + if (!cupsGetOption("printer-color-mode", p->num_options, p->options)) + { + // If the default color mode isn't set, use the default from the PPD + // file... + ppd_option_t *color_model = ppdFindOption(ppd, "ColorModel"); + // ColorModel PPD option + + if (color_model && strcmp(color_model->defchoice, "RGB")) + p->num_options = cupsAddOption("print-color-mode", "monochrome", p->num_options, &p->options); + } } else { - 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"); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "print-color-mode-supported", NULL, "monochrome"); ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "pwg-raster-document-type-supported", 2, NULL, pwg_raster_document_types); } @@ -4484,7 +4572,11 @@ ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, xdpi, ydpi); if (i == 0) + { ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", IPP_RES_PER_INCH, xdpi, ydpi); + snprintf(urf_rs, sizeof(urf_rs), "RS%d", xdpi); + urf[num_urf ++] = urf_rs; + } } } else if ((ppd_attr = ppdFindAttr(ppd, "DefaultResolution", NULL)) != NULL && @@ -4518,6 +4610,8 @@ "printer-resolution-supported", IPP_RES_PER_INCH, xdpi, ydpi); ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", IPP_RES_PER_INCH, xdpi, ydpi); + snprintf(urf_rs, sizeof(urf_rs), "RS%d", xdpi); + urf[num_urf ++] = urf_rs; } else { @@ -4532,6 +4626,8 @@ "printer-resolution-supported", IPP_RES_PER_INCH, 300, 300); ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", IPP_RES_PER_INCH, 300, 300); + strlcpy(urf_rs, "RS300", sizeof(urf_rs)); + urf[num_urf ++] = urf_rs; } /* @@ -4553,6 +4649,8 @@ ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "pwg-raster-document-sheet-back", NULL, "normal"); + urf[num_urf ++] = "DM1"; + ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "sides-supported", 3, NULL, sides); @@ -4581,11 +4679,15 @@ { _pwg_finishings_t *fin; /* Current finishing value */ - for (fin = (_pwg_finishings_t *)cupsArrayFirst(p->pc->finishings); fin; fin = (_pwg_finishings_t *)cupsArrayNext(p->pc->finishings)) + for (fin = (_pwg_finishings_t *)cupsArrayFirst(p->pc->finishings), urf_ptr = urf_fn, urf_prefix = "FN"; fin; fin = (_pwg_finishings_t *)cupsArrayNext(p->pc->finishings)) { if (num_finishings < (int)(sizeof(finishings) / sizeof(finishings[0]))) finishings[num_finishings++] = (int)fin->value; + snprintf(urf_ptr, sizeof(urf_fn) - (size_t)(urf_ptr - urf_fn), "%s%d", urf_prefix, fin->value); + urf_prefix = "-"; + urf_ptr += strlen(urf_ptr); + switch (fin->value) { case IPP_FINISHINGS_BIND : @@ -4645,7 +4747,15 @@ break; } } + + if (urf_ptr > urf_fn) + urf[num_urf ++] = urf_fn; } + else + urf[num_urf ++] = "FN3"; + + /* urf-supported */ + ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", num_urf, NULL, urf); if (p->pc && p->pc->templates) { diff -Nru cups-2.3.3op2/scheduler/printers.h cups-2.4.1op1/scheduler/printers.h --- cups-2.3.3op2/scheduler/printers.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/printers.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,20 +1,21 @@ /* * Printer definitions for the CUPS scheduler. * - * Copyright 2007-2017 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright @ 2007-2017 by Apple Inc. + * Copyright @ 1997-2007 by Easy Software Products, all rights reserved. * * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER # include #elif defined(HAVE_AVAHI) # include # include # include # include -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #include @@ -35,14 +36,14 @@ * DNS-SD types to make the code cleaner/clearer... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER typedef DNSServiceRef cupsd_srv_t; /* Service reference */ typedef TXTRecordRef cupsd_txt_t; /* TXT record */ #elif defined(HAVE_AVAHI) typedef AvahiEntryGroup *cupsd_srv_t; /* Service reference */ typedef AvahiStringList *cupsd_txt_t; /* TXT record */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ /* @@ -113,17 +114,17 @@ time_t marker_time; /* Last time marker attributes were updated */ _ppd_cache_t *pc; /* PPD cache and mapping data */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD char *reg_name, /* Name used for service registration */ *pdl; /* pdl value for TXT record */ cupsd_srv_t ipp_srv; /* IPP service(s) */ -# ifdef HAVE_DNSSD -# ifdef HAVE_SSL +# ifdef HAVE_MDNSRESPONDER +# ifdef HAVE_TLS cupsd_srv_t ipps_srv; /* IPPS service(s) */ -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ cupsd_srv_t printer_srv; /* LPD service */ -# endif /* HAVE_DNSSD */ -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +# endif /* HAVE_MDNSRESPONDER */ +#endif /* HAVE_DNSSD */ }; diff -Nru cups-2.3.3op2/scheduler/process.c cups-2.4.1op1/scheduler/process.c --- cups-2.3.3op2/scheduler/process.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/process.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * Process management routines for the CUPS scheduler. * - * Copyright 2007-2017 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2017 by Apple Inc. + * Copyright © 1997-2007 by Easy Software Products, all rights reserved. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* @@ -744,7 +746,11 @@ if (!RunUser && setgid(Group)) exit(errno + 100); +# if CUPS_SNAP + if (!RunUser && setgroups(0, NULL)) +# else if (!RunUser && setgroups(1, &Group)) +# endif /* CUPS_SNAP */ exit(errno + 100); /* diff -Nru cups-2.3.3op2/scheduler/subscriptions.c cups-2.4.1op1/scheduler/subscriptions.c --- cups-2.3.3op2/scheduler/subscriptions.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/subscriptions.c 2022-01-27 11:11:42.000000000 +0000 @@ -1021,11 +1021,8 @@ { int i; /* Looping var */ cups_file_t *fp; /* subscriptions.conf file */ - char filename[1024], /* subscriptions.conf filename */ - temp[1024]; /* Temporary string */ + char filename[1024]; /* subscriptions.conf filename */ cupsd_subscription_t *sub; /* Current subscription */ - time_t curtime; /* Current time */ - struct tm curdate; /* Current date */ unsigned mask; /* Current event mask */ const char *name; /* Current event name */ int hex; /* Non-zero if we are writing hex data */ @@ -1046,10 +1043,6 @@ * Write a small header to the file... */ - time(&curtime); - localtime_r(&curtime, &curdate); - strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", &curdate); - cupsFilePuts(fp, "# Subscription configuration file for " CUPS_SVERSION "\n"); cupsFilePrintf(fp, "# Written by cupsd\n"); diff -Nru cups-2.3.3op2/scheduler/sysman.c cups-2.4.1op1/scheduler/sysman.c --- cups-2.3.3op2/scheduler/sysman.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/sysman.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,10 +1,12 @@ /* * System management functions for the CUPS scheduler. * - * Copyright 2007-2018 by Apple Inc. - * Copyright 2006 by Easy Software Products. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright @ 2007-2018 by Apple Inc. + * Copyright @ 2006 by Easy Software Products. * - * Licensed under Apache License v2.0. See the file "LICENSE" for more information. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ @@ -425,7 +427,7 @@ * Register for power state change notifications */ - bzero(&threadData, sizeof(threadData)); + memset(&threadData, 0, sizeof(threadData)); threadData.sysevent.powerKernelPort = IORegisterForSystemPower(&threadData, &powerNotifierPort, @@ -441,7 +443,7 @@ * Register for system configuration change notifications */ - bzero(&storeContext, sizeof(storeContext)); + memset(&storeContext, 0, sizeof(storeContext)); storeContext.info = &threadData; store = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"), @@ -1019,13 +1021,13 @@ p = (cupsd_printer_t *)cupsArrayNext(Printers)) cupsdDeregisterPrinter(p, 1); -# if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +# ifdef HAVE_DNSSD /* * Update the computer name and BTMM domain list... */ cupsdUpdateDNSSDName(); -# endif /* HAVE_DNSSD || HAVE_AVAHI */ +# endif /* HAVE_DNSSD */ /* * Now re-register them... diff -Nru cups-2.3.3op2/scheduler/type.c cups-2.4.1op1/scheduler/type.c --- cups-2.3.3op2/scheduler/type.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/type.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * MIME typing routines for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products, all rights reserved. * @@ -797,10 +798,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + 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)); } @@ -841,10 +848,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + 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)); } @@ -890,10 +903,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + 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)); @@ -936,10 +955,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, sizeof(fb->buffer)); + fb->offset = rules->offset; + } DEBUG_printf(("4mime_check_rules: MIME_MAGIC_STRING fb->length=%d", fb->length)); @@ -973,10 +998,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + 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)); } @@ -1003,10 +1034,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + 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)); } @@ -1019,8 +1056,7 @@ if (fb->length < 1) result = 0; else - result = (fb->buffer[rules->offset - fb->offset] == - rules->value.charv); + result = (fb->buffer[rules->offset - fb->offset] == rules->value.charv); break; case MIME_MAGIC_SHORT : @@ -1035,10 +1071,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + 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)); } @@ -1049,7 +1091,9 @@ */ if (fb->length < 2) + { result = 0; + } else { bufptr = fb->buffer + rules->offset - fb->offset; @@ -1070,10 +1114,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + 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)); } @@ -1084,7 +1134,9 @@ */ if (fb->length < 4) + { result = 0; + } else { bufptr = fb->buffer + rules->offset - fb->offset; @@ -1113,10 +1165,16 @@ * Reload file buffer... */ - cupsFileSeek(fb->fp, rules->offset); - fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, - sizeof(fb->buffer)); - fb->offset = rules->offset; + if (cupsFileSeek(fb->fp, rules->offset) < 0) + { + fb->length = 0; + fb->offset = 0; + } + else + { + 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)); } @@ -1127,7 +1185,9 @@ */ if ((rules->offset + rules->length) > (fb->offset + fb->length)) + { result = 0; + } else { if (fb->length > rules->region) diff -Nru cups-2.3.3op2/scheduler/util.c cups-2.4.1op1/scheduler/util.c --- cups-2.3.3op2/scheduler/util.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/scheduler/util.c 2022-01-27 11:11:42.000000000 +0000 @@ -108,7 +108,7 @@ return (-1); else if (digits > 0) return (1); - else if (diff) + else return (diff); } else if (tolower(*s) < tolower(*t)) @@ -142,10 +142,10 @@ cups_array_t * /* O - CUPS array */ cupsdCreateStringsArray(const char *s) /* I - Comma-delimited strings */ { - if (!s || !*s) - return (NULL); - else + if (s && *s) return (_cupsArrayNewStrings(s, ',')); + else + return (NULL); } diff -Nru cups-2.3.3op2/systemv/cancel.c cups-2.4.1op1/systemv/cancel.c --- cups-2.3.3op2/systemv/cancel.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/cancel.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * "cancel" command for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * @@ -76,14 +77,14 @@ switch (*opt) { case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); if (http) httpEncryption(http, HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'U' : /* Username */ @@ -311,8 +312,7 @@ op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job", cupsLastErrorString()); - if (response) - ippDelete(response); + ippDelete(response); return (1); } @@ -375,8 +375,7 @@ op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job", cupsLastErrorString()); - if (response) - ippDelete(response); + ippDelete(response); return (1); } diff -Nru cups-2.3.3op2/systemv/cupsaccept.c cups-2.4.1op1/systemv/cupsaccept.c --- cups-2.3.3op2/systemv/cupsaccept.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/cupsaccept.c 2022-01-27 11:11:42.000000000 +0000 @@ -2,6 +2,7 @@ * "cupsaccept", "cupsdisable", "cupsenable", and "cupsreject" commands for * CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * @@ -89,11 +90,11 @@ switch (*opt) { case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), command); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'U' : /* Username */ diff -Nru cups-2.3.3op2/systemv/cupsctl.c cups-2.4.1op1/systemv/cupsctl.c --- cups-2.3.3op2/systemv/cupsctl.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/cupsctl.c 2022-01-27 11:11:42.000000000 +0000 @@ -47,11 +47,9 @@ "ErrorLog", "FatalErrors", "FileDevice", - "FontPath", "Group", "Listen", "LogFilePerm", - "LPDConfigFile", "PageLog", "PassEnv", "Port", @@ -65,7 +63,6 @@ "ServerKeychain", "ServerRoot", "SetEnv", - "SMBConfigFile", "StateDir", "SystemGroup", "SystemGroupAuthKey", @@ -151,7 +148,6 @@ default : usage(opt); - break; } } } diff -Nru cups-2.3.3op2/systemv/cupstestppd.c cups-2.4.1op1/systemv/cupstestppd.c --- cups-2.3.3op2/systemv/cupstestppd.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/cupstestppd.c 2022-01-27 11:11:42.000000000 +0000 @@ -261,7 +261,6 @@ default : usage(); - break; } } else diff -Nru cups-2.3.3op2/systemv/lp.c cups-2.4.1op1/systemv/lp.c --- cups-2.3.3op2/systemv/lp.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/lp.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * "lp" command for CUPS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -19,7 +20,7 @@ * Local functions. */ -static int restart_job(const char *command, int job_id); +static int restart_job(const char *command, int job_id, const char *job_hold_until); static int set_job_attrs(const char *command, int job_id, int num_options, cups_option_t *options); static void usage(void) _CUPS_NORETURN; @@ -92,11 +93,11 @@ switch (*opt) { case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'U' : /* Username */ @@ -428,7 +429,7 @@ return (1); } - if (restart_job(argv[0], job_id)) + if (restart_job(argv[0], job_id, cupsGetOption("job-hold-until", num_options, options))) return (1); } else @@ -654,7 +655,8 @@ static int /* O - Exit status */ restart_job(const char *command, /* I - Command name */ - int job_id) /* I - Job ID */ + int job_id, /* I - Job ID */ + const char *job_hold_until) /* I - "job-hold-until" value, if any */ { ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI]; /* URI for job */ @@ -670,6 +672,9 @@ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); + if (job_hold_until) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "job-hold-until", NULL, job_hold_until); + ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs")); if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST || diff -Nru cups-2.3.3op2/systemv/lpadmin.c cups-2.4.1op1/systemv/lpadmin.c --- cups-2.3.3op2/systemv/lpadmin.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/lpadmin.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,8 @@ /* * "lpadmin" command for CUPS. * - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -28,7 +29,6 @@ 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, int *num_options, cups_option_t **options); 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, @@ -240,14 +240,14 @@ case 'E' : /* Enable the printer/enable encryption */ if (printer == NULL) { -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPTION_REQUIRED); if (http) httpEncryption(http, HTTP_ENCRYPTION_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; } @@ -625,14 +625,7 @@ return (1); #endif /* __APPLE__ */ } - else if (ppd_name && !strcmp(ppd_name, "everywhere") && device_uri) - { - if ((file = get_printer_ppd(device_uri, evefile, sizeof(evefile), &num_options, &options)) == NULL) - return (1); - - num_options = cupsRemoveOption("ppd-name", num_options, &options); - } - else if (ppd_name || file) + else if ((ppd_name && strcmp(ppd_name, "everywhere") && strncmp(ppd_name, "driverless:", 11)) || file) { _cupsLangPuts(stderr, _("lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS.")); } @@ -1157,105 +1150,6 @@ /* - * '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 */ - int *num_options, /* IO - Number of options */ - cups_option_t **options) /* IO - Options */ -{ - http_t *http; /* Connection to printer */ - ipp_t *request, /* Get-Printer-Attributes request */ - *response; /* Get-Printer-Attributes response */ - ipp_attribute_t *attr; /* Attribute from 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 */ - static const char * const pattrs[] = /* Attributes to use */ - { - "all", - "media-col-database" - }; - - - /* - * 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); - ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), NULL, pattrs); - response = cupsDoRequest(http, request, resource); - - if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE) - { - _cupsLangPrintf(stderr, _("%s: Unable to query printer: %s"), "lpadmin", cupsLastErrorString()); - buffer[0] = '\0'; - } - else if (_ppdCreateFromIPP(buffer, bufsize, response)) - { - if (!cupsGetOption("printer-geo-location", *num_options, *options) && (attr = ippFindAttribute(response, "printer-geo-location", IPP_TAG_URI)) != NULL) - *num_options = cupsAddOption("printer-geo-location", ippGetString(attr, 0, NULL), *num_options, options); - - if (!cupsGetOption("printer-info", *num_options, *options) && (attr = ippFindAttribute(response, "printer-info", IPP_TAG_TEXT)) != NULL) - *num_options = cupsAddOption("printer-info", ippGetString(attr, 0, NULL), *num_options, options); - - if (!cupsGetOption("printer-location", *num_options, *options) && (attr = ippFindAttribute(response, "printer-location", IPP_TAG_TEXT)) != NULL) - *num_options = cupsAddOption("printer-location", ippGetString(attr, 0, NULL), *num_options, options); - } - else - _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. */ @@ -1373,7 +1267,7 @@ if (file) ppdfile = file; - else if ((ppdname = cupsGetOption("ppd-name", num_options, options)) != NULL && strcmp(ppdname, "raw") && num_options > 1) + else if ((ppdname = cupsGetOption("ppd-name", num_options, options)) != NULL && strcmp(ppdname, "everywhere") && strcmp(ppdname, "raw") && num_options > 1) { if ((ppdfile = cupsGetServerPPD(http, ppdname)) != NULL) { @@ -1431,7 +1325,7 @@ /* Status code */ _cupsLangPrintf(stderr, _("lpadmin: Unable to open PPD \"%s\": %s on line %d."), ppdfile, ppdErrorString(status), linenum); - return (1); + goto error; } ppdMarkDefaults(ppd); @@ -1440,25 +1334,15 @@ if ((out = cupsTempFile2(tempfile, sizeof(tempfile))) == NULL) { _cupsLangPrintError(NULL, _("lpadmin: Unable to create temporary file")); - ippDelete(request); - if (ppdfile != file) - unlink(ppdfile); - if (copied_options) - cupsFreeOptions(num_options, options); - return (1); + goto error; } if ((in = cupsFileOpen(ppdfile, "r")) == NULL) { _cupsLangPrintf(stderr, _("lpadmin: Unable to open PPD \"%s\": %s"), ppdfile, strerror(errno)); - ippDelete(request); - if (ppdfile != file) - unlink(ppdfile); - if (copied_options) - cupsFreeOptions(num_options, options); cupsFileClose(out); unlink(tempfile); - return (1); + goto error; } while (cupsFileGets(in, line, sizeof(line))) @@ -1602,6 +1486,22 @@ } else return (0); + + /* + * Error handling... + */ + + error: + + ippDelete(request); + + if (ppdfile != file) + unlink(ppdfile); + + if (copied_options) + cupsFreeOptions(num_options, options); + + return (1); } diff -Nru cups-2.3.3op2/systemv/lpinfo.c cups-2.4.1op1/systemv/lpinfo.c --- cups-2.3.3op2/systemv/lpinfo.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/lpinfo.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * "lpinfo" command for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * @@ -186,11 +187,11 @@ switch (*opt) { case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'h' : /* Connect to host */ diff -Nru cups-2.3.3op2/systemv/lpmove.c cups-2.4.1op1/systemv/lpmove.c --- cups-2.3.3op2/systemv/lpmove.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/lpmove.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * "lpmove" command for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * @@ -62,12 +63,12 @@ switch (*opt) { case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'h' : /* Connect to host */ diff -Nru cups-2.3.3op2/systemv/lpstat.c cups-2.4.1op1/systemv/lpstat.c --- cups-2.3.3op2/systemv/lpstat.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/systemv/lpstat.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * "lpstat" command for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * @@ -84,13 +85,13 @@ break; case 'E' : /* Encrypt */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'H' : /* Show server and port */ @@ -634,7 +635,7 @@ if (!name) return (0); - while (*list) + do { /* * Skip leading whitespace and commas... @@ -660,6 +661,7 @@ while (*list && !isspace(*list & 255) && *list != ',') list ++; } + while (*list); return (0); } @@ -810,8 +812,8 @@ _cupsLangPrintf(stdout, _("%s not accepting requests since %s -"), printer, printer_state_time); _cupsLangPrintf(stdout, _("\t%s"), - (message == NULL || !*message) ? - "reason unknown" : message); + (message && *message) ? + message : "reason unknown"); } for (i = 0; i < num_dests; i ++) @@ -826,8 +828,8 @@ _("%s/%s not accepting requests since %s -"), printer, dests[i].instance, printer_state_time); _cupsLangPrintf(stdout, _("\t%s"), - (message == NULL || !*message) ? - "reason unknown" : message); + (message && *message) ? + message : "reason unknown"); } } } @@ -950,7 +952,7 @@ printer_uri = NULL; members = NULL; - while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + do { if (!strcmp(attr->name, "printer-name") && attr->value_tag == IPP_TAG_NAME) @@ -966,6 +968,7 @@ attr = attr->next; } + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER); /* * If this is a remote class, grab the class info from the @@ -1789,10 +1792,10 @@ if ((message && *message) || pstate == IPP_PRINTER_STOPPED) { - if (!message || !*message) - _cupsLangPuts(stdout, _("\treason unknown")); + if (message && *message) + _cupsLangPrintf(stdout, "\t%s", message); else - _cupsLangPrintf(stdout, "\t%s", message); + _cupsLangPuts(stdout, _("\treason unknown")); } if (long_status > 1) @@ -1909,10 +1912,10 @@ if ((message && *message) || pstate == IPP_PRINTER_STOPPED) { - if (!message || !*message) - _cupsLangPuts(stdout, _("\treason unknown")); - else + if (message && *message) _cupsLangPrintf(stdout, "\t%s", message); + else + _cupsLangPuts(stdout, _("\treason unknown")); } if (long_status > 1) diff -Nru cups-2.3.3op2/templates/Makefile cups-2.4.1op1/templates/Makefile --- cups-2.3.3op2/templates/Makefile 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/Makefile 2022-01-27 11:11:42.000000000 +0000 @@ -73,8 +73,6 @@ printers.tmpl \ printers-header.tmpl \ restart.tmpl \ - samba-export.tmpl \ - samba-exported.tmpl \ search.tmpl \ set-printer-options-header.tmpl \ set-printer-options-trailer.tmpl \ diff -Nru cups-2.3.3op2/templates/choose-model.tmpl cups-2.4.1op1/templates/choose-model.tmpl --- cups-2.3.3op2/templates/choose-model.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/choose-model.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,7 +39,7 @@
                      - + diff -Nru cups-2.3.3op2/templates/es/choose-model.tmpl cups-2.4.1op1/templates/es/choose-model.tmpl --- cups-2.3.3op2/templates/es/choose-model.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/es/choose-model.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,7 +39,7 @@ diff -Nru cups-2.3.3op2/templates/es/class.tmpl cups-2.4.1op1/templates/es/class.tmpl --- cups-2.3.3op2/templates/es/class.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/es/class.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ {printer_state=5?:} {printer_is_accepting_jobs=0?:} - + diff -Nru cups-2.3.3op2/templates/es/header.tmpl.in cups-2.4.1op1/templates/es/header.tmpl.in --- cups-2.3.3op2/templates/es/header.tmpl.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/es/header.tmpl.in 2022-01-27 11:11:42.000000000 +0000 @@ -24,12 +24,12 @@ } } --> - {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + {title} - CUPS @CUPS_VERSION@
                        -
                      • CUPS.org
                      • +
                      • OpenPrinting CUPS
                      • Inicio
                      • Administración
                      • Clases
                      • diff -Nru cups-2.3.3op2/templates/es/help-header.tmpl cups-2.4.1op1/templates/es/help-header.tmpl --- cups-2.3.3op2/templates/es/help-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/es/help-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -38,4 +38,4 @@

                        Si es nuevo en CUPS, lea la página "Información general de CUPS".

                        -

                        La página de inicio de CUPS también proporciona muchos recursos, incluyendo foros de discusión de usuarios, respuestas a preguntas frecuentes, y un formulario para el envío de informes de errores y peticiones de mejoras.

                        } +

                        La página de inicio de CUPS también proporciona muchos recursos, incluyendo foros de discusión de usuarios, respuestas a preguntas frecuentes, y un formulario para el envío de informes de errores y peticiones de mejoras.

                        } diff -Nru cups-2.3.3op2/templates/es/jobs-header.tmpl cups-2.4.1op1/templates/es/jobs-header.tmpl --- cups-2.3.3op2/templates/es/jobs-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/es/jobs-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -2,4 +2,4 @@ {?which_jobs=completed?:
                        } {?which_jobs=all?:
                        } -

                        {?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

                        +

                        {?which_jobs=?Active jobs listed in processing order▼; held jobs appear first.:{which_jobs=all?Jobs in sequential order▼:Completed jobs in order of completion or cancellation▲}}

                        diff -Nru cups-2.3.3op2/templates/fr/choose-model.tmpl cups-2.4.1op1/templates/fr/choose-model.tmpl --- cups-2.3.3op2/templates/fr/choose-model.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/fr/choose-model.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,7 +39,7 @@
                      diff -Nru cups-2.3.3op2/templates/fr/class.tmpl cups-2.4.1op1/templates/fr/class.tmpl --- cups-2.3.3op2/templates/fr/class.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/fr/class.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ {printer_state=5?:} {printer_is_accepting_jobs=0?:} - + diff -Nru cups-2.3.3op2/templates/fr/header.tmpl.in cups-2.4.1op1/templates/fr/header.tmpl.in --- cups-2.3.3op2/templates/fr/header.tmpl.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/fr/header.tmpl.in 2022-01-27 11:11:42.000000000 +0000 @@ -24,12 +24,12 @@ } } --> - {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + {title} - CUPS @CUPS_VERSION@
                        -
                      • CUPS.org
                      • +
                      • OpenPrinting CUPS
                      • Home
                      • Administration
                      • Classes
                      • diff -Nru cups-2.3.3op2/templates/fr/help-header.tmpl cups-2.4.1op1/templates/fr/help-header.tmpl --- cups-2.3.3op2/templates/fr/help-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/fr/help-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -38,4 +38,4 @@

                        Si vous êtes un nouvel utilisateur de CUPS, lisez la page "Aperçu de CUPS".

                        -

                        La page d'accueil CUPS procure aussi beaucoup de ressources dont des forums, des FAQ, et un formulaire pour les rapports de bugs et les demandes de fonctionnalités.

                        } +

                        La page d'accueil CUPS procure aussi beaucoup de ressources dont des forums, des FAQ, et un formulaire pour les rapports de bugs et les demandes de fonctionnalités.

                        } diff -Nru cups-2.3.3op2/templates/fr/jobs-header.tmpl cups-2.4.1op1/templates/fr/jobs-header.tmpl --- cups-2.3.3op2/templates/fr/jobs-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/fr/jobs-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -2,4 +2,4 @@ {?which_jobs=completed?:
                        } {?which_jobs=all?:
                        } -

                        {?which_jobs=?Affichage des tâches en ordre d'impression; les tâches maintenues apparaissent en premier.:{which_jobs=Affichage des tâches dans l'ordre croissant.?:Affichage des tâches dans l'ordre décroissant.}}

                        +

                        {?which_jobs=?Affichage des tâches en ordre d'impression; les tâches maintenues apparaissent en premier.:{which_jobs=all?Affichage des tâches dans l'ordre croissant.:Affichage des tâches dans l'ordre décroissant.}}

                        diff -Nru cups-2.3.3op2/templates/header.tmpl.in cups-2.4.1op1/templates/header.tmpl.in --- cups-2.3.3op2/templates/header.tmpl.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/header.tmpl.in 2022-01-27 11:11:42.000000000 +0000 @@ -24,12 +24,12 @@ } } --> - {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + {title} - CUPS @CUPS_VERSION@
                          -
                        • CUPS.org
                        • +
                        • OpenPrinting CUPS
                        • Home
                        • Administration
                        • Classes
                        • diff -Nru cups-2.3.3op2/templates/help-header.tmpl cups-2.4.1op1/templates/help-header.tmpl --- cups-2.3.3op2/templates/help-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/help-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -38,4 +38,4 @@

                          If you are new to CUPS, read the "Overview of CUPS" page.

                          -

                          The CUPS home page also provides many resources including user discussion forums, answers to frequently-asked questions, and a form for submitting bug reports and feature requests.

                          } +

                          The CUPS home page also provides many resources including user discussion forums, answers to frequently-asked questions, and a form for submitting bug reports and feature requests.

                          } diff -Nru cups-2.3.3op2/templates/ja/choose-model.tmpl cups-2.4.1op1/templates/ja/choose-model.tmpl --- cups-2.3.3op2/templates/ja/choose-model.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ja/choose-model.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,7 +39,7 @@
                      diff -Nru cups-2.3.3op2/templates/ja/class.tmpl cups-2.4.1op1/templates/ja/class.tmpl --- cups-2.3.3op2/templates/ja/class.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ja/class.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ {printer_state=5?:} {printer_is_accepting_jobs=0?:} - + diff -Nru cups-2.3.3op2/templates/ja/header.tmpl.in cups-2.4.1op1/templates/ja/header.tmpl.in --- cups-2.3.3op2/templates/ja/header.tmpl.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ja/header.tmpl.in 2022-01-27 11:11:42.000000000 +0000 @@ -16,12 +16,12 @@ } } --> - {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + {title} - CUPS @CUPS_VERSION@
                        -
                      • CUPS.org
                      • +
                      • OpenPrinting CUPS
                      • ホーム
                      • 管理
                      • クラス
                      • diff -Nru cups-2.3.3op2/templates/ja/help-header.tmpl cups-2.4.1op1/templates/ja/help-header.tmpl --- cups-2.3.3op2/templates/ja/help-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ja/help-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -41,7 +41,7 @@

                        あなたが CUPS について初心者なら、 "CUPS の概要" ページを読んでください。

                        -

                        CUPS ホームページ でも、 +

                        CUPS ホームページ でも、 ユーザーディスカッションフォーラム、FAQ、 バグ報告や機能リクエストを申請するフォームといった、 多くのリソースを提供しています。

                        } diff -Nru cups-2.3.3op2/templates/ja/jobs-header.tmpl cups-2.4.1op1/templates/ja/jobs-header.tmpl --- cups-2.3.3op2/templates/ja/jobs-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ja/jobs-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -2,4 +2,4 @@ {?which_jobs=completed?:
                        } {?which_jobs=all?:
                        } -

                        {?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

                        +

                        {?which_jobs=?Active jobs listed in processing order▼; held jobs appear first.:{which_jobs=all?Jobs in sequential order▼:Completed jobs in order of completion or cancellation▲}}

                        diff -Nru cups-2.3.3op2/templates/jobs-header.tmpl cups-2.4.1op1/templates/jobs-header.tmpl --- cups-2.3.3op2/templates/jobs-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/jobs-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -2,4 +2,4 @@ {?which_jobs=completed?:
                        } {?which_jobs=all?:
                        } -

                        {?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

                        +

                        {?which_jobs=?Active jobs listed in processing order▼; held jobs appear first.:{which_jobs=all?Jobs in sequential order▼:Completed jobs in order of completion or cancellation▲}}

                        diff -Nru cups-2.3.3op2/templates/printer-added.tmpl cups-2.4.1op1/templates/printer-added.tmpl --- cups-2.3.3op2/templates/printer-added.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/printer-added.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -1,4 +1,15 @@ -

                        Add Printer

                        +

                        Add Printer {printer_name}

                        Printer {printer_name} has been added successfully. + +

                        +Note:Printer drivers and raw queues are deprecated and will stop working in a future version of CUPS. +
                        + +
                        + + + + + diff -Nru cups-2.3.3op2/templates/pt_BR/choose-model.tmpl cups-2.4.1op1/templates/pt_BR/choose-model.tmpl --- cups-2.3.3op2/templates/pt_BR/choose-model.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/pt_BR/choose-model.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,7 +39,7 @@
                      diff -Nru cups-2.3.3op2/templates/pt_BR/class.tmpl cups-2.4.1op1/templates/pt_BR/class.tmpl --- cups-2.3.3op2/templates/pt_BR/class.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/pt_BR/class.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ {printer_state=5?:} {printer_is_accepting_jobs=0?:} - + diff -Nru cups-2.3.3op2/templates/pt_BR/header.tmpl.in cups-2.4.1op1/templates/pt_BR/header.tmpl.in --- cups-2.3.3op2/templates/pt_BR/header.tmpl.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/pt_BR/header.tmpl.in 2022-01-27 11:11:42.000000000 +0000 @@ -24,12 +24,12 @@ } } --> - {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + {title} - CUPS @CUPS_VERSION@
                        -
                      • CUPS.org
                      • +
                      • OpenPrinting CUPS
                      • Início
                      • Administração
                      • Classes
                      • diff -Nru cups-2.3.3op2/templates/pt_BR/help-header.tmpl cups-2.4.1op1/templates/pt_BR/help-header.tmpl --- cups-2.3.3op2/templates/pt_BR/help-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/pt_BR/help-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,4 +39,4 @@

                        Se você é novo no CUPS, leia a página "Visão geral do CUPS".

                        -

                        A página inicial do CUPS também fornece muitos recursos incluindo fórums de discussão de usuários, respostas a perguntas frequentes e um formulário para enviar registros de erros e pedidos de melhorias.

                        } +

                        A página inicial do CUPS também fornece muitos recursos incluindo fórums de discussão de usuários, respostas a perguntas frequentes e um formulário para enviar registros de erros e pedidos de melhorias.

                        } diff -Nru cups-2.3.3op2/templates/pt_BR/jobs-header.tmpl cups-2.4.1op1/templates/pt_BR/jobs-header.tmpl --- cups-2.3.3op2/templates/pt_BR/jobs-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/pt_BR/jobs-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -2,4 +2,4 @@ {?which_jobs=completed?:
                        } {?which_jobs=all?:
                        } -

                        {?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

                        +

                        {?which_jobs=?Active jobs listed in processing order▼; held jobs appear first.:{which_jobs=all?Jobs in sequential order▼:Completed jobs in order of completion or cancellation▲}}

                        diff -Nru cups-2.3.3op2/templates/ru/choose-model.tmpl cups-2.4.1op1/templates/ru/choose-model.tmpl --- cups-2.3.3op2/templates/ru/choose-model.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ru/choose-model.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -39,7 +39,7 @@
                      diff -Nru cups-2.3.3op2/templates/ru/class.tmpl cups-2.4.1op1/templates/ru/class.tmpl --- cups-2.3.3op2/templates/ru/class.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ru/class.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -11,7 +11,7 @@ {printer_state=5?:} {printer_is_accepting_jobs=0?:} - + diff -Nru cups-2.3.3op2/templates/ru/header.tmpl.in cups-2.4.1op1/templates/ru/header.tmpl.in --- cups-2.3.3op2/templates/ru/header.tmpl.in 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ru/header.tmpl.in 2022-01-27 11:11:42.000000000 +0000 @@ -24,12 +24,12 @@ } } --> - {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + {title} - CUPS @CUPS_VERSION@
                        -
                      • CUPS.org
                      • +
                      • OpenPrinting CUPS
                      • Начало
                      • Администрирование
                      • Группы
                      • diff -Nru cups-2.3.3op2/templates/ru/help-header.tmpl cups-2.4.1op1/templates/ru/help-header.tmpl --- cups-2.3.3op2/templates/ru/help-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ru/help-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -40,4 +40,4 @@ href="/help/overview.html">Введение в CUPS". Опытные пользователи могут обратиться к разделу "Что нового в CUPS 1.6".

                        -

                        Веб-сайт CUPS так же содержит большое количество ресурсов для пользователей, включая форум, ответы на часто задаваемые вопросы и форму для регистрации ошибок и пожеланий.

                        } +

                        Веб-сайт CUPS так же содержит большое количество ресурсов для пользователей, включая форум, ответы на часто задаваемые вопросы и форму для регистрации ошибок и пожеланий.

                        } diff -Nru cups-2.3.3op2/templates/ru/jobs-header.tmpl cups-2.4.1op1/templates/ru/jobs-header.tmpl --- cups-2.3.3op2/templates/ru/jobs-header.tmpl 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/templates/ru/jobs-header.tmpl 2022-01-27 11:11:42.000000000 +0000 @@ -2,4 +2,4 @@ {?which_jobs=completed?:
                        } {?which_jobs=all?:
                        } -

                        {?which_jobs=?Jobs listed in print order; held jobs appear first.:{which_jobs=Jobs listed in ascending order.?:Jobs listed in descending order.}}

                        +

                        {?which_jobs=?Active jobs listed in processing order▼; held jobs appear first.:{which_jobs=all?Jobs in sequential order▼:Completed jobs in order of completion or cancellation▲}}

                        diff -Nru cups-2.3.3op2/test/5.1-lpadmin.sh cups-2.4.1op1/test/5.1-lpadmin.sh --- cups-2.3.3op2/test/5.1-lpadmin.sh 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/test/5.1-lpadmin.sh 2022-01-27 11:11:42.000000000 +0000 @@ -61,3 +61,67 @@ echo " PASSED" fi echo "" + +echo "Add a printer for cupSNMP/IPPSupplies test" +echo "" +echo " lpadmin -p Test4 -E -v file:/dev/null -m drv:///sample.drv/zebra.ppd" +$runcups $VALGRIND ../systemv/lpadmin -p Test4 -E -v file:/dev/null -m drv:///sample.drv/zebra.ppd 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "Turn on cupsSNMP/IPPSupplies option" +echo "" +echo " lpadmin -p Test4 -o cupsSNMPSupplies=true -o cupsIPPSupplies=true" +$runcups $VALGRIND ../systemv/lpadmin -p Test4 -o cupsSNMPSupplies=true -o cupsIPPSupplies=true 2>&1 +grep '*cupsSNMPSupplies: True' $BASE/ppd/Test4.ppd +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +grep '*cupsIPPSupplies: True' $BASE/ppd/Test4.ppd +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "Turn on cupsSNMP/IPPSupplies option" +echo "" +echo " lpadmin -p Test4 -o cupsSNMPSupplies=false -o cupsIPPSupplies=false" +$runcups $VALGRIND ../systemv/lpadmin -p Test4 -o cupsSNMPSupplies=false -o cupsIPPSupplies=false 2>&1 +grep '*cupsSNMPSupplies: False' $BASE/ppd/Test4.ppd +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +grep '*cupsIPPSupplies: False' $BASE/ppd/Test4.ppd +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "Delete the printer with cupsSNMP/IPPSupplies" +echo "" +echo " lpadmin -x Test4" +$runcups $VALGRIND ../systemv/lpadmin -x Test4 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" diff -Nru cups-2.3.3op2/test/5.5-lp.sh cups-2.4.1op1/test/5.5-lp.sh --- cups-2.3.3op2/test/5.5-lp.sh 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/test/5.5-lp.sh 2022-01-27 11:11:42.000000000 +0000 @@ -45,6 +45,30 @@ fi echo "" +echo "LP Page ranges Test - undefined low page limit" +echo "" +echo " lp -d Test1 -P -5 testfile.pdf" +$runcups $VALGRIND ../systemv/lp -d Test1 -P -5 ../examples/testfile.pdf 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LP Page ranges Test - undefined upper page limit" +echo "" +echo " lp -d Test1 -P 5- -o job-sheets=classified,classified testfile.pdf" +$runcups $VALGRIND ../systemv/lp -d Test1 -P 5- ../examples/testfile.pdf 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + echo "LP Flood Test ($1 times in parallel)" echo "" echo " lp -d Test1 testfile.jpg" diff -Nru cups-2.3.3op2/test/run-stp-tests.sh cups-2.4.1op1/test/run-stp-tests.sh --- cups-2.3.3op2/test/run-stp-tests.sh 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/test/run-stp-tests.sh 2022-01-27 11:11:42.000000000 +0000 @@ -3,8 +3,8 @@ # Perform the complete set of IPP compliance tests specified in the # CUPS Software Test Plan. # -# Copyright © 2020 by Michael R Sweet -# Copyright © 2007-2019 by Apple Inc. +# Copyright © 2020-2022 by OpenPrinting +# Copyright © 2007-2021 by Apple Inc. # Copyright © 1997-2007 by Easy Software Products, all rights reserved. # # Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -357,6 +357,7 @@ EOF ln -s $root/data $BASE/share ln -s $root/ppdc/sample.drv $BASE/share/drv +ln -s $root/conf/cgi.types $BASE/share/mime 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 @@ -518,7 +519,6 @@ ServerBin $BASE/bin CacheDir $BASE/share DataDir $BASE/share -FontPath $BASE/share/fonts DocumentRoot $root/doc RequestRoot $BASE/spool TempDir $BASE/spool/temp @@ -700,7 +700,8 @@ sleep 2 fi -while true; do +tries=0 +while test $tries -lt 30; do running=`$runcups ../systemv/lpstat -r 2>/dev/null` if test "x$running" = "xscheduler is running"; then break @@ -708,6 +709,8 @@ echo "Waiting for scheduler to become ready..." sleep 10 + + tries=`expr $tries + 1` done # @@ -887,6 +890,75 @@ # +# Perform job history test with cupsd restart... +# + +echo $ac_n "Starting history test with cupsd restart: $ac_c" +echo "" >>$strfile +echo "`date '+[%d/%b/%Y:%H:%M:%S %z]'` \"5.11-history-cupsd-restart\":" >>$strfile + +echo " lp -d Test1 testfile.jpg" >>$strfile + +$runcups ../systemv/lp -d Test1 ../examples/testfile.jpg 2>&1 >>$strfile +if test $? != 0; then + echo "FAIL (unable to queue test job)" + echo " FAILED" >>$strfile + fail=`expr $fail + 1` +else + echo "PASS" + echo " PASSED" >>$strfile + + sleep 5 + ./waitjobs.sh >>$strfile + + echo $ac_n "Verifying that history still exists: $ac_c" + + echo " ls -l $BASE/spool" >>$strfile + count=`ls -1 $BASE/spool | wc -l` + if test $count = 1; then + echo "FAIL (job control files not present)" + ls -l $BASE/spool + echo " FAILED (job control files not present)" >>$strfile + ls -l $BASE/spool >>$strfile + fail=`expr $fail + 1` + else + echo "PASS" + echo " PASSED" >>$strfile + + echo "Restarting cupsd:" + echo "" >>$strfile + kill $cupsd + wait $cupsd + + echo " $runcups $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >>$BASE/log/debug_log 2>&1 &" + echo "" + + $runcups $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >>$BASE/log/debug_log 2>&1 & + + cupsd=$! + + echo $ac_n "Waiting for job history to expire: $ac_c" + echo "" >>$strfile + echo " sleep 35" >>$strfile + sleep 35 + + echo " ls -l $BASE/spool" >>$strfile + count=`ls -1 $BASE/spool | wc -l` + if test $count != 1; then + echo "FAIL (job control files still present)" + ls -l $BASE/spool + echo " FAILED (job control files still present)" >>$strfile + ls -l $BASE/spool >>$strfile + fail=`expr $fail + 1` + else + echo "PASS" + echo " PASSED" >>$strfile + fi + fi +fi + + +# # Stop the server... # @@ -927,7 +999,10 @@ # Pages printed on Test1 (within 1 page for timing-dependent cancel issues) count=`$GREP '^Test1 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'` -expected=`expr $pjobs \* 2 + 34` +# expected numbers of pages from page ranges tests: +# - 5 pages for the job with a lower limit undefined (-5) +# - 4 pages for the job with a upper limit undefined (5-) +expected=`expr $pjobs \* 2 + 34 + 5 + 4` expected2=`expr $expected + 2` if test $count -lt $expected -a $count -gt $expected2; then echo "FAIL: Printer 'Test1' produced $count page(s), expected $expected." @@ -962,9 +1037,19 @@ echo "

                        PASS: Printer 'Test3' correctly produced $count page(s).

                        " >>$strfile fi +# Number of requests from 5.1-lpadmin.sh: cupsSNMP/IPPSupplies tests - total 5 in 'expected': +# - 2 requests for creating a queue - CUPS-Get-PPD and CUPS-Add-Modify-Printer +# - 1 request for setting cupsSNMP/IPPSupplies to True - CUPS-Add-Modify-Printer +# - 1 request for setting cupsSNMP/IPPSupplies to False - CUPS-Add-Modify-Printer +# - 1 request for deleting the queue - CUPS-Delete-Printer + +# Number of requests related to undefined page range limits - total 4 in 'expected' +# 2 requests (Create-Job, Send-Document) * number of jobs (2 - one for undefined +# low limit, one for undefined upper limit) + # Requests logged count=`wc -l $BASE/log/access_log | awk '{print $1}'` -expected=`expr 35 + 18 + 30 + $pjobs \* 8 + $pprinters \* $pjobs \* 4 + 2` +expected=`expr 35 + 18 + 30 + $pjobs \* 8 + $pprinters \* $pjobs \* 4 + 2 + 2 + 5 + 4` if test $count != $expected; then echo "FAIL: $count requests logged, expected $expected." echo "

                        FAIL: $count requests logged, expected $expected.

                        " >>$strfile @@ -1049,10 +1134,10 @@ # Warning log messages count=`$GREP '^W ' $BASE/log/error_log | $GREP -v CreateProfile | $GREP -v 'libusb error' | $GREP -v ColorManager | $GREP -v 'Avahi client failed' | wc -l | awk '{print $1}'` -if test $count != 8; then - echo "FAIL: $count warning messages, expected 8." +if test $count != 14; then + echo "FAIL: $count warning messages, expected 14." $GREP '^W ' $BASE/log/error_log - echo "

                        FAIL: $count warning messages, expected 8.

                        " >>$strfile + echo "

                        FAIL: $count warning messages, expected 14.

                        " >>$strfile echo "
                        " >>$strfile
                         	$GREP '^W ' $BASE/log/error_log | sed -e '1,$s/&/&/g' -e '1,$s/>$strfile
                         	echo "    
                        " >>$strfile diff -Nru cups-2.3.3op2/tools/ippeveprinter.c cups-2.4.1op1/tools/ippeveprinter.c --- cups-2.3.3op2/tools/ippeveprinter.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/tools/ippeveprinter.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,9 @@ /* * IPP Everywhere printer application for CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2020 by the IEEE-ISTO Printer Working Group. - * Copyright © 2010-2019 by Apple Inc. + * Copyright © 2010-2021 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. @@ -45,7 +46,11 @@ # include #endif /* _WIN32 */ -#ifdef HAVE_DNSSD +#ifndef O_BINARY +# define O_BINARY 0 /* Windows "binary file" nonsense */ +#endif /* !O_BINARY */ + +#ifdef HAVE_MDNSRESPONDER # include #elif defined(HAVE_AVAHI) # include @@ -54,7 +59,7 @@ # include # include # include -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_SYS_MOUNT_H # include @@ -139,18 +144,18 @@ * URL scheme for web resources... */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS # define WEB_SCHEME "https" #else # define WEB_SCHEME "http" -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Structures... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER typedef DNSServiceRef ippeve_srv_t; /* Service reference */ typedef TXTRecordRef ippeve_txt_t; /* TXT record */ @@ -161,7 +166,7 @@ #else typedef void *ippeve_srv_t; /* Service reference */ typedef void *ippeve_txt_t; /* TXT record */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #if HAVE_LIBPAM typedef struct ippeve_authdata_s /* Authentication data */ @@ -184,14 +189,14 @@ /* TODO: One IPv4 and one IPv6 listener are really not sufficient */ int ipv4, /* IPv4 listener */ ipv6; /* IPv6 listener */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER ippeve_srv_t ipp_ref, /* DNS-SD IPP service */ ipps_ref, /* DNS-SD IPPS service */ http_ref, /* DNS-SD HTTP service */ printer_ref; /* DNS-SD LPD service */ #elif defined(HAVE_AVAHI) ippeve_srv_t dnssd_ref; /* DNS-SD services */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ char *dnssd_subtypes;/* DNS-SD subtypes */ int dnssd_collision;/* Name collision? */ char *dnssd_name, /* printer-dns-sd-name */ @@ -284,12 +289,12 @@ static void delete_client(ippeve_client_t *client); static void delete_job(ippeve_job_t *job); static void delete_printer(ippeve_printer_t *printer); -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER static void DNSSD_API dnssd_callback(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, ippeve_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 */ +#endif /* HAVE_MDNSRESPONDER */ static void dnssd_init(void); static int filter_cb(ippeve_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr); static ippeve_job_t *find_job(ippeve_client_t *client); @@ -347,12 +352,12 @@ * Globals... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER static DNSServiceRef DNSSDMaster = NULL; #elif defined(HAVE_AVAHI) static AvahiThreadedPoll *DNSSDMaster = NULL; static AvahiClient *DNSSDClient = NULL; -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ static int KeepFiles = 0, /* Keep spooled job files? */ MaxVersion = 20,/* Maximum IPP version (20 = 2.0, 11 = 1.1, etc.) */ @@ -376,9 +381,9 @@ *device_uri = NULL, /* Device URI */ *output_format = NULL, /* Output format */ *icon = NULL, /* Icon file */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS *keypath = NULL, /* Keychain path */ -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ *location = "", /* Location of printer */ *make = "Example", /* Manufacturer */ *model = "Printer", /* Model */ @@ -465,7 +470,7 @@ output_format = argv[i]; break; -#ifdef HAVE_SSL +#ifdef HAVE_TLS case 'K' : /* -K keypath */ i ++; if (i >= argc) @@ -473,7 +478,7 @@ keypath = argv[i]; break; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ case 'M' : /* -M manufacturer */ i ++; @@ -648,27 +653,6 @@ * Apply defaults as needed... */ - if (!serverport) - { -#ifdef _WIN32 - /* - * Windows is almost always used as a single user system, so use a default - * port number of 8631. - */ - - serverport = 8631; - -#else - /* - * Use 8000 + UID mod 1000 for the default port number... - */ - - serverport = 8000 + ((int)getuid() % 1000); -#endif /* _WIN32 */ - - _cupsLangPrintf(stderr, _("Listening on port %d."), serverport); - } - if (!directory[0]) { const char *tmpdir; /* Temporary directory */ @@ -736,9 +720,9 @@ printer->ppdfile = strdup(ppdfile); #endif /* !CUPS_LITE */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS cupsSetServerCredentials(keypath, printer->hostname, 1); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Run the print service... @@ -1157,6 +1141,7 @@ if ((job = calloc(1, sizeof(ippeve_job_t))) == NULL) { perror("Unable to allocate memory for job"); + _cupsRWUnlock(&(client->printer->rwlock)); return (NULL); } @@ -1309,7 +1294,7 @@ snprintf(fname, fnamesize, "%s/%d-%s.%s", directory, job->id, name, ext); - return (open(fname, O_WRONLY | O_CREAT | O_TRUNC, 0666)); + return (open(fname, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666)); } @@ -1589,11 +1574,11 @@ "file", "ftp", "http" -#ifdef HAVE_SSL +#ifdef HAVE_TLS , "https" -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ }; -#ifdef HAVE_SSL +#ifdef HAVE_TLS static const char * const uri_authentication_supported[] = { /* uri-authentication-supported values */ "none", @@ -1609,7 +1594,7 @@ "none", "tls" }; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ static const char * const which_jobs[] = { /* which-jobs-supported values */ "completed", @@ -1735,10 +1720,50 @@ * Create the listener sockets... */ - if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0) + if (printer->port) { - perror("Unable to create IPv4 listener"); - goto bad_printer; + if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0) + { + perror("Unable to create IPv4 listener"); + goto bad_printer; + } + } + else + { +#ifdef _WIN32 + /* + * Windows is almost always used as a single user system, so use a default + * port number of 8631. + */ + + serverport = 8631; + +#else + /* + * Use 8000 + UID mod 1000 for the default port number... + */ + + serverport = 8000 + ((int)getuid() % 1000); +#endif /* _WIN32 */ + + while (serverport < 10000) + { + if ((printer->ipv4 = create_listener(servername, serverport, AF_INET)) >= 0) + break; + + serverport ++; + } + + if (serverport < 10000) + { + _cupsLangPrintf(stderr, _("Listening on port %d."), serverport); + printer->port = serverport; + } + else + { + perror("Unable to create IPv4 listener"); + goto bad_printer; + } } if ((printer->ipv6 = create_listener(servername, printer->port, AF_INET6)) < 0) @@ -1757,11 +1782,11 @@ if (Verbosity) { -#ifdef HAVE_SSL +#ifdef HAVE_TLS fprintf(stderr, "printer-uri-supported=\"ipp://%s:%d/ipp/print\",\"ipps://%s:%d/ipp/print\"\n", printer->hostname, printer->port, printer->hostname, printer->port); #else fprintf(stderr, "printer-uri-supported=\"ipp://%s:%d/ipp/print\"\n", printer->hostname, printer->port); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ fprintf(stderr, "printer-uuid=\"%s\"\n", uuid); } @@ -1948,7 +1973,7 @@ 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 */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (PAMService) ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", 2, NULL, uri_authentication_basic); else @@ -1958,14 +1983,14 @@ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", NULL, "basic"); else ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", NULL, "none"); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* uri-security-supported */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS 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 */ +#endif /* HAVE_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); @@ -2120,7 +2145,7 @@ if (printer->ipv6 >= 0) close(printer->ipv6); -#if HAVE_DNSSD +#if HAVE_MDNSRESPONDER if (printer->printer_ref) DNSServiceRefDeallocate(printer->printer_ref); if (printer->ipp_ref) @@ -2136,7 +2161,7 @@ avahi_entry_group_free(printer->dnssd_ref); avahi_threaded_poll_unlock(DNSSDMaster); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ if (printer->dnssd_name) free(printer->dnssd_name); @@ -2166,7 +2191,7 @@ } -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER /* * 'dnssd_callback()' - Handle DNS-SD registration events. */ @@ -2254,7 +2279,7 @@ break; } } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ /* @@ -2264,7 +2289,7 @@ static void dnssd_init(void) { -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER if (DNSServiceCreateConnection(&DNSSDMaster) != kDNSServiceErr_NoError) { fputs("Error: Unable to initialize DNS-SD.\n", stderr); @@ -2287,7 +2312,7 @@ } avahi_threaded_poll_start(DNSSDMaster); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ } @@ -2557,9 +2582,9 @@ } if (strcmp(scheme, "file") && -#ifdef HAVE_SSL +#ifdef HAVE_TLS strcmp(scheme, "https") && -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ strcmp(scheme, "http")) { respond_ipp(client, IPP_STATUS_ERROR_URI_SCHEME, "URI scheme \"%s\" not supported.", scheme); @@ -2602,7 +2627,7 @@ if (!strcmp(scheme, "file")) { - if ((infile = open(resource, O_RDONLY)) < 0) + if ((infile = open(resource, O_RDONLY | O_BINARY)) < 0) { respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to access URI: %s", strerror(errno)); @@ -2637,11 +2662,11 @@ } else { -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (port == 443 || !strcmp(scheme, "https")) encryption = HTTP_ENCRYPTION_ALWAYS; else -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ encryption = HTTP_ENCRYPTION_IF_REQUESTED; if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL)) == NULL) @@ -3697,10 +3722,10 @@ httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), "ipp", NULL, client->host_field, client->host_port, "/ipp/print"); values[num_values ++] = uris[0]; -#ifdef HAVE_SSL +#ifdef HAVE_TLS httpAssembleURI(HTTP_URI_CODING_ALL, uris[1], sizeof(uris[1]), "ipps", NULL, client->host_field, client->host_port, "/ipp/print"); values[num_values ++] = uris[1]; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", num_values, NULL, values); } @@ -4301,7 +4326,7 @@ "oe_photo-l_3.5x5in", /* Photo L */ "na_index-4x6_4x6in", /* Photo 4x6 */ "iso_a6_105x148mm", /* A6 */ - "na_5x7_5x7in" /* Photo 5x7 aka 2L */ + "na_5x7_5x7in", /* Photo 5x7 aka 2L */ "iso_a5_148x210mm", /* A5 */ }; static const char * const media_ready[] = @@ -5787,13 +5812,13 @@ * Loop until we are out of requests or timeout (30 seconds)... */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS int first_time = 1; /* First time request? */ -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ while (httpWait(client->http, 30000)) { -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (first_time) { /* @@ -5817,7 +5842,7 @@ first_time = 0; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ if (!process_http(client)) break; @@ -5992,7 +6017,8 @@ client->host_port = client->printer->port; } - ptr = strrchr(client->host_field, '.'); + if ((ptr = strstr(client->host_field, ".local")) == NULL) + ptr = strrchr(client->host_field, '.'); if (!isdigit(client->host_field[0] & 255) && client->host_field[0] != '[' && strcmp(client->host_field, client->printer->hostname) && strcmp(client->host_field, "localhost") && (!ptr || (strcmp(ptr, ".local") && strcmp(ptr, ".local.")))) @@ -6008,7 +6034,7 @@ if (!strcasecmp(httpGetField(client->http, HTTP_FIELD_CONNECTION), "Upgrade")) { -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (strstr(httpGetField(client->http, HTTP_FIELD_UPGRADE), "TLS/") != NULL && !httpIsEncrypted(client->http)) { if (!respond_http(client, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL, NULL, 0)) @@ -6025,7 +6051,7 @@ fprintf(stderr, "%s Connection now encrypted.\n", client->hostname); } else -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ if (!respond_http(client, HTTP_STATUS_NOT_IMPLEMENTED, NULL, NULL, 0)) return (0); @@ -6068,7 +6094,7 @@ char buffer[4096]; /* Copy buffer */ ssize_t bytes; /* Bytes */ - if (!stat(client->printer->strings, &fileinfo) && (fd = open(client->printer->strings, O_RDONLY)) >= 0) + if (!stat(client->printer->strings, &fileinfo) && (fd = open(client->printer->strings, O_RDONLY | O_BINARY)) >= 0) { if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", (size_t)fileinfo.st_size)) { @@ -6102,7 +6128,7 @@ char buffer[4096]; /* Copy buffer */ ssize_t bytes; /* Bytes */ - if (!stat(client->printer->icons[1], &fileinfo) && (fd = open(client->printer->icons[1], O_RDONLY)) >= 0) + if (!stat(client->printer->icons[1], &fileinfo) && (fd = open(client->printer->icons[1], O_RDONLY | O_BINARY)) >= 0) { if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) { @@ -6144,7 +6170,7 @@ char buffer[4096]; /* Copy buffer */ ssize_t bytes; /* Bytes */ - if (!stat(client->printer->icons[2], &fileinfo) && (fd = open(client->printer->icons[2], O_RDONLY)) >= 0) + if (!stat(client->printer->icons[2], &fileinfo) && (fd = open(client->printer->icons[2], O_RDONLY | O_BINARY)) >= 0) { if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) { @@ -6186,7 +6212,7 @@ char buffer[4096]; /* Copy buffer */ ssize_t bytes; /* Bytes */ - if (!stat(client->printer->icons[0], &fileinfo) && (fd = open(client->printer->icons[0], O_RDONLY)) >= 0) + if (!stat(client->printer->icons[0], &fileinfo) && (fd = open(client->printer->icons[0], O_RDONLY | O_BINARY)) >= 0) { if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) { @@ -6780,7 +6806,7 @@ { if (errno == ENOENT) { - if ((mystdout = open(resource, O_WRONLY | O_CREAT | O_TRUNC, 0666)) >= 0) + if ((mystdout = open(resource, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666)) >= 0) fprintf(stderr, "[Job %d] Saving print command output to \"%s\".\n", job->id, resource); else fprintf(stderr, "[Job %d] Unable to create \"%s\": %s\n", job->id, resource, strerror(errno)); @@ -6797,12 +6823,12 @@ } else if (!S_ISREG(fileinfo.st_mode)) { - if ((mystdout = open(resource, O_WRONLY | O_CREAT | O_TRUNC, 0666)) >= 0) + if ((mystdout = open(resource, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666)) >= 0) fprintf(stderr, "[Job %d] Saving print command output to \"%s\".\n", job->id, resource); else fprintf(stderr, "[Job %d] Unable to create \"%s\": %s\n", job->id, resource, strerror(errno)); } - else if ((mystdout = open(resource, O_WRONLY)) >= 0) + else if ((mystdout = open(resource, O_WRONLY | O_BINARY)) >= 0) fprintf(stderr, "[Job %d] Saving print command output to \"%s\".\n", job->id, resource); else fprintf(stderr, "[Job %d] Unable to open \"%s\": %s\n", job->id, resource, strerror(errno)); @@ -6832,7 +6858,7 @@ } if (mystdout < 0) - mystdout = open("/dev/null", O_WRONLY); + mystdout = open("/dev/null", O_WRONLY | O_BINARY); if (pipe(mypipe)) { @@ -6999,8 +7025,6 @@ #endif /* !_WIN32 */ job->state = IPP_JSTATE_ABORTED; } - else if (status < 0) - job->state = IPP_JSTATE_ABORTED; else fprintf(stderr, "[Job %d] Command \"%s\" completed successfully.\n", job->id, job->printer->command); @@ -7133,7 +7157,7 @@ register_printer( ippeve_printer_t *printer) /* I - Printer */ { -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD ippeve_txt_t ipp_txt; /* DNS-SD IPP TXT record */ int i, /* Looping var */ count; /* Number of values */ @@ -7219,9 +7243,9 @@ printer->dnssd_collision = 0; } -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceErrorType error; /* Error from DNS-SD */ char regtype[256]; /* DNS-SD service type */ uint32_t ifindex; /* Interface index */ @@ -7243,9 +7267,9 @@ TXTRecordSetValue(&ipp_txt, "Duplex", 1, ippGetCount(sides_supported) > 1 ? "T" : "F"); if ((value = ippGetString(printer_uuid, 0, NULL)) != NULL) TXTRecordSetValue(&ipp_txt, "UUID", (uint8_t)strlen(value) - 9, value + 9); -# ifdef HAVE_SSL +# ifdef HAVE_TLS TXTRecordSetValue(&ipp_txt, "TLS", 3, "1.2"); -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ if (urf[0]) TXTRecordSetValue(&ipp_txt, "URF", (uint8_t)strlen(urf), urf); TXTRecordSetValue(&ipp_txt, "txtvers", 1, "1"); @@ -7290,7 +7314,7 @@ return (0); } -# ifdef HAVE_SSL +# ifdef HAVE_TLS /* * Then register the _ipps._tcp (IPP) service type with the real port number to * advertise our IPPS printer... @@ -7311,7 +7335,7 @@ _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error); return (0); } -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ /* * Similarly, register the _http._tcp,_printer (HTTP) service type with the @@ -7350,9 +7374,9 @@ ipp_txt = avahi_string_list_add_printf(ipp_txt, "Duplex=%s", ippGetCount(sides_supported) > 1 ? "T" : "F"); if ((value = ippGetString(printer_uuid, 0, NULL)) != NULL) ipp_txt = avahi_string_list_add_printf(ipp_txt, "UUID=%s", value + 9); -# ifdef HAVE_SSL +# ifdef HAVE_TLS ipp_txt = avahi_string_list_add_printf(ipp_txt, "TLS=1.2"); -# endif /* HAVE_SSL */ +# endif /* HAVE_TLS */ if (urf[0]) ipp_txt = avahi_string_list_add_printf(ipp_txt, "URF=%s", urf); ipp_txt = avahi_string_list_add_printf(ipp_txt, "txtvers=1"); @@ -7394,7 +7418,7 @@ free(temptypes); } -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* * _ipps._tcp (IPPS) for secure printing... */ @@ -7417,7 +7441,7 @@ free(temptypes); } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* * Finally _http.tcp (HTTP) for the web interface... @@ -7434,7 +7458,7 @@ avahi_threaded_poll_unlock(DNSSDMaster); avahi_string_list_free(ipp_txt); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ return (1); } @@ -7629,10 +7653,10 @@ num_fds = 2; -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER polldata[num_fds ].fd = DNSServiceRefSockFD(DNSSDMaster); polldata[num_fds ++].events = POLLIN; -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ /* * Loop until we are killed or have a hard error... @@ -7686,15 +7710,15 @@ * Process DNS-SD messages... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER if (polldata[2].revents & POLLIN) DNSServiceProcessResult(DNSSDMaster); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ -#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +#ifdef HAVE_DNSSD if (printer->dnssd_collision) register_printer(printer); -#endif /* HAVE_DNSSD || HAVE_AVAHI */ +#endif /* HAVE_DNSSD */ /* * Clean out old jobs... @@ -8023,6 +8047,8 @@ else html_printf(client, "
                      {PREV?{PREV>0?
                      :}
                      : }
                      {PREV?{PREV>0?
                      :}
                      : }
                      {NEXT?
                      : } {LAST?
                      :}
                      \n"); + cupsFreeOptions(num_options, options); + html_footer(client); return (1); @@ -8307,6 +8333,8 @@ else html_printf(client, "\n"); + cupsFreeOptions(num_options, options); + html_footer(client); return (1); @@ -8349,9 +8377,9 @@ _cupsLangPuts(stdout, _("-A Enable authentication")); _cupsLangPuts(stdout, _("-D device-uri Set the device URI for the printer")); _cupsLangPuts(stdout, _("-F output-type/subtype Set the output format for the printer")); -#ifdef HAVE_SSL +#ifdef HAVE_TLS _cupsLangPuts(stdout, _("-K keypath Set location of server X.509 certificates and keys.")); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ _cupsLangPuts(stdout, _("-M manufacturer Set manufacturer name (default=Test)")); #if !CUPS_LITE _cupsLangPuts(stdout, _("-P filename.ppd Load printer attributes from PPD file")); diff -Nru cups-2.3.3op2/tools/ippeveps.c cups-2.4.1op1/tools/ippeveps.c --- cups-2.3.3op2/tools/ippeveps.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/tools/ippeveps.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,6 +1,7 @@ /* * Generic Adobe PostScript printer command for ippeveprinter/CUPS. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2019 by Apple Inc. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -72,7 +73,10 @@ num_options = get_options(&options); if ((ipp_copies = getenv("IPP_COPIES")) != NULL) - copies = atoi(ipp_copies); + { + if ((copies = atoi(ipp_copies)) < 1) + copies = 1; + } else copies = 1; @@ -185,7 +189,7 @@ if (length > 0) { // Copy any remainder into the leftdata array... - if ((length - leftcount) > 0) + if (length > leftcount) memcpy(leftdata + leftcount, data, (size_t)(length - leftcount)); memset(leftdata + length, 0, (size_t)(4 - length)); @@ -417,10 +421,8 @@ * Load PPD file and the corresponding IPP <-> PPD cache data... */ - if ((ppd = ppdOpenFile(getenv("PPD"))) != NULL) + if ((ppd = ppdOpenFile(getenv("PPD"))) != NULL && (ppd_cache = _ppdCacheCreateWithPPD(ppd)) != NULL) { - ppd_cache = _ppdCacheCreateWithPPD(ppd); - /* TODO: Fix me - values are names, not numbers... Also need to support finishings-col */ if ((value = getenv("IPP_FINISHINGS")) == NULL) value = getenv("IPP_FINISHINGS_DEFAULT"); @@ -953,7 +955,11 @@ if (!strncmp(line, "%%Page:", 7)) break; - first_pos = ftell(fp); + if ((first_pos = ftell(fp)) < 0) + { + perror("DEBUG: ftell failed"); + first_pos = 0; + } if (line[0] != '%') fputs(line, stdout); @@ -966,7 +972,13 @@ int copy_page = 0; /* Do we copy the page data? */ if (fp != stdin) - fseek(fp, first_pos, SEEK_SET); + { + if (fseek(fp, first_pos, SEEK_SET) < 0) + { + perror("ERROR: Unable to seek within PostScript file"); + break; + } + } page = 0; while (fgets(line, sizeof(line), fp)) diff -Nru cups-2.3.3op2/tools/ippfind.c cups-2.4.1op1/tools/ippfind.c --- cups-2.3.3op2/tools/ippfind.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/tools/ippfind.c 2022-01-27 11:11:42.000000000 +0000 @@ -3,6 +3,7 @@ * commands such as IPP and Bonjour conformance tests. This tool is * inspired by the UNIX "find" command, thus its name. * + * Copyright © 2021-2022 by OpenPrinting. * Copyright © 2020 by the IEEE-ISTO Printer Working Group * Copyright © 2008-2018 by Apple Inc. * @@ -23,7 +24,7 @@ # include #endif /* _WIN32 */ #include -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER # include #elif defined(HAVE_AVAHI) # include @@ -33,7 +34,7 @@ # include # include # define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifndef _WIN32 extern char **environ; /* Process environment variables */ @@ -99,11 +100,11 @@ typedef struct ippfind_srv_s /* Service information */ { -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceRef ref; /* Service reference for query */ #elif defined(HAVE_AVAHI) AvahiServiceResolver *ref; /* Resolver */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ char *name, /* Service name */ *domain, /* Domain name */ *regtype, /* Registration type */ @@ -124,14 +125,14 @@ * Local globals... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER 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 */ +#endif /* HAVE_MDNSRESPONDER */ static int address_family = AF_UNSPEC; /* Address family for LIST */ @@ -144,7 +145,7 @@ * Local functions... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER 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) _CUPS_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) _CUPS_NONNULL(1,5,6,7,8); #elif defined(HAVE_AVAHI) @@ -160,7 +161,7 @@ static void client_callback(AvahiClient *client, AvahiClientState state, void *context); -#endif /* HAVE_AVAHI */ +#endif /* HAVE_MDNSRESPONDER */ static int compare_services(ippfind_srv_t *a, ippfind_srv_t *b); static const char *dnssd_error_string(int error); @@ -174,7 +175,7 @@ static ippfind_expr_t *new_expr(ippfind_op_t op, int invert, const char *value, const char *regex, char **args); -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER 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) _CUPS_NONNULL(1,5,6,9, 10); #elif defined(HAVE_AVAHI) static int poll_callback(struct pollfd *pollfds, @@ -193,7 +194,7 @@ AvahiStringList *txt, AvahiLookupResultFlags flags, void *context); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ static void set_service_uri(ippfind_srv_t *service); static void show_usage(void) _CUPS_NORETURN; static void show_version(void) _CUPS_NORETURN; @@ -227,10 +228,10 @@ /* Logic for next expression */ int invert = 0; /* Invert expression? */ int err; /* DNS-SD error */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER fd_set sinput; /* Input set for select() */ struct timeval stimeout; /* Timeout for select() */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ double endtime; /* End time */ static const char * const ops[] = /* Node operation names */ { @@ -1129,7 +1130,7 @@ * Start up browsing/resolving... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER if ((err = DNSServiceCreateConnection(&dnssd_ref)) != kDNSServiceErr_NoError) { _cupsLangPrintf(stderr, _("ippfind: Unable to use Bonjour: %s"), @@ -1155,7 +1156,7 @@ dnssd_error_string(err)); return (IPPFIND_EXIT_BONJOUR); } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ for (search = (const char *)cupsArrayFirst(searches); search; @@ -1230,7 +1231,7 @@ if (getenv("IPPFIND_DEBUG")) fprintf(stderr, "Resolving name=\"%s\", regtype=\"%s\", domain=\"%s\"\n", name, regtype, domain); -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER service->ref = dnssd_ref; err = DNSServiceResolve(&(service->ref), kDNSServiceFlagsShareConnection, 0, name, @@ -1247,7 +1248,7 @@ err = 0; else err = avahi_client_errno(avahi_client); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ } else { @@ -1258,7 +1259,7 @@ if (getenv("IPPFIND_DEBUG")) fprintf(stderr, "Browsing for regtype=\"%s\", domain=\"%s\"\n", regtype, domain); -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceRef ref; /* Browse reference */ ref = dnssd_ref; @@ -1290,7 +1291,7 @@ err = 0; else err = avahi_client_errno(avahi_client); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ } if (err) @@ -1315,7 +1316,7 @@ { int process = 0; /* Process services? */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER int fd = DNSServiceRefSockFD(dnssd_ref); /* File descriptor for DNS-SD */ @@ -1366,7 +1367,7 @@ process = 1; } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ if (process) { @@ -1396,7 +1397,7 @@ if (active < 50) { -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER service->ref = dnssd_ref; err = DNSServiceResolve(&(service->ref), kDNSServiceFlagsShareConnection, 0, @@ -1418,7 +1419,7 @@ err = 0; else err = avahi_client_errno(avahi_client); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ if (err) { @@ -1439,11 +1440,11 @@ if (service->ref) { -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceRefDeallocate(service->ref); #else avahi_service_resolver_free(service->ref); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ service->ref = NULL; } @@ -1473,7 +1474,7 @@ } -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER /* * 'browse_callback()' - Browse devices. */ @@ -1543,7 +1544,7 @@ replyDomain); service->is_local = 1; } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ #ifdef HAVE_AVAHI @@ -1647,7 +1648,7 @@ static const char * /* O - Error message */ dnssd_error_string(int error) /* I - Error number */ { -# ifdef HAVE_DNSSD +# ifdef HAVE_MDNSRESPONDER switch (error) { case kDNSServiceErr_NoError : @@ -1752,7 +1753,7 @@ # elif defined(HAVE_AVAHI) return (avahi_strerror(error)); -# endif /* HAVE_DNSSD */ +# endif /* HAVE_MDNSRESPONDER */ } @@ -2166,7 +2167,9 @@ * Yes, add the service... */ - service = calloc(sizeof(ippfind_srv_t), 1); + if ((service = calloc(sizeof(ippfind_srv_t), 1)) == NULL) + return (NULL); + service->name = strdup(serviceName); service->domain = strdup(replyDomain); service->regtype = strdup(regtype); @@ -2178,12 +2181,12 @@ * resolves... */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain); #else /* HAVE_AVAHI */ avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName, regtype, replyDomain); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ service->fullName = strdup(fullName); @@ -2545,7 +2548,7 @@ * 'resolve_callback()' - Process resolve data. */ -#ifdef HAVE_DNSSD +#ifdef HAVE_MDNSRESPONDER static void DNSSD_API resolve_callback( DNSServiceRef sdRef, /* I - Service reference */ @@ -2698,7 +2701,7 @@ set_service_uri(service); } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_MDNSRESPONDER */ /* diff -Nru cups-2.3.3op2/tools/ipptool.c cups-2.4.1op1/tools/ipptool.c --- cups-2.3.3op2/tools/ipptool.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/tools/ipptool.c 2022-01-27 11:11:42.000000000 +0000 @@ -1,8 +1,9 @@ /* * ipptool command for CUPS. * - * Copyright @ 2020 by The Printer Working Group. - * Copyright © 2007-2019 by Apple Inc. + * Copyright © 2021-2022 by OpenPrinting. + * Copyright © 2020 by The Printer Working Group. + * Copyright © 2007-2021 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more @@ -31,37 +32,47 @@ /* + * Limits... + */ + +#define MAX_EXPECT 200 // Maximum number of EXPECT directives +#define MAX_DISPLAY 200 // Maximum number of DISPLAY directives +#define MAX_MONITOR 10 // Maximum number of MONITOR-PRINTER-STATE EXPECT directives + + +/* * Types... */ -typedef enum _cups_transfer_e /**** How to send request data ****/ +typedef enum ipptool_transfer_e /**** How to send request data ****/ { - _CUPS_TRANSFER_AUTO, /* Chunk for files, length for static */ - _CUPS_TRANSFER_CHUNKED, /* Chunk always */ - _CUPS_TRANSFER_LENGTH /* Length always */ -} _cups_transfer_t; + IPPTOOL_TRANSFER_AUTO, /* Chunk for files, length for static */ + IPPTOOL_TRANSFER_CHUNKED, /* Chunk always */ + IPPTOOL_TRANSFER_LENGTH /* Length always */ +} ipptool_transfer_t; -typedef enum _cups_output_e /**** Output mode ****/ +typedef enum ipptool_output_e /**** Output mode ****/ { - _CUPS_OUTPUT_QUIET, /* No output */ - _CUPS_OUTPUT_TEST, /* Traditional CUPS test output */ - _CUPS_OUTPUT_PLIST, /* XML plist test output */ - _CUPS_OUTPUT_IPPSERVER, /* ippserver attribute file output */ - _CUPS_OUTPUT_LIST, /* Tabular list output */ - _CUPS_OUTPUT_CSV /* Comma-separated values output */ -} _cups_output_t; + IPPTOOL_OUTPUT_QUIET, /* No output */ + IPPTOOL_OUTPUT_TEST, /* Traditional CUPS test output */ + IPPTOOL_OUTPUT_PLIST, /* XML plist test output */ + IPPTOOL_OUTPUT_IPPSERVER, /* ippserver attribute file output */ + IPPTOOL_OUTPUT_LIST, /* Tabular list output */ + IPPTOOL_OUTPUT_CSV, /* Comma-separated values output */ + IPPTOOL_OUTPUT_JSON /* JSON output */ +} ipptool_output_t; -typedef enum _cups_with_e /**** WITH flags ****/ +typedef enum ipptool_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_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; + IPPTOOL_WITH_LITERAL = 0, /* Match string is a literal value */ + IPPTOOL_WITH_ALL = 1, /* Must match all values */ + IPPTOOL_WITH_REGEX = 2, /* Match string is a regular expression */ + IPPTOOL_WITH_HOSTNAME = 4, /* Match string is a URI hostname */ + IPPTOOL_WITH_RESOURCE = 8, /* Match string is a URI resource */ + IPPTOOL_WITH_SCHEME = 16 /* Match string is a URI scheme */ +} ipptool_with_t; -typedef struct _cups_expect_s /**** Expected attribute info ****/ +typedef struct ipptool_expect_s /**** Expected attribute info ****/ { int optional, /* Optional attribute? */ not_expect, /* Don't expect attribute? */ @@ -75,16 +86,18 @@ *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 */ + *define_value, /* Variable to define with value */ + *display_match; /* Message to display on a match */ int repeat_limit, /* Maximum number of times to repeat */ repeat_match, /* Repeat test on match */ repeat_no_match, /* Repeat test on no match */ - with_flags, /* WITH flags */ + with_distinct, /* WITH-DISTINCT-VALUES? */ + with_flags, /* WITH flags */ count; /* Expected count if > 0 */ ipp_tag_t in_group; /* IN-GROUP value */ -} _cups_expect_t; +} ipptool_expect_t; -typedef struct _cups_status_s /**** Status info ****/ +typedef struct ipptool_status_s /**** Status info ****/ { ipp_status_t status; /* Expected status code */ char *if_defined, /* Only if variable is defined */ @@ -95,14 +108,16 @@ int repeat_limit, /* Maximum number of times to repeat */ repeat_match, /* Repeat the test when it does not match */ repeat_no_match; /* Repeat the test when it matches */ -} _cups_status_t; +} ipptool_status_t; -typedef struct _cups_testdata_s /**** Test Data ****/ +typedef struct ipptool_test_s /**** Test Data ****/ { /* Global Options */ + _ipp_vars_t *vars; /* Variables */ http_encryption_t encryption; /* Encryption for connection */ int family; /* Address family */ - _cups_output_t output; /* Output mode */ + ipptool_output_t output; /* Output mode */ + int repeat_on_busy; /* Repeat tests on server-error-busy */ int stop_after_include_error; /* Stop after include errors? */ double timeout; /* Timeout for connection */ @@ -111,7 +126,7 @@ /* Test Defaults */ int def_ignore_errors; /* Default IGNORE-ERRORS value */ - _cups_transfer_t def_transfer; /* Default TRANSFER value */ + ipptool_transfer_t def_transfer; /* Default TRANSFER value */ int def_version; /* Default IPP version */ /* Global State */ @@ -132,9 +147,9 @@ char compression[16]; /* COMPRESSION value */ useconds_t delay; /* Initial delay */ int num_displayed; /* Number of displayed attributes */ - char *displayed[200]; /* Displayed attributes */ + char *displayed[MAX_DISPLAY];/* Displayed attributes */ int num_expects; /* Number of expected attributes */ - _cups_expect_t expects[200], /* Expected attributes */ + ipptool_expect_t expects[MAX_EXPECT], /* Expected attributes */ *expect, /* Current expected attribute */ *last_expect; /* Last EXPECT (for predicates) */ char file[1024], /* Data filename */ @@ -145,14 +160,23 @@ useconds_t repeat_interval; /* Repeat interval (delay) */ int request_id; /* Current request ID */ char resource[512]; /* Resource for request */ - int skip_test, /* Skip this test? */ + int pass_test, /* Pass this test? */ + skip_test, /* Skip this test? */ num_statuses; /* Number of valid status codes */ - _cups_status_t statuses[100], /* Valid status codes */ + ipptool_status_t statuses[100], /* Valid status codes */ *last_status; /* Last STATUS (for predicates) */ char test_id[1024]; /* Test identifier */ - _cups_transfer_t transfer; /* To chunk or not to chunk */ + ipptool_transfer_t transfer; /* To chunk or not to chunk */ int version; /* IPP version number to use */ -} _cups_testdata_t; + _cups_thread_t monitor_thread; /* Monitoring thread ID */ + int monitor_done; /* Set to 1 to stop monitor thread */ + char *monitor_uri; /* MONITOR-PRINTER-STATE URI */ + useconds_t monitor_delay, /* MONITOR-PRINTER-STATE DELAY value, if any */ + monitor_interval; /* MONITOR-PRINTER-STATE DELAY interval */ + int num_monitor_expects; /* Number MONITOR-PRINTER-STATE EXPECTs */ + ipptool_expect_t monitor_expects[MAX_MONITOR]; + /* MONITOR-PRINTER-STATE EXPECTs */ +} ipptool_test_t; /* @@ -169,32 +193,37 @@ static void add_stringf(cups_array_t *a, const char *s, ...) _CUPS_FORMAT(2, 3); static int compare_uris(const char *a, const char *b); static void copy_hex_string(char *buffer, unsigned char *data, int datalen, size_t bufsize); -static int do_test(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data); -static int do_tests(const char *testfile, _ipp_vars_t *vars, _cups_testdata_t *data); -static int error_cb(_ipp_file_t *f, _cups_testdata_t *data, const char *error); -static int expect_matches(_cups_expect_t *expect, ipp_tag_t value_tag); +static void *do_monitor_printer_state(ipptool_test_t *data); +static int do_test(_ipp_file_t *f, ipptool_test_t *data); +static int do_tests(const char *testfile, ipptool_test_t *data); +static int error_cb(_ipp_file_t *f, ipptool_test_t *data, const char *error); +static int expect_matches(ipptool_expect_t *expect, ipp_attribute_t *attr); 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 void init_data(_cups_testdata_t *data); +static void init_data(ipptool_test_t *data); static char *iso_date(const ipp_uchar_t *date); +static int parse_monitor_printer_state(_ipp_file_t *f, ipptool_test_t *data); static void pause_message(const char *message); -static void print_attr(cups_file_t *outfile, _cups_output_t output, ipp_attribute_t *attr, ipp_tag_t *group); -static void print_csv(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); -static void print_fatal_error(_cups_testdata_t *data, const char *s, ...) _CUPS_FORMAT(2, 3); -static void print_ippserver_attr(_cups_testdata_t *data, ipp_attribute_t *attr, int indent); -static void print_ippserver_string(_cups_testdata_t *data, const char *s, size_t len); -static void print_line(_cups_testdata_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); -static void print_xml_header(_cups_testdata_t *data); +static void print_attr(cups_file_t *outfile, ipptool_output_t output, ipp_attribute_t *attr, ipp_tag_t *group); +static ipp_attribute_t *print_csv(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); +static void print_fatal_error(ipptool_test_t *data, const char *s, ...) _CUPS_FORMAT(2, 3); +static void print_ippserver_attr(ipptool_test_t *data, ipp_attribute_t *attr, int indent); +static void print_ippserver_string(ipptool_test_t *data, const char *s, size_t len); +static void print_json_attr(ipptool_test_t *data, ipp_attribute_t *attr, int indent); +static void print_json_string(ipptool_test_t *data, const char *s, size_t len); +static ipp_attribute_t *print_line(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); +static void print_xml_header(ipptool_test_t *data); static void print_xml_string(cups_file_t *outfile, const char *element, const char *s); -static void print_xml_trailer(_cups_testdata_t *data, int success, const char *message); +static void print_xml_trailer(ipptool_test_t *data, int success, const char *message); #ifndef _WIN32 static void sigterm_handler(int sig); #endif /* _WIN32 */ static int timeout_cb(http_t *http, void *user_data); -static int token_cb(_ipp_file_t *f, _ipp_vars_t *vars, _cups_testdata_t *data, const char *token); +static int token_cb(_ipp_file_t *f, _ipp_vars_t *vars, ipptool_test_t *data, const char *token); static void usage(void) _CUPS_NORETURN; +static int with_distinct_values(cups_array_t *errors, ipp_attribute_t *attr); static const char *with_flags_string(int flags); -static int with_value(_cups_testdata_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); +static int with_value(ipptool_test_t *data, 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); @@ -217,8 +246,8 @@ *testfile; /* Test file to use */ int interval, /* Test interval in microseconds */ repeat; /* Repeat count */ - _cups_testdata_t data; /* Test data */ _ipp_vars_t vars; /* Variables */ + ipptool_test_t data; /* Test data */ _cups_globals_t *cg = _cupsGlobals(); /* Global data */ @@ -241,8 +270,9 @@ init_data(&data); _ippVarsInit(&vars, NULL, (_ipp_ferror_cb_t)error_cb, (_ipp_ftoken_cb_t)token_cb); + data.vars = &vars; - _ippVarsSet(&vars, "date-start", iso_date(ippTimeToDate(time(NULL)))); + _ippVarsSet(data.vars, "date-start", iso_date(ippTimeToDate(time(NULL)))); /* * We need at least: @@ -280,7 +310,7 @@ exit(1); } - data.output = _CUPS_OUTPUT_IPPSERVER; + data.output = IPPTOOL_OUTPUT_IPPSERVER; } else if (!strcmp(argv[i], "--stop-after-include-error")) { @@ -308,16 +338,16 @@ #endif /* AF_INET6 */ case 'C' : /* Enable HTTP chunking */ - data.def_transfer = _CUPS_TRANSFER_CHUNKED; + data.def_transfer = IPPTOOL_TRANSFER_CHUNKED; break; case 'E' : /* Encrypt with TLS */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS data.encryption = HTTP_ENCRYPT_REQUIRED; #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]); -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ break; case 'I' : /* Ignore errors */ @@ -325,7 +355,7 @@ break; case 'L' : /* Disable HTTP chunking */ - data.def_transfer = _CUPS_TRANSFER_LENGTH; + data.def_transfer = IPPTOOL_TRANSFER_LENGTH; break; case 'P' : /* Output to plist file */ @@ -346,7 +376,7 @@ exit(1); } - data.output = _CUPS_OUTPUT_PLIST; + data.output = IPPTOOL_OUTPUT_PLIST; if (interval || repeat) { @@ -355,13 +385,16 @@ } break; + case 'R' : /* Repeat on server-error-busy */ + data.repeat_on_busy = 1; + break; + case 'S' : /* Encrypt with SSL */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS data.encryption = HTTP_ENCRYPT_ALWAYS; #else - _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), - argv[0]); -#endif /* HAVE_SSL */ + _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), "ipptool"); +#endif /* HAVE_TLS */ break; case 'T' : /* Set timeout */ @@ -369,9 +402,7 @@ if (i >= argc) { - _cupsLangPrintf(stderr, - _("%s: Missing timeout for \"-T\"."), - "ipptool"); + _cupsLangPrintf(stderr, _("%s: Missing timeout for \"-T\"."), "ipptool"); usage(); } @@ -383,9 +414,7 @@ if (i >= argc) { - _cupsLangPrintf(stderr, - _("%s: Missing version for \"-V\"."), - "ipptool"); + _cupsLangPrintf(stderr, _("%s: Missing version for \"-V\"."), "ipptool"); usage(); } @@ -417,7 +446,7 @@ break; case 'X' : /* Produce XML output */ - data.output = _CUPS_OUTPUT_PLIST; + data.output = IPPTOOL_OUTPUT_PLIST; if (interval || repeat) { @@ -427,7 +456,7 @@ break; case 'c' : /* CSV output */ - data.output = _CUPS_OUTPUT_CSV; + data.output = IPPTOOL_OUTPUT_CSV; break; case 'd' : /* Define a variable */ @@ -435,8 +464,7 @@ if (i >= argc) { - _cupsLangPuts(stderr, - _("ipptool: Missing name=value for \"-d\".")); + _cupsLangPuts(stderr, _("ipptool: Missing name=value for \"-d\".")); usage(); } @@ -446,7 +474,7 @@ else value = name + strlen(name); - _ippVarsSet(&vars, name, value); + _ippVarsSet(data.vars, name, value); break; case 'f' : /* Set the default test filename */ @@ -454,8 +482,7 @@ if (i >= argc) { - _cupsLangPuts(stderr, - _("ipptool: Missing filename for \"-f\".")); + _cupsLangPuts(stderr, _("ipptool: Missing filename for \"-f\".")); usage(); } @@ -484,7 +511,7 @@ else strlcpy(filename, argv[i], sizeof(filename)); - _ippVarsSet(&vars, "filename", filename); + _ippVarsSet(data.vars, "filename", filename); if ((ext = strrchr(filename, '.')) != NULL) { @@ -493,43 +520,43 @@ */ if (!_cups_strcasecmp(ext, ".gif")) - _ippVarsSet(&vars, "filetype", "image/gif"); + _ippVarsSet(data.vars, "filetype", "image/gif"); else if (!_cups_strcasecmp(ext, ".htm") || !_cups_strcasecmp(ext, ".htm.gz") || !_cups_strcasecmp(ext, ".html") || !_cups_strcasecmp(ext, ".html.gz")) - _ippVarsSet(&vars, "filetype", "text/html"); + _ippVarsSet(data.vars, "filetype", "text/html"); else if (!_cups_strcasecmp(ext, ".jpg") || !_cups_strcasecmp(ext, ".jpeg")) - _ippVarsSet(&vars, "filetype", "image/jpeg"); + _ippVarsSet(data.vars, "filetype", "image/jpeg"); else if (!_cups_strcasecmp(ext, ".pcl") || !_cups_strcasecmp(ext, ".pcl.gz")) - _ippVarsSet(&vars, "filetype", "application/vnd.hp-PCL"); + _ippVarsSet(data.vars, "filetype", "application/vnd.hp-PCL"); else if (!_cups_strcasecmp(ext, ".pdf")) - _ippVarsSet(&vars, "filetype", "application/pdf"); + _ippVarsSet(data.vars, "filetype", "application/pdf"); else if (!_cups_strcasecmp(ext, ".png")) - _ippVarsSet(&vars, "filetype", "image/png"); + _ippVarsSet(data.vars, "filetype", "image/png"); else if (!_cups_strcasecmp(ext, ".ps") || !_cups_strcasecmp(ext, ".ps.gz")) - _ippVarsSet(&vars, "filetype", "application/postscript"); + _ippVarsSet(data.vars, "filetype", "application/postscript"); else if (!_cups_strcasecmp(ext, ".pwg") || !_cups_strcasecmp(ext, ".pwg.gz") || !_cups_strcasecmp(ext, ".ras") || !_cups_strcasecmp(ext, ".ras.gz")) - _ippVarsSet(&vars, "filetype", "image/pwg-raster"); + _ippVarsSet(data.vars, "filetype", "image/pwg-raster"); else if (!_cups_strcasecmp(ext, ".tif") || !_cups_strcasecmp(ext, ".tiff")) - _ippVarsSet(&vars, "filetype", "image/tiff"); + _ippVarsSet(data.vars, "filetype", "image/tiff"); else if (!_cups_strcasecmp(ext, ".txt") || !_cups_strcasecmp(ext, ".txt.gz")) - _ippVarsSet(&vars, "filetype", "text/plain"); + _ippVarsSet(data.vars, "filetype", "text/plain"); else if (!_cups_strcasecmp(ext, ".urf") || !_cups_strcasecmp(ext, ".urf.gz")) - _ippVarsSet(&vars, "filetype", "image/urf"); + _ippVarsSet(data.vars, "filetype", "image/urf"); else if (!_cups_strcasecmp(ext, ".xps")) - _ippVarsSet(&vars, "filetype", "application/openxps"); + _ippVarsSet(data.vars, "filetype", "application/openxps"); else - _ippVarsSet(&vars, "filetype", "application/octet-stream"); + _ippVarsSet(data.vars, "filetype", "application/octet-stream"); } else { @@ -537,7 +564,7 @@ * Use the "auto-type" MIME media type... */ - _ippVarsSet(&vars, "filetype", "application/octet-stream"); + _ippVarsSet(data.vars, "filetype", "application/octet-stream"); } break; @@ -563,15 +590,19 @@ } } - if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && interval) + if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && interval) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\".")); usage(); } break; + case 'j' : /* JSON output */ + data.output = IPPTOOL_OUTPUT_JSON; + break; + case 'l' : /* List as a table */ - data.output = _CUPS_OUTPUT_LIST; + data.output = IPPTOOL_OUTPUT_LIST; break; case 'n' : /* Repeat count */ @@ -585,7 +616,7 @@ else repeat = atoi(argv[i]); - if ((data.output == _CUPS_OUTPUT_PLIST || data.output == _CUPS_OUTPUT_IPPSERVER) && repeat) + if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && repeat) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\".")); usage(); @@ -593,11 +624,11 @@ break; case 'q' : /* Be quiet */ - data.output = _CUPS_OUTPUT_QUIET; + data.output = IPPTOOL_OUTPUT_QUIET; break; case 't' : /* CUPS test output */ - data.output = _CUPS_OUTPUT_TEST; + data.output = IPPTOOL_OUTPUT_TEST; break; case 'v' : /* Be verbose */ @@ -611,34 +642,34 @@ } } else if (!strncmp(argv[i], "ipp://", 6) || !strncmp(argv[i], "http://", 7) -#ifdef HAVE_SSL +#ifdef HAVE_TLS || !strncmp(argv[i], "ipps://", 7) || !strncmp(argv[i], "https://", 8) -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ ) { /* * Set URI... */ - if (vars.uri) + if (data.vars->uri) { _cupsLangPuts(stderr, _("ipptool: May only specify a single URI.")); usage(); } -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (!strncmp(argv[i], "ipps://", 7) || !strncmp(argv[i], "https://", 8)) data.encryption = HTTP_ENCRYPT_ALWAYS; -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ - if (!_ippVarsSet(&vars, "uri", argv[i])) + if (!_ippVarsSet(data.vars, "uri", argv[i])) { _cupsLangPrintf(stderr, _("ipptool: Bad URI \"%s\"."), argv[i]); return (1); } - if (vars.username[0] && vars.password) - cupsSetPasswordCB2(_ippVarsPasswordCB, &vars); + if (data.vars->username[0] && data.vars->password) + cupsSetPasswordCB2(_ippVarsPasswordCB, data.vars); } else { @@ -646,7 +677,7 @@ * Run test... */ - if (!vars.uri) + if (!data.vars->uri) { _cupsLangPuts(stderr, _("ipptool: URI required before test file.")); _cupsLangPuts(stderr, argv[i]); @@ -668,26 +699,31 @@ else testfile = argv[i]; - if (!do_tests(testfile, &vars, &data)) + if (access(testfile, 0)) + { + _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", testfile, strerror(errno)); + status = 1; + } + else if (!do_tests(testfile, &data)) status = 1; } } - if (!vars.uri || !testfile) + if (!data.vars->uri || !testfile) usage(); /* * Loop if the interval is set... */ - if (data.output == _CUPS_OUTPUT_PLIST) + if (data.output == IPPTOOL_OUTPUT_PLIST) print_xml_trailer(&data, !status, NULL); else if (interval > 0 && repeat > 0) { while (repeat > 1) { usleep((useconds_t)interval); - do_tests(testfile, &vars, &data); + do_tests(testfile, &data); repeat --; } } @@ -696,11 +732,11 @@ for (;;) { usleep((useconds_t)interval); - do_tests(testfile, &vars, &data); + do_tests(testfile, &data); } } - if ((data.output == _CUPS_OUTPUT_TEST || (data.output == _CUPS_OUTPUT_PLIST && data.outfile)) && data.test_count > 1) + if ((data.output == IPPTOOL_OUTPUT_TEST || (data.output == IPPTOOL_OUTPUT_PLIST && data.outfile)) && data.test_count > 1) { /* * Show a summary report if there were multiple tests... @@ -884,20 +920,258 @@ /* + * 'do_monitor_printer_state()' - Do the MONITOR-PRINTER-STATE tests in the background. + */ + +static void * // O - Thread exit status +do_monitor_printer_state( + ipptool_test_t *data) // I - Test data +{ + int i, j; // Looping vars + char scheme[32], // URI scheme + userpass[32], // URI username:password + host[256], // URI hostname/IP address + resource[256]; // URI resource path + int port; // URI port number + http_encryption_t encryption; // Encryption to use + http_t *http; // Connection to printer + ipp_t *request, // IPP request + *response = NULL; // IPP response + http_status_t status; // Request status + ipp_attribute_t *found; // Found attribute + ipptool_expect_t *expect; // Current EXPECT test + char buffer[131072]; // Copy buffer + int num_pattrs; // Number of printer attributes + const char *pattrs[100]; // Printer attributes we care about + + + // Connect to the printer... + if (httpSeparateURI(HTTP_URI_CODING_ALL, data->monitor_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) + { + print_fatal_error(data, "Bad printer URI \"%s\".", data->monitor_uri); + return (NULL); + } + + if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") || port == 443) + encryption = HTTP_ENCRYPTION_ALWAYS; + else + encryption = data->encryption; + + if ((http = httpConnect2(host, port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL) + { + print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", host, port, cupsLastErrorString()); + return (0); + } + +#ifdef HAVE_LIBZ + httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "deflate, gzip, identity"); +#else + httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "identity"); +#endif /* HAVE_LIBZ */ + + if (data->timeout > 0.0) + httpSetTimeout(http, data->timeout, timeout_cb, NULL); + + // Wait for the initial delay as needed... + if (data->monitor_delay) + usleep(data->monitor_delay); + + // Create a query request that we'll reuse... + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); + ippSetRequestId(request, data->request_id * 100 - 1); + ippSetVersion(request, data->version / 10, data->version % 10); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, data->monitor_uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); + + for (i = data->num_monitor_expects, expect = data->monitor_expects, num_pattrs = 0; i > 0; i --, expect ++) + { + // Add EXPECT attribute names... + for (j = 0; j < num_pattrs; j ++) + { + if (!strcmp(expect->name, pattrs[j])) + break; + } + + if (j >= num_pattrs && num_pattrs < (int)(sizeof(pattrs) / sizeof(pattrs[0]))) + pattrs[num_pattrs ++] = expect->name; + } + + if (num_pattrs > 0) + ippAddStrings(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "requested-attributes", num_pattrs, NULL, pattrs); + + // Loop until we need to stop... + while (!data->monitor_done && !Cancel) + { + // Poll the printer state... + ippSetRequestId(request, ippGetRequestId(request) + 1); + + if ((status = cupsSendRequest(http, request, resource, ippLength(request))) != HTTP_STATUS_ERROR) + { + response = cupsGetResponse(http, resource); + status = httpGetStatus(http); + } + + if (!data->monitor_done && !Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL && +#ifdef _WIN32 + httpError(data->http) != WSAETIMEDOUT) +#else + httpError(data->http) != ETIMEDOUT) +#endif // _WIN32 + { + if (httpReconnect2(http, 30000, NULL)) + break; + } + else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED) + { + break; + } + else if (status != HTTP_STATUS_OK) + { + httpFlush(http); + + if (status == HTTP_STATUS_UNAUTHORIZED) + continue; + + break; + } + + for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++) + { + if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined)) + continue; + + if (expect->if_not_defined && _ippVarsGet(data->vars, expect->if_not_defined)) + continue; + + found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO); + + if ((found && expect->not_expect) || + (!found && !(expect->not_expect || expect->optional)) || + (found && !expect_matches(expect, found)) || + (expect->in_group && ippGetGroupTag(found) != expect->in_group) || + (expect->with_distinct && !with_distinct_values(NULL, found))) + { + if (expect->define_no_match) + { + _ippVarsSet(data->vars, expect->define_no_match, "1"); + data->monitor_done = 1; + } + break; + } + + if (found) + ippAttributeString(found, buffer, sizeof(buffer)); + + if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer))) + { + if (expect->define_no_match) + { + _ippVarsSet(data->vars, expect->define_no_match, "1"); + data->monitor_done = 1; + } + break; + } + + if (found && expect->count > 0 && ippGetCount(found) != expect->count) + { + if (expect->define_no_match) + { + _ippVarsSet(data->vars, expect->define_no_match, "1"); + data->monitor_done = 1; + } + break; + } + + if (found && expect->display_match && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))) + cupsFilePrintf(cupsFileStdout(), "CONT]\n\n%s\n\n %-68.68s [", expect->display_match, data->name); + + if (found && expect->define_match) + { + _ippVarsSet(data->vars, expect->define_match, "1"); + data->monitor_done = 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_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; + } + } + + _ippVarsSet(data->vars, expect->define_value, buffer); + data->monitor_done = 1; + } + } + + if (i == 0) + data->monitor_done = 1; // All tests passed + + ippDelete(response); + response = NULL; + + // Sleep between requests... + if (data->monitor_done || Cancel) + break; + + usleep(data->monitor_interval); + } + + // Close the connection to the printer and return... + httpClose(http); + ippDelete(request); + ippDelete(response); + + return (NULL); +} + + +/* * 'do_test()' - Do a single test from the test file. */ static int /* O - 1 on success, 0 on failure */ -do_test(_ipp_file_t *f, /* I - IPP data file */ - _ipp_vars_t *vars, /* I - IPP variables */ - _cups_testdata_t *data) /* I - Test data */ +do_test(_ipp_file_t *f, /* I - IPP data file */ + ipptool_test_t *data) /* I - Test data */ { int i, /* Looping var */ status_ok, /* Did we get a matching status? */ repeat_count = 0, /* Repeat count */ repeat_test; /* Repeat the test? */ - _cups_expect_t *expect; /* Current expected attribute */ + ipptool_expect_t *expect; /* Current expected attribute */ ipp_t *request, /* IPP request */ *response; /* IPP response */ size_t length; /* Length of IPP request */ @@ -909,7 +1183,7 @@ char temp[1024]; /* Temporary string */ cups_file_t *reqfile; /* File to send */ ssize_t bytes; /* Bytes read/written */ - char buffer[131072]; /* Copy buffer */ + char buffer[1024 * 1024]; /* Copy buffer */ size_t widths[200]; /* Width of columns */ const char *error; /* Current error */ @@ -923,13 +1197,23 @@ if (data->pause[0]) { - if (!data->skip_test) + if (!data->skip_test && !data->pass_test) pause_message(data->pause); data->pause[0] = '\0'; } /* + * Start the background thread as needed... + */ + + if (data->monitor_uri) + { + data->monitor_done = 0; + data->monitor_thread = _cupsThreadCreate((_cups_thread_func_t)do_monitor_printer_state, data); + } + + /* * Take over control of the attributes in the request... */ @@ -945,7 +1229,7 @@ ippSetVersion(request, data->version / 10, data->version % 10); ippSetRequestId(request, data->request_id); - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "Name\n"); @@ -978,46 +1262,58 @@ cupsFilePuts(data->outfile, "\n"); } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { if (data->verbosity) { cupsFilePrintf(cupsFileStdout(), " %s:\n", ippOpString(ippGetOperation(request))); for (attrptr = ippFirstAttribute(request); attrptr; attrptr = ippNextAttribute(request)) - print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); + print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL); } cupsFilePrintf(cupsFileStdout(), " %-68.68s [", data->name); } - if ((data->skip_previous && !data->prev_pass) || data->skip_test) + if ((data->skip_previous && !data->prev_pass) || data->skip_test || data->pass_test) { - data->skip_count ++; + if (!data->pass_test) + data->skip_count ++; ippDelete(request); request = NULL; response = NULL; - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Successful\n"); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "Skipped\n"); - cupsFilePuts(data->outfile, "\n"); + if (data->pass_test) + cupsFilePuts(data->outfile, "\n"); + else + cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "StatusCode\n"); - print_xml_string(data->outfile, "string", "skip"); + if (data->pass_test) + print_xml_string(data->outfile, "string", "pass"); + else + print_xml_string(data->outfile, "string", "skip"); cupsFilePuts(data->outfile, "ResponseAttributes\n"); cupsFilePuts(data->outfile, "\n"); } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) - cupsFilePuts(cupsFileStdout(), "SKIP]\n"); + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + { + if (data->pass_test) + cupsFilePuts(cupsFileStdout(), "PASS]\n"); + else + cupsFilePuts(cupsFileStdout(), "SKIP]\n"); + } goto skip_error; } - vars->password_tries = 0; + data->vars->password_tries = 0; do { @@ -1029,7 +1325,7 @@ status = HTTP_STATUS_OK; - if (data->transfer == _CUPS_TRANSFER_CHUNKED || (data->transfer == _CUPS_TRANSFER_AUTO && data->file[0])) + if (data->transfer == IPPTOOL_TRANSFER_CHUNKED || (data->transfer == IPPTOOL_TRANSFER_AUTO && data->file[0])) { /* * Send request using chunking - a 0 length means "chunk". @@ -1070,6 +1366,8 @@ { while (!response && !Cancel && data->prev_pass) { + ippSetRequestId(request, ++ data->request_id); + status = cupsSendRequest(data->http, request, data->resource, length); #ifdef HAVE_LIBZ @@ -1199,16 +1497,16 @@ if ((attrptr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL) { snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0)); - _ippVarsSet(vars, "job-id", temp); + _ippVarsSet(data->vars, "job-id", temp); } if ((attrptr = ippFindAttribute(response, "job-uri", IPP_TAG_URI)) != NULL) - _ippVarsSet(vars, "job-uri", ippGetString(attrptr, 0, NULL)); + _ippVarsSet(data->vars, "job-uri", ippGetString(attrptr, 0, NULL)); if ((attrptr = ippFindAttribute(response, "notify-subscription-id", IPP_TAG_INTEGER)) != NULL) { snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0)); - _ippVarsSet(vars, "notify-subscription-id", temp); + _ippVarsSet(data->vars, "notify-subscription-id", temp); } /* @@ -1226,27 +1524,27 @@ major = ippGetVersion(response, &minor); if (major != (data->version / 10) || minor != (data->version % 10)) - add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 2911 section 3.1.8).", major, minor, data->version / 10, data->version % 10); + add_stringf(data->errors, "Bad version %d.%d in response - expected %d.%d (RFC 8011 section 4.1.8).", major, minor, data->version / 10, data->version % 10); } if (ippGetRequestId(response) != data->request_id) - add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 2911 section 3.1.1)", ippGetRequestId(response), data->request_id); + add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 8011 section 4.1.1)", ippGetRequestId(response), data->request_id); attrptr = ippFirstAttribute(response); if (!attrptr) { - add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4)."); + add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4)."); } else { if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_CHARSET || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 ||strcmp(ippGetName(attrptr), "attributes-charset")) - add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); + add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); attrptr = ippNextAttribute(response); if (!attrptr) - add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4)."); + add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4)."); else if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_LANGUAGE || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 || strcmp(ippGetName(attrptr), "attributes-natural-language")) - add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 2911 section 3.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); + add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); } if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_ZERO)) != NULL) @@ -1255,13 +1553,13 @@ /* String value */ if (ippGetValueTag(attrptr) != IPP_TAG_TEXT) - add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetValueTag(attrptr))); + add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetValueTag(attrptr))); if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION) - add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 2911 section 3.1.6.2).", ippTagString(ippGetGroupTag(attrptr))); + add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetGroupTag(attrptr))); if (ippGetCount(attrptr) != 1) - add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 2911 section 3.1.6.2).", ippGetCount(attrptr)); + add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 8011 section 4.1.6.2).", ippGetCount(attrptr)); if (status_message && strlen(status_message) > 255) - add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 2911 section 3.1.6.2).", (int)strlen(status_message)); + add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 8011 section 4.1.6.2).", (int)strlen(status_message)); } if ((attrptr = ippFindAttribute(response, "detailed-status-message", @@ -1271,25 +1569,13 @@ /* String value */ if (ippGetValueTag(attrptr) != IPP_TAG_TEXT) - add_stringf(data->errors, - "detailed-status-message (text(MAX)) has wrong " - "value tag %s (RFC 2911 section 3.1.6.3).", - ippTagString(ippGetValueTag(attrptr))); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong value tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetValueTag(attrptr))); if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION) - add_stringf(data->errors, - "detailed-status-message (text(MAX)) has wrong " - "group tag %s (RFC 2911 section 3.1.6.3).", - ippTagString(ippGetGroupTag(attrptr))); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong group tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetGroupTag(attrptr))); if (ippGetCount(attrptr) != 1) - add_stringf(data->errors, - "detailed-status-message (text(MAX)) has %d values" - " (RFC 2911 section 3.1.6.3).", - ippGetCount(attrptr)); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has %d values (RFC 8011 section 4.1.6.3).", ippGetCount(attrptr)); if (detailed_status_message && strlen(detailed_status_message) > 1023) - add_stringf(data->errors, - "detailed-status-message (text(MAX)) has bad " - "length %d (RFC 2911 section 3.1.6.3).", - (int)strlen(detailed_status_message)); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has bad length %d (RFC 8011 section 4.1.6.3).", (int)strlen(detailed_status_message)); } a = cupsArrayNew((cups_array_func_t)strcmp, NULL); @@ -1335,9 +1621,7 @@ } if (out_of_order) - add_stringf(data->errors, "Attribute groups out of order (%s < %s)", - ippTagString(ippGetGroupTag(attrptr)), - ippTagString(group)); + add_stringf(data->errors, "Attribute groups out of order (%s < %s)", ippTagString(ippGetGroupTag(attrptr)), ippTagString(group)); if (ippGetGroupTag(attrptr) != IPP_TAG_ZERO) group = ippGetGroupTag(attrptr); @@ -1348,9 +1632,8 @@ if (ippGetName(attrptr)) { - if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < _CUPS_OUTPUT_LIST) - add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group", - ippGetName(attrptr), ippTagString(group)); + if (cupsArrayFind(a, (void *)ippGetName(attrptr)) && data->output < IPPTOOL_OUTPUT_LIST) + add_stringf(data->errors, "Duplicate \"%s\" attribute in %s group", ippGetName(attrptr), ippTagString(group)); cupsArrayAdd(a, (void *)ippGetName(attrptr)); } @@ -1363,35 +1646,44 @@ * values... */ - for (i = 0, status_ok = 0; i < data->num_statuses; i ++) + if (ippGetStatusCode(response) == IPP_STATUS_ERROR_BUSY && data->repeat_on_busy) { - if (data->statuses[i].if_defined && - !_ippVarsGet(vars, data->statuses[i].if_defined)) - continue; - - if (data->statuses[i].if_not_defined && - _ippVarsGet(vars, data->statuses[i].if_not_defined)) - continue; - - if (ippGetStatusCode(response) == data->statuses[i].status) + // Repeat on a server-error-busy status code... + status_ok = 1; + repeat_test = 1; + } + else + { + for (i = 0, status_ok = 0; i < data->num_statuses; i ++) { - status_ok = 1; - - if (data->statuses[i].repeat_match && repeat_count < data->statuses[i].repeat_limit) - repeat_test = 1; + if (data->statuses[i].if_defined && + !_ippVarsGet(data->vars, data->statuses[i].if_defined)) + continue; - if (data->statuses[i].define_match) - _ippVarsSet(vars, data->statuses[i].define_match, "1"); - } - else - { - if (data->statuses[i].repeat_no_match && repeat_count < data->statuses[i].repeat_limit) - repeat_test = 1; + if (data->statuses[i].if_not_defined && + _ippVarsGet(data->vars, data->statuses[i].if_not_defined)) + continue; - if (data->statuses[i].define_no_match) + if (ippGetStatusCode(response) == data->statuses[i].status) { - _ippVarsSet(vars, data->statuses[i].define_no_match, "1"); status_ok = 1; + + if (data->statuses[i].repeat_match && repeat_count < data->statuses[i].repeat_limit) + repeat_test = 1; + + if (data->statuses[i].define_match) + _ippVarsSet(data->vars, data->statuses[i].define_match, "1"); + } + else + { + if (data->statuses[i].repeat_no_match && repeat_count < data->statuses[i].repeat_limit) + repeat_test = 1; + + if (data->statuses[i].define_no_match) + { + _ippVarsSet(data->vars, data->statuses[i].define_no_match, "1"); + status_ok = 1; + } } } } @@ -1401,21 +1693,18 @@ for (i = 0; i < data->num_statuses; i ++) { if (data->statuses[i].if_defined && - !_ippVarsGet(vars, data->statuses[i].if_defined)) + !_ippVarsGet(data->vars, data->statuses[i].if_defined)) continue; if (data->statuses[i].if_not_defined && - _ippVarsGet(vars, data->statuses[i].if_not_defined)) + _ippVarsGet(data->vars, data->statuses[i].if_not_defined)) continue; if (!data->statuses[i].repeat_match || repeat_count >= data->statuses[i].repeat_limit) - add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)", - ippErrorString(data->statuses[i].status), - ippErrorString(cupsLastError())); + add_stringf(data->errors, "EXPECTED: STATUS %s (got %s)", ippErrorString(data->statuses[i].status), ippErrorString(cupsLastError())); } - if ((attrptr = ippFindAttribute(response, "status-message", - IPP_TAG_TEXT)) != NULL) + if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT)) != NULL) add_stringf(data->errors, "status-message=\"%s\"", ippGetString(attrptr, 0, NULL)); } @@ -1423,11 +1712,11 @@ { ipp_attribute_t *group_found; /* Found parent attribute for group tests */ - if (expect->if_defined && !_ippVarsGet(vars, expect->if_defined)) + if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined)) continue; if (expect->if_not_defined && - _ippVarsGet(vars, expect->if_not_defined)) + _ippVarsGet(data->vars, expect->if_not_defined)) continue; if ((found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL && expect->in_group && expect->in_group != ippGetGroupTag(found)) @@ -1455,11 +1744,12 @@ if ((found && expect->not_expect) || (!found && !(expect->not_expect || expect->optional)) || - (found && !expect_matches(expect, ippGetValueTag(found))) || - (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group)) + (found && !expect_matches(expect, found)) || + (group_found && expect->in_group && ippGetGroupTag(group_found) != expect->in_group) || + (expect->with_distinct && !with_distinct_values(NULL, found))) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { if (found && expect->not_expect && !expect->with_value && !expect->with_value_from) @@ -1468,7 +1758,7 @@ add_stringf(data->errors, "EXPECTED: %s", expect->name); else if (found) { - if (!expect_matches(expect, ippGetValueTag(found))) + if (!expect_matches(expect, found)) add_stringf(data->errors, "EXPECTED: %s OF-TYPE %s (got %s)", expect->name, expect->of_type, ippTagString(ippGetValueTag(found))); @@ -1477,6 +1767,9 @@ add_stringf(data->errors, "EXPECTED: %s IN-GROUP %s (got %s).", expect->name, ippTagString(expect->in_group), ippTagString(ippGetGroupTag(group_found))); + + if (expect->with_distinct) + with_distinct_values(data->errors, found); } } @@ -1491,7 +1784,7 @@ 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->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value && ((!expect->repeat_match && !expect->repeat_no_match) || repeat_count >= expect->repeat_limit)) { add_stringf(data->errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from); @@ -1507,11 +1800,11 @@ else if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer))) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value && !expect->repeat_match && (!expect->repeat_no_match || repeat_count >= expect->repeat_limit)) { - if (expect->with_flags & _CUPS_WITH_REGEX) + if (expect->with_flags & IPPTOOL_WITH_REGEX) add_stringf(data->errors, "EXPECTED: %s %s /%s/", expect->name, with_flags_string(expect->with_flags), expect->with_value); else add_stringf(data->errors, "EXPECTED: %s %s \"%s\"", expect->name, with_flags_string(expect->with_flags), expect->with_value); @@ -1529,11 +1822,10 @@ if (found && expect->count > 0 && ippGetCount(found) != expect->count) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { - add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name, - expect->count, ippGetCount(found)); + add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name, expect->count, ippGetCount(found)); } if (expect->repeat_no_match && @@ -1551,19 +1843,13 @@ if (!attrptr || ippGetCount(attrptr) != ippGetCount(found)) { if (expect->define_no_match) - _ippVarsSet(vars, expect->define_no_match, "1"); + _ippVarsSet(data->vars, expect->define_no_match, "1"); else if (!expect->define_match && !expect->define_value) { if (!attrptr) - add_stringf(data->errors, - "EXPECTED: %s (%d values) SAME-COUNT-AS %s " - "(not returned)", expect->name, - ippGetCount(found), expect->same_count_as); + add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (not returned)", expect->name, ippGetCount(found), expect->same_count_as); else if (ippGetCount(attrptr) != ippGetCount(found)) - add_stringf(data->errors, - "EXPECTED: %s (%d values) SAME-COUNT-AS %s " - "(%d values)", expect->name, ippGetCount(found), - expect->same_count_as, ippGetCount(attrptr)); + add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (%d values)", expect->name, ippGetCount(found), expect->same_count_as, ippGetCount(attrptr)); } if (expect->repeat_no_match && @@ -1574,8 +1860,11 @@ } } + if (found && expect->display_match && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))) + cupsFilePrintf(cupsFileStdout(), "\n%s\n\n", expect->display_match); + if (found && expect->define_match) - _ippVarsSet(vars, expect->define_match, "1"); + _ippVarsSet(data->vars, expect->define_match, "1"); if (found && expect->define_value) { @@ -1632,7 +1921,7 @@ } } - _ippVarsSet(vars, expect->define_value, buffer); + _ippVarsSet(data->vars, expect->define_value, buffer); } if (found && expect->repeat_match && @@ -1649,7 +1938,7 @@ if (repeat_test) { - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePrintf(cupsFileStdout(), "%04d]\n", repeat_count); \ @@ -1664,7 +1953,7 @@ { if (!strcmp(data->displayed[i], attrname)) { - print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); + print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL); break; } } @@ -1673,7 +1962,7 @@ } } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePrintf(cupsFileStdout(), " %-68.68s [", data->name); } @@ -1696,7 +1985,7 @@ else data->fail_count ++; - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Successful\n"); cupsFilePuts(data->outfile, data->prev_pass ? "\n" : "\n"); @@ -1712,7 +2001,7 @@ cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); } - else if (data->output == _CUPS_OUTPUT_IPPSERVER && response) + else if (data->output == IPPTOOL_OUTPUT_IPPSERVER && response) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) { @@ -1722,8 +2011,44 @@ print_ippserver_attr(data, attrptr, 0); } } + else if (data->output == IPPTOOL_OUTPUT_JSON && response) + { + ipp_tag_t cur_tag = IPP_TAG_ZERO, /* Current group tag */ + group_tag; /* Attribute's group tag */ + + cupsFilePuts(data->outfile, "[\n"); + attrptr = ippFirstAttribute(response); + while (attrptr) + { + group_tag = ippGetGroupTag(attrptr); + + if (group_tag && ippGetName(attrptr)) + { + if (group_tag != cur_tag) + { + if (cur_tag) + cupsFilePuts(data->outfile, " },\n"); + + cupsFilePrintf(data->outfile, " {\n \"group-tag\": \"%s\",\n", ippTagString(group_tag)); + cur_tag = group_tag; + } + + print_json_attr(data, attrptr, 8); + attrptr = ippNextAttribute(response); + cupsFilePuts(data->outfile, ippGetName(attrptr) && ippGetGroupTag(attrptr) == cur_tag ? ",\n" : "\n"); + } + else + { + attrptr = ippNextAttribute(response); + } + } + + if (cur_tag) + cupsFilePuts(data->outfile, " }\n"); + cupsFilePuts(data->outfile, "]\n"); + } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { cupsFilePuts(cupsFileStdout(), data->prev_pass ? "PASS]\n" : "FAIL]\n"); @@ -1735,14 +2060,14 @@ if (data->verbosity && response) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) - print_attr(cupsFileStdout(), _CUPS_OUTPUT_TEST, attrptr, NULL); + print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL); } } } - else if (!data->prev_pass && data->output != _CUPS_OUTPUT_QUIET) + else if (!data->prev_pass && data->output != IPPTOOL_OUTPUT_QUIET) fprintf(stderr, "%s\n", cupsLastErrorString()); - if (data->prev_pass && data->output >= _CUPS_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0) + if (data->prev_pass && data->output >= IPPTOOL_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0) { size_t width; /* Length of value */ @@ -1760,7 +2085,7 @@ } } - if (data->output == _CUPS_OUTPUT_CSV) + if (data->output == IPPTOOL_OUTPUT_CSV) print_csv(data, NULL, NULL, data->num_displayed, data->displayed, widths); else print_line(data, NULL, NULL, data->num_displayed, data->displayed, widths); @@ -1774,10 +2099,10 @@ if (attrptr) { - if (data->output == _CUPS_OUTPUT_CSV) - print_csv(data, response, attrptr, data->num_displayed, data->displayed, widths); + if (data->output == IPPTOOL_OUTPUT_CSV) + attrptr = print_csv(data, response, attrptr, data->num_displayed, data->displayed, widths); else - print_line(data, response, attrptr, data->num_displayed, data->displayed, widths); + attrptr = print_line(data, response, attrptr, data->num_displayed, data->displayed, widths); while (attrptr && ippGetGroupTag(attrptr) > IPP_TAG_OPERATION) attrptr = ippNextAttribute(response); @@ -1786,7 +2111,7 @@ } else if (!data->prev_pass) { - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { cupsFilePuts(data->outfile, "Errors\n"); cupsFilePuts(data->outfile, "\n"); @@ -1799,7 +2124,7 @@ cupsFilePuts(data->outfile, "\n"); } - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { for (error = (char *)cupsArrayFirst(data->errors); error; @@ -1808,7 +2133,7 @@ } } - if (data->num_displayed > 0 && !data->verbosity && response && (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout()))) + if (data->num_displayed > 0 && !data->verbosity && response && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))) { for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) { @@ -1828,7 +2153,13 @@ skip_error: - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->monitor_thread) + { + data->monitor_done = 1; + _cupsThreadWait(data->monitor_thread); + } + + if (data->output == IPPTOOL_OUTPUT_PLIST) cupsFilePuts(data->outfile, "\n"); ippDelete(response); @@ -1836,36 +2167,25 @@ for (i = 0; i < data->num_statuses; i ++) { - if (data->statuses[i].if_defined) - free(data->statuses[i].if_defined); - if (data->statuses[i].if_not_defined) - free(data->statuses[i].if_not_defined); - if (data->statuses[i].define_match) - free(data->statuses[i].define_match); - if (data->statuses[i].define_no_match) - free(data->statuses[i].define_no_match); + free(data->statuses[i].if_defined); + free(data->statuses[i].if_not_defined); + free(data->statuses[i].define_match); + free(data->statuses[i].define_no_match); } data->num_statuses = 0; for (i = data->num_expects, expect = data->expects; i > 0; i --, expect ++) { free(expect->name); - if (expect->of_type) - free(expect->of_type); - if (expect->same_count_as) - free(expect->same_count_as); - if (expect->if_defined) - free(expect->if_defined); - if (expect->if_not_defined) - free(expect->if_not_defined); - if (expect->with_value) - free(expect->with_value); - if (expect->define_match) - free(expect->define_match); - if (expect->define_no_match) - free(expect->define_no_match); - if (expect->define_value) - free(expect->define_value); + free(expect->of_type); + free(expect->same_count_as); + free(expect->if_defined); + free(expect->if_not_defined); + free(expect->with_value); + free(expect->define_match); + free(expect->define_no_match); + free(expect->define_value); + free(expect->display_match); } data->num_expects = 0; @@ -1873,6 +2193,24 @@ free(data->displayed[i]); data->num_displayed = 0; + free(data->monitor_uri); + data->monitor_uri = NULL; + + for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++) + { + free(expect->name); + free(expect->of_type); + free(expect->same_count_as); + free(expect->if_defined); + free(expect->if_not_defined); + free(expect->with_value); + free(expect->define_match); + free(expect->define_no_match); + free(expect->define_value); + free(expect->display_match); + } + data->num_monitor_expects = 0; + return (data->ignore_errors || data->prev_pass); } @@ -1882,9 +2220,8 @@ */ static int /* O - 1 on success, 0 on failure */ -do_tests(const char *testfile, /* I - Test file to use */ - _ipp_vars_t *vars, /* I - Variables */ - _cups_testdata_t *data) /* I - Test data */ +do_tests(const char *testfile, /* I - Test file to use */ + ipptool_test_t *data) /* I - Test data */ { http_encryption_t encryption; /* Encryption mode */ @@ -1893,14 +2230,14 @@ * Connect to the printer/server... */ - if (!_cups_strcasecmp(vars->scheme, "https") || !_cups_strcasecmp(vars->scheme, "ipps")) + if (!_cups_strcasecmp(data->vars->scheme, "https") || !_cups_strcasecmp(data->vars->scheme, "ipps") || data->vars->port == 443) encryption = HTTP_ENCRYPTION_ALWAYS; else encryption = data->encryption; - if ((data->http = httpConnect2(vars->host, vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL) + if ((data->http = httpConnect2(data->vars->host, data->vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL) { - print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", vars->host, vars->port, cupsLastErrorString()); + print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", data->vars->host, data->vars->port, cupsLastErrorString()); return (0); } @@ -1917,7 +2254,7 @@ * Run tests... */ - _ippFileParse(vars, testfile, (void *)data); + _ippFileParse(data->vars, testfile, (void *)data); /* * Close connection and return... @@ -1936,7 +2273,7 @@ static int /* O - 1 to continue, 0 to stop */ error_cb(_ipp_file_t *f, /* I - IPP file data */ - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ const char *error) /* I - Error message */ { (void)f; @@ -1953,13 +2290,18 @@ static int /* O - 1 if matches, 0 otherwise */ expect_matches( - _cups_expect_t *expect, /* I - Expected attribute */ - ipp_tag_t value_tag) /* I - Value tag for attribute */ + ipptool_expect_t *expect, /* I - Expected attribute */ + ipp_attribute_t *attr) /* I - Attribute */ { - int match; /* Match? */ - char *of_type, /* Type name to match */ - *next, /* Next name to match */ - sep; /* Separator character */ + int i, /* Looping var */ + count, /* Number of values */ + match; /* Match? */ + char *of_type, /* Type name to match */ + *paren, /* Pointer to opening parenthesis */ + *next, /* Next name to match */ + sep; /* Separator character */ + ipp_tag_t value_tag; /* Syntax/value tag */ + int lower, upper; /* Lower and upper bounds for syntax */ /* @@ -1974,6 +2316,9 @@ * types separated by "," or "|"... */ + value_tag = ippGetValueTag(attr); + count = ippGetCount(attr); + for (of_type = expect->of_type, match = 0; !match && *of_type; of_type = next) { /* @@ -1989,19 +2334,154 @@ * Support some meta-types to make it easier to write the test file. */ + if ((paren = strchr(of_type, '(')) != NULL) + { + char *ptr; // Pointer into syntax string + + *paren = '\0'; + + if (!strncmp(paren + 1, "MIN:", 4)) + { + lower = INT_MIN; + ptr = paren + 5; + } + else if ((ptr = strchr(paren + 1, ':')) != NULL) + { + lower = atoi(paren + 1); + } + else + { + lower = 0; + ptr = paren + 1; + } + + if (!strcmp(ptr, "MAX)")) + upper = INT_MAX; + else + upper = atoi(ptr); + } + else + { + lower = INT_MIN; + upper = INT_MAX; + } + if (!strcmp(of_type, "text")) - match = value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT; + { + if (upper == INT_MAX) + upper = 1023; + + if (value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_TEXT) + { + for (i = 0; i < count; i ++) + { + if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper) + break; + } + + match = (i == count); + } + } else if (!strcmp(of_type, "name")) - match = value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME; + { + if (upper == INT_MAX) + upper = 255; + + if (value_tag == IPP_TAG_NAMELANG || value_tag == IPP_TAG_NAME) + { + for (i = 0; i < count; i ++) + { + if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper) + break; + } + + match = (i == count); + } + } else if (!strcmp(of_type, "collection")) + { match = value_tag == IPP_TAG_BEGIN_COLLECTION; - else - match = value_tag == ippTagValue(of_type); + } + else if (value_tag == ippTagValue(of_type)) + { + switch (value_tag) + { + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + if (upper == INT_MAX) + { + if (value_tag == IPP_TAG_KEYWORD) + upper = 255; + else + upper = 1023; + } + + for (i = 0; i < count; i ++) + { + if (strlen(ippGetString(attr, i, NULL)) > (size_t)upper) + break; + } + + match = (i == count); + break; + + case IPP_TAG_STRING : + if (upper == INT_MAX) + upper = 1023; + + for (i = 0; i < count; i ++) + { + int datalen; // Length of octetString value + + ippGetOctetString(attr, i, &datalen); + + if (datalen > upper) + break; + } + + match = (i == count); + break; + + case IPP_TAG_INTEGER : + for (i = 0; i < count; i ++) + { + int value = ippGetInteger(attr, i); + // Integer value + + if (value < lower || value > upper) + break; + } + + match = (i == count); + break; + + case IPP_TAG_RANGE : + for (i = 0; i < count; i ++) + { + int vupper, vlower = ippGetRange(attr, i, &vupper); + // Range value + + if (vlower < lower || vlower > upper || vupper < lower || vupper > upper) + break; + } + + match = (i == count); + break; + + default : + // No other constraints, so this is a match + match = 1; + break; + } + } /* - * Restore the separator if we have one... + * Restore the separators if we have them... */ + if (paren) + *paren = '('; + if (sep) *next++ = sep; } @@ -2104,7 +2584,7 @@ value = ippGetString(attr, element, NULL); - if (flags & _CUPS_WITH_HOSTNAME) + if (flags & IPPTOOL_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'; @@ -2115,14 +2595,14 @@ return (buffer); } - else if (flags & _CUPS_WITH_RESOURCE) + else if (flags & IPPTOOL_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) + else if (flags & IPPTOOL_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'; @@ -2165,19 +2645,19 @@ */ static void -init_data(_cups_testdata_t *data) /* I - Data */ +init_data(ipptool_test_t *data) /* I - Data */ { - memset(data, 0, sizeof(_cups_testdata_t)); + memset(data, 0, sizeof(ipptool_test_t)); - data->output = _CUPS_OUTPUT_LIST; + data->output = IPPTOOL_OUTPUT_LIST; data->outfile = cupsFileStdout(); data->family = AF_UNSPEC; - data->def_transfer = _CUPS_TRANSFER_AUTO; + data->def_transfer = IPPTOOL_TRANSFER_AUTO; data->def_version = 11; data->errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); data->pass = 1; data->prev_pass = 1; - data->request_id = (CUPS_RAND() % 1000) * 137 + 1; + data->request_id = (CUPS_RAND() % 1000) * 137; data->show_header = 1; } @@ -2207,6 +2687,442 @@ /* + * 'parse_monitor_printer_state()' - Parse the MONITOR-PRINTER-STATE directive. + * + * MONITOR-PRINTER-STATE [printer-uri] { + * DELAY nnn + * EXPECT attribute-name ... + * } + */ + +static int /* O - 1 to continue, 0 to stop */ +parse_monitor_printer_state( + _ipp_file_t *f, /* I - IPP file data */ + ipptool_test_t *data) /* I - Test data */ +{ + char token[256], /* Token string */ + name[1024], /* Name string */ + temp[1024], /* Temporary string */ + value[1024], /* Value string */ + *ptr; /* Pointer into value */ + + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing printer URI on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (strcmp(temp, "{")) + { + // Got a printer URI so copy it... + _ippVarsExpand(data->vars, value, temp, sizeof(value)); + data->monitor_uri = strdup(value); + + // Then see if we have an opening brace... + if (!_ippFileReadToken(f, temp, sizeof(temp)) || strcmp(temp, "{")) + { + print_fatal_error(data, "Missing opening brace on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else + { + // Use the default printer URI... + data->monitor_uri = strdup(data->vars->uri); + } + + // Loop until we get a closing brace... + while (_ippFileReadToken(f, token, sizeof(token))) + { + if (_cups_strcasecmp(token, "COUNT") && + _cups_strcasecmp(token, "DEFINE-MATCH") && + _cups_strcasecmp(token, "DEFINE-NO-MATCH") && + _cups_strcasecmp(token, "DEFINE-VALUE") && + _cups_strcasecmp(token, "DISPLAY-MATCH") && + _cups_strcasecmp(token, "IF-DEFINED") && + _cups_strcasecmp(token, "IF-NOT-DEFINED") && + _cups_strcasecmp(token, "IN-GROUP") && + _cups_strcasecmp(token, "OF-TYPE") && + _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") && + _cups_strcasecmp(token, "WITH-VALUE")) + data->last_expect = NULL; + + if (!strcmp(token, "}")) + return (1); + else if (!_cups_strcasecmp(token, "EXPECT")) + { + /* + * Expected attributes... + */ + + if (data->num_monitor_expects >= (int)(sizeof(data->monitor_expects) / sizeof(data->monitor_expects[0]))) + { + print_fatal_error(data, "Too many EXPECT's on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (!_ippFileReadToken(f, name, sizeof(name))) + { + print_fatal_error(data, "Missing EXPECT name on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + data->last_expect = data->monitor_expects + data->num_monitor_expects; + data->num_monitor_expects ++; + + memset(data->last_expect, 0, sizeof(ipptool_expect_t)); + data->last_expect->repeat_limit = 1000; + + if (name[0] == '!') + { + data->last_expect->not_expect = 1; + data->last_expect->name = strdup(name + 1); + } + else if (name[0] == '?') + { + data->last_expect->optional = 1; + data->last_expect->name = strdup(name + 1); + } + else + data->last_expect->name = strdup(name); + } + else if (!_cups_strcasecmp(token, "COUNT")) + { + int count; /* Count value */ + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing COUNT number on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if ((count = atoi(temp)) <= 0) + { + print_fatal_error(data, "Bad COUNT \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->count = count; + } + else + { + print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DEFINE-MATCH")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->define_match = strdup(temp); + } + else + { + print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DEFINE-NO-MATCH")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->define_no_match = strdup(temp); + } + else + { + print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DEFINE-VALUE")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->define_value = strdup(temp); + } + else + { + print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DISPLAY-MATCH")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DISPLAY-MATCH message on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->display_match = strdup(temp); + } + else + { + print_fatal_error(data, "DISPLAY-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "DELAY")) + { + /* + * Delay before operation... + */ + + double dval; /* Delay value */ + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DELAY value on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + _ippVarsExpand(data->vars, value, temp, sizeof(value)); + + if ((dval = _cupsStrScand(value, &ptr, localeconv())) < 0.0 || (*ptr && *ptr != ',')) + { + print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); + return (0); + } + + data->monitor_delay = (useconds_t)(1000000.0 * dval); + + if (*ptr == ',') + { + if ((dval = _cupsStrScand(ptr + 1, &ptr, localeconv())) <= 0.0 || *ptr) + { + print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); + return (0); + } + + data->monitor_interval = (useconds_t)(1000000.0 * dval); + } + else + data->monitor_interval = data->monitor_delay; + } + else if (!_cups_strcasecmp(token, "OF-TYPE")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->of_type = strdup(temp); + } + else + { + print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "IN-GROUP")) + { + ipp_tag_t in_group; /* IN-GROUP value */ + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing IN-GROUP group tag on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if ((in_group = ippTagValue(temp)) == IPP_TAG_ZERO || in_group >= IPP_TAG_UNSUPPORTED_VALUE) + { + print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); + return (0); + } + else if (data->last_expect) + { + data->last_expect->in_group = in_group; + } + else + { + print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "IF-DEFINED")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing IF-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->if_defined = strdup(temp); + } + else + { + print_fatal_error(data, "IF-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "IF-NOT-DEFINED")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->if_not_defined = strdup(temp); + } + else + { + print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES")) + { + if (data->last_expect) + { + data->last_expect->with_distinct = 1; + } + else + { + print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); + return (0); + } + } + else if (!_cups_strcasecmp(token, "WITH-VALUE")) + { + off_t lastpos; /* Last file position */ + int lastline; /* Last line number */ + + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename); + return (0); + } + + /* + * Read additional comma-delimited values - needed since legacy test files + * will have unquoted WITH-VALUE values with commas... + */ + + ptr = temp + strlen(temp); + + for (;;) + { + lastpos = cupsFileTell(f->fp); + lastline = f->linenum; + ptr += strlen(ptr); + + if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) + break; + + if (!strcmp(ptr, ",")) + { + /* + * Append a value... + */ + + ptr += strlen(ptr); + + if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) + break; + } + else + { + /* + * Not another value, stop here... + */ + + cupsFileSeek(f->fp, lastpos); + f->linenum = lastline; + *ptr = '\0'; + break; + } + } + + if (data->last_expect) + { + /* + * Expand any variables in the value and then save it. + */ + + _ippVarsExpand(data->vars, value, temp, sizeof(value)); + + ptr = value + strlen(value) - 1; + + if (value[0] == '/' && ptr > value && *ptr == '/') + { + /* + * WITH-VALUE is a POSIX extended regular expression. + */ + + data->last_expect->with_value = calloc(1, (size_t)(ptr - value)); + data->last_expect->with_flags |= IPPTOOL_WITH_REGEX; + + if (data->last_expect->with_value) + memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1)); + } + else + { + /* + * WITH-VALUE is a literal value... + */ + + for (ptr = value; *ptr; ptr ++) + { + if (*ptr == '\\' && ptr[1]) + { + /* + * Remove \ from \foo... + */ + + _cups_strcpy(ptr, ptr + 1); + } + } + + data->last_expect->with_value = strdup(value); + data->last_expect->with_flags |= IPPTOOL_WITH_LITERAL; + } + } + else + { + print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); + return (0); + } + } + } + + print_fatal_error(data, "Missing closing brace on line %d of \"%s\".", f->linenum, f->filename); + + return (0); +} + + +/* * 'pause_message()' - Display the message and pause until the user presses a key. */ @@ -2267,7 +3183,7 @@ * Display the prompt... */ - cupsFilePrintf(cupsFileStdout(), "%s\n---- PRESS ANY KEY ----", message); + cupsFilePrintf(cupsFileStdout(), "\n%s\n\n---- PRESS ANY KEY ----", message); #ifdef _WIN32 /* @@ -2310,17 +3226,17 @@ */ static void -print_attr(cups_file_t *outfile, /* I - Output file */ - _cups_output_t output, /* I - Output format */ - ipp_attribute_t *attr, /* I - Attribute to print */ - ipp_tag_t *group) /* IO - Current group */ +print_attr(cups_file_t *outfile, /* I - Output file */ + ipptool_output_t output, /* I - Output format */ + ipp_attribute_t *attr, /* I - Attribute to print */ + ipp_tag_t *group) /* IO - Current group */ { int i, /* Looping var */ count; /* Number of values */ ipp_attribute_t *colattr; /* Collection attribute */ - if (output == _CUPS_OUTPUT_PLIST) + if (output == IPPTOOL_OUTPUT_PLIST) { if (!ippGetName(attr) || (group && *group != ippGetGroupTag(attr))) { @@ -2446,7 +3362,7 @@ { char buffer[131072]; /* Value buffer */ - if (output == _CUPS_OUTPUT_TEST) + if (output == IPPTOOL_OUTPUT_TEST) { if (!ippGetName(attr)) { @@ -2467,21 +3383,20 @@ * 'print_csv()' - Print a line of CSV text. */ -static void +static ipp_attribute_t * /* O - Next attribute */ print_csv( - _cups_testdata_t *data, /* I - Test data */ - ipp_t *ipp, /* I - Response message */ - ipp_attribute_t *attr, /* I - First attribute for line */ - int num_displayed, /* I - Number of attributes to display */ - char **displayed, /* I - Attributes to display */ - size_t *widths) /* I - Column widths */ + ipptool_test_t *data, /* I - Test data */ + ipp_t *ipp, /* I - Response message */ + ipp_attribute_t *attr, /* I - First attribute for line */ + int num_displayed, /* I - Number of attributes to display */ + char **displayed, /* I - Attributes to display */ + size_t *widths) /* I - Column widths */ { int i; /* Looping var */ size_t maxlength; /* Max length of all columns */ - char *buffer, /* String buffer */ - *bufptr; /* Pointer into buffer */ - ipp_attribute_t *current; /* Current attribute */ - + ipp_attribute_t *current = attr; /* Current attribute */ + char *values[MAX_DISPLAY], /* Strings to display */ + *valptr; /* Pointer into value */ /* * Get the maximum string length we have to show and allocate... @@ -2493,63 +3408,76 @@ maxlength += 2; - if ((buffer = malloc(maxlength)) == NULL) - return; - /* * Loop through the attributes to display... */ if (attr) { - for (i = 0; i < num_displayed; i ++) - { - if (i) - cupsFilePutChar(data->outfile, ','); + // Collect the values... + memset(values, 0, sizeof(values)); - buffer[0] = '\0'; + for (; current; current = ippNextAttribute(ipp)) + { + if (!ippGetName(current)) + break; - for (current = attr; current; current = ippNextAttribute(ipp)) + for (i = 0; i < num_displayed; i ++) { - if (!ippGetName(current)) - break; - else if (!strcmp(ippGetName(current), displayed[i])) + if (!strcmp(ippGetName(current), displayed[i])) { - ippAttributeString(current, buffer, maxlength); + if ((values[i] = (char *)calloc(1, maxlength)) != NULL) + ippAttributeString(current, values[i], maxlength); break; - } + } } + } + + // Output the line... + for (i = 0; i < num_displayed; i ++) + { + if (i) + cupsFilePutChar(data->outfile, ','); - if (strchr(buffer, ',') != NULL || strchr(buffer, '\"') != NULL || - strchr(buffer, '\\') != NULL) + if (!values[i]) + continue; + + if (strchr(values[i], ',') != NULL || strchr(values[i], '\"') != NULL || strchr(values[i], '\\') != NULL) { - cupsFilePutChar(cupsFileStdout(), '\"'); - for (bufptr = buffer; *bufptr; bufptr ++) + // Quoted value... + cupsFilePutChar(data->outfile, '\"'); + for (valptr = values[i]; *valptr; valptr ++) { - if (*bufptr == '\\' || *bufptr == '\"') - cupsFilePutChar(cupsFileStdout(), '\\'); - cupsFilePutChar(cupsFileStdout(), *bufptr); + if (*valptr == '\\' || *valptr == '\"') + cupsFilePutChar(data->outfile, '\\'); + cupsFilePutChar(data->outfile, *valptr); } - cupsFilePutChar(cupsFileStdout(), '\"'); + cupsFilePutChar(data->outfile, '\"'); } else - cupsFilePuts(data->outfile, buffer); + { + // Unquoted value... + cupsFilePuts(data->outfile, values[i]); + } + + free(values[i]); } - cupsFilePutChar(cupsFileStdout(), '\n'); + cupsFilePutChar(data->outfile, '\n'); } else { + // Show column headings... for (i = 0; i < num_displayed; i ++) { if (i) - cupsFilePutChar(cupsFileStdout(), ','); + cupsFilePutChar(data->outfile, ','); cupsFilePuts(data->outfile, displayed[i]); } - cupsFilePutChar(cupsFileStdout(), '\n'); + cupsFilePutChar(data->outfile, '\n'); } - free(buffer); + return (current); } @@ -2559,7 +3487,7 @@ static void print_fatal_error( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ const char *s, /* I - Printf-style format string */ ...) /* I - Additional arguments as needed */ { @@ -2579,7 +3507,7 @@ * Then output it... */ - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) { print_xml_header(data); print_xml_trailer(data, 0, buffer); @@ -2595,7 +3523,7 @@ static void print_ippserver_attr( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ ipp_attribute_t *attr, /* I - Attribute to print */ int indent) /* I - Indentation level */ { @@ -2706,14 +3634,14 @@ static void print_ippserver_string( - _cups_testdata_t *data, /* I - Test data */ - const char *s, /* I - String to print */ - size_t len) /* I - Length of string */ + ipptool_test_t *data, /* I - Test data */ + const char *s, /* I - String to print */ + size_t len) /* I - Length of string */ { cupsFilePutChar(data->outfile, '\"'); while (len > 0) { - if (*s == '\"') + if (*s == '\"' || *s == '\\') cupsFilePutChar(data->outfile, '\\'); cupsFilePutChar(data->outfile, *s); @@ -2725,12 +3653,277 @@ /* - * 'print_line()' - Print a line of formatted or CSV text. + * 'print_json_attr()' - Print an attribute in JSON format. */ static void +print_json_attr( + ipptool_test_t *data, /* I - Test data */ + ipp_attribute_t *attr, /* I - IPP attribute */ + int indent) /* I - Indentation */ +{ + const char *name = ippGetName(attr); + /* Name of attribute */ + int i, /* Looping var */ + count = ippGetCount(attr); + /* Number of values */ + ipp_attribute_t *colattr; /* Collection attribute */ + + + cupsFilePrintf(data->outfile, "%*s", indent, ""); + print_json_string(data, name, strlen(name)); + + switch (ippGetValueTag(attr)) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + if (count == 1) + { + cupsFilePrintf(data->outfile, ": %d", ippGetInteger(attr, 0)); + } + else + { + cupsFilePuts(data->outfile, ": [\n"); + for (i = 0; i < count; i ++) + cupsFilePrintf(data->outfile, "%*s%d%s", indent + 4, "", ippGetInteger(attr, i), (i + 1) < count ? ",\n" : "\n"); + cupsFilePrintf(data->outfile, "%*s]", indent, ""); + } + break; + + case IPP_TAG_BOOLEAN : + if (count == 1) + { + cupsFilePrintf(data->outfile, ": %s", ippGetBoolean(attr, 0) ? "true" : "false"); + } + else + { + cupsFilePuts(data->outfile, ": [\n"); + for (i = 0; i < count; i ++) + cupsFilePrintf(data->outfile, "%*s%s%s", indent + 4, "", ippGetBoolean(attr, i) ? "true" : "false", (i + 1) < count ? ",\n" : "\n"); + cupsFilePrintf(data->outfile, "%*s]", indent, ""); + } + break; + + case IPP_TAG_RANGE : + if (count == 1) + { + int upper, lower = ippGetRange(attr, 0, &upper); + + cupsFilePrintf(data->outfile, ": {\n%*s\"lower\": %d,\n%*s\"upper\":%d\n%*s}", indent + 4, "", lower, indent + 4, "", upper, indent, ""); + } + else + { + cupsFilePuts(data->outfile, ": [\n"); + for (i = 0; i < count; i ++) + { + int upper, lower = ippGetRange(attr, i, &upper); + + cupsFilePrintf(data->outfile, "%*s{\n%*s\"lower\": %d,\n%*s\"upper\":%d\n%*s},\n", indent + 4, "", indent + 8, "", lower, indent + 8, "", upper, indent + 4, ""); + } + cupsFilePrintf(data->outfile, "%*s]", indent, ""); + } + break; + + case IPP_TAG_RESOLUTION : + if (count == 1) + { + ipp_res_t units; + int yres, xres = ippGetResolution(attr, 0, &yres, &units); + + cupsFilePrintf(data->outfile, ": {\n%*s\"units\": \"%s\",\n%*s\"xres\": %d,\n%*s\"yres\":%d\n%*s}", indent + 4, "", units == IPP_RES_PER_INCH ? "dpi" : "dpcm", indent + 4, "", xres, indent + 4, "", yres, indent, ""); + } + else + { + cupsFilePuts(data->outfile, ": [\n"); + for (i = 0; i < count; i ++) + { + ipp_res_t units; + int yres, xres = ippGetResolution(attr, i, &yres, &units); + + cupsFilePrintf(data->outfile, "%*s{\n%*s\"units\": \"%s\",\n%*s\"xres\": %d,\n%*s\"yres\":%d\n%*s},\n", indent + 4, "", indent + 8, "", units == IPP_RES_PER_INCH ? "dpi" : "dpcm", indent + 8, "", xres, indent + 8, "", yres, indent + 4, ""); + } + cupsFilePrintf(data->outfile, "%*s]", indent, ""); + } + break; + + case IPP_TAG_DATE : + if (count == 1) + { + cupsFilePrintf(data->outfile, ": \"%s\"", iso_date(ippGetDate(attr, 0))); + } + else + { + cupsFilePuts(data->outfile, ": [\n"); + for (i = 0; i < count; i ++) + cupsFilePrintf(data->outfile, "%*s\"%s\"%s", indent + 4, "", iso_date(ippGetDate(attr, i)), (i + 1) < count ? ",\n" : "\n"); + cupsFilePrintf(data->outfile, "%*s]", indent, ""); + } + break; + + case IPP_TAG_STRING : + if (count == 1) + { + int len; + const char *s = (const char *)ippGetOctetString(attr, 0, &len); + + cupsFilePuts(data->outfile, ": \""); + while (len > 0) + { + cupsFilePrintf(data->outfile, "%02X", *s++ & 255); + len --; + } + cupsFilePuts(data->outfile, "\""); + } + else + { + cupsFilePuts(data->outfile, ": [\n"); + for (i = 0; i < count; i ++) + { + int len; + const char *s = (const char *)ippGetOctetString(attr, i, &len); + + cupsFilePrintf(data->outfile, "%*s\"", indent + 4, ""); + while (len > 0) + { + cupsFilePrintf(data->outfile, "%02X", *s++ & 255); + len --; + } + cupsFilePuts(data->outfile, (i + 1) < count ? "\",\n" : "\"\n"); + } + cupsFilePrintf(data->outfile, "%*s]", indent, ""); + } + break; + + case IPP_TAG_TEXT : + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAME : + case IPP_TAG_NAMELANG : + 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 (count == 1) + { + const char *s = ippGetString(attr, 0, NULL); + + cupsFilePuts(data->outfile, ": "); + print_json_string(data, s, strlen(s)); + } + else + { + cupsFilePuts(data->outfile, ": [\n"); + for (i = 0; i < count; i ++) + { + const char *s = ippGetString(attr, i, NULL); + + cupsFilePrintf(data->outfile, "%*s", indent + 4, ""); + print_json_string(data, s, strlen(s)); + cupsFilePuts(data->outfile, (i + 1) < count ? ",\n" : "\n"); + } + cupsFilePrintf(data->outfile, "%*s]", indent, ""); + } + break; + + case IPP_TAG_BEGIN_COLLECTION : + if (count == 1) + { + ipp_t *col = ippGetCollection(attr, 0); + + cupsFilePuts(data->outfile, ": {\n"); + colattr = ippFirstAttribute(col); + while (colattr) + { + print_json_attr(data, colattr, indent + 4); + colattr = ippNextAttribute(col); + cupsFilePuts(data->outfile, colattr ? ",\n" : "\n"); + } + cupsFilePrintf(data->outfile, "%*s}", indent, ""); + } + else + { + cupsFilePuts(data->outfile, ": [\n"); + for (i = 0; i < count; i ++) + { + ipp_t *col = ippGetCollection(attr, i); + + cupsFilePrintf(data->outfile, "%*s{\n", indent + 4, ""); + colattr = ippFirstAttribute(col); + while (colattr) + { + print_json_attr(data, colattr, indent + 8); + colattr = ippNextAttribute(col); + cupsFilePuts(data->outfile, colattr ? ",\n" : "\n"); + } + cupsFilePrintf(data->outfile, "%*s}%s", indent + 4, "", (i + 1) < count ? ",\n" : "\n"); + } + cupsFilePrintf(data->outfile, "%*s]", indent, ""); + } + break; + + default : + /* Out-of-band value */ + break; + } +} + + +/* + * 'print_json_string()' - Print a string in JSON format. + */ + +static void +print_json_string( + ipptool_test_t *data, /* I - Test data */ + const char *s, /* I - String to print */ + size_t len) /* I - Length of string */ +{ + cupsFilePutChar(data->outfile, '\"'); + while (len > 0) + { + switch (*s) + { + case '\"' : + case '\\' : + cupsFilePutChar(data->outfile, '\\'); + cupsFilePutChar(data->outfile, *s); + break; + + case '\n' : + cupsFilePuts(data->outfile, "\\n"); + break; + + case '\r' : + cupsFilePuts(data->outfile, "\\r"); + break; + + case '\t' : + cupsFilePuts(data->outfile, "\\t"); + break; + + default : + if (*s < ' ' && *s >= 0) + cupsFilePrintf(data->outfile, "\\%03o", *s); + else + cupsFilePutChar(data->outfile, *s); + break; + } + + s ++; + len --; + } + cupsFilePutChar(data->outfile, '\"'); +} + + +/* + * 'print_line()' - Print a line of formatted or CSV text. + */ + +static ipp_attribute_t * /* O - Next attribute */ print_line( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ ipp_t *ipp, /* I - Response message */ ipp_attribute_t *attr, /* I - First attribute for line */ int num_displayed, /* I - Number of attributes to display */ @@ -2739,8 +3932,8 @@ { int i; /* Looping var */ size_t maxlength; /* Max length of all columns */ - char *buffer; /* String buffer */ - ipp_attribute_t *current; /* Current attribute */ + ipp_attribute_t *current = attr; /* Current attribute */ + char *values[MAX_DISPLAY]; /* Strings to display */ /* @@ -2753,61 +3946,74 @@ maxlength += 2; - if ((buffer = malloc(maxlength)) == NULL) - return; - /* * Loop through the attributes to display... */ if (attr) { - for (i = 0; i < num_displayed; i ++) - { - if (i) - cupsFilePutChar(cupsFileStdout(), ' '); + // Collect the values... + memset(values, 0, sizeof(values)); - buffer[0] = '\0'; + for (; current; current = ippNextAttribute(ipp)) + { + if (!ippGetName(current)) + break; - for (current = attr; current; current = ippNextAttribute(ipp)) + for (i = 0; i < num_displayed; i ++) { - if (!ippGetName(current)) - break; - else if (!strcmp(ippGetName(current), displayed[i])) + if (!strcmp(ippGetName(current), displayed[i])) { - ippAttributeString(current, buffer, maxlength); + if ((values[i] = (char *)calloc(1, maxlength)) != NULL) + ippAttributeString(current, values[i], maxlength); break; - } + } } + } - cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], buffer); + // Output the line... + for (i = 0; i < num_displayed; i ++) + { + if (i) + cupsFilePutChar(data->outfile, ' '); + + cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], values[i] ? values[i] : ""); + free(values[i]); } - cupsFilePutChar(cupsFileStdout(), '\n'); + cupsFilePutChar(data->outfile, '\n'); } else { + // Show column headings... + char *buffer = (char *)malloc(maxlength); + // Buffer for separator lines + + if (!buffer) + return (current); + for (i = 0; i < num_displayed; i ++) { if (i) - cupsFilePutChar(cupsFileStdout(), ' '); + cupsFilePutChar(data->outfile, ' '); cupsFilePrintf(data->outfile, "%*s", (int)-widths[i], displayed[i]); } - cupsFilePutChar(cupsFileStdout(), '\n'); + cupsFilePutChar(data->outfile, '\n'); for (i = 0; i < num_displayed; i ++) { if (i) - cupsFilePutChar(cupsFileStdout(), ' '); + cupsFilePutChar(data->outfile, ' '); memset(buffer, '-', widths[i]); buffer[widths[i]] = '\0'; cupsFilePuts(data->outfile, buffer); } - cupsFilePutChar(cupsFileStdout(), '\n'); + cupsFilePutChar(data->outfile, '\n'); + free(buffer); } - free(buffer); + return (current); } @@ -2816,7 +4022,7 @@ */ static void -print_xml_header(_cups_testdata_t *data)/* I - Test data */ +print_xml_header(ipptool_test_t *data)/* I - Test data */ { if (!data->xml_header) { @@ -2827,7 +4033,7 @@ cupsFilePuts(data->outfile, "ipptoolVersion\n"); cupsFilePuts(data->outfile, "" CUPS_SVERSION "\n"); cupsFilePuts(data->outfile, "Transfer\n"); - cupsFilePrintf(data->outfile, "%s\n", data->transfer == _CUPS_TRANSFER_AUTO ? "auto" : data->transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length"); + cupsFilePrintf(data->outfile, "%s\n", data->transfer == IPPTOOL_TRANSFER_AUTO ? "auto" : data->transfer == IPPTOOL_TRANSFER_CHUNKED ? "chunked" : "length"); cupsFilePuts(data->outfile, "Tests\n"); cupsFilePuts(data->outfile, "\n"); @@ -2936,7 +4142,7 @@ static void print_xml_trailer( - _cups_testdata_t *data, /* I - Test data */ + ipptool_test_t *data, /* I - Test data */ int success, /* I - 1 on success, 0 on failure */ const char *message) /* I - Error message or NULL */ { @@ -3018,10 +4224,10 @@ */ static int /* O - 1 to continue, 0 to stop */ -token_cb(_ipp_file_t *f, /* I - IPP file data */ - _ipp_vars_t *vars, /* I - IPP variables */ - _cups_testdata_t *data, /* I - Test data */ - const char *token) /* I - Current token */ +token_cb(_ipp_file_t *f, /* I - IPP file data */ + _ipp_vars_t *vars, /* I - IPP variables */ + ipptool_test_t *data, /* I - Test data */ + const char *token) /* I - Current token */ { char name[1024], /* Name string */ temp[1024], /* Temporary string */ @@ -3047,6 +4253,7 @@ _cups_strcasecmp(token, "DEFINE-MATCH") && _cups_strcasecmp(token, "DEFINE-NO-MATCH") && _cups_strcasecmp(token, "DEFINE-VALUE") && + _cups_strcasecmp(token, "DISPLAY-MATCH") && _cups_strcasecmp(token, "IF-DEFINED") && _cups_strcasecmp(token, "IF-NOT-DEFINED") && _cups_strcasecmp(token, "IN-GROUP") && @@ -3059,6 +4266,7 @@ _cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") && _cups_strcasecmp(token, "WITH-ALL-RESOURCES") && _cups_strcasecmp(token, "WITH-ALL-SCHEMES") && + _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") && _cups_strcasecmp(token, "WITH-HOSTNAME") && _cups_strcasecmp(token, "WITH-RESOURCE") && _cups_strcasecmp(token, "WITH-SCHEME") && @@ -3077,7 +4285,17 @@ if (!strcmp(token, "}")) { - return (do_test(f, vars, data)); + return (do_test(f, data)); + } + else if (!strcmp(token, "MONITOR-PRINTER-STATE")) + { + if (data->monitor_uri) + { + print_fatal_error(data, "Extra MONITOR-PRINTER-STATE seen on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + return (parse_monitor_printer_state(f, data)); } else if (!strcmp(token, "COMPRESSION")) { @@ -3150,8 +4368,15 @@ * Name of test... */ - _ippFileReadToken(f, temp, sizeof(temp)); - _ippVarsExpand(vars, data->name, temp, sizeof(data->name)); + if (_ippFileReadToken(f, temp, sizeof(temp))) + { + _ippVarsExpand(vars, data->name, temp, sizeof(data->name)); + } + else + { + print_fatal_error(data, "Missing NAME string on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } } else if (!_cups_strcasecmp(token, "PAUSE")) { @@ -3180,11 +4405,11 @@ { if (isdigit(temp[0] & 255)) { - data->request_id = atoi(temp); + data->request_id = atoi(temp) - 1; } else if (!_cups_strcasecmp(temp, "random")) { - data->request_id = (CUPS_RAND() % 1000) * 137 + 1; + data->request_id = (CUPS_RAND() % 1000) * 137; } else { @@ -3198,6 +4423,40 @@ return (0); } } + else if (!strcmp(token, "PASS-IF-DEFINED")) + { + /* + * PASS-IF-DEFINED variable + */ + + if (_ippFileReadToken(f, name, sizeof(name))) + { + if (_ippVarsGet(vars, name)) + data->pass_test = 1; + } + else + { + print_fatal_error(data, "Missing PASS-IF-DEFINED value on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } + else if (!strcmp(token, "PASS-IF-NOT-DEFINED")) + { + /* + * PASS-IF-NOT-DEFINED variable + */ + + if (_ippFileReadToken(f, name, sizeof(name))) + { + if (!_ippVarsGet(vars, name)) + data->pass_test = 1; + } + else + { + print_fatal_error(data, "Missing PASS-IF-NOT-DEFINED value on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } else if (!strcmp(token, "SKIP-IF-DEFINED")) { /* @@ -3299,15 +4558,15 @@ { if (!strcmp(temp, "auto")) { - data->transfer = _CUPS_TRANSFER_AUTO; + data->transfer = IPPTOOL_TRANSFER_AUTO; } else if (!strcmp(temp, "chunked")) { - data->transfer = _CUPS_TRANSFER_CHUNKED; + data->transfer = IPPTOOL_TRANSFER_CHUNKED; } else if (!strcmp(temp, "length")) { - data->transfer = _CUPS_TRANSFER_LENGTH; + data->transfer = IPPTOOL_TRANSFER_LENGTH; } else { @@ -3538,7 +4797,7 @@ data->last_expect = data->expects + data->num_expects; data->num_expects ++; - memset(data->last_expect, 0, sizeof(_cups_expect_t)); + memset(data->last_expect, 0, sizeof(ipptool_expect_t)); data->last_expect->repeat_limit = 1000; data->last_expect->expect_all = expect_all; @@ -3643,6 +4902,24 @@ return (0); } } + else if (!_cups_strcasecmp(token, "DISPLAY-MATCH")) + { + if (!_ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing DISPLAY-MATCH mesaage on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + + if (data->last_expect) + { + data->last_expect->display_match = strdup(temp); + } + else + { + print_fatal_error(data, "DISPLAY-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + return (0); + } + } else if (!_cups_strcasecmp(token, "OF-TYPE")) { if (!_ippFileReadToken(f, temp, sizeof(temp))) @@ -3807,6 +5084,18 @@ return (0); } } + else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES")) + { + if (data->last_expect) + { + data->last_expect->with_distinct = 1; + } + else + { + print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); + return (0); + } + } else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") || !_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-ALL-RESOURCES") || @@ -3822,14 +5111,14 @@ if (data->last_expect) { if (!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-HOSTNAME")) - data->last_expect->with_flags = _CUPS_WITH_HOSTNAME; + data->last_expect->with_flags = IPPTOOL_WITH_HOSTNAME; else if (!_cups_strcasecmp(token, "WITH-ALL-RESOURCES") || !_cups_strcasecmp(token, "WITH-RESOURCE")) - data->last_expect->with_flags = _CUPS_WITH_RESOURCE; + data->last_expect->with_flags = IPPTOOL_WITH_RESOURCE; else if (!_cups_strcasecmp(token, "WITH-ALL-SCHEMES") || !_cups_strcasecmp(token, "WITH-SCHEME")) - data->last_expect->with_flags = _CUPS_WITH_SCHEME; + data->last_expect->with_flags = IPPTOOL_WITH_SCHEME; if (!_cups_strncasecmp(token, "WITH-ALL-", 9)) - data->last_expect->with_flags |= _CUPS_WITH_ALL; + data->last_expect->with_flags |= IPPTOOL_WITH_ALL; } if (!_ippFileReadToken(f, temp, sizeof(temp))) @@ -3895,7 +5184,7 @@ */ data->last_expect->with_value = calloc(1, (size_t)(ptr - value)); - data->last_expect->with_flags |= _CUPS_WITH_REGEX; + data->last_expect->with_flags |= IPPTOOL_WITH_REGEX; if (data->last_expect->with_value) memcpy(data->last_expect->with_value, value + 1, (size_t)(ptr - value - 1)); @@ -3919,7 +5208,7 @@ } data->last_expect->with_value = strdup(value); - data->last_expect->with_flags |= _CUPS_WITH_LITERAL; + data->last_expect->with_flags |= IPPTOOL_WITH_LITERAL; } } else @@ -3945,7 +5234,7 @@ _ippVarsExpand(vars, value, temp, sizeof(value)); data->last_expect->with_value_from = strdup(value); - data->last_expect->with_flags = _CUPS_WITH_LITERAL; + data->last_expect->with_flags = IPPTOOL_WITH_LITERAL; } else { @@ -3994,10 +5283,10 @@ if (data->show_header) { - if (data->output == _CUPS_OUTPUT_PLIST) + if (data->output == IPPTOOL_OUTPUT_PLIST) print_xml_header(data); - if (data->output == _CUPS_OUTPUT_TEST || (data->output == _CUPS_OUTPUT_PLIST && data->outfile != cupsFileStdout())) + if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) cupsFilePrintf(cupsFileStdout(), "\"%s\":\n", f->filename); data->show_header = 0; @@ -4013,9 +5302,9 @@ if ((ptr = strrchr(data->name, '.')) != NULL) *ptr = '\0'; data->repeat_interval = 5000000; - data->request_id ++; - strlcpy(data->resource, vars->resource, sizeof(data->resource)); + strlcpy(data->resource, data->vars->resource, sizeof(data->resource)); data->skip_previous = 0; + data->pass_test = 0; data->skip_test = 0; data->num_statuses = 0; data->last_status = NULL; @@ -4023,6 +5312,12 @@ data->transfer = data->def_transfer; data->version = data->def_version; + free(data->monitor_uri); + data->monitor_uri = NULL; + data->monitor_delay = 0; + data->monitor_interval = 5000000; + data->num_monitor_expects = 0; + _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); f->attrs = ippNew(); @@ -4114,7 +5409,7 @@ * Map the filename to and then run the tests... */ - _cups_testdata_t inc_data; /* Data for included file */ + ipptool_test_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); @@ -4123,7 +5418,7 @@ inc_data.prev_pass = 1; inc_data.show_header = 1; - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) + if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); @@ -4150,7 +5445,7 @@ * Map the filename to and then run the tests... */ - _cups_testdata_t inc_data; /* Data for included file */ + ipptool_test_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); @@ -4159,7 +5454,7 @@ inc_data.prev_pass = 1; inc_data.show_header = 1; - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) + if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); @@ -4186,7 +5481,7 @@ * Map the filename to and then run the tests... */ - _cups_testdata_t inc_data; /* Data for included file */ + ipptool_test_t inc_data; /* Data for included file */ char filename[1024]; /* Mapped filename */ memcpy(&inc_data, data, sizeof(inc_data)); @@ -4195,7 +5490,7 @@ inc_data.prev_pass = 1; inc_data.show_header = 1; - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), vars, &inc_data) && data->stop_after_include_error) + if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) { data->pass = data->prev_pass = 0; return (0); @@ -4271,11 +5566,11 @@ if (_ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "auto")) - data->def_transfer = _CUPS_TRANSFER_AUTO; + data->def_transfer = IPPTOOL_TRANSFER_AUTO; else if (!strcmp(temp, "chunked")) - data->def_transfer = _CUPS_TRANSFER_CHUNKED; + data->def_transfer = IPPTOOL_TRANSFER_CHUNKED; else if (!strcmp(temp, "length")) - data->def_transfer = _CUPS_TRANSFER_LENGTH; + data->def_transfer = IPPTOOL_TRANSFER_LENGTH; else { print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); @@ -4345,6 +5640,7 @@ _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, _("-R Repeat tests on server-error-busy")); _cupsLangPuts(stderr, _("-S Test with encryption using HTTPS")); _cupsLangPuts(stderr, _("-T seconds Set the receive/send timeout in seconds")); _cupsLangPuts(stderr, _("-V version Set default IPP version")); @@ -4365,29 +5661,154 @@ /* + * 'with_distinct_values()' - Verify that an attribute contains unique values. + */ + +static int // O - 1 if distinct, 0 if duplicate +with_distinct_values( + cups_array_t *errors, // I - Array of errors + ipp_attribute_t *attr) // I - Attribute to test +{ + int i, // Looping var + count; // Number of values + ipp_tag_t value_tag; // Value syntax + const char *value; // Current value + char buffer[8192]; // Temporary buffer + cups_array_t *values; // Array of values as strings + + + // If there is only 1 value, it must be distinct + if ((count = ippGetCount(attr)) == 1) + return (1); + + // Only check integers, enums, rangeOfInteger, resolution, and nul-terminated + // strings... + switch (value_tag = ippGetValueTag(attr)) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + case IPP_TAG_RANGE : + case IPP_TAG_RESOLUTION : + case IPP_TAG_KEYWORD : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + case IPP_TAG_BEGIN_COLLECTION : + break; + + default : + add_stringf(errors, "WITH-DISTINCT-VALUES %s not supported for 1setOf %s", ippGetName(attr), ippTagString(value_tag)); + return (0); + } + + // Collect values and determine they are all unique... + values = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); + + for (i = 0; i < count; i ++) + { + switch (value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(attr, i)); + value = buffer; + break; + case IPP_TAG_RANGE : + { + int upper, lower = ippGetRange(attr, i, &upper); + // Range values + + snprintf(buffer, sizeof(buffer), "%d-%d", lower, upper); + value = buffer; + } + break; + case IPP_TAG_RESOLUTION : + { + ipp_res_t units; // Resolution units + int yres, xres = ippGetResolution(attr, i, &yres, &units); + // Resolution values + + 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"); + value = buffer; + } + break; + case IPP_TAG_KEYWORD : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + value = ippGetString(attr, i, NULL); + break; + case IPP_TAG_BEGIN_COLLECTION : + { + ipp_t *col = ippGetCollection(attr, i); + // Collection value + ipp_attribute_t *member; // Member attribute + char *bufptr, // Pointer into buffer + *bufend, // End of buffer + prefix; // Prefix character + + for (prefix = '{', bufptr = buffer, bufend = buffer + sizeof(buffer) - 2, member = ippFirstAttribute(col); member && bufptr < bufend; member = ippNextAttribute(col)) + { + *bufptr++ = prefix; + prefix = ' '; + + ippAttributeString(member, bufptr, (size_t)(bufend - bufptr)); + bufptr += strlen(bufptr); + } + + *bufptr++ = '}'; + *bufptr = '\0'; + value = buffer; + } + break; + default : // Should never happen + value = "unsupported"; + break; + } + + if (cupsArrayFind(values, (void *)value)) + add_stringf(errors, "DUPLICATE: %s=%s", ippGetName(attr), value); + else + cupsArrayAdd(values, (void *)value); + } + + // Cleanup... + i = cupsArrayCount(values) == count; + cupsArrayDelete(values); + + return (i); +} + + +/* * 'with_flags_string()' - Return the "WITH-xxx" predicate that corresponds to - the flags. + * the flags. */ static const char * /* O - WITH-xxx string */ with_flags_string(int flags) /* I - WITH flags */ { - if (flags & _CUPS_WITH_ALL) + if (flags & IPPTOOL_WITH_ALL) { - if (flags & _CUPS_WITH_HOSTNAME) + if (flags & IPPTOOL_WITH_HOSTNAME) return ("WITH-ALL-HOSTNAMES"); - else if (flags & _CUPS_WITH_RESOURCE) + else if (flags & IPPTOOL_WITH_RESOURCE) return ("WITH-ALL-RESOURCES"); - else if (flags & _CUPS_WITH_SCHEME) + else if (flags & IPPTOOL_WITH_SCHEME) return ("WITH-ALL-SCHEMES"); else return ("WITH-ALL-VALUES"); } - else if (flags & _CUPS_WITH_HOSTNAME) + else if (flags & IPPTOOL_WITH_HOSTNAME) return ("WITH-HOSTNAME"); - else if (flags & _CUPS_WITH_RESOURCE) + else if (flags & IPPTOOL_WITH_RESOURCE) return ("WITH-RESOURCE"); - else if (flags & _CUPS_WITH_SCHEME) + else if (flags & IPPTOOL_WITH_SCHEME) return ("WITH-SCHEME"); else return ("WITH-VALUE"); @@ -4399,7 +5820,7 @@ */ static int /* O - 1 on match, 0 on non-match */ -with_value(_cups_testdata_t *data, /* I - Test data */ +with_value(ipptool_test_t *data, /* I - Test data */ cups_array_t *errors, /* I - Errors array */ char *value, /* I - Value string */ int flags, /* I - Flags for match */ @@ -4416,7 +5837,7 @@ *matchbuf = '\0'; - match = (flags & _CUPS_WITH_ALL) ? 1 : 0; + match = (flags & IPPTOOL_WITH_ALL) ? 1 : 0; /* * NULL matches everything. @@ -4479,7 +5900,7 @@ } } - if (flags & _CUPS_WITH_ALL) + if (flags & IPPTOOL_WITH_ALL) { if (!valmatch) { @@ -4546,7 +5967,7 @@ } } - if (flags & _CUPS_WITH_ALL) + if (flags & IPPTOOL_WITH_ALL) { if (!valmatch) { @@ -4581,13 +6002,13 @@ if (!matchbuf[0]) strlcpy(matchbuf, value, matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4618,13 +6039,13 @@ if (!matchbuf[0]) strlcpy(matchbuf, value, matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4664,7 +6085,7 @@ case IPP_TAG_TEXTLANG : case IPP_TAG_URI : case IPP_TAG_URISCHEME : - if (flags & _CUPS_WITH_REGEX) + if (flags & IPPTOOL_WITH_REGEX) { /* * Value is an extended, case-sensitive POSIX regular expression... @@ -4692,13 +6113,13 @@ if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4707,7 +6128,7 @@ regfree(&re); } - else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME | _CUPS_WITH_RESOURCE))) + else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME | IPPTOOL_WITH_RESOURCE))) { /* * Value is a literal URI string, see if the value(s) match... @@ -4720,13 +6141,13 @@ if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4750,7 +6171,7 @@ * Some URI components are case-sensitive, some not... */ - if (flags & (_CUPS_WITH_SCHEME | _CUPS_WITH_HOSTNAME)) + if (flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME)) result = _cups_strcasecmp(value, get_string(attr, i, flags, temp, sizeof(temp))); else result = strcmp(value, get_string(attr, i, flags, temp, sizeof(temp))); @@ -4785,13 +6206,13 @@ if (!matchbuf[0]) strlcpy(matchbuf, get_string(attr, i, flags, temp, sizeof(temp)), matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4807,7 +6228,7 @@ break; case IPP_TAG_STRING : - if (flags & _CUPS_WITH_REGEX) + if (flags & IPPTOOL_WITH_REGEX) { /* * Value is an extended, case-sensitive POSIX regular expression... @@ -4844,13 +6265,13 @@ if (!matchbuf[0]) strlcpy(matchbuf, temp, matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; @@ -4941,13 +6362,13 @@ if (!matchbuf[0]) copy_hex_string(matchbuf, adata, adatalen, matchlen); - if (!(flags & _CUPS_WITH_ALL)) + if (!(flags & IPPTOOL_WITH_ALL)) { match = 1; break; } } - else if (flags & _CUPS_WITH_ALL) + else if (flags & IPPTOOL_WITH_ALL) { match = 0; break; diff -Nru cups-2.3.3op2/vcnet/config.h cups-2.4.1op1/vcnet/config.h --- cups-2.3.3op2/vcnet/config.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/config.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * Configuration file for CUPS on Windows. * - * Copyright © 2021 by Michael R Sweet + * Copyright © 2021-2022 by OpenPrinting * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * @@ -100,8 +100,8 @@ * Version of software... */ -#define CUPS_SVERSION "CUPS v2.3.3op2" -#define CUPS_MINIMAL "CUPS/2.3.3op2" +#define CUPS_SVERSION "CUPS v2.4rc1" +#define CUPS_MINIMAL "CUPS/2.4rc1" /* @@ -163,14 +163,6 @@ /* - * Default Samba and LPD config files... - */ - -#define CUPS_DEFAULT_SMB_CONFIG_FILE "" -#define CUPS_DEFAULT_LPD_CONFIG_FILE "" - - -/* * Default ErrorPolicy value... */ @@ -216,7 +208,6 @@ #define CUPS_CACHEDIR "C:/CUPS/cache" #define CUPS_DATADIR "C:/CUPS/share" #define CUPS_DOCROOT "C:/CUPS/share/doc" -#define CUPS_FONTPATH "C:/CUPS/share/fonts" #define CUPS_LOCALEDIR "C:/CUPS/locale" #define CUPS_LOGDIR "C:/CUPS/logs" #define CUPS_REQUESTS "C:/CUPS/spool" @@ -394,10 +385,10 @@ * Which encryption libraries do we have? */ +#define HAVE_TLS 1 /* #undef HAVE_CDSASSL */ /* #undef HAVE_GNUTLS */ #define HAVE_SSPISSL 1 -#define HAVE_SSL 1 /* @@ -439,24 +430,31 @@ /* - * Do we have mDNSResponder for DNS Service Discovery (aka Bonjour)? + * Do we have DNS Service Discovery (aka Bonjour) support? */ #define HAVE_DNSSD 1 /* - * Do we have Avahi for DNS Service Discovery (aka Bonjour)? + * Do we have mDNSResponder for DNS-SD? + */ + +#define HAVE_MDNSRESPONDER 1 + + +/* + * Do we have Avahi for DNS-SD? */ -#undef HAVE_AVAHI +/* #undef HAVE_AVAHI */ /* * Do we have ? */ -#undef HAVE_SYS_IOCTL_H +/* #undef HAVE_SYS_IOCTL_H */ /* diff -Nru cups-2.3.3op2/vcnet/cupstestppd.vcxproj cups-2.4.1op1/vcnet/cupstestppd.vcxproj --- cups-2.3.3op2/vcnet/cupstestppd.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/cupstestppd.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -14,18 +14,18 @@ {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F} cupstestppd Win32Proj - 10.0.17763.0 + 10.0 Application - v141 + v142 Unicode true Application - v141 + v142 Unicode diff -Nru cups-2.3.3op2/vcnet/dns_sd.c cups-2.4.1op1/vcnet/dns_sd.c --- cups-2.3.3op2/vcnet/dns_sd.c 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/dns_sd.c 2022-01-27 11:11:42.000000000 +0000 @@ -102,7 +102,7 @@ if (dnssd_add_record) return (*dnssd_add_record)(sdRef, RecordRef, flags, rrtype, rdlen, rdata, ttl); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -124,7 +124,7 @@ if (dnssd_browse) return (*dnssd_browse)(sdRef, flags, interfaceIndex, regtype, domain, callBack, context); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -156,7 +156,7 @@ if (dnssd_create_connection) return (*dnssd_create_connection)(sdRef); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -169,7 +169,7 @@ if (dnssd_process_result) return (*dnssd_process_result)(sdRef); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -192,7 +192,7 @@ if (dnssd_query_record) return (*dnssd_query_record)(sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, callBack, context); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -216,7 +216,7 @@ if (dnssd_sock_fd) return (*dnssd_sock_fd)(sdRef); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -243,7 +243,7 @@ if (dnssd_register) return (*dnssd_register)(sdRef, flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, callBack, context); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -261,7 +261,7 @@ if (dnssd_remove_record) return (*dnssd_remove_record)(sdRef, RecordRef, flags); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -284,7 +284,7 @@ if (dnssd_resolve) return (*dnssd_resolve)(sdRef, flags, interfaceIndex, name, regtype, domain, callBack, context); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } @@ -305,7 +305,7 @@ if (dnssd_update_record) return (*dnssd_update_record)(sdRef, RecordRef, flags, rdlen, rdata, ttl); else - return (-1); + return (kDNSServiceErr_ServiceNotRunning); } diff -Nru cups-2.3.3op2/vcnet/dnssdstub.vcxproj cups-2.4.1op1/vcnet/dnssdstub.vcxproj --- cups-2.3.3op2/vcnet/dnssdstub.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/dnssdstub.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -21,19 +21,19 @@ {C0899B3A-43E7-4BC3-A785-659E1FD2EA83} Win32Proj dnssdstub - 10.0.17763.0 + 10.0 StaticLibrary true - v141 + v142 Unicode StaticLibrary false - v141 + v142 true Unicode diff -Nru cups-2.3.3op2/vcnet/ippeveprinter.vcxproj cups-2.4.1op1/vcnet/ippeveprinter.vcxproj --- cups-2.3.3op2/vcnet/ippeveprinter.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/ippeveprinter.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -14,18 +14,18 @@ {82A03BC7-0746-4B85-8908-3C7A3FAA58A9} ippeveprinter Win32Proj - 10.0.17763.0 + 10.0 Application - v141 + v142 Unicode true Application - v141 + v142 Unicode @@ -59,7 +59,7 @@ Disabled ..\vcnet;..;..\vcnet\regex;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - true + false EnableFastChecks MultiThreadedDebugDLL @@ -110,7 +110,12 @@ false + + + + + \ No newline at end of file diff -Nru cups-2.3.3op2/vcnet/ippeveprinter.vcxproj.filters cups-2.4.1op1/vcnet/ippeveprinter.vcxproj.filters --- cups-2.3.3op2/vcnet/ippeveprinter.vcxproj.filters 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/ippeveprinter.vcxproj.filters 2022-01-27 11:11:42.000000000 +0000 @@ -15,8 +15,11 @@ - + Source Files + + + \ No newline at end of file diff -Nru cups-2.3.3op2/vcnet/ippeveprinter.vcxproj.user cups-2.4.1op1/vcnet/ippeveprinter.vcxproj.user --- cups-2.3.3op2/vcnet/ippeveprinter.vcxproj.user 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/ippeveprinter.vcxproj.user 2022-01-27 11:11:42.000000000 +0000 @@ -1,4 +1,8 @@  - + + -vv -r _print,_universal -f application/pdf,image/jpeg,image/pwg-raster,image/urf "ippeveprinter test" + WindowsLocalDebugger + CUPS_DEBUG_LOG=-;CUPS_DEBUG_LEVEL=9;CUPS_DEBUG_FILTER=sspi + \ No newline at end of file diff -Nru cups-2.3.3op2/vcnet/ippfind.vcxproj cups-2.4.1op1/vcnet/ippfind.vcxproj --- cups-2.3.3op2/vcnet/ippfind.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/ippfind.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -14,18 +14,18 @@ {B484DA0C-62C8-4C32-83B6-CCEB58968B85} ippfind Win32Proj - 10.0.17763.0 + 10.0 Application - v141 + v142 Unicode true Application - v141 + v142 Unicode diff -Nru cups-2.3.3op2/vcnet/ippfind.vcxproj.filters cups-2.4.1op1/vcnet/ippfind.vcxproj.filters --- cups-2.3.3op2/vcnet/ippfind.vcxproj.filters 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/ippfind.vcxproj.filters 2022-01-27 11:11:42.000000000 +0000 @@ -15,7 +15,7 @@ - + Source Files diff -Nru cups-2.3.3op2/vcnet/ipptool.vcxproj cups-2.4.1op1/vcnet/ipptool.vcxproj --- cups-2.3.3op2/vcnet/ipptool.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/ipptool.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -14,18 +14,18 @@ {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4} ipptool Win32Proj - 10.0.17763.0 + 10.0 Application - v141 + v142 Unicode true Application - v141 + v142 Unicode diff -Nru cups-2.3.3op2/vcnet/ipptool.vcxproj.filters cups-2.4.1op1/vcnet/ipptool.vcxproj.filters --- cups-2.3.3op2/vcnet/ipptool.vcxproj.filters 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/ipptool.vcxproj.filters 2022-01-27 11:11:42.000000000 +0000 @@ -15,7 +15,7 @@ - + Source Files diff -Nru cups-2.3.3op2/vcnet/libcups2.vcxproj cups-2.4.1op1/vcnet/libcups2.vcxproj --- cups-2.3.3op2/vcnet/libcups2.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/libcups2.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -14,17 +14,17 @@ {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} libcups2 Win32Proj - 10.0.17763.0 + 10.0 DynamicLibrary - v141 + v142 MultiByte DynamicLibrary - v141 + v142 Unicode @@ -60,7 +60,6 @@ Disabled ..\vcnet;..;..\vcnet\regex;%(AdditionalIncludeDirectories) DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true EnableFastChecks MultiThreadedDebugDLL true @@ -69,7 +68,7 @@ ProgramDatabase - ws2_32.lib;advapi32.lib;%(AdditionalDependencies) + bcrypt.lib;ws2_32.lib;advapi32.lib;%(AdditionalDependencies) $(OutDir)libcups2.dll ..\cups\libcups2.def true @@ -93,7 +92,7 @@ ProgramDatabase - ws2_32.lib;advapi32.lib;%(AdditionalDependencies) + bcrypt.lib;ws2_32.lib;advapi32.lib;%(AdditionalDependencies) $(OutDir)libcups2.dll ..\cups\libcups2.def true @@ -291,12 +290,14 @@ - + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + + \ No newline at end of file diff -Nru cups-2.3.3op2/vcnet/libcups2_native.nuspec cups-2.4.1op1/vcnet/libcups2_native.nuspec --- cups-2.3.3op2/vcnet/libcups2_native.nuspec 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/vcnet/libcups2_native.nuspec 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,41 @@ + + + + libcups2_native + OpenPrinting CUPS Library for VS2019+ + 2.4.0.3 + Michael R Sweet, OpenPrinting + michaelrsweet + https://github.com/OpenPrinting/cups + Apache-2.0 + build/native/cups-128.png + build/native/README.md + false + OpenPrinting CUPS is a standards-based, open source printing system for Linux® +and other Unix®-like operating systems. The CUPS library provides a convenient API for communicating with Internet Printing Protocol printers. CUPS is licensed under the Apache License Version 2.0 with an exception to allow linking against GNU GPL2-only software. + Copyright © 2020-2022 by OpenPrinting, Copyright © 2007-2019 by Apple Inc., Copyright © 1997-2007 by Easy Software Products. + http ipp native + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru cups-2.3.3op2/vcnet/libcups2_native.props cups-2.4.1op1/vcnet/libcups2_native.props --- cups-2.3.3op2/vcnet/libcups2_native.props 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/vcnet/libcups2_native.props 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,18 @@ + + + + + + + + + $(MSBuildThisFileDirectory)\include + + + + + $(LinkLibrary);%(AdditionalDependencies) + + + + diff -Nru cups-2.3.3op2/vcnet/libcups2_native.redist.nuspec cups-2.4.1op1/vcnet/libcups2_native.redist.nuspec --- cups-2.3.3op2/vcnet/libcups2_native.redist.nuspec 1970-01-01 00:00:00.000000000 +0000 +++ cups-2.4.1op1/vcnet/libcups2_native.redist.nuspec 2022-01-27 11:11:42.000000000 +0000 @@ -0,0 +1,30 @@ + + + + libcups2_native.redist + OpenPrinting CUPS Library for VS2019+ Redist + 2.4.0.3 + Michael R Sweet, OpenPrinting + michaelrsweet + https://github.com/OpenPrinting/cups + Apache-2.0 + build/native/cups-128.png + build/native/README.md + false + OpenPrinting CUPS is a standards-based, open source printing system for Linux® +and other Unix®-like operating systems. This package provides the redistributable content for the CUPS library. CUPS is licensed under the Apache License Version 2.0 with an exception to allow linking against GNU GPL2-only software. + Copyright © 2020-2022 by OpenPrinting, Copyright © 2007-2019 by Apple Inc., Copyright © 1997-2007 by Easy Software Products. + http ipp native + + + + + + + + + + + + diff -Nru cups-2.3.3op2/vcnet/packages.config cups-2.4.1op1/vcnet/packages.config --- cups-2.3.3op2/vcnet/packages.config 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/packages.config 2022-01-27 11:11:42.000000000 +0000 @@ -1,4 +1,5 @@  - + + \ No newline at end of file diff -Nru cups-2.3.3op2/vcnet/regex.vcxproj cups-2.4.1op1/vcnet/regex.vcxproj --- cups-2.3.3op2/vcnet/regex.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/regex.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -14,18 +14,18 @@ {18950A1B-D37A-40C7-B2DF-C12986C0526E} regex Win32Proj - 10.0.17763.0 + 10.0 DynamicLibrary - v141 + v142 Unicode true DynamicLibrary - v141 + v142 Unicode diff -Nru cups-2.3.3op2/vcnet/testfile.vcxproj cups-2.4.1op1/vcnet/testfile.vcxproj --- cups-2.3.3op2/vcnet/testfile.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/testfile.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -13,17 +13,17 @@ {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30} Win32Proj - 10.0.17763.0 + 10.0 Application - v141 + v142 MultiByte Application - v141 + v142 MultiByte diff -Nru cups-2.3.3op2/vcnet/testhttp.vcxproj cups-2.4.1op1/vcnet/testhttp.vcxproj --- cups-2.3.3op2/vcnet/testhttp.vcxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/vcnet/testhttp.vcxproj 2022-01-27 11:11:42.000000000 +0000 @@ -13,17 +13,17 @@ {90B0058C-8393-411F-BD3B-E2C831D4E883} Win32Proj - 10.0.17763.0 + 10.0 Application - v141 + v142 MultiByte Application - v141 + v142 MultiByte diff -Nru cups-2.3.3op2/xcode/CUPS.xcodeproj/project.pbxproj cups-2.4.1op1/xcode/CUPS.xcodeproj/project.pbxproj --- cups-2.3.3op2/xcode/CUPS.xcodeproj/project.pbxproj 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/xcode/CUPS.xcodeproj/project.pbxproj 2022-01-27 11:11:42.000000000 +0000 @@ -858,7 +858,6 @@ 7284F9F01BFCCDB10026F886 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 7284F9EF1BFCCD940026F886 /* hash.c */; }; 7284F9F11BFCCDB20026F886 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 7284F9EF1BFCCD940026F886 /* hash.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 */; }; 728FB7ED1536161C005426E1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 728FB7EC1536161C005426E1 /* libz.dylib */; }; 728FB7EE15361642005426E1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; @@ -902,12 +901,12 @@ 72D53A3015B4923F003F877F /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 72D53A3115B4923F003F877F /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; 72D53A3215B4923F003F877F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; - 72D53A3415B4925B003F877F /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A3315B4925B003F877F /* ApplicationServices.framework */; }; + 72D53A3415B4925B003F877F /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A3315B4925B003F877F /* ApplicationServices.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 72D53A3515B49270003F877F /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2C15B4913D003F877F /* IOKit.framework */; }; 72D53A3815B4929D003F877F /* colorman.c in Sources */ = {isa = PBXBuildFile; fileRef = 72D53A3615B4929D003F877F /* colorman.c */; }; 72D53A3A15B492FA003F877F /* libpam.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A3915B492FA003F877F /* libpam.dylib */; }; - 72D53A3B15B4930A003F877F /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2915B49110003F877F /* GSS.framework */; }; - 72D53A3C15B4930A003F877F /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; + 72D53A3B15B4930A003F877F /* GSS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D53A2915B49110003F877F /* GSS.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 72D53A3C15B4930A003F877F /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 72F75A5C1336F988004BB496 /* cupstestppd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A5B1336F988004BB496 /* cupstestppd.c */; }; 72F75A671336FA38004BB496 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; /* End PBXBuildFile section */ @@ -3310,6 +3309,8 @@ 278C58E8136B64B000836530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = ""; }; 279AE6F42395B80F004DD600 /* libpam.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libpam.tbd; path = usr/lib/libpam.tbd; sourceTree = SDKROOT; }; 27A0347B1A8BDB1300650675 /* lpadmin */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpadmin; sourceTree = BUILT_PRODUCTS_DIR; }; + 27C89C8F2613E7C300A58F43 /* cups-snap.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-snap.m4"; path = "../config-scripts/cups-snap.m4"; sourceTree = ""; }; + 27C89C902613E7C300A58F43 /* cups-tls.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-tls.m4"; path = "../config-scripts/cups-tls.m4"; sourceTree = ""; }; 27D3037D134148CB00F022B1 /* libcups2.def */ = {isa = PBXFileReference; lastKnownFileType = text; name = libcups2.def; path = ../cups/libcups2.def; sourceTree = ""; }; 27F89DA21B3AC43B00E5A4B7 /* testraster.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testraster.c; path = ../cups/testraster.c; sourceTree = ""; }; 720DD6C21358FD5F0064AA82 /* snmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = snmp; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -3455,8 +3456,6 @@ 724379C41333FFC7009631B9 /* usb-darwin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "usb-darwin.c"; path = "../backend/usb-darwin.c"; sourceTree = ""; }; 724379C51333FFC7009631B9 /* usb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = usb.c; path = ../backend/usb.c; sourceTree = ""; }; 724379CA1334000E009631B9 /* ieee1284.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ieee1284.c; path = ../backend/ieee1284.c; sourceTree = ""; }; - 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; }; 724FA5351CC0370C0092477B /* testadmin */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testadmin; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA5481CC037370092477B /* testarray */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testarray; sourceTree = BUILT_PRODUCTS_DIR; }; 724FA55B1CC037500092477B /* testcache */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcache; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -3580,7 +3579,6 @@ 72E65BB018DC799B00097E89 /* cups-pam.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-pam.m4"; path = "../config-scripts/cups-pam.m4"; sourceTree = ""; }; 72E65BB118DC799B00097E89 /* cups-poll.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-poll.m4"; path = "../config-scripts/cups-poll.m4"; sourceTree = ""; }; 72E65BB318DC799B00097E89 /* cups-sharedlibs.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-sharedlibs.m4"; path = "../config-scripts/cups-sharedlibs.m4"; sourceTree = ""; }; - 72E65BB418DC799B00097E89 /* cups-ssl.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-ssl.m4"; path = "../config-scripts/cups-ssl.m4"; sourceTree = ""; }; 72E65BB518DC799B00097E89 /* cups-threads.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-threads.m4"; path = "../config-scripts/cups-threads.m4"; sourceTree = ""; }; 72E65BB618DC79CC00097E89 /* cups-config.in */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "cups-config.in"; path = "../cups-config.in"; sourceTree = ""; }; 72E65BB718DC79CC00097E89 /* Makedefs.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = Makedefs.in; path = ../Makedefs.in; sourceTree = ""; }; @@ -3601,9 +3599,6 @@ 72E65BD318DC7A9800097E89 /* spec-ppd.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "spec-ppd.header"; path = "../filter/spec-ppd.header"; sourceTree = ""; }; 72E65BD418DC7A9800097E89 /* spec-ppd.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "spec-ppd.shtml"; path = "../filter/spec-ppd.shtml"; sourceTree = ""; }; 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 = ""; }; 72E65BDC18DC852700097E89 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../scheduler/Makefile; sourceTree = SOURCE_ROOT; }; 72E65BDE18DCA35700097E89 /* CHANGES.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = CHANGES.md; path = ../CHANGES.md; sourceTree = ""; xcLanguageSpecificationIdentifier = ""; }; @@ -4198,7 +4193,6 @@ 728FB7ED1536161C005426E1 /* libz.dylib in Frameworks */, 728FB7E91536161C005426E1 /* CoreFoundation.framework in Frameworks */, 72D53A2A15B49110003F877F /* GSS.framework in Frameworks */, - 728FB7EA1536161C005426E1 /* Kerberos.framework in Frameworks */, 728FB7EB1536161C005426E1 /* Security.framework in Frameworks */, 728FB7EE15361642005426E1 /* SystemConfiguration.framework in Frameworks */, ); @@ -5064,12 +5058,7 @@ 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 */, @@ -5284,8 +5273,9 @@ 72E65BB018DC799B00097E89 /* cups-pam.m4 */, 72E65BB118DC799B00097E89 /* cups-poll.m4 */, 72E65BB318DC799B00097E89 /* cups-sharedlibs.m4 */, - 72E65BB418DC799B00097E89 /* cups-ssl.m4 */, + 27C89C8F2613E7C300A58F43 /* cups-snap.m4 */, 72E65BB518DC799B00097E89 /* cups-threads.m4 */, + 27C89C902613E7C300A58F43 /* cups-tls.m4 */, ); name = "Autoconf Files"; sourceTree = ""; @@ -11552,8 +11542,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPRESSION = lossless; + CLANG_ANALYZER_GCD_PERFORMANCE = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; + CLANG_WARN_ATOMIC_IMPLICIT_SEQ_CST = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; @@ -11562,13 +11556,15 @@ CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_INTERFACE_IVARS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = NO; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; CODE_SIGN_IDENTITY = "-"; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -11580,10 +11576,14 @@ GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; @@ -11598,6 +11598,7 @@ "-Wno-shorten-64-to-32", ); USE_HEADERMAP = NO; + WARNING_CFLAGS = "-Wno-deprecated-declarations"; }; name = Debug; }; @@ -11605,8 +11606,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPRESSION = "respect-asset-catalog"; + CLANG_ANALYZER_GCD_PERFORMANCE = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; + CLANG_WARN_ATOMIC_IMPLICIT_SEQ_CST = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; @@ -11615,26 +11620,33 @@ CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_INTERFACE_IVARS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = NO; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; CODE_SIGN_IDENTITY = "-"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_SHADOW = YES; GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_PARAMETER = YES; @@ -11648,6 +11660,7 @@ "-Wno-shorten-64-to-32", ); USE_HEADERMAP = NO; + WARNING_CFLAGS = "-Wno-deprecated-declarations"; }; name = Release; }; diff -Nru cups-2.3.3op2/xcode/config.h cups-2.4.1op1/xcode/config.h --- cups-2.3.3op2/xcode/config.h 2021-02-01 21:10:25.000000000 +0000 +++ cups-2.4.1op1/xcode/config.h 2022-01-27 11:11:42.000000000 +0000 @@ -1,7 +1,7 @@ /* * Configuration file for CUPS and Xcode. * - * Copyright © 2021 by Michael R Sweet + * Copyright © 2021 by OpenPrinting * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * @@ -19,8 +19,8 @@ * Version of software... */ -#define CUPS_SVERSION "CUPS v2.3.3op2" -#define CUPS_MINIMAL "CUPS/2.3.3op2" +#define CUPS_SVERSION "CUPS v2.4rc1" +#define CUPS_MINIMAL "CUPS/2.4rc1" /* @@ -82,14 +82,6 @@ /* - * Default Samba and LPD config files... - */ - -#define CUPS_DEFAULT_SMB_CONFIG_FILE "" -#define CUPS_DEFAULT_LPD_CONFIG_FILE "launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" - - -/* * Default ErrorPolicy value... */ @@ -135,7 +127,6 @@ #define CUPS_CACHEDIR "/private/var/spool/cups/cache" #define CUPS_DATADIR "/usr/share/cups" #define CUPS_DOCROOT "/usr/share/doc/cups" -#define CUPS_FONTPATH "/usr/share/cups/fonts" #define CUPS_LOCALEDIR "/usr/share/locale" #define CUPS_LOGDIR "/private/var/log/cups" #define CUPS_REQUESTS "/private/var/spool/cups" @@ -315,10 +306,10 @@ * Which encryption libraries do we have? */ +#define HAVE_TLS 1 #define HAVE_CDSASSL 1 /* #undef HAVE_GNUTLS */ /* #undef HAVE_SSPISSL */ -#define HAVE_SSL 1 /* @@ -365,14 +356,21 @@ /* - * Do we have mDNSResponder for DNS Service Discovery (aka Bonjour)? + * Do we have DNS Service Discovery (aka Bonjour) support? */ #define HAVE_DNSSD 1 /* - * Do we have Avahi for DNS Service Discovery (aka Bonjour)? + * Do we have mDNSResponder for DNS-SD? + */ + +#define HAVE_MDNSRESPONDER 1 + + +/* + * Do we have Avahi for DNS-SD? */ /* #undef HAVE_AVAHI */ @@ -560,7 +558,7 @@ */ #if TARGET_OS_OSX -# define HAVE_GSS_ACQUIRED_CRED_EX_F 1 +# define HAVE_GSS_ACQUIRE_CRED_EX_F 1 # define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1 # define HAVE_GSS_GSSAPI_H 1 /* #undef HAVE_GSS_GSSAPI_SPI_H */