Comparar commits
343 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 4ebeb20c50 | |||
| 26e33331ce | |||
| 2e913c4b4e | |||
| b764f49b0c | |||
| 6ff5bbedb9 | |||
| ff52b652cf | |||
| fc19457093 | |||
| 2dbebbaa23 | |||
| 97cb566568 | |||
| 7c7f431a26 | |||
| 22716a21f7 | |||
| 3f8d6023ed | |||
| 4c975abbc7 | |||
| d66aa76457 | |||
| 4c37eb9f77 | |||
| 66021bfa90 | |||
| d3cc15d4b2 | |||
| f58657f987 | |||
| 8c2150d186 | |||
| 5c7df4f0e0 | |||
| 9135aedbb4 | |||
| 90a97dd7b6 | |||
| 417d0e1635 | |||
| 4440da10e5 | |||
| 4b55f9f3c1 | |||
| bb10adda6f | |||
| 2390f1d9eb | |||
| b643d6ba92 | |||
| 1f679daf00 | |||
| 0612a04d5d | |||
| f6d93318e0 | |||
| 821b3cc956 | |||
| b757529b6f | |||
| 566d5c707e | |||
| a922c92cd0 | |||
| aefefc3539 | |||
| 0e41e1ca5d | |||
| d2e90eb7c7 | |||
| 570933a6a3 | |||
| 84c97c051d | |||
| 5f67be43fa | |||
| b59756883a | |||
| 6daeebb5ac | |||
| 2bad6aac2f | |||
| 9d72065fa9 | |||
| 75d3f11945 | |||
| 6bebebe247 | |||
| 1d598e87db | |||
| 3645e5efa7 | |||
| e8953be355 | |||
| 782bcf6974 | |||
| 3d7ece43ea | |||
| 290404655f | |||
| c59948f6fb | |||
| b237ae81d2 | |||
| 82c4785a4c | |||
| 9113651bca | |||
| 3034dcc946 | |||
| 2aee052bf5 | |||
| 8e47ac0199 | |||
| 30c8d1abb2 | |||
| 5e18690298 | |||
| bec850697a | |||
| 4ffdbc48d8 | |||
| accd26d222 | |||
| 08b48df256 | |||
| bb4172dade | |||
| afe94dff9d | |||
| 1f71721001 | |||
| 18a1649286 | |||
| 58c3683023 | |||
| 303be29243 | |||
| 275af5ac7b | |||
| d821d89415 | |||
| 6579c998c4 | |||
| 1377fb858c | |||
| f9ee3b81e1 | |||
| 7e50a735a8 | |||
| 56b62a3b54 | |||
| 02773ede84 | |||
| ec9996719f | |||
| affaf0737f | |||
| 49fa4983f2 | |||
| 34be0e8038 | |||
| ce0d9679a4 | |||
| fad821594f | |||
| f8913c6d2c | |||
| a75c0e5961 | |||
| 5ee613bbc6 | |||
| 02c88e673e | |||
| 46a7b416ee | |||
| c61b78bd84 | |||
| 0ae5b012b2 | |||
| 15bba96c30 | |||
| bea3713442 | |||
| 5639a7b41c | |||
| 360e815a88 | |||
| c00282bb43 | |||
| 3a16bd9c9d | |||
| a7cdcd19b8 | |||
| 79424d8b9a | |||
| 5889fea75a | |||
| 16389be3ba | |||
| f97678f279 | |||
| 979804902c | |||
| b889560c05 | |||
| c9e9d0e810 | |||
| a5dd746bd0 | |||
| 6b33281c3e | |||
| 9554d4e748 | |||
| c0a47c1101 | |||
| 4cf66fef48 | |||
| b17b635a37 | |||
| 5d8b7d2665 | |||
| e4e371946b | |||
| 46d22fe908 | |||
| 9d4ae311cb | |||
| 2cf3a36a4e | |||
| fd2f0a7af7 | |||
| aa2a77dec8 | |||
| f0f4e0366c | |||
| 4279822fe4 | |||
| c6990c1ed5 | |||
| c31737b031 | |||
| 2d947886ad | |||
| 116c301f23 | |||
| b908d72cac | |||
| 2cb1fda9fe | |||
| 0728c89bcf | |||
| 123cfe0202 | |||
| d2123aee55 | |||
| ea4dcf9ff4 | |||
| b39dd420c6 | |||
| 5614f45d77 | |||
| 5229ea1a41 | |||
| b72c5bf2ed | |||
| befbadcef6 | |||
| 7b0a28e38f | |||
| e78c14f7ea | |||
| e146105294 | |||
| e37405ea8e | |||
| 5535551fd9 | |||
| 7f14a29798 | |||
| 4b16c717e5 | |||
| 240a27f93b | |||
| 75e1a17cad | |||
| 40cc612af4 | |||
| 9449dd948a | |||
| 2793a478d0 | |||
| 5b6caf71b8 | |||
| b10aebb1d3 | |||
| 9964a31a77 | |||
| 7c7347a346 | |||
| b337f966e8 | |||
| e9b2d701da | |||
| 91d748b919 | |||
| fa76bc3dc0 | |||
| 4f272af7bb | |||
| b770b18d0f | |||
| b0a1b229b3 | |||
| 997db40489 | |||
| 07911378c0 | |||
| 345e10ca71 | |||
| 41c0a57318 | |||
| 10f9350b7e | |||
| 03bc3ef4c2 | |||
| 7e7a13a32e | |||
| 60716f946c | |||
| e34d348250 | |||
| ada3421240 | |||
| a2a13afb48 | |||
| 259b03bc46 | |||
| a375587b8c | |||
| 0bc1a539f4 | |||
| 86390cbf57 | |||
| ced9dda826 | |||
| e9faaeef18 | |||
| c9dbe83d17 | |||
| e3b9d1f520 | |||
| 9f573d7be9 | |||
| 5cc8588e8c | |||
| f198f7e1e7 | |||
| 5e59cd062f | |||
| bee711586d | |||
| e7729c5a14 | |||
| 9eb416ee89 | |||
| b74b285e47 | |||
| 48dfd9a9a2 | |||
| 4174429905 | |||
| 13be9452da | |||
| a9357c9da4 | |||
| 44b3f16133 | |||
| c536b6c583 | |||
| 03d3907a33 | |||
| 76ae98d657 | |||
| 6d086e08e4 | |||
| 49f495c32e | |||
| f8a5ad9bde | |||
| 07cb72471a | |||
| b94f7488e8 | |||
| d2d605ff77 | |||
| 6eda776e8a | |||
| a621d151e7 | |||
| 3a1e6b10c5 | |||
| 7a0e5acde2 | |||
| c5755caf42 | |||
| e44bdfe7e3 | |||
| b2f85109da | |||
| fb963b8dd1 | |||
| fdc80a913f | |||
| 1a9743f9d7 | |||
| 534dfe8e94 | |||
| f1175a5a9d | |||
| db5424ea51 | |||
| cac6b6562c | |||
| b67c2dd202 | |||
| b3f6f8d202 | |||
| 4fac83763d | |||
| 2650d637dc | |||
| 070e33a4c9 | |||
| 1da024d1a7 | |||
| 6ad44eebc7 | |||
| 89c924d590 | |||
| e38ab40b22 | |||
| f2e8714723 | |||
| 8d7d268f61 | |||
| ca9e55c9b5 | |||
| b0fb2d75d3 | |||
| c9a0ff6208 | |||
| 296cd66b68 | |||
| 90c67342b6 | |||
| 956bb1274c | |||
| ae7225e576 | |||
| c838ec5a3b | |||
| 6df8f83339 | |||
| 76b7b95c9e | |||
| 058582b4b5 | |||
| 5c476bf970 | |||
| ef338d0c83 | |||
| 12b798a070 | |||
| 49b6c6af76 | |||
| de4966cb9b | |||
| 7f500d8988 | |||
| f34c1c99cd | |||
| 64447b5696 | |||
| 4466c8ca87 | |||
| 134d057955 | |||
| 827bf9ce2d | |||
| 3a6962171c | |||
| d4a895f856 | |||
| 75105fbdfb | |||
| d2f1a784c4 | |||
| 62825d3445 | |||
| a537431a13 | |||
| 35fc224370 | |||
| 2a75f21b6a | |||
| ac032efa3e | |||
| 08566de251 | |||
| f1dd3a3976 | |||
| 96a5df6235 | |||
| 65bebeac76 | |||
| 5cb94b289a | |||
| 98d88c8d47 | |||
| 0668b48c10 | |||
| 718ee2fff3 | |||
| 500fca270a | |||
| e1ba078bdc | |||
| 78ac829c63 | |||
| ceea93e3d8 | |||
| c907de064d | |||
| 30afb232cd | |||
| 0ebee56929 | |||
| 9a4e273486 | |||
| 163a773e5b | |||
| 7c4b136b4f | |||
| bb719eb39a | |||
| 53af7f2160 | |||
| f50db552c5 | |||
| 4cfbd5f897 | |||
| fe4e5d67c5 | |||
| 82c719981b | |||
| 4a36625117 | |||
| 9022d60bbd | |||
| f8d0ab6d14 | |||
| 4b17d76f2a | |||
| e1bb4a6e98 | |||
| 167e0655b7 | |||
| 42deee7eaf | |||
| b497414286 | |||
| 7536de1a4a | |||
| d2817c9f02 | |||
| 143286bced | |||
| 95633d6282 | |||
| 2a20b51245 | |||
| 0d7cb94a77 | |||
| 9c44e2cb72 | |||
| e1c797efc7 | |||
| 869c206051 | |||
| 798d6e2934 | |||
| ac3015ba1a | |||
| 105922ec6d | |||
| 442e03eff1 | |||
| efa72f6100 | |||
| 3fae3b337d | |||
| 657c5b5f91 | |||
| a2187a6342 | |||
| 57543d87b6 | |||
| abacc52be4 | |||
| 17acb46909 | |||
| cceb9291b0 | |||
| 1f3f503a2b | |||
| 875ef65a9e | |||
| 845913bd5d | |||
| 87f340512c | |||
| dc8364753b | |||
| 0b1399a2c1 | |||
| afd25c346a | |||
| 1636510491 | |||
| 5423798c61 | |||
| a740a8491b | |||
| 16b0b41131 | |||
| 4886d6747e | |||
| 42dc144c44 | |||
| a946858f0c | |||
| 3ae6282d0e | |||
| 3b6c3c8e9d | |||
| 40c808603a | |||
| 84e3828d7d | |||
| 30be6424f0 | |||
| 1fbd0cabfb | |||
| 9c0c89124b | |||
| 4888dff95c | |||
| b393bc25e2 | |||
| 45eb1e5efc | |||
| 8a984948f3 | |||
| 87e9bb5508 | |||
| 68d5f6b8a4 | |||
| 83bf1f7b59 | |||
| 887fbb5445 | |||
| c245abfeb8 | |||
| e8a1fa03d0 | |||
| 14fdcd7a14 | |||
| 454708a4b9 |
+6
-1
@@ -29,6 +29,7 @@ berkeley/lpc
|
||||
berkeley/lpq
|
||||
berkeley/lpr
|
||||
berkeley/lprm
|
||||
cgi-bin/makedocset
|
||||
cgi-bin/testcgi
|
||||
cgi-bin/testhi
|
||||
cgi-bin/testhi.index
|
||||
@@ -48,6 +49,7 @@ cups/testcreds
|
||||
cups/testcups
|
||||
cups/testdest
|
||||
cups/testfile
|
||||
cups/testgetdests
|
||||
cups/testhttp
|
||||
cups/testi18n
|
||||
cups/testipp
|
||||
@@ -69,6 +71,7 @@ filter/rastertohp
|
||||
filter/rastertolabel
|
||||
filter/rastertopwg
|
||||
filter/test.raster
|
||||
filter/testclient
|
||||
filter/testraster
|
||||
locale/checkpo
|
||||
locale/po2strings
|
||||
@@ -89,6 +92,7 @@ notifier/mailto
|
||||
notifier/rss
|
||||
notifier/testnotify
|
||||
packaging/cups.list
|
||||
org.cups.docset*
|
||||
patches
|
||||
ppdc/genstrings
|
||||
ppdc/ppd/
|
||||
@@ -142,10 +146,11 @@ systemv/reject
|
||||
templates/header.tmpl
|
||||
templates/*/header.tmpl
|
||||
test/cups-str-*.html
|
||||
test/error_log-*
|
||||
test/*_log-*
|
||||
test/ippfind
|
||||
test/ippfind-static
|
||||
test/ippserver
|
||||
test/ippserver-shared
|
||||
test/ipptool
|
||||
test/ipptool-static
|
||||
xcode/CUPS.xcodeproj/project.xcworkspace/
|
||||
|
||||
+363
@@ -0,0 +1,363 @@
|
||||
CHANGES - 2.2.8 - 2018-06-05
|
||||
============================
|
||||
|
||||
|
||||
Changes in CUPS v2.2.8
|
||||
----------------------
|
||||
|
||||
- Additional changes for the scheduler to substitute default values for invalid
|
||||
job attributes when running in "relaxed conformance" mode (Issue #5229)
|
||||
- The `ipptool` program no longer checks for duplicate attributes when running
|
||||
in list or CSV mode (Issue #5278)
|
||||
- Fixed builds without PAM (Issue #5283)
|
||||
- Fixed `lpoptions` man page (Issue #5286)
|
||||
- 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.2.7
|
||||
----------------------
|
||||
|
||||
- NOTICE: Raw print queues are now deprecated (Issue #5269)
|
||||
- Fixed an Avahi crash bug in the scheduler (Issue #5268)
|
||||
- The IPP Everywhere PPD generator did not include the `cupsJobPassword`
|
||||
keyword, when supported (Issue #5265)
|
||||
- Systemd did not restart cupsd when configuration changes were made that
|
||||
required a restart (Issue #5263)
|
||||
- The Lexmark Optra E310 printer needs the "no-reattach" USB quirk rule
|
||||
(Issue #5259)
|
||||
- The scheduler could crash while adding an IPP Everywhere printer (Issue #5258)
|
||||
- Label printers supported by the rastertolabel driver don't support SNMP, so
|
||||
don't delay printing to test it (Issue #5256)
|
||||
- Fixed a compile issue when PAM is not available (Issue #5253)
|
||||
- Documentation fixes (Issue #5252)
|
||||
- Star Micronics printers need the "unidir" USB quirk rule (Issue #5251)
|
||||
- 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)
|
||||
- Fixed printing to some IPP Everywhere printers (Issue #5238)
|
||||
- Kerberized printing to another CUPS server did not work correctly
|
||||
(Issue #5233)
|
||||
- The `cupsRasterWritePixels` function did not correctly swap bytes for some
|
||||
formats (Issue #5225)
|
||||
- Added a USB quirk rule for Canon MP280 series printers (Issue #5221)
|
||||
- The `ppdInstallableConflict` tested too many constraints (Issue #5213)
|
||||
- More fixes for printing to old CUPS servers (Issue #5211)
|
||||
- The `cupsCopyDest` function now correctly copies the `is_default` value
|
||||
(Issue #5208)
|
||||
- The scheduler did not work with older versions of uClibc (Issue #5188)
|
||||
- The scheduler now substitutes default values for invalid job attributes when
|
||||
running in "relaxed conformance" mode (Issue #5186)
|
||||
- Fixed PAM module detection and added support for the common PAM definitions
|
||||
(Issue #5185)
|
||||
- Fixed a journald support bug in the scheduler (Issue #5181)
|
||||
- The cups-driverd program incorrectly stopped scanning PPDs as soon as a loop
|
||||
was seen (Issue #5170)
|
||||
- Fixed group validation on OpenBSD (Issue #5166)
|
||||
- Fixed the `ippserver` sample code when threading is disabled or unavailable
|
||||
(Issue #5154)
|
||||
- The `cupsEnumDests` function did not include options from the lpoptions files
|
||||
(Issue #5144)
|
||||
- The `SSLOptions` directive now supports `MinTLS` and `MaxTLS` options to
|
||||
control the minimum and maximum TLS versions that will be allowed,
|
||||
respectively (Issue #5119)
|
||||
- The scheduler did not write out dirty configuration and state files if there
|
||||
were open client connections (Issue #5118)
|
||||
- The `lpadmin` command now provides a better error message when an unsupported
|
||||
System V interface script is used (Issue #5111)
|
||||
- The `lp` and `lpr` commands now provide better error messages when the default
|
||||
printer cannot be found (Issue #5096)
|
||||
- No longer support backslash, question mark, or quotes in printer names
|
||||
(Issue #4966)
|
||||
- The CUPS library now supports the latest HTTP Digest authentication
|
||||
specification including support for SHA-256 (Issue #4862)
|
||||
- The `lpstat` command now reports when new jobs are being held (Issue #4761)
|
||||
- The `lpoptions` command incorrectly saved default options (Issue #4717)
|
||||
- The `ppdLocalizeIPPReason` function incorrectly returned a localized version
|
||||
of "none" (rdar://36566269)
|
||||
- TLS connections now properly timeout (rdar://34938533)
|
||||
- The IPP backend did not properly detect failed PDF prints (rdar://34055474)
|
||||
- Temporary files are now placed in the correct directory for sandboxed
|
||||
applications on macOS (rdar://problem/37789645)
|
||||
|
||||
|
||||
Changes in CUPS v2.2.6
|
||||
----------------------
|
||||
|
||||
- DBUS notifications could crash the scheduler (Issue #5143)
|
||||
- Added USB quirks rules for Canon MP540 and Samsung ML-2160 (Issue #5148)
|
||||
- Fixed TLS cipher suite selection with GNU TLS (Issue #5145, Issue #5150)
|
||||
- Localization updates (Issue #5152)
|
||||
|
||||
|
||||
Changes in CUPS v2.2.5
|
||||
----------------------
|
||||
|
||||
- The scheduler's `-t` option did not force all errors to the standard error
|
||||
file, making debugging of configuration problems hard (Issue #5041)
|
||||
- Fixed a typo in the CUPS Programming Manual (Issue #5042)
|
||||
- Fixed RPM packaging issue (Issue #5043, Issue #5044)
|
||||
- The `cupsGetDests` function incorrectly returned an empty list of printers if
|
||||
there was no default printer (Issue #5046)
|
||||
- The `cupsGetDests` function waited too long for network printers (Issue #5049)
|
||||
- Libtool support was completely broken with current libtool versions that use
|
||||
an incompatible command-line syntax (Issue #5050)
|
||||
- Fixed a build issue with `--enable-mallinfo` (Issue #5051)
|
||||
- The ippserver test program contained a deadlock issue (Issue #5054)
|
||||
- The `cupsLocalizeDest*` functions did not provide base localizations for
|
||||
all registered IPP attributes and values (Issue #5056)
|
||||
- The --enable-libtool configure option requires a path to the libtool program,
|
||||
but doesn't document or check for it (Issue #5062)
|
||||
- Fixed the `SSLOptions DenyCBC` option when using GNU TLS (Issue #5065)
|
||||
- Fixed the `ServerTokens None` option (Issue #5065)
|
||||
- Fixed the default `ServerAlias` value from `ServerName` (Issue #5072)
|
||||
- Fixed the adminurl field in the TXT record for fully-qualified `ServerName`
|
||||
values (Issue #5074)
|
||||
- The scheduler now creates a PID file when not running on demand with a modern
|
||||
service launcher (Issue #5080)
|
||||
- The web interface did not support newer language identifiers used by Microsoft
|
||||
web browsers (Issue #5803)
|
||||
- Updated the cups-files.conf and cupsd.conf file documentation for missing
|
||||
directives (Issue #5084)
|
||||
- Fixed an Avahi-related crash bug in the scheduler (Issue #5085, Issue #5086)
|
||||
- Fixed the interactions between the "print-quality" and "cupsPrintQuality"
|
||||
options (Issue #5090)
|
||||
- The IPP Everywhere PPD generator now sorts the supported resolutions before
|
||||
choosing them for draft, normal, and best quality modes (Issue #5091)
|
||||
- Fixed the localization unit test on Linux (Issue #5097)
|
||||
- The CUPS library did not reuse domain sockets (Issue #5098)
|
||||
- Fixed the "make check" target for some environments (Issue #5099)
|
||||
- The scheduler woke up once per second to remove old temporary queues
|
||||
(Issue #5100)
|
||||
- Added USB quirk rule for Kyocera printer (Issue #5102, Issue #5103)
|
||||
- Re-documented the limits of `file:///...` device URIs and moved the FileDevice
|
||||
directive in `cups-files.conf` to the list of deprecated configuration
|
||||
directives (Issue #5117)
|
||||
- Added USB quirk rule for HP LaserJet 1160 printer (Issue #5121)
|
||||
- Fixed the script interpreter detection in the configure script (Issue #5122)
|
||||
- The network backends now retry on more error conditions (Issue #5123)
|
||||
- Added a French translation of the web interface (Issue #5134)
|
||||
- `cupsGetDests2` was not using the supplied HTTP connection (Issue #5135)
|
||||
- `httpAddrConnect` leaked sockets in certain circumstances, causing some
|
||||
printers to hang (rdar://31965686)
|
||||
- Fixed an issue with Chinese localizations on macOS (rdar://32419311)
|
||||
- The IPP backend now always sends the "finishings" attribute for printers that
|
||||
support it because otherwise the client cannot override printer defaults
|
||||
(rdar://33169732)
|
||||
- The `cupsGetNamedDest` function did not use the local default printer
|
||||
(rdar://33228500)
|
||||
- The IPP backend incorrectly sent the "job-pages-per-set" attribute to PDF
|
||||
printers (rdar://33250434)
|
||||
- Fixed the `cups.strings` file that is used on macOS (rdar://33287650)
|
||||
- CUPS now sends the `Date` HTTP header in IPP requests (rdar://33302034)
|
||||
- The `ippCopyAttribute` function did not copy out-of-band values correctly
|
||||
(rdar://33688003)
|
||||
- Fixed the localization fallback code on macOS (rdar://33583699)
|
||||
- The scheduler did not run with a high enough priority, causing problems on
|
||||
busy systems (rdar://33789342)
|
||||
- Added support for Japanese Kaku 1 envelope size (rdar://34774110)
|
||||
- The `ipptool` program's `-P` option did not work correctly.
|
||||
- The `ipptool` program did not compare URI scheme or hostname components
|
||||
correctly for the WITH-ALL-HOSTNAMES, WITH-ALL-SCHEMES, WITH-HOSTNAME, or
|
||||
WITH-SCHEME predicates.
|
||||
|
||||
|
||||
Changes in CUPS v2.2.4
|
||||
----------------------
|
||||
|
||||
- The scheduler did not remove old job files (Issue #4987)
|
||||
- cupsEnumDests did not return early when all printers had been discovered
|
||||
(Issue #4989)
|
||||
- The CUPS build system now supports cross-compilation (Issue #4897)
|
||||
- Added a new CUPS Programming Manual to replace the aging API documentation.
|
||||
- Added the `cupsAddIntegerOption` and `cupsGetIntegerOption` functions
|
||||
(Issue #4992)
|
||||
- The `cupsGetDests` and `cupsCreateJob` functions now support Bonjour printers
|
||||
(Issue #4993)
|
||||
- Added a USB quirk rule for Lexmark E260dn printers (Issue #4994)
|
||||
- Fixed a potential buffer overflow in the `cupstestppd` utility (Issue #4996)
|
||||
- IPP Everywhere improvements (Issue #4998)
|
||||
- Fixed the "cancel all jobs" function in the web interface for several
|
||||
languages (Issue #4999)
|
||||
- Fixed issues with local queues (Issue #5003, Issue #5008, Issue #5009)
|
||||
- The `lpstat` command now supports a `-e` option to enumerate local printers
|
||||
(either previously added or on the network) that can be accessed
|
||||
(Issue #5005)
|
||||
- The `lp` and `lpr` commands now support printing to network printers that
|
||||
haven't yet been added (Issue #5006)
|
||||
- Fixed a typo in the mime.types file.
|
||||
- Fixed a bug in the Spanish web interface template (Issue #5016)
|
||||
- The `cupsEnumDests*` and `cupsGetDest*` functions now report the value of the
|
||||
"printer-is-temporary" Printer Status attribute (Issue #5028)
|
||||
- Added Chinese localization (Issue #5029)
|
||||
- The `cupsCheckDestSupported` function did not support `NULL` values
|
||||
(Issue #5031)
|
||||
- Fixed some issues in the RPM spec file (Issue #5032)
|
||||
- The `cupsConnectDest` function now supports the `CUPS_DEST_FLAGS_DEVICE` flag
|
||||
for explicitly connecting to the device (printer) associated with the
|
||||
destination.
|
||||
- The `SSLOptions` directive in "client.conf" and "cupsd.conf" now supports
|
||||
`DenyCBC` and `DenyTLS1.0` options (Issue #5037)
|
||||
|
||||
|
||||
Changes in CUPS v2.2.3
|
||||
----------------------
|
||||
|
||||
- The IPP backend could get into an infinite loop for certain errors, causing a
|
||||
hung queue (<rdar://problem/28008717>)
|
||||
- The scheduler could pause responding to client requests in order to save state
|
||||
changes to disk (<rdar://problem/28690656>)
|
||||
- Added support for PPD finishing keywords (Issue #4960, Issue #4961,
|
||||
Issue #4962)
|
||||
- The IPP backend did not send a media-col attribute for just the source or type
|
||||
(Issue #4963)
|
||||
- IPP Everywhere print queues did not always support all print qualities
|
||||
supported by the printer (Issue #4953)
|
||||
- IPP Everywhere print queues did not always support all media types supported
|
||||
by the printer (Issue #4953)
|
||||
- The IPP Everywhere PPD generator did not return useful error messages
|
||||
(Issue #4954)
|
||||
- The IPP Everywhere finishings support did not work correctly with common UI or
|
||||
command-line options (Issue #4976)
|
||||
- Fixed an error handling issue for the network backends (Issue #4979)
|
||||
- The default cupsd.conf file did not work on systems compiled without Kerberos
|
||||
support (Issue #4947)
|
||||
- The "reprint job" option was not available for some canceled jobs
|
||||
(Issue #4915)
|
||||
- Updated the job listing in the web interface (Issue #4978)
|
||||
- Fixed some localization issues on macOS (<rdar://problem/27245567>)
|
||||
|
||||
|
||||
Changes in CUPS v2.2.2
|
||||
----------------------
|
||||
|
||||
- Fixed some issues with the Zebra ZPL printer driver (Issue #4898)
|
||||
- Fixed some issues with IPP Everywhere printer support (Issue #4893,
|
||||
Issue #4909, Issue #4916, Issue #4921, Issue #4923, Issue #4932, Issue #4933,
|
||||
Issue #4938)
|
||||
- The rastertopwg filter could crash with certain input (Issue #4942)
|
||||
- Optimized connection usage in the IPP backend (<rdar://problem/29547323>)
|
||||
- The scheduler did not detect when an encrypted connection was closed by the
|
||||
client on Linux (Issue #4901)
|
||||
- The cups-lpd program did not catch all legacy usage of ISO-8859-1
|
||||
(Issue #4899)
|
||||
- Fixed builds on systems without a working poll() implementation (Issue #4905)
|
||||
- Added a USB quirk rule for the Kyocera Ecosys P6026cdn (Issue #4900)
|
||||
- The scheduler no longer creates log files on startup
|
||||
(<rdar://problem/28332470>)
|
||||
- The ippContainsString function now uses case-insensitive comparisons for
|
||||
mimeMediaType, name, and text values in conformance with RFC 2911.
|
||||
- The network backends now log the addresses that were found for a printer
|
||||
(<rdar://problem/29268474>)
|
||||
- Let's Encrypt certificates did not work when the hostname contained uppercase
|
||||
letters (Issue #4919)
|
||||
- Fixed reporting of printed pages in the web interface (Issue #4924)
|
||||
- Updated systemd config files (Issue #4935)
|
||||
- Updated documentation (PR #4896)
|
||||
- Updated localizations (PR #4894, PR #4895, PR #4904, PR #4908, Issue #4946)
|
||||
- Updated packaging files (Issue #4940)
|
||||
|
||||
|
||||
Changes in CUPS v2.2.1
|
||||
----------------------
|
||||
|
||||
- Added "CreateSelfSignedCerts" directive for cups-files.conf to control whether
|
||||
the scheduler automatically creates its own self-signed X.509 certificates for
|
||||
TLS connections (Issue #4876)
|
||||
- http*Connect did not handle partial failures (Issue #4870)
|
||||
- Addressed some build warnings on Linux (Issue #4881)
|
||||
- cupsHashData did not use the correct hashing algorithm
|
||||
(<rdar://problem/28209220>)
|
||||
- Updated man pages (PR #4885)
|
||||
- Updated localizations (PR #4877, PR #4886)
|
||||
|
||||
|
||||
Changes in CUPS v2.2.0
|
||||
----------------------
|
||||
|
||||
- Normalized the TLS certificate validation code and added additional error
|
||||
messages to aid troubleshooting.
|
||||
- The httpConnect functions did not work on Linux when cupsd was not running
|
||||
(Issue #4870)
|
||||
- The --no-remote-any option of cupsctl had no effect (Issue #4866)
|
||||
- http*Connect did not return early when all addresses failed (Issue #4870)
|
||||
|
||||
|
||||
Changes in CUPS v2.2rc1
|
||||
-----------------------
|
||||
|
||||
- Updated the list of supported IPP Everywhere media types.
|
||||
- The IPP backend did not validate TLS credentials properly.
|
||||
- The printer-state-message attribute was not cleared after a print job with no
|
||||
errors (Issue #4851)
|
||||
- The CUPS-Add-Modify-Class and CUPS-Add-Modify-Printer operations did not
|
||||
always return an error for failed adds (Issue #4854)
|
||||
- PPD files with names longer than 127 bytes did not work (Issue #4860)
|
||||
- Updated localizations (Issue #4846, PR #4858)
|
||||
|
||||
|
||||
Changes in CUPS v2.2b2
|
||||
----------------------
|
||||
|
||||
- Added Upstart support (PR #4825)
|
||||
- CUPS now supports Let's Encrypt certificates on Linux.
|
||||
|
||||
|
||||
Changes in CUPS v2.2b1
|
||||
----------------------
|
||||
|
||||
- All CUPS commands now support POSIX options (Issue #4813)
|
||||
- The scheduler now restarts faster (Issue #4760)
|
||||
- Improved performance of web interface with large numbers of jobs (Issue #3819)
|
||||
- Encrypted printing can now be limited to only trusted printers and servers
|
||||
(<rdar://problem/25711658>)
|
||||
- The scheduler now advertises PWG Raster attributes for IPP Everywhere clients
|
||||
(Issue #4428)
|
||||
- The scheduler now logs informational messages for jobs at LogLevel "info"
|
||||
(Issue #4815)
|
||||
- The scheduler now uses the getgrouplist function when available (Issue #4611)
|
||||
- The IPP backend no longer enables compression by default except for certain
|
||||
raster formats that generally benefit from it (<rdar://problem/25166952>)
|
||||
- The scheduler did not handle out-of-disk situations gracefully (Issue #4742)
|
||||
- The LPD mini-daemon now detects invalid UTF-8 sequences in job, document, and
|
||||
user names (Issue #4748)
|
||||
- The IPP backend now continues on to the next job when the remote server/
|
||||
printer puts the job on hold (<rdar://problem/24858548>)
|
||||
- The scheduler did not cancel multi-document jobs immediately
|
||||
(<rdar://problem/24854834>)
|
||||
- The scheduler did not return non-shared printers to local clients unless they
|
||||
connected to the domain socket (<rdar://problem/24566996>)
|
||||
- The scheduler now reads the spool directory if one or more job cache entries
|
||||
point to deleted jobs (<rdar://problem/24048846>)
|
||||
- Added support for disc media sizes (<rdar://problem/20219536>)
|
||||
- The httpAddrConnect and httpConnect* APIs now try connecting to multiple
|
||||
addresses in parallel (<rdar://problem/20643153>)
|
||||
- The cupsd domain socket is no longer world-accessible on macOS
|
||||
(<rdar://problem/7542560>)
|
||||
- Interface scripts are no longer supported for security reasons
|
||||
(<rdar://problem/23135640>)
|
||||
- Added a new cupsHashData API and support for hashed job passwords
|
||||
(<rdar://problem/20221502>)
|
||||
- Localization fixes (<rdar://problem/25292403>, <rdar://problem/25461517>,
|
||||
Issue #4041, Issue #4796)
|
||||
- Documentation changes (Issue #4624, Issue #4781)
|
||||
- Packaging fixes (PR #4832)
|
||||
-119
@@ -1,119 +0,0 @@
|
||||
CHANGES.txt - 2.2.2 - 2017-01-17
|
||||
--------------------------------
|
||||
|
||||
CHANGES IN CUPS V2.2.2
|
||||
|
||||
- Fixed some issues with the Zebra ZPL printer driver (Issue #4898)
|
||||
- Fixed some issues with IPP Everywhere printer support (Issue #4893,
|
||||
Issue #4909, Issue #4916, Issue #4921, Issue #4923, Issue #4932,
|
||||
Issue #4933, Issue #4938)
|
||||
- The rastertopwg filter could crash with certain input (Issue #4942)
|
||||
- Optimized connection usage in the IPP backend
|
||||
(<rdar://problem/29547323>)
|
||||
- The scheduler did not detect when an encrypted connection was closed
|
||||
by the client on Linux (Issue #4901)
|
||||
- The cups-lpd program did not catch all legacy usage of ISO-8859-1
|
||||
(Issue #4899)
|
||||
- Fixed builds on systems without a working poll() implementation
|
||||
(Issue #4905)
|
||||
- Added a USB quirk rule for the Kyocera Ecosys P6026cdn (Issue #4900)
|
||||
- The scheduler no longer creates log files on startup
|
||||
(<rdar://problem/28332470>)
|
||||
- The ippContainsString function now uses case-insensitive comparisons
|
||||
for mimeMediaType, name, and text values in conformance with RFC 2911.
|
||||
- The network backends now log the addresses that were found for a
|
||||
printer (<rdar://problem/29268474>)
|
||||
- Let's Encrypt certificates did not work when the hostname contained
|
||||
uppercase letters (Issue #4919)
|
||||
- Fixed reporting of printed pages in the web interface (Issue #4924)
|
||||
- Updated systemd config files (Issue #4935)
|
||||
- Updated documentation (PR #4896)
|
||||
- Updated localizations (PR #4894, PR #4895, PR #4904, PR #4908,
|
||||
Issue #4946)
|
||||
- Updated packaging files (Issue #4940)
|
||||
|
||||
|
||||
CHANGES IN CUPS V2.2.1
|
||||
|
||||
- Added "CreateSelfSignedCerts" directive for cups-files.conf to
|
||||
control whether the scheduler automatically creates its own
|
||||
self-signed X.509 certificates for TLS connections (Issue #4876)
|
||||
- http*Connect did not handle partial failures (Issue #4870)
|
||||
- Addressed some build warnings on Linux (Issue #4881)
|
||||
- cupsHashData did not use the correct hashing algorithm
|
||||
(<rdar://problem/28209220>)
|
||||
- Updated man pages (PR #4885)
|
||||
- Updated localizations (PR #4877, PR #4886)
|
||||
|
||||
|
||||
CHANGES IN CUPS V2.2.0
|
||||
|
||||
- Normalized the TLS certificate validation code and added additional
|
||||
error messages to aid troubleshooting.
|
||||
- http*Connect did not work on Linux when cupsd was not running
|
||||
(Issue #4870)
|
||||
- The --no-remote-any option of cupsctl had no effect (Issue #4866)
|
||||
- http*Connect did not return early when all addresses failed
|
||||
(Issue #4870)
|
||||
|
||||
|
||||
CHANGES IN CUPS V2.2rc1
|
||||
|
||||
- Updated the list of supported IPP Everywhere media types.
|
||||
- The IPP backend did not validate TLS credentials properly.
|
||||
- The printer-state-message attribute was not cleared after a
|
||||
print job with no errors (Issue #4851)
|
||||
- The CUPS-Add-Modify-Class and CUPS-Add-Modify-Printer operations did
|
||||
not always return an error for failed adds (Issue #4854)
|
||||
- PPD files with names longer than 127 bytes did not work (Issue #4860)
|
||||
- Updated localizations (Issue #4846, PR #4858)
|
||||
|
||||
|
||||
CHANGES IN CUPS V2.2b2
|
||||
|
||||
- Added Upstart support (PR #4825)
|
||||
- CUPS now supports Let's Encrypt certificates on Linux.
|
||||
|
||||
|
||||
CHANGES IN CUPS V2.2b1
|
||||
|
||||
- All CUPS commands now support POSIX options (Issue #4813)
|
||||
- The scheduler now restarts faster (Issue #4760)
|
||||
- Improved performance of web interface with large numbers of jobs
|
||||
(Issue #3819)
|
||||
- Encrypted printing can now be limited to only trusted printers and
|
||||
servers (<rdar://problem/25711658>)
|
||||
- The scheduler now advertises PWG Raster attributes for IPP Everywhere
|
||||
clients (Issue #4428)
|
||||
- The scheduler now logs informational messages for jobs at LogLevel
|
||||
"info" (Issue #4815)
|
||||
- The scheduler now uses the getgrouplist function when available
|
||||
(Issue #4611)
|
||||
- The IPP backend no longer enables compression by default except for
|
||||
certain raster formats that generally benefit from it
|
||||
(<rdar://problem/25166952>)
|
||||
- The scheduler did not handle out-of-disk situations gracefully
|
||||
(Issue #4742)
|
||||
- The LPD mini-daemon now detects invalid UTF-8 sequences in job,
|
||||
document, and user names (Issue #4748)
|
||||
- The IPP backend now continues on to the next job when the remote
|
||||
server/printer puts the job on hold (<rdar://problem/24858548>)
|
||||
- The scheduler did not cancel multi-document jobs immediately
|
||||
(<rdar://problem/24854834>)
|
||||
- The scheduler did not return non-shared printers to local clients
|
||||
unless they connected to the domain socket (<rdar://problem/24566996>)
|
||||
- The scheduler now reads the spool directory if one or more job cache
|
||||
entries point to deleted jobs (<rdar://problem/24048846>)
|
||||
- Added support for disc media sizes (<rdar://problem/20219536>)
|
||||
- The httpAddrConnect and httpConnect* APIs now try connecting to
|
||||
multiple addresses in parallel (<rdar://problem/20643153>)
|
||||
- The cupsd domain socket is no longer world-accessible on macOS
|
||||
(<rdar://problem/7542560>)
|
||||
- Interface scripts are no longer supported for security reasons
|
||||
(<rdar://problem/23135640>)
|
||||
- Added a new cupsHashData API and support for hashed job passwords
|
||||
(<rdar://problem/20221502>)
|
||||
- Localization fixes (<rdar://problem/25292403>,
|
||||
<rdar://problem/25461517>, Issue #4041, Issue #4796)
|
||||
- Documentation changes (Issue #4624, Issue #4781)
|
||||
- Packaging fixes (PR #4832)
|
||||
@@ -1,8 +1,8 @@
|
||||
CREDITS.txt - 2016-06-21
|
||||
------------------------
|
||||
CREDITS - 2017-05-01
|
||||
====================
|
||||
|
||||
Few projects are completed by one person, and CUPS is no exception. We'd
|
||||
like to thank the following individuals for their contributions:
|
||||
Few projects are completed by one person, and CUPS is no exception. We'd like
|
||||
to thank the following individuals for their contributions:
|
||||
|
||||
Niklas 'Nille' Åkerström - Swedish localization.
|
||||
Nathaniel Barbour - Lots of testing and feedback.
|
||||
+227
@@ -0,0 +1,227 @@
|
||||
INSTALL - CUPS v2.2.8 - 2018-06-05
|
||||
==================================
|
||||
|
||||
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".
|
||||
|
||||
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.
|
||||
|
||||
> 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
|
||||
----------------
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
On a stock Ubuntu install, the following command will install the required
|
||||
prerequisites:
|
||||
|
||||
sudo apt-get install autoconf build-essential libavahi-client-dev \
|
||||
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
|
||||
-------------
|
||||
|
||||
CUPS uses GNU autoconf, so you should find the usual "configure" script in the
|
||||
main CUPS source directory. To configure CUPS for your system, type:
|
||||
|
||||
./configure
|
||||
|
||||
The default installation will put the CUPS software in the "/etc", "/usr", and
|
||||
"/var" directories on your system, which will overwrite any existing printing
|
||||
commands on your system. Use the `--prefix` option to install the CUPS software
|
||||
in another location:
|
||||
|
||||
./configure --prefix=/some/directory
|
||||
|
||||
> 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:
|
||||
|
||||
setenv CFLAGS "-I/some/directory"
|
||||
setenv CPPFLAGS "-I/some/directory"
|
||||
setenv CXXFLAGS "-I/some/directory"
|
||||
setenv DSOFLAGS "-L/some/directory"
|
||||
setenv LDFLAGS "-L/some/directory"
|
||||
./configure ...
|
||||
|
||||
or:
|
||||
|
||||
CFLAGS="-I/some/directory" \
|
||||
CPPFLAGS="-I/some/directory" \
|
||||
CXXFLAGS="-I/some/directory" \
|
||||
DSOFLAGS="-L/some/directory" \
|
||||
LDFLAGS="-L/some/directory" \
|
||||
./configure ...
|
||||
|
||||
The `--enable-debug` option compiles CUPS with debugging information enabled.
|
||||
Additional debug logging support can be enabled using the
|
||||
`--enable-debug-printfs` option - these debug messages are enabled using the
|
||||
`CUPS_DEBUG_xxx` environment variables at run-time.
|
||||
|
||||
CUPS also includes an extensive set of unit tests that can be used to find and
|
||||
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
|
||||
|
||||
or if you have FreeBSD, NetBSD, or OpenBSD type:
|
||||
|
||||
gmake ENTER
|
||||
|
||||
to build 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 check ENTER
|
||||
|
||||
or if you have FreeBSD, NetBSD, or OpenBSD type:
|
||||
|
||||
gmake check ENTER
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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
|
||||
|
||||
or for FreeBSD, NetBSD, or OpenBSD:
|
||||
|
||||
gmake install ENTER
|
||||
|
||||
Use the BUILDROOT variable to install to an alternate root directory:
|
||||
|
||||
make BUILDROOT=/some/other/root/directory install ENTER
|
||||
|
||||
You can also build binary packages that can be installed on other machines using
|
||||
the RPM spec file ("packaging/cups.spec") or EPM list file
|
||||
("packaging/cups.list"). The latter also supports building of binary RPMs, 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:
|
||||
|
||||
https://michaelrsweet.github.io/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 <format> ENTER
|
||||
|
||||
or
|
||||
|
||||
gmake <format> ENTER
|
||||
|
||||
for FreeBSD, NetBSD, and OpenBSD. The <format> target is one of the following:
|
||||
|
||||
- "epm": Builds a script + tarfile package
|
||||
- "bsd": Builds a *BSD package
|
||||
- "deb": Builds a Debian package
|
||||
- "pkg": Builds a Solaris package
|
||||
- "rpm": Builds a RPM package
|
||||
- "slackware": Build a Slackware package
|
||||
|
||||
|
||||
GETTING DEBUG LOGGING FROM CUPS
|
||||
-------------------------------
|
||||
|
||||
When configured with the `--enable-debug-printfs` option, CUPS compiles in
|
||||
additional debug logging support in the scheduler, CUPS API, and CUPS Imaging
|
||||
API. The following environment variables are used to enable and control debug
|
||||
logging:
|
||||
|
||||
- `CUPS_DEBUG_FILTER`: Specifies a POSIX regular expression to control which
|
||||
messages are logged.
|
||||
- `CUPS_DEBUG_LEVEL`: Specifies a number from 0 to 9 to control the verbosity of
|
||||
the logging. The default level is 1.
|
||||
- `CUPS_DEBUG_LOG`: Specifies a log file to use. Specify the name "-" to send
|
||||
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.
|
||||
-212
@@ -1,212 +0,0 @@
|
||||
INSTALL - CUPS v2.2.2 - 2017-01-17
|
||||
----------------------------------
|
||||
|
||||
This file describes how to compile and install CUPS from source code. For more
|
||||
information on CUPS see the file called "README.txt". A complete change log can
|
||||
be found in "CHANGES.txt".
|
||||
|
||||
*******************************************************************************
|
||||
*******************************************************************************
|
||||
**** ****
|
||||
**** 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. ****
|
||||
**** ****
|
||||
*******************************************************************************
|
||||
*******************************************************************************
|
||||
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
CUPS uses GNU autoconf, so you should find the usual "configure" script in
|
||||
the main CUPS source directory. To configure CUPS for your system, type:
|
||||
|
||||
./configure
|
||||
|
||||
The default installation will put the CUPS software in the "/etc", "/usr",
|
||||
and "/var" directories on your system, which will overwrite any existing
|
||||
printing commands on your system. Use the "--prefix" option to install the
|
||||
CUPS software in another location:
|
||||
|
||||
./configure --prefix=/some/directory
|
||||
|
||||
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:
|
||||
|
||||
setenv CFLAGS "-I/some/directory"
|
||||
setenv CPPFLAGS "-I/some/directory"
|
||||
setenv CXXFLAGS "-I/some/directory"
|
||||
setenv DSOFLAGS "-L/some/directory"
|
||||
setenv LDFLAGS "-L/some/directory"
|
||||
./configure ...
|
||||
|
||||
or:
|
||||
|
||||
CFLAGS="-I/some/directory" \
|
||||
CPPFLAGS="-I/some/directory" \
|
||||
CXXFLAGS="-I/some/directory" \
|
||||
DSOFLAGS="-L/some/directory" \
|
||||
LDFLAGS="-L/some/directory" \
|
||||
./configure ...
|
||||
|
||||
The "--enable-debug" option compiles CUPS with debugging information
|
||||
enabled. Additional debug logging support can be enabled using the
|
||||
"--enable-debug-printfs" option - these debug messages are enabled using the
|
||||
CUPS_DEBUG_LOG environment variable at run-time.
|
||||
|
||||
CUPS also includes an extensive set of unit tests that can be used to find
|
||||
and 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" ...
|
||||
|
||||
Note: Current versions of macOS DO NOT allow installation to
|
||||
/usr with the default system integrity settings. In addition,
|
||||
we do not recommend replacing the CUPS supplied with macOS
|
||||
because not all versions of CUPS are compatible with every
|
||||
macOS release, and because software updates will replace parts
|
||||
of your local installation potentially rendering your system
|
||||
unusable.
|
||||
|
||||
Once you have configured things, just type:
|
||||
|
||||
make ENTER
|
||||
|
||||
or if you have FreeBSD, NetBSD, or OpenBSD type:
|
||||
|
||||
gmake ENTER
|
||||
|
||||
to build 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 check ENTER
|
||||
|
||||
or if you have FreeBSD, NetBSD, or OpenBSD type:
|
||||
|
||||
gmake check ENTER
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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
|
||||
|
||||
or for FreeBSD, NetBSD, or OpenBSD:
|
||||
|
||||
gmake install ENTER
|
||||
|
||||
Use the BUILDROOT variable to install to an alternate root directory:
|
||||
|
||||
make BUILDROOT=/some/other/root/directory install ENTER
|
||||
|
||||
You can also build binary packages that can be installed on other machines
|
||||
using the RPM spec file ("packaging/cups.spec") or EPM list file
|
||||
("packaging/cups.list"). The latter also supports building of binary RPMs,
|
||||
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:
|
||||
|
||||
http://www.msweet.org/
|
||||
|
||||
|
||||
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 <format> ENTER
|
||||
|
||||
or
|
||||
|
||||
gmake <format> ENTER
|
||||
|
||||
for FreeBSD, NetBSD, and OpenBSD. The <format> target is one of the
|
||||
following:
|
||||
|
||||
epm - Builds a script + tarfile package
|
||||
bsd - Builds a *BSD package
|
||||
deb - Builds a Debian package
|
||||
pkg - Builds a Solaris package
|
||||
rpm - Builds a RPM package
|
||||
slackware - Build a Slackware package
|
||||
|
||||
|
||||
GETTING DEBUG LOGGING FROM CUPS
|
||||
|
||||
When configured with the "--enable-debug-printfs" option, CUPS compiles in
|
||||
additional debug logging support in the scheduler, CUPS API, and CUPS
|
||||
Imaging API. The following environment variables are used to enable and
|
||||
control debug logging:
|
||||
|
||||
CUPS_DEBUG_FILTER Specifies a POSIX regular expression to control
|
||||
which messages are logged.
|
||||
CUPS_DEBUG_LEVEL Specifies a number from 0 to 9 to control the
|
||||
verbosity of the logging. The default level is 1.
|
||||
CUPS_DEBUG_LOG Specifies a log file to use. Specify the name "-"
|
||||
to send the messages to stderr. Prefix a filename
|
||||
with "+" to append to an existing file.
|
||||
|
||||
|
||||
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:
|
||||
|
||||
http://www.cups.org/
|
||||
|
||||
Include your operating system and version, compiler and version, and any
|
||||
errors or problems you've run into. The "config.log" file and the output
|
||||
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.
|
||||
+25
-7
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Common makefile definitions for CUPS.
|
||||
#
|
||||
# Copyright 2007-2014 by Apple Inc.
|
||||
# Copyright 2007-2017 by Apple Inc.
|
||||
# Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
@@ -11,22 +11,32 @@
|
||||
# missing or damaged, see the license at "http://www.cups.org/".
|
||||
#
|
||||
|
||||
#
|
||||
# CUPS version...
|
||||
#
|
||||
|
||||
CUPS_VERSION = @CUPS_VERSION@
|
||||
|
||||
|
||||
#
|
||||
# Programs...
|
||||
#
|
||||
|
||||
AR = @AR@
|
||||
AWK = @AWK@
|
||||
CC = @LIBTOOL@ @CC@
|
||||
CC = @LIBTOOL_CC@ @CC@
|
||||
CHMOD = @CHMOD@
|
||||
CXX = @LIBTOOL@ @CXX@
|
||||
CXX = @LIBTOOL_CXX@ @CXX@
|
||||
DSO = @DSO@
|
||||
DSOXX = @DSOXX@
|
||||
GZIP = @GZIP@
|
||||
INSTALL = @INSTALL@
|
||||
LD = @LD@
|
||||
LD_CC = @LD_CC@
|
||||
LD_CXX = @LD_CXX@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LN = @LN@ -sf
|
||||
MKDIR = @MKDIR@ -p
|
||||
MV = @MV@
|
||||
RANLIB = @RANLIB@
|
||||
RM = @RM@ -f
|
||||
@@ -38,14 +48,14 @@ SHELL = /bin/sh
|
||||
# Installation programs...
|
||||
#
|
||||
|
||||
INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
|
||||
INSTALL_BIN = @LIBTOOL_INSTALL@ $(INSTALL) -c -m @CUPS_EXE_FILE_PERM@ @INSTALL_STRIP@
|
||||
INSTALL_COMPDATA = $(INSTALL) -c -m 444 @INSTALL_GZIP@
|
||||
INSTALL_CONFIG = $(INSTALL) -c -m @CUPS_CONFIG_FILE_PERM@
|
||||
INSTALL_DATA = $(INSTALL) -c -m 444
|
||||
INSTALL_DIR = $(INSTALL) -d
|
||||
INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
|
||||
INSTALL_LIB = @LIBTOOL_INSTALL@ $(INSTALL) -c -m @CUPS_EXE_FILE_PERM@ @INSTALL_STRIP@
|
||||
INSTALL_MAN = $(INSTALL) -c -m 444
|
||||
INSTALL_SCRIPT = $(INSTALL) -c -m 555
|
||||
INSTALL_SCRIPT = $(INSTALL) -c -m @CUPS_EXE_FILE_PERM@
|
||||
|
||||
#
|
||||
# Default user, group, and system groups for the scheduler...
|
||||
@@ -72,6 +82,14 @@ LANGUAGES = @LANGUAGES@
|
||||
INSTALL_LANGUAGES = @INSTALL_LANGUAGES@
|
||||
UNINSTALL_LANGUAGES = @UNINSTALL_LANGUAGES@
|
||||
|
||||
#
|
||||
# Cross-compilation support: "local" target is used for any tools that are
|
||||
# built and run locally.
|
||||
#
|
||||
|
||||
LOCALTARGET = @LOCALTARGET@
|
||||
|
||||
|
||||
#
|
||||
# Libraries...
|
||||
#
|
||||
@@ -141,7 +159,7 @@ IPPFIND_MAN = @IPPFIND_MAN@
|
||||
LDFLAGS = -L../cgi-bin -L../cups -L../filter -L../ppdc \
|
||||
-L../scheduler @LDARCHFLAGS@ \
|
||||
@LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM)
|
||||
LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(DNSSDLIBS) $(LIBZ)
|
||||
LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(DNSSDLIBS) $(SSLLIBS) $(LIBZ)
|
||||
LINKCUPSIMAGE = @LINKCUPSIMAGE@
|
||||
LIBS = $(LINKCUPS) $(COMMONLIBS)
|
||||
ONDEMANDFLAGS = @ONDEMANDFLAGS@
|
||||
|
||||
+1
-1
@@ -317,7 +317,7 @@ EPMFLAGS = -v --output-dir dist $(EPMARCH)
|
||||
bsd deb epm pkg rpm slackware:
|
||||
epm $(EPMFLAGS) -f $@ cups packaging/cups.list
|
||||
|
||||
.PHONEY: dist
|
||||
.PHONY: dist
|
||||
dist: all
|
||||
$(RM) -r dist
|
||||
$(MAKE) $(MFLAGS) epm
|
||||
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
README - CUPS v2.2.8 - 2018-06-05
|
||||
=================================
|
||||
|
||||
Looking for compile instructions? Read the file `INSTALL.md` instead...
|
||||
|
||||
|
||||
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.
|
||||
|
||||
CUPS is licensed under the GNU General Public License and GNU Library General
|
||||
Public License versions 2. See the file "LICENSE.txt" for more information.
|
||||
|
||||
|
||||
READING THE DOCUMENTATION
|
||||
-------------------------
|
||||
|
||||
Once you have installed the software you can access the documentation (and a
|
||||
bunch of other stuff) online at <http://localhost:631/>.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
GETTING SUPPORT AND OTHER RESOURCES
|
||||
-----------------------------------
|
||||
|
||||
If you have problems, *read the documentation first!* We also provide two
|
||||
mailing lists which are available at <https://lists.cups.org/mailman/listinfo>.
|
||||
|
||||
See the CUPS web site at <https://www.cups.org/> for other resources.
|
||||
|
||||
|
||||
SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER
|
||||
------------------------------------------------
|
||||
|
||||
CUPS includes a web-based administration tool that allows you to manage
|
||||
printers, classes, and jobs on your server. Open <http://localhost:631/admin/>
|
||||
in your browser to access the printer administration tools:
|
||||
|
||||
*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/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
|
||||
|
||||
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:
|
||||
|
||||
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
|
||||
|
||||
Current network printers typically use `ipp` or `ipps` URIS:
|
||||
|
||||
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
|
||||
--------------
|
||||
|
||||
CUPS provides both the System V `lp` and Berkeley `lpr` commands for printing:
|
||||
|
||||
lp filename
|
||||
lpr filename
|
||||
|
||||
Both the `lp` and `lpr` commands support printing options for the driver:
|
||||
|
||||
lp -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.
|
||||
|
||||
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
|
||||
|
||||
This will prevent the filters from misinterpreting your print file.
|
||||
|
||||
|
||||
LEGAL STUFF
|
||||
-----------
|
||||
|
||||
CUPS is copyright © 2007-2018 by Apple Inc. CUPS and the CUPS logo are
|
||||
trademarks of Apple Inc.
|
||||
|
||||
The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
|
||||
|
||||
CUPS is provided under the terms of version 2 of the GNU General Public License
|
||||
and GNU Library General Public License. This program is distributed in the hope
|
||||
that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
`doc/help/license.html` or `LICENSE.txt` files for more information.
|
||||
-157
@@ -1,157 +0,0 @@
|
||||
README - CUPS v2.2.2 - 2017-01-17
|
||||
---------------------------------
|
||||
|
||||
Looking for compile instructions? Read the file "INSTALL.txt" instead...
|
||||
|
||||
|
||||
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.
|
||||
|
||||
CUPS is licensed under the GNU General Public License and GNU Library
|
||||
General Public License versions 2. See the file "LICENSE.txt" for more
|
||||
information.
|
||||
|
||||
|
||||
READING THE DOCUMENTATION
|
||||
|
||||
Once you have installed the software you can access the documentation (and
|
||||
a bunch of other stuff) online at:
|
||||
|
||||
http://localhost:631/
|
||||
|
||||
If you're having trouble getting that far, the documentation is located
|
||||
under the "doc/help" directory.
|
||||
|
||||
Please read the documentation before asking questions.
|
||||
|
||||
|
||||
GETTING SUPPORT AND OTHER RESOURCES
|
||||
|
||||
If you have problems, READ THE DOCUMENTATION FIRST! We also provide two
|
||||
mailing lists which are available at:
|
||||
|
||||
http://lists.cups.org/mailman/listinfo
|
||||
|
||||
See the CUPS web site at "http://www.cups.org/" for other resources.
|
||||
|
||||
|
||||
SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER
|
||||
|
||||
CUPS includes a web-based administration tool that allows you to manage
|
||||
printers, classes, and jobs on your server. Open the following URL in your
|
||||
browser to access the printer administration tools:
|
||||
|
||||
http://localhost:631/admin/
|
||||
|
||||
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/lpadmin group on your system) when performing any
|
||||
administrative function.
|
||||
|
||||
|
||||
SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
|
||||
|
||||
CUPS works best with PPD (PostScript Printer Description) files. In a pinch
|
||||
you can also use System V style printer interface scripts.
|
||||
|
||||
CUPS includes several sample PPD files you can use:
|
||||
|
||||
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
|
||||
|
||||
Run the "lpinfo -m" command to list the available drivers:
|
||||
|
||||
lpinfo -m
|
||||
|
||||
Run the "lpinfo -v" command to list the available printers:
|
||||
|
||||
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
|
||||
|
||||
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.
|
||||
|
||||
CUPS also supports IPP Everywhere printers using the "everywhere" model,
|
||||
for example:
|
||||
|
||||
lpadmin -p printername -E -v ipp://11.22.33.44/ipp/print -m everywhere
|
||||
|
||||
|
||||
PRINTING FILES
|
||||
|
||||
CUPS provides both the System V "lp" and Berkeley "lpr" commands for
|
||||
printing:
|
||||
|
||||
lp filename
|
||||
lpr filename
|
||||
|
||||
Both the "lp" and "lpr" commands support printing options for the driver:
|
||||
|
||||
lp -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.
|
||||
|
||||
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
|
||||
|
||||
This will prevent the filters from misinterpreting your print file.
|
||||
|
||||
|
||||
LEGAL STUFF
|
||||
|
||||
CUPS is Copyright 2007-2017 by Apple Inc. CUPS and the CUPS logo are
|
||||
trademarks of Apple Inc.
|
||||
|
||||
The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
|
||||
|
||||
CUPS is provided under the terms of version 2 of the GNU General Public
|
||||
License and GNU Library General Public License. This program is distributed
|
||||
in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||||
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the "doc/help/license.html" or "LICENSE.txt" files for more information.
|
||||
+12
-12
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Backend makefile for CUPS.
|
||||
#
|
||||
# Copyright 2007-2016 by Apple Inc.
|
||||
# Copyright 2007-2017 by Apple Inc.
|
||||
# Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
@@ -24,7 +24,7 @@ include ../Makedefs
|
||||
# UBACKENDS and ULBACKENDS are installed mode 0755 so cupsd will run them as
|
||||
# an unprivileged user...
|
||||
#
|
||||
# See http://www.cups.org/documentation.php/api-filter.html for more info...
|
||||
# See http://www.cups.org/doc/api-filter.html for more info...
|
||||
RBACKENDS = \
|
||||
ipp \
|
||||
lpd \
|
||||
@@ -207,7 +207,7 @@ uninstall:
|
||||
|
||||
test1284: test1284.o ../cups/$(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o test1284 test1284.o ../cups/$(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o test1284 test1284.o ../cups/$(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -217,7 +217,7 @@ test1284: test1284.o ../cups/$(LIBCUPSSTATIC)
|
||||
|
||||
testbackend: testbackend.o ../cups/$(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o testbackend testbackend.o ../cups/$(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o testbackend testbackend.o ../cups/$(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -227,7 +227,7 @@ testbackend: testbackend.o ../cups/$(LIBCUPSSTATIC)
|
||||
|
||||
testsupplies: testsupplies.o libbackend.a ../cups/$(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o testsupplies testsupplies.o libbackend.a \
|
||||
$(LD_CC) $(LDFLAGS) -o testsupplies testsupplies.o libbackend.a \
|
||||
../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
|
||||
$(COMMONLIBS) $(LIBZ)
|
||||
|
||||
@@ -249,7 +249,7 @@ libbackend.a: $(LIBOBJS)
|
||||
|
||||
dnssd: dnssd.o ../cups/$(LIBCUPS) libbackend.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o dnssd dnssd.o libbackend.a $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o dnssd dnssd.o libbackend.a $(LIBS)
|
||||
if test `uname` = Darwin; then \
|
||||
$(RM) mdns; \
|
||||
$(LN) dnssd mdns; \
|
||||
@@ -262,7 +262,7 @@ dnssd: dnssd.o ../cups/$(LIBCUPS) libbackend.a
|
||||
|
||||
ipp: ipp.o ../cups/$(LIBCUPS) libbackend.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS)
|
||||
$(RM) http
|
||||
$(LN) ipp http
|
||||
|
||||
@@ -273,7 +273,7 @@ ipp: ipp.o ../cups/$(LIBCUPS) libbackend.a
|
||||
|
||||
lpd: lpd.o ../cups/$(LIBCUPS) libbackend.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpd lpd.o libbackend.a $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o lpd lpd.o libbackend.a $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -282,7 +282,7 @@ lpd: lpd.o ../cups/$(LIBCUPS) libbackend.a
|
||||
|
||||
snmp: snmp.o ../cups/$(LIBCUPS) libbackend.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o snmp snmp.o libbackend.a $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o snmp snmp.o libbackend.a $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -291,11 +291,11 @@ snmp: snmp.o ../cups/$(LIBCUPS) libbackend.a
|
||||
|
||||
socket: socket.o ../cups/$(LIBCUPS) libbackend.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o socket socket.o libbackend.a $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o socket socket.o libbackend.a $(LIBS)
|
||||
|
||||
socket-static: socket.o ../cups/$(LIBCUPSSTATIC) libbackend.a
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o socket-static socket.o libbackend.a \
|
||||
$(LD_CC) $(LDFLAGS) -o socket-static socket.o libbackend.a \
|
||||
../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
|
||||
$(COMMONLIBS) $(LIBZ)
|
||||
|
||||
@@ -306,7 +306,7 @@ socket-static: socket.o ../cups/$(LIBCUPSSTATIC) libbackend.a
|
||||
|
||||
usb: usb.o ../cups/$(LIBCUPS) libbackend.a
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o usb usb.o libbackend.a $(LIBUSB) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o usb usb.o libbackend.a $(LIBUSB) \
|
||||
$(BACKLIBS) $(LIBS)
|
||||
usb.o: usb.c usb-darwin.c usb-libusb.c usb-unix.c
|
||||
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* DNS-SD discovery backend for CUPS.
|
||||
*
|
||||
* Copyright 2008-2015 by Apple Inc.
|
||||
* Copyright 2008-2017 by Apple Inc.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -949,7 +949,7 @@ get_device(cups_array_t *devices, /* I - Device array */
|
||||
*
|
||||
* Note: This function is needed because avahi_simple_poll_iterate is broken
|
||||
* and always uses a timeout of 0 (!) milliseconds.
|
||||
* (Avahi Ticket #364)
|
||||
* (https://github.com/lathiat/avahi/issues/127)
|
||||
*/
|
||||
|
||||
static int /* O - Number of file descriptors matching */
|
||||
|
||||
+45
-17
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* IPP backend for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -47,6 +47,8 @@ extern void xpc_connection_set_target_uid(xpc_connection_t connection,
|
||||
#define _CUPS_JSR_ACCOUNT_LIMIT_REACHED 0x08
|
||||
#define _CUPS_JSR_JOB_PASSWORD_WAIT 0x10
|
||||
#define _CUPS_JSR_JOB_RELEASE_WAIT 0x20
|
||||
#define _CUPS_JSR_DOCUMENT_FORMAT_ERROR 0x40
|
||||
#define _CUPS_JSR_DOCUMENT_UNPRINTABLE 0x80
|
||||
|
||||
|
||||
/*
|
||||
@@ -69,6 +71,7 @@ typedef struct _cups_monitor_s /**** Monitoring data ****/
|
||||
http_encryption_t encryption; /* Use encryption? */
|
||||
ipp_jstate_t job_state; /* Current job state */
|
||||
ipp_pstate_t printer_state; /* Current printer state */
|
||||
int retryable; /* Is this a job that should be retried? */
|
||||
} _cups_monitor_t;
|
||||
|
||||
|
||||
@@ -357,8 +360,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
* that way.
|
||||
*/
|
||||
|
||||
if (!getuid() && (value = getenv("AUTH_UID")) != NULL &&
|
||||
!getenv("AUTH_PASSWORD"))
|
||||
if (!getuid() && (value = getenv("AUTH_UID")) != NULL)
|
||||
{
|
||||
uid_t uid = (uid_t)atoi(value);
|
||||
/* User ID */
|
||||
@@ -392,7 +394,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
# else /* No XPC, just try to run as the user ID */
|
||||
if (uid > 0)
|
||||
seteuid(uid);
|
||||
setuid(uid);
|
||||
# endif /* HAVE_XPC */
|
||||
}
|
||||
#endif /* HAVE_GSSAPI */
|
||||
@@ -743,8 +745,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
|
||||
|
||||
if (errno == ECONNREFUSED || errno == EHOSTDOWN ||
|
||||
errno == EHOSTUNREACH)
|
||||
if (errno == ECONNREFUSED || errno == EHOSTDOWN || errno == EHOSTUNREACH || errno == ETIMEDOUT || errno == ENOTCONN)
|
||||
{
|
||||
if (contimeout && (time(NULL) - start_time) > contimeout)
|
||||
{
|
||||
@@ -763,13 +764,13 @@ main(int argc, /* I - Number of command-line args */
|
||||
break;
|
||||
|
||||
case EHOSTUNREACH :
|
||||
default :
|
||||
_cupsLangPrintFilter(stderr, "WARNING",
|
||||
_("The printer is unreachable at this "
|
||||
"time."));
|
||||
break;
|
||||
|
||||
case ECONNREFUSED :
|
||||
default :
|
||||
_cupsLangPrintFilter(stderr, "WARNING",
|
||||
_("The printer is in use."));
|
||||
break;
|
||||
@@ -1449,6 +1450,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
monitor.encryption = cupsEncryption();
|
||||
monitor.job_state = IPP_JOB_PENDING;
|
||||
monitor.printer_state = IPP_PRINTER_IDLE;
|
||||
monitor.retryable = argc == 6 && document_format && strcmp(document_format, "image/pwg-raster") && strcmp(document_format, "image/urf");
|
||||
|
||||
if (create_job)
|
||||
{
|
||||
@@ -1469,7 +1471,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
while (!job_canceled && validate_job)
|
||||
{
|
||||
request = new_request(IPP_VALIDATE_JOB, version, uri, argv[2],
|
||||
request = new_request(IPP_OP_VALIDATE_JOB, version, uri, argv[2],
|
||||
monitor.job_name, num_options, options, compression,
|
||||
copies_sup ? copies : 1, document_format, pc, ppd,
|
||||
media_col_sup, doc_handling_sup, print_color_mode_sup);
|
||||
@@ -1533,6 +1535,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
else if (ipp_status < IPP_REDIRECTION_OTHER_SITE ||
|
||||
ipp_status == IPP_BAD_REQUEST)
|
||||
break;
|
||||
else if (job_auth == NULL && ipp_status > IPP_BAD_REQUEST)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2216,7 +2220,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
return (CUPS_BACKEND_HOLD);
|
||||
else if (ipp_status == IPP_INTERNAL_ERROR)
|
||||
return (CUPS_BACKEND_STOP);
|
||||
else if (ipp_status == IPP_CONFLICT)
|
||||
else if (ipp_status == IPP_CONFLICT || ipp_status == IPP_STATUS_ERROR_REQUEST_ENTITY || ipp_status == IPP_STATUS_ERROR_REQUEST_VALUE)
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
else if (ipp_status == IPP_REQUEST_VALUE ||
|
||||
ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES ||
|
||||
@@ -2567,22 +2571,24 @@ monitor_printer(
|
||||
|
||||
for (i = 0; i < attr->num_values; i ++)
|
||||
{
|
||||
if (!strcmp(attr->values[i].string.text,
|
||||
"account-authorization-failed"))
|
||||
if (!strcmp(attr->values[i].string.text, "account-authorization-failed"))
|
||||
new_reasons |= _CUPS_JSR_ACCOUNT_AUTHORIZATION_FAILED;
|
||||
else if (!strcmp(attr->values[i].string.text, "account-closed"))
|
||||
new_reasons |= _CUPS_JSR_ACCOUNT_CLOSED;
|
||||
else if (!strcmp(attr->values[i].string.text, "account-info-needed"))
|
||||
new_reasons |= _CUPS_JSR_ACCOUNT_INFO_NEEDED;
|
||||
else if (!strcmp(attr->values[i].string.text,
|
||||
"account-limit-reached"))
|
||||
else if (!strcmp(attr->values[i].string.text, "account-limit-reached"))
|
||||
new_reasons |= _CUPS_JSR_ACCOUNT_LIMIT_REACHED;
|
||||
else if (!strcmp(attr->values[i].string.text, "job-password-wait"))
|
||||
new_reasons |= _CUPS_JSR_JOB_PASSWORD_WAIT;
|
||||
else if (!strcmp(attr->values[i].string.text, "job-release-wait"))
|
||||
new_reasons |= _CUPS_JSR_JOB_RELEASE_WAIT;
|
||||
if (!job_canceled &&
|
||||
(!strncmp(attr->values[i].string.text, "job-canceled-", 13) || !strcmp(attr->values[i].string.text, "aborted-by-system")))
|
||||
else if (!strcmp(attr->values[i].string.text, "document-format-error"))
|
||||
new_reasons |= _CUPS_JSR_DOCUMENT_FORMAT_ERROR;
|
||||
else if (!strcmp(attr->values[i].string.text, "document-unprintable"))
|
||||
new_reasons |= _CUPS_JSR_DOCUMENT_UNPRINTABLE;
|
||||
|
||||
if (!job_canceled && (!strncmp(attr->values[i].string.text, "job-canceled-", 13) || !strcmp(attr->values[i].string.text, "aborted-by-system")))
|
||||
job_canceled = 1;
|
||||
}
|
||||
|
||||
@@ -2600,6 +2606,26 @@ monitor_printer(
|
||||
fputs("JOBSTATE: job-password-wait\n", stderr);
|
||||
else if (new_reasons & _CUPS_JSR_JOB_RELEASE_WAIT)
|
||||
fputs("JOBSTATE: job-release-wait\n", stderr);
|
||||
else if (new_reasons & (_CUPS_JSR_DOCUMENT_FORMAT_ERROR | _CUPS_JSR_DOCUMENT_UNPRINTABLE))
|
||||
{
|
||||
if (monitor->retryable)
|
||||
{
|
||||
/*
|
||||
* Can't print this, so retry as raster...
|
||||
*/
|
||||
|
||||
job_canceled = 1;
|
||||
fputs("JOBSTATE: cups-retry-as-raster\n", stderr);
|
||||
}
|
||||
else if (new_reasons & _CUPS_JSR_DOCUMENT_FORMAT_ERROR)
|
||||
{
|
||||
fputs("JOBSTATE: document-format-error\n", stderr);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs("JOBSTATE: document-unprintable\n", stderr);
|
||||
}
|
||||
}
|
||||
else
|
||||
fputs("JOBSTATE: job-printing\n", stderr);
|
||||
|
||||
@@ -2759,7 +2785,7 @@ new_request(
|
||||
char phone[1024], /* Phone number string */
|
||||
*ptr, /* Pointer into string */
|
||||
tel_uri[1024]; /* tel: URI */
|
||||
static const char * const allowed = "0123456789#*-+.()";
|
||||
static const char * const allowed = "0123456789#*-+.()pw";
|
||||
/* Allowed characters */
|
||||
|
||||
destination = ippNew();
|
||||
@@ -2772,7 +2798,9 @@ new_request(
|
||||
_httpDecodeURI(phone, keyword, sizeof(phone));
|
||||
for (ptr = phone; *ptr;)
|
||||
{
|
||||
if (!strchr(allowed, *ptr))
|
||||
if (*ptr == ',')
|
||||
*ptr = 'p';
|
||||
else if (!strchr(allowed, *ptr))
|
||||
_cups_strcpy(ptr, ptr + 1);
|
||||
else
|
||||
ptr ++;
|
||||
|
||||
+2
-3
@@ -867,8 +867,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(error));
|
||||
|
||||
if (error == ECONNREFUSED || error == EHOSTDOWN ||
|
||||
error == EHOSTUNREACH)
|
||||
if (errno == ECONNREFUSED || errno == EHOSTDOWN || errno == EHOSTUNREACH || errno == ETIMEDOUT || errno == ENOTCONN)
|
||||
{
|
||||
if (contimeout && (time(NULL) - start_time) > contimeout)
|
||||
{
|
||||
@@ -886,13 +885,13 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
break;
|
||||
|
||||
case EHOSTUNREACH :
|
||||
default :
|
||||
_cupsLangPrintFilter(stderr, "WARNING",
|
||||
_("The printer is unreachable at "
|
||||
"this time."));
|
||||
break;
|
||||
|
||||
case ECONNREFUSED :
|
||||
default :
|
||||
_cupsLangPrintFilter(stderr, "WARNING",
|
||||
_("The printer is in use."));
|
||||
break;
|
||||
|
||||
@@ -8,10 +8,17 @@
|
||||
# delay-close Delay close/reset of selected interface
|
||||
# no-reattach Do no re-attach usblp kernel module after printing.
|
||||
# soft-reset Do a soft reset after printing for cleanup.
|
||||
# unidir Only supported unidirectional I/O
|
||||
# unidir Only supports unidirectional I/O
|
||||
# usb-init Needs vendor USB initialization string.
|
||||
# vendor-class Uses vendor-specific class or subclass.
|
||||
# whitelist The printer is functional with the USB backend.
|
||||
#
|
||||
# To get the USB vendor and product IDs for a given printer, run the "lsusb"
|
||||
# command, which will show something like the following:
|
||||
#
|
||||
# Bus 002 Device 003: ID ab21:34dc Acme Example Printer
|
||||
#
|
||||
# The "ab21:34dc" is the vendor and product ID, separated by a colon.
|
||||
|
||||
# HP DeskJet 895C
|
||||
0x03f0 0x0004 unidir
|
||||
@@ -76,6 +83,9 @@
|
||||
# Canon, Inc. MP510 Printer (https://bugs.launchpad.net/bugs/1050009)
|
||||
0x04a9 0x1717 unidir
|
||||
|
||||
# Canon, Inc. MP540 Printer, https://bugzilla.redhat.com/967873
|
||||
0x04a9 0x1730 unidir
|
||||
|
||||
# Canon, Inc. MP550 Printer (Issue #4155)
|
||||
0x04a9 0x173d unidir
|
||||
|
||||
@@ -127,6 +137,9 @@
|
||||
# All Samsung devices (https://bugs.launchpad.net/bugs/1032456)
|
||||
0x04e8 soft-reset
|
||||
|
||||
# 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)
|
||||
0x0a5f unidir
|
||||
|
||||
@@ -250,3 +263,24 @@
|
||||
|
||||
# Kyocera Ecosys P6026cdn (Issue #4900)
|
||||
0x0482 0x063f no-reattach
|
||||
|
||||
# Kyocera Ecosys P6130cdn (Issue #5102)
|
||||
0x0482 0x0677 no-reattach
|
||||
|
||||
# Lexmark E260dn (Issue #4994)
|
||||
0x043d 0x0123 no-reattach
|
||||
|
||||
# HP LaserJet 1160 (Issue #5121)
|
||||
0x03f0 0x1e17 delay-close
|
||||
|
||||
# Canon, Inc. MP280 series (Issue #5221)
|
||||
0x04a9 0x1746 unidir
|
||||
|
||||
# Star Micronics printers (Issue #5251)
|
||||
0x0519 unidir
|
||||
|
||||
# Lexmark Optra E310 (Issue #5259)
|
||||
0x043d 0x000c no-reattach
|
||||
|
||||
# HP LaserJet P1102 (Issue #5310)
|
||||
0x03F0 0x002A no-reattach
|
||||
|
||||
+2
-2
@@ -77,7 +77,7 @@ backendDrainOutput(int print_fd, /* I - Print file descriptor */
|
||||
* Read error - bail if we don't see EAGAIN or EINTR...
|
||||
*/
|
||||
|
||||
if (errno != EAGAIN || errno != EINTR)
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
fprintf(stderr, "DEBUG: Read failed: %s\n", strerror(errno));
|
||||
_cupsLangPrintFilter(stderr, "ERROR", _("Unable to read print data."));
|
||||
@@ -305,7 +305,7 @@ backendRunLoop(
|
||||
* Read error - bail if we don't see EAGAIN or EINTR...
|
||||
*/
|
||||
|
||||
if (errno != EAGAIN || errno != EINTR)
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
fprintf(stderr, "DEBUG: Read failed: %s\n", strerror(errno));
|
||||
_cupsLangPrintFilter(stderr, "ERROR",
|
||||
|
||||
+2
-3
@@ -330,8 +330,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(error));
|
||||
|
||||
if (error == ECONNREFUSED || error == EHOSTDOWN ||
|
||||
error == EHOSTUNREACH)
|
||||
if (errno == ECONNREFUSED || errno == EHOSTDOWN || errno == EHOSTUNREACH || errno == ETIMEDOUT || errno == ENOTCONN)
|
||||
{
|
||||
if (contimeout && (time(NULL) - start_time) > contimeout)
|
||||
{
|
||||
@@ -349,13 +348,13 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
break;
|
||||
|
||||
case EHOSTUNREACH :
|
||||
default :
|
||||
_cupsLangPrintFilter(stderr, "WARNING",
|
||||
_("The printer is unreachable at this "
|
||||
"time."));
|
||||
break;
|
||||
|
||||
case ECONNREFUSED :
|
||||
default :
|
||||
_cupsLangPrintFilter(stderr, "WARNING",
|
||||
_("The printer is in use."));
|
||||
break;
|
||||
|
||||
+5
-5
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Berkeley commands makefile for CUPS.
|
||||
#
|
||||
# Copyright 2007-2012 by Apple Inc.
|
||||
# Copyright 2007-2017 by Apple Inc.
|
||||
# Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
@@ -124,7 +124,7 @@ uninstall:
|
||||
|
||||
lpc: lpc.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpc lpc.o $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o lpc lpc.o $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -133,7 +133,7 @@ lpc: lpc.o ../cups/$(LIBCUPS)
|
||||
|
||||
lpq: lpq.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpq lpq.o $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o lpq lpq.o $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -142,7 +142,7 @@ lpq: lpq.o ../cups/$(LIBCUPS)
|
||||
|
||||
lpr: lpr.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lpr lpr.o $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o lpr lpr.o $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -151,7 +151,7 @@ lpr: lpr.o ../cups/$(LIBCUPS)
|
||||
|
||||
lprm: lprm.o ../cups/$(LIBCUPS)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o lprm lprm.o $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o lprm lprm.o $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
|
||||
+4
-28
@@ -32,8 +32,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
char *printer, /* Destination printer or class */
|
||||
*instance, /* Instance */
|
||||
*opt; /* Option pointer */
|
||||
const char *title, /* Job title */
|
||||
*val; /* Environment variable name */
|
||||
const char *title; /* Job title */
|
||||
int num_copies; /* Number of copies per file */
|
||||
int num_files; /* Number of files to print */
|
||||
const char *files[1000]; /* Files to print */
|
||||
@@ -345,33 +344,10 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
if (printer == NULL)
|
||||
{
|
||||
val = NULL;
|
||||
|
||||
if ((printer = getenv("LPDEST")) == NULL)
|
||||
{
|
||||
if ((printer = getenv("PRINTER")) != NULL)
|
||||
{
|
||||
if (!strcmp(printer, "lp"))
|
||||
printer = NULL;
|
||||
else
|
||||
val = "PRINTER";
|
||||
}
|
||||
}
|
||||
if (!cupsGetNamedDest(NULL, NULL, NULL) && cupsLastError() == IPP_STATUS_ERROR_NOT_FOUND)
|
||||
_cupsLangPrintf(stderr, _("%s: Error - %s"), argv[0], cupsLastErrorString());
|
||||
else
|
||||
val = "LPDEST";
|
||||
|
||||
if (printer && !cupsGetNamedDest(NULL, printer, NULL))
|
||||
_cupsLangPrintf(stderr,
|
||||
_("%s: Error - %s environment variable names "
|
||||
"non-existent destination \"%s\"."), argv[0], val,
|
||||
printer);
|
||||
else if (cupsLastError() == IPP_NOT_FOUND)
|
||||
_cupsLangPrintf(stderr,
|
||||
_("%s: Error - no default destination available."),
|
||||
argv[0]);
|
||||
else
|
||||
_cupsLangPrintf(stderr, _("%s: Error - scheduler not responding."),
|
||||
argv[0]);
|
||||
_cupsLangPrintf(stderr, _("%s: Error - scheduler not responding."), argv[0]);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
+11
-11
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# CGI makefile for CUPS.
|
||||
#
|
||||
# Copyright 2007-2016 by Apple Inc.
|
||||
# Copyright 2007-2017 by Apple Inc.
|
||||
# Copyright 1997-2006 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
@@ -219,7 +219,7 @@ libcupscgi.1.dylib: $(LIBOBJS) libcupscgi.exp
|
||||
|
||||
libcupscgi.la: $(LIBOBJS)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \
|
||||
-version-info 1:0 $(LIBS)
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ libcupscgi.a: $(LIBOBJS)
|
||||
|
||||
admin.cgi: admin.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ admin.o -lcupscgi $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o $@ admin.o -lcupscgi $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -249,7 +249,7 @@ admin.cgi: admin.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
|
||||
classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ classes.o -lcupscgi $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o $@ classes.o -lcupscgi $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -258,7 +258,7 @@ classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
|
||||
help.cgi: help.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ help.o -lcupscgi $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o $@ help.o -lcupscgi $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -267,7 +267,7 @@ help.cgi: help.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
|
||||
jobs.cgi: jobs.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ jobs.o -lcupscgi $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o $@ jobs.o -lcupscgi $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -276,7 +276,7 @@ jobs.cgi: jobs.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
|
||||
makedocset: makedocset.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ makedocset.o libcupscgi.a \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ makedocset.o libcupscgi.a \
|
||||
../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \
|
||||
$(LIBZ) $(LIBGSSAPI)
|
||||
|
||||
@@ -287,7 +287,7 @@ makedocset: makedocset.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
|
||||
|
||||
printers.cgi: printers.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ printers.o -L. -lcupscgi $(LIBS)
|
||||
$(LD_CC) $(LDFLAGS) -o $@ printers.o -L. -lcupscgi $(LIBS)
|
||||
|
||||
|
||||
#
|
||||
@@ -296,7 +296,7 @@ printers.cgi: printers.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI)
|
||||
|
||||
testcgi: testcgi.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testcgi.o libcupscgi.a \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testcgi.o libcupscgi.a \
|
||||
../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \
|
||||
$(LIBZ) $(LIBGSSAPI)
|
||||
echo Testing CGI API...
|
||||
@@ -309,7 +309,7 @@ testcgi: testcgi.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
|
||||
|
||||
testhi: testhi.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testhi.o libcupscgi.a \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testhi.o libcupscgi.a \
|
||||
../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \
|
||||
$(LIBZ) $(LIBGSSAPI)
|
||||
echo Testing help index API...
|
||||
@@ -322,7 +322,7 @@ testhi: testhi.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
|
||||
|
||||
testtemplate: testtemplate.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testtemplate.o libcupscgi.a ../cups/$(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o $@ testtemplate.o libcupscgi.a ../cups/$(LIBCUPSSTATIC) \
|
||||
$(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) $(LIBZ) $(LIBGSSAPI)
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -271,7 +271,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
section = n->section;
|
||||
}
|
||||
|
||||
if (!topic || strcmp(n->section, topic))
|
||||
if (!topic || !n->section || strcmp(n->section, topic))
|
||||
continue;
|
||||
|
||||
/*
|
||||
|
||||
+2
-6
@@ -18,7 +18,6 @@
|
||||
/*#define DEBUG*/
|
||||
#include "cgi-private.h"
|
||||
#include <cups/http.h>
|
||||
#include <cups/md5-private.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -1204,7 +1203,6 @@ cgi_set_sid(void)
|
||||
{
|
||||
char buffer[512], /* SID data */
|
||||
sid[33]; /* SID string */
|
||||
_cups_md5_state_t md5; /* MD5 state */
|
||||
unsigned char sum[16]; /* MD5 sum */
|
||||
const char *remote_addr, /* REMOTE_ADDR */
|
||||
*server_name, /* SERVER_NAME */
|
||||
@@ -1225,11 +1223,9 @@ cgi_set_sid(void)
|
||||
(unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255,
|
||||
(unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255,
|
||||
(unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255);
|
||||
_cupsMD5Init(&md5);
|
||||
_cupsMD5Append(&md5, (unsigned char *)buffer, (int)strlen(buffer));
|
||||
_cupsMD5Finish(&md5, sum);
|
||||
cupsHashData("md5", (unsigned char *)buffer, strlen(buffer), sum, sizeof(sum));
|
||||
|
||||
cgiSetCookie(CUPS_SID, httpMD5String(sum, sid), "/", NULL, 0, 0);
|
||||
cgiSetCookie(CUPS_SID, cupsHashString(sum, sizeof(sum), sid, sizeof(sid)), "/", NULL, 0, 0);
|
||||
|
||||
return (cupsGetOption(CUPS_SID, num_cookies, cookies));
|
||||
}
|
||||
|
||||
+2
-8
@@ -5,7 +5,7 @@
|
||||
# VERSIONS OF CUPS. Instead, create a "local.types" file that
|
||||
# reflects your local configuration changes.
|
||||
#
|
||||
# Copyright 2007-2016 by Apple Inc.
|
||||
# Copyright 2007-2017 by Apple Inc.
|
||||
# Copyright 1997-2007 by Easy Software Products.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
@@ -79,12 +79,6 @@ application/postscript ai eps ps string(0,%!) string(0,<04>%!) \
|
||||
(contains(0,4096,<0a>%!) + \
|
||||
!contains(0,4096,"ENTER LANGUAGE")))
|
||||
|
||||
application/g-code gcode
|
||||
application/sla stl string(0,"solid ") + contains(0,4096,"facet") + contains(0,4096,"vertex")
|
||||
application/vnd.makerbot-s3g x3g
|
||||
model/amf amf
|
||||
model/vnd.collada+xml dae
|
||||
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -131,7 +125,7 @@ application/x-shell sh printable(0,1024) + string(0,#!) +\
|
||||
contains(2,80,/sh) contains(2,80,/zsh))
|
||||
application/x-csource c cxx cpp cc C h hpp \
|
||||
printable(0,1024) + ! css + \
|
||||
(string(0,/*) string(0,//)
|
||||
(string(0,/*) string(0,//) \
|
||||
string(0,#include) contains(0,1024,<0a>#include) \
|
||||
string(0,#define) contains(0,1024,<0a>#define))
|
||||
text/html html htm printable(0,1024) +\
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Common configuration stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2016 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -45,6 +45,7 @@ AC_PATH_PROG(CHMOD,chmod)
|
||||
AC_PATH_PROG(GZIP,gzip)
|
||||
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)
|
||||
@@ -161,7 +162,7 @@ AC_CHECK_FUNCS(statfs statvfs)
|
||||
|
||||
dnl Checks for string functions.
|
||||
AC_CHECK_FUNCS(strdup strlcat strlcpy)
|
||||
if test "$uname" = "HP-UX" -a "$uversion" = "1020"; then
|
||||
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)
|
||||
@@ -180,8 +181,8 @@ dnl Check for vsyslog function.
|
||||
AC_CHECK_FUNCS(vsyslog)
|
||||
|
||||
dnl Checks for signal functions.
|
||||
case "$uname" in
|
||||
Linux | GNU)
|
||||
case "$host_os_name" in
|
||||
linux* | gnu*)
|
||||
# Do not use sigset on Linux or GNU HURD
|
||||
;;
|
||||
*)
|
||||
@@ -229,7 +230,7 @@ AC_SUBST(LIBUSB)
|
||||
AC_SUBST(USBQUIRKS)
|
||||
|
||||
if test "x$PKGCONFIG" != x; then
|
||||
if test x$enable_libusb != xno -a $uname != Darwin; 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)
|
||||
@@ -277,8 +278,8 @@ AC_SUBST(INSTALL_GZIP)
|
||||
AC_SUBST(LIBZ)
|
||||
|
||||
dnl Flags for "ar" command...
|
||||
case $uname in
|
||||
Darwin* | *BSD*)
|
||||
case $host_os_name in
|
||||
darwin* | *bsd*)
|
||||
ARFLAGS="-rcv"
|
||||
;;
|
||||
*)
|
||||
@@ -305,7 +306,7 @@ fi
|
||||
LIBS="$SAVELIBS"
|
||||
|
||||
dnl Check for DBUS support
|
||||
AC_ARG_ENABLE(dbus, [ --disable-dbus build without DBUS support])
|
||||
AC_ARG_ENABLE(dbus, [ --disable-dbus build without DBUS support])
|
||||
AC_ARG_WITH(dbusdir, [ --with-dbusdir set DBUS configuration directory ],
|
||||
DBUSDIR="$withval")
|
||||
|
||||
@@ -313,7 +314,7 @@ DBUSDIR=""
|
||||
DBUS_NOTIFIER=""
|
||||
DBUS_NOTIFIERLIBS=""
|
||||
|
||||
if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$uname" != xDarwin; then
|
||||
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)
|
||||
@@ -347,8 +348,8 @@ CUPS_DEFAULT_SYSTEM_AUTHKEY=""
|
||||
CUPS_SYSTEM_AUTHKEY=""
|
||||
INSTALLXPC=""
|
||||
|
||||
case $uname in
|
||||
Darwin*)
|
||||
case $host_os_name in
|
||||
darwin*)
|
||||
BACKLIBS="$BACKLIBS -framework IOKit"
|
||||
SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices"
|
||||
LIBS="-framework SystemConfiguration -framework CoreFoundation -framework Security $LIBS"
|
||||
@@ -388,28 +389,23 @@ case $uname in
|
||||
if test "x$default_adminkey" != xdefault; then
|
||||
CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey $default_adminkey"
|
||||
CUPS_DEFAULT_SYSTEM_AUTHKEY="$default_adminkey"
|
||||
elif grep -q system.print.operator /etc/authorization; then
|
||||
else
|
||||
CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.print.admin"
|
||||
CUPS_DEFAULT_SYSTEM_AUTHKEY="system.print.admin"
|
||||
else
|
||||
CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.preferences"
|
||||
CUPS_DEFAULT_SYSTEM_AUTHKEY="system.preferences"
|
||||
fi
|
||||
|
||||
if test "x$default_operkey" != xdefault; then
|
||||
CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin"
|
||||
elif grep -q system.print.operator /etc/authorization; then
|
||||
CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin"
|
||||
else
|
||||
CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin"
|
||||
CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin"
|
||||
fi])
|
||||
AC_CHECK_HEADER(Security/SecBasePriv.h,AC_DEFINE(HAVE_SECBASEPRIV_H))
|
||||
|
||||
dnl Check for sandbox/Seatbelt support
|
||||
if test $uversion -ge 100; then
|
||||
if test $host_os_version -ge 100; then
|
||||
AC_CHECK_HEADER(sandbox.h,AC_DEFINE(HAVE_SANDBOX_H))
|
||||
fi
|
||||
if test $uversion -ge 110 -a $uversion -lt 120; then
|
||||
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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Compiler stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2014 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -46,6 +46,10 @@ fi
|
||||
|
||||
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=""
|
||||
@@ -63,7 +67,7 @@ else
|
||||
fi
|
||||
|
||||
if test -z "$with_ldarchflags"; then
|
||||
if test "$uname" = Darwin; then
|
||||
if test "$host_os_name" = darwin; then
|
||||
# Only create Intel programs by default
|
||||
LDARCHFLAGS="`echo $ARCHFLAGS | sed -e '1,$s/-arch ppc64//'`"
|
||||
else
|
||||
@@ -130,8 +134,8 @@ if test -n "$GCC"; then
|
||||
# Not available to LSB binaries...
|
||||
AC_MSG_CHECKING(whether compiler supports -fPIE)
|
||||
OLDCFLAGS="$CFLAGS"
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
case "$host_os_name" in
|
||||
darwin*)
|
||||
CFLAGS="$CFLAGS -fPIE -Wl,-pie"
|
||||
AC_TRY_COMPILE(,,[
|
||||
PIEFLAGS="-fPIE -Wl,-pie"
|
||||
@@ -181,14 +185,23 @@ if test -n "$GCC"; then
|
||||
AC_MSG_RESULT(no))
|
||||
CFLAGS="$OLDCFLAGS"
|
||||
|
||||
AC_MSG_CHECKING(whether compiler supports -Wno-format-truncation)
|
||||
OLDCFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -Werror -Wno-format-truncation"
|
||||
AC_TRY_COMPILE(,,
|
||||
[OPTIM="$OPTIM -Wno-format-truncation"
|
||||
AC_MSG_RESULT(yes)],
|
||||
AC_MSG_RESULT(no))
|
||||
CFLAGS="$OLDCFLAGS"
|
||||
|
||||
# Additional warning options for development testing...
|
||||
if test -d .svn; then
|
||||
OPTIM="-Werror $OPTIM"
|
||||
fi
|
||||
fi
|
||||
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
case "$host_os_name" in
|
||||
darwin*)
|
||||
# -D_FORTIFY_SOURCE=2 adds additional object size
|
||||
# checking, basically wrapping all string functions
|
||||
# with buffer-limited ones. Not strictly needed for
|
||||
@@ -197,7 +210,7 @@ if test -n "$GCC"; then
|
||||
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
|
||||
;;
|
||||
|
||||
Linux*)
|
||||
linux*)
|
||||
# The -z relro option is provided by the Linux linker command to
|
||||
# make relocatable data read-only.
|
||||
if test x$enable_relro = xyes; then
|
||||
@@ -207,8 +220,8 @@ if test -n "$GCC"; then
|
||||
esac
|
||||
else
|
||||
# Add vendor-specific compiler options...
|
||||
case $uname in
|
||||
SunOS*)
|
||||
case $host_os_name in
|
||||
sunos*)
|
||||
# Solaris
|
||||
if test -z "$OPTIM"; then
|
||||
if test "x$with_optim" = x; then
|
||||
@@ -235,8 +248,8 @@ else
|
||||
fi
|
||||
|
||||
# Add general compiler options per platform...
|
||||
case $uname in
|
||||
Linux*)
|
||||
case $host_os_name in
|
||||
linux*)
|
||||
# glibc 2.8 and higher breaks peer credentials unless you
|
||||
# define _GNU_SOURCE...
|
||||
OPTIM="$OPTIM -D_GNU_SOURCE"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Default cupsd configuration settings for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2015 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 2006-2007 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -25,7 +25,7 @@ AC_SUBST(LANGUAGES)
|
||||
dnl macOS bundle-based localization support
|
||||
AC_ARG_WITH(bundledir, [ --with-bundledir set macOS localization bundle directory ],
|
||||
CUPS_BUNDLEDIR="$withval",
|
||||
if test "x$uname" = xDarwin -a $uversion -ge 100; then
|
||||
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
|
||||
@@ -37,21 +37,41 @@ if test "x$CUPS_BUNDLEDIR" != x; then
|
||||
AC_DEFINE_UNQUOTED(CUPS_BUNDLEDIR, "$CUPS_BUNDLEDIR")
|
||||
fi
|
||||
|
||||
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*)
|
||||
CUPS_EXE_FILE_PERM="755"
|
||||
;;
|
||||
*)
|
||||
CUPS_EXE_FILE_PERM="555"
|
||||
;;
|
||||
esac])
|
||||
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$uname" = xDarwin; then
|
||||
[if test "x$host_os_name" = xdarwin; then
|
||||
CUPS_CONFIG_FILE_PERM="644"
|
||||
else
|
||||
CUPS_CONFIG_FILE_PERM="640"
|
||||
fi)
|
||||
fi])
|
||||
AC_SUBST(CUPS_CONFIG_FILE_PERM)
|
||||
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_CONFIG_FILE_PERM, 0$CUPS_CONFIG_FILE_PERM)
|
||||
|
||||
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",
|
||||
CUPS_CUPSD_FILE_PERM="500")
|
||||
[case "$host_os_name" in
|
||||
linux* | gnu*)
|
||||
CUPS_CUPSD_FILE_PERM="700"
|
||||
;;
|
||||
*)
|
||||
CUPS_CUPSD_FILE_PERM="500"
|
||||
;;
|
||||
esac])
|
||||
AC_SUBST(CUPS_CUPSD_FILE_PERM)
|
||||
|
||||
dnl Default LogFilePerm
|
||||
@@ -141,7 +161,7 @@ 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$uname = xDarwin; then
|
||||
if test x$host_os_name = xdarwin; then
|
||||
if test x`id -u _lp 2>/dev/null` = x; then
|
||||
CUPS_USER="lp";
|
||||
else
|
||||
@@ -174,7 +194,7 @@ 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$uname = xDarwin; then
|
||||
if test x$host_os_name = xdarwin; then
|
||||
if test x`id -g _lp 2>/dev/null` = x; then
|
||||
CUPS_GROUP="lp";
|
||||
else
|
||||
@@ -207,7 +227,7 @@ fi
|
||||
|
||||
AC_ARG_WITH(system_groups, [ --with-system-groups set default system groups for CUPS],
|
||||
CUPS_SYSTEM_GROUPS="$withval",
|
||||
if test x$uname = xDarwin; then
|
||||
if test x$host_os_name = xdarwin; then
|
||||
CUPS_SYSTEM_GROUPS="admin"
|
||||
else
|
||||
AC_MSG_CHECKING(for default system groups)
|
||||
@@ -260,15 +280,15 @@ AC_ARG_WITH(printcap, [ --with-printcap set default printcap file],
|
||||
|
||||
if test x$default_printcap != xno; then
|
||||
if test "x$default_printcap" = "xdefault"; then
|
||||
case $uname in
|
||||
Darwin*)
|
||||
if test $uversion -ge 90; 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*)
|
||||
sunos*)
|
||||
CUPS_DEFAULT_PRINTCAP="/etc/printers.conf"
|
||||
;;
|
||||
*)
|
||||
@@ -292,8 +312,8 @@ AC_ARG_WITH(lpdconfigfile, [ --with-lpdconfigfile set default LPDConfigFile
|
||||
|
||||
if test x$default_lpdconfigfile != xno; then
|
||||
if test "x$default_lpdconfigfile" = "xdefault"; then
|
||||
case $uname in
|
||||
Darwin*)
|
||||
case $host_os_name in
|
||||
darwin*)
|
||||
CUPS_DEFAULT_LPD_CONFIG_FILE="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist"
|
||||
;;
|
||||
*)
|
||||
@@ -360,7 +380,7 @@ AC_ARG_WITH(snmp-address, [ --with-snmp-address set SNMP query address, def
|
||||
else
|
||||
CUPS_SNMP_ADDRESS="Address $withval"
|
||||
fi,
|
||||
if test "x$uname" = xDarwin; then
|
||||
if test "x$host_os_name" = xdarwin; then
|
||||
CUPS_SNMP_ADDRESS=""
|
||||
else
|
||||
CUPS_SNMP_ADDRESS="Address @LOCAL"
|
||||
@@ -393,7 +413,7 @@ case "x$enable_webif" in
|
||||
CUPS_DEFAULT_WEBIF=1
|
||||
;;
|
||||
*)
|
||||
if test $uname = Darwin; then
|
||||
if test $host_os_name = darwin; then
|
||||
CUPS_WEBIF=No
|
||||
CUPS_DEFAULT_WEBIF=0
|
||||
else
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Directory stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2016 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -74,7 +74,7 @@ fi
|
||||
dnl Fix "localstatedir" variable if it hasn't been specified...
|
||||
if test "$localstatedir" = "\${prefix}/var"; then
|
||||
if test "$prefix" = "/"; then
|
||||
if test "$uname" = Darwin; then
|
||||
if test "$host_os_name" = darwin; then
|
||||
localstatedir="/private/var"
|
||||
else
|
||||
localstatedir="/var"
|
||||
@@ -87,7 +87,7 @@ fi
|
||||
dnl Fix "sysconfdir" variable if it hasn't been specified...
|
||||
if test "$sysconfdir" = "\${prefix}/etc"; then
|
||||
if test "$prefix" = "/"; then
|
||||
if test "$uname" = Darwin; then
|
||||
if test "$host_os_name" = darwin; then
|
||||
sysconfdir="/private/etc"
|
||||
else
|
||||
sysconfdir="/etc"
|
||||
@@ -99,8 +99,8 @@ fi
|
||||
|
||||
dnl Fix "libdir" variable...
|
||||
if test "$libdir" = "\${exec_prefix}/lib"; then
|
||||
case "$uname" in
|
||||
Linux*)
|
||||
case "$host_os_name" in
|
||||
linux*)
|
||||
if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then
|
||||
libdir="$exec_prefix/lib64"
|
||||
fi
|
||||
@@ -165,7 +165,7 @@ dnl Setup default locations...
|
||||
AC_ARG_WITH(cachedir, [ --with-cachedir set path for cache files],cachedir="$withval",cachedir="")
|
||||
|
||||
if test x$cachedir = x; then
|
||||
if test "x$uname" = xDarwin; then
|
||||
if test "x$host_os_name" = xdarwin; then
|
||||
CUPS_CACHEDIR="$localstatedir/spool/cups/cache"
|
||||
else
|
||||
CUPS_CACHEDIR="$localstatedir/cache/cups"
|
||||
@@ -230,8 +230,8 @@ AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$CUPS_FONTPATH")
|
||||
|
||||
# Locale data
|
||||
if test "$localedir" = "\${datarootdir}/locale"; then
|
||||
case "$uname" in
|
||||
Linux | GNU | *BSD* | Darwin*)
|
||||
case "$host_os_name" in
|
||||
linux* | gnu* | *bsd* | darwin*)
|
||||
CUPS_LOCALEDIR="$datarootdir/locale"
|
||||
;;
|
||||
|
||||
@@ -265,8 +265,8 @@ AC_DEFINE_UNQUOTED(CUPS_REQUESTS, "$localstatedir/spool/cups")
|
||||
AC_SUBST(CUPS_REQUESTS)
|
||||
|
||||
# Server executables...
|
||||
case "$uname" in
|
||||
*BSD* | Darwin*)
|
||||
case "$host_os_name" in
|
||||
*bsd* | darwin*)
|
||||
# *BSD and Darwin (macOS)
|
||||
INSTALL_SYSV=""
|
||||
CUPS_SERVERBIN="$exec_prefix/libexec/cups"
|
||||
@@ -289,8 +289,8 @@ AC_SUBST(CUPS_SERVERROOT)
|
||||
|
||||
# Transient run-time state
|
||||
AC_ARG_WITH(rundir, [ --with-rundir set transient run-time state directory],CUPS_STATEDIR="$withval",[
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
case "$host_os_name" in
|
||||
darwin*)
|
||||
# Darwin (macOS)
|
||||
CUPS_STATEDIR="$CUPS_SERVERROOT"
|
||||
;;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl DNS Service Discovery (aka Bonjour) stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2016 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
dnl property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -24,7 +24,7 @@ DNSSD_BACKEND=""
|
||||
IPPFIND_BIN=""
|
||||
IPPFIND_MAN=""
|
||||
|
||||
if test "x$PKGCONFIG" != x -a x$enable_avahi != xno -a x$uname != xDarwin; then
|
||||
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)
|
||||
@@ -41,8 +41,8 @@ fi
|
||||
|
||||
if test "x$DNSSD_BACKEND" = x -a x$enable_dnssd != xno; then
|
||||
AC_CHECK_HEADER(dns_sd.h, [
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
case "$host_os_name" in
|
||||
darwin*)
|
||||
# Darwin and macOS...
|
||||
AC_DEFINE(HAVE_DNSSD)
|
||||
DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl GSSAPI/Kerberos library detection for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2013 by Apple Inc.
|
||||
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
|
||||
@@ -22,8 +22,8 @@ AC_SUBST(LIBGSSAPI)
|
||||
if test x$enable_gssapi != xno; then
|
||||
AC_PATH_TOOL(KRB5CONFIG, krb5-config)
|
||||
if test "x$KRB5CONFIG" != x; then
|
||||
case "$uname" in
|
||||
Darwin)
|
||||
case "$host_os_name" in
|
||||
darwin)
|
||||
# macOS weak-links to the Kerberos framework...
|
||||
LIBGSSAPI="-weak_framework Kerberos"
|
||||
AC_MSG_CHECKING(for GSS framework)
|
||||
@@ -34,7 +34,7 @@ if test x$enable_gssapi != xno; then
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
;;
|
||||
SunOS*)
|
||||
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])
|
||||
@@ -52,13 +52,13 @@ if test x$enable_gssapi != xno; then
|
||||
AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available])
|
||||
else
|
||||
# Check for vendor-specific implementations...
|
||||
case "$uname" in
|
||||
HP-UX*)
|
||||
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*)
|
||||
sunos*)
|
||||
AC_CHECK_LIB(gss, gss_display_status,
|
||||
AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available])
|
||||
LIBGSSAPI="-lgss")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Libtool stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2011 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -11,9 +11,12 @@ dnl which should have been included with this file. If this file is
|
||||
dnl missing or damaged, see the license at "http://www.cups.org/".
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE(libtool_unsupported, [ --enable-libtool-unsupported
|
||||
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."
|
||||
@@ -22,12 +25,40 @@ AC_ARG_ENABLE(libtool_unsupported, [ --enable-libtool-unsupported
|
||||
LIBTOOL=""
|
||||
fi])
|
||||
|
||||
AC_SUBST(LIBTOOL)
|
||||
|
||||
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="../filter/\$(LIBCUPSIMAGE)"
|
||||
DSO="\$(CC)"
|
||||
|
||||
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)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Manpage stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2016 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -19,8 +19,8 @@ if test "$mandir" = "\${datarootdir}/man" -a "$prefix" = "/"; then
|
||||
fi
|
||||
|
||||
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then
|
||||
case "$uname" in
|
||||
Darwin* | Linux | GNU | *BSD*)
|
||||
case "$host_os_name" in
|
||||
darwin* | linux* | gnu* | *bsd*)
|
||||
# Darwin, macOS, Linux, GNU HURD, and *BSD
|
||||
mandir="/usr/share/man"
|
||||
AMANDIR="/usr/share/man"
|
||||
@@ -42,8 +42,8 @@ AC_SUBST(AMANDIR)
|
||||
AC_SUBST(PMANDIR)
|
||||
|
||||
dnl Setup manpage extensions...
|
||||
case "$uname" in
|
||||
SunOS*)
|
||||
case "$host_os_name" in
|
||||
sunos*)
|
||||
# Solaris
|
||||
MAN1EXT=1
|
||||
MAN5EXT=5
|
||||
@@ -51,7 +51,7 @@ case "$uname" in
|
||||
MAN8EXT=1m
|
||||
MAN8DIR=1m
|
||||
;;
|
||||
Linux* | GNU* | Darwin*)
|
||||
linux* | gnu* | darwin*)
|
||||
# Linux, GNU Hurd, and macOS
|
||||
MAN1EXT=1.gz
|
||||
MAN5EXT=5.gz
|
||||
|
||||
@@ -28,7 +28,7 @@ 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 "$uname" != "OSF1"; then
|
||||
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
|
||||
@@ -45,8 +45,8 @@ AC_ARG_WITH(domainsocket, [ --with-domainsocket set unix domain socket name
|
||||
|
||||
if test x$enable_domainsocket != xno -a x$default_domainsocket != xno; then
|
||||
if test "x$default_domainsocket" = x; then
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
case "$host_os_name" in
|
||||
darwin*)
|
||||
# Darwin and macOS do their own thing...
|
||||
CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd"
|
||||
;;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Operating system stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2012 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -11,23 +11,27 @@ dnl which should have been included with this file. If this file is
|
||||
dnl missing or damaged, see the license at "http://www.cups.org/".
|
||||
dnl
|
||||
|
||||
dnl Get the operating system, version number, and architecture...
|
||||
uname=`uname`
|
||||
uversion=`uname -r | sed -e '1,$s/^[[^0-9]]*\([[0-9]]*\)\.\([[0-9]]*\).*/\1\2/'`
|
||||
uarch=`uname -m`
|
||||
dnl Get the build and host platforms and split the host_os value
|
||||
AC_CANONICAL_BUILD
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
uname="Darwin"
|
||||
if test $uversion -lt 120; then
|
||||
AC_MSG_ERROR([Sorry, this version of CUPS requires macOS 10.8 or higher.])
|
||||
fi
|
||||
;;
|
||||
[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
|
||||
|
||||
GNU* | GNU/*)
|
||||
uname="GNU"
|
||||
;;
|
||||
Linux*)
|
||||
uname="Linux"
|
||||
;;
|
||||
esac
|
||||
if test "$host_os_name" = darwin -a $host_os_version -lt 120; then
|
||||
AC_MSG_ERROR([Sorry, this version of CUPS requires macOS 10.8 or higher.])
|
||||
fi
|
||||
|
||||
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)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl PAM stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2013 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -12,7 +12,7 @@ dnl missing or damaged, see the license at "http://www.cups.org/".
|
||||
dnl
|
||||
|
||||
AC_ARG_ENABLE(pam, [ --disable-pam disable PAM support])
|
||||
AC_ARG_WITH(pam_module, [ --with-pam-module specify the PAM module to use])
|
||||
AC_ARG_WITH(pam_module, [ --with-pam-module set the PAM module to use])
|
||||
|
||||
PAMDIR=""
|
||||
PAMFILE="pam.std"
|
||||
@@ -52,8 +52,8 @@ if test x$enable_pam != xno; then
|
||||
|
||||
LIBS="$SAVELIBS"
|
||||
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
case "$host_os_name" in
|
||||
darwin*)
|
||||
# Darwin/macOS
|
||||
if test "x$with_pam_module" != x; then
|
||||
PAMFILE="pam.$with_pam_module"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Scripting configuration stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2010 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -14,11 +14,13 @@ dnl
|
||||
dnl Do we have Java?
|
||||
AC_ARG_WITH(java, [ --with-java set Java interpreter for web interfaces ],
|
||||
CUPS_JAVA="$withval",
|
||||
CUPS_JAVA="")
|
||||
CUPS_JAVA="auto")
|
||||
|
||||
if test "x$CUPS_JAVA" = x; then
|
||||
if test "x$CUPS_JAVA" = xauto; then
|
||||
AC_PATH_PROG(JAVA,java)
|
||||
CUPS_JAVA="$JAVA"
|
||||
elif test "x$CUPS_JAVA" = xno; then
|
||||
CUPS_JAVA=""
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_JAVA, "$CUPS_JAVA")
|
||||
@@ -30,11 +32,13 @@ fi
|
||||
dnl Do we have Perl?
|
||||
AC_ARG_WITH(perl, [ --with-perl set Perl interpreter for web interfaces ],
|
||||
CUPS_PERL="$withval",
|
||||
CUPS_PERL="")
|
||||
CUPS_PERL="auto")
|
||||
|
||||
if test "x$CUPS_PERL" = x; then
|
||||
if test "x$CUPS_PERL" = xauto; then
|
||||
AC_PATH_PROG(PERL,perl)
|
||||
CUPS_PERL="$PERL"
|
||||
elif test "x$CUPS_PERL" = xno; then
|
||||
CUPS_PERL=""
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_PERL, "$CUPS_PERL")
|
||||
@@ -46,9 +50,9 @@ fi
|
||||
dnl Do we have PHP?
|
||||
AC_ARG_WITH(php, [ --with-php set PHP interpreter for web interfaces ],
|
||||
CUPS_PHP="$withval",
|
||||
CUPS_PHP="")
|
||||
CUPS_PHP="auto")
|
||||
|
||||
if test "x$CUPS_PHP" = x; then
|
||||
if test "x$CUPS_PHP" = xauto; then
|
||||
AC_PATH_PROG(PHPCGI,php-cgi)
|
||||
if test "x$PHPCGI" = x; then
|
||||
AC_PATH_PROG(PHP,php)
|
||||
@@ -56,6 +60,8 @@ if test "x$CUPS_PHP" = x; then
|
||||
else
|
||||
CUPS_PHP="$PHPCGI"
|
||||
fi
|
||||
elif test "x$CUPS_PHP" = xno; then
|
||||
CUPS_PHP=""
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_PHP, "$CUPS_PHP")
|
||||
@@ -69,11 +75,13 @@ fi
|
||||
dnl Do we have Python?
|
||||
AC_ARG_WITH(python, [ --with-python set Python interpreter for web interfaces ],
|
||||
CUPS_PYTHON="$withval",
|
||||
CUPS_PYTHON="")
|
||||
CUPS_PYTHON="auto")
|
||||
|
||||
if test "x$CUPS_PYTHON" = x; then
|
||||
if test "x$CUPS_PYTHON" = xauto; then
|
||||
AC_PATH_PROG(PYTHON,python)
|
||||
CUPS_PYTHON="$PYTHON"
|
||||
elif test "x$CUPS_PYTHON" = xno; then
|
||||
CUPS_PYTHON=""
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_PYTHON, "$CUPS_PYTHON")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Shared library support for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2013 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -21,8 +21,8 @@ LIBCUPSBASE="lib$cupsbase"
|
||||
LIBCUPSSTATIC="lib$cupsbase.a"
|
||||
|
||||
if test x$enable_shared != xno; then
|
||||
case "$uname" in
|
||||
SunOS*)
|
||||
case "$host_os_name" in
|
||||
sunos*)
|
||||
LIBCUPS="lib$cupsbase.so.2"
|
||||
LIBCUPSCGI="libcupscgi.so.1"
|
||||
LIBCUPSIMAGE="libcupsimage.so.2"
|
||||
@@ -32,7 +32,7 @@ if test x$enable_shared != xno; then
|
||||
DSOXX="\$(CXX)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G \$(OPTIM)"
|
||||
;;
|
||||
Linux | GNU | *BSD*)
|
||||
linux* | gnu* | *bsd*)
|
||||
LIBCUPS="lib$cupsbase.so.2"
|
||||
LIBCUPSCGI="libcupscgi.so.1"
|
||||
LIBCUPSIMAGE="libcupsimage.so.2"
|
||||
@@ -42,7 +42,7 @@ if test x$enable_shared != xno; then
|
||||
DSOXX="\$(CXX)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared \$(OPTIM)"
|
||||
;;
|
||||
Darwin*)
|
||||
darwin*)
|
||||
LIBCUPS="lib$cupsbase.2.dylib"
|
||||
LIBCUPSCGI="libcupscgi.1.dylib"
|
||||
LIBCUPSIMAGE="libcupsimage.2.dylib"
|
||||
@@ -120,8 +120,8 @@ 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 $uname in
|
||||
SunOS*)
|
||||
case $host_os_name in
|
||||
sunos*)
|
||||
# Solaris...
|
||||
if test $exec_prefix != /usr; then
|
||||
DSOFLAGS="-R$libdir $DSOFLAGS"
|
||||
@@ -129,7 +129,7 @@ if test "$DSO" != ":"; then
|
||||
EXPORT_LDFLAGS="-R$libdir"
|
||||
fi
|
||||
;;
|
||||
*BSD*)
|
||||
*bsd*)
|
||||
# *BSD...
|
||||
if test $exec_prefix != /usr; then
|
||||
DSOFLAGS="-Wl,-R$libdir $DSOFLAGS"
|
||||
@@ -137,7 +137,7 @@ if test "$DSO" != ":"; then
|
||||
EXPORT_LDFLAGS="-Wl,-R$libdir"
|
||||
fi
|
||||
;;
|
||||
Linux | GNU)
|
||||
linux* | gnu*)
|
||||
# Linux, and HURD...
|
||||
if test $exec_prefix != /usr; then
|
||||
DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl TLS stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2015 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -23,7 +23,7 @@ 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 $uname = Darwin; then
|
||||
if test $host_os_name = darwin; then
|
||||
AC_CHECK_HEADER(Security/SecureTransport.h, [
|
||||
have_ssl=1
|
||||
AC_DEFINE(HAVE_SSL)
|
||||
@@ -52,7 +52,7 @@ if test x$enable_ssl != xno; then
|
||||
AC_DEFINE(HAVE_CSSMERRORSTRING)
|
||||
AC_DEFINE(HAVE_SECKEYCHAINOPEN)])
|
||||
|
||||
if test $uversion -ge 150; then
|
||||
if test $host_os_version -ge 150; then
|
||||
AC_DEFINE(HAVE_SSLSETENABLEDCIPHERS)
|
||||
fi
|
||||
fi
|
||||
@@ -61,7 +61,6 @@ if test x$enable_ssl != xno; then
|
||||
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)
|
||||
AC_PATH_TOOL(LIBGCRYPTCONFIG,libgcrypt-config)
|
||||
if $PKGCONFIG --exists gnutls; then
|
||||
have_ssl=1
|
||||
SSLLIBS=`$PKGCONFIG --libs gnutls`
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Launch-on-demand/startup stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2016 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -27,16 +27,10 @@ if test x$enable_launchd != xno; then
|
||||
AC_DEFINE(HAVE_ONDEMAND)])
|
||||
AC_CHECK_HEADER(launch.h, AC_DEFINE(HAVE_LAUNCH_H))
|
||||
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
# Darwin, macOS
|
||||
LAUNCHD_DIR="/System/Library/LaunchDaemons"
|
||||
# liblaunch is already part of libSystem
|
||||
;;
|
||||
*)
|
||||
# All others; this test will need to be updated
|
||||
;;
|
||||
esac
|
||||
if test "$host_os_name" = darwin; then
|
||||
LAUNCHD_DIR="/System/Library/LaunchDaemons"
|
||||
# liblaunch is already part of libSystem
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Systemd is used on Linux...
|
||||
@@ -84,7 +78,7 @@ if test x$enable_systemd != xno; then
|
||||
fi
|
||||
|
||||
dnl Upstart is also used on Linux (e.g., Chrome OS)
|
||||
AC_ARG_ENABLE(upstart, [ --enable-upstart enable upstart support])
|
||||
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.)
|
||||
@@ -123,13 +117,13 @@ if test x$rcdir = x; then
|
||||
fi
|
||||
|
||||
if test "x$rcstart" = x; then
|
||||
case "$uname" in
|
||||
Linux | GNU | GNU/k*BSD*)
|
||||
case "$host_os_name" in
|
||||
linux* | gnu*)
|
||||
# Linux
|
||||
rcstart="81"
|
||||
;;
|
||||
|
||||
SunOS*)
|
||||
sunos*)
|
||||
# Solaris
|
||||
rcstart="81"
|
||||
;;
|
||||
@@ -142,8 +136,8 @@ if test "x$rcstart" = x; then
|
||||
fi
|
||||
|
||||
if test "x$rcstop" = x; then
|
||||
case "$uname" in
|
||||
Linux | GNU | GNU/k*BSD*)
|
||||
case "$host_os_name" in
|
||||
linux* | gnu*)
|
||||
# Linux
|
||||
rcstop="36"
|
||||
;;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Threading stuff for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2011 by Apple Inc.
|
||||
dnl Copyright 2007-2017 by Apple Inc.
|
||||
dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -36,7 +36,7 @@ if test "x$enable_threads" != xno; then
|
||||
|
||||
# Solaris requires -D_POSIX_PTHREAD_SEMANTICS to
|
||||
# be POSIX-compliant... :(
|
||||
if test $uname = SunOS; then
|
||||
if test $host_os_name = sunos; then
|
||||
PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS"
|
||||
fi
|
||||
break
|
||||
|
||||
+1568
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+1793
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
externo
+504
-351
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+2
-2
@@ -1,7 +1,7 @@
|
||||
dnl
|
||||
dnl Configuration script for CUPS.
|
||||
dnl
|
||||
dnl Copyright 2007-2016 by Apple Inc.
|
||||
dnl Copyright 2007-2018 by Apple Inc.
|
||||
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
dnl
|
||||
dnl These coded instructions, statements, and computer programs are the
|
||||
@@ -15,7 +15,7 @@ dnl We need at least autoconf 2.60...
|
||||
AC_PREREQ(2.60)
|
||||
|
||||
dnl Package name and version...
|
||||
AC_INIT([CUPS], [2.2.2], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/])
|
||||
AC_INIT([CUPS], [2.2.8], [https://github.com/apple/cups/issues], [cups], [https://www.cups.org/])
|
||||
|
||||
sinclude(config-scripts/cups-opsys.m4)
|
||||
sinclude(config-scripts/cups-common.m4)
|
||||
|
||||
+59
-67
@@ -1,8 +1,8 @@
|
||||
#
|
||||
# API library Makefile for CUPS.
|
||||
# Library Makefile for CUPS.
|
||||
#
|
||||
# Copyright 2007-2016 by Apple Inc.
|
||||
# Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
# Copyright © 2007-2018 by Apple Inc.
|
||||
# Copyright © 1997-2006 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
# property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -89,6 +89,7 @@ TESTOBJS = \
|
||||
testcups.o \
|
||||
testdest.o \
|
||||
testfile.o \
|
||||
testgetdests.o \
|
||||
testhttp.o \
|
||||
testi18n.o \
|
||||
testipp.o \
|
||||
@@ -158,6 +159,7 @@ UNITTARGETS = \
|
||||
testcups \
|
||||
testdest \
|
||||
testfile \
|
||||
testgetdests \
|
||||
testhttp \
|
||||
testi18n \
|
||||
testipp \
|
||||
@@ -329,7 +331,7 @@ libcups.2.dylib: $(LIBOBJS) $(LIBCUPSORDER)
|
||||
echo Linking $@...
|
||||
$(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \
|
||||
-install_name $(libdir)/$@ \
|
||||
-current_version 2.12.0 \
|
||||
-current_version 2.13.0 \
|
||||
-compatibility_version 2.0.0 \
|
||||
-exported_symbols_list t.exp \
|
||||
$(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
|
||||
@@ -344,8 +346,8 @@ libcups.2.dylib: $(LIBOBJS) $(LIBCUPSORDER)
|
||||
|
||||
libcups.la: $(LIBOBJS)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) \
|
||||
-rpath $(LIBDIR) -version-info 2:12 $(LIBGSSAPI) $(SSLLIBS) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) \
|
||||
-rpath $(LIBDIR) -version-info 2:13 $(LIBGSSAPI) $(SSLLIBS) \
|
||||
$(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -367,7 +369,7 @@ libcups.a: $(LIBOBJS)
|
||||
libcups2.def: $(LIBOBJS) Makefile
|
||||
echo Generating $@...
|
||||
echo "LIBRARY libcups2" >libcups2.def
|
||||
echo "VERSION 2.12" >>libcups2.def
|
||||
echo "VERSION 2.13" >>libcups2.def
|
||||
echo "EXPORTS" >>libcups2.def
|
||||
(nm $(LIBOBJS) 2>/dev/null | grep "T _" | awk '{print $$3}'; \
|
||||
echo __cups_strcpy; echo __cups_strlcat; echo __cups_strlcpy) | \
|
||||
@@ -383,7 +385,7 @@ libcups2.def: $(LIBOBJS) Makefile
|
||||
|
||||
testadmin: testadmin.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testadmin.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o $@ testadmin.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -393,7 +395,7 @@ testadmin: testadmin.o $(LIBCUPSSTATIC)
|
||||
|
||||
testarray: testarray.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testarray.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testarray.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Running array API tests...
|
||||
./testarray
|
||||
@@ -405,7 +407,7 @@ testarray: testarray.o $(LIBCUPSSTATIC)
|
||||
|
||||
testcache: testcache.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testcache.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o $@ testcache.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -415,7 +417,7 @@ testcache: testcache.o $(LIBCUPSSTATIC)
|
||||
|
||||
testconflicts: testconflicts.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testconflicts.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o $@ testconflicts.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -425,7 +427,7 @@ testconflicts: testconflicts.o $(LIBCUPSSTATIC)
|
||||
|
||||
testcreds: testcreds.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testcreds.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testcreds.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -435,7 +437,7 @@ testcreds: testcreds.o $(LIBCUPSSTATIC)
|
||||
|
||||
testcups: testcups.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testcups.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o $@ testcups.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -445,7 +447,7 @@ testcups: testcups.o $(LIBCUPSSTATIC)
|
||||
|
||||
testdest: testdest.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testdest.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o $@ testdest.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -455,19 +457,29 @@ testdest: testdest.o $(LIBCUPSSTATIC)
|
||||
|
||||
testfile: testfile.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testfile.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testfile.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Running file API tests...
|
||||
./testfile
|
||||
|
||||
|
||||
#
|
||||
# testgetdests (dependency on static CUPS library is intentional)
|
||||
#
|
||||
|
||||
testgetdests: testgetdests.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(LD_CC) $(LDFLAGS) -o $@ testgetdests.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
#
|
||||
# testhttp (dependency on static CUPS library is intentional)
|
||||
#
|
||||
|
||||
testhttp: testhttp.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testhttp.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testhttp.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Running HTTP API tests...
|
||||
./testhttp
|
||||
@@ -479,7 +491,7 @@ testhttp: testhttp.o $(LIBCUPSSTATIC)
|
||||
|
||||
testipp: testipp.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testipp.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testipp.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Running IPP API tests...
|
||||
./testipp
|
||||
@@ -491,7 +503,7 @@ testipp: testipp.o $(LIBCUPSSTATIC)
|
||||
|
||||
testi18n: testi18n.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testi18n.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testi18n.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Running internationalization API tests...
|
||||
./testi18n
|
||||
@@ -503,10 +515,22 @@ testi18n: testi18n.o $(LIBCUPSSTATIC)
|
||||
|
||||
testlang: testlang.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testlang.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testlang.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Creating locale directory structure...
|
||||
$(RM) -r locale
|
||||
$(MKDIR) locale/en
|
||||
echo 'msgid "No"' > locale/en/cups_en.po
|
||||
echo 'msgstr "No"' >> locale/en/cups_en.po
|
||||
echo 'msgid "Yes"' >> locale/en/cups_en.po
|
||||
echo 'msgstr "Yes"' >> locale/en/cups_en.po
|
||||
for po in ../locale/cups_*.po; do \
|
||||
lang=`basename $$po .po | sed -e '1,$$s/^cups_//'`; \
|
||||
$(MKDIR) locale/$$lang; \
|
||||
$(LN) ../../$$po locale/$$lang; \
|
||||
done
|
||||
echo Running language API tests...
|
||||
./testlang
|
||||
LOCALEDIR=locale ./testlang
|
||||
|
||||
|
||||
#
|
||||
@@ -515,7 +539,7 @@ testlang: testlang.o $(LIBCUPSSTATIC)
|
||||
|
||||
testoptions: testoptions.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testoptions.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testoptions.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Running option API tests...
|
||||
./testoptions
|
||||
@@ -527,7 +551,7 @@ testoptions: testoptions.o $(LIBCUPSSTATIC)
|
||||
|
||||
testppd: testppd.o $(LIBCUPSSTATIC) test.ppd test2.ppd
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testppd.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testppd.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Running PPD API tests...
|
||||
./testppd
|
||||
@@ -539,7 +563,7 @@ testppd: testppd.o $(LIBCUPSSTATIC) test.ppd test2.ppd
|
||||
|
||||
testpwg: testpwg.o $(LIBCUPSSTATIC) test.ppd
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testpwg.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testpwg.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
echo Running PWG API tests...
|
||||
./testpwg test.ppd
|
||||
@@ -551,7 +575,7 @@ testpwg: testpwg.o $(LIBCUPSSTATIC) test.ppd
|
||||
|
||||
testsnmp: testsnmp.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o $@ testsnmp.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(LDFLAGS) -o $@ testsnmp.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -561,7 +585,7 @@ testsnmp: testsnmp.o $(LIBCUPSSTATIC)
|
||||
|
||||
tlscheck: tlscheck.o $(LIBCUPSSTATIC)
|
||||
echo Linking $@...
|
||||
$(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ tlscheck.o $(LIBCUPSSTATIC) \
|
||||
$(LD_CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ tlscheck.o $(LIBCUPSSTATIC) \
|
||||
$(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
|
||||
|
||||
|
||||
@@ -571,56 +595,27 @@ tlscheck: tlscheck.o $(LIBCUPSSTATIC)
|
||||
|
||||
apihelp:
|
||||
echo Generating CUPS API help files...
|
||||
mxmldoc --section "Programming" \
|
||||
--title "Introduction to CUPS Programming" \
|
||||
--css ../doc/cups-printable.css \
|
||||
--header api-overview.header --intro api-overview.shtml \
|
||||
>../doc/help/api-overview.html
|
||||
$(RM) cupspm.xml
|
||||
mxmldoc --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 \
|
||||
--coverimage cupspm.png \
|
||||
--epub ../doc/help/cupspm.epub
|
||||
mxmldoc --section "Programming" --body cupspm.md \
|
||||
cupspm.xml > ../doc/help/cupspm.html
|
||||
$(RM) cupspm.xml
|
||||
mxmldoc --section "Programming" --title "Administration APIs" \
|
||||
--css ../doc/cups-printable.css \
|
||||
--header api-admin.header --intro api-admin.shtml \
|
||||
api-admin.xml \
|
||||
adminutil.c adminutil.h getdevices.c >../doc/help/api-admin.html
|
||||
mxmldoc --tokens help/api-admin.html api-admin.xml >../doc/help/api-admin.tokens
|
||||
$(RM) api-admin.xml
|
||||
mxmldoc --section "Programming" --title "Array API" \
|
||||
--css ../doc/cups-printable.css \
|
||||
--header api-array.header --intro api-array.shtml \
|
||||
api-array.xml \
|
||||
array.h array.c >../doc/help/api-array.html
|
||||
mxmldoc --tokens help/api-array.html api-array.xml >../doc/help/api-array.tokens
|
||||
$(RM) api-array.xml
|
||||
mxmldoc --section "Programming" --title "CUPS API" \
|
||||
--css ../doc/cups-printable.css \
|
||||
--header api-cups.header --intro api-cups.shtml \
|
||||
api-cups.xml \
|
||||
cups.h pwg.h adminutil.c dest*.c language.c notify.c \
|
||||
options.c pwg-media.c tempfile.c usersys.c \
|
||||
util.c >../doc/help/api-cups.html
|
||||
mxmldoc --tokens help/api-cups.html api-cups.xml >../doc/help/api-cups.tokens
|
||||
$(RM) api-cups.xml
|
||||
mxmldoc --section "Programming" --title "File and Directory APIs" \
|
||||
--css ../doc/cups-printable.css \
|
||||
--header api-filedir.header --intro api-filedir.shtml \
|
||||
api-filedir.xml \
|
||||
file.h file.c dir.h dir.c >../doc/help/api-filedir.html
|
||||
mxmldoc --tokens api-filedir.xml >../doc/help/api-filedir.tokens
|
||||
$(RM) api-filedir.xml
|
||||
mxmldoc --section "Programming" --title "PPD API (DEPRECATED)" \
|
||||
--css ../doc/cups-printable.css \
|
||||
--header api-ppd.header --intro api-ppd.shtml \
|
||||
api-ppd.xml ppd.h ppd-*.c >../doc/help/api-ppd.html
|
||||
mxmldoc --tokens help/api-ppd.html api-ppd.xml >../doc/help/api-ppd.tokens
|
||||
$(RM) api-ppd.xml
|
||||
mxmldoc --section "Programming" --title "HTTP and IPP APIs" \
|
||||
--css ../doc/cups-printable.css \
|
||||
--header api-httpipp.header --intro api-httpipp.shtml \
|
||||
api-httpipp.xml \
|
||||
http.h ipp.h auth.c getdevices.c getputfile.c encode.c \
|
||||
http.c http-addr.c http-support.c ipp.c ipp-support.c \
|
||||
md5passwd.c request.c >../doc/help/api-httpipp.html
|
||||
mxmldoc --tokens help/api-httpipp.html api-httpipp.xml >../doc/help/api-httpipp.tokens
|
||||
$(RM) api-httpipp.xml
|
||||
mxmldoc --section "Programming" \
|
||||
--title "Filter and Backend Programming" \
|
||||
--css ../doc/cups-printable.css \
|
||||
@@ -628,7 +623,6 @@ apihelp:
|
||||
api-filter.xml \
|
||||
backchannel.c backend.h backend.c sidechannel.c sidechannel.h \
|
||||
>../doc/help/api-filter.html
|
||||
mxmldoc --tokens help/api-filter.html api-filter.xml >../doc/help/api-filter.tokens
|
||||
$(RM) api-filter.xml
|
||||
|
||||
|
||||
@@ -637,8 +631,6 @@ apihelp:
|
||||
#
|
||||
|
||||
sloc:
|
||||
echo "libcupslite: \c"
|
||||
sloccount $(LITEOBJS:.o=.c) 2>/dev/null | grep "Total Physical" | awk '{print $$9}'
|
||||
echo "libcups: \c"
|
||||
sloccount $(LIBOBJS:.o=.c) 2>/dev/null | grep "Total Physical" | awk '{print $$9}'
|
||||
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
<!--
|
||||
Array API header for CUPS.
|
||||
|
||||
Copyright 2008-2011 by Apple Inc.
|
||||
|
||||
These coded instructions, statements, and computer programs are the
|
||||
property of Apple Inc. and are protected by Federal copyright
|
||||
law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
which should have been included with this file. If this file is
|
||||
file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
-->
|
||||
|
||||
<h1 class='title'>Array API</h1>
|
||||
|
||||
<div class='summary'><table summary='General Information'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Header</th>
|
||||
<th>cups/array.h</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Library</th>
|
||||
<td>-lcups</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>See Also</th>
|
||||
<td>Programming: <a href='api-overview.html' target='_top'>Introduction to CUPS Programming</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
@@ -1,194 +0,0 @@
|
||||
<!--
|
||||
Array API introduction for CUPS.
|
||||
|
||||
Copyright 2007-2011 by Apple Inc.
|
||||
Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs are the
|
||||
property of Apple Inc. and are protected by Federal copyright
|
||||
law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
which should have been included with this file. If this file is
|
||||
file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
-->
|
||||
|
||||
<h2 class='title'><a name='OVERVIEW'>Overview</a></h2>
|
||||
|
||||
<p>The CUPS array API provides a high-performance generic array container.
|
||||
The contents of the array container can be sorted and the container itself is
|
||||
designed for optimal speed and memory usage under a wide variety of conditions.
|
||||
Sorted arrays use a binary search algorithm from the last found or inserted
|
||||
element to quickly find matching elements in the array. Arrays created with the
|
||||
optional hash function can often find elements with a single lookup. The
|
||||
<a href='#cups_array_t'><code>cups_array_t</code></a> type is used when
|
||||
referring to a CUPS array.</p>
|
||||
|
||||
<p>The CUPS scheduler (<tt>cupsd</tt>) and many of the CUPS API
|
||||
functions use the array API to efficiently manage large lists of
|
||||
data.</p>
|
||||
|
||||
<h3><a name='MANAGING_ARRAYS'>Managing Arrays</a></h3>
|
||||
|
||||
<p>Arrays are created using either the
|
||||
<a href='#cupsArrayNew'><code>cupsArrayNew</code></a>,
|
||||
<a href='#cupsArrayNew2'><code>cupsArrayNew2</code></a>, or
|
||||
<a href='#cupsArrayNew2'><code>cupsArrayNew3</code></a> functions. The
|
||||
first function creates a new array with the specified callback function
|
||||
and user data pointer:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/array.h>
|
||||
|
||||
static int compare_func(void *first, void *second, void *user_data);
|
||||
|
||||
void *user_data;
|
||||
<a href='#cups_array_t'>cups_array_t</a> *array = <a href='#cupsArrayNew'>cupsArrayNew</a>(compare_func, user_data);
|
||||
</pre>
|
||||
|
||||
<p>The comparison function (type
|
||||
<a href="#cups_arrayfunc_t"><code>cups_arrayfunc_t</code></a>) is called
|
||||
whenever an element is added to the array and can be <code>NULL</code> to
|
||||
create an unsorted array. The function returns -1 if the first element should
|
||||
come before the second, 0 if the first and second elements should have the same
|
||||
ordering, and 1 if the first element should come after the second.</p>
|
||||
|
||||
<p>The "user_data" pointer is passed to your comparison function. Pass
|
||||
<code>NULL</code> if you do not need to associate the elements in your array
|
||||
with additional information.</p>
|
||||
|
||||
<p>The <a href='#cupsArrayNew2'><code>cupsArrayNew2</code></a> function adds
|
||||
two more arguments to support hashed lookups, which can potentially provide
|
||||
instantaneous ("O(1)") lookups in your array:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/array.h>
|
||||
|
||||
#define HASH_SIZE 512 /* Size of hash table */
|
||||
|
||||
static int compare_func(void *first, void *second, void *user_data);
|
||||
static int hash_func(void *element, void *user_data);
|
||||
|
||||
void *user_data;
|
||||
<a href='#cups_array_t'>cups_array_t</a> *hash_array = <a href='#cupsArrayNew2'>cupsArrayNew2</a>(compare_func, user_data, hash_func, HASH_SIZE);
|
||||
</pre>
|
||||
|
||||
<p>The hash function (type
|
||||
<a href="#cups_ahash_func_t"><code>cups_ahash_func_t</code></a>) should return a
|
||||
number from 0 to (hash_size-1) that (hopefully) uniquely identifies the
|
||||
element and is called whenever you look up an element in the array with
|
||||
<a href='#cupsArrayFind'><code>cupsArrayFind</code></a>. The hash size is
|
||||
only limited by available memory, but generally should not be larger than
|
||||
16384 to realize any performance improvement.</p>
|
||||
|
||||
<p>The <a href='#cupsArrayNew3'><code>cupsArrayNew3</code></a> function adds
|
||||
copy and free callbacks to support basic memory management of elements:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/array.h>
|
||||
|
||||
#define HASH_SIZE 512 /* Size of hash table */
|
||||
|
||||
static int compare_func(void *first, void *second, void *user_data);
|
||||
static void *copy_func(void *element, void *user_data);
|
||||
static void free_func(void *element, void *user_data);
|
||||
static int hash_func(void *element, void *user_data);
|
||||
|
||||
void *user_data;
|
||||
<a href='#cups_array_t'>cups_array_t</a> *array = <a href='#cupsArrayNew3'>cupsArrayNew3</a>(compare_func, user_data, NULL, 0, copy_func, free_func);
|
||||
|
||||
<a href='#cups_array_t'>cups_array_t</a> *hash_array = <a href='#cupsArrayNew3'>cupsArrayNew3</a>(compare_func, user_data, hash_func, HASH_SIZE, copy_func, free_func);
|
||||
</pre>
|
||||
|
||||
<p>Once you have created the array, you add elements using the
|
||||
<a href='#cupsArrayAdd'><code>cupsArrayAdd</code></a>
|
||||
<a href='#cupsArrayInsert'><code>cupsArrayInsert</code></a> functions.
|
||||
The first function adds an element to the array, adding the new element
|
||||
after any elements that have the same order, while the second inserts the
|
||||
element before others with the same order. For unsorted arrays,
|
||||
<a href='#cupsArrayAdd'><code>cupsArrayAdd</code></a> appends the element to
|
||||
the end of the array while
|
||||
<a href='#cupsArrayInsert'><code>cupsArrayInsert</code></a> inserts the
|
||||
element at the beginning of the array. For example, the following code
|
||||
creates a sorted array of character strings:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/array.h>
|
||||
|
||||
/* Use strcmp() to compare strings - it will ignore the user_data pointer */
|
||||
<a href='#cups_array_t'>cups_array_t</a> *array = <a href='#cupsArrayNew'>cupsArrayNew</a>((<a href='#cups_array_func_t'>cups_array_func_t</a>)strcmp, NULL);
|
||||
|
||||
/* Add four strings to the array */
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "One Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Two Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Red Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Blue Fish");
|
||||
</pre>
|
||||
|
||||
<p>Elements are removed using the
|
||||
<a href='#cupsArrayRemove'><code>cupsArrayRemove</code></a> function, for
|
||||
example:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/array.h>
|
||||
|
||||
/* Use strcmp() to compare strings - it will ignore the user_data pointer */
|
||||
<a href='#cups_array_t'>cups_array_t</a> *array = <a href='#cupsArrayNew'>cupsArrayNew</a>((<a href='#cups_array_func_t'>cups_array_func_t</a>)strcmp, NULL);
|
||||
|
||||
/* Add four strings to the array */
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "One Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Two Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Red Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Blue Fish");
|
||||
|
||||
/* Remove "Red Fish" */
|
||||
<a href='#cupsArrayRemove'>cupsArrayRemove</a>(array, "Red Fish");
|
||||
</pre>
|
||||
|
||||
<p>Finally, you free the memory used by the array using the
|
||||
<a href='#cupsArrayDelete'><code>cupsArrayDelete</code></a> function. All
|
||||
of the memory for the array and hash table (if any) is freed, however <em>CUPS
|
||||
does not free the elements unless you provide copy and free functions</em>.</p>
|
||||
|
||||
<h3><a name='FINDING_AND_ENUMERATING'>Finding and Enumerating Elements</a></h3>
|
||||
|
||||
<p>CUPS provides several functions to find and enumerate elements in an
|
||||
array. Each one sets or updates a "current index" into the array, such that
|
||||
future lookups will start where the last one left off:</p>
|
||||
|
||||
<dl>
|
||||
<dt><a href='#cupsArrayFind'><code>cupsArrayFind</code></a></dt>
|
||||
<dd>Returns the first matching element.</dd>
|
||||
<dt><a href='#cupsArrayFirst'><code>cupsArrayFirst</code></a></dt>
|
||||
<dd>Returns the first element in the array.</dd>
|
||||
<dt><a href='#cupsArrayIndex'><code>cupsArrayIndex</code></a></dt>
|
||||
<dd>Returns the Nth element in the array, starting at 0.</dd>
|
||||
<dt><a href='#cupsArrayLast'><code>cupsArrayLast</code></a></dt>
|
||||
<dd>Returns the last element in the array.</dd>
|
||||
<dt><a href='#cupsArrayNext'><code>cupsArrayNext</code></a></dt>
|
||||
<dd>Returns the next element in the array.</dd>
|
||||
<dt><a href='#cupsArrayPrev'><code>cupsArrayPrev</code></a></dt>
|
||||
<dd>Returns the previous element in the array.</dd>
|
||||
</dl>
|
||||
|
||||
<p>Each of these functions returns <code>NULL</code> when there is no
|
||||
corresponding element. For example, a simple <code>for</code> loop using the
|
||||
<a href='#cupsArrayFirst'><code>cupsArrayFirst</code></a> and
|
||||
<a href='#cupsArrayNext'><code>cupsArrayNext</code></a> functions will
|
||||
enumerate all of the strings in our previous example:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/array.h>
|
||||
|
||||
/* Use strcmp() to compare strings - it will ignore the user_data pointer */
|
||||
<a href='#cups_array_t'>cups_array_t</a> *array = <a href='#cupsArrayNew'>cupsArrayNew</a>((<a href='#cups_array_func_t'>cups_array_func_t</a>)strcmp, NULL);
|
||||
|
||||
/* Add four strings to the array */
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "One Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Two Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Red Fish");
|
||||
<a href='#cupsArrayAdd'>cupsArrayAdd</a>(array, "Blue Fish");
|
||||
|
||||
/* Show all of the strings in the array */
|
||||
char *s;
|
||||
for (s = (char *)<a href='#cupsArrayFirst'>cupsArrayFirst</a>(array); s != NULL; s = (char *)<a href='#cupsArrayNext'>cupsArrayNext</a>(array))
|
||||
puts(s);
|
||||
</pre>
|
||||
@@ -1,38 +0,0 @@
|
||||
<!--
|
||||
CUPS API header for CUPS.
|
||||
|
||||
Copyright 2008-2011 by Apple Inc.
|
||||
|
||||
These coded instructions, statements, and computer programs are the
|
||||
property of Apple Inc. and are protected by Federal copyright
|
||||
law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
which should have been included with this file. If this file is
|
||||
file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
-->
|
||||
|
||||
<h1 class='title'>CUPS API</h1>
|
||||
|
||||
<div class='summary'><table summary='General Information'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Header</th>
|
||||
<th>cups/cups.h</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Library</th>
|
||||
<td>-lcups</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>See Also</th>
|
||||
<td>Programming: <a href='api-overview.html' target='_top'>Introduction to CUPS Programming</a><br>
|
||||
Programming: <a href='api-array.html' target='_top'>Array API</a><br>
|
||||
Programming: <a href='api-filedir.html' target='_top'>File and Directory APIs</a><br>
|
||||
Programming: <a href='api-filter.html' target='_top'>Filter and Backend Programming</a><br>
|
||||
Programming: <a href='api-httpipp.html' target='_top'>HTTP and IPP APIs</a><br>
|
||||
Programming: <a href='api-ppd.html' target='_top'>PPD API</a><br>
|
||||
Programming: <a href='api-raster.html' target='_top'>Raster API</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
@@ -1,441 +0,0 @@
|
||||
<!--
|
||||
API introduction for CUPS.
|
||||
|
||||
Copyright 2007-2013 by Apple Inc.
|
||||
Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs are the
|
||||
property of Apple Inc. and are protected by Federal copyright
|
||||
law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
which should have been included with this file. If this file is
|
||||
file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
-->
|
||||
|
||||
<h2 class='title'><a name='OVERVIEW'>Overview</a></h2>
|
||||
|
||||
<p>The CUPS API provides the convenience functions needed to support
|
||||
applications, filters, printer drivers, and backends that need to interface
|
||||
with the CUPS scheduler.</p>
|
||||
|
||||
<h3><a name='CLIENTS_AND_SERVERS'>Clients and Servers</a></h3>
|
||||
|
||||
<p>CUPS is based on the Internet Printing Protocol ("IPP"), which allows
|
||||
clients (applications) to communicate with a server (the scheduler) to get a
|
||||
list of printers, send print jobs, and so forth. You identify which server
|
||||
you want to communicate with using a pointer to the opaque structure
|
||||
<code>http_t</code>. All of the examples in this document use the
|
||||
<code>CUPS_HTTP_DEFAULT</code> constant, referring to the default connection
|
||||
to the scheduler. The <a href='api-httpipp.html' target='_top'>HTTP and IPP
|
||||
APIs</a> document provides more information on server connections.</p>
|
||||
|
||||
<h3><a name='PRINTERS_AND_CLASSES'>Printers and Classes</a></h3>
|
||||
|
||||
<p>Printers and classes (collections of printers) are accessed through
|
||||
the <a href="#cups_dest_t"><code>cups_dest_t</code></a> structure which
|
||||
includes the name (<code>name</code>), instance (<code>instance</code> -
|
||||
a way of selecting certain saved options/settings), and the options and
|
||||
attributes associated with that destination (<code>num_options</code> and
|
||||
<code>options</code>). Destinations are created using the
|
||||
<a href="#cupsGetDests"><code>cupsGetDests</code></a> function and freed
|
||||
using the <a href='#cupsFreeDests'><code>cupsFreeDests</code></a> function.
|
||||
The <a href='#cupsGetDest'><code>cupsGetDest</code></a> function finds a
|
||||
specific destination for printing:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dests;
|
||||
int num_dests = <a href='#cupsGetDests'>cupsGetDests</a>(&dests);
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dest = <a href='#cupsGetDest'>cupsGetDest</a>("name", NULL, num_dests, dests);
|
||||
|
||||
/* do something with dest */
|
||||
|
||||
<a href='#cupsFreeDests'>cupsFreeDests</a>(num_dests, dests);
|
||||
</pre>
|
||||
|
||||
<p>Passing <code>NULL</code> to
|
||||
<a href='#cupsGetDest'><code>cupsGetDest</code></a> for the destination name
|
||||
will return the default destination. Similarly, passing a <code>NULL</code>
|
||||
instance will return the default instance for that destination.</p>
|
||||
|
||||
<div class='table'><table summary='Table 1: Printer Attributes' width='80%'>
|
||||
<caption>Table 1: <a name='TABLE1'>Printer Attributes</a></caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute Name</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>"auth-info-required"</td>
|
||||
<td>The type of authentication required for printing to this
|
||||
destination: "none", "username,password", "domain,username,password",
|
||||
or "negotiate" (Kerberos)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-info"</td>
|
||||
<td>The human-readable description of the destination such as "My
|
||||
Laser Printer".</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-is-accepting-jobs"</td>
|
||||
<td>"true" if the destination is accepting new jobs, "false" if
|
||||
not.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-is-shared"</td>
|
||||
<td>"true" if the destination is being shared with other computers,
|
||||
"false" if not.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-location"</td>
|
||||
<td>The human-readable location of the destination such as "Lab 4".</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-make-and-model"</td>
|
||||
<td>The human-readable make and model of the destination such as "HP
|
||||
LaserJet 4000 Series".</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-state"</td>
|
||||
<td>"3" if the destination is idle, "4" if the destination is printing
|
||||
a job, and "5" if the destination is stopped.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-state-change-time"</td>
|
||||
<td>The UNIX time when the destination entered the current state.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-state-reasons"</td>
|
||||
<td>Additional comma-delimited state keywords for the destination
|
||||
such as "media-tray-empty-error" and "toner-low-warning".</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>"printer-type"</td>
|
||||
<td>The <a href='#cups_printer_t'><code>cups_printer_t</code></a>
|
||||
value associated with the destination.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
|
||||
<h3><a name='OPTIONS'>Options</a></h3>
|
||||
|
||||
<p>Options are stored in arrays of
|
||||
<a href='#cups_option_t'><code>cups_option_t</code></a> structures. Each
|
||||
option has a name (<code>name</code>) and value (<code>value</code>)
|
||||
associated with it. The <a href='#cups_dest_t'><code>cups_dest_t</code></a>
|
||||
<code>num_options</code> and <code>options</code> members contain the
|
||||
default options for a particular destination, along with several informational
|
||||
attributes about the destination as shown in <a href='#TABLE1'>Table 1</a>.
|
||||
The <a href='#cupsGetOption'><code>cupsGetOption</code></a> function gets
|
||||
the value for the named option. For example, the following code lists the
|
||||
available destinations and their human-readable descriptions:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dests;
|
||||
int num_dests = <a href='#cupsGetDests'>cupsGetDests</a>(&dests);
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dest;
|
||||
int i;
|
||||
const char *value;
|
||||
|
||||
for (i = num_dests, dest = dests; i > 0; i --, dest ++)
|
||||
if (dest->instance == NULL)
|
||||
{
|
||||
value = <a href='#cupsGetOption'>cupsGetOption</a>("printer-info", dest->num_options, dest->options);
|
||||
printf("%s (%s)\n", dest->name, value ? value : "no description");
|
||||
}
|
||||
|
||||
<a href='#cupsFreeDests'>cupsFreeDests</a>(num_dests, dests);
|
||||
</pre>
|
||||
|
||||
<p>You can create your own option arrays using the
|
||||
<a href='#cupsAddOption'><code>cupsAddOption</code></a> function, which
|
||||
adds a single named option to an array:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
int num_options = 0;
|
||||
<a href='#cups_option_t'>cups_option_t</a> *options = NULL;
|
||||
|
||||
/* The returned num_options value is updated as needed */
|
||||
num_options = <a href='#cupsAddOption'>cupsAddOption</a>("first", "value", num_options, &options);
|
||||
|
||||
/* This adds a second option value */
|
||||
num_options = <a href='#cupsAddOption'>cupsAddOption</a>("second", "value", num_options, &options);
|
||||
|
||||
/* This replaces the first option we added */
|
||||
num_options = <a href='#cupsAddOption'>cupsAddOption</a>("first", "new value", num_options, &options);
|
||||
</pre>
|
||||
|
||||
<p>Use a <code>for</code> loop to copy the options from a destination:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
int i;
|
||||
int num_options = 0;
|
||||
<a href='#cups_option_t'>cups_option_t</a> *options = NULL;
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dest;
|
||||
|
||||
for (i = 0; i < dest->num_options; i ++)
|
||||
num_options = <a href='#cupsAddOption'>cupsAddOption</a>(dest->options[i].name, dest->options[i].value,
|
||||
num_options, &options);
|
||||
</pre>
|
||||
|
||||
<p>Use the <a href='#cupsFreeOptions'><code>cupsFreeOptions</code></a>
|
||||
function to free the options array when you are done using it:</p>
|
||||
|
||||
<pre class='example'>
|
||||
<a href='#cupsFreeOptions'>cupsFreeOptions</a>(num_options, options);
|
||||
</pre>
|
||||
|
||||
<h3><a name='PRINT_JOBS'>Print Jobs</a></h3>
|
||||
|
||||
<p>Print jobs are identified by a locally-unique job ID number from 1 to
|
||||
2<sup>31</sup>-1 and have options and one or more files for printing to a
|
||||
single destination. The <a href='#cupsPrintFile'><code>cupsPrintFile</code></a>
|
||||
function creates a new job with one file. The following code prints the CUPS
|
||||
test page file:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dest;
|
||||
int num_options;
|
||||
<a href='#cups_option_t'>cups_option_t</a> *options;
|
||||
int job_id;
|
||||
|
||||
/* Print a single file */
|
||||
job_id = <a href='#cupsPrintFile'>cupsPrintFile</a>(dest->name, "/usr/share/cups/data/testprint.ps",
|
||||
"Test Print", num_options, options);
|
||||
</pre>
|
||||
|
||||
<p>The <a href='#cupsPrintFiles'><code>cupsPrintFiles</code></a> function
|
||||
creates a job with multiple files. The files are provided in a
|
||||
<code>char *</code> array:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dest;
|
||||
int num_options;
|
||||
<a href='#cups_option_t'>cups_option_t</a> *options;
|
||||
int job_id;
|
||||
char *files[3] = { "file1.pdf", "file2.pdf", "file3.pdf" };
|
||||
|
||||
/* Print three files */
|
||||
job_id = <a href='#cupsPrintFiles'>cupsPrintFiles</a>(dest->name, 3, files, "Test Print", num_options, options);
|
||||
</pre>
|
||||
|
||||
<p>Finally, the <a href='#cupsCreateJob'><code>cupsCreateJob</code></a>
|
||||
function creates a new job with no files in it. Files are added using the
|
||||
<a href='#cupsStartDocument'><code>cupsStartDocument</code></a>,
|
||||
<a href='api-httpipp.html#cupsWriteRequestData'><code>cupsWriteRequestData</code></a>,
|
||||
and <a href='#cupsFinishDocument'><code>cupsFinishDocument</code></a> functions.
|
||||
The following example creates a job with 10 text files for printing:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dest;
|
||||
int num_options;
|
||||
<a href='#cups_option_t'>cups_option_t</a> *options;
|
||||
int job_id;
|
||||
int i;
|
||||
char buffer[1024];
|
||||
|
||||
/* Create the job */
|
||||
job_id = <a href='#cupsCreateJob'>cupsCreateJob</a>(CUPS_HTTP_DEFAULT, dest->name, "10 Text Files",
|
||||
num_options, options);
|
||||
|
||||
/* If the job is created, add 10 files */
|
||||
if (job_id > 0)
|
||||
{
|
||||
for (i = 1; i <= 10; i ++)
|
||||
{
|
||||
snprintf(buffer, sizeof(buffer), "file%d.txt", i);
|
||||
|
||||
<a href='#cupsStartDocument'>cupsStartDocument</a>(CUPS_HTTP_DEFAULT, dest->name, job_id, buffer,
|
||||
CUPS_FORMAT_TEXT, i == 10);
|
||||
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"File %d\n"
|
||||
"\n"
|
||||
"One fish,\n"
|
||||
"Two fish,\n
|
||||
"Red fish,\n
|
||||
"Blue fish\n", i);
|
||||
|
||||
/* cupsWriteRequestData can be called as many times as needed */
|
||||
<a href='#cupsWriteRequestData'>cupsWriteRequestData</a>(CUPS_HTTP_DEFAULT, buffer, strlen(buffer));
|
||||
|
||||
<a href='#cupsFinishDocument'>cupsFinishDocument</a>(CUPS_HTTP_DEFAULT, dest->name);
|
||||
}
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Once you have created a job, you can monitor its status using the
|
||||
<a href='#cupsGetJobs'><code>cupsGetJobs</code></a> function, which returns
|
||||
an array of <a href='#cups_job_t'><code>cups_job_t</code></a> structures.
|
||||
Each contains the job ID (<code>id</code>), destination name
|
||||
(<code>dest</code>), title (<code>title</code>), and other information
|
||||
associated with the job. The job array is freed using the
|
||||
<a href='#cupsFreeJobs'><code>cupsFreeJobs</code></a> function. The following
|
||||
example monitors a specific job ID, showing the current job state once every
|
||||
5 seconds until the job is completed:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dest;
|
||||
int job_id;
|
||||
int num_jobs;
|
||||
<a href='#cups_job_t'>cups_job_t</a> *jobs;
|
||||
int i;
|
||||
ipp_jstate_t job_state = IPP_JOB_PENDING;
|
||||
|
||||
while (job_state < IPP_JOB_STOPPED)
|
||||
{
|
||||
/* Get my jobs (1) with any state (-1) */
|
||||
num_jobs = <a href='#cupsGetJobs'>cupsGetJobs</a>(&jobs, dest->name, 1, -1);
|
||||
|
||||
/* Loop to find my job */
|
||||
job_state = IPP_JOB_COMPLETED;
|
||||
|
||||
for (i = 0; i < num_jobs; i ++)
|
||||
if (jobs[i].id == job_id)
|
||||
{
|
||||
job_state = jobs[i].state;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Free the job array */
|
||||
<a href='#cupsFreeJobs'>cupsFreeJobs</a>(num_jobs, jobs);
|
||||
|
||||
/* Show the current state */
|
||||
switch (job_state)
|
||||
{
|
||||
case IPP_JOB_PENDING :
|
||||
printf("Job %d is pending.\n", job_id);
|
||||
break;
|
||||
case IPP_JOB_HELD :
|
||||
printf("Job %d is held.\n", job_id);
|
||||
break;
|
||||
case IPP_JOB_PROCESSING :
|
||||
printf("Job %d is processing.\n", job_id);
|
||||
break;
|
||||
case IPP_JOB_STOPPED :
|
||||
printf("Job %d is stopped.\n", job_id);
|
||||
break;
|
||||
case IPP_JOB_CANCELED :
|
||||
printf("Job %d is canceled.\n", job_id);
|
||||
break;
|
||||
case IPP_JOB_ABORTED :
|
||||
printf("Job %d is aborted.\n", job_id);
|
||||
break;
|
||||
case IPP_JOB_COMPLETED :
|
||||
printf("Job %d is completed.\n", job_id);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Sleep if the job is not finished */
|
||||
if (job_state < IPP_JOB_STOPPED)
|
||||
sleep(5);
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>To cancel a job, use the
|
||||
<a href='#cupsCancelJob'><code>cupsCancelJob</code></a> function with the
|
||||
job ID:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
<a href='#cups_dest_t'>cups_dest_t</a> *dest;
|
||||
int job_id;
|
||||
|
||||
<a href='#cupsCancelJob'>cupsCancelJob</a>(dest->name, job_id);
|
||||
</pre>
|
||||
|
||||
<h3><a name='ERROR_HANDLING'>Error Handling</a></h3>
|
||||
|
||||
<p>If any of the CUPS API printing functions returns an error, the reason for
|
||||
that error can be found by calling the
|
||||
<a href='#cupsLastError'><code>cupsLastError</code></a> and
|
||||
<a href='#cupsLastErrorString'><code>cupsLastErrorString</code></a> functions.
|
||||
<a href='#cupsLastError'><code>cupsLastError</code></a> returns the last IPP
|
||||
error code
|
||||
(<a href='api-httpipp.html#ipp_status_t'><code>ipp_status_t</code></a>)
|
||||
that was encountered, while
|
||||
<a href='#cupsLastErrorString'><code>cupsLastErrorString</code></a> returns
|
||||
a (localized) human-readable string that can be shown to the user. For example,
|
||||
if any of the job creation functions returns a job ID of 0, you can use
|
||||
<a href='#cupsLastErrorString'><code>cupsLastErrorString</code></a> to show
|
||||
the reason why the job could not be created:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
int job_id;
|
||||
|
||||
if (job_id == 0)
|
||||
puts(cupsLastErrorString());
|
||||
</pre>
|
||||
|
||||
<h3><a name='PASSWORDS_AND_AUTHENTICATION'>Passwords and Authentication</a></h3>
|
||||
|
||||
<p>CUPS supports authentication of any request, including submission of print
|
||||
jobs. The default mechanism for getting the username and password is to use the
|
||||
login user and a password from the console.</p>
|
||||
|
||||
<p>To support other types of applications, in particular Graphical User
|
||||
Interfaces ("GUIs"), the CUPS API provides functions to set the default
|
||||
username and to register a callback function that returns a password string.</p>
|
||||
|
||||
<p>The <a href="#cupsSetPasswordCB"><code>cupsSetPasswordCB</code></a>
|
||||
function is used to set a password callback in your program. Only one
|
||||
function can be used at any time.</p>
|
||||
|
||||
<p>The <a href="#cupsSetUser"><code>cupsSetUser</code></a> function sets the
|
||||
current username for authentication. This function can be called by your
|
||||
password callback function to change the current username as needed.</p>
|
||||
|
||||
<p>The following example shows a simple password callback that gets a
|
||||
username and password from the user:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
const char *
|
||||
my_password_cb(const char *prompt)
|
||||
{
|
||||
char user[65];
|
||||
|
||||
|
||||
puts(prompt);
|
||||
|
||||
/* Get a username from the user */
|
||||
printf("Username: ");
|
||||
if (fgets(user, sizeof(user), stdin) == NULL)
|
||||
return (NULL);
|
||||
|
||||
/* Strip the newline from the string and set the user */
|
||||
user[strlen(user) - 1] = '\0';
|
||||
|
||||
<a href='#cupsSetUser'>cupsSetUser</a>(user);
|
||||
|
||||
/* Use getpass() to ask for the password... */
|
||||
return (getpass("Password: "));
|
||||
}
|
||||
|
||||
<a href='#cupsSetPasswordCB'>cupsSetPasswordCB</a>(my_password_cb);
|
||||
</pre>
|
||||
|
||||
<p>Similarly, a GUI could display the prompt string in a window with input
|
||||
fields for the username and password. The username should default to the
|
||||
string returned by the <a href="#cupsUser"><code>cupsUser</code></a>
|
||||
function.</p>
|
||||
@@ -1,34 +0,0 @@
|
||||
<!--
|
||||
File and Directory API header for CUPS.
|
||||
|
||||
Copyright 2008-2011 by Apple Inc.
|
||||
|
||||
These coded instructions, statements, and computer programs are the
|
||||
property of Apple Inc. and are protected by Federal copyright
|
||||
law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
which should have been included with this file. If this file is
|
||||
file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
-->
|
||||
|
||||
<h1 class='title'>File and Directory APIs</h1>
|
||||
|
||||
<div class='summary'><table summary='General Information'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Headers</th>
|
||||
<th>cups/file.h<br>
|
||||
cups/dir.h</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Library</th>
|
||||
<td>-lcups</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>See Also</th>
|
||||
<td>Programming: <a href='api-overview.html' target='_top'>Introduction to CUPS Programming</a><br>
|
||||
Programming: <a href='api-cups.html' target='_top'>CUPS API</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
@@ -1,29 +0,0 @@
|
||||
<!--
|
||||
File and directory API introduction for CUPS.
|
||||
|
||||
Copyright 2007-2011 by Apple Inc.
|
||||
Copyright 1997-2005 by Easy Software Products, all rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs are the
|
||||
property of Apple Inc. and are protected by Federal copyright
|
||||
law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
which should have been included with this file. If this file is
|
||||
file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
-->
|
||||
|
||||
<h2 class='title'><a name="OVERVIEW">Overview</a></h2>
|
||||
|
||||
<p>The CUPS file and directory APIs provide portable interfaces
|
||||
for manipulating files and listing files and directories. Unlike
|
||||
stdio <code>FILE</code> streams, the <code>cupsFile</code> functions
|
||||
allow you to open more than 256 files at any given time. They
|
||||
also manage the platform-specific details of locking, large file
|
||||
support, line endings (CR, LF, or CR LF), and reading and writing
|
||||
files using Flate ("gzip") compression. Finally, you can also
|
||||
connect, read from, and write to network connections using the
|
||||
<code>cupsFile</code> functions.</p>
|
||||
|
||||
<p>The <code>cupsDir</code> functions manage the platform-specific
|
||||
details of directory access/listing and provide a convenient way
|
||||
to get both a list of files and the information (permissions,
|
||||
size, timestamp, etc.) for each of those files.</p>
|
||||
@@ -1,37 +0,0 @@
|
||||
<!--
|
||||
HTTP and IPP API header for CUPS.
|
||||
|
||||
Copyright 2007-2016 by Apple Inc.
|
||||
Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs are the
|
||||
property of Apple Inc. and are protected by Federal copyright
|
||||
law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
which should have been included with this file. If this file is
|
||||
file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
-->
|
||||
|
||||
<h1 class='title'>HTTP and IPP APIs</h1>
|
||||
|
||||
<div class='summary'><table summary='General Information'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Headers</th>
|
||||
<th>cups/cups.h<br>
|
||||
cups/http.h<br>
|
||||
cups/ipp.h</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Library</th>
|
||||
<td>-lcups</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>See Also</th>
|
||||
<td>Programming: <a href='api-overview.html'>Introduction to CUPS Programming</a><br>
|
||||
Programming: <a href='api-cups.html'>CUPS API</a><br>
|
||||
References: <a href='spec-ipp.html'>CUPS Implementation of IPP</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table></div>
|
||||
@@ -1,315 +0,0 @@
|
||||
<!--
|
||||
HTTP and IPP API introduction for CUPS.
|
||||
|
||||
Copyright 2007-2012 by Apple Inc.
|
||||
Copyright 1997-2006 by Easy Software Products, all rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs are the
|
||||
property of Apple Inc. and are protected by Federal copyright
|
||||
law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
which should have been included with this file. If this file is
|
||||
file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
-->
|
||||
|
||||
<h2 class='title'><a name='OVERVIEW'>Overview</a></h2>
|
||||
|
||||
<p>The CUPS HTTP and IPP APIs provide low-level access to the HTTP and IPP
|
||||
protocols and CUPS scheduler. They are typically used by monitoring and
|
||||
administration programs to perform specific functions not supported by the
|
||||
high-level CUPS API functions.</p>
|
||||
|
||||
<p>The HTTP APIs use an opaque structure called
|
||||
<a href='#http_t'><code>http_t</code></a> to manage connections to
|
||||
a particular HTTP or IPP server. The
|
||||
<a href='#httpConnectEncrypt'><code>httpConnectEncrypt</code></a> function is
|
||||
used to create an instance of this structure for a particular server.
|
||||
The constant <code>CUPS_HTTP_DEFAULT</code> can be used with all of the
|
||||
<code>cups</code> functions to refer to the default CUPS server - the functions
|
||||
create a per-thread <a href='#http_t'><code>http_t</code></a> as needed.</p>
|
||||
|
||||
<p>The IPP APIs use two opaque structures for requests (messages sent to the CUPS scheduler) and responses (messages sent back to your application from the scheduler). The <a href='#ipp_t'><code>ipp_t</code></a> type holds a complete request or response and is allocated using the <a href='#ippNew'><code>ippNew</code></a> or <a href='#ippNewRequest'><code>ippNewRequest</code></a> functions and freed using the <a href='#ippDelete'><code>ippDelete</code></a> function.</p>
|
||||
|
||||
<p>The second opaque structure is called <a href='#ipp_attribute_t'><code>ipp_attribute_t</code></a> and holds a single IPP attribute which consists of a group tag (<a href='#ippGetGroupTag'><code>ippGetGroupTag</code></a>), a value type tag (<a href='#ippGetValueTag'><code>ippGetValueTag</code></a>), the attribute name (<a href='#ippGetName'><code>ippGetName</code></a>), and 1 or more values (<a href='#ippGetCount'><code>ippGetCount</code></a>, <a href='#ippGetBoolean'><code>ippGetBoolean</code></a>, <a href='#ippGetCollection'><code>ippGetCollection</code></a>, <a href='#ippGetDate'><code>ippGetDate</code></a>, <a href='#ippGetInteger'><code>ippGetInteger</code></a>, <a href='#ippGetRange'><code>ippGetRange</code></a>, <a href='#ippGetResolution'><code>ippGetResolution</code></a>, and <a href='#ippGetString'><code>ippGetString</code></a>). Attributes are added to an <a href='#ipp_t'><code>ipp_t</code></a> pointer using one of the <code>ippAdd</code> functions. For example, use <a href='#ippAddString'><code>ippAddString</code></a> to add the "printer-uri" and "requesting-user-name" string attributes to a request:</p>
|
||||
|
||||
<pre class='example'>
|
||||
<a href='#ipp_t'>ipp_t</a> *request = <a href='#ippNewRequest'>ippNewRequest</a>(IPP_GET_JOBS);
|
||||
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, "ipp://localhost/printers/");
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, cupsUser());
|
||||
</pre>
|
||||
|
||||
<p>Once you have created an IPP request, use the <code>cups</code> functions to send the request to and read the response from the server. For example, the <a href='#cupsDoRequest'><code>cupsDoRequest</code></a> function can be used for simple query operations that do not involve files:</p>
|
||||
|
||||
<pre class='example'>
|
||||
#include <cups/cups.h>
|
||||
|
||||
|
||||
<a href='#ipp_t'>ipp_t</a> *<a name='get_jobs'>get_jobs</a>(void)
|
||||
{
|
||||
<a href='#ipp_t'>ipp_t</a> *request = <a href='#ippNewRequest'>ippNewRequest</a>(IPP_GET_JOBS);
|
||||
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, "ipp://localhost/printers/");
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, cupsUser());
|
||||
|
||||
return (<a href='#cupsDoRequest'>cupsDoRequest</a>(CUPS_HTTP_DEFAULT, request, "/"));
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>The <a href='#cupsDoRequest'><code>cupsDoRequest</code></a> function frees the request and returns an IPP response or <code>NULL</code> pointer if the request could not be sent to the server. Once you have a response from the server, you can either use the <a href='#ippFindAttribute'><code>ippFindAttribute</code></a> and <a href='#ippFindNextAttribute'><code>ippFindNextAttribute</code></a> functions to find specific attributes, for example:</p>
|
||||
|
||||
<pre class='example'>
|
||||
<a href='#ipp_t'>ipp_t</a> *response;
|
||||
<a href='#ipp_attribute_t'>ipp_attribute_t</a> *attr;
|
||||
|
||||
attr = <a href='#ippFindAttribute'>ippFindAttribute</a>(response, "printer-state", IPP_TAG_ENUM);
|
||||
</pre>
|
||||
|
||||
<p>You can also walk the list of attributes with a simple <code>for</code> loop like this:</p>
|
||||
|
||||
<pre class='example'>
|
||||
<a href='#ipp_t'>ipp_t</a> *response;
|
||||
<a href='#ipp_attribute_t'>ipp_attribute_t</a> *attr;
|
||||
|
||||
for (attr = <a href='#ippFirstAttribute'>ippFirstAttribute</a>(response); attr != NULL; attr = <a href='#ippNextAttribute'>ippNextAttribute</a>(response))
|
||||
if (ippGetName(attr) == NULL)
|
||||
puts("--SEPARATOR--");
|
||||
else
|
||||
puts(ippGetName(attr));
|
||||
</pre>
|
||||
|
||||
<p>The <code>for</code> loop approach is normally used when collecting attributes for multiple objects (jobs, printers, etc.) in a response. Attributes with <code>NULL</code> names indicate a separator between the attributes of each object. For example, the following code will list the jobs returned from our previous <a href='#get_jobs'><code>get_jobs</code></a> example code:</p>
|
||||
|
||||
<pre class='example'>
|
||||
<a href='#ipp_t'>ipp_t</a> *response = <a href='#get_jobs'>get_jobs</a>();
|
||||
|
||||
if (response != NULL)
|
||||
{
|
||||
<a href='#ipp_attribute_t'>ipp_attribute_t</a> *attr;
|
||||
const char *attrname;
|
||||
int job_id = 0;
|
||||
const char *job_name = NULL;
|
||||
const char *job_originating_user_name = NULL;
|
||||
|
||||
puts("Job ID Owner Title");
|
||||
puts("------ ---------------- ---------------------------------");
|
||||
|
||||
for (attr = <a href='#ippFirstAttribute'>ippFirstAttribute</a>(response); attr != NULL; attr = <a href='#ippNextAttribute'>ippNextAttribute</a>(response))
|
||||
{
|
||||
/* Attributes without names are separators between jobs */
|
||||
attrname = ippGetName(attr);
|
||||
if (attrname == NULL)
|
||||
{
|
||||
if (job_id > 0)
|
||||
{
|
||||
if (job_name == NULL)
|
||||
job_name = "(withheld)";
|
||||
|
||||
if (job_originating_user_name == NULL)
|
||||
job_originating_user_name = "(withheld)";
|
||||
|
||||
printf("%5d %-16s %s\n", job_id, job_originating_user_name, job_name);
|
||||
}
|
||||
|
||||
job_id = 0;
|
||||
job_name = NULL;
|
||||
job_originating_user_name = NULL;
|
||||
continue;
|
||||
}
|
||||
else if (!strcmp(attrname, "job-id") && ippGetValueTag(attr) == IPP_TAG_INTEGER)
|
||||
job_id = ippGetInteger(attr, 0);
|
||||
else if (!strcmp(attrname, "job-name") && ippGetValueTag(attr) == IPP_TAG_NAME)
|
||||
job_name = ippGetString(attr, 0, NULL);
|
||||
else if (!strcmp(attrname, "job-originating-user-name") &&
|
||||
ippGetValueTag(attr) == IPP_TAG_NAME)
|
||||
job_originating_user_name = ippGetString(attr, 0, NULL);
|
||||
}
|
||||
|
||||
if (job_id > 0)
|
||||
{
|
||||
if (job_name == NULL)
|
||||
job_name = "(withheld)";
|
||||
|
||||
if (job_originating_user_name == NULL)
|
||||
job_originating_user_name = "(withheld)";
|
||||
|
||||
printf("%5d %-16s %s\n", job_id, job_originating_user_name, job_name);
|
||||
}
|
||||
}
|
||||
</pre>
|
||||
|
||||
<h3><a name='CREATING_URI_STRINGS'>Creating URI Strings</a></h3>
|
||||
|
||||
<p>To ensure proper encoding, the
|
||||
<a href='#httpAssembleURIf'><code>httpAssembleURIf</code></a> function must be
|
||||
used to format a "printer-uri" string for all printer-based requests:</p>
|
||||
|
||||
<pre class='example'>
|
||||
const char *name = "Foo";
|
||||
char uri[1024];
|
||||
<a href='#ipp_t'>ipp_t</a> *request;
|
||||
|
||||
<a href='#httpAssembleURIf'>httpAssembleURIf</a>(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, cupsServer(),
|
||||
ippPort(), "/printers/%s", name);
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
|
||||
</pre>
|
||||
|
||||
<h3><a name='SENDING_REQUESTS_WITH_FILES'>Sending Requests with Files</a></h3>
|
||||
|
||||
<p>The <a href='#cupsDoFileRequest'><code>cupsDoFileRequest</code></a> and
|
||||
<a href='#cupsDoIORequest'><code>cupsDoIORequest</code></a> functions are
|
||||
used for requests involving files. The
|
||||
<a href='#cupsDoFileRequest'><code>cupsDoFileRequest</code></a> function
|
||||
attaches the named file to a request and is typically used when sending a print
|
||||
file or changing a printer's PPD file:</p>
|
||||
|
||||
<pre class='example'>
|
||||
const char *filename = "/usr/share/cups/data/testprint.ps";
|
||||
const char *name = "Foo";
|
||||
char uri[1024];
|
||||
char resource[1024];
|
||||
<a href='#ipp_t'>ipp_t</a> *request = <a href='#ippNewRequest'>ippNewRequest</a>(IPP_PRINT_JOB);
|
||||
<a href='#ipp_t'>ipp_t</a> *response;
|
||||
|
||||
/* Use httpAssembleURIf for the printer-uri string */
|
||||
<a href='#httpAssembleURIf'>httpAssembleURIf</a>(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, cupsServer(),
|
||||
ippPort(), "/printers/%s", name);
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
|
||||
NULL, cupsUser());
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
|
||||
NULL, "testprint.ps");
|
||||
|
||||
/* Use snprintf for the resource path */
|
||||
snprintf(resource, sizeof(resource), "/printers/%s", name);
|
||||
|
||||
response = <a href='#cupsDoFileRequest'>cupsDoFileRequest</a>(CUPS_HTTP_DEFAULT, request, resource, filename);
|
||||
</pre>
|
||||
|
||||
<p>The <a href='#cupsDoIORequest'><code>cupsDoIORequest</code></a> function
|
||||
optionally attaches a file to the request and optionally saves a file in the
|
||||
response from the server. It is used when using a pipe for the request
|
||||
attachment or when using a request that returns a file, currently only
|
||||
<code>CUPS_GET_DOCUMENT</code> and <code>CUPS_GET_PPD</code>. For example,
|
||||
the following code will download the PPD file for the sample HP LaserJet
|
||||
printer driver:</p>
|
||||
|
||||
<pre class='example'>
|
||||
char tempfile[1024];
|
||||
int tempfd;
|
||||
<a href='#ipp_t'>ipp_t</a> *request = <a href='#ippNewRequest'>ippNewRequest</a>(CUPS_GET_PPD);
|
||||
<a href='#ipp_t'>ipp_t</a> *response;
|
||||
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
|
||||
NULL, "laserjet.ppd");
|
||||
|
||||
tempfd = cupsTempFd(tempfile, sizeof(tempfile));
|
||||
|
||||
response = <a href='#cupsDoIORequest'>cupsDoIORequest</a>(CUPS_HTTP_DEFAULT, request, "/", -1, tempfd);
|
||||
</pre>
|
||||
|
||||
<p>The example passes <code>-1</code> for the input file descriptor to specify
|
||||
that no file is to be attached to the request. The PPD file attached to the
|
||||
response is written to the temporary file descriptor we created using the
|
||||
<code>cupsTempFd</code> function.</p>
|
||||
|
||||
<h3><a name='ASYNCHRONOUS_REQUEST_PROCESSING'>Asynchronous Request Processing</a></h3>
|
||||
|
||||
<p>The <a href='#cupsSendRequest'><code>cupsSendRequest</code></a> and
|
||||
<a href='#cupsGetResponse'><code>cupsGetResponse</code></a> support
|
||||
asynchronous communications with the server. Unlike the other request
|
||||
functions, the IPP request is not automatically freed, so remember to
|
||||
free your request with the <a href='#ippDelete'><code>ippDelete</code></a>
|
||||
function.</p>
|
||||
|
||||
<p>File data is attached to the request using the
|
||||
<a href='#cupsWriteRequestData'><code>cupsWriteRequestData</code></a>
|
||||
function, while file data returned from the server is read using the
|
||||
<a href='#cupsReadResponseData'><code>cupsReadResponseData</code></a>
|
||||
function. We can rewrite the previous <code>CUPS_GET_PPD</code> example
|
||||
to use the asynchronous functions quite easily:</p>
|
||||
|
||||
<pre class='example'>
|
||||
char tempfile[1024];
|
||||
int tempfd;
|
||||
<a href='#ipp_t'>ipp_t</a> *request = <a href='#ippNewRequest'>ippNewRequest</a>(CUPS_GET_PPD);
|
||||
<a href='#ipp_t'>ipp_t</a> *response;
|
||||
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
|
||||
NULL, "laserjet.ppd");
|
||||
|
||||
tempfd = cupsTempFd(tempfile, sizeof(tempfile));
|
||||
|
||||
if (<a href='#cupsSendRequest'>cupsSendRequest</a>(CUPS_HTTP_DEFAULT, request, "/") == HTTP_CONTINUE)
|
||||
{
|
||||
response = <a href='#cupsGetResponse'>cupsGetResponse</a>(CUPS_HTTP_DEFAULT, "/");
|
||||
|
||||
if (response != NULL)
|
||||
{
|
||||
ssize_t bytes;
|
||||
char buffer[8192];
|
||||
|
||||
while ((bytes = <a href='#cupsReadResponseData'>cupsReadResponseData</a>(CUPS_HTTP_DEFAULT, buffer, sizeof(buffer))) > 0)
|
||||
write(tempfd, buffer, bytes);
|
||||
}
|
||||
}
|
||||
|
||||
/* Free the request! */
|
||||
<a href='#ippDelete'>ippDelete</a>(request);
|
||||
</pre>
|
||||
|
||||
<p>The <a href='#cupsSendRequest'><code>cupsSendRequest</code></a> function
|
||||
returns the initial HTTP request status, typically either
|
||||
<code>HTTP_CONTINUE</code> or <code>HTTP_UNAUTHORIZED</code>. The latter status
|
||||
is returned when the request requires authentication of some sort. The
|
||||
<a href='#cupsDoAuthentication'><code>cupsDoAuthentication</code></a> function
|
||||
must be called when your see <code>HTTP_UNAUTHORIZED</code> and the request
|
||||
re-sent. We can add authentication support to our example code by using a
|
||||
<code>do ... while</code> loop:</p>
|
||||
|
||||
<pre class='example'>
|
||||
char tempfile[1024];
|
||||
int tempfd;
|
||||
<a href='#ipp_t'>ipp_t</a> *request = <a href='#ippNewRequest'>ippNewRequest</a>(CUPS_GET_PPD);
|
||||
<a href='#ipp_t'>ipp_t</a> *response;
|
||||
http_status_t status;
|
||||
|
||||
<a href='#ippAddString'>ippAddString</a>(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
|
||||
NULL, "laserjet.ppd");
|
||||
|
||||
tempfd = cupsTempFd(tempfile, sizeof(tempfile));
|
||||
|
||||
/* Loop for authentication */
|
||||
do
|
||||
{
|
||||
status = <a href='#cupsSendRequest'>cupsSendRequest</a>(CUPS_HTTP_DEFAULT, request, "/");
|
||||
|
||||
if (status == HTTP_UNAUTHORIZED)
|
||||
{
|
||||
/* Try to authenticate, break out of the loop if that fails */
|
||||
if (<a href='#cupsDoAuthentication'>cupsDoAuthentication</a>(CUPS_HTTP_DEFAULT, "POST", "/"))
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (status != HTTP_CONTINUE && status != HTTP_UNAUTHORIZED);
|
||||
|
||||
if (status == HTTP_CONTINUE)
|
||||
{
|
||||
response = <a href='#cupsGetResponse'>cupsGetResponse</a>(CUPS_HTTP_DEFAULT, "/");
|
||||
|
||||
if (response != NULL)
|
||||
{
|
||||
ssize_t bytes;
|
||||
char buffer[8192];
|
||||
|
||||
while ((bytes = <a href='#cupsReadResponseData'>cupsReadResponseData</a>(CUPS_HTTP_DEFAULT, buffer, sizeof(buffer))) > 0)
|
||||
write(tempfd, buffer, bytes);
|
||||
}
|
||||
}
|
||||
|
||||
/* Free the request! */
|
||||
<a href='#ippDelete'>ippDelete</a>(request);
|
||||
</pre>
|
||||
+492
-139
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Authentication functions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products.
|
||||
* Copyright © 2007-2018 by Apple Inc.
|
||||
* Copyright © 1997-2007 by Easy Software Products.
|
||||
*
|
||||
* This file contains Kerberos support code, copyright 2006 by
|
||||
* Jelmer Vernooij.
|
||||
@@ -47,6 +47,10 @@ extern const char *cssmErrorString(int error);
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static const char *cups_auth_find(const char *www_authenticate, const char *scheme);
|
||||
static const char *cups_auth_param(const char *scheme, const char *name, char *value, size_t valsize);
|
||||
static const char *cups_auth_scheme(const char *www_authenticate, char *scheme, size_t schemesize);
|
||||
|
||||
#ifdef HAVE_GSSAPI
|
||||
# ifdef HAVE_GSS_ACQUIRE_CRED_EX_F
|
||||
# ifdef HAVE_GSS_GSSAPI_SPI_H
|
||||
@@ -54,7 +58,7 @@ extern const char *cssmErrorString(int error);
|
||||
# else
|
||||
# define GSS_AUTH_IDENTITY_TYPE_1 1
|
||||
# define gss_acquire_cred_ex_f __ApplePrivate_gss_acquire_cred_ex_f
|
||||
typedef struct gss_auth_identity
|
||||
typedef struct gss_auth_identity /* @private@ */
|
||||
{
|
||||
uint32_t type;
|
||||
uint32_t flags;
|
||||
@@ -112,8 +116,10 @@ cupsDoAuthentication(
|
||||
const char *resource) /* I - Resource path */
|
||||
{
|
||||
const char *password, /* Password string */
|
||||
*www_auth; /* WWW-Authenticate header */
|
||||
char prompt[1024], /* Prompt for user */
|
||||
*www_auth, /* WWW-Authenticate header */
|
||||
*schemedata; /* Scheme-specific data */
|
||||
char scheme[256], /* Scheme name */
|
||||
prompt[1024], /* Prompt for user */
|
||||
realm[HTTP_MAX_VALUE], /* realm="xyz" string */
|
||||
nonce[HTTP_MAX_VALUE]; /* nonce="xyz" string */
|
||||
int localauth; /* Local authentication result */
|
||||
@@ -163,122 +169,237 @@ cupsDoAuthentication(
|
||||
}
|
||||
|
||||
/*
|
||||
* Nope, see if we should retry the current username:password...
|
||||
* Nope, loop through the authentication schemes to find the first we support.
|
||||
*/
|
||||
|
||||
www_auth = http->fields[HTTP_FIELD_WWW_AUTHENTICATE];
|
||||
www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE);
|
||||
|
||||
if ((http->digest_tries > 1 || !http->userpass[0]) &&
|
||||
(!_cups_strncasecmp(www_auth, "Basic", 5) ||
|
||||
!_cups_strncasecmp(www_auth, "Digest", 6)))
|
||||
for (schemedata = cups_auth_scheme(www_auth, scheme, sizeof(scheme)); schemedata; schemedata = cups_auth_scheme(schemedata + strlen(scheme), scheme, sizeof(scheme)))
|
||||
{
|
||||
/*
|
||||
* Nope - get a new password from the user...
|
||||
* Check the scheme name...
|
||||
*/
|
||||
|
||||
char default_username[HTTP_MAX_VALUE];
|
||||
/* Default username */
|
||||
|
||||
cg = _cupsGlobals();
|
||||
|
||||
if (!cg->lang_default)
|
||||
cg->lang_default = cupsLangDefault();
|
||||
|
||||
if (httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "username",
|
||||
default_username))
|
||||
cupsSetUser(default_username);
|
||||
|
||||
snprintf(prompt, sizeof(prompt),
|
||||
_cupsLangString(cg->lang_default, _("Password for %s on %s? ")),
|
||||
cupsUser(),
|
||||
http->hostname[0] == '/' ? "localhost" : http->hostname);
|
||||
|
||||
http->digest_tries = _cups_strncasecmp(www_auth, "Digest", 6) != 0;
|
||||
http->userpass[0] = '\0';
|
||||
|
||||
if ((password = cupsGetPassword2(prompt, http, method, resource)) == NULL)
|
||||
{
|
||||
http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
snprintf(http->userpass, sizeof(http->userpass), "%s:%s", cupsUser(),
|
||||
password);
|
||||
}
|
||||
else if (http->status == HTTP_STATUS_UNAUTHORIZED)
|
||||
http->digest_tries ++;
|
||||
|
||||
if (http->status == HTTP_STATUS_UNAUTHORIZED && http->digest_tries >= 3)
|
||||
{
|
||||
DEBUG_printf(("1cupsDoAuthentication: Too many authentication tries (%d)",
|
||||
http->digest_tries));
|
||||
|
||||
http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Got a password; encode it for the server...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_GSSAPI
|
||||
if (!_cups_strncasecmp(www_auth, "Negotiate", 9))
|
||||
{
|
||||
if (!_cups_strcasecmp(scheme, "Negotiate"))
|
||||
{
|
||||
/*
|
||||
* Kerberos authentication...
|
||||
*/
|
||||
|
||||
if (_cupsSetNegotiateAuthString(http, method, resource))
|
||||
{
|
||||
http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_GSSAPI */
|
||||
if (_cups_strcasecmp(scheme, "Basic") && _cups_strcasecmp(scheme, "Digest"))
|
||||
continue; /* Not supported (yet) */
|
||||
|
||||
/*
|
||||
* Kerberos authentication...
|
||||
* See if we should retry the current username:password...
|
||||
*/
|
||||
|
||||
if (_cupsSetNegotiateAuthString(http, method, resource))
|
||||
if ((http->digest_tries > 1 || !http->userpass[0]) && (!_cups_strcasecmp(scheme, "Basic") || (!_cups_strcasecmp(scheme, "Digest"))))
|
||||
{
|
||||
/*
|
||||
* Nope - get a new password from the user...
|
||||
*/
|
||||
|
||||
char default_username[HTTP_MAX_VALUE];
|
||||
/* Default username */
|
||||
|
||||
cg = _cupsGlobals();
|
||||
|
||||
if (!cg->lang_default)
|
||||
cg->lang_default = cupsLangDefault();
|
||||
|
||||
if (cups_auth_param(schemedata, "username", default_username, sizeof(default_username)))
|
||||
cupsSetUser(default_username);
|
||||
|
||||
snprintf(prompt, sizeof(prompt), _cupsLangString(cg->lang_default, _("Password for %s on %s? ")), cupsUser(), http->hostname[0] == '/' ? "localhost" : http->hostname);
|
||||
|
||||
http->digest_tries = _cups_strncasecmp(scheme, "Digest", 6) != 0;
|
||||
http->userpass[0] = '\0';
|
||||
|
||||
if ((password = cupsGetPassword2(prompt, http, method, resource)) == NULL)
|
||||
{
|
||||
http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
snprintf(http->userpass, sizeof(http->userpass), "%s:%s", cupsUser(), password);
|
||||
}
|
||||
else if (http->status == HTTP_STATUS_UNAUTHORIZED)
|
||||
http->digest_tries ++;
|
||||
|
||||
if (http->status == HTTP_STATUS_UNAUTHORIZED && http->digest_tries >= 3)
|
||||
{
|
||||
DEBUG_printf(("1cupsDoAuthentication: Too many authentication tries (%d)", http->digest_tries));
|
||||
|
||||
http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_GSSAPI */
|
||||
if (!_cups_strncasecmp(www_auth, "Basic", 5))
|
||||
{
|
||||
|
||||
/*
|
||||
* Basic authentication...
|
||||
* Got a password; encode it for the server...
|
||||
*/
|
||||
|
||||
char encode[256]; /* Base64 buffer */
|
||||
if (!_cups_strcasecmp(scheme, "Basic"))
|
||||
{
|
||||
/*
|
||||
* Basic authentication...
|
||||
*/
|
||||
|
||||
char encode[256]; /* Base64 buffer */
|
||||
|
||||
httpEncode64_2(encode, sizeof(encode), http->userpass,
|
||||
(int)strlen(http->userpass));
|
||||
httpSetAuthString(http, "Basic", encode);
|
||||
httpEncode64_2(encode, sizeof(encode), http->userpass, (int)strlen(http->userpass));
|
||||
httpSetAuthString(http, "Basic", encode);
|
||||
}
|
||||
else if (!_cups_strcasecmp(scheme, "Digest"))
|
||||
{
|
||||
/*
|
||||
* Digest authentication...
|
||||
*/
|
||||
|
||||
int i; /* Looping var */
|
||||
char algorithm[65], /* Hashing algorithm */
|
||||
opaque[HTTP_MAX_VALUE],
|
||||
/* Opaque data from server */
|
||||
cnonce[65], /* cnonce value */
|
||||
kd[65], /* Final MD5/SHA-256 digest */
|
||||
ha1[65], /* Hash of username:realm:password */
|
||||
ha2[65], /* Hash of method:request-uri */
|
||||
hdata[65], /* Hash of auth data */
|
||||
temp[1024], /* Temporary string */
|
||||
digest[1024]; /* Digest auth data */
|
||||
unsigned char hash[32]; /* Hash buffer */
|
||||
const char *hashalg; /* Hashing algorithm */
|
||||
size_t hashsize; /* Size of hash */
|
||||
|
||||
if (strcmp(nonce, http->nonce))
|
||||
{
|
||||
strlcpy(http->nonce, nonce, sizeof(http->nonce));
|
||||
http->nonce_count = 1;
|
||||
}
|
||||
else
|
||||
http->nonce_count ++;
|
||||
|
||||
cups_auth_param(schemedata, "opaque", opaque, sizeof(opaque));
|
||||
cups_auth_param(schemedata, "nonce", nonce, sizeof(nonce));
|
||||
cups_auth_param(schemedata, "realm", realm, sizeof(realm));
|
||||
|
||||
for (i = 0; i < 64; i ++)
|
||||
cnonce[i] = "0123456789ABCDEF"[CUPS_RAND() & 15];
|
||||
cnonce[64] = '\0';
|
||||
|
||||
if (cups_auth_param(schemedata, "algorithm", algorithm, sizeof(algorithm)))
|
||||
{
|
||||
/*
|
||||
* Follow RFC 2617/7616...
|
||||
*/
|
||||
|
||||
if (!_cups_strcasecmp(algorithm, "MD5"))
|
||||
{
|
||||
/*
|
||||
* RFC 2617 Digest with MD5
|
||||
*/
|
||||
|
||||
hashalg = "md5";
|
||||
}
|
||||
else if (!_cups_strcasecmp(algorithm, "SHA-256"))
|
||||
{
|
||||
/*
|
||||
* RFC 7616 Digest with SHA-256
|
||||
*/
|
||||
|
||||
hashalg = "sha2-256";
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Some other algorithm we don't support, skip this one...
|
||||
*/
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate digest value...
|
||||
*/
|
||||
|
||||
/* H(A1) = H(username:realm:password) */
|
||||
snprintf(temp, sizeof(temp), "%s:%s:%s", cupsUser(), realm, strchr(http->userpass, ':') + 1);
|
||||
hashsize = (size_t)cupsHashData(hashalg, (unsigned char *)temp, strlen(temp), hash, sizeof(hash));
|
||||
cupsHashString(hash, hashsize, ha1, sizeof(ha1));
|
||||
|
||||
/* H(A2) = H(method:uri) */
|
||||
snprintf(temp, sizeof(temp), "%s:%s", method, resource);
|
||||
hashsize = (size_t)cupsHashData(hashalg, (unsigned char *)temp, strlen(temp), hash, sizeof(hash));
|
||||
cupsHashString(hash, hashsize, ha2, sizeof(ha2));
|
||||
|
||||
/* H(data) = H(nonce:nc:cnonce:qop:H(A2)) */
|
||||
snprintf(temp, sizeof(temp), "%s:%08x:%s:auth:%s", nonce, http->nonce_count, cnonce, ha2);
|
||||
hashsize = (size_t)cupsHashData(hashalg, (unsigned char *)temp, strlen(temp), hash, sizeof(hash));
|
||||
cupsHashString(hash, hashsize, hdata, sizeof(hdata));
|
||||
|
||||
/* KD = H(H(A1):H(data)) */
|
||||
snprintf(temp, sizeof(temp), "%s:%s", ha1, hdata);
|
||||
hashsize = (size_t)cupsHashData(hashalg, (unsigned char *)temp, strlen(temp), hash, sizeof(hash));
|
||||
cupsHashString(hash, hashsize, kd, sizeof(kd));
|
||||
|
||||
/* Pass the RFC 2617/7616 WWW-Authenticate header */
|
||||
if (opaque[0])
|
||||
snprintf(digest, sizeof(digest), "username=\"%s\", realm=\"%s\", nonce=\"%s\", algorithm=%s, qop=auth, opaque=\"%s\", cnonce=\"%s\", nc=%08x, uri=\"%s\", response=\"%s\"", cupsUser(), realm, nonce, algorithm, opaque, cnonce, http->nonce_count, resource, kd);
|
||||
else
|
||||
snprintf(digest, sizeof(digest), "username=\"%s\", realm=\"%s\", nonce=\"%s\", algorithm=%s, qop=auth, cnonce=\"%s\", nc=%08x, uri=\"%s\", response=\"%s\"", cupsUser(), realm, nonce, algorithm, cnonce, http->nonce_count, resource, kd);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Use old RFC 2069 Digest method...
|
||||
*/
|
||||
|
||||
/* H(A1) = H(username:realm:password) */
|
||||
snprintf(temp, sizeof(temp), "%s:%s:%s", cupsUser(), realm, strchr(http->userpass, ':') + 1);
|
||||
hashsize = (size_t)cupsHashData("md5", (unsigned char *)temp, strlen(temp), hash, sizeof(hash));
|
||||
cupsHashString(hash, hashsize, ha1, sizeof(ha1));
|
||||
|
||||
/* H(A2) = H(method:uri) */
|
||||
snprintf(temp, sizeof(temp), "%s:%s", method, resource);
|
||||
hashsize = (size_t)cupsHashData("md5", (unsigned char *)temp, strlen(temp), hash, sizeof(hash));
|
||||
cupsHashString(hash, hashsize, ha2, sizeof(ha2));
|
||||
|
||||
/* KD = H(H(A1):nonce:H(A2)) */
|
||||
snprintf(temp, sizeof(temp), "%s:%s:%s", ha1, nonce, ha2);
|
||||
hashsize = (size_t)cupsHashData("md5", (unsigned char *)temp, strlen(temp), hash, sizeof(hash));
|
||||
cupsHashString(hash, hashsize, kd, sizeof(kd));
|
||||
|
||||
/* Pass the RFC 2069 WWW-Authenticate header */
|
||||
snprintf(digest, sizeof(digest), "username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"", cupsUser(), realm, nonce, resource, kd);
|
||||
}
|
||||
|
||||
httpSetAuthString(http, "Digest", digest);
|
||||
}
|
||||
}
|
||||
else if (!_cups_strncasecmp(www_auth, "Digest", 6))
|
||||
|
||||
if (http->authstring)
|
||||
{
|
||||
/*
|
||||
* Digest authentication...
|
||||
*/
|
||||
DEBUG_printf(("1cupsDoAuthentication: authstring=\"%s\"", http->authstring));
|
||||
|
||||
char encode[33], /* MD5 buffer */
|
||||
digest[1024]; /* Digest auth data */
|
||||
|
||||
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
|
||||
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce);
|
||||
|
||||
httpMD5(cupsUser(), realm, strchr(http->userpass, ':') + 1, encode);
|
||||
httpMD5Final(nonce, method, resource, encode);
|
||||
snprintf(digest, sizeof(digest),
|
||||
"username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", "
|
||||
"response=\"%s\"", cupsUser(), realm, nonce, resource, encode);
|
||||
httpSetAuthString(http, "Digest", digest);
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG_printf(("1cupsDoAuthentication: Unknown auth type: \"%s\"",
|
||||
www_auth));
|
||||
DEBUG_printf(("1cupsDoAuthentication: Unknown auth type: \"%s\"", www_auth));
|
||||
http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
DEBUG_printf(("1cupsDoAuthentication: authstring=\"%s\"", http->authstring));
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
@@ -336,7 +457,7 @@ _cupsSetNegotiateAuthString(
|
||||
GSS_C_NO_BUFFER, &http->gssmech,
|
||||
&output_token, NULL, NULL);
|
||||
|
||||
#ifdef HAVE_GSS_ACQUIRE_CRED_EX_F
|
||||
# ifdef HAVE_GSS_ACQUIRE_CRED_EX_F
|
||||
if (major_status == GSS_S_NO_CRED)
|
||||
{
|
||||
/*
|
||||
@@ -412,7 +533,7 @@ _cupsSetNegotiateAuthString(
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_GSS_ACQUIRED_CRED_EX_F */
|
||||
# endif /* HAVE_GSS_ACQUIRED_CRED_EX_F */
|
||||
|
||||
if (GSS_ERROR(major_status))
|
||||
{
|
||||
@@ -422,11 +543,11 @@ _cupsSetNegotiateAuthString(
|
||||
return (-1);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
# ifdef DEBUG
|
||||
else if (major_status == GSS_S_CONTINUE_NEEDED)
|
||||
cups_gss_printf(major_status, minor_status,
|
||||
"_cupsSetNegotiateAuthString: Continuation needed!");
|
||||
#endif /* DEBUG */
|
||||
# endif /* DEBUG */
|
||||
|
||||
if (output_token.length > 0 && output_token.length <= 65536)
|
||||
{
|
||||
@@ -464,8 +585,259 @@ _cupsSetNegotiateAuthString(
|
||||
|
||||
return (0);
|
||||
}
|
||||
#endif /* HAVE_GSSAPI */
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_auth_find()' - Find the named WWW-Authenticate scheme.
|
||||
*
|
||||
* The "www_authenticate" parameter points to the current position in the header.
|
||||
*
|
||||
* Returns @code NULL@ if the auth scheme is not present.
|
||||
*/
|
||||
|
||||
static const char * /* O - Start of matching scheme or @code NULL@ if not found */
|
||||
cups_auth_find(const char *www_authenticate, /* I - Pointer into WWW-Authenticate header */
|
||||
const char *scheme) /* I - Authentication scheme */
|
||||
{
|
||||
size_t schemelen = strlen(scheme); /* Length of scheme */
|
||||
|
||||
|
||||
DEBUG_printf(("8cups_auth_find(www_authenticate=\"%s\", scheme=\"%s\"(%d))", www_authenticate, scheme, (int)schemelen));
|
||||
|
||||
while (*www_authenticate)
|
||||
{
|
||||
/*
|
||||
* Skip leading whitespace and commas...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("9cups_auth_find: Before whitespace: \"%s\"", www_authenticate));
|
||||
while (isspace(*www_authenticate & 255) || *www_authenticate == ',')
|
||||
www_authenticate ++;
|
||||
DEBUG_printf(("9cups_auth_find: After whitespace: \"%s\"", www_authenticate));
|
||||
|
||||
/*
|
||||
* See if this is "Scheme" followed by whitespace or the end of the string.
|
||||
*/
|
||||
|
||||
if (!strncmp(www_authenticate, scheme, schemelen) && (isspace(www_authenticate[schemelen] & 255) || www_authenticate[schemelen] == ',' || !www_authenticate[schemelen]))
|
||||
{
|
||||
/*
|
||||
* Yes, this is the start of the scheme-specific information...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("9cups_auth_find: Returning \"%s\".", www_authenticate));
|
||||
|
||||
return (www_authenticate);
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip the scheme name or param="value" string...
|
||||
*/
|
||||
|
||||
while (!isspace(*www_authenticate & 255) && *www_authenticate)
|
||||
{
|
||||
if (*www_authenticate == '\"')
|
||||
{
|
||||
/*
|
||||
* Skip quoted value...
|
||||
*/
|
||||
|
||||
www_authenticate ++;
|
||||
while (*www_authenticate && *www_authenticate != '\"')
|
||||
www_authenticate ++;
|
||||
|
||||
DEBUG_printf(("9cups_auth_find: After quoted: \"%s\"", www_authenticate));
|
||||
}
|
||||
|
||||
www_authenticate ++;
|
||||
}
|
||||
|
||||
DEBUG_printf(("9cups_auth_find: After skip: \"%s\"", www_authenticate));
|
||||
}
|
||||
|
||||
DEBUG_puts("9cups_auth_find: Returning NULL.");
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_auth_param()' - Copy the value for the named authentication parameter,
|
||||
* if present.
|
||||
*/
|
||||
|
||||
static const char * /* O - Parameter value or @code NULL@ if not present */
|
||||
cups_auth_param(const char *scheme, /* I - Pointer to auth data */
|
||||
const char *name, /* I - Name of parameter */
|
||||
char *value, /* I - Value buffer */
|
||||
size_t valsize) /* I - Size of value buffer */
|
||||
{
|
||||
char *valptr = value, /* Pointer into value buffer */
|
||||
*valend = value + valsize - 1; /* Pointer to end of buffer */
|
||||
size_t namelen = strlen(name); /* Name length */
|
||||
int param; /* Is this a parameter? */
|
||||
|
||||
|
||||
DEBUG_printf(("8cups_auth_param(scheme=\"%s\", name=\"%s\", value=%p, valsize=%d)", scheme, name, (void *)value, (int)valsize));
|
||||
|
||||
while (!isspace(*scheme & 255) && *scheme)
|
||||
scheme ++;
|
||||
|
||||
while (*scheme)
|
||||
{
|
||||
while (isspace(*scheme & 255) || *scheme == ',')
|
||||
scheme ++;
|
||||
|
||||
if (!strncmp(scheme, name, namelen) && scheme[namelen] == '=')
|
||||
{
|
||||
/*
|
||||
* Found the parameter, copy the value...
|
||||
*/
|
||||
|
||||
scheme += namelen + 1;
|
||||
if (*scheme == '\"')
|
||||
{
|
||||
scheme ++;
|
||||
|
||||
while (*scheme && *scheme != '\"')
|
||||
{
|
||||
if (valptr < valend)
|
||||
*valptr++ = *scheme;
|
||||
|
||||
scheme ++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (*scheme && strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~+/=", *scheme))
|
||||
{
|
||||
if (valptr < valend)
|
||||
*valptr++ = *scheme;
|
||||
|
||||
scheme ++;
|
||||
}
|
||||
}
|
||||
|
||||
*valptr = '\0';
|
||||
|
||||
DEBUG_printf(("9cups_auth_param: Returning \"%s\".", value));
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip the param=value string...
|
||||
*/
|
||||
|
||||
param = 0;
|
||||
|
||||
while (!isspace(*scheme & 255) && *scheme)
|
||||
{
|
||||
if (*scheme == '=')
|
||||
param = 1;
|
||||
else if (*scheme == '\"')
|
||||
{
|
||||
/*
|
||||
* Skip quoted value...
|
||||
*/
|
||||
|
||||
scheme ++;
|
||||
while (*scheme && *scheme != '\"')
|
||||
scheme ++;
|
||||
}
|
||||
|
||||
scheme ++;
|
||||
}
|
||||
|
||||
/*
|
||||
* If this wasn't a parameter, we are at the end of this scheme's
|
||||
* parameters...
|
||||
*/
|
||||
|
||||
if (!param)
|
||||
break;
|
||||
}
|
||||
|
||||
*value = '\0';
|
||||
|
||||
DEBUG_puts("9cups_auth_param: Returning NULL.");
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cups_auth_scheme()' - Get the (next) WWW-Authenticate scheme.
|
||||
*
|
||||
* The "www_authenticate" parameter points to the current position in the header.
|
||||
*
|
||||
* Returns @code NULL@ if there are no (more) auth schemes present.
|
||||
*/
|
||||
|
||||
static const char * /* O - Start of scheme or @code NULL@ if not found */
|
||||
cups_auth_scheme(const char *www_authenticate, /* I - Pointer into WWW-Authenticate header */
|
||||
char *scheme, /* I - Scheme name buffer */
|
||||
size_t schemesize) /* I - Size of buffer */
|
||||
{
|
||||
const char *start; /* Start of scheme data */
|
||||
char *sptr = scheme, /* Pointer into scheme buffer */
|
||||
*send = scheme + schemesize - 1;/* End of scheme buffer */
|
||||
int param; /* Is this a parameter? */
|
||||
|
||||
|
||||
DEBUG_printf(("8cups_auth_scheme(www_authenticate=\"%s\", scheme=%p, schemesize=%d)", www_authenticate, (void *)scheme, (int)schemesize));
|
||||
|
||||
while (*www_authenticate)
|
||||
{
|
||||
/*
|
||||
* Skip leading whitespace and commas...
|
||||
*/
|
||||
|
||||
while (isspace(*www_authenticate & 255) || *www_authenticate == ',')
|
||||
www_authenticate ++;
|
||||
|
||||
/*
|
||||
* Parse the scheme name or param="value" string...
|
||||
*/
|
||||
|
||||
for (sptr = scheme, start = www_authenticate, param = 0; *www_authenticate && *www_authenticate != ',' && !isspace(*www_authenticate & 255); www_authenticate ++)
|
||||
{
|
||||
if (*www_authenticate == '=')
|
||||
param = 1;
|
||||
else if (!param && sptr < send)
|
||||
*sptr++ = *www_authenticate;
|
||||
else if (*www_authenticate == '\"')
|
||||
{
|
||||
/*
|
||||
* Skip quoted value...
|
||||
*/
|
||||
|
||||
www_authenticate ++;
|
||||
while (*www_authenticate && *www_authenticate != '\"')
|
||||
www_authenticate ++;
|
||||
}
|
||||
}
|
||||
|
||||
if (sptr > scheme && !param)
|
||||
{
|
||||
*sptr = '\0';
|
||||
|
||||
DEBUG_printf(("9cups_auth_scheme: Returning \"%s\".", start));
|
||||
|
||||
return (start);
|
||||
}
|
||||
}
|
||||
|
||||
*scheme = '\0';
|
||||
|
||||
DEBUG_puts("9cups_auth_scheme: Returning NULL.");
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_GSSAPI
|
||||
# ifdef HAVE_GSS_ACQUIRE_CRED_EX_F
|
||||
/*
|
||||
* 'cups_gss_acquire()' - Kerberos credentials callback.
|
||||
@@ -650,6 +1022,8 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
FILE *fp; /* Certificate file */
|
||||
char trc[16], /* Try Root Certificate parameter */
|
||||
filename[1024]; /* Certificate filename */
|
||||
const char *www_auth, /* WWW-Authenticate header */
|
||||
*schemedata; /* Data for the named auth scheme */
|
||||
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
|
||||
# if defined(HAVE_AUTHORIZATION_H)
|
||||
OSStatus status; /* Status */
|
||||
@@ -668,13 +1042,14 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
* See if we are accessing localhost...
|
||||
*/
|
||||
|
||||
if (!httpAddrLocalhost(http->hostaddr) &&
|
||||
_cups_strcasecmp(http->hostname, "localhost") != 0)
|
||||
if (!httpAddrLocalhost(http->hostaddr) && _cups_strcasecmp(http->hostname, "localhost") != 0)
|
||||
{
|
||||
DEBUG_puts("8cups_local_auth: Not a local connection!");
|
||||
return (1);
|
||||
}
|
||||
|
||||
www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE);
|
||||
|
||||
# if defined(HAVE_AUTHORIZATION_H)
|
||||
/*
|
||||
* Delete any previous authorization reference...
|
||||
@@ -686,12 +1061,9 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
http->auth_ref = NULL;
|
||||
}
|
||||
|
||||
if (!getenv("GATEWAY_INTERFACE") &&
|
||||
httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "authkey",
|
||||
auth_key, sizeof(auth_key)))
|
||||
if (!getenv("GATEWAY_INTERFACE") && (schemedata = cups_auth_find(www_auth, "AuthRef")) != NULL && cups_auth_param(schemedata, "key", auth_key, sizeof(auth_key)))
|
||||
{
|
||||
status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment,
|
||||
kAuthorizationFlagDefaults, &http->auth_ref);
|
||||
status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &http->auth_ref);
|
||||
if (status != errAuthorizationSuccess)
|
||||
{
|
||||
DEBUG_printf(("8cups_local_auth: AuthorizationCreate() returned %d (%s)",
|
||||
@@ -745,6 +1117,15 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
}
|
||||
# endif /* HAVE_AUTHORIZATION_H */
|
||||
|
||||
# ifdef HAVE_GSSAPI
|
||||
if (cups_auth_find(www_auth, "Negotiate"))
|
||||
return (1);
|
||||
# endif /* HAVE_GSSAPI */
|
||||
# ifdef HAVE_AUTHORIZATION_H
|
||||
if (cups_auth_find(www_auth, "AuthRef"))
|
||||
return (1);
|
||||
# endif /* HAVE_AUTHORIZATION_H */
|
||||
|
||||
# if defined(SO_PEERCRED) && defined(AF_LOCAL)
|
||||
/*
|
||||
* See if we can authenticate using the peer credentials provided over a
|
||||
@@ -752,16 +1133,9 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
* information...
|
||||
*/
|
||||
|
||||
if (
|
||||
# ifdef HAVE_GSSAPI
|
||||
_cups_strncasecmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9) &&
|
||||
# endif /* HAVE_GSSAPI */
|
||||
# ifdef HAVE_AUTHORIZATION_H
|
||||
!httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "authkey",
|
||||
auth_key, sizeof(auth_key)) &&
|
||||
# endif /* HAVE_AUTHORIZATION_H */
|
||||
http->hostaddr->addr.sa_family == AF_LOCAL &&
|
||||
!getenv("GATEWAY_INTERFACE")) /* Not via CGI programs... */
|
||||
if (http->hostaddr->addr.sa_family == AF_LOCAL &&
|
||||
!getenv("GATEWAY_INTERFACE") && /* Not via CGI programs... */
|
||||
cups_auth_find(www_auth, "PeerCred"))
|
||||
{
|
||||
/*
|
||||
* Verify that the current cupsUser() matches the current UID...
|
||||
@@ -784,6 +1158,9 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
}
|
||||
# endif /* SO_PEERCRED && AF_LOCAL */
|
||||
|
||||
if ((schemedata = cups_auth_find(www_auth, "Local")) == NULL)
|
||||
return (1);
|
||||
|
||||
/*
|
||||
* Try opening a certificate file for this PID. If that fails,
|
||||
* try the root certificate...
|
||||
@@ -797,33 +1174,9 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
* No certificate for this PID; see if we can get the root certificate...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("9cups_local_auth: Unable to open file %s: %s",
|
||||
filename, strerror(errno)));
|
||||
DEBUG_printf(("9cups_local_auth: Unable to open file %s: %s", filename, strerror(errno)));
|
||||
|
||||
# ifdef HAVE_GSSAPI
|
||||
if (!_cups_strncasecmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
|
||||
{
|
||||
/*
|
||||
* Kerberos required, don't try the root certificate...
|
||||
*/
|
||||
|
||||
return (1);
|
||||
}
|
||||
# endif /* HAVE_GSSAPI */
|
||||
|
||||
# ifdef HAVE_AUTHORIZATION_H
|
||||
if (httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "authkey",
|
||||
auth_key, sizeof(auth_key)))
|
||||
{
|
||||
/*
|
||||
* Don't use the root certificate as a replacement for an authkey...
|
||||
*/
|
||||
|
||||
return (1);
|
||||
}
|
||||
# endif /* HAVE_AUTHORIZATION_H */
|
||||
if (!httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "trc", trc,
|
||||
sizeof(trc)))
|
||||
if (!cups_auth_param(schemedata, "trc", trc, sizeof(trc)))
|
||||
{
|
||||
/*
|
||||
* Scheduler doesn't want us to use the root certificate...
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Private definitions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -105,7 +105,7 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
|
||||
int need_res_init; /* Need to reinitialize resolver? */
|
||||
|
||||
/* ipp.c */
|
||||
ipp_uchar_t ipp_date[11]; /* RFC-1903 date/time data */
|
||||
ipp_uchar_t ipp_date[11]; /* RFC-2579 date/time data */
|
||||
_cups_buffer_t *cups_buffers; /* Buffer list */
|
||||
|
||||
/* ipp-support.c */
|
||||
|
||||
+31
-22
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* API definitions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 2007-2018 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -47,10 +47,10 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define CUPS_VERSION 2.0202
|
||||
# define CUPS_VERSION 2.0208
|
||||
# define CUPS_VERSION_MAJOR 2
|
||||
# define CUPS_VERSION_MINOR 2
|
||||
# define CUPS_VERSION_PATCH 2
|
||||
# define CUPS_VERSION_PATCH 8
|
||||
|
||||
# define CUPS_BC_FD 3
|
||||
/* Back-channel file descriptor for
|
||||
@@ -78,7 +78,7 @@ extern "C" {
|
||||
# define CUPS_DEST_FLAGS_NONE 0x00
|
||||
/* No flags are set */
|
||||
# define CUPS_DEST_FLAGS_UNCONNECTED 0x01
|
||||
/* There is not connection */
|
||||
/* There is no connection */
|
||||
# define CUPS_DEST_FLAGS_MORE 0x02
|
||||
/* There are more destinations */
|
||||
# define CUPS_DEST_FLAGS_REMOVED 0x04
|
||||
@@ -92,6 +92,8 @@ extern "C" {
|
||||
/* A connection is being established */
|
||||
# define CUPS_DEST_FLAGS_CANCELED 0x40
|
||||
/* Operation was canceled */
|
||||
# define CUPS_DEST_FLAGS_DEVICE 0x80
|
||||
/* For @link cupsConnectDest@: Connect to device */
|
||||
|
||||
/* Flags for cupsGetDestMediaByName/Size */
|
||||
# define CUPS_MEDIA_FLAGS_DEFAULT 0x00
|
||||
@@ -207,38 +209,37 @@ enum cups_ptype_e /* Printer type/capability bit
|
||||
CUPS_PRINTER_REMOTE = 0x0002, /* Remote printer or class */
|
||||
CUPS_PRINTER_BW = 0x0004, /* Can do B&W printing */
|
||||
CUPS_PRINTER_COLOR = 0x0008, /* Can do color printing */
|
||||
CUPS_PRINTER_DUPLEX = 0x0010, /* Can do duplexing */
|
||||
CUPS_PRINTER_DUPLEX = 0x0010, /* Can do two-sided printing */
|
||||
CUPS_PRINTER_STAPLE = 0x0020, /* Can staple output */
|
||||
CUPS_PRINTER_COPIES = 0x0040, /* Can do copies */
|
||||
CUPS_PRINTER_COLLATE = 0x0080, /* Can collage copies */
|
||||
CUPS_PRINTER_COPIES = 0x0040, /* Can do copies in hardware */
|
||||
CUPS_PRINTER_COLLATE = 0x0080, /* Can quickly collate copies */
|
||||
CUPS_PRINTER_PUNCH = 0x0100, /* Can punch output */
|
||||
CUPS_PRINTER_COVER = 0x0200, /* Can cover output */
|
||||
CUPS_PRINTER_BIND = 0x0400, /* Can bind output */
|
||||
CUPS_PRINTER_SORT = 0x0800, /* Can sort output */
|
||||
CUPS_PRINTER_SMALL = 0x1000, /* Can do Letter/Legal/A4 */
|
||||
CUPS_PRINTER_MEDIUM = 0x2000, /* Can do Tabloid/B/C/A3/A2 */
|
||||
CUPS_PRINTER_LARGE = 0x4000, /* Can do D/E/A1/A0 */
|
||||
CUPS_PRINTER_VARIABLE = 0x8000, /* Can do variable sizes */
|
||||
CUPS_PRINTER_SMALL = 0x1000, /* Can print on Letter/Legal/A4-size media */
|
||||
CUPS_PRINTER_MEDIUM = 0x2000, /* Can print on Tabloid/B/C/A3/A2-size media */
|
||||
CUPS_PRINTER_LARGE = 0x4000, /* Can print on D/E/A1/A0-size media */
|
||||
CUPS_PRINTER_VARIABLE = 0x8000, /* Can print on rolls and custom-size media */
|
||||
CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class @private@
|
||||
* @since Deprecated@ */
|
||||
CUPS_PRINTER_DEFAULT = 0x20000, /* Default printer on network */
|
||||
CUPS_PRINTER_FAX = 0x40000, /* Fax queue */
|
||||
CUPS_PRINTER_REJECTING = 0x80000, /* Printer is rejecting jobs */
|
||||
CUPS_PRINTER_DELETE = 0x100000, /* Delete printer
|
||||
* @since CUPS 1.2/macOS 10.5@ */
|
||||
* @deprecated@ @exclude all@ */
|
||||
CUPS_PRINTER_NOT_SHARED = 0x200000, /* Printer is not shared
|
||||
* @since CUPS 1.2/macOS 10.5@ */
|
||||
CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication
|
||||
* @since CUPS 1.2/macOS 10.5@ */
|
||||
CUPS_PRINTER_COMMANDS = 0x800000, /* Printer supports maintenance commands
|
||||
* @since CUPS 1.2/macOS 10.5@ */
|
||||
CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was automatically discovered
|
||||
* and added @private@ */
|
||||
CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was discovered @since CUPS 1.2/macOS 10.5@ */
|
||||
CUPS_PRINTER_SCANNER = 0x2000000, /* Scanner-only device
|
||||
* @since CUPS 1.4/macOS 10.6@ */
|
||||
* @since CUPS 1.4/macOS 10.6@ @private@ */
|
||||
CUPS_PRINTER_MFP = 0x4000000, /* Printer with scanning capabilities
|
||||
* @since CUPS 1.4/macOS 10.6@ */
|
||||
CUPS_PRINTER_3D = 0x8000000, /* Printer with 3D capabilities @private@ */
|
||||
* @since CUPS 1.4/macOS 10.6@ @private@ */
|
||||
CUPS_PRINTER_3D = 0x8000000, /* Printer with 3D capabilities @exclude all@ @private@ */
|
||||
CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT |
|
||||
* DEFAULT | FAX | REJECTING | DELETE |
|
||||
* NOT_SHARED | AUTHENTICATED |
|
||||
@@ -269,7 +270,7 @@ typedef struct cups_job_s /**** Job ****/
|
||||
int id; /* The job ID */
|
||||
char *dest; /* Printer or class name */
|
||||
char *title; /* Title/job name */
|
||||
char *user; /* User the submitted the job */
|
||||
char *user; /* User that submitted the job */
|
||||
char *format; /* Document format */
|
||||
ipp_jstate_t state; /* Job state */
|
||||
int size; /* Size in kilobytes */
|
||||
@@ -309,11 +310,12 @@ typedef int (*cups_dest_cb_t)(void *user_data, unsigned flags,
|
||||
# ifdef __BLOCKS__
|
||||
typedef int (^cups_dest_block_t)(unsigned flags, cups_dest_t *dest);
|
||||
/* Destination enumeration block
|
||||
* @since CUPS 1.6/macOS 10.8@ */
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
* @exclude all@ */
|
||||
# endif /* __BLOCKS__ */
|
||||
|
||||
typedef const char *(*cups_password_cb_t)(const char *prompt);
|
||||
/* Password callback */
|
||||
/* Password callback @exclude all@ */
|
||||
|
||||
typedef const char *(*cups_password_cb2_t)(const char *prompt, http_t *http,
|
||||
const char *method,
|
||||
@@ -340,11 +342,11 @@ extern ipp_t *cupsDoRequest(http_t *http, ipp_t *request,
|
||||
const char *resource);
|
||||
extern http_encryption_t cupsEncryption(void);
|
||||
extern void cupsFreeJobs(int num_jobs, cups_job_t *jobs);
|
||||
extern int cupsGetClasses(char ***classes) _CUPS_DEPRECATED_MSG("Use cupsGetDests instead.");
|
||||
extern int cupsGetClasses(char ***classes) _CUPS_DEPRECATED_MSG("Use cupsEnumDests instead.");
|
||||
extern const char *cupsGetDefault(void);
|
||||
extern int cupsGetJobs(cups_job_t **jobs, const char *name,
|
||||
int myjobs, int whichjobs);
|
||||
extern int cupsGetPrinters(char ***printers) _CUPS_DEPRECATED_MSG("Use cupsGetDests instead.");
|
||||
extern int cupsGetPrinters(char ***printers) _CUPS_DEPRECATED_MSG("Use cupsEnumDests instead.");
|
||||
extern ipp_status_t cupsLastError(void);
|
||||
extern int cupsPrintFile(const char *name, const char *filename,
|
||||
const char *title, int num_options,
|
||||
@@ -600,6 +602,13 @@ extern int cupsSetServerCredentials(const char *path, const char *common_name,
|
||||
/* New in CUPS 2.2/macOS 10.12 */
|
||||
extern ssize_t cupsHashData(const char *algorithm, const void *data, size_t datalen, unsigned char *hash, size_t hashsize) _CUPS_API_2_2;
|
||||
|
||||
/* New in CUPS 2.2.4 */
|
||||
extern int cupsAddIntegerOption(const char *name, int value, int num_options, cups_option_t **options) _CUPS_API_2_2_4;
|
||||
extern int cupsGetIntegerOption(const char *name, int num_options, cups_option_t *options) _CUPS_API_2_2_4;
|
||||
|
||||
/* New in CUPS 2.2.7 */
|
||||
extern const char *cupsHashString(const unsigned char *hash, size_t hashsize, char *buffer, size_t bufsize) _CUPS_API_2_2_7;
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif /* __cplusplus */
|
||||
|
||||
Arquivo binário não exibido.
|
Depois Largura: | Altura: | Tamanho: 15 KiB |
@@ -0,0 +1,994 @@
|
||||
---
|
||||
title: CUPS Programming Manual
|
||||
author: Michael R Sweet
|
||||
copyright: Copyright © 2007-2017 by Apple Inc. All Rights Reserved.
|
||||
version: 2.2.5
|
||||
...
|
||||
|
||||
> Please [file issues on Github](https://github.com/apple/cups/issues) 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 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.
|
||||
|
||||
|
||||
## Terms Used in This Document
|
||||
|
||||
A *Destination* is a printer or print queue that accepts print jobs. A
|
||||
*Print Job* is 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)
|
||||
{
|
||||
if (dest->instance)
|
||||
printf("%s/%s\n", dest->name, dest->instance);
|
||||
else
|
||||
puts(dest->name);
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, 0, 0, print_dest, NULL);
|
||||
|
||||
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 `sample.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
|
||||
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 `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 returns 0 to stop enumeration or 1 to continue.
|
||||
|
||||
> Note that 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
|
||||
{
|
||||
int num_dests;
|
||||
cups_dest_t *dests;
|
||||
} my_user_data_t;
|
||||
|
||||
int
|
||||
my_dest_cb(my_user_data_t *user_data, unsigned flags,
|
||||
cups_dest_t *dest)
|
||||
{
|
||||
if (flags & CUPS_DEST_FLAGS_REMOVED)
|
||||
{
|
||||
/*
|
||||
* Remove destination from array...
|
||||
*/
|
||||
|
||||
user_data->num_dests =
|
||||
cupsRemoveDest(dest->name, dest->instance,
|
||||
user_data->num_dests,
|
||||
&(user_data->dests));
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Add destination to array...
|
||||
*/
|
||||
|
||||
user_data->num_dests =
|
||||
cupsCopyDest(dest, user_data->num_dests,
|
||||
&(user_data->dests));
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
int
|
||||
my_get_dests(cups_ptype_t type, cups_ptype_t mask,
|
||||
cups_dest_t **dests)
|
||||
{
|
||||
my_user_data_t user_data = { 0, NULL };
|
||||
|
||||
if (!cupsEnumDests(CUPS_DEST_FLAGS_NONE, 1000, NULL, type,
|
||||
mask, (cups_dest_cb_t)my_dest_cb,
|
||||
&user_data))
|
||||
{
|
||||
/*
|
||||
* An error occurred, free all of the destinations and
|
||||
* return...
|
||||
*/
|
||||
|
||||
cupsFreeDests(user_data.num_dests, user_dasta.dests);
|
||||
|
||||
*dests = NULL;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the destination array...
|
||||
*/
|
||||
|
||||
*dests = user_data.dests;
|
||||
|
||||
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.
|
||||
|
||||
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 *
|
||||
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
|
||||
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`.
|
||||
|
||||
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,
|
||||
dest);
|
||||
|
||||
if (cupsCheckDestSupported(CUPS_HTTP_DEFAULT, dest, info,
|
||||
CUPS_FINISHINGS, NULL))
|
||||
{
|
||||
ipp_attribute_t *finishings =
|
||||
cupsFindDestSupported(CUPS_HTTP_DEFAULT, dest, info,
|
||||
CUPS_FINISHINGS);
|
||||
int i, count = ippGetCount(finishings);
|
||||
|
||||
puts("finishings supported:");
|
||||
for (i = 0; i < count; i ++)
|
||||
printf(" %d\n", ippGetInteger(finishings, i));
|
||||
}
|
||||
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 =
|
||||
cupsFindDestSupported(CUPS_HTTP_DEFAULT, dest, info,
|
||||
"job-creation-attributes");
|
||||
int i, count = ippGetCount(attrs);
|
||||
|
||||
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 *
|
||||
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 =
|
||||
cupsGetOption(CUPS_FINISHINGS, dest->num_options,
|
||||
dest->options);
|
||||
ipp_attribute_t *def_attr =
|
||||
cupsFindDestDefault(CUPS_HTTP_DEFAULT, dest, info,
|
||||
CUPS_FINISHINGS);
|
||||
|
||||
if (def_value != NULL)
|
||||
{
|
||||
printf("Default finishings: %s\n", def_value);
|
||||
}
|
||||
else
|
||||
{
|
||||
int i, count = ippGetCount(def_attr);
|
||||
|
||||
printf("Default finishings: %d",
|
||||
ippGetInteger(def_attr, 0));
|
||||
for (i = 1; i < count; i ++)
|
||||
printf(",%d", ippGetInteger(def_attr, i));
|
||||
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 *
|
||||
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 =
|
||||
cupsFindDestReady(CUPS_HTTP_DEFAULT, dest, info,
|
||||
CUPS_FINISHINGS);
|
||||
|
||||
if (ready_finishings != NULL)
|
||||
{
|
||||
int i, count = ippGetCount(ready_finishings);
|
||||
|
||||
puts("finishings ready:");
|
||||
for (i = 0; i < count; i ++)
|
||||
printf(" %d\n", ippGetInteger(ready_finishings, i));
|
||||
}
|
||||
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
|
||||
{
|
||||
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
|
||||
cupsGetDestMediaByName(http_t *http, cups_dest_t *dest,
|
||||
cups_dinfo_t *dinfo,
|
||||
const char *media,
|
||||
unsigned flags, cups_size_t *size);
|
||||
|
||||
int
|
||||
cupsGetDestMediaBySize(http_t *http, cups_dest_t *dest,
|
||||
cups_dinfo_t *dinfo,
|
||||
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.
|
||||
|
||||
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,
|
||||
CUPS_MEDIA_FLAGS_DUPLEX, &size))
|
||||
{
|
||||
puts("Margins for duplex US Letter:");
|
||||
printf(" Bottom: %.2fin\n", size.bottom / 2540.0);
|
||||
printf(" Left: %.2fin\n", size.left / 2540.0);
|
||||
printf(" Right: %.2fin\n", size.right / 2540.0);
|
||||
printf(" Top: %.2fin\n", size.top / 2540.0);
|
||||
}
|
||||
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
|
||||
cupsGetDestMediaByIndex(http_t *http, cups_dest_t *dest,
|
||||
cups_dinfo_t *dinfo, int n,
|
||||
unsigned flags, cups_size_t *size);
|
||||
|
||||
int
|
||||
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;
|
||||
int i;
|
||||
int count = cupsGetDestMediaCount(CUPS_HTTP_DEFAULT,
|
||||
dest, info,
|
||||
CUPS_MEDIA_FLAGS_READY);
|
||||
|
||||
for (i = 0; i < count; i ++)
|
||||
{
|
||||
if (cupsGetDestMediaByIndex(CUPS_HTTP_DEFAULT, dest, info,
|
||||
i, CUPS_MEDIA_FLAGS_READY,
|
||||
&size))
|
||||
{
|
||||
printf("%s:\n", size.name);
|
||||
printf(" Width: %.2fin\n", size.width / 2540.0);
|
||||
printf(" Length: %.2fin\n", size.length / 2540.0);
|
||||
printf(" Bottom: %.2fin\n", size.bottom / 2540.0);
|
||||
printf(" Left: %.2fin\n", size.left / 2540.0);
|
||||
printf(" Right: %.2fin\n", size.right / 2540.0);
|
||||
printf(" Top: %.2fin\n", size.top / 2540.0);
|
||||
}
|
||||
}
|
||||
|
||||
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 *
|
||||
cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest,
|
||||
cups_dinfo_t *info, unsigned flags,
|
||||
cups_size_t *size);
|
||||
|
||||
const char *
|
||||
cupsLocalizeDestOption(http_t *http, cups_dest_t *dest,
|
||||
cups_dinfo_t *info,
|
||||
const char *option);
|
||||
|
||||
const char *
|
||||
cupsLocalizeDestValue(http_t *http, cups_dest_t *dest,
|
||||
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
|
||||
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;
|
||||
int num_options = 0;
|
||||
cups_option_t *options = NULL;
|
||||
|
||||
num_options = cupsAddOption(CUPS_COPIES, "42",
|
||||
num_options, &options);
|
||||
num_options = cupsAddOption(CUPS_MEDIA, CUPS_MEDIA_LETTER,
|
||||
num_options, &options);
|
||||
num_options = cupsAddOption(CUPS_SIDES,
|
||||
CUPS_SIDES_TWO_SIDED_PORTRAIT,
|
||||
num_options, &options);
|
||||
|
||||
if (cupsCreateDestJob(CUPS_HTTP_DEFAULT, dest, info,
|
||||
&job_id, "My Document", num_options,
|
||||
options) == IPP_STATUS_OK)
|
||||
printf("Created job: %d\n", job_id);
|
||||
else
|
||||
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
|
||||
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);
|
||||
|
||||
http_status_t
|
||||
cupsWriteRequestData(http_t *http, const char *buffer,
|
||||
size_t length);
|
||||
|
||||
ipp_status_t
|
||||
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 `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];
|
||||
|
||||
if (cupsStartDestDocument(CUPS_HTTP_DEFAULT, dest, info,
|
||||
job_id, "filename.pdf", 0, NULL,
|
||||
1) == HTTP_STATUS_CONTINUE)
|
||||
{
|
||||
while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
|
||||
if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer,
|
||||
bytes) != HTTP_STATUS_CONTINUE)
|
||||
break;
|
||||
|
||||
if (cupsFinishDestDocument(CUPS_HTTP_DEFAULT, dest,
|
||||
info) == IPP_STATUS_OK)
|
||||
puts("Document send succeeded.");
|
||||
else
|
||||
printf("Document send failed: %s\n",
|
||||
cupsLastErrorString());
|
||||
}
|
||||
|
||||
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 *
|
||||
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];
|
||||
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 *
|
||||
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 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.
|
||||
|
||||
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",
|
||||
"printer-state-reasons"
|
||||
};
|
||||
|
||||
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"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.
|
||||
|
||||
|
||||
## 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,
|
||||
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)
|
||||
{
|
||||
/* request failed */
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-state",
|
||||
IPP_TAG_ENUM)) != NULL)
|
||||
{
|
||||
printf("printer-state=%s\n",
|
||||
ippEnumString("printer-state", ippGetInteger(attr, 0)));
|
||||
}
|
||||
else
|
||||
puts("printer-state=unknown");
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-state-message",
|
||||
IPP_TAG_TEXT)) != NULL)
|
||||
{
|
||||
printf("printer-state-message=\"%s\"\n",
|
||||
ippGetString(attr, 0, NULL)));
|
||||
}
|
||||
|
||||
if ((attr = ippFindAttribute(response, "printer-state-reasons",
|
||||
IPP_TAG_KEYWORD)) != NULL)
|
||||
{
|
||||
int i, count = ippGetCount(attr);
|
||||
|
||||
puts("printer-state-reasons=");
|
||||
for (i = 0; i < count; i ++)
|
||||
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);
|
||||
|
||||
|
||||
## 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 *
|
||||
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.
|
||||
Arquivo binário não exibido.
Arquivo binário não exibido.
|
Depois Largura: | Altura: | Tamanho: 166 KiB |
+31
-3
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Destination job support for CUPS.
|
||||
*
|
||||
* Copyright 2012-2016 by Apple Inc.
|
||||
* Copyright 2012-2017 by Apple Inc.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -25,13 +25,13 @@
|
||||
* The "job_id" is the number returned by cupsCreateDestJob.
|
||||
*
|
||||
* Returns @code IPP_STATUS_OK@ on success and
|
||||
* @code IPP_STATUS_ERRPR_NOT_AUTHORIZED@ or
|
||||
* @code IPP_STATUS_ERROR_NOT_AUTHORIZED@ or
|
||||
* @code IPP_STATUS_ERROR_FORBIDDEN@ on failure.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
|
||||
ipp_status_t
|
||||
ipp_status_t /* O - Status of cancel operation */
|
||||
cupsCancelDestJob(http_t *http, /* I - Connection to destination */
|
||||
cups_dest_t *dest, /* I - Destination */
|
||||
int job_id) /* I - Job ID */
|
||||
@@ -83,6 +83,13 @@ cupsCloseDestJob(
|
||||
|
||||
DEBUG_printf(("cupsCloseDestJob(http=%p, dest=%p(%s/%s), info=%p, job_id=%d)", (void *)http, (void *)dest, dest ? dest->name : NULL, dest ? dest->instance : NULL, (void *)info, job_id));
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -171,6 +178,13 @@ cupsCreateDestJob(
|
||||
DEBUG_printf(("cupsCreateDestJob(http=%p, dest=%p(%s/%s), info=%p, "
|
||||
"job_id=%p, title=\"%s\", num_options=%d, options=%p)", (void *)http, (void *)dest, dest ? dest->name : NULL, dest ? dest->instance : NULL, (void *)info, (void *)job_id, title, num_options, (void *)options));
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -251,6 +265,13 @@ cupsFinishDestDocument(
|
||||
{
|
||||
DEBUG_printf(("cupsFinishDestDocument(http=%p, dest=%p(%s/%s), info=%p)", (void *)http, (void *)dest, dest ? dest->name : NULL, dest ? dest->instance : NULL, (void *)info));
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -306,6 +327,13 @@ cupsStartDestDocument(
|
||||
|
||||
DEBUG_printf(("cupsStartDestDocument(http=%p, dest=%p(%s/%s), info=%p, job_id=%d, docname=\"%s\", format=\"%s\", num_options=%d, options=%p, last_document=%d)", (void *)http, (void *)dest, dest ? dest->name : NULL, dest ? dest->instance : NULL, (void *)info, job_id, docname, format, num_options, (void *)options, last_document));
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
@@ -60,12 +60,15 @@ cupsLocalizeDestMedia(
|
||||
*ltype; /* Localized media type */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsLocalizeDestMedia(http=%p, dest=%p, dinfo=%p, flags=%x, size=%p(\"%s\"))", (void *)http, (void *)dest, (void *)dinfo, flags, (void *)size, size ? size->media : "(null)"));
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!http || !dest || !dinfo || !size)
|
||||
{
|
||||
DEBUG_puts("1cupsLocalizeDestMedia: Returning NULL.");
|
||||
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
|
||||
return (NULL);
|
||||
}
|
||||
@@ -79,13 +82,24 @@ cupsLocalizeDestMedia(
|
||||
|
||||
key.id = size->media;
|
||||
if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL)
|
||||
{
|
||||
DEBUG_printf(("1cupsLocalizeDestMedia: Returning \"%s\".", match->str));
|
||||
return (match->str);
|
||||
}
|
||||
|
||||
/*
|
||||
* If not, get the localized size, source, and type strings...
|
||||
*/
|
||||
|
||||
lang = cupsLangDefault();
|
||||
|
||||
snprintf(temp, sizeof(temp), "media.%s", size->media);
|
||||
if ((lsize = _cupsLangString(lang, temp)) != NULL && strcmp(lsize, temp))
|
||||
{
|
||||
DEBUG_printf(("1cupsLocalizeDestMedia: Returning standard localization \"%s\".", lsize));
|
||||
return (lsize);
|
||||
}
|
||||
|
||||
pwg = pwgMediaForSize(size->width, size->length);
|
||||
|
||||
if (pwg->ppd)
|
||||
@@ -101,7 +115,7 @@ cupsLocalizeDestMedia(
|
||||
* Use inches since the size is a multiple of 1/4 inch.
|
||||
*/
|
||||
|
||||
snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%g x %g")), size->width / 2540.0, size->length / 2540.0);
|
||||
snprintf(temp, sizeof(temp), _cupsLangString(lang, _("%g x %g \"")), size->width / 2540.0, size->length / 2540.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -189,6 +203,8 @@ cupsLocalizeDestMedia(
|
||||
|
||||
cupsArrayAdd(dinfo->localizations, match);
|
||||
|
||||
DEBUG_printf(("1cupsLocalizeDestMedia: Returning \"%s\".", match->str));
|
||||
|
||||
return (match->str);
|
||||
}
|
||||
|
||||
@@ -212,21 +228,23 @@ cupsLocalizeDestOption(
|
||||
{
|
||||
_cups_message_t key, /* Search key */
|
||||
*match; /* Matching entry */
|
||||
const char *localized; /* Localized string */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsLocalizeDestOption(http=%p, dest=%p, dinfo=%p, option=\"%s\")", (void *)http, (void *)dest, (void *)dinfo, option));
|
||||
|
||||
if (!http || !dest || !dinfo)
|
||||
return (option);
|
||||
|
||||
if (!dinfo->localizations)
|
||||
cups_create_localizations(http, dinfo);
|
||||
|
||||
if (cupsArrayCount(dinfo->localizations) == 0)
|
||||
return (option);
|
||||
|
||||
key.id = (char *)option;
|
||||
if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations,
|
||||
&key)) != NULL)
|
||||
return (match->str);
|
||||
else if ((localized = _cupsLangString(cupsLangDefault(), option)) != NULL)
|
||||
return (localized);
|
||||
else
|
||||
return (option);
|
||||
}
|
||||
@@ -253,22 +271,40 @@ cupsLocalizeDestValue(
|
||||
_cups_message_t key, /* Search key */
|
||||
*match; /* Matching entry */
|
||||
char pair[256]; /* option.value pair */
|
||||
const char *localized; /* Localized string */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsLocalizeDestValue(http=%p, dest=%p, dinfo=%p, option=\"%s\", value=\"%s\")", (void *)http, (void *)dest, (void *)dinfo, option, value));
|
||||
|
||||
if (!http || !dest || !dinfo)
|
||||
return (value);
|
||||
|
||||
if (!strcmp(option, "media"))
|
||||
{
|
||||
pwg_media_t *media = pwgMediaForPWG(value);
|
||||
cups_size_t size;
|
||||
|
||||
strlcpy(size.media, value, sizeof(size.media));
|
||||
size.width = media ? media->width : 0;
|
||||
size.length = media ? media->length : 0;
|
||||
size.left = 0;
|
||||
size.right = 0;
|
||||
size.bottom = 0;
|
||||
size.top = 0;
|
||||
|
||||
return (cupsLocalizeDestMedia(http, dest, dinfo, CUPS_MEDIA_FLAGS_DEFAULT, &size));
|
||||
}
|
||||
|
||||
if (!dinfo->localizations)
|
||||
cups_create_localizations(http, dinfo);
|
||||
|
||||
if (cupsArrayCount(dinfo->localizations) == 0)
|
||||
return (value);
|
||||
|
||||
snprintf(pair, sizeof(pair), "%s.%s", option, value);
|
||||
key.id = pair;
|
||||
if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations,
|
||||
&key)) != NULL)
|
||||
return (match->str);
|
||||
else if ((localized = _cupsLangString(cupsLangDefault(), pair)) != NULL && strcmp(localized, pair))
|
||||
return (localized);
|
||||
else
|
||||
return (value);
|
||||
}
|
||||
|
||||
+86
-4
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Destination option/media support for CUPS.
|
||||
*
|
||||
* Copyright 2012-2016 by Apple Inc.
|
||||
* Copyright 2012-2017 by Apple Inc.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -73,7 +73,7 @@ cupsCheckDestSupported(
|
||||
cups_dest_t *dest, /* I - Destination */
|
||||
cups_dinfo_t *dinfo, /* I - Destination information */
|
||||
const char *option, /* I - Option */
|
||||
const char *value) /* I - Value */
|
||||
const char *value) /* I - Value or @code NULL@ */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
char temp[1024]; /* Temporary string */
|
||||
@@ -85,11 +85,18 @@ cupsCheckDestSupported(
|
||||
_ipp_value_t *attrval; /* Current attribute value */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!http || !dest || !dinfo || !option || !value)
|
||||
if (!http || !dest || !dinfo || !option)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
@@ -107,7 +114,10 @@ cupsCheckDestSupported(
|
||||
if (!attr)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
if (!value)
|
||||
return (1);
|
||||
|
||||
/*
|
||||
* Compare values...
|
||||
*/
|
||||
|
||||
@@ -315,6 +325,13 @@ cupsCopyDestConflicts(
|
||||
if (resolved)
|
||||
*resolved = NULL;
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -574,6 +591,13 @@ cupsCopyDestInfo(
|
||||
|
||||
DEBUG_printf(("cupsCopyDestSupported(http=%p, dest=%p(%s))", (void *)http, (void *)dest, dest ? dest->name : ""));
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -685,6 +709,13 @@ cupsFindDestDefault(
|
||||
char name[IPP_MAX_NAME]; /* Attribute name */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -726,6 +757,13 @@ cupsFindDestReady(
|
||||
char name[IPP_MAX_NAME]; /* Attribute name */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -769,6 +807,13 @@ cupsFindDestSupported(
|
||||
char name[IPP_MAX_NAME]; /* Attribute name */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -791,6 +836,8 @@ cupsFindDestSupported(
|
||||
/*
|
||||
* 'cupsFreeDestInfo()' - Free destination information obtained using
|
||||
* @link cupsCopyDestInfo@.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
|
||||
void
|
||||
@@ -851,6 +898,13 @@ cupsGetDestMediaByIndex(
|
||||
pwg_media_t *pwg; /* PWG media name for size */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -939,6 +993,13 @@ cupsGetDestMediaByName(
|
||||
pwg_media_t *pwg; /* PWG media info */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -1007,6 +1068,13 @@ cupsGetDestMediaBySize(
|
||||
pwg_media_t *pwg; /* PWG media info */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -1058,6 +1126,13 @@ cupsGetDestMediaCount(
|
||||
cups_dinfo_t *dinfo, /* I - Destination information */
|
||||
unsigned flags) /* I - Media flags */
|
||||
{
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -1103,6 +1178,13 @@ cupsGetDestMediaDefault(
|
||||
const char *media; /* Default media size */
|
||||
|
||||
|
||||
/*
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
http = _cupsConnect();
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
+915
-475
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+2
-29
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* This set of APIs abstracts enumeration of directory entries.
|
||||
*
|
||||
* Copyright 2007-2012 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2005 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -338,10 +338,6 @@ cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */
|
||||
{
|
||||
struct dirent *entry; /* Pointer to entry */
|
||||
char filename[1024]; /* Full filename */
|
||||
# ifdef HAVE_PTHREAD_H
|
||||
char buffer[sizeof(struct dirent) + 1024];
|
||||
/* Directory entry buffer */
|
||||
# endif /* HAVE_PTHREAD_H */
|
||||
|
||||
|
||||
DEBUG_printf(("2cupsDirRead(dp=%p)", (void *)dp));
|
||||
@@ -359,29 +355,8 @@ cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */
|
||||
|
||||
for (;;)
|
||||
{
|
||||
# ifdef HAVE_PTHREAD_H
|
||||
/*
|
||||
* Read the next entry using the reentrant version of readdir...
|
||||
*/
|
||||
|
||||
if (readdir_r(dp->dir, (struct dirent *)buffer, &entry))
|
||||
{
|
||||
DEBUG_printf(("3cupsDirRead: readdir_r() failed - %s\n", strerror(errno)));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (!entry)
|
||||
{
|
||||
DEBUG_puts("3cupsDirRead: readdir_r() returned a NULL pointer!");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
DEBUG_printf(("4cupsDirRead: readdir_r() returned \"%s\"...",
|
||||
entry->d_name));
|
||||
|
||||
# else
|
||||
/*
|
||||
* Read the next entry using the original version of readdir...
|
||||
* Read the next entry...
|
||||
*/
|
||||
|
||||
if ((entry = readdir(dp->dir)) == NULL)
|
||||
@@ -392,8 +367,6 @@ cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */
|
||||
|
||||
DEBUG_printf(("4cupsDirRead: readdir() returned \"%s\"...", entry->d_name));
|
||||
|
||||
# endif /* HAVE_PTHREAD_H */
|
||||
|
||||
/*
|
||||
* Skip "." and ".."...
|
||||
*/
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Option encoding routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -329,7 +329,7 @@ static int compare_ipp_options(_ipp_option_t *a, _ipp_option_t *b);
|
||||
* 'cupsEncodeOptions()' - Encode printer options into IPP attributes.
|
||||
*
|
||||
* This function adds operation, job, and then subscription attributes,
|
||||
* in that order. Use the cupsEncodeOptions2() function to add attributes
|
||||
* in that order. Use the @link cupsEncodeOptions2@ function to add attributes
|
||||
* for a single group.
|
||||
*/
|
||||
|
||||
@@ -354,7 +354,7 @@ cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
|
||||
* 'cupsEncodeOptions2()' - Encode printer options into IPP attributes for a group.
|
||||
*
|
||||
* This function only adds attributes for a single group. Call this
|
||||
* function multiple times for each group, or use cupsEncodeOptions()
|
||||
* function multiple times for each group, or use @link cupsEncodeOptions@
|
||||
* to add the standard groups.
|
||||
*
|
||||
* @since CUPS 1.2/macOS 10.5@
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
* Since stdio files max out at 256 files on many systems, we have to
|
||||
* write similar functions without this limit. At the same time, using
|
||||
* our own file functions allows us to provide transparent support of
|
||||
* gzip'd print files, PPD files, etc.
|
||||
* different line endings, gzip'd print files, PPD files, etc.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
|
||||
+26
-13
@@ -4,9 +4,9 @@
|
||||
* Since stdio files max out at 256 files on many systems, we have to
|
||||
* write similar functions without this limit. At the same time, using
|
||||
* our own file functions allows us to provide transparent support of
|
||||
* gzip'd print files, PPD files, etc.
|
||||
* different line endings, gzip'd print files, PPD files, etc.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -321,7 +321,6 @@ cupsFileClose(cups_file_t *fp) /* I - CUPS file */
|
||||
int fd; /* File descriptor */
|
||||
char mode; /* Open mode */
|
||||
int status; /* Return status */
|
||||
int is_stdio; /* Is a stdio file? */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsFileClose(fp=%p)", (void *)fp));
|
||||
@@ -410,12 +409,19 @@ cupsFileClose(cups_file_t *fp) /* I - CUPS file */
|
||||
#endif /* HAVE_LIBZ */
|
||||
|
||||
/*
|
||||
* If this is one of the cupsFileStdin/out/err files, return now and don't
|
||||
* actually free memory or close (these last the life of the process...)
|
||||
*/
|
||||
|
||||
if (fp->is_stdio)
|
||||
return (status);
|
||||
|
||||
/*
|
||||
* Save the file descriptor we used and free memory...
|
||||
*/
|
||||
|
||||
fd = fp->fd;
|
||||
mode = fp->mode;
|
||||
is_stdio = fp->is_stdio;
|
||||
fd = fp->fd;
|
||||
mode = fp->mode;
|
||||
|
||||
if (fp->printf_buffer)
|
||||
free(fp->printf_buffer);
|
||||
@@ -431,11 +437,8 @@ cupsFileClose(cups_file_t *fp) /* I - CUPS file */
|
||||
if (httpAddrClose(NULL, fd) < 0)
|
||||
status = -1;
|
||||
}
|
||||
else if (!is_stdio)
|
||||
{
|
||||
if (close(fd) < 0)
|
||||
status = -1;
|
||||
}
|
||||
else if (close(fd) < 0)
|
||||
status = -1;
|
||||
|
||||
return (status);
|
||||
}
|
||||
@@ -1384,7 +1387,11 @@ cupsFilePrintf(cups_file_t *fp, /* I - CUPS file */
|
||||
{
|
||||
memcpy(fp->ptr, fp->printf_buffer, (size_t)bytes);
|
||||
fp->ptr += bytes;
|
||||
return ((int)bytes);
|
||||
|
||||
if (fp->is_stdio && cupsFileFlush(fp))
|
||||
return (-1);
|
||||
else
|
||||
return ((int)bytes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1563,7 +1570,11 @@ cupsFilePuts(cups_file_t *fp, /* I - CUPS file */
|
||||
{
|
||||
memcpy(fp->ptr, s, (size_t)bytes);
|
||||
fp->ptr += bytes;
|
||||
return ((int)bytes);
|
||||
|
||||
if (fp->is_stdio && cupsFileFlush(fp))
|
||||
return (-1);
|
||||
else
|
||||
return ((int)bytes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2466,6 +2477,8 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
|
||||
* file header...
|
||||
*/
|
||||
|
||||
inflateEnd(&fp->stream);
|
||||
|
||||
fp->compressed = 0;
|
||||
}
|
||||
else if (status < Z_OK)
|
||||
|
||||
+2
-2
@@ -4,9 +4,9 @@
|
||||
* Since stdio files max out at 256 files on many systems, we have to
|
||||
* write similar functions without this limit. At the same time, using
|
||||
* our own file functions allows us to provide transparent support of
|
||||
* gzip'd print files, PPD files, etc.
|
||||
* different line endings, gzip'd print files, PPD files, etc.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
|
||||
+86
-5
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Hashing function for CUPS.
|
||||
*
|
||||
* Copyright 2015-2016 by Apple Inc.
|
||||
* Copyright © 2015-2018 by Apple Inc.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -21,6 +21,8 @@
|
||||
# include <CommonCrypto/CommonDigest.h>
|
||||
#elif defined(HAVE_GNUTLS)
|
||||
# include <gnutls/crypto.h>
|
||||
#else
|
||||
# include "md5-private.h"
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
|
||||
@@ -53,7 +55,24 @@ cupsHashData(const char *algorithm, /* I - Algorithm name */
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
if (!strcmp(algorithm, "sha"))
|
||||
if (!strcmp(algorithm, "md5"))
|
||||
{
|
||||
/*
|
||||
* MD5 (deprecated but widely used...)
|
||||
*/
|
||||
|
||||
CC_MD5_CTX ctx; /* MD5 context */
|
||||
|
||||
if (hashsize < CC_MD5_DIGEST_LENGTH)
|
||||
goto too_small;
|
||||
|
||||
CC_MD5_Init(&ctx);
|
||||
CC_MD5_Update(&ctx, data, (CC_LONG)datalen);
|
||||
CC_MD5_Final(hash, &ctx);
|
||||
|
||||
return (CC_MD5_DIGEST_LENGTH);
|
||||
}
|
||||
else if (!strcmp(algorithm, "sha"))
|
||||
{
|
||||
/*
|
||||
* SHA-1...
|
||||
@@ -171,7 +190,9 @@ cupsHashData(const char *algorithm, /* I - Algorithm name */
|
||||
unsigned char temp[64]; /* Temporary hash buffer */
|
||||
size_t tempsize = 0; /* Truncate to this size? */
|
||||
|
||||
if (!strcmp(algorithm, "sha"))
|
||||
if (!strcmp(algorithm, "md5"))
|
||||
alg = GNUTLS_DIG_MD5;
|
||||
else if (!strcmp(algorithm, "sha"))
|
||||
alg = GNUTLS_DIG_SHA1;
|
||||
else if (!strcmp(algorithm, "sha2-224"))
|
||||
alg = GNUTLS_DIG_SHA224;
|
||||
@@ -219,10 +240,20 @@ cupsHashData(const char *algorithm, /* I - Algorithm name */
|
||||
|
||||
#else
|
||||
/*
|
||||
* No hash support without CommonCrypto or GNU TLS...
|
||||
* No hash support beyond MD5 without CommonCrypto or GNU TLS...
|
||||
*/
|
||||
|
||||
if (hashsize < 64)
|
||||
if (!strcmp(algorithm, "md5"))
|
||||
{
|
||||
_cups_md5_state_t state; /* MD5 state info */
|
||||
|
||||
_cupsMD5Init(&state);
|
||||
_cupsMD5Append(&state, data, datalen);
|
||||
_cupsMD5Finish(&state, hash);
|
||||
|
||||
return (16);
|
||||
}
|
||||
else if (hashsize < 64)
|
||||
goto too_small;
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
@@ -243,3 +274,53 @@ cupsHashData(const char *algorithm, /* I - Algorithm name */
|
||||
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Hash buffer too small."), 1);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsHashString()' - Format a hash value as a hexadecimal string.
|
||||
*
|
||||
* The passed buffer must be at least 2 * hashsize + 1 characters in length.
|
||||
*
|
||||
* @since CUPS 2.2.7@
|
||||
*/
|
||||
|
||||
const char * /* O - Formatted string */
|
||||
cupsHashString(
|
||||
const unsigned char *hash, /* I - Hash */
|
||||
size_t hashsize, /* I - Size of hash */
|
||||
char *buffer, /* I - String buffer */
|
||||
size_t bufsize) /* I - Size of string buffer */
|
||||
{
|
||||
char *bufptr = buffer; /* Pointer into buffer */
|
||||
static const char *hex = "0123456789abcdef";
|
||||
/* Hex characters (lowercase!) */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!hash || hashsize < 1 || !buffer || bufsize < (2 * hashsize + 1))
|
||||
{
|
||||
if (buffer)
|
||||
*buffer = '\0';
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop until we've converted the whole hash...
|
||||
*/
|
||||
|
||||
while (hashsize > 0)
|
||||
{
|
||||
*bufptr++ = hex[*hash >> 4];
|
||||
*bufptr++ = hex[*hash & 15];
|
||||
|
||||
hash ++;
|
||||
hashsize --;
|
||||
}
|
||||
|
||||
*bufptr = '\0';
|
||||
|
||||
return (buffer);
|
||||
}
|
||||
|
||||
+8
-4
@@ -58,9 +58,9 @@ httpAddrAny(const http_addr_t *addr) /* I - Address to check */
|
||||
* 'httpAddrClose()' - Close a socket created by @link httpAddrConnect@ or
|
||||
* @link httpAddrListen@.
|
||||
*
|
||||
* Pass @code NULL@ for sockets created with @link httpAddrConnect@ and the
|
||||
* listen address for sockets created with @link httpAddrListen@. This will
|
||||
* ensure that domain sockets are removed when closed.
|
||||
* Pass @code NULL@ for sockets created with @link httpAddrConnect2@ and the
|
||||
* listen address for sockets created with @link httpAddrListen@. This function
|
||||
* ensures that domain sockets are removed when closed.
|
||||
*
|
||||
* @since CUPS 2.0/OS 10.10@
|
||||
*/
|
||||
@@ -648,6 +648,10 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */
|
||||
/*
|
||||
* 'httpGetAddress()' - Get the address of the connected peer of a connection.
|
||||
*
|
||||
* For connections created with @link httpConnect2@, the address is for the
|
||||
* server. For connections created with @link httpAccept@, the address is for
|
||||
* the client.
|
||||
*
|
||||
* Returns @code NULL@ if the socket is currently unconnected.
|
||||
*
|
||||
* @since CUPS 2.0/OS 10.10@
|
||||
@@ -667,7 +671,7 @@ httpGetAddress(http_t *http) /* I - HTTP connection */
|
||||
* 'httpGetHostByName()' - Lookup a hostname or IPv4 address, and return
|
||||
* address records for the specified name.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
struct hostent * /* O - Host entry */
|
||||
|
||||
+18
-3
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* HTTP address list routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -32,7 +32,7 @@
|
||||
/*
|
||||
* 'httpAddrConnect()' - Connect to any of the addresses in the list.
|
||||
*
|
||||
* @since CUPS 1.2/macOS 10.5@
|
||||
* @since CUPS 1.2/macOS 10.5@ @exclude all@
|
||||
*/
|
||||
|
||||
http_addrlist_t * /* O - Connected address or NULL on failure */
|
||||
@@ -65,7 +65,7 @@ httpAddrConnect2(
|
||||
int flags; /* Socket flags */
|
||||
#endif /* !WIN32 */
|
||||
int remaining; /* Remaining timeout */
|
||||
int i, /* Looping var */
|
||||
int i, j, /* Looping vars */
|
||||
nfds, /* Number of file descriptors */
|
||||
fds[100], /* Socket file descriptors */
|
||||
result; /* Result from select() or poll() */
|
||||
@@ -323,6 +323,8 @@ httpAddrConnect2(
|
||||
if (!getpeername(fds[i], (struct sockaddr *)&peer, &len))
|
||||
DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&peer, temp, sizeof(temp)), httpAddrPort(&peer)));
|
||||
# endif /* DEBUG */
|
||||
|
||||
break;
|
||||
}
|
||||
# ifdef HAVE_POLL
|
||||
else if (pfds[i].revents & (POLLERR | POLLHUP))
|
||||
@@ -346,7 +348,20 @@ httpAddrConnect2(
|
||||
}
|
||||
|
||||
if (connaddr)
|
||||
{
|
||||
/*
|
||||
* Connected on one address, close all of the other sockets we have so
|
||||
* far and return...
|
||||
*/
|
||||
|
||||
for (j = 0; j < i; j ++)
|
||||
httpAddrClose(NULL, fds[j]);
|
||||
|
||||
for (j ++; j < nfds; j ++)
|
||||
httpAddrClose(NULL, fds[j]);
|
||||
|
||||
return (connaddr);
|
||||
}
|
||||
}
|
||||
#endif /* O_NONBLOCK */
|
||||
|
||||
|
||||
+20
-15
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Private HTTP definitions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 2007-2018 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -68,7 +68,6 @@ typedef int socklen_t;
|
||||
# endif /* __APPLE__ && !_SOCKLEN_T */
|
||||
|
||||
# include <cups/http.h>
|
||||
# include "md5-private.h"
|
||||
# include "ipp-private.h"
|
||||
|
||||
# ifdef HAVE_GNUTLS
|
||||
@@ -172,18 +171,24 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define _HTTP_MAX_SBUFFER 65536 /* Size of (de)compression buffer */
|
||||
# define _HTTP_RESOLVE_DEFAULT 0 /* Just resolve with default options */
|
||||
# define _HTTP_RESOLVE_STDERR 1 /* Log resolve progress to stderr */
|
||||
# define _HTTP_RESOLVE_FQDN 2 /* Resolve to a FQDN */
|
||||
# define _HTTP_RESOLVE_FAXOUT 4 /* Resolve FaxOut service? */
|
||||
|
||||
#define _HTTP_MAX_SBUFFER 65536 /* Size of (de)compression buffer */
|
||||
#define _HTTP_RESOLVE_DEFAULT 0 /* Just resolve with default options */
|
||||
#define _HTTP_RESOLVE_STDERR 1 /* Log resolve progress to stderr */
|
||||
#define _HTTP_RESOLVE_FQDN 2 /* Resolve to a FQDN */
|
||||
#define _HTTP_RESOLVE_FAXOUT 4 /* Resolve FaxOut service? */
|
||||
# define _HTTP_TLS_NONE 0 /* No TLS options */
|
||||
# define _HTTP_TLS_ALLOW_RC4 1 /* Allow RC4 cipher suites */
|
||||
# define _HTTP_TLS_ALLOW_DH 2 /* Allow DH/DHE key negotiation */
|
||||
# define _HTTP_TLS_DENY_CBC 4 /* Deny CBC cipher suites */
|
||||
# define _HTTP_TLS_SET_DEFAULT 128 /* Setting the default TLS options */
|
||||
|
||||
#define _HTTP_TLS_NONE 0 /* No TLS options */
|
||||
#define _HTTP_TLS_ALLOW_RC4 1 /* Allow RC4 cipher suites */
|
||||
#define _HTTP_TLS_ALLOW_SSL3 2 /* Allow SSL 3.0 */
|
||||
#define _HTTP_TLS_ALLOW_DH 4 /* Allow DH/DHE key negotiation */
|
||||
#define _HTTP_TLS_DENY_TLS10 16 /* Deny TLS 1.0 */
|
||||
# define _HTTP_TLS_SSL3 0 /* Min/max version is SSL/3.0 */
|
||||
# define _HTTP_TLS_1_0 1 /* Min/max version is TLS/1.0 */
|
||||
# define _HTTP_TLS_1_1 2 /* Min/max version is TLS/1.1 */
|
||||
# define _HTTP_TLS_1_2 3 /* Min/max version is TLS/1.2 */
|
||||
# define _HTTP_TLS_1_3 4 /* Min/max version is TLS/1.3 */
|
||||
# define _HTTP_TLS_MAX 5 /* Highest known TLS version */
|
||||
|
||||
|
||||
/*
|
||||
@@ -295,10 +300,10 @@ struct _http_s /**** HTTP connection structure ****/
|
||||
char buffer[HTTP_MAX_BUFFER];
|
||||
/* Buffer for incoming data */
|
||||
int _auth_type; /* Authentication in use (deprecated) */
|
||||
_cups_md5_state_t md5_state; /* MD5 state */
|
||||
unsigned char _md5_state[88]; /* MD5 state (deprecated) */
|
||||
char nonce[HTTP_MAX_VALUE];
|
||||
/* Nonce value */
|
||||
int nonce_count; /* Nonce count */
|
||||
unsigned nonce_count; /* Nonce count */
|
||||
http_tls_t tls; /* TLS state information */
|
||||
http_encryption_t encryption; /* Encryption requirements */
|
||||
|
||||
@@ -440,7 +445,7 @@ extern void _httpTLSInitialize(void);
|
||||
extern size_t _httpTLSPending(http_t *http);
|
||||
extern int _httpTLSRead(http_t *http, char *buf, int len);
|
||||
extern int _httpTLSSetCredentials(http_t *http);
|
||||
extern void _httpTLSSetOptions(int options);
|
||||
extern void _httpTLSSetOptions(int options, int min_version, int max_version);
|
||||
extern int _httpTLSStart(http_t *http);
|
||||
extern void _httpTLSStop(http_t *http);
|
||||
extern int _httpTLSWrite(http_t *http, const char *buf, int len);
|
||||
|
||||
+22
-16
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* HTTP support routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 2007-2018 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -502,7 +502,6 @@ httpAssembleUUID(const char *server, /* I - Server name */
|
||||
size_t bufsize) /* I - Size of buffer */
|
||||
{
|
||||
char data[1024]; /* Source string for MD5 */
|
||||
_cups_md5_state_t md5state; /* MD5 state */
|
||||
unsigned char md5sum[16]; /* MD5 digest/sum */
|
||||
|
||||
|
||||
@@ -517,9 +516,7 @@ httpAssembleUUID(const char *server, /* I - Server name */
|
||||
port, name ? name : server, number,
|
||||
(unsigned)CUPS_RAND() & 0xffff, (unsigned)CUPS_RAND() & 0xffff);
|
||||
|
||||
_cupsMD5Init(&md5state);
|
||||
_cupsMD5Append(&md5state, (unsigned char *)data, (int)strlen(data));
|
||||
_cupsMD5Finish(&md5state, md5sum);
|
||||
cupsHashData("md5", (unsigned char *)data, strlen(data), md5sum, sizeof(md5sum));
|
||||
|
||||
/*
|
||||
* Generate the UUID from the MD5...
|
||||
@@ -543,7 +540,7 @@ httpAssembleUUID(const char *server, /* I - Server name */
|
||||
* This function is deprecated. Use the httpDecode64_2() function instead
|
||||
* which provides buffer length arguments.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
char * /* O - Decoded string */
|
||||
@@ -566,6 +563,10 @@ httpDecode64(char *out, /* I - String to write to */
|
||||
/*
|
||||
* 'httpDecode64_2()' - Base64-decode a string.
|
||||
*
|
||||
* The caller must initialize "outlen" to the maximum size of the decoded
|
||||
* string before calling @code httpDecode64_2@. On return "outlen" contains the
|
||||
* decoded length of the string.
|
||||
*
|
||||
* @since CUPS 1.1.21/macOS 10.4@
|
||||
*/
|
||||
|
||||
@@ -671,7 +672,7 @@ httpDecode64_2(char *out, /* I - String to write to */
|
||||
* This function is deprecated. Use the httpEncode64_2() function instead
|
||||
* which provides buffer length arguments.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
char * /* O - Encoded string */
|
||||
@@ -690,7 +691,7 @@ httpEncode64(char *out, /* I - String to write to */
|
||||
|
||||
char * /* O - Encoded string */
|
||||
httpEncode64_2(char *out, /* I - String to write to */
|
||||
int outlen, /* I - Size of output string */
|
||||
int outlen, /* I - Maximum size of output string */
|
||||
const char *in, /* I - String to read from */
|
||||
int inlen) /* I - Size of input string */
|
||||
{
|
||||
@@ -778,11 +779,11 @@ httpEncode64_2(char *out, /* I - String to write to */
|
||||
/*
|
||||
* 'httpGetDateString()' - Get a formatted date/time string from a time value.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
const char * /* O - Date/time string */
|
||||
httpGetDateString(time_t t) /* I - UNIX time */
|
||||
httpGetDateString(time_t t) /* I - Time in seconds */
|
||||
{
|
||||
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
|
||||
|
||||
@@ -798,7 +799,7 @@ httpGetDateString(time_t t) /* I - UNIX time */
|
||||
*/
|
||||
|
||||
const char * /* O - Date/time string */
|
||||
httpGetDateString2(time_t t, /* I - UNIX time */
|
||||
httpGetDateString2(time_t t, /* I - Time in seconds */
|
||||
char *s, /* I - String buffer */
|
||||
int slen) /* I - Size of string buffer */
|
||||
{
|
||||
@@ -819,7 +820,7 @@ httpGetDateString2(time_t t, /* I - UNIX time */
|
||||
* 'httpGetDateTime()' - Get a time value from a formatted date/time string.
|
||||
*/
|
||||
|
||||
time_t /* O - UNIX time */
|
||||
time_t /* O - Time in seconds */
|
||||
httpGetDateTime(const char *s) /* I - Date/time string */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
@@ -888,7 +889,7 @@ httpGetDateTime(const char *s) /* I - Date/time string */
|
||||
*
|
||||
* This function is deprecated; use the httpSeparateURI() function instead.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
void
|
||||
@@ -912,7 +913,7 @@ httpSeparate(const char *uri, /* I - Universal Resource Identifier */
|
||||
* This function is deprecated; use the httpSeparateURI() function instead.
|
||||
*
|
||||
* @since CUPS 1.1.21/macOS 10.4@
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
void
|
||||
@@ -1031,7 +1032,7 @@ httpSeparateURI(
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
if (*uri != ':')
|
||||
if (*uri != ':' || *scheme == '.' || !*scheme)
|
||||
{
|
||||
*scheme = '\0';
|
||||
return (HTTP_URI_STATUS_BAD_SCHEME);
|
||||
@@ -1356,6 +1357,9 @@ _httpStatus(cups_lang_t *lang, /* I - Language */
|
||||
case HTTP_STATUS_MOVED_PERMANENTLY :
|
||||
s = _("Moved Permanently");
|
||||
break;
|
||||
case HTTP_STATUS_FOUND :
|
||||
s = _("Found");
|
||||
break;
|
||||
case HTTP_STATUS_SEE_OTHER :
|
||||
s = _("See Other");
|
||||
break;
|
||||
@@ -1419,7 +1423,7 @@ _httpStatus(cups_lang_t *lang, /* I - Language */
|
||||
* 'httpStatus()' - Return a short string describing a HTTP status code.
|
||||
*
|
||||
* The returned string is localized to the current POSIX locale and is based
|
||||
* on the status strings defined in RFC 2616.
|
||||
* on the status strings defined in RFC 7231.
|
||||
*/
|
||||
|
||||
const char * /* O - Localized status string */
|
||||
@@ -2310,6 +2314,8 @@ http_resolve_cb(
|
||||
* Note: This function is needed because avahi_simple_poll_iterate is broken
|
||||
* and always uses a timeout of 0 (!) milliseconds.
|
||||
* (Avahi Ticket #364)
|
||||
*
|
||||
* @private@
|
||||
*/
|
||||
|
||||
static int /* O - Number of file descriptors matching */
|
||||
|
||||
+147
-129
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* HTTP routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 2007-2018 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* This file contains Kerberos support code, copyright 2006 by
|
||||
@@ -39,6 +39,7 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void http_add_field(http_t *http, http_field_t field, const char *value, int append);
|
||||
#ifdef HAVE_LIBZ
|
||||
static void http_content_coding_finish(http_t *http);
|
||||
static void http_content_coding_start(http_t *http,
|
||||
@@ -417,7 +418,7 @@ httpCompareCredentials(
|
||||
*
|
||||
* This function is deprecated - use @link httpConnect2@ instead.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
http_t * /* O - New HTTP connection */
|
||||
@@ -439,7 +440,7 @@ http_t * /* O - New HTTP connection */
|
||||
httpConnect2(
|
||||
const char *host, /* I - Host to connect to */
|
||||
int port, /* I - Port number */
|
||||
http_addrlist_t *addrlist, /* I - List of addresses or NULL to lookup */
|
||||
http_addrlist_t *addrlist, /* I - List of addresses or @code NULL@ to lookup */
|
||||
int family, /* I - Address family to use or @code AF_UNSPEC@ for any */
|
||||
http_encryption_t encryption, /* I - Type of encryption to use */
|
||||
int blocking, /* I - 1 for blocking connection, 0 for non-blocking */
|
||||
@@ -482,7 +483,7 @@ httpConnect2(
|
||||
* This function is now deprecated. Please use the @link httpConnect2@ function
|
||||
* instead.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
http_t * /* O - New HTTP connection */
|
||||
@@ -609,7 +610,7 @@ httpFieldValue(const char *name) /* I - String name */
|
||||
|
||||
|
||||
/*
|
||||
* 'httpFlush()' - Flush data from a HTTP connection.
|
||||
* 'httpFlush()' - Flush data read from a HTTP connection.
|
||||
*/
|
||||
|
||||
void
|
||||
@@ -679,7 +680,7 @@ httpFlush(http_t *http) /* I - HTTP connection */
|
||||
|
||||
|
||||
/*
|
||||
* 'httpFlushWrite()' - Flush data in write buffer.
|
||||
* 'httpFlushWrite()' - Flush data written to a HTTP connection.
|
||||
*
|
||||
* @since CUPS 1.2/macOS 10.5@
|
||||
*/
|
||||
@@ -751,7 +752,7 @@ httpGet(http_t *http, /* I - HTTP connection */
|
||||
/*
|
||||
* 'httpGetActivity()' - Get the most recent activity for a connection.
|
||||
*
|
||||
* The return value is the UNIX time of the last read or write.
|
||||
* The return value is the time in seconds of the last read or write.
|
||||
*
|
||||
* @since CUPS 2.0/OS 10.10@
|
||||
*/
|
||||
@@ -766,10 +767,10 @@ httpGetActivity(http_t *http) /* I - HTTP connection */
|
||||
/*
|
||||
* 'httpGetAuthString()' - Get the current authorization string.
|
||||
*
|
||||
* 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.
|
||||
* The authorization string is set by @link cupsDoAuthentication@ and
|
||||
* @link httpSetAuthString@. Use @link httpGetAuthString@ to retrieve the
|
||||
* string to use with @link httpSetField@ for the
|
||||
* @code HTTP_FIELD_AUTHORIZATION@ value.
|
||||
*
|
||||
* @since CUPS 1.3/macOS 10.5@
|
||||
*/
|
||||
@@ -891,7 +892,7 @@ httpGetContentEncoding(http_t *http) /* I - HTTP connection */
|
||||
* @since CUPS 1.1.19/macOS 10.3@
|
||||
*/
|
||||
|
||||
const char * /* O - Cookie data or NULL */
|
||||
const char * /* O - Cookie data or @code NULL@ */
|
||||
httpGetCookie(http_t *http) /* I - HTTP connection */
|
||||
{
|
||||
return (http ? http->cookie : NULL);
|
||||
@@ -1006,7 +1007,7 @@ httpGetKeepAlive(http_t *http) /* I - HTTP connection */
|
||||
* This function is deprecated and will not return lengths larger than
|
||||
* 2^31 - 1; use httpGetLength2() instead.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
int /* O - Content length */
|
||||
@@ -1150,7 +1151,7 @@ httpGetRemaining(http_t *http) /* I - HTTP connection */
|
||||
* 'httpGets()' - Get a line of text from a HTTP connection.
|
||||
*/
|
||||
|
||||
char * /* O - Line or NULL */
|
||||
char * /* O - Line or @code NULL@ */
|
||||
httpGets(char *line, /* I - Line to read into */
|
||||
int length, /* I - Max length of buffer */
|
||||
http_t *http) /* I - HTTP connection */
|
||||
@@ -1346,10 +1347,10 @@ httpGetStatus(http_t *http) /* I - HTTP connection */
|
||||
/*
|
||||
* 'httpGetSubField()' - Get a sub-field value.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
char * /* O - Value or NULL */
|
||||
char * /* O - Value or @code NULL@ */
|
||||
httpGetSubField(http_t *http, /* I - HTTP connection */
|
||||
http_field_t field, /* I - Field index */
|
||||
const char *name, /* I - Name of sub-field */
|
||||
@@ -1365,7 +1366,7 @@ httpGetSubField(http_t *http, /* I - HTTP connection */
|
||||
* @since CUPS 1.2/macOS 10.5@
|
||||
*/
|
||||
|
||||
char * /* O - Value or NULL */
|
||||
char * /* O - Value or @code NULL@ */
|
||||
httpGetSubField2(http_t *http, /* I - HTTP connection */
|
||||
http_field_t field, /* I - Field index */
|
||||
const char *name, /* I - Name of sub-field */
|
||||
@@ -1616,7 +1617,7 @@ httpOptions(http_t *http, /* I - HTTP connection */
|
||||
*
|
||||
* This function copies available data from the given HTTP connection, reading
|
||||
* a buffer as needed. The data is still available for reading using
|
||||
* @link httpRead@ or @link httpRead2@.
|
||||
* @link httpRead2@.
|
||||
*
|
||||
* For non-blocking connections the usual timeouts apply.
|
||||
*
|
||||
@@ -1939,7 +1940,7 @@ httpPut(http_t *http, /* I - HTTP connection */
|
||||
* This function is deprecated. Use the httpRead2() function which can
|
||||
* read more than 2GB of data.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes read */
|
||||
@@ -2326,7 +2327,7 @@ httpReadRequest(http_t *http, /* I - HTTP connection */
|
||||
* This function is deprecated. Please use the @link httpReconnect2@ function
|
||||
* instead.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, non-zero on failure */
|
||||
@@ -2467,9 +2468,10 @@ httpReconnect2(http_t *http, /* I - HTTP connection */
|
||||
* 'httpSetAuthString()' - Set the current authorization string.
|
||||
*
|
||||
* 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 httpPut().
|
||||
* the HTTP connection object. You must still call @link httpSetField@ to set
|
||||
* @code HTTP_FIELD_AUTHORIZATION@ prior to issuing a HTTP request using
|
||||
* @link httpGet@, @link httpHead@, @link httpOptions@, @link httpPost@, or
|
||||
* @link httpPut@.
|
||||
*
|
||||
* @since CUPS 1.3/macOS 10.5@
|
||||
*/
|
||||
@@ -2658,105 +2660,7 @@ httpSetField(http_t *http, /* I - HTTP connection */
|
||||
value == NULL)
|
||||
return;
|
||||
|
||||
switch (field)
|
||||
{
|
||||
case HTTP_FIELD_ACCEPT_ENCODING :
|
||||
if (http->accept_encoding)
|
||||
_cupsStrFree(http->accept_encoding);
|
||||
|
||||
http->accept_encoding = _cupsStrAlloc(value);
|
||||
break;
|
||||
|
||||
case HTTP_FIELD_ALLOW :
|
||||
if (http->allow)
|
||||
_cupsStrFree(http->allow);
|
||||
|
||||
http->allow = _cupsStrAlloc(value);
|
||||
break;
|
||||
|
||||
case HTTP_FIELD_SERVER :
|
||||
if (http->server)
|
||||
_cupsStrFree(http->server);
|
||||
|
||||
http->server = _cupsStrAlloc(value);
|
||||
break;
|
||||
|
||||
case HTTP_FIELD_WWW_AUTHENTICATE :
|
||||
/* CUPS STR #4503 - don't override WWW-Authenticate for unknown auth schemes */
|
||||
if (http->fields[HTTP_FIELD_WWW_AUTHENTICATE][0] &&
|
||||
_cups_strncasecmp(value, "Basic ", 6) &&
|
||||
_cups_strncasecmp(value, "Digest ", 7) &&
|
||||
_cups_strncasecmp(value, "Negotiate ", 10))
|
||||
{
|
||||
DEBUG_printf(("1httpSetField: Ignoring unknown auth scheme in \"%s\".", value));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Fall through to copy */
|
||||
|
||||
default :
|
||||
strlcpy(http->fields[field], value, HTTP_MAX_VALUE);
|
||||
break;
|
||||
}
|
||||
|
||||
if (field == HTTP_FIELD_AUTHORIZATION)
|
||||
{
|
||||
/*
|
||||
* Special case for Authorization: as its contents can be
|
||||
* longer than HTTP_MAX_VALUE
|
||||
*/
|
||||
|
||||
if (http->field_authorization)
|
||||
free(http->field_authorization);
|
||||
|
||||
http->field_authorization = strdup(value);
|
||||
}
|
||||
else if (field == HTTP_FIELD_HOST)
|
||||
{
|
||||
/*
|
||||
* Special-case for Host: as we don't want a trailing "." on the hostname and
|
||||
* need to bracket IPv6 numeric addresses.
|
||||
*/
|
||||
|
||||
char *ptr = strchr(value, ':');
|
||||
|
||||
if (value[0] != '[' && ptr && strchr(ptr + 1, ':'))
|
||||
{
|
||||
/*
|
||||
* Bracket IPv6 numeric addresses...
|
||||
*
|
||||
* This is slightly inefficient (basically copying twice), but is an edge
|
||||
* case and not worth optimizing...
|
||||
*/
|
||||
|
||||
snprintf(http->fields[HTTP_FIELD_HOST],
|
||||
sizeof(http->fields[HTTP_FIELD_HOST]), "[%s]", value);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Check for a trailing dot on the hostname...
|
||||
*/
|
||||
|
||||
ptr = http->fields[HTTP_FIELD_HOST];
|
||||
|
||||
if (*ptr)
|
||||
{
|
||||
ptr += strlen(ptr) - 1;
|
||||
|
||||
if (*ptr == '.')
|
||||
*ptr = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef HAVE_LIBZ
|
||||
else if (field == HTTP_FIELD_CONTENT_ENCODING &&
|
||||
http->data_encoding != HTTP_ENCODING_FIELDS)
|
||||
{
|
||||
DEBUG_puts("1httpSetField: Calling http_content_coding_start.");
|
||||
http_content_coding_start(http, value);
|
||||
}
|
||||
#endif /* HAVE_LIBZ */
|
||||
http_add_field(http, field, value, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -2820,7 +2724,7 @@ httpSetTimeout(
|
||||
http_t *http, /* I - HTTP connection */
|
||||
double timeout, /* I - Number of seconds for timeout,
|
||||
must be greater than 0 */
|
||||
http_timeout_cb_t cb, /* I - Callback function or NULL */
|
||||
http_timeout_cb_t cb, /* I - Callback function or @code NULL@ */
|
||||
void *user_data) /* I - User data pointer */
|
||||
{
|
||||
if (!http || timeout <= 0.0)
|
||||
@@ -2864,6 +2768,8 @@ httpShutdown(http_t *http) /* I - HTTP connection */
|
||||
|
||||
/*
|
||||
* 'httpTrace()' - Send an TRACE request to the server.
|
||||
*
|
||||
* @exclude all@
|
||||
*/
|
||||
|
||||
int /* O - Status of call (0 = success) */
|
||||
@@ -3032,7 +2938,7 @@ _httpUpdate(http_t *http, /* I - HTTP connection */
|
||||
httpSetCookie(http, value);
|
||||
}
|
||||
else if ((field = httpFieldValue(line)) != HTTP_FIELD_UNKNOWN)
|
||||
httpSetField(http, field, value);
|
||||
http_add_field(http, field, value, 1);
|
||||
#ifdef DEBUG
|
||||
else
|
||||
DEBUG_printf(("1_httpUpdate: unknown field %s seen!", line));
|
||||
@@ -3259,7 +3165,7 @@ httpWait(http_t *http, /* I - HTTP connection */
|
||||
* This function is deprecated. Use the httpWrite2() function which can
|
||||
* write more than 2GB of data.
|
||||
*
|
||||
* @deprecated@
|
||||
* @deprecated@ @exclude all@
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes written */
|
||||
@@ -3686,6 +3592,118 @@ httpWriteResponse(http_t *http, /* I - HTTP connection */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'http_add_field()' - Add a value for a HTTP field, appending if needed.
|
||||
*/
|
||||
|
||||
static void
|
||||
http_add_field(http_t *http, /* I - HTTP connection */
|
||||
http_field_t field, /* I - HTTP field */
|
||||
const char *value, /* I - Value string */
|
||||
int append) /* I - Append value? */
|
||||
{
|
||||
char newvalue[1024]; /* New value string */
|
||||
const char *oldvalue; /* Old field value */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Optionally append the new value to the existing one...
|
||||
*/
|
||||
|
||||
if (append && field != HTTP_FIELD_ACCEPT_ENCODING && field != HTTP_FIELD_ACCEPT_LANGUAGE && field != HTTP_FIELD_ACCEPT_RANGES && field != HTTP_FIELD_ALLOW && field != HTTP_FIELD_LINK && field != HTTP_FIELD_TRANSFER_ENCODING && field != HTTP_FIELD_UPGRADE && field != HTTP_FIELD_WWW_AUTHENTICATE)
|
||||
append = 0;
|
||||
|
||||
if (field == HTTP_FIELD_HOST)
|
||||
{
|
||||
/*
|
||||
* Special-case for Host: as we don't want a trailing "." on the hostname and
|
||||
* need to bracket IPv6 numeric addresses.
|
||||
*/
|
||||
|
||||
char *ptr = strchr(value, ':');
|
||||
|
||||
if (value[0] != '[' && ptr && strchr(ptr + 1, ':'))
|
||||
{
|
||||
/*
|
||||
* Bracket IPv6 numeric addresses...
|
||||
*/
|
||||
|
||||
snprintf(newvalue, sizeof(newvalue), "[%s]", value);
|
||||
value = newvalue;
|
||||
}
|
||||
else if (*value && value[strlen(value) - 1] == '.')
|
||||
{
|
||||
/*
|
||||
* Strip the trailing dot on the hostname...
|
||||
*/
|
||||
|
||||
strlcpy(newvalue, value, sizeof(newvalue));
|
||||
newvalue[strlen(newvalue) - 1] = '\0';
|
||||
value = newvalue;
|
||||
}
|
||||
}
|
||||
else if (append && *value && (oldvalue = httpGetField(http, field)) != NULL && *oldvalue)
|
||||
{
|
||||
snprintf(newvalue, sizeof(newvalue), "%s, %s", oldvalue, value);
|
||||
value = newvalue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save the new value...
|
||||
*/
|
||||
|
||||
switch (field)
|
||||
{
|
||||
case HTTP_FIELD_ACCEPT_ENCODING :
|
||||
if (http->accept_encoding)
|
||||
_cupsStrFree(http->accept_encoding);
|
||||
|
||||
http->accept_encoding = _cupsStrAlloc(value);
|
||||
break;
|
||||
|
||||
case HTTP_FIELD_ALLOW :
|
||||
if (http->allow)
|
||||
_cupsStrFree(http->allow);
|
||||
|
||||
http->allow = _cupsStrAlloc(value);
|
||||
break;
|
||||
|
||||
case HTTP_FIELD_SERVER :
|
||||
if (http->server)
|
||||
_cupsStrFree(http->server);
|
||||
|
||||
http->server = _cupsStrAlloc(value);
|
||||
break;
|
||||
|
||||
default :
|
||||
strlcpy(http->fields[field], value, HTTP_MAX_VALUE);
|
||||
break;
|
||||
}
|
||||
|
||||
if (field == HTTP_FIELD_AUTHORIZATION)
|
||||
{
|
||||
/*
|
||||
* Special case for Authorization: as its contents can be
|
||||
* longer than HTTP_MAX_VALUE
|
||||
*/
|
||||
|
||||
if (http->field_authorization)
|
||||
free(http->field_authorization);
|
||||
|
||||
http->field_authorization = strdup(value);
|
||||
}
|
||||
#ifdef HAVE_LIBZ
|
||||
else if (field == HTTP_FIELD_CONTENT_ENCODING &&
|
||||
http->data_encoding != HTTP_ENCODING_FIELDS)
|
||||
{
|
||||
DEBUG_puts("1http_add_field: Calling http_content_coding_start.");
|
||||
http_content_coding_start(http, value);
|
||||
}
|
||||
#endif /* HAVE_LIBZ */
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_LIBZ
|
||||
/*
|
||||
* 'http_content_coding_finish()' - Finish doing any content encoding.
|
||||
@@ -3898,7 +3916,7 @@ static http_t * /* O - HTTP connection */
|
||||
http_create(
|
||||
const char *host, /* I - Hostname */
|
||||
int port, /* I - Port number */
|
||||
http_addrlist_t *addrlist, /* I - Address list or NULL */
|
||||
http_addrlist_t *addrlist, /* I - Address list or @code NULL@ */
|
||||
int family, /* I - Address family or AF_UNSPEC */
|
||||
http_encryption_t encryption, /* I - Encryption to use */
|
||||
int blocking, /* I - 1 for blocking mode */
|
||||
@@ -4053,7 +4071,7 @@ http_read(http_t *http, /* I - HTTP connection */
|
||||
|
||||
DEBUG_printf(("http_read(http=%p, buffer=%p, length=" CUPS_LLFMT ")", (void *)http, (void *)buffer, CUPS_LLCAST length));
|
||||
|
||||
if (!http->blocking)
|
||||
if (!http->blocking || http->timeout_value > 0.0)
|
||||
{
|
||||
while (!httpWait(http, http->wait_value))
|
||||
{
|
||||
@@ -4648,7 +4666,7 @@ http_write(http_t *http, /* I - HTTP connection */
|
||||
{
|
||||
DEBUG_printf(("3http_write: About to write %d bytes.", (int)length));
|
||||
|
||||
if (http->timeout_cb)
|
||||
if (http->timeout_value > 0.0)
|
||||
{
|
||||
#ifdef HAVE_POLL
|
||||
struct pollfd pfd; /* Polled file descriptor */
|
||||
@@ -4692,7 +4710,7 @@ http_write(http_t *http, /* I - HTTP connection */
|
||||
http->error = errno;
|
||||
return (-1);
|
||||
}
|
||||
else if (nfds == 0 && !(*http->timeout_cb)(http, http->timeout_data))
|
||||
else if (nfds == 0 && (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data)))
|
||||
{
|
||||
#ifdef WIN32
|
||||
http->error = WSAEWOULDBLOCK;
|
||||
|
||||
+10
-6
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Hyper-Text Transport Protocol definitions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -109,7 +109,7 @@ extern "C" {
|
||||
* Types and structures...
|
||||
*/
|
||||
|
||||
typedef enum http_auth_e /**** HTTP authentication types ****/
|
||||
typedef enum http_auth_e /**** HTTP authentication types @exclude all@ ****/
|
||||
{
|
||||
HTTP_AUTH_NONE, /* No authentication in use */
|
||||
HTTP_AUTH_BASIC, /* Basic authentication in use */
|
||||
@@ -248,10 +248,11 @@ typedef enum http_status_e /**** HTTP status codes ****/
|
||||
|
||||
HTTP_STATUS_MULTIPLE_CHOICES = 300, /* Multiple files match request */
|
||||
HTTP_STATUS_MOVED_PERMANENTLY, /* Document has moved permanently */
|
||||
HTTP_STATUS_MOVED_TEMPORARILY, /* Document has moved temporarily */
|
||||
HTTP_STATUS_SEE_OTHER, /* See this other link... */
|
||||
HTTP_STATUS_FOUND, /* Document was found at a different URI */
|
||||
HTTP_STATUS_SEE_OTHER, /* See this other link */
|
||||
HTTP_STATUS_NOT_MODIFIED, /* File not modified */
|
||||
HTTP_STATUS_USE_PROXY, /* Must use a proxy to access this URI */
|
||||
HTTP_STATUS_TEMPORARY_REDIRECT = 307, /* Temporary redirection */
|
||||
|
||||
HTTP_STATUS_BAD_REQUEST = 400, /* Bad request */
|
||||
HTTP_STATUS_UNAUTHORIZED, /* Unauthorized to access host */
|
||||
@@ -285,6 +286,8 @@ typedef enum http_status_e /**** HTTP status codes ****/
|
||||
HTTP_STATUS_CUPS_PKI_ERROR, /* Error negotiating a secure connection @since CUPS 1.5/macOS 10.7@ */
|
||||
HTTP_STATUS_CUPS_WEBIF_DISABLED /* Web interface is disabled @private@ */
|
||||
|
||||
# define HTTP_STATUS_MOVED_TEMPORARILY HTTP_STATUS_FOUND /* Renamed in RFC 7231 */
|
||||
|
||||
# ifndef _CUPS_NO_DEPRECATED
|
||||
/* Old names for this enumeration */
|
||||
# define HTTP_ERROR HTTP_STATUS_ERROR
|
||||
@@ -393,7 +396,7 @@ typedef enum http_uri_coding_e /**** URI en/decode flags ****/
|
||||
HTTP_URI_CODING_RFC6874 = 16 /* Use RFC 6874 address format */
|
||||
} http_uri_coding_t;
|
||||
|
||||
typedef enum http_version_e /**** HTTP version numbers ****/
|
||||
typedef enum http_version_e /**** HTTP version numbers @exclude all@ ****/
|
||||
{
|
||||
HTTP_VERSION_0_9 = 9, /* HTTP/0.9 */
|
||||
HTTP_VERSION_1_0 = 100, /* HTTP/1.0 */
|
||||
@@ -427,6 +430,7 @@ typedef struct http_addrlist_s /**** Socket address list, which is
|
||||
**** used to enumerate all of the
|
||||
**** addresses that are associated
|
||||
**** with a hostname. @since CUPS 1.2/macOS 10.5@
|
||||
**** @exclude all@
|
||||
****/
|
||||
{
|
||||
struct http_addrlist_s *next; /* Pointer to next address in list */
|
||||
@@ -435,7 +439,7 @@ typedef struct http_addrlist_s /**** Socket address list, which is
|
||||
|
||||
typedef struct _http_s http_t; /**** HTTP connection type ****/
|
||||
|
||||
typedef struct http_credential_s /**** HTTP credential data @since CUPS 1.5/macOS 10.7@ ****/
|
||||
typedef struct http_credential_s /**** HTTP credential data @since CUPS 1.5/macOS 10.7@ @exclude all@ ****/
|
||||
{
|
||||
void *data; /* Pointer to credential data */
|
||||
size_t datalen; /* Credential length */
|
||||
|
||||
+99
-7
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Internet Printing Protocol support functions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
* Copyright © 2007-2018 by Apple Inc.
|
||||
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -897,12 +897,14 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"k-octets",
|
||||
"k-octets-processed",
|
||||
"last-document",
|
||||
"materials-col-actual", /* IPP 3D */
|
||||
"media-actual",
|
||||
"media-col-actual",
|
||||
"media-input-tray-check-actual",
|
||||
"media-sheets",
|
||||
"media-sheets-completed",
|
||||
"more-info",
|
||||
"multiple-object-handling-actual", /* IPP 3D */
|
||||
"number-up-actual",
|
||||
"orientation-requested-actual",
|
||||
"output-bin-actual",
|
||||
@@ -914,12 +916,17 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"pages",
|
||||
"pages-completed",
|
||||
"pages-completed-current-copy",
|
||||
"platform-temperature-actual", /* IPP 3D */
|
||||
"presentation-direction-number-up-actual",
|
||||
"print-accuracy-actual", /* IPP 3D */
|
||||
"print-base-actual", /* IPP 3D */
|
||||
"print-color-mode-actual",
|
||||
"print-content-optimize-actual",
|
||||
"print-objects-actual", /* IPP 3D */
|
||||
"print-quality-actual",
|
||||
"print-rendering-intent-actual",
|
||||
"print-scaling-actual", /* IPP Paid Printing */
|
||||
"print-supports-actual", /* IPP 3D */
|
||||
"printer-resolution-actual",
|
||||
"printer-up-time",
|
||||
"separator-sheets-actual",
|
||||
@@ -953,9 +960,12 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"feed-orientation-supported",
|
||||
"finishings",
|
||||
"finishings-col",
|
||||
"finishings-col-database",
|
||||
"finishings-col-default",
|
||||
"finishings-col-ready",
|
||||
"finishings-col-supported",
|
||||
"finishings-default",
|
||||
"finishings-ready",
|
||||
"finishings-supported",
|
||||
"font-name-requested",
|
||||
"font-name-requested-default",
|
||||
@@ -974,12 +984,27 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"insert-sheet",
|
||||
"insert-sheet-default",
|
||||
"insert-sheet-supported",
|
||||
"material-amount-units-supported", /* IPP 3D */
|
||||
"material-diameter-supported", /* IPP 3D */
|
||||
"material-purpose-supported", /* IPP 3D */
|
||||
"material-rate-supported", /* IPP 3D */
|
||||
"material-rate-units-supported", /* IPP 3D */
|
||||
"material-shell-thickness-supported",/* IPP 3D */
|
||||
"material-temperature-supported", /* IPP 3D */
|
||||
"material-type-supported", /* IPP 3D */
|
||||
"materials-col", /* IPP 3D */
|
||||
"materials-col-database", /* IPP 3D */
|
||||
"materials-col-default", /* IPP 3D */
|
||||
"materials-col-ready", /* IPP 3D */
|
||||
"materials-col-supported", /* IPP 3D */
|
||||
"max-materials-col-supported", /* IPP 3D */
|
||||
"max-stitching-locations-supported",
|
||||
"media",
|
||||
"media-back-coating-supported",
|
||||
"media-bottom-margin-supported",
|
||||
"media-col",
|
||||
"media-col-default",
|
||||
"media-col-ready",
|
||||
"media-col-supported",
|
||||
"media-color-supported",
|
||||
"media-default",
|
||||
@@ -994,6 +1019,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"media-left-margin-supported",
|
||||
"media-order-count-supported",
|
||||
"media-pre-printed-supported",
|
||||
"media-ready",
|
||||
"media-recycled-supported",
|
||||
"media-right-margin-supported",
|
||||
"media-size-supported",
|
||||
@@ -1006,6 +1032,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"multiple-document-handling",
|
||||
"multiple-document-handling-default",
|
||||
"multiple-document-handling-supported",
|
||||
"multiple-object-handling", /* IPP 3D */
|
||||
"multiple-object-handling-default", /* IPP 3D */
|
||||
"multiple-object-handling-supported",/* IPP 3D */
|
||||
"number-up",
|
||||
"number-up-default",
|
||||
"number-up-supported",
|
||||
@@ -1034,15 +1063,27 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"pdl-init-file-name-subdirectory-supported",
|
||||
"pdl-init-file-name-supported",
|
||||
"pdl-init-file-supported",
|
||||
"platform-temperature", /* IPP 3D */
|
||||
"platform-temperature-default", /* IPP 3D */
|
||||
"platform-temperature-supported", /* IPP 3D */
|
||||
"presentation-direction-number-up",
|
||||
"presentation-direction-number-up-default",
|
||||
"presentation-direction-number-up-supported",
|
||||
"print-accuracy", /* IPP 3D */
|
||||
"print-accuracy-default", /* IPP 3D */
|
||||
"print-accuracy-supported", /* IPP 3D */
|
||||
"print-base", /* IPP 3D */
|
||||
"print-base-default", /* IPP 3D */
|
||||
"print-base-supported", /* IPP 3D */
|
||||
"print-color-mode",
|
||||
"print-color-mode-default",
|
||||
"print-color-mode-supported",
|
||||
"print-content-optimize",
|
||||
"print-content-optimize-default",
|
||||
"print-content-optimize-supported",
|
||||
"print-objects", /* IPP 3D */
|
||||
"print-objects-default", /* IPP 3D */
|
||||
"print-objects-supported", /* IPP 3D */
|
||||
"print-quality",
|
||||
"print-quality-default",
|
||||
"print-quality-supported",
|
||||
@@ -1052,6 +1093,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"print-scaling", /* IPP Paid Printing */
|
||||
"print-scaling-default", /* IPP Paid Printing */
|
||||
"print-scaling-supported", /* IPP Paid Printing */
|
||||
"print-supports", /* IPP 3D */
|
||||
"print-supports-default", /* IPP 3D */
|
||||
"print-supports-supported", /* IPP 3D */
|
||||
"printer-resolution",
|
||||
"printer-resolution-default",
|
||||
"printer-resolution-supported",
|
||||
@@ -1166,10 +1210,12 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"job-state-reasons",
|
||||
"job-uri",
|
||||
"job-uuid",
|
||||
"materials-col-actual", /* IPP 3D */
|
||||
"media-actual",
|
||||
"media-col-actual",
|
||||
"media-check-input-tray-actual",
|
||||
"multiple-document-handling-actual",
|
||||
"multiple-object-handling-actual", /* IPP 3D */
|
||||
"number-of-documents",
|
||||
"number-of-intervening-jobs",
|
||||
"number-up-actual",
|
||||
@@ -1181,12 +1227,17 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"page-delivery-actual",
|
||||
"page-order-received-actual",
|
||||
"page-ranges-actual",
|
||||
"platform-temperature-actual", /* IPP 3D */
|
||||
"presentation-direction-number-up-actual",
|
||||
"print-accuracy-actual", /* IPP 3D */
|
||||
"print-base-actual", /* IPP 3D */
|
||||
"print-color-mode-actual",
|
||||
"print-content-optimize-actual",
|
||||
"print-objects-actual", /* IPP 3D */
|
||||
"print-quality-actual",
|
||||
"print-rendering-intent-actual",
|
||||
"print-scaling-actual", /* IPP Paid Printing */
|
||||
"print-supports-actual", /* IPP 3D */
|
||||
"printer-resolution-actual",
|
||||
"separator-sheets-actual",
|
||||
"sheet-collate-actual",
|
||||
@@ -1208,6 +1259,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
};
|
||||
static const char * const job_template[] =
|
||||
{ /* job-template group */
|
||||
"accuracy-units-supported", /* IPP 3D */
|
||||
"confirmation-sheet-print", /* IPP FaxOut */
|
||||
"confirmation-sheet-print-default",
|
||||
"copies",
|
||||
@@ -1230,9 +1282,12 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"feed-orientation-supported",
|
||||
"finishings",
|
||||
"finishings-col",
|
||||
"finishings-col-database",
|
||||
"finishings-col-default",
|
||||
"finishings-col-ready",
|
||||
"finishings-col-supported",
|
||||
"finishings-default",
|
||||
"finishings-ready",
|
||||
"finishings-supported",
|
||||
"font-name-requested",
|
||||
"font-name-requested-default",
|
||||
@@ -1315,6 +1370,20 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"job-sheets-default",
|
||||
"job-sheets-supported",
|
||||
"logo-uri-schemes-supported",
|
||||
"material-amount-units-supported", /* IPP 3D */
|
||||
"material-diameter-supported", /* IPP 3D */
|
||||
"material-purpose-supported", /* IPP 3D */
|
||||
"material-rate-supported", /* IPP 3D */
|
||||
"material-rate-units-supported", /* IPP 3D */
|
||||
"material-shell-thickness-supported",/* IPP 3D */
|
||||
"material-temperature-supported", /* IPP 3D */
|
||||
"material-type-supported", /* IPP 3D */
|
||||
"materials-col", /* IPP 3D */
|
||||
"materials-col-database", /* IPP 3D */
|
||||
"materials-col-default", /* IPP 3D */
|
||||
"materials-col-ready", /* IPP 3D */
|
||||
"materials-col-supported", /* IPP 3D */
|
||||
"max-materials-col-supported", /* IPP 3D */
|
||||
"max-save-info-supported",
|
||||
"max-stitching-locations-supported",
|
||||
"media",
|
||||
@@ -1322,6 +1391,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"media-bottom-margin-supported",
|
||||
"media-col",
|
||||
"media-col-default",
|
||||
"media-col-ready",
|
||||
"media-col-supported",
|
||||
"media-color-supported",
|
||||
"media-default",
|
||||
@@ -1336,6 +1406,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"media-left-margin-supported",
|
||||
"media-order-count-supported",
|
||||
"media-pre-printed-supported",
|
||||
"media-ready",
|
||||
"media-recycled-supported",
|
||||
"media-right-margin-supported",
|
||||
"media-size-supported",
|
||||
@@ -1348,6 +1419,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"multiple-document-handling",
|
||||
"multiple-document-handling-default",
|
||||
"multiple-document-handling-supported",
|
||||
"multiple-object-handling", /* IPP 3D */
|
||||
"multiple-object-handling-default", /* IPP 3D */
|
||||
"multiple-object-handling-supported",/* IPP 3D */
|
||||
"number-of-retries", /* IPP FaxOut */
|
||||
"number-of-retries-default",
|
||||
"number-of-retries-supported",
|
||||
@@ -1385,15 +1459,27 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"pdl-init-file-name-subdirectory-supported",
|
||||
"pdl-init-file-name-supported",
|
||||
"pdl-init-file-supported",
|
||||
"platform-temperature", /* IPP 3D */
|
||||
"platform-temperature-default", /* IPP 3D */
|
||||
"platform-temperature-supported", /* IPP 3D */
|
||||
"presentation-direction-number-up",
|
||||
"presentation-direction-number-up-default",
|
||||
"presentation-direction-number-up-supported",
|
||||
"print-accuracy", /* IPP 3D */
|
||||
"print-accuracy-default", /* IPP 3D */
|
||||
"print-accuracy-supported", /* IPP 3D */
|
||||
"print-base", /* IPP 3D */
|
||||
"print-base-default", /* IPP 3D */
|
||||
"print-base-supported", /* IPP 3D */
|
||||
"print-color-mode",
|
||||
"print-color-mode-default",
|
||||
"print-color-mode-supported",
|
||||
"print-content-optimize",
|
||||
"print-content-optimize-default",
|
||||
"print-content-optimize-supported",
|
||||
"print-objects", /* IPP 3D */
|
||||
"print-objects-default", /* IPP 3D */
|
||||
"print-objects-supported", /* IPP 3D */
|
||||
"print-quality",
|
||||
"print-quality-default",
|
||||
"print-quality-supported",
|
||||
@@ -1403,6 +1489,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"print-scaling", /* IPP Paid Printing */
|
||||
"print-scaling-default", /* IPP Paid Printing */
|
||||
"print-scaling-supported", /* IPP Paid Printing */
|
||||
"print-supports", /* IPP 3D */
|
||||
"print-supports-default", /* IPP 3D */
|
||||
"print-supports-supported", /* IPP 3D */
|
||||
"printer-resolution",
|
||||
"printer-resolution-default",
|
||||
"printer-resolution-supported",
|
||||
@@ -1503,10 +1592,12 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"job-page-limit", /* CUPS extension */
|
||||
"job-password-encryption-supported",
|
||||
"job-password-supported",
|
||||
"job-presets-supported", /* IPP Presets */
|
||||
"job-quota-period", /* CUPS extension */
|
||||
"job-resolvers-supported",
|
||||
"job-settable-attributes-supported",
|
||||
"job-spooling-supported",
|
||||
"job-triggers-supported", /* IPP Presets */
|
||||
"jpeg-k-octets-supported", /* CUPS extension */
|
||||
"jpeg-x-dimension-supported", /* CUPS extension */
|
||||
"jpeg-y-dimension-supported", /* CUPS extension */
|
||||
@@ -1520,8 +1611,6 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"marker-message", /* CUPS extension */
|
||||
"marker-names", /* CUPS extension */
|
||||
"marker-types", /* CUPS extension */
|
||||
"media-col-ready",
|
||||
"media-ready",
|
||||
"member-names", /* CUPS extension */
|
||||
"member-uris", /* CUPS extension */
|
||||
"multiple-destination-uris-supported",/* IPP FaxOut */
|
||||
@@ -1533,6 +1622,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"pages-per-minute",
|
||||
"pages-per-minute-color",
|
||||
"pdf-k-octets-supported", /* CUPS extension */
|
||||
"pdf-features-supported", /* IPP 3D */
|
||||
"pdf-versions-supported", /* CUPS extension */
|
||||
"pdl-override-supported",
|
||||
"port-monitor", /* CUPS extension */
|
||||
@@ -1543,6 +1633,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */
|
||||
"printer-charge-info",
|
||||
"printer-charge-info-uri",
|
||||
"printer-commands", /* CUPS extension */
|
||||
"printer-config-change-date-time",
|
||||
"printer-config-change-time",
|
||||
"printer-current-time",
|
||||
"printer-detailed-status-messages",
|
||||
"printer-device-id",
|
||||
@@ -2045,7 +2137,7 @@ ippOpString(ipp_op_t op) /* I - Operation ID */
|
||||
* See if the operation ID is a known value...
|
||||
*/
|
||||
|
||||
if (op >= IPP_OP_PRINT_JOB && op <= IPP_OP_VALIDATE_DOCUMENT)
|
||||
if (op >= IPP_OP_PRINT_JOB && op < (ipp_op_t)(sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0])))
|
||||
return (ipp_std_ops[op]);
|
||||
else if (op == IPP_OP_PRIVATE)
|
||||
return ("windows-ext");
|
||||
@@ -2163,7 +2255,7 @@ ippStateString(ipp_state_t state) /* I - State value */
|
||||
/*
|
||||
* 'ippTagString()' - Return the tag name corresponding to a tag value.
|
||||
*
|
||||
* The returned names are defined in RFC 2911 and 3382.
|
||||
* The returned names are defined in RFC 8011 and the IANA IPP Registry.
|
||||
*
|
||||
* @since CUPS 1.4/macOS 10.6@
|
||||
*/
|
||||
@@ -2183,7 +2275,7 @@ ippTagString(ipp_tag_t tag) /* I - Tag value */
|
||||
/*
|
||||
* 'ippTagValue()' - Return the tag value corresponding to a tag name.
|
||||
*
|
||||
* The tag names are defined in RFC 2911 and 3382.
|
||||
* The tag names are defined in RFC 8011 and the IANA IPP Registry.
|
||||
*
|
||||
* @since CUPS 1.4/macOS 10.6@
|
||||
*/
|
||||
|
||||
+146
-118
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Internet Printing Protocol functions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
* Copyright © 2007-2018 by Apple Inc.
|
||||
* Copyright © 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -316,7 +316,7 @@ ippAddCollections(
|
||||
|
||||
|
||||
/*
|
||||
* 'ippAddDate()' - Add a date attribute to an IPP message.
|
||||
* 'ippAddDate()' - Add a dateTime attribute to an IPP message.
|
||||
*
|
||||
* The @code ipp@ parameter refers to an IPP message previously created using
|
||||
* the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
|
||||
@@ -1380,7 +1380,7 @@ ippContainsInteger(
|
||||
* specified string value.
|
||||
*
|
||||
* Returns non-zero when the attribute contains a matching charset, keyword,
|
||||
* language, mimeMediaType, name, text, URI, or URI scheme value.
|
||||
* naturalLanguage, mimeMediaType, name, text, uri, or uriScheme value.
|
||||
*
|
||||
* @since CUPS 1.7/macOS 10.9@
|
||||
*/
|
||||
@@ -1509,6 +1509,16 @@ ippCopyAttribute(
|
||||
dstattr = ippAddSeparator(dst);
|
||||
break;
|
||||
|
||||
case IPP_TAG_UNSUPPORTED_VALUE :
|
||||
case IPP_TAG_DEFAULT :
|
||||
case IPP_TAG_UNKNOWN :
|
||||
case IPP_TAG_NOVALUE :
|
||||
case IPP_TAG_NOTSETTABLE :
|
||||
case IPP_TAG_DELETEATTR :
|
||||
case IPP_TAG_ADMINDEFINE :
|
||||
dstattr = ippAddOutOfBand(dst, srcattr->group_tag, srcattr->value_tag & ~IPP_TAG_CUPS_CONST, srcattr->name);
|
||||
break;
|
||||
|
||||
case IPP_TAG_INTEGER :
|
||||
case IPP_TAG_ENUM :
|
||||
dstattr = ippAddIntegers(dst, srcattr->group_tag, srcattr->value_tag,
|
||||
@@ -1759,12 +1769,12 @@ ippCopyAttributes(
|
||||
|
||||
|
||||
/*
|
||||
* 'ippDateToTime()' - Convert from RFC 1903 Date/Time format to UNIX time
|
||||
* in seconds.
|
||||
* 'ippDateToTime()' - Convert from RFC 2579 Date/Time format to time in
|
||||
* seconds.
|
||||
*/
|
||||
|
||||
time_t /* O - UNIX time value */
|
||||
ippDateToTime(const ipp_uchar_t *date) /* I - RFC 1903 date info */
|
||||
ippDateToTime(const ipp_uchar_t *date) /* I - RFC 2579 date info */
|
||||
{
|
||||
struct tm unixdate; /* UNIX date/time info */
|
||||
time_t t; /* Computed time */
|
||||
@@ -1776,7 +1786,7 @@ ippDateToTime(const ipp_uchar_t *date) /* I - RFC 1903 date info */
|
||||
memset(&unixdate, 0, sizeof(unixdate));
|
||||
|
||||
/*
|
||||
* RFC-1903 date/time format is:
|
||||
* RFC-2579 date/time format is:
|
||||
*
|
||||
* Byte(s) Description
|
||||
* ------- -----------
|
||||
@@ -1828,12 +1838,19 @@ ippDelete(ipp_t *ipp) /* I - IPP message */
|
||||
|
||||
ipp->use --;
|
||||
if (ipp->use > 0)
|
||||
{
|
||||
DEBUG_printf(("4debug_retain: %p IPP message (use=%d)", (void *)ipp, ipp->use));
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG_printf(("4debug_free: %p IPP message", (void *)ipp));
|
||||
|
||||
for (attr = ipp->attrs; attr != NULL; attr = next)
|
||||
{
|
||||
next = attr->next;
|
||||
|
||||
DEBUG_printf(("4debug_free: %p %s %s%s (%d values)", (void *)attr, attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), attr->num_values));
|
||||
|
||||
ipp_free_values(attr, 0, attr->num_values);
|
||||
|
||||
if (attr->name)
|
||||
@@ -1870,6 +1887,8 @@ ippDeleteAttribute(
|
||||
if (!attr)
|
||||
return;
|
||||
|
||||
DEBUG_printf(("4debug_free: %p %s %s%s (%d values)", (void *)attr, attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), attr->num_values));
|
||||
|
||||
/*
|
||||
* Find the attribute in the list...
|
||||
*/
|
||||
@@ -2152,7 +2171,7 @@ ippFirstAttribute(ipp_t *ipp) /* I - IPP message */
|
||||
* 'ippGetBoolean()' - Get a boolean value for an attribute.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to get from 0 to
|
||||
* @link ippGetCount(attr)@ - 1.
|
||||
* @code ippGetCount(attr)@ - 1.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -2181,7 +2200,7 @@ ippGetBoolean(ipp_attribute_t *attr, /* I - IPP attribute */
|
||||
* 'ippGetCollection()' - Get a collection value for an attribute.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to get from 0 to
|
||||
* @link ippGetCount(attr)@ - 1.
|
||||
* @code ippGetCount(attr)@ - 1.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -2232,15 +2251,15 @@ ippGetCount(ipp_attribute_t *attr) /* I - IPP attribute */
|
||||
|
||||
|
||||
/*
|
||||
* 'ippGetDate()' - Get a date value for an attribute.
|
||||
* 'ippGetDate()' - Get a dateTime value for an attribute.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to get from 0 to
|
||||
* @link ippGetCount(attr)@ - 1.
|
||||
* @code ippGetCount(attr)@ - 1.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
|
||||
const ipp_uchar_t * /* O - Date value or @code NULL@ */
|
||||
const ipp_uchar_t * /* O - dateTime value or @code NULL@ */
|
||||
ippGetDate(ipp_attribute_t *attr, /* I - IPP attribute */
|
||||
int element) /* I - Value number (0-based) */
|
||||
{
|
||||
@@ -2288,7 +2307,7 @@ ippGetGroupTag(ipp_attribute_t *attr) /* I - IPP attribute */
|
||||
* 'ippGetInteger()' - Get the integer/enum value for an attribute.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to get from 0 to
|
||||
* @link ippGetCount(attr)@ - 1.
|
||||
* @code ippGetCount(attr)@ - 1.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -2341,7 +2360,7 @@ ippGetName(ipp_attribute_t *attr) /* I - IPP attribute */
|
||||
* 'ippGetOctetString()' - Get an octetString value from an IPP attribute.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to get from 0 to
|
||||
* @link ippGetCount(attr)@ - 1.
|
||||
* @code ippGetCount(attr)@ - 1.
|
||||
*
|
||||
* @since CUPS 1.7/macOS 10.9@
|
||||
*/
|
||||
@@ -2404,7 +2423,7 @@ ippGetOperation(ipp_t *ipp) /* I - IPP request message */
|
||||
* 'ippGetRange()' - Get a rangeOfInteger value from an attribute.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to get from 0 to
|
||||
* @link ippGetCount(attr)@ - 1.
|
||||
* @code ippGetCount(attr)@ - 1.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -2466,7 +2485,7 @@ ippGetRequestId(ipp_t *ipp) /* I - IPP message */
|
||||
* 'ippGetResolution()' - Get a resolution value for an attribute.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to get from 0 to
|
||||
* @link ippGetCount(attr)@ - 1.
|
||||
* @code ippGetCount(attr)@ - 1.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -2560,7 +2579,7 @@ ippGetStatusCode(ipp_t *ipp) /* I - IPP response or event message */
|
||||
* 'ippGetString()' - Get the string and optionally the language code for an attribute.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to get from 0 to
|
||||
* @link ippGetCount(attr)@ - 1.
|
||||
* @code ippGetCount(attr)@ - 1.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -2570,13 +2589,16 @@ ippGetString(ipp_attribute_t *attr, /* I - IPP attribute */
|
||||
int element, /* I - Value number (0-based) */
|
||||
const char **language)/* O - Language code (@code NULL@ for don't care) */
|
||||
{
|
||||
ipp_tag_t tag; /* Value tag */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!attr || element < 0 || element >= attr->num_values ||
|
||||
(attr->value_tag != IPP_TAG_TEXTLANG && attr->value_tag != IPP_TAG_NAMELANG &&
|
||||
(attr->value_tag < IPP_TAG_TEXT || attr->value_tag > IPP_TAG_MIMETYPE)))
|
||||
tag = ippGetValueTag(attr);
|
||||
|
||||
if (!attr || element < 0 || element >= attr->num_values || (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG && (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE)))
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
@@ -2622,7 +2644,7 @@ ippGetValueTag(ipp_attribute_t *attr) /* I - IPP attribute */
|
||||
|
||||
int /* O - Major version number or 0 on error */
|
||||
ippGetVersion(ipp_t *ipp, /* I - IPP message */
|
||||
int *minor) /* O - Minor version number or @code NULL@ */
|
||||
int *minor) /* O - Minor version number or @code NULL@ for don't care */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
@@ -2702,6 +2724,8 @@ ippNew(void)
|
||||
* Set default version - usually 2.0...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("4debug_alloc: %p IPP message", (void *)temp));
|
||||
|
||||
if (cg->server_version == 0)
|
||||
_cupsSetDefaults();
|
||||
|
||||
@@ -2719,9 +2743,9 @@ ippNew(void)
|
||||
/*
|
||||
* 'ippNewRequest()' - Allocate a new IPP request message.
|
||||
*
|
||||
* 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.
|
||||
* 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.
|
||||
*
|
||||
* @since CUPS 1.2/macOS 10.5@
|
||||
*/
|
||||
@@ -2783,11 +2807,11 @@ ippNewRequest(ipp_op_t op) /* I - Operation code */
|
||||
/*
|
||||
* 'ippNewResponse()' - Allocate a new IPP response message.
|
||||
*
|
||||
* The new response message is initialized with the same version-number,
|
||||
* request-id, attributes-charset, and attributes-natural-language as the
|
||||
* provided request message. If the attributes-charset or
|
||||
* attributes-natural-language attributes are missing from the request,
|
||||
* "utf-8" and a value derived from the current locale are substituted,
|
||||
* The new response message is initialized with the same "version-number",
|
||||
* "request-id", "attributes-charset", and "attributes-natural-language" as the
|
||||
* provided request message. If the "attributes-charset" or
|
||||
* "attributes-natural-language" attributes are missing from the request,
|
||||
* 'utf-8' and a value derived from the current locale are substituted,
|
||||
* respectively.
|
||||
*
|
||||
* @since CUPS 1.7/macOS 10.9@
|
||||
@@ -3065,6 +3089,13 @@ ippReadIO(void *src, /* I - Data source */
|
||||
ipp->state = IPP_STATE_DATA;
|
||||
break;
|
||||
}
|
||||
else if (tag == IPP_TAG_ZERO || (tag == IPP_TAG_OPERATION && ipp->curtag != IPP_TAG_ZERO))
|
||||
{
|
||||
_cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1);
|
||||
DEBUG_printf(("1ippReadIO: bad tag 0x%02x.", tag));
|
||||
_cupsBufferRelease((char *)buffer);
|
||||
return (IPP_STATE_ERROR);
|
||||
}
|
||||
else if (tag < IPP_TAG_UNSUPPORTED_VALUE)
|
||||
{
|
||||
/*
|
||||
@@ -3703,7 +3734,7 @@ ippReadIO(void *src, /* I - Data source */
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -3745,7 +3776,7 @@ ippSetBoolean(ipp_t *ipp, /* I - IPP message */
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -3786,7 +3817,7 @@ ippSetCollection(
|
||||
|
||||
|
||||
/*
|
||||
* 'ippSetDate()' - Set a date value in an attribute.
|
||||
* 'ippSetDate()' - Set a dateTime value in an attribute.
|
||||
*
|
||||
* The @code ipp@ parameter refers to an IPP message previously created using
|
||||
* the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
|
||||
@@ -3794,7 +3825,7 @@ ippSetCollection(
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -3803,7 +3834,7 @@ int /* O - 1 on success, 0 on failure */
|
||||
ippSetDate(ipp_t *ipp, /* I - IPP message */
|
||||
ipp_attribute_t **attr, /* IO - IPP attribute */
|
||||
int element, /* I - Value number (0-based) */
|
||||
const ipp_uchar_t *datevalue)/* I - Date value */
|
||||
const ipp_uchar_t *datevalue)/* I - dateTime value */
|
||||
{
|
||||
_ipp_value_t *value; /* Current value */
|
||||
|
||||
@@ -3851,7 +3882,7 @@ ippSetGroupTag(
|
||||
ipp_tag_t group_tag) /* I - Group tag */
|
||||
{
|
||||
/*
|
||||
* Range check input - group tag must be 0x01 to 0x0F, per RFC 2911...
|
||||
* Range check input - group tag must be 0x01 to 0x0F, per RFC 8011...
|
||||
*/
|
||||
|
||||
if (!ipp || !attr || !*attr ||
|
||||
@@ -3878,7 +3909,7 @@ ippSetGroupTag(
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -3963,7 +3994,7 @@ ippSetName(ipp_t *ipp, /* I - IPP message */
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* @since CUPS 1.7/macOS 10.9@
|
||||
*/
|
||||
@@ -4081,7 +4112,7 @@ ippSetOperation(ipp_t *ipp, /* I - IPP request message */
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -4161,7 +4192,7 @@ ippSetRequestId(ipp_t *ipp, /* I - IPP message */
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -4269,7 +4300,7 @@ ippSetStatusCode(ipp_t *ipp, /* I - IPP response or event message */
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* @since CUPS 1.6/macOS 10.8@
|
||||
*/
|
||||
@@ -4282,18 +4313,22 @@ ippSetString(ipp_t *ipp, /* I - IPP message */
|
||||
{
|
||||
char *temp; /* Temporary string */
|
||||
_ipp_value_t *value; /* Current value */
|
||||
ipp_tag_t value_tag; /* Value tag */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (attr && *attr)
|
||||
value_tag = (*attr)->value_tag & IPP_TAG_CUPS_MASK;
|
||||
else
|
||||
value_tag = IPP_TAG_ZERO;
|
||||
|
||||
if (!ipp || !attr || !*attr ||
|
||||
((*attr)->value_tag != IPP_TAG_TEXTLANG &&
|
||||
(*attr)->value_tag != IPP_TAG_NAMELANG &&
|
||||
((*attr)->value_tag < IPP_TAG_TEXT ||
|
||||
(*attr)->value_tag > IPP_TAG_MIMETYPE)) ||
|
||||
element < 0 || element > (*attr)->num_values || !strvalue)
|
||||
(value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG &&
|
||||
value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE ||
|
||||
!strvalue)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
@@ -4331,7 +4366,7 @@ ippSetString(ipp_t *ipp, /* I - IPP message */
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* The @code format@ parameter uses formatting characters compatible with the
|
||||
* printf family of standard functions. Additional arguments follow it as
|
||||
@@ -4369,7 +4404,7 @@ ippSetStringf(ipp_t *ipp, /* I - IPP message */
|
||||
* The @code attr@ parameter may be modified as a result of setting the value.
|
||||
*
|
||||
* The @code element@ parameter specifies which value to set from 0 to
|
||||
* @link ippGetCount(attr)@.
|
||||
* @code ippGetCount(attr)@.
|
||||
*
|
||||
* The @code format@ parameter uses formatting characters compatible with the
|
||||
* printf family of standard functions. Additional arguments follow it as
|
||||
@@ -4712,19 +4747,19 @@ ippSetVersion(ipp_t *ipp, /* I - IPP message */
|
||||
|
||||
|
||||
/*
|
||||
* 'ippTimeToDate()' - Convert from UNIX time to RFC 1903 format.
|
||||
* 'ippTimeToDate()' - Convert from time in seconds to RFC 2579 format.
|
||||
*/
|
||||
|
||||
const ipp_uchar_t * /* O - RFC-1903 date/time data */
|
||||
ippTimeToDate(time_t t) /* I - UNIX time value */
|
||||
const ipp_uchar_t * /* O - RFC-2579 date/time data */
|
||||
ippTimeToDate(time_t t) /* I - Time in seconds */
|
||||
{
|
||||
struct tm *unixdate; /* UNIX unixdate/time info */
|
||||
ipp_uchar_t *date = _cupsGlobals()->ipp_date;
|
||||
/* RFC-1903 date/time data */
|
||||
/* RFC-2579 date/time data */
|
||||
|
||||
|
||||
/*
|
||||
* RFC-1903 date/time format is:
|
||||
* RFC-2579 date/time format is:
|
||||
*
|
||||
* Byte(s) Description
|
||||
* ------- -----------
|
||||
@@ -4764,7 +4799,7 @@ ippTimeToDate(time_t t) /* I - UNIX time value */
|
||||
*
|
||||
* 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.
|
||||
* failure, @link cupsLastErrorString@ is set to a human-readable message.
|
||||
*
|
||||
* @since CUPS 1.7/macOS 10.9@
|
||||
*/
|
||||
@@ -4784,21 +4819,6 @@ ippValidateAttribute(
|
||||
ipp_attribute_t *colattr; /* Collection attribute */
|
||||
regex_t re; /* Regular expression */
|
||||
ipp_uchar_t *date; /* Current date value */
|
||||
static const char * const uri_status_strings[] =
|
||||
{ /* URI status strings */
|
||||
"URI too large",
|
||||
"Bad arguments to function",
|
||||
"Bad resource in URI",
|
||||
"Bad port number in URI",
|
||||
"Bad hostname/address in URI",
|
||||
"Bad username in URI",
|
||||
"Bad scheme in URI",
|
||||
"Bad/empty URI",
|
||||
"OK",
|
||||
"Missing scheme in URI",
|
||||
"Unknown scheme in URI",
|
||||
"Missing resource in URI"
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
@@ -4820,7 +4840,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad attribute name - invalid character "
|
||||
"(RFC 2911 section 4.1.3)."), attr->name);
|
||||
"(RFC 8011 section 5.1.4)."), attr->name);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4828,7 +4848,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad attribute name - bad length %d "
|
||||
"(RFC 2911 section 4.1.3)."), attr->name,
|
||||
"(RFC 8011 section 5.1.4)."), attr->name,
|
||||
(int)(ptr - attr->name));
|
||||
return (0);
|
||||
}
|
||||
@@ -4846,7 +4866,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad boolen value %d "
|
||||
"(RFC 2911 section 4.1.11)."), attr->name,
|
||||
"(RFC 8011 section 5.1.21)."), attr->name,
|
||||
attr->values[i].boolean);
|
||||
return (0);
|
||||
}
|
||||
@@ -4860,7 +4880,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad enum value %d - out of range "
|
||||
"(RFC 2911 section 4.1.4)."), attr->name,
|
||||
"(RFC 8011 section 5.1.5)."), attr->name,
|
||||
attr->values[i].integer);
|
||||
return (0);
|
||||
}
|
||||
@@ -4874,7 +4894,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad octetString value - bad length %d "
|
||||
"(RFC 2911 section 4.1.10)."), attr->name,
|
||||
"(RFC 8011 section 5.1.20)."), attr->name,
|
||||
attr->values[i].unknown.length);
|
||||
return (0);
|
||||
}
|
||||
@@ -4890,7 +4910,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime month %u "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[2]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[2]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4898,7 +4918,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime day %u "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[3]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[3]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4906,7 +4926,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime hours %u "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[4]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[4]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4914,7 +4934,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime minutes %u "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[5]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[5]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4922,7 +4942,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime seconds %u "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[6]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[6]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4930,7 +4950,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime deciseconds %u "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[7]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[7]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4938,7 +4958,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime UTC sign '%c' "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[8]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[8]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4946,7 +4966,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime UTC hours %u "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[9]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[9]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -4954,7 +4974,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad dateTime UTC minutes %u "
|
||||
"(RFC 2911 section 4.1.14)."), attr->name, date[10]);
|
||||
"(RFC 8011 section 5.1.15)."), attr->name, date[10]);
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
@@ -4968,7 +4988,7 @@ ippValidateAttribute(
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad resolution value %dx%d%s - cross "
|
||||
"feed resolution must be positive "
|
||||
"(RFC 2911 section 4.1.15)."), attr->name,
|
||||
"(RFC 8011 section 5.1.16)."), attr->name,
|
||||
attr->values[i].resolution.xres,
|
||||
attr->values[i].resolution.yres,
|
||||
attr->values[i].resolution.units ==
|
||||
@@ -4983,7 +5003,7 @@ ippValidateAttribute(
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad resolution value %dx%d%s - feed "
|
||||
"resolution must be positive "
|
||||
"(RFC 2911 section 4.1.15)."), attr->name,
|
||||
"(RFC 8011 section 5.1.16)."), attr->name,
|
||||
attr->values[i].resolution.xres,
|
||||
attr->values[i].resolution.yres,
|
||||
attr->values[i].resolution.units ==
|
||||
@@ -4998,7 +5018,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad resolution value %dx%d%s - bad "
|
||||
"units value (RFC 2911 section 4.1.15)."),
|
||||
"units value (RFC 8011 section 5.1.16)."),
|
||||
attr->name, attr->values[i].resolution.xres,
|
||||
attr->values[i].resolution.yres,
|
||||
attr->values[i].resolution.units ==
|
||||
@@ -5017,7 +5037,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad rangeOfInteger value %d-%d - lower "
|
||||
"greater than upper (RFC 2911 section 4.1.13)."),
|
||||
"greater than upper (RFC 8011 section 5.1.14)."),
|
||||
attr->name, attr->values[i].range.lower,
|
||||
attr->values[i].range.upper);
|
||||
return (0);
|
||||
@@ -5073,14 +5093,18 @@ ippValidateAttribute(
|
||||
}
|
||||
else if (*ptr & 0x80)
|
||||
break;
|
||||
else if ((*ptr < ' ' && *ptr != '\n' && *ptr != '\r' && *ptr != '\t') || *ptr == 0x7f)
|
||||
break;
|
||||
}
|
||||
|
||||
if (*ptr)
|
||||
if (*ptr < ' ' || *ptr == 0x7f)
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad text value \"%s\" - bad UTF-8 "
|
||||
"sequence (RFC 2911 section 4.1.1)."), attr->name,
|
||||
attr->values[i].string.text);
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section 8.3)."), attr->name, attr->values[i].string.text);
|
||||
return (0);
|
||||
}
|
||||
else if (*ptr)
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)."), attr->name, attr->values[i].string.text);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -5088,7 +5112,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad text value \"%s\" - bad length %d "
|
||||
"(RFC 2911 section 4.1.1)."), attr->name,
|
||||
"(RFC 8011 section 5.1.2)."), attr->name,
|
||||
attr->values[i].string.text,
|
||||
(int)(ptr - attr->values[i].string.text));
|
||||
return (0);
|
||||
@@ -5131,14 +5155,18 @@ ippValidateAttribute(
|
||||
}
|
||||
else if (*ptr & 0x80)
|
||||
break;
|
||||
else if (*ptr < ' ' || *ptr == 0x7f)
|
||||
break;
|
||||
}
|
||||
|
||||
if (*ptr)
|
||||
if (*ptr < ' ' || *ptr == 0x7f)
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad name value \"%s\" - bad UTF-8 "
|
||||
"sequence (RFC 2911 section 4.1.2)."), attr->name,
|
||||
attr->values[i].string.text);
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section 8.1)."), attr->name, attr->values[i].string.text);
|
||||
return (0);
|
||||
}
|
||||
else if (*ptr)
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)."), attr->name, attr->values[i].string.text);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -5146,7 +5174,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad name value \"%s\" - bad length %d "
|
||||
"(RFC 2911 section 4.1.2)."), attr->name,
|
||||
"(RFC 8011 section 5.1.3)."), attr->name,
|
||||
attr->values[i].string.text,
|
||||
(int)(ptr - attr->values[i].string.text));
|
||||
return (0);
|
||||
@@ -5166,7 +5194,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad keyword value \"%s\" - invalid "
|
||||
"character (RFC 2911 section 4.1.3)."),
|
||||
"character (RFC 8011 section 5.1.4)."),
|
||||
attr->name, attr->values[i].string.text);
|
||||
return (0);
|
||||
}
|
||||
@@ -5175,7 +5203,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad keyword value \"%s\" - bad "
|
||||
"length %d (RFC 2911 section 4.1.3)."),
|
||||
"length %d (RFC 8011 section 5.1.4)."),
|
||||
attr->name, attr->values[i].string.text,
|
||||
(int)(ptr - attr->values[i].string.text));
|
||||
return (0);
|
||||
@@ -5195,12 +5223,7 @@ ippValidateAttribute(
|
||||
|
||||
if (uri_status < HTTP_URI_STATUS_OK)
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad URI value \"%s\" - %s "
|
||||
"(RFC 2911 section 4.1.5)."), attr->name,
|
||||
attr->values[i].string.text,
|
||||
uri_status_strings[uri_status -
|
||||
HTTP_URI_STATUS_OVERFLOW]);
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)."), attr->name, attr->values[i].string.text, httpURIStatusString(uri_status));
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -5208,7 +5231,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad URI value \"%s\" - bad length %d "
|
||||
"(RFC 2911 section 4.1.5)."), attr->name,
|
||||
"(RFC 8011 section 5.1.6)."), attr->name,
|
||||
attr->values[i].string.text,
|
||||
(int)strlen(attr->values[i].string.text));
|
||||
}
|
||||
@@ -5231,7 +5254,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad uriScheme value \"%s\" - bad "
|
||||
"characters (RFC 2911 section 4.1.6)."),
|
||||
"characters (RFC 8011 section 5.1.7)."),
|
||||
attr->name, attr->values[i].string.text);
|
||||
return (0);
|
||||
}
|
||||
@@ -5240,7 +5263,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad uriScheme value \"%s\" - bad "
|
||||
"length %d (RFC 2911 section 4.1.6)."),
|
||||
"length %d (RFC 8011 section 5.1.7)."),
|
||||
attr->name, attr->values[i].string.text,
|
||||
(int)(ptr - attr->values[i].string.text));
|
||||
return (0);
|
||||
@@ -5260,7 +5283,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad charset value \"%s\" - bad "
|
||||
"characters (RFC 2911 section 4.1.7)."),
|
||||
"characters (RFC 8011 section 5.1.8)."),
|
||||
attr->name, attr->values[i].string.text);
|
||||
return (0);
|
||||
}
|
||||
@@ -5269,7 +5292,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad charset value \"%s\" - bad "
|
||||
"length %d (RFC 2911 section 4.1.7)."),
|
||||
"length %d (RFC 8011 section 5.1.8)."),
|
||||
attr->name, attr->values[i].string.text,
|
||||
(int)(ptr - attr->values[i].string.text));
|
||||
return (0);
|
||||
@@ -5315,7 +5338,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad naturalLanguage value \"%s\" - bad "
|
||||
"characters (RFC 2911 section 4.1.8)."),
|
||||
"characters (RFC 8011 section 5.1.9)."),
|
||||
attr->name, attr->values[i].string.text);
|
||||
regfree(&re);
|
||||
return (0);
|
||||
@@ -5325,7 +5348,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad naturalLanguage value \"%s\" - bad "
|
||||
"length %d (RFC 2911 section 4.1.8)."),
|
||||
"length %d (RFC 8011 section 5.1.9)."),
|
||||
attr->name, attr->values[i].string.text,
|
||||
(int)strlen(attr->values[i].string.text));
|
||||
regfree(&re);
|
||||
@@ -5369,7 +5392,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad mimeMediaType value \"%s\" - bad "
|
||||
"characters (RFC 2911 section 4.1.9)."),
|
||||
"characters (RFC 8011 section 5.1.10)."),
|
||||
attr->name, attr->values[i].string.text);
|
||||
regfree(&re);
|
||||
return (0);
|
||||
@@ -5379,7 +5402,7 @@ ippValidateAttribute(
|
||||
{
|
||||
ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
|
||||
_("\"%s\": Bad mimeMediaType value \"%s\" - bad "
|
||||
"length %d (RFC 2911 section 4.1.9)."),
|
||||
"length %d (RFC 8011 section 5.1.10)."),
|
||||
attr->name, attr->values[i].string.text,
|
||||
(int)strlen(attr->values[i].string.text));
|
||||
regfree(&re);
|
||||
@@ -5402,8 +5425,8 @@ ippValidateAttribute(
|
||||
* 'ippValidateAttributes()' - Validate all attributes in an IPP message.
|
||||
*
|
||||
* This function validates the contents of the IPP message, including each
|
||||
* attribute. Like @link ippValidateAttribute@, cupsLastErrorString() is set
|
||||
* to a human-readable message on failure.
|
||||
* attribute. Like @link ippValidateAttribute@, @link cupsLastErrorString@ is
|
||||
* set to a human-readable message on failure.
|
||||
*
|
||||
* @since CUPS 1.7/macOS 10.9@
|
||||
*/
|
||||
@@ -6399,6 +6422,8 @@ ipp_add_attr(ipp_t *ipp, /* I - IPP message */
|
||||
* Initialize attribute...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("4debug_alloc: %p %s %s%s (%d values)", (void *)attr, name, num_values > 1 ? "1setOf " : "", ippTagString(value_tag), num_values));
|
||||
|
||||
if (name)
|
||||
attr->name = _cupsStrAlloc(name);
|
||||
|
||||
@@ -6955,6 +6980,9 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */
|
||||
* Reset pointers in the list...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("4debug_free: %p %s", (void *)*attr, temp->name));
|
||||
DEBUG_printf(("4debug_alloc: %p %s %s%s (%d)", (void *)temp, temp->name, temp->num_values > 1 ? "1setOf " : "", ippTagString(temp->value_tag), temp->num_values));
|
||||
|
||||
if (ipp->current == *attr && ipp->prev)
|
||||
{
|
||||
/*
|
||||
|
||||
+142
-141
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Internet Printing Protocol definitions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2006 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -77,13 +77,13 @@ extern "C" {
|
||||
* Types and structures...
|
||||
*/
|
||||
|
||||
typedef enum ipp_dstate_e /**** Document states ****/
|
||||
typedef enum ipp_dstate_e /**** Document states @exclude all@ ****/
|
||||
{
|
||||
IPP_DOCUMENT_PENDING = 3, /* Document is pending */
|
||||
IPP_DOCUMENT_PROCESSING = 5, /* Document is processing */
|
||||
IPP_DOCUMENT_CANCELED = 7, /* Document is canceled */
|
||||
IPP_DOCUMENT_ABORTED, /* Document is aborted */
|
||||
IPP_DOCUMENT_COMPLETED /* Document is completed */
|
||||
IPP_DSTATE_PENDING = 3, /* Document is pending */
|
||||
IPP_DSTATE_PROCESSING = 5, /* Document is processing */
|
||||
IPP_DSTATE_CANCELED = 7, /* Document is canceled */
|
||||
IPP_DSTATE_ABORTED, /* Document is aborted */
|
||||
IPP_DSTATE_COMPLETED /* Document is completed */
|
||||
|
||||
# ifndef _CUPS_NO_DEPRECATED
|
||||
# define IPP_DOCUMENT_PENDING IPP_DSTATE_PENDING
|
||||
@@ -94,10 +94,10 @@ typedef enum ipp_dstate_e /**** Document states ****/
|
||||
# endif /* !_CUPS_NO_DEPRECATED */
|
||||
} ipp_dstate_t;
|
||||
|
||||
typedef enum ipp_finishings_e /**** Finishings ****/
|
||||
typedef enum ipp_finishings_e /**** Finishings values ****/
|
||||
{
|
||||
IPP_FINISHINGS_NONE = 3, /* No finishing */
|
||||
IPP_FINISHINGS_STAPLE, /* Staple (any location) */
|
||||
IPP_FINISHINGS_STAPLE, /* Staple (any location/method) */
|
||||
IPP_FINISHINGS_PUNCH, /* Punch (any location/count) */
|
||||
IPP_FINISHINGS_COVER, /* Add cover */
|
||||
IPP_FINISHINGS_BIND, /* Bind */
|
||||
@@ -169,38 +169,38 @@ typedef enum ipp_finishings_e /**** Finishings ****/
|
||||
|
||||
/* CUPS extensions for finishings (pre-standard versions of values above) */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT = 0x40000046,
|
||||
/* Punch 1 hole top left */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT,/* Punch 1 hole bottom left */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right */
|
||||
/* Punch 1 hole top left @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT,/* Punch 1 hole bottom left @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_RIGHT,
|
||||
/* Punch 1 hole bottom right */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP, /* Punch 2 holes top edge */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT, /* Punch 2 holes right side */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM,/* Punch 2 holes bottom edge */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT,/* Punch 3 holes left side */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP, /* Punch 3 holes top edge */
|
||||
/* Punch 1 hole bottom right @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP, /* Punch 2 holes top edge @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT, /* Punch 2 holes right side @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM,/* Punch 2 holes bottom edge @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT,/* Punch 3 holes left side @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP, /* Punch 3 holes top edge @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_RIGHT,
|
||||
/* Punch 3 holes right side */
|
||||
/* Punch 3 holes right side @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_BOTTOM,
|
||||
/* Punch 3 holes bottom edge */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP, /* Punch 4 holes top edge */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT, /* Punch 4 holes right side */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM,/* Punch 4 holes bottom edge */
|
||||
/* Punch 3 holes bottom edge @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP, /* Punch 4 holes top edge @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT, /* Punch 4 holes right side @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM,/* Punch 4 holes bottom edge @exclude all@ */
|
||||
|
||||
IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN = 0x4000005A,
|
||||
/* Accordian-fold the paper vertically into four sections */
|
||||
IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE, /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically */
|
||||
IPP_FINISHINGS_CUPS_FOLD_GATE, /* Fold the top and bottom quarters of the paper towards the midline */
|
||||
IPP_FINISHINGS_CUPS_FOLD_HALF, /* Fold the paper in half vertically */
|
||||
IPP_FINISHINGS_CUPS_FOLD_HALF_Z, /* Fold the paper in half horizontally, then Z-fold the paper vertically */
|
||||
IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE, /* Fold the top quarter of the paper towards the midline */
|
||||
IPP_FINISHINGS_CUPS_FOLD_LETTER, /* Fold the paper into three sections vertically; sometimes also known as a C fold*/
|
||||
IPP_FINISHINGS_CUPS_FOLD_PARALLEL, /* Fold the paper in half vertically two times, yielding four sections */
|
||||
IPP_FINISHINGS_CUPS_FOLD_POSTER, /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold */
|
||||
IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline */
|
||||
IPP_FINISHINGS_CUPS_FOLD_Z /* Fold the paper vertically into three sections, forming a Z */
|
||||
/* Accordian-fold the paper vertically into four sections @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE, /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_GATE, /* Fold the top and bottom quarters of the paper towards the midline @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_HALF, /* Fold the paper in half vertically @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_HALF_Z, /* Fold the paper in half horizontally, then Z-fold the paper vertically @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE, /* Fold the top quarter of the paper towards the midline @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_LETTER, /* Fold the paper into three sections vertically; sometimes also known as a C fold @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_PARALLEL, /* Fold the paper in half vertically two times, yielding four sections @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_POSTER, /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline @exclude all@ */
|
||||
IPP_FINISHINGS_CUPS_FOLD_Z /* Fold the paper vertically into three sections, forming a Z @exclude all@ */
|
||||
} ipp_finishings_t;
|
||||
# ifndef _CUPS_NO_DEPRECATED
|
||||
# define IPP_FINISHINGS_JOB_OFFSET IPP_FINISHINGS_JOG_OFFSET
|
||||
@@ -208,7 +208,7 @@ typedef enum ipp_finishings_e /**** Finishings ****/
|
||||
typedef enum ipp_finishings_e ipp_finish_t;
|
||||
# endif /* !_CUPS_NO_DEPRECATED */
|
||||
|
||||
typedef enum ipp_jcollate_e /**** Job collation types ****/
|
||||
typedef enum ipp_jcollate_e /**** Job collation types @deprecated@ @exclude all@ ****/
|
||||
{
|
||||
IPP_JCOLLATE_UNCOLLATED_SHEETS = 3,
|
||||
IPP_JCOLLATE_COLLATED_DOCUMENTS,
|
||||
@@ -248,98 +248,98 @@ typedef enum ipp_op_e /**** IPP operations ****/
|
||||
{
|
||||
IPP_OP_CUPS_INVALID = -1, /* Invalid operation name for @link ippOpValue@ */
|
||||
IPP_OP_CUPS_NONE = 0, /* No operation @private@ */
|
||||
IPP_OP_PRINT_JOB = 0x0002, /* Print a single file */
|
||||
IPP_OP_PRINT_URI, /* Print a single URL */
|
||||
IPP_OP_VALIDATE_JOB, /* Validate job options */
|
||||
IPP_OP_CREATE_JOB, /* Create an empty print job */
|
||||
IPP_OP_SEND_DOCUMENT, /* Add a file to a job */
|
||||
IPP_OP_SEND_URI, /* Add a URL to a job */
|
||||
IPP_OP_CANCEL_JOB, /* Cancel a job */
|
||||
IPP_OP_GET_JOB_ATTRIBUTES, /* Get job attributes */
|
||||
IPP_OP_GET_JOBS, /* Get a list of jobs */
|
||||
IPP_OP_GET_PRINTER_ATTRIBUTES, /* Get printer attributes */
|
||||
IPP_OP_HOLD_JOB, /* Hold a job for printing */
|
||||
IPP_OP_RELEASE_JOB, /* Release a job for printing */
|
||||
IPP_OP_RESTART_JOB, /* Reprint a job */
|
||||
IPP_OP_PAUSE_PRINTER = 0x0010, /* Stop a printer */
|
||||
IPP_OP_RESUME_PRINTER, /* Start a printer */
|
||||
IPP_OP_PURGE_JOBS, /* Cancel all jobs */
|
||||
IPP_OP_SET_PRINTER_ATTRIBUTES, /* Set printer attributes */
|
||||
IPP_OP_SET_JOB_ATTRIBUTES, /* Set job attributes */
|
||||
IPP_OP_GET_PRINTER_SUPPORTED_VALUES, /* Get supported attribute values */
|
||||
IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS, /* Create one or more printer subscriptions @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_CREATE_JOB_SUBSCRIPTIONS, /* Create one of more job subscriptions @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES, /* Get subscription attributes @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_GET_SUBSCRIPTIONS, /* Get list of subscriptions @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_RENEW_SUBSCRIPTION, /* Renew a printer subscription @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_CANCEL_SUBSCRIPTION, /* Cancel a subscription @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_GET_NOTIFICATIONS, /* Get notification events @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_SEND_NOTIFICATIONS, /* Send notification events @private@ */
|
||||
IPP_OP_GET_RESOURCE_ATTRIBUTES, /* Get resource attributes @private@ */
|
||||
IPP_OP_GET_RESOURCE_DATA, /* Get resource data @private@ */
|
||||
IPP_OP_GET_RESOURCES, /* Get list of resources @private@ */
|
||||
IPP_OP_GET_PRINT_SUPPORT_FILES, /* Get printer support files @private@ */
|
||||
IPP_OP_ENABLE_PRINTER, /* Start a printer */
|
||||
IPP_OP_DISABLE_PRINTER, /* Stop a printer */
|
||||
IPP_OP_PRINT_JOB = 0x0002, /* Print-Job: Print a single file */
|
||||
IPP_OP_PRINT_URI, /* Print-URI: Print a single URL @exclude all@ */
|
||||
IPP_OP_VALIDATE_JOB, /* Validate-Job: Validate job values prior to submission */
|
||||
IPP_OP_CREATE_JOB, /* Create-Job: Create an empty print job */
|
||||
IPP_OP_SEND_DOCUMENT, /* Send-Document: Add a file to a job */
|
||||
IPP_OP_SEND_URI, /* Send-URI: Add a URL to a job @exclude all@ */
|
||||
IPP_OP_CANCEL_JOB, /* Cancel-Job: Cancel a job */
|
||||
IPP_OP_GET_JOB_ATTRIBUTES, /* Get-Job-Attribute: Get information about a job */
|
||||
IPP_OP_GET_JOBS, /* Get-Jobs: Get a list of jobs */
|
||||
IPP_OP_GET_PRINTER_ATTRIBUTES, /* Get-Printer-Attributes: Get information about a printer */
|
||||
IPP_OP_HOLD_JOB, /* Hold-Job: Hold a job for printing */
|
||||
IPP_OP_RELEASE_JOB, /* Release-Job: Release a job for printing */
|
||||
IPP_OP_RESTART_JOB, /* Restart-Job: Reprint a job @deprecated@ */
|
||||
IPP_OP_PAUSE_PRINTER = 0x0010, /* Pause-Printer: Stop a printer */
|
||||
IPP_OP_RESUME_PRINTER, /* Resume-Printer: Start a printer */
|
||||
IPP_OP_PURGE_JOBS, /* Purge-Jobs: Delete all jobs @deprecated@ @exclude all@ */
|
||||
IPP_OP_SET_PRINTER_ATTRIBUTES, /* Set-Printer-Attributes: Set printer values */
|
||||
IPP_OP_SET_JOB_ATTRIBUTES, /* Set-Job-Attributes: Set job values */
|
||||
IPP_OP_GET_PRINTER_SUPPORTED_VALUES, /* Get-Printer-Supported-Values: Get supported values */
|
||||
IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS, /* Create-Printer-Subscriptions: Create one or more printer subscriptions @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_CREATE_JOB_SUBSCRIPTIONS, /* Create-Job-Subscriptions: Create one of more job subscriptions @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES, /* Get-Subscription-Attributes: Get subscription information @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_GET_SUBSCRIPTIONS, /* Get-Subscriptions: Get list of subscriptions @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_RENEW_SUBSCRIPTION, /* Renew-Subscription: Renew a printer subscription @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_CANCEL_SUBSCRIPTION, /* Cancel-Subscription: Cancel a subscription @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_GET_NOTIFICATIONS, /* Get-Notifications: Get notification events @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_SEND_NOTIFICATIONS, /* Send-Notifications: Send notification events @private@ */
|
||||
IPP_OP_GET_RESOURCE_ATTRIBUTES, /* Get-Resource-Attributes: Get resource information @private@ */
|
||||
IPP_OP_GET_RESOURCE_DATA, /* Get-Resource-Data: Get resource data @private@ @deprecated@ */
|
||||
IPP_OP_GET_RESOURCES, /* Get-Resources: Get list of resources @private@ */
|
||||
IPP_OP_GET_PRINT_SUPPORT_FILES, /* Get-Printer-Support-Files: Get printer support files @private@ */
|
||||
IPP_OP_ENABLE_PRINTER, /* Enable-Printer: Accept new jobs for a printer */
|
||||
IPP_OP_DISABLE_PRINTER, /* Disable-Printer: Reject new jobs for a printer */
|
||||
IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB,
|
||||
/* Stop printer after the current job */
|
||||
IPP_OP_HOLD_NEW_JOBS, /* Hold new jobs */
|
||||
IPP_OP_RELEASE_HELD_NEW_JOBS, /* Release new jobs */
|
||||
IPP_OP_DEACTIVATE_PRINTER, /* Stop a printer */
|
||||
IPP_OP_ACTIVATE_PRINTER, /* Start a printer */
|
||||
IPP_OP_RESTART_PRINTER, /* Restart a printer */
|
||||
IPP_OP_SHUTDOWN_PRINTER, /* Turn a printer off */
|
||||
IPP_OP_STARTUP_PRINTER, /* Turn a printer on */
|
||||
IPP_OP_REPROCESS_JOB, /* Reprint a job */
|
||||
IPP_OP_CANCEL_CURRENT_JOB, /* Cancel the current job */
|
||||
IPP_OP_SUSPEND_CURRENT_JOB, /* Suspend the current job */
|
||||
IPP_OP_RESUME_JOB, /* Resume the current job */
|
||||
IPP_OP_PROMOTE_JOB, /* Promote a job to print sooner */
|
||||
IPP_OP_SCHEDULE_JOB_AFTER, /* Schedule a job to print after another */
|
||||
IPP_OP_CANCEL_DOCUMENT = 0x0033, /* Cancel-Document */
|
||||
IPP_OP_GET_DOCUMENT_ATTRIBUTES, /* Get-Document-Attributes */
|
||||
IPP_OP_GET_DOCUMENTS, /* Get-Documents */
|
||||
IPP_OP_DELETE_DOCUMENT, /* Delete-Document */
|
||||
IPP_OP_SET_DOCUMENT_ATTRIBUTES, /* Set-Document-Attributes */
|
||||
IPP_OP_CANCEL_JOBS, /* Cancel-Jobs */
|
||||
IPP_OP_CANCEL_MY_JOBS, /* Cancel-My-Jobs */
|
||||
IPP_OP_RESUBMIT_JOB, /* Resubmit-Job */
|
||||
IPP_OP_CLOSE_JOB, /* Close-Job */
|
||||
IPP_OP_IDENTIFY_PRINTER, /* Identify-Printer */
|
||||
IPP_OP_VALIDATE_DOCUMENT, /* Validate-Document */
|
||||
IPP_OP_ADD_DOCUMENT_IMAGES, /* Add-Document-Images */
|
||||
IPP_OP_ACKNOWLEDGE_DOCUMENT, /* Acknowledge-Document */
|
||||
IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER, /* Acknowledge-Identify-Printer */
|
||||
IPP_OP_ACKNOWLEDGE_JOB, /* Acknowledge-Job */
|
||||
IPP_OP_FETCH_DOCUMENT, /* Fetch-Document */
|
||||
IPP_OP_FETCH_JOB, /* Fetch-Job */
|
||||
IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES, /* Get-Output-Device-Attributes */
|
||||
IPP_OP_UPDATE_ACTIVE_JOBS, /* Update-Active-Jobs */
|
||||
IPP_OP_DEREGISTER_OUTPUT_DEVICE, /* Deregister-Output-Device */
|
||||
IPP_OP_UPDATE_DOCUMENT_STATUS, /* Update-Document-Status */
|
||||
IPP_OP_UPDATE_JOB_STATUS, /* Update-Job-Status */
|
||||
/* Pause-Printer-After-Current-Job: Stop printer after the current job */
|
||||
IPP_OP_HOLD_NEW_JOBS, /* Hold-New-Jobs: Hold new jobs */
|
||||
IPP_OP_RELEASE_HELD_NEW_JOBS, /* Release-Held-New-Jobs: Release new jobs that were previously held */
|
||||
IPP_OP_DEACTIVATE_PRINTER, /* Deactivate-Printer: Stop a printer and do not accept jobs @deprecated@ @exclude all@ */
|
||||
IPP_OP_ACTIVATE_PRINTER, /* Activate-Printer: Start a printer and accept jobs @deprecated@ @exclude all@ */
|
||||
IPP_OP_RESTART_PRINTER, /* Restart-Printer: Restart a printer @exclude all@ */
|
||||
IPP_OP_SHUTDOWN_PRINTER, /* Shutdown-Printer: Turn a printer off @exclude all@ */
|
||||
IPP_OP_STARTUP_PRINTER, /* Startup-Printer: Turn a printer on @exclude all@ */
|
||||
IPP_OP_REPROCESS_JOB, /* Reprocess-Job: Reprint a job @deprecated@ @exclude all@*/
|
||||
IPP_OP_CANCEL_CURRENT_JOB, /* Cancel-Current-Job: Cancel the current job */
|
||||
IPP_OP_SUSPEND_CURRENT_JOB, /* Suspend-Current-Job: Suspend the current job */
|
||||
IPP_OP_RESUME_JOB, /* Resume-Job: Resume the current job */
|
||||
IPP_OP_PROMOTE_JOB, /* Promote-Job: Promote a job to print sooner */
|
||||
IPP_OP_SCHEDULE_JOB_AFTER, /* Schedule-Job-After: Schedule a job to print after another */
|
||||
IPP_OP_CANCEL_DOCUMENT = 0x0033, /* Cancel-Document: Cancel a document @exclude all@ */
|
||||
IPP_OP_GET_DOCUMENT_ATTRIBUTES, /* Get-Document-Attributes: Get document information @exclude all@ */
|
||||
IPP_OP_GET_DOCUMENTS, /* Get-Documents: Get a list of documents in a job @exclude all@ */
|
||||
IPP_OP_DELETE_DOCUMENT, /* Delete-Document: Delete a document @deprecated@ @exclude all@ */
|
||||
IPP_OP_SET_DOCUMENT_ATTRIBUTES, /* Set-Document-Attributes: Set document values @exclude all@ */
|
||||
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_RESUBMIT_JOB, /* Resubmit-Job: Copy and reprint a job @exclude all@ */
|
||||
IPP_OP_CLOSE_JOB, /* Close-Job: Close a job and start printing */
|
||||
IPP_OP_IDENTIFY_PRINTER, /* Identify-Printer: Make the printer beep, flash, or display a message for identification */
|
||||
IPP_OP_VALIDATE_DOCUMENT, /* Validate-Document: Validate document values prior to submission @exclude all@ */
|
||||
IPP_OP_ADD_DOCUMENT_IMAGES, /* Add-Document-Images: Add image(s) from the specified scanner source @exclude all@ */
|
||||
IPP_OP_ACKNOWLEDGE_DOCUMENT, /* Acknowledge-Document: Acknowledge processing of a document @exclude all@ */
|
||||
IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER, /* Acknowledge-Identify-Printer: Acknowledge action on an Identify-Printer request @exclude all@ */
|
||||
IPP_OP_ACKNOWLEDGE_JOB, /* Acknowledge-Job: Acknowledge processing of a job @exclude all@ */
|
||||
IPP_OP_FETCH_DOCUMENT, /* Fetch-Document: Fetch a document for processing @exclude all@ */
|
||||
IPP_OP_FETCH_JOB, /* Fetch-Job: Fetch a job for processing @exclude all@ */
|
||||
IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES, /* Get-Output-Device-Attributes: Get printer information for a specific output device @exclude all@ */
|
||||
IPP_OP_UPDATE_ACTIVE_JOBS, /* Update-Active-Jobs: Update the list of active jobs that a proxy has processed @exclude all@ */
|
||||
IPP_OP_DEREGISTER_OUTPUT_DEVICE, /* Deregister-Output-Device: Remove an output device @exclude all@ */
|
||||
IPP_OP_UPDATE_DOCUMENT_STATUS, /* Update-Document-Status: Update document values @exclude all@ */
|
||||
IPP_OP_UPDATE_JOB_STATUS, /* Update-Job-Status: Update job values @exclude all@ */
|
||||
IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES,
|
||||
/* Update-Output-Device-Attributes */
|
||||
IPP_OP_GET_NEXT_DOCUMENT_DATA, /* Get-Next-Document-Data */
|
||||
/* Update-Output-Device-Attributes: Update output device values @exclude all@ */
|
||||
IPP_OP_GET_NEXT_DOCUMENT_DATA, /* Get-Next-Document-Data: Scan more document data @exclude all@ */
|
||||
|
||||
IPP_OP_PRIVATE = 0x4000, /* Reserved @private@ */
|
||||
IPP_OP_CUPS_GET_DEFAULT, /* Get the default printer */
|
||||
IPP_OP_CUPS_GET_PRINTERS, /* Get a list of printers and/or classes */
|
||||
IPP_OP_CUPS_ADD_MODIFY_PRINTER, /* Add or modify a printer */
|
||||
IPP_OP_CUPS_DELETE_PRINTER, /* Delete a printer */
|
||||
IPP_OP_CUPS_GET_CLASSES, /* Get a list of classes @deprecated@ */
|
||||
IPP_OP_CUPS_ADD_MODIFY_CLASS, /* Add or modify a class */
|
||||
IPP_OP_CUPS_DELETE_CLASS, /* Delete a class */
|
||||
IPP_OP_CUPS_ACCEPT_JOBS, /* Accept new jobs on a printer */
|
||||
IPP_OP_CUPS_REJECT_JOBS, /* Reject new jobs on a printer */
|
||||
IPP_OP_CUPS_SET_DEFAULT, /* Set the default printer */
|
||||
IPP_OP_CUPS_GET_DEVICES, /* Get a list of supported devices @deprecated@ */
|
||||
IPP_OP_CUPS_GET_PPDS, /* Get a list of supported drivers @deprecated@ */
|
||||
IPP_OP_CUPS_MOVE_JOB, /* Move a job to a different printer */
|
||||
IPP_OP_CUPS_AUTHENTICATE_JOB, /* Authenticate a job @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_CUPS_GET_PPD, /* Get a PPD file @deprecated@ */
|
||||
IPP_OP_CUPS_GET_DOCUMENT = 0x4027, /* Get a document file @since CUPS 1.4/macOS 10.6@ */
|
||||
IPP_OP_CUPS_CREATE_LOCAL_PRINTER /* Create a local (temporary) printer @since CUPS 2.2 */
|
||||
IPP_OP_CUPS_GET_DEFAULT, /* CUPS-Get-Default: Get the default printer */
|
||||
IPP_OP_CUPS_GET_PRINTERS, /* CUPS-Get-Printers: Get a list of printers and/or classes */
|
||||
IPP_OP_CUPS_ADD_MODIFY_PRINTER, /* CUPS-Add-Modify-Printer: Add or modify a printer */
|
||||
IPP_OP_CUPS_DELETE_PRINTER, /* CUPS-Delete-Printer: Delete a printer */
|
||||
IPP_OP_CUPS_GET_CLASSES, /* CUPS-Get-Classes: Get a list of classes @deprecated@ @exclude all@ */
|
||||
IPP_OP_CUPS_ADD_MODIFY_CLASS, /* CUPS-Add-Modify-Class: Add or modify a class */
|
||||
IPP_OP_CUPS_DELETE_CLASS, /* CUPS-Delete-Class: Delete a class */
|
||||
IPP_OP_CUPS_ACCEPT_JOBS, /* CUPS-Accept-Jobs: Accept new jobs on a printer @exclude all@ */
|
||||
IPP_OP_CUPS_REJECT_JOBS, /* CUPS-Reject-Jobs: Reject new jobs on a printer @exclude all@ */
|
||||
IPP_OP_CUPS_SET_DEFAULT, /* CUPS-Set-Default: Set the default printer */
|
||||
IPP_OP_CUPS_GET_DEVICES, /* CUPS-Get-Devices: Get a list of supported devices @deprecated@ */
|
||||
IPP_OP_CUPS_GET_PPDS, /* CUPS-Get-PPDs: Get a list of supported drivers @deprecated@ */
|
||||
IPP_OP_CUPS_MOVE_JOB, /* CUPS-Move-Job: Move a job to a different printer */
|
||||
IPP_OP_CUPS_AUTHENTICATE_JOB, /* CUPS-Authenticate-Job: Authenticate a job @since CUPS 1.2/macOS 10.5@ */
|
||||
IPP_OP_CUPS_GET_PPD, /* CUPS-Get-PPD: Get a PPD file @deprecated@ */
|
||||
IPP_OP_CUPS_GET_DOCUMENT = 0x4027, /* CUPS-Get-Document: Get a document file @since CUPS 1.4/macOS 10.6@ */
|
||||
IPP_OP_CUPS_CREATE_LOCAL_PRINTER /* CUPS-Create-Local-Printer: Create a local (temporary) printer @since CUPS 2.2@ */
|
||||
|
||||
# ifndef _CUPS_NO_DEPRECATED
|
||||
# define IPP_PRINT_JOB IPP_OP_PRINT_JOB
|
||||
@@ -364,7 +364,7 @@ typedef enum ipp_op_e /**** IPP operations ****/
|
||||
# define IPP_CREATE_PRINTER_SUBSCRIPTION IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS
|
||||
# define IPP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS
|
||||
# define IPP_OP_CREATE_PRINTER_SUBSCRIPTION IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS
|
||||
# define IPP_OP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS
|
||||
# define IPP_OP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS
|
||||
# define IPP_GET_SUBSCRIPTION_ATTRIBUTES IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES
|
||||
# define IPP_GET_SUBSCRIPTIONS IPP_OP_GET_SUBSCRIPTIONS
|
||||
# define IPP_RENEW_SUBSCRIPTION IPP_OP_RENEW_SUBSCRIPTION
|
||||
@@ -442,7 +442,7 @@ typedef enum ipp_orient_e /**** Orientation values ****/
|
||||
# endif /* !_CUPS_NO_DEPRECATED */
|
||||
} ipp_orient_t;
|
||||
|
||||
typedef enum ipp_pstate_e /**** Printer states ****/
|
||||
typedef enum ipp_pstate_e /**** Printer state values ****/
|
||||
{
|
||||
IPP_PSTATE_IDLE = 3, /* Printer is idle */
|
||||
IPP_PSTATE_PROCESSING, /* Printer is working */
|
||||
@@ -455,7 +455,7 @@ typedef enum ipp_pstate_e /**** Printer states ****/
|
||||
# endif /* _CUPS_NO_DEPRECATED */
|
||||
} ipp_pstate_t;
|
||||
|
||||
typedef enum ipp_quality_e /**** Qualities ****/
|
||||
typedef enum ipp_quality_e /**** Print quality values ****/
|
||||
{
|
||||
IPP_QUALITY_DRAFT = 3, /* Draft quality */
|
||||
IPP_QUALITY_NORMAL, /* Normal quality */
|
||||
@@ -468,7 +468,7 @@ typedef enum ipp_res_e /**** Resolution units ****/
|
||||
IPP_RES_PER_CM /* Pixels per centimeter */
|
||||
} ipp_res_t;
|
||||
|
||||
typedef enum ipp_state_e /**** IPP states ****/
|
||||
typedef enum ipp_state_e /**** ipp_t state values ****/
|
||||
{
|
||||
IPP_STATE_ERROR = -1, /* An error occurred */
|
||||
IPP_STATE_IDLE, /* Nothing is happening/request completed */
|
||||
@@ -485,7 +485,7 @@ typedef enum ipp_state_e /**** IPP states ****/
|
||||
# endif /* !_CUPS_NO_DEPRECATED */
|
||||
} ipp_state_t;
|
||||
|
||||
typedef enum ipp_status_e /**** IPP status codes ****/
|
||||
typedef enum ipp_status_e /**** IPP status code values ****/
|
||||
{
|
||||
IPP_STATUS_CUPS_INVALID = -1, /* Invalid status name for @link ippErrorValue@ */
|
||||
IPP_STATUS_OK = 0x0000, /* successful-ok */
|
||||
@@ -498,7 +498,7 @@ typedef enum ipp_status_e /**** IPP status codes ****/
|
||||
IPP_STATUS_OK_EVENTS_COMPLETE, /* successful-ok-events-complete */
|
||||
IPP_STATUS_REDIRECTION_OTHER_SITE = 0x0200,
|
||||
/* redirection-other-site @private@ */
|
||||
IPP_STATUS_CUPS_SEE_OTHER = 0x0280, /* cups-see-other */
|
||||
IPP_STATUS_CUPS_SEE_OTHER = 0x0280, /* cups-see-other @private@ */
|
||||
IPP_STATUS_ERROR_BAD_REQUEST = 0x0400,/* client-error-bad-request */
|
||||
IPP_STATUS_ERROR_FORBIDDEN, /* client-error-forbidden */
|
||||
IPP_STATUS_ERROR_NOT_AUTHENTICATED, /* client-error-not-authenticated */
|
||||
@@ -574,7 +574,7 @@ typedef enum ipp_status_e /**** IPP status codes ****/
|
||||
IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED = 0x1000,
|
||||
/* cups-authentication-canceled - Authentication canceled by user @since CUPS 1.5/macOS 10.7@ */
|
||||
IPP_STATUS_ERROR_CUPS_PKI, /* cups-pki-error - Error negotiating a secure connection @since CUPS 1.5/macOS 10.7@ */
|
||||
IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED/* cups-upgrade-required - TLS upgrade required */
|
||||
IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED/* cups-upgrade-required - TLS upgrade required @since CUPS 1.5/macOS 10.7@ */
|
||||
|
||||
# ifndef _CUPS_NO_DEPRECATED
|
||||
# define IPP_OK IPP_STATUS_OK
|
||||
@@ -636,7 +636,7 @@ typedef enum ipp_status_e /**** IPP status codes ****/
|
||||
# endif /* _CUPS_NO_DEPRECATED */
|
||||
} ipp_status_t;
|
||||
|
||||
typedef enum ipp_tag_e /**** Format tags for attributes ****/
|
||||
typedef enum ipp_tag_e /**** Value and group tag values for attributes ****/
|
||||
{
|
||||
IPP_TAG_CUPS_INVALID = -1, /* Invalid tag name for @link ippTagValue@ */
|
||||
IPP_TAG_ZERO = 0x00, /* Zero tag - used for separators */
|
||||
@@ -648,7 +648,7 @@ typedef enum ipp_tag_e /**** Format tags for attributes ****/
|
||||
IPP_TAG_SUBSCRIPTION, /* Subscription group */
|
||||
IPP_TAG_EVENT_NOTIFICATION, /* Event group */
|
||||
IPP_TAG_RESOURCE, /* Resource group @private@ */
|
||||
IPP_TAG_DOCUMENT, /* Document group */
|
||||
IPP_TAG_DOCUMENT, /* Document group @exclude all@ */
|
||||
IPP_TAG_UNSUPPORTED_VALUE = 0x10, /* Unsupported value */
|
||||
IPP_TAG_DEFAULT, /* Default value */
|
||||
IPP_TAG_UNKNOWN, /* Unknown value */
|
||||
@@ -663,10 +663,10 @@ typedef enum ipp_tag_e /**** Format tags for attributes ****/
|
||||
IPP_TAG_DATE, /* Date/time value */
|
||||
IPP_TAG_RESOLUTION, /* Resolution value */
|
||||
IPP_TAG_RANGE, /* Range value */
|
||||
IPP_TAG_BEGIN_COLLECTION, /* Beginning of collection value */
|
||||
IPP_TAG_BEGIN_COLLECTION, /* Beginning of collection value @exclude all@ */
|
||||
IPP_TAG_TEXTLANG, /* Text-with-language value */
|
||||
IPP_TAG_NAMELANG, /* Name-with-language value */
|
||||
IPP_TAG_END_COLLECTION, /* End of collection value */
|
||||
IPP_TAG_END_COLLECTION, /* End of collection value @exclude all@ */
|
||||
IPP_TAG_TEXT = 0x41, /* Text value */
|
||||
IPP_TAG_NAME, /* Name value */
|
||||
IPP_TAG_RESERVED_STRING, /* Reserved for future string value @private@ */
|
||||
@@ -676,8 +676,8 @@ typedef enum ipp_tag_e /**** Format tags for attributes ****/
|
||||
IPP_TAG_CHARSET, /* Character set value */
|
||||
IPP_TAG_LANGUAGE, /* Language value */
|
||||
IPP_TAG_MIMETYPE, /* MIME media type value */
|
||||
IPP_TAG_MEMBERNAME, /* Collection member name value */
|
||||
IPP_TAG_EXTENSION = 0x7f, /* Extension point for 32-bit tags */
|
||||
IPP_TAG_MEMBERNAME, /* Collection member name value @exclude all@ */
|
||||
IPP_TAG_EXTENSION = 0x7f, /* Extension point for 32-bit tags @exclude all@ */
|
||||
IPP_TAG_CUPS_MASK = 0x7fffffff, /* Mask for copied attribute values @private@ */
|
||||
/* The following expression is used to avoid compiler warnings with +/-0x80000000 */
|
||||
IPP_TAG_CUPS_CONST = -0x7fffffff-1 /* Bitflag for copied/const attribute values @private@ */
|
||||
@@ -688,17 +688,18 @@ typedef enum ipp_tag_e /**** Format tags for attributes ****/
|
||||
# endif /* !_CUPS_NO_DEPRECATED */
|
||||
} ipp_tag_t;
|
||||
|
||||
typedef unsigned char ipp_uchar_t; /**** Unsigned 8-bit integer/character ****/
|
||||
typedef unsigned char ipp_uchar_t; /**** Unsigned 8-bit integer/character @exclude all@ ****/
|
||||
typedef struct _ipp_s ipp_t; /**** IPP request/response data ****/
|
||||
typedef struct _ipp_attribute_s ipp_attribute_t;
|
||||
/**** IPP attribute ****/
|
||||
|
||||
/**** New in CUPS 1.2/macOS 10.5 ****/
|
||||
typedef ssize_t (*ipp_iocb_t)(void *context, ipp_uchar_t *buffer, size_t bytes);
|
||||
/**** IPP IO Callback Function @since CUPS 1.2/macOS 10.5@ ****/
|
||||
/**** ippReadIO/ippWriteIO callback function @since CUPS 1.2/macOS 10.5@ ****/
|
||||
|
||||
/**** New in CUPS 1.6/macOS 10.8 ****/
|
||||
typedef int (*ipp_copycb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr);
|
||||
/**** ippCopyAttributes callback function @since CUPS 1.6/macOS 10.8 ****/
|
||||
|
||||
|
||||
/*
|
||||
@@ -805,7 +806,7 @@ typedef union _ipp_value_u /**** Attribute Value ****/
|
||||
} _ipp_value_t;
|
||||
typedef _ipp_value_t ipp_value_t; /**** Convenience typedef that will be removed @private@ ****/
|
||||
|
||||
struct _ipp_attribute_s /**** Attribute ****/
|
||||
struct _ipp_attribute_s /**** IPP attribute ****/
|
||||
{
|
||||
ipp_attribute_t *next; /* Next attribute in list */
|
||||
ipp_tag_t group_tag, /* Job/Printer/Operation group tag */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Private localization support for CUPS.
|
||||
*
|
||||
* Copyright 2007-2010 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2006 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -22,6 +22,9 @@
|
||||
|
||||
# include <stdio.h>
|
||||
# include <cups/transcode.h>
|
||||
# ifdef __APPLE__
|
||||
# include <CoreFoundation/CoreFoundation.h>
|
||||
# endif /* __APPLE__ */
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -51,8 +54,8 @@ typedef struct _cups_message_s /**** Message catalog entry ****/
|
||||
*/
|
||||
|
||||
# ifdef __APPLE__
|
||||
extern const char *_cupsAppleLanguage(const char *locale, char *language,
|
||||
size_t langsize);
|
||||
extern const char *_cupsAppleLanguage(const char *locale, char *language, size_t langsize);
|
||||
extern const char *_cupsAppleLocale(CFStringRef languageName, char *locale, size_t localesize);
|
||||
# endif /* __APPLE__ */
|
||||
extern void _cupsCharmapFlush(void);
|
||||
extern const char *_cupsEncodingName(cups_encoding_t encoding);
|
||||
|
||||
+144
-54
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* I18N/language support for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -118,11 +118,15 @@ typedef struct
|
||||
} _apple_language_locale_t;
|
||||
|
||||
static const _apple_language_locale_t apple_language_locale[] =
|
||||
{ /* Locale to language ID LUT */
|
||||
{ "en", "en_US" },
|
||||
{ "nb", "no" },
|
||||
{ "zh-Hans", "zh_CN" },
|
||||
{ "zh-Hant", "zh_TW" }
|
||||
{ /* Language to locale ID LUT */
|
||||
{ "en", "en_US" },
|
||||
{ "nb", "no" },
|
||||
{ "nb_NO", "no" },
|
||||
{ "zh-Hans", "zh_CN" },
|
||||
{ "zh_HANS", "zh_CN" },
|
||||
{ "zh-Hant", "zh_TW" },
|
||||
{ "zh_HANT", "zh_TW" },
|
||||
{ "zh-Hant_CN", "zh_TW" }
|
||||
};
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
@@ -239,6 +243,96 @@ _cupsAppleLanguage(const char *locale, /* I - Locale ID */
|
||||
|
||||
return (language);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '_cupsAppleLocale()' - Get the locale associated with an Apple language ID.
|
||||
*/
|
||||
|
||||
const char * /* O - Locale */
|
||||
_cupsAppleLocale(CFStringRef languageName, /* I - Apple language ID */
|
||||
char *locale, /* I - Buffer for locale */
|
||||
size_t localesize) /* I - Size of buffer */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
CFStringRef localeName; /* Locale as a CF string */
|
||||
#ifdef DEBUG
|
||||
char temp[1024]; /* Temporary string */
|
||||
|
||||
|
||||
if (!CFStringGetCString(languageName, temp, (CFIndex)sizeof(temp), kCFStringEncodingASCII))
|
||||
temp[0] = '\0';
|
||||
|
||||
DEBUG_printf(("_cupsAppleLocale(languageName=%p(%s), locale=%p, localsize=%d)", (void *)languageName, temp, (void *)locale, (int)localesize));
|
||||
#endif /* DEBUG */
|
||||
|
||||
localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(kCFAllocatorDefault, languageName);
|
||||
|
||||
if (localeName)
|
||||
{
|
||||
/*
|
||||
* Copy the locale name and tweak as needed...
|
||||
*/
|
||||
|
||||
if (!CFStringGetCString(localeName, locale, (CFIndex)localesize, kCFStringEncodingASCII))
|
||||
*locale = '\0';
|
||||
|
||||
DEBUG_printf(("_cupsAppleLocale: locale=\"%s\"", locale));
|
||||
|
||||
CFRelease(localeName);
|
||||
|
||||
/*
|
||||
* Map new language identifiers to locales...
|
||||
*/
|
||||
|
||||
for (i = 0;
|
||||
i < (int)(sizeof(apple_language_locale) /
|
||||
sizeof(apple_language_locale[0]));
|
||||
i ++)
|
||||
{
|
||||
size_t len = strlen(apple_language_locale[i].language);
|
||||
|
||||
if (!strcmp(locale, apple_language_locale[i].language) ||
|
||||
(!strncmp(locale, apple_language_locale[i].language, len) && (locale[len] == '_' || locale[len] == '-')))
|
||||
{
|
||||
DEBUG_printf(("_cupsAppleLocale: Updating locale to \"%s\".", apple_language_locale[i].locale));
|
||||
strlcpy(locale, apple_language_locale[i].locale, localesize);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Just try the Apple language name...
|
||||
*/
|
||||
|
||||
if (!CFStringGetCString(languageName, locale, (CFIndex)localesize, kCFStringEncodingASCII))
|
||||
*locale = '\0';
|
||||
}
|
||||
|
||||
if (!*locale)
|
||||
{
|
||||
DEBUG_puts("_cupsAppleLocale: Returning NULL.");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert language subtag into region subtag...
|
||||
*/
|
||||
|
||||
if (locale[2] == '-')
|
||||
locale[2] = '_';
|
||||
else if (locale[3] == '-')
|
||||
locale[3] = '_';
|
||||
|
||||
if (!strchr(locale, '.'))
|
||||
strlcat(locale, ".UTF-8", localesize);
|
||||
|
||||
DEBUG_printf(("_cupsAppleLocale: Returning \"%s\".", locale));
|
||||
|
||||
return (locale);
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
|
||||
@@ -598,6 +692,15 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
*ptr++ = (char)toupper(*language & 255);
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
/*
|
||||
* Map Chinese region codes to legacy country codes.
|
||||
*/
|
||||
|
||||
if (!strcmp(language, "zh") && !strcmp(country, "HANS"))
|
||||
strlcpy(country, "CN", sizeof(country));
|
||||
if (!strcmp(language, "zh") && !strcmp(country, "HANT"))
|
||||
strlcpy(country, "TW", sizeof(country));
|
||||
}
|
||||
|
||||
if (*language == '.' && !charset[0])
|
||||
@@ -617,7 +720,7 @@ cupsLangGet(const char *language) /* I - Language or locale */
|
||||
* Force a POSIX locale for an invalid language name...
|
||||
*/
|
||||
|
||||
if (strlen(langname) != 2)
|
||||
if (strlen(langname) != 2 && strlen(langname) != 3)
|
||||
{
|
||||
strlcpy(langname, "C", sizeof(langname));
|
||||
country[0] = '\0';
|
||||
@@ -757,6 +860,9 @@ _cupsLangString(cups_lang_t *lang, /* I - Language */
|
||||
{
|
||||
const char *s; /* Localized message */
|
||||
|
||||
|
||||
DEBUG_printf(("_cupsLangString(lang=%p, message=\"%s\")", (void *)lang, message));
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
@@ -1055,6 +1161,8 @@ _cupsMessageLookup(cups_array_t *a, /* I - Message array */
|
||||
*match; /* Matching message */
|
||||
|
||||
|
||||
DEBUG_printf(("_cupsMessageLookup(a=%p, m=\"%s\")", (void *)a, m));
|
||||
|
||||
/*
|
||||
* Lookup the message string; if it doesn't exist in the catalog,
|
||||
* then return the message that was passed to us...
|
||||
@@ -1134,13 +1242,11 @@ _cupsMessageNew(void *context) /* I - User data */
|
||||
static const char * /* O - Locale string */
|
||||
appleLangDefault(void)
|
||||
{
|
||||
int i; /* Looping var */
|
||||
CFBundleRef bundle; /* Main bundle (if any) */
|
||||
CFArrayRef bundleList; /* List of localizations in bundle */
|
||||
CFPropertyListRef localizationList = NULL;
|
||||
/* List of localization data */
|
||||
CFStringRef languageName; /* Current name */
|
||||
CFStringRef localeName; /* Canonical from of name */
|
||||
char *lang; /* LANG environment variable */
|
||||
_cups_globals_t *cg = _cupsGlobals();
|
||||
/* Pointer to library globals */
|
||||
@@ -1225,49 +1331,11 @@ appleLangDefault(void)
|
||||
if (languageName &&
|
||||
CFGetTypeID(languageName) == CFStringGetTypeID())
|
||||
{
|
||||
localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(
|
||||
kCFAllocatorDefault, languageName);
|
||||
|
||||
if (localeName)
|
||||
{
|
||||
CFStringGetCString(localeName, cg->language, sizeof(cg->language),
|
||||
kCFStringEncodingASCII);
|
||||
CFRelease(localeName);
|
||||
|
||||
if (_cupsAppleLocale(languageName, cg->language, sizeof(cg->language)))
|
||||
DEBUG_printf(("3appleLangDefault: cg->language=\"%s\"",
|
||||
cg->language));
|
||||
|
||||
/*
|
||||
* Map new language identifiers to locales...
|
||||
*/
|
||||
|
||||
for (i = 0;
|
||||
i < (int)(sizeof(apple_language_locale) /
|
||||
sizeof(apple_language_locale[0]));
|
||||
i ++)
|
||||
{
|
||||
if (!strcmp(cg->language, apple_language_locale[i].language))
|
||||
{
|
||||
DEBUG_printf(("3appleLangDefault: mapping \"%s\" to \"%s\"...",
|
||||
cg->language, apple_language_locale[i].locale));
|
||||
strlcpy(cg->language, apple_language_locale[i].locale,
|
||||
sizeof(cg->language));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert language subtag into region subtag...
|
||||
*/
|
||||
|
||||
if (cg->language[2] == '-')
|
||||
cg->language[2] = '_';
|
||||
|
||||
if (!strchr(cg->language, '.'))
|
||||
strlcat(cg->language, ".UTF-8", sizeof(cg->language));
|
||||
}
|
||||
else
|
||||
DEBUG_puts("3appleLangDefault: Unable to get localeName.");
|
||||
DEBUG_puts("3appleLangDefault: Unable to get locale.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1305,11 +1373,13 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
|
||||
{
|
||||
char filename[1024], /* Path to cups.strings file */
|
||||
applelang[256], /* Apple language ID */
|
||||
baselang[3]; /* Base language */
|
||||
baselang[4]; /* Base language */
|
||||
CFURLRef url; /* URL to cups.strings file */
|
||||
CFReadStreamRef stream = NULL; /* File stream */
|
||||
CFPropertyListRef plist = NULL; /* Localization file */
|
||||
#ifdef DEBUG
|
||||
const char *cups_strings = getenv("CUPS_STRINGS");
|
||||
/* Test strings file */
|
||||
CFErrorRef error = NULL; /* Error when opening file */
|
||||
#endif /* DEBUG */
|
||||
|
||||
@@ -1320,6 +1390,15 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
|
||||
* Load the cups.strings file...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
if (cups_strings)
|
||||
{
|
||||
DEBUG_puts("1appleMessageLoad: Using debug CUPS_STRINGS file.");
|
||||
strlcpy(filename, cups_strings, sizeof(filename));
|
||||
}
|
||||
else
|
||||
#endif /* DEBUG */
|
||||
|
||||
snprintf(filename, sizeof(filename),
|
||||
CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings",
|
||||
_cupsAppleLanguage(locale, applelang, sizeof(applelang)));
|
||||
@@ -1332,6 +1411,7 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
|
||||
* Try with original locale string...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("1appleMessageLoad: \"%s\": %s", filename, strerror(errno)));
|
||||
snprintf(filename, sizeof(filename), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale);
|
||||
}
|
||||
|
||||
@@ -1343,18 +1423,23 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
|
||||
* Try with just the language code...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("1appleMessageLoad: \"%s\": %s", filename, strerror(errno)));
|
||||
|
||||
strlcpy(baselang, locale, sizeof(baselang));
|
||||
if (baselang[3] == '-' || baselang[3] == '_')
|
||||
baselang[3] = '\0';
|
||||
|
||||
snprintf(filename, sizeof(filename), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", baselang);
|
||||
}
|
||||
|
||||
DEBUG_printf(("1appleMessageLoad: filename=\"%s\"", filename));
|
||||
|
||||
if (access(filename, 0))
|
||||
{
|
||||
/*
|
||||
* Try alternate lproj directory names...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("1appleMessageLoad: \"%s\": %s", filename, strerror(errno)));
|
||||
|
||||
if (!strncmp(locale, "en", 2))
|
||||
locale = "English";
|
||||
else if (!strncmp(locale, "nb", 2))
|
||||
@@ -1371,10 +1456,11 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
|
||||
locale = "Japanese";
|
||||
else if (!strncmp(locale, "es", 2))
|
||||
locale = "Spanish";
|
||||
else if (!strcmp(locale, "zh_HK"))
|
||||
else if (!strcmp(locale, "zh_HK") || !strncasecmp(locale, "zh-Hant", 7) || !strncasecmp(locale, "zh_Hant", 7))
|
||||
{
|
||||
/*
|
||||
* <rdar://problem/22130168>
|
||||
* <rdar://problem/27245567>
|
||||
*
|
||||
* Try zh_TW first, then zh... Sigh...
|
||||
*/
|
||||
@@ -1391,14 +1477,18 @@ appleMessageLoad(const char *locale) /* I - Locale ID */
|
||||
*/
|
||||
|
||||
strlcpy(baselang, locale, sizeof(baselang));
|
||||
if (baselang[2] == '-' || baselang[2] == '_')
|
||||
baselang[2] = '\0';
|
||||
|
||||
locale = baselang;
|
||||
}
|
||||
|
||||
snprintf(filename, sizeof(filename),
|
||||
CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale);
|
||||
DEBUG_printf(("1appleMessageLoad: alternate filename=\"%s\"", filename));
|
||||
}
|
||||
|
||||
DEBUG_printf(("1appleMessageLoad: filename=\"%s\"", filename));
|
||||
|
||||
url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
|
||||
(UInt8 *)filename,
|
||||
(CFIndex)strlen(filename), false);
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ extern "C" {
|
||||
* Types...
|
||||
*/
|
||||
|
||||
typedef enum cups_encoding_e /**** Language Encodings ****/
|
||||
typedef enum cups_encoding_e /**** Language Encodings @exclude all@ ****/
|
||||
{
|
||||
CUPS_AUTO_ENCODING = -1, /* Auto-detect the encoding @private@ */
|
||||
CUPS_US_ASCII, /* US ASCII */
|
||||
|
||||
+86
-84
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Private MD5 implementation for CUPS.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 2005 by Easy Software Products
|
||||
* Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
|
||||
*
|
||||
@@ -43,70 +43,71 @@
|
||||
#include "md5-private.h"
|
||||
#include "string-private.h"
|
||||
|
||||
#define T1 0xd76aa478
|
||||
#define T2 0xe8c7b756
|
||||
#define T3 0x242070db
|
||||
#define T4 0xc1bdceee
|
||||
#define T5 0xf57c0faf
|
||||
#define T6 0x4787c62a
|
||||
#define T7 0xa8304613
|
||||
#define T8 0xfd469501
|
||||
#define T9 0x698098d8
|
||||
#define T10 0x8b44f7af
|
||||
#define T11 0xffff5bb1
|
||||
#define T12 0x895cd7be
|
||||
#define T13 0x6b901122
|
||||
#define T14 0xfd987193
|
||||
#define T15 0xa679438e
|
||||
#define T16 0x49b40821
|
||||
#define T17 0xf61e2562
|
||||
#define T18 0xc040b340
|
||||
#define T19 0x265e5a51
|
||||
#define T20 0xe9b6c7aa
|
||||
#define T21 0xd62f105d
|
||||
#define T22 0x02441453
|
||||
#define T23 0xd8a1e681
|
||||
#define T24 0xe7d3fbc8
|
||||
#define T25 0x21e1cde6
|
||||
#define T26 0xc33707d6
|
||||
#define T27 0xf4d50d87
|
||||
#define T28 0x455a14ed
|
||||
#define T29 0xa9e3e905
|
||||
#define T30 0xfcefa3f8
|
||||
#define T31 0x676f02d9
|
||||
#define T32 0x8d2a4c8a
|
||||
#define T33 0xfffa3942
|
||||
#define T34 0x8771f681
|
||||
#define T35 0x6d9d6122
|
||||
#define T36 0xfde5380c
|
||||
#define T37 0xa4beea44
|
||||
#define T38 0x4bdecfa9
|
||||
#define T39 0xf6bb4b60
|
||||
#define T40 0xbebfbc70
|
||||
#define T41 0x289b7ec6
|
||||
#define T42 0xeaa127fa
|
||||
#define T43 0xd4ef3085
|
||||
#define T44 0x04881d05
|
||||
#define T45 0xd9d4d039
|
||||
#define T46 0xe6db99e5
|
||||
#define T47 0x1fa27cf8
|
||||
#define T48 0xc4ac5665
|
||||
#define T49 0xf4292244
|
||||
#define T50 0x432aff97
|
||||
#define T51 0xab9423a7
|
||||
#define T52 0xfc93a039
|
||||
#define T53 0x655b59c3
|
||||
#define T54 0x8f0ccc92
|
||||
#define T55 0xffeff47d
|
||||
#define T56 0x85845dd1
|
||||
#define T57 0x6fa87e4f
|
||||
#define T58 0xfe2ce6e0
|
||||
#define T59 0xa3014314
|
||||
#define T60 0x4e0811a1
|
||||
#define T61 0xf7537e82
|
||||
#define T62 0xbd3af235
|
||||
#define T63 0x2ad7d2bb
|
||||
#define T64 0xeb86d391
|
||||
#if !defined(__APPLE__) && !defined(HAVE_GNUTLS)
|
||||
# define T1 0xd76aa478
|
||||
# define T2 0xe8c7b756
|
||||
# define T3 0x242070db
|
||||
# define T4 0xc1bdceee
|
||||
# define T5 0xf57c0faf
|
||||
# define T6 0x4787c62a
|
||||
# define T7 0xa8304613
|
||||
# define T8 0xfd469501
|
||||
# define T9 0x698098d8
|
||||
# define T10 0x8b44f7af
|
||||
# define T11 0xffff5bb1
|
||||
# define T12 0x895cd7be
|
||||
# define T13 0x6b901122
|
||||
# define T14 0xfd987193
|
||||
# define T15 0xa679438e
|
||||
# define T16 0x49b40821
|
||||
# define T17 0xf61e2562
|
||||
# define T18 0xc040b340
|
||||
# define T19 0x265e5a51
|
||||
# define T20 0xe9b6c7aa
|
||||
# define T21 0xd62f105d
|
||||
# define T22 0x02441453
|
||||
# define T23 0xd8a1e681
|
||||
# define T24 0xe7d3fbc8
|
||||
# define T25 0x21e1cde6
|
||||
# define T26 0xc33707d6
|
||||
# define T27 0xf4d50d87
|
||||
# define T28 0x455a14ed
|
||||
# define T29 0xa9e3e905
|
||||
# define T30 0xfcefa3f8
|
||||
# define T31 0x676f02d9
|
||||
# define T32 0x8d2a4c8a
|
||||
# define T33 0xfffa3942
|
||||
# define T34 0x8771f681
|
||||
# define T35 0x6d9d6122
|
||||
# define T36 0xfde5380c
|
||||
# define T37 0xa4beea44
|
||||
# define T38 0x4bdecfa9
|
||||
# define T39 0xf6bb4b60
|
||||
# define T40 0xbebfbc70
|
||||
# define T41 0x289b7ec6
|
||||
# define T42 0xeaa127fa
|
||||
# define T43 0xd4ef3085
|
||||
# define T44 0x04881d05
|
||||
# define T45 0xd9d4d039
|
||||
# define T46 0xe6db99e5
|
||||
# define T47 0x1fa27cf8
|
||||
# define T48 0xc4ac5665
|
||||
# define T49 0xf4292244
|
||||
# define T50 0x432aff97
|
||||
# define T51 0xab9423a7
|
||||
# define T52 0xfc93a039
|
||||
# define T53 0x655b59c3
|
||||
# define T54 0x8f0ccc92
|
||||
# define T55 0xffeff47d
|
||||
# define T56 0x85845dd1
|
||||
# define T57 0x6fa87e4f
|
||||
# define T58 0xfe2ce6e0
|
||||
# define T59 0xa3014314
|
||||
# define T60 0x4e0811a1
|
||||
# define T61 0xf7537e82
|
||||
# define T62 0xbd3af235
|
||||
# define T63 0x2ad7d2bb
|
||||
# define T64 0xeb86d391
|
||||
|
||||
static void
|
||||
_cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
|
||||
@@ -116,10 +117,10 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
|
||||
c = pms->abcd[2], d = pms->abcd[3];
|
||||
unsigned int t;
|
||||
|
||||
#ifndef ARCH_IS_BIG_ENDIAN
|
||||
# define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */
|
||||
#endif
|
||||
#if ARCH_IS_BIG_ENDIAN
|
||||
# ifndef ARCH_IS_BIG_ENDIAN
|
||||
# define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */
|
||||
# endif
|
||||
# if ARCH_IS_BIG_ENDIAN
|
||||
|
||||
/*
|
||||
* On big-endian machines, we must arrange the bytes in the right
|
||||
@@ -133,7 +134,7 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
|
||||
X[i] = (unsigned)xp[0] + ((unsigned)xp[1] << 8) +
|
||||
((unsigned)xp[2] << 16) + ((unsigned)xp[3] << 24);
|
||||
|
||||
#else /* !ARCH_IS_BIG_ENDIAN */
|
||||
# else /* !ARCH_IS_BIG_ENDIAN */
|
||||
|
||||
/*
|
||||
* On little-endian machines, we can process properly aligned data
|
||||
@@ -150,15 +151,15 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
|
||||
memcpy(xbuf, data, 64);
|
||||
X = xbuf;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
|
||||
# define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
|
||||
|
||||
/* Round 1. */
|
||||
/* Let [abcd k s i] denote the operation
|
||||
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
|
||||
#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
|
||||
#define SET(a, b, c, d, k, s, Ti)\
|
||||
# define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
|
||||
# define SET(a, b, c, d, k, s, Ti)\
|
||||
t = a + F(b,c,d) + X[k] + Ti;\
|
||||
a = ROTATE_LEFT(t, s) + b
|
||||
/* Do the following 16 operations. */
|
||||
@@ -178,13 +179,13 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
|
||||
SET(d, a, b, c, 13, 12, T14);
|
||||
SET(c, d, a, b, 14, 17, T15);
|
||||
SET(b, c, d, a, 15, 22, T16);
|
||||
#undef SET
|
||||
# undef SET
|
||||
|
||||
/* Round 2. */
|
||||
/* Let [abcd k s i] denote the operation
|
||||
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
|
||||
#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
|
||||
#define SET(a, b, c, d, k, s, Ti)\
|
||||
# define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
|
||||
# define SET(a, b, c, d, k, s, Ti)\
|
||||
t = a + G(b,c,d) + X[k] + Ti;\
|
||||
a = ROTATE_LEFT(t, s) + b
|
||||
/* Do the following 16 operations. */
|
||||
@@ -204,13 +205,13 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
|
||||
SET(d, a, b, c, 2, 9, T30);
|
||||
SET(c, d, a, b, 7, 14, T31);
|
||||
SET(b, c, d, a, 12, 20, T32);
|
||||
#undef SET
|
||||
# undef SET
|
||||
|
||||
/* Round 3. */
|
||||
/* Let [abcd k s t] denote the operation
|
||||
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
|
||||
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||
#define SET(a, b, c, d, k, s, Ti)\
|
||||
# define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||
# define SET(a, b, c, d, k, s, Ti)\
|
||||
t = a + H(b,c,d) + X[k] + Ti;\
|
||||
a = ROTATE_LEFT(t, s) + b
|
||||
/* Do the following 16 operations. */
|
||||
@@ -230,13 +231,13 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
|
||||
SET(d, a, b, c, 12, 11, T46);
|
||||
SET(c, d, a, b, 15, 16, T47);
|
||||
SET(b, c, d, a, 2, 23, T48);
|
||||
#undef SET
|
||||
# undef SET
|
||||
|
||||
/* Round 4. */
|
||||
/* Let [abcd k s t] denote the operation
|
||||
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
|
||||
#define I(x, y, z) ((y) ^ ((x) | ~(z)))
|
||||
#define SET(a, b, c, d, k, s, Ti)\
|
||||
# define I(x, y, z) ((y) ^ ((x) | ~(z)))
|
||||
# define SET(a, b, c, d, k, s, Ti)\
|
||||
t = a + I(b,c,d) + X[k] + Ti;\
|
||||
a = ROTATE_LEFT(t, s) + b
|
||||
/* Do the following 16 operations. */
|
||||
@@ -256,7 +257,7 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
|
||||
SET(d, a, b, c, 11, 10, T62);
|
||||
SET(c, d, a, b, 2, 15, T63);
|
||||
SET(b, c, d, a, 9, 21, T64);
|
||||
#undef SET
|
||||
# undef SET
|
||||
|
||||
/* Then perform the following additions. (That is increment each
|
||||
of the four registers by the value it had before this block
|
||||
@@ -337,3 +338,4 @@ _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16])
|
||||
for (i = 0; i < 16; ++i)
|
||||
digest[i] = (unsigned char)(pms->abcd[i >> 2] >> ((i & 3) << 3));
|
||||
}
|
||||
#endif /* !__APPLE__ && !HAVE_GNUTLS */
|
||||
|
||||
+16
-36
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* MD5 password support for CUPS.
|
||||
* MD5 password support for CUPS (deprecated).
|
||||
*
|
||||
* Copyright 2007-2010 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2005 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -17,12 +17,15 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <cups/cups.h>
|
||||
#include "http-private.h"
|
||||
#include "string-private.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'httpMD5()' - Compute the MD5 sum of the username:group:password.
|
||||
*
|
||||
* @deprecated@
|
||||
*/
|
||||
|
||||
char * /* O - MD5 sum */
|
||||
@@ -31,7 +34,6 @@ httpMD5(const char *username, /* I - User name */
|
||||
const char *passwd, /* I - Password string */
|
||||
char md5[33]) /* O - MD5 string */
|
||||
{
|
||||
_cups_md5_state_t state; /* MD5 state info */
|
||||
unsigned char sum[16]; /* Sum data */
|
||||
char line[256]; /* Line to sum */
|
||||
|
||||
@@ -41,15 +43,13 @@ httpMD5(const char *username, /* I - User name */
|
||||
*/
|
||||
|
||||
snprintf(line, sizeof(line), "%s:%s:%s", username, realm, passwd);
|
||||
_cupsMD5Init(&state);
|
||||
_cupsMD5Append(&state, (unsigned char *)line, (int)strlen(line));
|
||||
_cupsMD5Finish(&state, sum);
|
||||
cupsHashData("md5", (unsigned char *)line, strlen(line), sum, sizeof(sum));
|
||||
|
||||
/*
|
||||
* Return the sum...
|
||||
*/
|
||||
|
||||
return (httpMD5String(sum, md5));
|
||||
return ((char *)cupsHashString(sum, sizeof(sum), md5, 33));
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,8 @@ httpMD5(const char *username, /* I - User name */
|
||||
* 'httpMD5Final()' - Combine the MD5 sum of the username, group, and password
|
||||
* with the server-supplied nonce value, method, and
|
||||
* request-uri.
|
||||
*
|
||||
* @deprecated@
|
||||
*/
|
||||
|
||||
char * /* O - New sum */
|
||||
@@ -65,7 +67,6 @@ httpMD5Final(const char *nonce, /* I - Server nonce value */
|
||||
const char *resource, /* I - Resource path */
|
||||
char md5[33]) /* IO - MD5 sum */
|
||||
{
|
||||
_cups_md5_state_t state; /* MD5 state info */
|
||||
unsigned char sum[16]; /* Sum data */
|
||||
char line[1024]; /* Line of data */
|
||||
char a2[33]; /* Hash of method and resource */
|
||||
@@ -76,10 +77,8 @@ httpMD5Final(const char *nonce, /* I - Server nonce value */
|
||||
*/
|
||||
|
||||
snprintf(line, sizeof(line), "%s:%s", method, resource);
|
||||
_cupsMD5Init(&state);
|
||||
_cupsMD5Append(&state, (unsigned char *)line, (int)strlen(line));
|
||||
_cupsMD5Finish(&state, sum);
|
||||
httpMD5String(sum, a2);
|
||||
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
|
||||
@@ -88,17 +87,16 @@ httpMD5Final(const char *nonce, /* I - Server nonce value */
|
||||
*/
|
||||
|
||||
snprintf(line, sizeof(line), "%s:%s:%s", md5, nonce, a2);
|
||||
cupsHashData("md5", (unsigned char *)line, strlen(line), sum, sizeof(sum));
|
||||
|
||||
_cupsMD5Init(&state);
|
||||
_cupsMD5Append(&state, (unsigned char *)line, (int)strlen(line));
|
||||
_cupsMD5Finish(&state, sum);
|
||||
|
||||
return (httpMD5String(sum, md5));
|
||||
return ((char *)cupsHashString(sum, sizeof(sum), md5, 33));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpMD5String()' - Convert an MD5 sum to a character string.
|
||||
*
|
||||
* @deprecated@
|
||||
*/
|
||||
|
||||
char * /* O - MD5 sum in hex */
|
||||
@@ -106,23 +104,5 @@ httpMD5String(const unsigned char *sum, /* I - MD5 sum data */
|
||||
char md5[33])
|
||||
/* O - MD5 sum in hex */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
char *md5ptr; /* Pointer into MD5 string */
|
||||
static const char hex[] = "0123456789abcdef";
|
||||
/* Hex digits */
|
||||
|
||||
|
||||
/*
|
||||
* Convert the MD5 sum to hexadecimal...
|
||||
*/
|
||||
|
||||
for (i = 16, md5ptr = md5; i > 0; i --, sum ++)
|
||||
{
|
||||
*md5ptr++ = hex[*sum >> 4];
|
||||
*md5ptr++ = hex[*sum & 15];
|
||||
}
|
||||
|
||||
*md5ptr = '\0';
|
||||
|
||||
return (md5);
|
||||
return ((char *)cupsHashString(sum, 16, md5, 33));
|
||||
}
|
||||
|
||||
+63
-1
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Option routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -29,6 +29,31 @@ static int cups_find_option(const char *name, int num_options,
|
||||
cups_option_t *option, int prev, int *rdiff);
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsAddIntegerOption()' - Add an integer option to an option array.
|
||||
*
|
||||
* New option arrays can be initialized simply by passing 0 for the
|
||||
* "num_options" parameter.
|
||||
*
|
||||
* @since CUPS 2.2.4/macOS 10.13@
|
||||
*/
|
||||
|
||||
int /* O - Number of options */
|
||||
cupsAddIntegerOption(
|
||||
const char *name, /* I - Name of option */
|
||||
int value, /* I - Value of option */
|
||||
int num_options, /* I - Number of options */
|
||||
cups_option_t **options) /* IO - Pointer to options */
|
||||
{
|
||||
char strvalue[32]; /* String value */
|
||||
|
||||
|
||||
snprintf(strvalue, sizeof(strvalue), "%d", value);
|
||||
|
||||
return (cupsAddOption(name, strvalue, num_options, options));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsAddOption()' - Add an option to an option array.
|
||||
*
|
||||
@@ -55,6 +80,11 @@ cupsAddOption(const char *name, /* I - Name of option */
|
||||
return (num_options);
|
||||
}
|
||||
|
||||
if (!_cups_strcasecmp(name, "cupsPrintQuality"))
|
||||
num_options = cupsRemoveOption("print-quality", num_options, options);
|
||||
else if (!_cups_strcasecmp(name, "print-quality"))
|
||||
num_options = cupsRemoveOption("cupsPrintQuality", num_options, options);
|
||||
|
||||
/*
|
||||
* Look for an existing option with the same name...
|
||||
*/
|
||||
@@ -154,6 +184,38 @@ cupsFreeOptions(
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsGetIntegerOption()' - Get an integer option value.
|
||||
*
|
||||
* INT_MIN is returned when the option does not exist, is not an integer, or
|
||||
* exceeds the range of values for the "int" type.
|
||||
*
|
||||
* @since CUPS 2.2.4/macOS 10.13@
|
||||
*/
|
||||
|
||||
int /* O - Option value or @code INT_MIN@ */
|
||||
cupsGetIntegerOption(
|
||||
const char *name, /* I - Name of option */
|
||||
int num_options, /* I - Number of options */
|
||||
cups_option_t *options) /* I - Options */
|
||||
{
|
||||
const char *value = cupsGetOption(name, num_options, options);
|
||||
/* String value of option */
|
||||
char *ptr; /* Pointer into string value */
|
||||
long intvalue; /* Integer value */
|
||||
|
||||
|
||||
if (!value || !*value)
|
||||
return (INT_MIN);
|
||||
|
||||
intvalue = strtol(value, &ptr, 10);
|
||||
if (intvalue < INT_MIN || intvalue > INT_MAX || *ptr)
|
||||
return (INT_MIN);
|
||||
|
||||
return ((int)intvalue);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cupsGetOption()' - Get an option value.
|
||||
*/
|
||||
|
||||
+580
-337
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Option conflict management routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 2007-2018 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -29,7 +29,6 @@
|
||||
|
||||
enum
|
||||
{
|
||||
_PPD_NORMAL_CONSTRAINTS,
|
||||
_PPD_OPTION_CONSTRAINTS,
|
||||
_PPD_INSTALLABLE_CONSTRAINTS,
|
||||
_PPD_ALL_CONSTRAINTS
|
||||
@@ -998,7 +997,7 @@ ppd_test_constraints(
|
||||
if (!consts->installable && which == _PPD_INSTALLABLE_CONSTRAINTS)
|
||||
continue; /* Skip non-installable option constraint */
|
||||
|
||||
if (which == _PPD_OPTION_CONSTRAINTS && option)
|
||||
if ((which == _PPD_OPTION_CONSTRAINTS || which == _PPD_INSTALLABLE_CONSTRAINTS) && option)
|
||||
{
|
||||
/*
|
||||
* Skip constraints that do not involve the current option...
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* PPD localization routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2016 by Apple Inc.
|
||||
* Copyright 2007-2018 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -277,7 +277,7 @@ ppdLocalizeIPPReason(
|
||||
|
||||
if (!locattr)
|
||||
{
|
||||
if (lang && (!scheme || !strcmp(scheme, "text")))
|
||||
if (lang && (!scheme || !strcmp(scheme, "text")) && strcmp(reason, "none"))
|
||||
{
|
||||
/*
|
||||
* Try to localize a standard printer-state-reason keyword...
|
||||
@@ -665,7 +665,7 @@ _ppdLocalizedAttr(ppd_file_t *ppd, /* I - PPD file */
|
||||
/*
|
||||
* <rdar://problem/22130168>
|
||||
*
|
||||
* Hong Kong locale needs special handling... Sigh...
|
||||
* Multiple locales need special handling... Sigh...
|
||||
*/
|
||||
|
||||
if (!strcmp(ll_CC, "zh_HK"))
|
||||
|
||||
+15
-1
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Option marking routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -253,6 +253,7 @@ cupsMarkOptions(
|
||||
*/
|
||||
|
||||
for (i = num_options, optptr = options; i > 0; i --, optptr ++)
|
||||
{
|
||||
if (!_cups_strcasecmp(optptr->name, "media") ||
|
||||
!_cups_strcasecmp(optptr->name, "output-bin") ||
|
||||
!_cups_strcasecmp(optptr->name, "output-mode") ||
|
||||
@@ -341,6 +342,19 @@ cupsMarkOptions(
|
||||
ppd_mark_option(ppd, "MirrorPrint", optptr->value);
|
||||
else
|
||||
ppd_mark_option(ppd, optptr->name, optptr->value);
|
||||
}
|
||||
|
||||
if (print_quality)
|
||||
{
|
||||
int pq = atoi(print_quality); /* print-quaity value */
|
||||
|
||||
if (pq == IPP_QUALITY_DRAFT)
|
||||
ppd_mark_option(ppd, "cupsPrintQuality", "Draft");
|
||||
else if (pq == IPP_QUALITY_HIGH)
|
||||
ppd_mark_option(ppd, "cupsPrintQuality", "High");
|
||||
else
|
||||
ppd_mark_option(ppd, "cupsPrintQuality", "Normal");
|
||||
}
|
||||
|
||||
ppd_debug_marked(ppd, "After...");
|
||||
|
||||
|
||||
+3
-16
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Private PPD definitions for CUPS.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -47,7 +47,7 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define _PPD_CACHE_VERSION 7 /* Version number in cache file */
|
||||
# define _PPD_CACHE_VERSION 8 /* Version number in cache file */
|
||||
|
||||
|
||||
/*
|
||||
@@ -100,7 +100,7 @@ typedef enum _pwg_print_color_mode_e /**** PWG print-color-mode indices ****/
|
||||
{
|
||||
_PWG_PRINT_COLOR_MODE_MONOCHROME = 0, /* print-color-mode=monochrome */
|
||||
_PWG_PRINT_COLOR_MODE_COLOR, /* print-color-mode=color */
|
||||
/* Other proposed values are not supported by CUPS yet. */
|
||||
/* Other values are not supported by CUPS yet. */
|
||||
_PWG_PRINT_COLOR_MODE_MAX
|
||||
} _pwg_print_color_mode_t;
|
||||
|
||||
@@ -119,14 +119,6 @@ typedef struct _pwg_finishings_s /**** PWG finishings mapping data ****/
|
||||
cups_option_t *options; /* Options to apply */
|
||||
} _pwg_finishings_t;
|
||||
|
||||
typedef struct _pwg_material_s /**** PWG material mapping data ****/
|
||||
{
|
||||
char *key, /* material-key value */
|
||||
*name; /* material-name value */
|
||||
int num_props; /* Number of properties */
|
||||
cups_option_t *props; /* Material properties */
|
||||
} _pwg_material_t;
|
||||
|
||||
struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
|
||||
{
|
||||
int num_bins; /* Number of output bins */
|
||||
@@ -166,11 +158,6 @@ struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
|
||||
cups_array_t *mandatory; /* cupsMandatory value */
|
||||
char *charge_info_uri; /* cupsChargeInfoURI value */
|
||||
cups_array_t *support_files; /* Support files - ICC profiles, etc. */
|
||||
char *cups_3d, /* cups3D value */
|
||||
*cups_layer_order; /* cupsLayerOrder value */
|
||||
int cups_accuracy[3]; /* cupsAccuracy value - x, y, and z in nanometers */
|
||||
int cups_volume[3]; /* cupsVolume value - x, y, and z in millimeters */
|
||||
cups_array_t *materials; /* cupsMaterial values */
|
||||
};
|
||||
|
||||
|
||||
|
||||
+28
-99
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* PPD utilities for CUPS.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 1997-2006 by Easy Software Products.
|
||||
* Copyright © 2007-2018 by Apple Inc.
|
||||
* Copyright © 1997-2006 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -216,6 +216,27 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
|
||||
const char *tmpdir; /* TMPDIR environment variable */
|
||||
struct timeval curtime; /* Current time */
|
||||
|
||||
#ifdef __APPLE__
|
||||
/*
|
||||
* On macOS and iOS, the TMPDIR environment variable is not always the
|
||||
* best location to place temporary files due to sandboxing. Instead,
|
||||
* the confstr function should be called to get the proper per-user,
|
||||
* per-process TMPDIR value.
|
||||
*/
|
||||
|
||||
char tmppath[1024]; /* Temporary directory */
|
||||
|
||||
if ((tmpdir = getenv("TMPDIR")) != NULL && access(tmpdir, W_OK))
|
||||
tmpdir = NULL;
|
||||
|
||||
if (!tmpdir)
|
||||
{
|
||||
if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmppath, sizeof(tmppath)))
|
||||
tmpdir = tmppath;
|
||||
else
|
||||
tmpdir = "/private/tmp"; /* This should never happen */
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* Previously we put root temporary files in the default CUPS temporary
|
||||
* directory under /var/spool/cups. However, since the scheduler cleans
|
||||
@@ -224,11 +245,8 @@ cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAUL
|
||||
*/
|
||||
|
||||
if ((tmpdir = getenv("TMPDIR")) == NULL)
|
||||
# ifdef __APPLE__
|
||||
tmpdir = "/private/tmp"; /* /tmp is a symlink to /private/tmp */
|
||||
# else
|
||||
tmpdir = "/tmp";
|
||||
# endif /* __APPLE__ */
|
||||
tmpdir = "/tmp";
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
/*
|
||||
* Make the temporary name using the specified directory...
|
||||
@@ -511,23 +529,16 @@ cups_get_printer_uri(
|
||||
int depth) /* I - Depth of query */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int http_port; /* Port number */
|
||||
http_t *http2; /* Alternate HTTP connection */
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
char uri[HTTP_MAX_URI], /* printer-uri attribute */
|
||||
scheme[HTTP_MAX_URI], /* Scheme name */
|
||||
username[HTTP_MAX_URI], /* Username:password */
|
||||
classname[255], /* Temporary class name */
|
||||
http_hostname[HTTP_MAX_HOST];
|
||||
/* Hostname associated with connection */
|
||||
username[HTTP_MAX_URI]; /* Username:password */
|
||||
static const char * const requested_attrs[] =
|
||||
{ /* Requested attributes */
|
||||
"device-uri",
|
||||
"member-uris",
|
||||
"printer-uri-supported",
|
||||
"printer-type"
|
||||
"printer-uri-supported"
|
||||
};
|
||||
|
||||
|
||||
@@ -549,15 +560,6 @@ cups_get_printer_uri(
|
||||
|
||||
DEBUG_printf(("5cups_get_printer_uri: printer-uri=\"%s\"", uri));
|
||||
|
||||
/*
|
||||
* Get the hostname and port number we are connected to...
|
||||
*/
|
||||
|
||||
httpGetHostname(http, http_hostname, sizeof(http_hostname));
|
||||
http_port = httpAddrPort(http->hostaddr);
|
||||
|
||||
DEBUG_printf(("5cups_get_printer_uri: http_hostname=\"%s\"", http_hostname));
|
||||
|
||||
/*
|
||||
* Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
|
||||
* attributes:
|
||||
@@ -582,31 +584,7 @@ cups_get_printer_uri(
|
||||
|
||||
if ((response = cupsDoRequest(http, request, resource)) != NULL)
|
||||
{
|
||||
const char *device_uri = NULL; /* device-uri value */
|
||||
|
||||
if ((attr = ippFindAttribute(response, "device-uri", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
device_uri = attr->values[0].string.text;
|
||||
DEBUG_printf(("5cups_get_printer_uri: device-uri=\"%s\"", device_uri));
|
||||
}
|
||||
|
||||
if (device_uri &&
|
||||
(((!strncmp(device_uri, "ipp://", 6) || !strncmp(device_uri, "ipps://", 7)) &&
|
||||
(strstr(device_uri, "/printers/") != NULL || strstr(device_uri, "/classes/") != NULL)) ||
|
||||
((strstr(device_uri, "._ipp.") != NULL || strstr(device_uri, "._ipps.") != NULL) &&
|
||||
!strcmp(device_uri + strlen(device_uri) - 5, "/cups"))))
|
||||
{
|
||||
/*
|
||||
* Statically-configured shared printer.
|
||||
*/
|
||||
|
||||
httpSeparateURI(HTTP_URI_CODING_ALL, _httpResolveURI(device_uri, uri, sizeof(uri), _HTTP_RESOLVE_DEFAULT, NULL, NULL), scheme, sizeof(scheme), username, sizeof(username), host, hostsize, port, resource, resourcesize);
|
||||
ippDelete(response);
|
||||
|
||||
DEBUG_printf(("5cups_get_printer_uri: Resolved to host=\"%s\", port=%d, resource=\"%s\"", host, *port, resource));
|
||||
return (1);
|
||||
}
|
||||
else if ((attr = ippFindAttribute(response, "member-uris", IPP_TAG_URI)) != NULL)
|
||||
if ((attr = ippFindAttribute(response, "member-uris", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
/*
|
||||
* Get the first actual printer name in the class...
|
||||
@@ -631,55 +609,6 @@ cups_get_printer_uri(
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* No printers in this class - try recursively looking for a printer,
|
||||
* but not more than 3 levels deep...
|
||||
*/
|
||||
|
||||
if (depth < 3)
|
||||
{
|
||||
for (i = 0; i < attr->num_values; i ++)
|
||||
{
|
||||
httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text,
|
||||
scheme, sizeof(scheme), username, sizeof(username),
|
||||
host, hostsize, port, resource, resourcesize);
|
||||
if (!strncmp(resource, "/classes/", 9))
|
||||
{
|
||||
/*
|
||||
* Found a class! Connect to the right server...
|
||||
*/
|
||||
|
||||
if (!_cups_strcasecmp(http_hostname, host) && *port == http_port)
|
||||
http2 = http;
|
||||
else if ((http2 = httpConnect2(host, *port, NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL)) == NULL)
|
||||
{
|
||||
DEBUG_puts("8cups_get_printer_uri: Unable to connect to server");
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look up printers on that server...
|
||||
*/
|
||||
|
||||
strlcpy(classname, resource + 9, sizeof(classname));
|
||||
|
||||
cups_get_printer_uri(http2, classname, host, hostsize, port,
|
||||
resource, resourcesize, depth + 1);
|
||||
|
||||
/*
|
||||
* Close the connection as needed...
|
||||
*/
|
||||
|
||||
if (http2 != http)
|
||||
httpClose(http2);
|
||||
|
||||
if (*host)
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
|
||||
{
|
||||
|
||||
+18
-2
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* PPD file routines for CUPS.
|
||||
*
|
||||
* Copyright 2007-2015 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -579,12 +579,28 @@ _ppdOpen(
|
||||
|
||||
/*
|
||||
* <rdar://problem/22130168>
|
||||
* <rdar://problem/27245567>
|
||||
*
|
||||
* Need to use a different base language for some locales...
|
||||
*/
|
||||
|
||||
if (!strcmp(lang->language, "zh_HK"))
|
||||
strlcpy(ll, "zh_TW.", sizeof(ll));
|
||||
{ /* Traditional Chinese + variants */
|
||||
strlcpy(ll_CC, "zh_TW.", sizeof(ll_CC));
|
||||
strlcpy(ll, "zh_", sizeof(ll));
|
||||
}
|
||||
else if (!strncmp(lang->language, "zh", 2))
|
||||
strlcpy(ll, "zh_", sizeof(ll)); /* Any Chinese variant */
|
||||
else if (!strncmp(lang->language, "jp", 2))
|
||||
{ /* Any Japanese variant */
|
||||
strlcpy(ll_CC, "ja", sizeof(ll_CC));
|
||||
strlcpy(ll, "jp", sizeof(ll));
|
||||
}
|
||||
else if (!strncmp(lang->language, "nb", 2) || !strncmp(lang->language, "no", 2))
|
||||
{ /* Any Norwegian variant */
|
||||
strlcpy(ll_CC, "nb", sizeof(ll_CC));
|
||||
strlcpy(ll, "no", sizeof(ll));
|
||||
}
|
||||
else
|
||||
snprintf(ll, sizeof(ll), "%2.2s.", lang->language);
|
||||
|
||||
|
||||
+2
-1
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* PWG media name API implementation for CUPS.
|
||||
*
|
||||
* Copyright 2009-2016 by Apple Inc.
|
||||
* Copyright 2009-2017 by Apple Inc.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -189,6 +189,7 @@ static pwg_media_t const cups_pwg_media[] =
|
||||
_PWG_MEDIA_MM("jis_b1_728x1030mm", "jis-b1", "B1", 728, 1030),
|
||||
_PWG_MEDIA_MM("jis_b0_1030x1456mm", "jis-b0", "B0", 1030, 1456),
|
||||
_PWG_MEDIA_MM("jis_exec_216x330mm", NULL, "216x330mm", 216, 330),
|
||||
_PWG_MEDIA_MM("jpn_kaku1_270x382mm", NULL, "EnvKaku1", 270, 382),
|
||||
_PWG_MEDIA_MM("jpn_kaku2_240x332mm", NULL, "EnvKaku2", 240, 332),
|
||||
_PWG_MEDIA_MM("jpn_kaku3_216x277mm", NULL, "EnvKaku3", 216, 277),
|
||||
_PWG_MEDIA_MM("jpn_kaku4_197x267mm", NULL, "EnvKaku4", 197, 267),
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* PWG media API definitions for CUPS.
|
||||
*
|
||||
* Copyright 2009-2013 by Apple Inc.
|
||||
* Copyright 2009-2017 by Apple Inc.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -39,7 +39,7 @@ extern "C" {
|
||||
* Types and structures...
|
||||
*/
|
||||
|
||||
typedef struct pwg_map_s /**** Map element - PPD to/from PWG */
|
||||
typedef struct pwg_map_s /**** Map element - PPD to/from PWG @exclude all@ */
|
||||
{
|
||||
char *pwg, /* PWG media keyword */
|
||||
*ppd; /* PPD option keyword */
|
||||
@@ -54,7 +54,7 @@ typedef struct pwg_media_s /**** Common media size data ****/
|
||||
length; /* Length in 2540ths */
|
||||
} pwg_media_t;
|
||||
|
||||
typedef struct pwg_size_s /**** Size element - PPD to/from PWG */
|
||||
typedef struct pwg_size_s /**** Size element - PPD to/from PWG @exclude all@ */
|
||||
{
|
||||
pwg_map_t map; /* Map element */
|
||||
int width, /* Width in 2540ths */
|
||||
|
||||
+17
-17
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* IPP utilities for CUPS.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -131,13 +131,12 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
if ((http = _cupsConnect()) == NULL)
|
||||
{
|
||||
ippDelete(request);
|
||||
if (!http && (http = _cupsConnect()) == NULL)
|
||||
{
|
||||
ippDelete(request);
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we have a file to send...
|
||||
@@ -151,9 +150,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
|
||||
* Can't get file information!
|
||||
*/
|
||||
|
||||
_cupsSetError(errno == EBADF ? IPP_STATUS_ERROR_NOT_FOUND : IPP_STATUS_ERROR_NOT_AUTHORIZED,
|
||||
NULL, 0);
|
||||
|
||||
_cupsSetError(errno == EBADF ? IPP_STATUS_ERROR_NOT_FOUND : IPP_STATUS_ERROR_NOT_AUTHORIZED, NULL, 0);
|
||||
ippDelete(request);
|
||||
|
||||
return (NULL);
|
||||
@@ -169,9 +166,8 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
|
||||
* Can't send a directory...
|
||||
*/
|
||||
|
||||
ippDelete(request);
|
||||
|
||||
_cupsSetError(IPP_STATUS_ERROR_NOT_POSSIBLE, strerror(EISDIR), 0);
|
||||
ippDelete(request);
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
@@ -186,8 +182,7 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
|
||||
else
|
||||
length = ippLength(request);
|
||||
|
||||
DEBUG_printf(("2cupsDoIORequest: Request length=%ld, total length=%ld",
|
||||
(long)ippLength(request), (long)length));
|
||||
DEBUG_printf(("2cupsDoIORequest: Request length=%ld, total length=%ld", (long)ippLength(request), (long)length));
|
||||
|
||||
/*
|
||||
* Clear any "Local" authentication data since it is probably stale...
|
||||
@@ -596,6 +591,7 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
|
||||
int got_status; /* Did we get the status? */
|
||||
ipp_state_t state; /* State of IPP processing */
|
||||
http_status_t expect; /* Expect: header to use */
|
||||
char date[256]; /* Date: header value */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsSendRequest(http=%p, request=%p(%s), resource=\"%s\", length=" CUPS_LLFMT ")", (void *)http, (void *)request, request ? ippOpString(request->request.op.operation_id) : "?", resource, CUPS_LLCAST length));
|
||||
@@ -615,9 +611,8 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
|
||||
* Get the default connection as needed...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
if ((http = _cupsConnect()) == NULL)
|
||||
return (HTTP_STATUS_SERVICE_UNAVAILABLE);
|
||||
if (!http && (http = _cupsConnect()) == NULL)
|
||||
return (HTTP_STATUS_SERVICE_UNAVAILABLE);
|
||||
|
||||
/*
|
||||
* If the prior request was not flushed out, do so now...
|
||||
@@ -685,6 +680,7 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
|
||||
httpClearFields(http);
|
||||
httpSetExpect(http, expect);
|
||||
httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp");
|
||||
httpSetField(http, HTTP_FIELD_DATE, httpGetDateString2(time(NULL), date, (int)sizeof(date)));
|
||||
httpSetLength(http, length);
|
||||
|
||||
#ifdef HAVE_GSSAPI
|
||||
@@ -996,7 +992,11 @@ _cupsConnect(void)
|
||||
*/
|
||||
|
||||
if (strcmp(cg->http->hostname, cg->server) ||
|
||||
#ifdef AF_LOCAL
|
||||
(httpAddrFamily(cg->http->hostaddr) != AF_LOCAL && cg->ipp_port != httpAddrPort(cg->http->hostaddr)) ||
|
||||
#else
|
||||
cg->ipp_port != httpAddrPort(cg->http->hostaddr) ||
|
||||
#endif /* AF_LOCAL */
|
||||
(cg->http->encryption != cg->encryption &&
|
||||
cg->http->encryption == HTTP_ENCRYPTION_NEVER))
|
||||
{
|
||||
|
||||
@@ -739,6 +739,10 @@ asn1_debug(const char *prefix, /* I - Prefix string */
|
||||
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
|
||||
|
||||
|
||||
#ifdef __clang_analyzer__ /* Suppress bogus clang error */
|
||||
memset(string, 0, sizeof(string));
|
||||
#endif /* __clang_analyzer__ */
|
||||
|
||||
if (cg->snmp_debug <= 0)
|
||||
return;
|
||||
|
||||
|
||||
+4
-3
@@ -695,10 +695,11 @@ _cups_strlcat(char *dst, /* O - Destination string */
|
||||
*/
|
||||
|
||||
dstlen = strlen(dst);
|
||||
size -= dstlen + 1;
|
||||
|
||||
if (!size)
|
||||
return (dstlen); /* No room, return immediately... */
|
||||
if (size < (dstlen + 1))
|
||||
return (dstlen); /* No room, return immediately... */
|
||||
|
||||
size -= dstlen + 1;
|
||||
|
||||
/*
|
||||
* Figure out how much room is needed...
|
||||
|
||||
+25
-7
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Temp file utilities for CUPS.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 1997-2006 by Easy Software Products.
|
||||
* Copyright © 2007-2018 by Apple Inc.
|
||||
* Copyright © 1997-2006 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -42,8 +42,10 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
int fd; /* File descriptor for temp file */
|
||||
int tries; /* Number of tries */
|
||||
const char *tmpdir; /* TMPDIR environment var */
|
||||
#if defined(__APPLE__) || defined(WIN32)
|
||||
char tmppath[1024]; /* Temporary directory */
|
||||
#endif /* __APPLE__ || WIN32 */
|
||||
#ifdef WIN32
|
||||
char tmppath[1024]; /* Windows temporary directory */
|
||||
DWORD curtime; /* Current time */
|
||||
#else
|
||||
struct timeval curtime; /* Current time */
|
||||
@@ -60,6 +62,26 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
GetTempPath(sizeof(tmppath), tmppath);
|
||||
tmpdir = tmppath;
|
||||
}
|
||||
|
||||
#elif defined(__APPLE__)
|
||||
/*
|
||||
* On macOS and iOS, the TMPDIR environment variable is not always the best
|
||||
* location to place temporary files due to sandboxing. Instead, the confstr
|
||||
* function should be called to get the proper per-user, per-process TMPDIR
|
||||
* value.
|
||||
*/
|
||||
|
||||
if ((tmpdir = getenv("TMPDIR")) != NULL && access(tmpdir, W_OK))
|
||||
tmpdir = NULL;
|
||||
|
||||
if (!tmpdir)
|
||||
{
|
||||
if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmppath, sizeof(tmppath)))
|
||||
tmpdir = tmppath;
|
||||
else
|
||||
tmpdir = "/private/tmp"; /* This should never happen */
|
||||
}
|
||||
|
||||
#else
|
||||
/*
|
||||
* Previously we put root temporary files in the default CUPS temporary
|
||||
@@ -69,11 +91,7 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
*/
|
||||
|
||||
if ((tmpdir = getenv("TMPDIR")) == NULL)
|
||||
# if defined(__APPLE__) && !TARGET_OS_IOS
|
||||
tmpdir = "/private/tmp"; /* /tmp is a symlink to /private/tmp */
|
||||
# else
|
||||
tmpdir = "/tmp";
|
||||
# endif /* __APPLE__ && !TARGET_OS_IOS */
|
||||
#endif /* WIN32 */
|
||||
|
||||
/*
|
||||
|
||||
+31
-16
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* CUPS API test program for CUPS.
|
||||
*
|
||||
* Copyright 2007-2014 by Apple Inc.
|
||||
* Copyright 2007-2017 by Apple Inc.
|
||||
* Copyright 2007 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -47,7 +47,9 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
cups_dest_t *dests, /* Destinations */
|
||||
*dest, /* Current destination */
|
||||
*named_dest; /* Current named destination */
|
||||
const char *ppdfile; /* PPD file */
|
||||
const char *dest_name, /* Destination name */
|
||||
*dval, /* Destination value */
|
||||
*ppdfile; /* PPD file */
|
||||
ppd_file_t *ppd; /* PPD file data */
|
||||
int num_jobs; /* Number of jobs for queue */
|
||||
cups_job_t *jobs; /* Jobs for queue */
|
||||
@@ -360,11 +362,19 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* cupsGetDest(printer)
|
||||
*/
|
||||
|
||||
printf("cupsGetDest(\"%s\"): ", dests[num_dests / 2].name);
|
||||
for (i = 0, dest_name = NULL; i < num_dests; i ++)
|
||||
{
|
||||
if ((dval = cupsGetOption("printer-is-temporary", dests[i].num_options, dest[i].options)) != NULL && !strcmp(dval, "false"))
|
||||
{
|
||||
dest_name = dests[i].name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printf("cupsGetDest(\"%s\"): ", dest_name ? dest_name : "(null)");
|
||||
fflush(stdout);
|
||||
|
||||
if ((dest = cupsGetDest(dests[num_dests / 2].name, NULL, num_dests,
|
||||
dests)) == NULL)
|
||||
if ((dest = cupsGetDest(dest_name, NULL, num_dests, dests)) == NULL)
|
||||
{
|
||||
puts("FAIL");
|
||||
return (1);
|
||||
@@ -380,8 +390,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
dest->instance ? dest->instance : "(null)");
|
||||
fflush(stdout);
|
||||
|
||||
if ((named_dest = cupsGetNamedDest(NULL, dest->name,
|
||||
dest->instance)) == NULL ||
|
||||
if ((named_dest = cupsGetNamedDest(NULL, dest->name, dest->instance)) == NULL ||
|
||||
!dests_equal(dest, named_dest))
|
||||
{
|
||||
if (named_dest)
|
||||
@@ -408,7 +417,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
fputs("cupsPrintFile: ", stdout);
|
||||
fflush(stdout);
|
||||
|
||||
if (cupsPrintFile(dest->name, "../data/testprint", "Test Page",
|
||||
if (cupsPrintFile(dest->name, "../test/testfile.pdf", "Test Page",
|
||||
dest->num_options, dest->options) <= 0)
|
||||
{
|
||||
printf("FAIL (%s)\n", cupsLastErrorString());
|
||||
@@ -421,7 +430,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* cupsGetPPD(printer)
|
||||
*/
|
||||
|
||||
fputs("cupsGetPPD(): ", stdout);
|
||||
fputs("cupsGetPPD: ", stdout);
|
||||
fflush(stdout);
|
||||
|
||||
if ((ppdfile = cupsGetPPD(dest->name)) == NULL)
|
||||
@@ -436,7 +445,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
* ppdOpenFile()
|
||||
*/
|
||||
|
||||
fputs("ppdOpenFile(): ", stdout);
|
||||
fputs("ppdOpenFile: ", stdout);
|
||||
fflush(stdout);
|
||||
|
||||
if ((ppd = ppdOpenFile(ppdfile)) == NULL)
|
||||
@@ -550,33 +559,39 @@ show_diffs(cups_dest_t *a, /* I - First destination */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
cups_option_t *aoption; /* Current option */
|
||||
cups_option_t *boption; /* Current option */
|
||||
const char *bval; /* Option value */
|
||||
|
||||
|
||||
if (!a || !b)
|
||||
return;
|
||||
|
||||
puts(" Item cupsGetDest cupsGetNamedDest");
|
||||
puts(" -------------------- -------------------- --------------------");
|
||||
puts(" Item cupsGetDest cupsGetNamedDest");
|
||||
puts(" -------------------- ------------------------ ------------------------");
|
||||
|
||||
if (_cups_strcasecmp(a->name, b->name))
|
||||
printf(" name %-20.20s %-20.20s\n", a->name, b->name);
|
||||
printf(" name %-24.24s %-24.24s\n", a->name, b->name);
|
||||
|
||||
if ((a->instance && !b->instance) ||
|
||||
(!a->instance && b->instance) ||
|
||||
(a->instance && _cups_strcasecmp(a->instance, b->instance)))
|
||||
printf(" instance %-20.20s %-20.20s\n",
|
||||
printf(" instance %-24.24s %-24.24s\n",
|
||||
a->instance ? a->instance : "(null)",
|
||||
b->instance ? b->instance : "(null)");
|
||||
|
||||
if (a->num_options != b->num_options)
|
||||
printf(" num_options %-20d %-20d\n", a->num_options,
|
||||
printf(" num_options %-24d %-24d\n", a->num_options,
|
||||
b->num_options);
|
||||
|
||||
for (i = a->num_options, aoption = a->options; i > 0; i --, aoption ++)
|
||||
if ((bval = cupsGetOption(aoption->name, b->num_options,
|
||||
b->options)) == NULL ||
|
||||
strcmp(aoption->value, bval))
|
||||
printf(" %-20.20s %-20.20s %-20.20s\n", aoption->name,
|
||||
printf(" %-20.20s %-24.24s %-24.24s\n", aoption->name,
|
||||
aoption->value, bval ? bval : "(null)");
|
||||
|
||||
for (i = b->num_options, boption = b->options; i > 0; i --, boption ++)
|
||||
if (!cupsGetOption(boption->name, a->num_options, a->options))
|
||||
printf(" %-20.20s %-24.24s %-24.24s\n", boption->name,
|
||||
boption->value, "(null)");
|
||||
}
|
||||
|
||||
+56
-10
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* CUPS destination API test program for CUPS.
|
||||
*
|
||||
* Copyright 2012-2016 by Apple Inc.
|
||||
* Copyright 2012-2017 by Apple Inc.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
@@ -105,6 +105,14 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
else if (!strncmp(argv[1], "ipp://", 6) || !strncmp(argv[1], "ipps://", 7))
|
||||
dest = cupsGetDestWithURI(NULL, argv[1]);
|
||||
else if (!strcmp(argv[1], "default"))
|
||||
{
|
||||
dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL);
|
||||
if (dest && dest->instance)
|
||||
printf("default is \"%s/%s\".\n", dest->name, dest->instance);
|
||||
else
|
||||
printf("default is \"%s\".\n", dest->name);
|
||||
}
|
||||
else
|
||||
dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[1], NULL);
|
||||
|
||||
@@ -218,9 +226,9 @@ enum_cb(void *user_data, /* I - User data (unused) */
|
||||
(void)flags;
|
||||
|
||||
if (dest->instance)
|
||||
printf("%s/%s:\n", dest->name, dest->instance);
|
||||
printf("%s%s/%s:\n", (flags & CUPS_DEST_FLAGS_REMOVED) ? "REMOVE " : "", dest->name, dest->instance);
|
||||
else
|
||||
printf("%s:\n", dest->name);
|
||||
printf("%s%s:\n", (flags & CUPS_DEST_FLAGS_REMOVED) ? "REMOVE " : "", dest->name);
|
||||
|
||||
for (i = 0; i < dest->num_options; i ++)
|
||||
printf(" %s=\"%s\"\n", dest->options[i].name, dest->options[i].value);
|
||||
@@ -463,10 +471,37 @@ show_default(http_t *http, /* I - Connection to destination */
|
||||
cups_dinfo_t *dinfo, /* I - Destination information */
|
||||
const char *option) /* I - Option */
|
||||
{
|
||||
(void)http;
|
||||
(void)dest;
|
||||
(void)dinfo;
|
||||
(void)option;
|
||||
if (!strcmp(option, "media"))
|
||||
{
|
||||
/*
|
||||
* Show default media option...
|
||||
*/
|
||||
|
||||
cups_size_t size; /* Media size information */
|
||||
|
||||
if (cupsGetDestMediaDefault(http, dest, dinfo, CUPS_MEDIA_FLAGS_DEFAULT, &size))
|
||||
printf("%s (%.2fx%.2fmm, margins=[%.2f %.2f %.2f %.2f])\n", size.media, size.width * 0.01, size.length * 0.01, size.left * 0.01, size.bottom * 0.01, size.right * 0.01, size.top * 0.01);
|
||||
else
|
||||
puts("FAILED");
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Show default other option...
|
||||
*/
|
||||
|
||||
ipp_attribute_t *defattr; /* Default attribute */
|
||||
|
||||
if ((defattr = cupsFindDestDefault(http, dest, dinfo, option)) != NULL)
|
||||
{
|
||||
char value[1024]; /* Value of default attribute */
|
||||
|
||||
ippAttributeString(defattr, value, sizeof(value));
|
||||
puts(value);
|
||||
}
|
||||
else
|
||||
puts("FAILED");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -594,7 +629,8 @@ show_supported(http_t *http, /* I - Connection to destination */
|
||||
}
|
||||
else if (!value)
|
||||
{
|
||||
puts(option);
|
||||
printf("%s (%s - %s)\n", option, cupsLocalizeDestOption(http, dest, dinfo, option), cupsCheckDestSupported(http, dest, dinfo, option, NULL) ? "supported" : "not-supported");
|
||||
|
||||
if ((attr = cupsFindDestSupported(http, dest, dinfo, option)) != NULL)
|
||||
{
|
||||
count = ippGetCount(attr);
|
||||
@@ -608,7 +644,13 @@ show_supported(http_t *http, /* I - Connection to destination */
|
||||
|
||||
case IPP_TAG_ENUM :
|
||||
for (i = 0; i < count; i ++)
|
||||
printf(" %s\n", ippEnumString(option, ippGetInteger(attr, i)));
|
||||
{
|
||||
int val = ippGetInteger(attr, i);
|
||||
char valstr[256];
|
||||
|
||||
snprintf(valstr, sizeof(valstr), "%d", val);
|
||||
printf(" %s (%s)\n", ippEnumString(option, ippGetInteger(attr, i)), cupsLocalizeDestValue(http, dest, dinfo, option, valstr));
|
||||
}
|
||||
break;
|
||||
|
||||
case IPP_TAG_RANGE :
|
||||
@@ -634,11 +676,15 @@ show_supported(http_t *http, /* I - Connection to destination */
|
||||
}
|
||||
break;
|
||||
|
||||
case IPP_TAG_KEYWORD :
|
||||
for (i = 0; i < count; i ++)
|
||||
printf(" %s (%s)\n", ippGetString(attr, i, NULL), cupsLocalizeDestValue(http, dest, dinfo, option, ippGetString(attr, i, NULL)));
|
||||
break;
|
||||
|
||||
case IPP_TAG_TEXTLANG :
|
||||
case IPP_TAG_NAMELANG :
|
||||
case IPP_TAG_TEXT :
|
||||
case IPP_TAG_NAME :
|
||||
case IPP_TAG_KEYWORD :
|
||||
case IPP_TAG_URI :
|
||||
case IPP_TAG_URISCHEME :
|
||||
case IPP_TAG_CHARSET :
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* CUPS cupsGetDests API test program for CUPS.
|
||||
*
|
||||
* Copyright 2017 by Apple Inc.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
* property of Apple Inc. and are protected by Federal copyright
|
||||
* law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
* which should have been included with this file. If this file is
|
||||
* missing or damaged, see the license at "http://www.cups.org/".
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "cups.h"
|
||||
#include <sys/time.h>
|
||||
|
||||
|
||||
/*
|
||||
* 'main()' - Loop calling cupsGetDests.
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
main(void)
|
||||
{
|
||||
int num_dests; /* Number of destinations */
|
||||
cups_dest_t *dests; /* Destinations */
|
||||
struct timeval start, end; /* Start and stop time */
|
||||
double secs; /* Total seconds to run cupsGetDests */
|
||||
|
||||
|
||||
for (;;)
|
||||
{
|
||||
gettimeofday(&start, NULL);
|
||||
num_dests = cupsGetDests(&dests);
|
||||
gettimeofday(&end, NULL);
|
||||
secs = end.tv_sec - start.tv_sec + 0.000001 * (end.tv_usec - start.tv_usec);
|
||||
|
||||
printf("Found %d printers in %.3f seconds...\n", num_dests, secs);
|
||||
|
||||
cupsFreeDests(num_dests, dests);
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais
Referência em uma Nova Issue
Bloquear um usuário