From: Michael Sweet Date: Tue, 15 Mar 2016 14:40:26 +0000 (-0400) Subject: Import CUPS v2.0rc1 X-Git-Tag: release-2.0rc1^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5d2cc5d32da88d72b6e9bbf5e89e05ca23f0a067;p=thirdparty%2Fcups.git Import CUPS v2.0rc1 --- diff --git a/CHANGES.txt b/CHANGES.txt index eb812c4d7f..b7c0b26a0c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,28 @@ -CHANGES.txt - 2.0b1 - 2014-07-30 --------------------------------- +CHANGES.txt - 2.0rc1 - 2014-09-02 +--------------------------------- + +CHANGES IN CUPS V2.0rc1 + + - Documentation updates (STR #4464) + - The scheduler now monitors the AC power status on OS X, allowing for + "sleep printing" when sharing printers () + - The scheduler incorrectly called launch_activate_socket multiple times + on OS X () + - The ippserver test program now passes the IPP Everywhere self- + certification tests (STR #4101) + - Relaxed the new OS X filter sandbox slightly (STR #4471, + ) + - Dropped the old Epson Stylus Color/Photo sample drivers since they + don't work with any current printers and there are free alternatives + that produce much better output () + - Log and configuration files that are not world-readable are again + accessible via the web interface (STR #4461) + - PPD files are now created using the permissions specified by the + ConfigFilePerm directive. + - Fixed RPM build issues (STR #4459) + - Fixed the spinner image and restart page when reconfiguring the + scheduler through the web interface (STR #4475) + CHANGES IN CUPS V2.0b1 diff --git a/INSTALL.txt b/INSTALL.txt index feeafe7c2d..77b1628c14 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -1,5 +1,5 @@ -INSTALL - CUPS v2.0b1 - 2014-07-30 ----------------------------------- +INSTALL - CUPS v2.0rc1 - 2014-09-02 +----------------------------------- 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 @@ -165,17 +165,11 @@ CREATING BINARY DISTRIBUTIONS WITH EPM following: epm - Builds a script + tarfile package - aix - Builds an AIX package bsd - Builds a *BSD package deb - Builds a Debian package - depot - Builds a HP-UX package (also swinstall) - inst - Builds an IRIX package (also tardist) pkg - Builds a Solaris package rpm - Builds a RPM package - setld - Build a Tru64 UNIX package slackware - Build a Slackware package - swinstall - Build a HP-UX package (also depot) - tardist - Builds an IRIX package (also inst) GETTING DEBUG LOGGING FROM CUPS diff --git a/Makefile b/Makefile index 79e46a3aa3..84d3cce028 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 12074 2014-07-31 01:10:14Z msweet $" +# "$Id: Makefile 12145 2014-09-02 15:00:50Z msweet $" # # Top-level Makefile for CUPS. # @@ -319,7 +319,7 @@ sloc: EPMFLAGS = -v --output-dir dist $(EPMARCH) -bsd deb pkg slackware tardist: +bsd deb pkg slackware: epm $(EPMFLAGS) -f $@ cups packaging/cups.list epm: @@ -348,5 +348,5 @@ dist: all # -# End of "$Id: Makefile 12074 2014-07-31 01:10:14Z msweet $". +# End of "$Id: Makefile 12145 2014-09-02 15:00:50Z msweet $". # diff --git a/README.txt b/README.txt index 2f5722c1fc..d9c0adb55a 100644 --- a/README.txt +++ b/README.txt @@ -1,5 +1,5 @@ -README - CUPS v2.0b1 - 2014-07-30 ---------------------------------- +README - CUPS v2.0rc1 - 2014-09-02 +---------------------------------- ******************************************************************************** ******************************************************************************** @@ -54,10 +54,10 @@ READING THE DOCUMENTATION GETTING SUPPORT AND OTHER RESOURCES - If you have problems, READ THE DOCUMENTATION FIRST! We also provide many - discussion forums which are available at: + If you have problems, READ THE DOCUMENTATION FIRST! We also provide two + mailing lists which are available at: - http://www.cups.org/newsgroups.php + http://www.cups.org/lists.php See the CUPS web site at "http://www.cups.org/" for other resources. @@ -91,10 +91,6 @@ SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE ----------------------------- ------------------------------ Dymo Label Printers drv:///sample.drv/dymo.ppd Intellitech Intellibar drv:///sample.drv/intelbar.ppd - EPSON Stylus Color Series drv:///sample.drv/stcolor.ppd - EPSON Stylus Photo Series drv:///sample.drv/stphoto.ppd - EPSON Stylus New Color Series drv:///sample.drv/stcolor2.ppd - EPSON Stylus New Photo Series drv:///sample.drv/stphoto2.ppd EPSON 9-pin Series drv:///sample.drv/epson9.ppd EPSON 24-pin Series drv:///sample.drv/epson24.ppd Generic PCL Laser Printer drv:///sample.drv/generpcl.ppd @@ -126,11 +122,7 @@ SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE lpadmin -p printername -E -v lpd://11.22.33.44/ -m ppd-name The sample drivers provide basic printing capabilities, but generally do not - exercise the full potential of the printers or CUPS. The CUPS web site - provides links and drivers: - - http://www.cups.org/ppd.php PPD files - http://www.cups.org/links.php Links to other drivers + exercise the full potential of the printers or CUPS. PRINTING FILES @@ -147,8 +139,8 @@ PRINTING FILES lpr -o media=A4 -o resolution=600dpi filename CUPS recognizes many types of images files as well as PDF, PostScript, - HP-GL/2, and text files, so you can print those files directly rather than - through an application. + and text files, so you can print those files directly rather than through + an application. If you have an application that generates output specifically for your printer then you need to use the "-oraw" or "-l" options: @@ -156,8 +148,7 @@ PRINTING FILES lp -o raw filename lpr -l filename - This will prevent the filters from misinterpreting your print - file. + This will prevent the filters from misinterpreting your print file. LEGAL STUFF @@ -167,8 +158,6 @@ LEGAL STUFF The MD5 Digest code is Copyright 1999 Aladdin Enterprises. - This software is based in part on the work of the Independent JPEG Group. - CUPS is provided under the terms of version 2 of the GNU General Public License and GNU Library General Public License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even diff --git a/backend/network.c b/backend/network.c index fa016c655c..2cf5f72b9c 100644 --- a/backend/network.c +++ b/backend/network.c @@ -1,5 +1,5 @@ /* - * "$Id: network.c 11970 2014-07-01 14:35:25Z msweet $" + * "$Id: network.c 12124 2014-08-28 15:37:22Z msweet $" * * Common backend network APIs for CUPS. * @@ -175,13 +175,13 @@ backendNetworkSideCB( { case CUPS_ASN1_BOOLEAN : snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%d", packet.object_value.boolean); - datalen += strlen(dataptr); + datalen += (int)strlen(dataptr); break; case CUPS_ASN1_INTEGER : snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%d", packet.object_value.integer); - datalen += strlen(dataptr); + datalen += (int)strlen(dataptr); break; case CUPS_ASN1_BIT_STRING : @@ -193,13 +193,13 @@ backendNetworkSideCB( memcpy(dataptr, packet.object_value.string.bytes, i); - datalen += i; + datalen += (int)i; break; case CUPS_ASN1_OID : _cupsSNMPOIDToString(packet.object_value.oid, dataptr, sizeof(data) - (size_t)(dataptr - data)); - datalen += strlen(dataptr); + datalen += (int)strlen(dataptr); break; case CUPS_ASN1_HEX_STRING : @@ -208,22 +208,22 @@ backendNetworkSideCB( dataptr < (data + sizeof(data) - 3); i ++, dataptr += 2) sprintf(dataptr, "%02X", packet.object_value.string.bytes[i]); - datalen += strlen(dataptr); + datalen += (int)strlen(dataptr); break; case CUPS_ASN1_COUNTER : snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.counter); - datalen += strlen(dataptr); + datalen += (int)strlen(dataptr); break; case CUPS_ASN1_GAUGE : snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.gauge); - datalen += strlen(dataptr); + datalen += (int)strlen(dataptr); break; case CUPS_ASN1_TIMETICKS : snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.timeticks); - datalen += strlen(dataptr); + datalen += (int)strlen(dataptr); break; default : @@ -304,5 +304,5 @@ backendNetworkSideCB( /* - * End of "$Id: network.c 11970 2014-07-01 14:35:25Z msweet $". + * End of "$Id: network.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/backend/usb-unix.c b/backend/usb-unix.c index 5e63a0e41e..813039d1eb 100644 --- a/backend/usb-unix.c +++ b/backend/usb-unix.c @@ -1,5 +1,5 @@ /* - * "$Id: usb-unix.c 11342 2013-10-18 20:36:01Z msweet $" + * "$Id: usb-unix.c 12124 2014-08-28 15:37:22Z msweet $" * * USB port backend for CUPS. * @@ -146,7 +146,7 @@ print_device(const char *uri, /* I - Device URI */ tcgetattr(device_fd, &opts); - opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ + opts.c_lflag &= ~(unsigned)(ICANON | ECHO | ISIG); /* Raw mode */ /**** No options supported yet ****/ @@ -603,5 +603,5 @@ side_cb(int print_fd, /* I - Print file */ /* - * End of "$Id: usb-unix.c 11342 2013-10-18 20:36:01Z msweet $". + * End of "$Id: usb-unix.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c index b4ed294f5a..9de2424c3c 100644 --- a/cgi-bin/admin.c +++ b/cgi-bin/admin.c @@ -1,5 +1,5 @@ /* - * "$Id: admin.c 11594 2014-02-14 20:09:01Z msweet $" + * "$Id: admin.c 12123 2014-08-28 14:24:45Z msweet $" * * Administration CGI for CUPS. * @@ -1897,7 +1897,7 @@ do_config_server(http_t *http) /* I - HTTP connection */ } else { - cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect"); + cgiSetVariable("refresh_page", "5;URL=/admin/"); cgiStartHTML(cgiText(_("Edit Configuration File"))); cgiCopyTemplateLang("restart.tmpl"); @@ -4198,5 +4198,5 @@ get_points(double number, /* I - Original number */ /* - * End of "$Id: admin.c 11594 2014-02-14 20:09:01Z msweet $". + * End of "$Id: admin.c 12123 2014-08-28 14:24:45Z msweet $". */ diff --git a/config-scripts/cups-common.m4 b/config-scripts/cups-common.m4 index 5822fe53ec..20168172cc 100644 --- a/config-scripts/cups-common.m4 +++ b/config-scripts/cups-common.m4 @@ -1,5 +1,5 @@ dnl -dnl "$Id: cups-common.m4 12073 2014-07-31 00:58:00Z msweet $" +dnl "$Id: cups-common.m4 12140 2014-08-30 01:51:22Z msweet $" dnl dnl Common configuration stuff for CUPS. dnl @@ -20,7 +20,7 @@ dnl Set the name of the config header file... AC_CONFIG_HEADER(config.h) dnl Version number information... -CUPS_VERSION=2.0b1 +CUPS_VERSION=2.0rc1 CUPS_REVISION= #if test -z "$CUPS_REVISION" -a -d .svn; then # CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`" @@ -369,9 +369,6 @@ case $uname in AC_CHECK_HEADER(membershipPriv.h,AC_DEFINE(HAVE_MEMBERSHIPPRIV_H)) AC_CHECK_FUNCS(mbr_uid_to_uuid) - dnl Check for the vproc_transaction_begin/end stuff... - AC_CHECK_FUNCS(vproc_transaction_begin) - dnl Need header... AC_CHECK_HEADER(dlfcn.h,AC_DEFINE(HAVE_DLFCN_H)) @@ -465,5 +462,5 @@ esac AC_SUBST(BUILDDIRS) dnl -dnl End of "$Id: cups-common.m4 12073 2014-07-31 00:58:00Z msweet $". +dnl End of "$Id: cups-common.m4 12140 2014-08-30 01:51:22Z msweet $". dnl diff --git a/config-scripts/cups-compiler.m4 b/config-scripts/cups-compiler.m4 index 421bfe7753..ca3bae8e07 100644 --- a/config-scripts/cups-compiler.m4 +++ b/config-scripts/cups-compiler.m4 @@ -1,5 +1,5 @@ dnl -dnl "$Id: cups-compiler.m4 11683 2014-03-05 20:00:54Z msweet $" +dnl "$Id: cups-compiler.m4 12122 2014-08-28 12:55:52Z msweet $" dnl dnl Compiler stuff for CUPS. dnl @@ -110,7 +110,7 @@ if test -n "$GCC"; then # The -fstack-protector option is available with some versions of # GCC and adds "stack canaries" which detect when the return address # has been overwritten, preventing many types of exploit attacks. - AC_MSG_CHECKING(if GCC supports -fstack-protector) + AC_MSG_CHECKING(whether compiler supports -fstack-protector) OLDCFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fstack-protector" AC_TRY_LINK(,, @@ -130,7 +130,7 @@ if test -n "$GCC"; then # exploits that depend on a fixed address for common functions. # # Not available to LSB binaries... - AC_MSG_CHECKING(if GCC supports -fPIE) + AC_MSG_CHECKING(whether compiler supports -fPIE) OLDCFLAGS="$CFLAGS" case "$uname" in Darwin*) @@ -154,9 +154,18 @@ if test -n "$GCC"; then if test "x$with_optim" = x; then # Add useful warning options for tracking down problems... - OPTIM="-Wall -Wno-format-y2k -Wsign-conversion -Wunused $OPTIM" + OPTIM="-Wall -Wno-format-y2k -Wunused $OPTIM" - AC_MSG_CHECKING(if GCC supports -Wno-tautological-compare) + AC_MSG_CHECKING(whether compiler supports -Wsign-conversion) + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wsign-conversion" + AC_TRY_COMPILE(,, + [OPTIM="$OPTIM -Wsign-conversion" + AC_MSG_RESULT(yes)], + AC_MSG_RESULT(no)) + CFLAGS="$OLDCFLAGS" + + AC_MSG_CHECKING(whether compiler supports -Wno-tautological-compare) OLDCFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror -Wno-tautological-compare" AC_TRY_COMPILE(,, @@ -211,7 +220,7 @@ else # should contribute the necessary options to # cups-support@cups.org... echo "Building CUPS with default compiler optimizations; contact" - echo "cups-bugs@cups.org with uname and compiler options needed" + echo "cups-devel@cups.org with uname and compiler options needed" echo "for your platform, or set the CFLAGS and LDFLAGS environment" echo "variables before running configure." ;; @@ -228,5 +237,5 @@ case $uname in esac dnl -dnl End of "$Id: cups-compiler.m4 11683 2014-03-05 20:00:54Z msweet $". +dnl End of "$Id: cups-compiler.m4 12122 2014-08-28 12:55:52Z msweet $". dnl diff --git a/config-scripts/cups-ssl.m4 b/config-scripts/cups-ssl.m4 index cdd035c5ae..97760ca241 100644 --- a/config-scripts/cups-ssl.m4 +++ b/config-scripts/cups-ssl.m4 @@ -1,5 +1,5 @@ dnl -dnl "$Id: cups-ssl.m4 11911 2014-06-10 13:54:53Z msweet $" +dnl "$Id: cups-ssl.m4 12122 2014-08-28 12:55:52Z msweet $" dnl dnl TLS stuff for CUPS. dnl @@ -78,6 +78,11 @@ if test x$enable_ssl != xno; then if test $have_ssl = 1; then CUPS_SERVERCERT="ssl/server.crt" CUPS_SERVERKEY="ssl/server.key" + + SAVELIBS="$LIBS" + LIBS="$LIBS $SSLLIBS" + AC_CHECK_FUNC(gnutls_transport_set_pull_timeout_function, AC_DEFINE(HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION)) + LIBS="$SAVELIBS" fi fi fi @@ -101,5 +106,5 @@ EXPORT_SSLLIBS="$SSLLIBS" AC_SUBST(EXPORT_SSLLIBS) dnl -dnl End of "$Id: cups-ssl.m4 11911 2014-06-10 13:54:53Z msweet $". +dnl End of "$Id: cups-ssl.m4 12122 2014-08-28 12:55:52Z msweet $". dnl diff --git a/config.h.in b/config.h.in index c3347945ba..0d11eff695 100644 --- a/config.h.in +++ b/config.h.in @@ -1,5 +1,5 @@ /* - * "$Id: config.h.in 11717 2014-03-21 16:42:53Z msweet $" + * "$Id: config.h.in 12140 2014-08-30 01:51:22Z msweet $" * * Configuration file for CUPS. * @@ -93,7 +93,7 @@ * Default MaxCopies value... */ -#define CUPS_DEFAULT_MAX_COPIES 100 +#define CUPS_DEFAULT_MAX_COPIES 9999 /* @@ -150,10 +150,7 @@ * Do we have PAM stuff? */ -#ifndef HAVE_LIBPAM #define HAVE_LIBPAM 0 -#endif /* !HAVE_LIBPAM */ - #undef HAVE_PAM_PAM_APPL_H #undef HAVE_PAM_SET_ITEM #undef HAVE_PAM_SETCRED @@ -297,9 +294,17 @@ #undef HAVE_CDSASSL #undef HAVE_GNUTLS +#undef HAVE_SSPISSL #undef HAVE_SSL +/* + * Do we have the gnutls_transport_set_pull_timeout_function function? + */ + +#undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION + + /* * What Security framework headers do we have? */ @@ -632,13 +637,6 @@ #endif /* HAVE_ARC4RANDOM */ -/* - * Do we have vproc_transaction_begin/end? - */ - -#undef HAVE_VPROC_TRANSACTION_BEGIN - - /* * Do we have libusb? */ @@ -714,5 +712,5 @@ static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); } #endif /* !_CUPS_CONFIG_H_ */ /* - * End of "$Id: config.h.in 11717 2014-03-21 16:42:53Z msweet $". + * End of "$Id: config.h.in 12140 2014-08-30 01:51:22Z msweet $". */ diff --git a/configure b/configure index 4b270fee79..dab003f8ca 100755 --- a/configure +++ b/configure @@ -2520,7 +2520,7 @@ esac ac_config_headers="$ac_config_headers config.h" -CUPS_VERSION=2.0b1 +CUPS_VERSION=2.0rc1 CUPS_REVISION= #if test -z "$CUPS_REVISION" -a -d .svn; then # CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`" @@ -5692,18 +5692,6 @@ if test "x$ac_cv_func_mbr_uid_to_uuid" = xyes; then : #define HAVE_MBR_UID_TO_UUID 1 _ACEOF -fi -done - - - for ac_func in vproc_transaction_begin -do : - ac_fn_c_check_func "$LINENO" "vproc_transaction_begin" "ac_cv_func_vproc_transaction_begin" -if test "x$ac_cv_func_vproc_transaction_begin" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_VPROC_TRANSACTION_BEGIN 1 -_ACEOF - fi done @@ -6625,8 +6613,8 @@ if test -n "$GCC"; then # The -fstack-protector option is available with some versions of # GCC and adds "stack canaries" which detect when the return address # has been overwritten, preventing many types of exploit attacks. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fstack-protector" >&5 -$as_echo_n "checking if GCC supports -fstack-protector... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fstack-protector" >&5 +$as_echo_n "checking whether compiler supports -fstack-protector... " >&6; } OLDCFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fstack-protector" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6663,8 +6651,8 @@ rm -f core conftest.err conftest.$ac_objext \ # exploits that depend on a fixed address for common functions. # # Not available to LSB binaries... - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fPIE" >&5 -$as_echo_n "checking if GCC supports -fPIE... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -fPIE" >&5 +$as_echo_n "checking whether compiler supports -fPIE... " >&6; } OLDCFLAGS="$CFLAGS" case "$uname" in Darwin*) @@ -6722,10 +6710,36 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "x$with_optim" = x; then # Add useful warning options for tracking down problems... - OPTIM="-Wall -Wno-format-y2k -Wsign-conversion -Wunused $OPTIM" + OPTIM="-Wall -Wno-format-y2k -Wunused $OPTIM" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wsign-conversion" >&5 +$as_echo_n "checking whether compiler supports -Wsign-conversion... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wsign-conversion" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + OPTIM="$OPTIM -Wsign-conversion" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -Wno-tautological-compare" >&5 -$as_echo_n "checking if GCC supports -Wno-tautological-compare... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-tautological-compare" >&5 +$as_echo_n "checking whether compiler supports -Wno-tautological-compare... " >&6; } OLDCFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Werror -Wno-tautological-compare" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6796,7 +6810,7 @@ else # should contribute the necessary options to # cups-support@cups.org... echo "Building CUPS with default compiler optimizations; contact" - echo "cups-bugs@cups.org with uname and compiler options needed" + echo "cups-devel@cups.org with uname and compiler options needed" echo "for your platform, or set the CFLAGS and LDFLAGS environment" echo "variables before running configure." ;; @@ -8295,6 +8309,16 @@ fi if test $have_ssl = 1; then CUPS_SERVERCERT="ssl/server.crt" CUPS_SERVERKEY="ssl/server.key" + + SAVELIBS="$LIBS" + LIBS="$LIBS $SSLLIBS" + ac_fn_c_check_func "$LINENO" "gnutls_transport_set_pull_timeout_function" "ac_cv_func_gnutls_transport_set_pull_timeout_function" +if test "x$ac_cv_func_gnutls_transport_set_pull_timeout_function" = xyes; then : + $as_echo "#define HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION 1" >>confdefs.h + +fi + + LIBS="$SAVELIBS" fi fi fi diff --git a/cups/Dependencies b/cups/Dependencies index 54bd08c7c6..64a0d19d10 100644 --- a/cups/Dependencies +++ b/cups/Dependencies @@ -4,8 +4,9 @@ adminutil.o: adminutil.c cups-private.h string-private.h ../config.h \ md5-private.h language-private.h ../cups/transcode.h pwg-private.h \ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \ thread-private.h adminutil.h -array.o: array.c string-private.h ../config.h debug-private.h \ - ../cups/versioning.h array-private.h ../cups/array.h +array.o: array.c ../cups/cups.h file.h versioning.h ipp.h http.h array.h \ + language.h pwg.h string-private.h ../config.h debug-private.h \ + array-private.h attr.o: attr.c cups-private.h string-private.h ../config.h \ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \ @@ -223,8 +224,12 @@ snmp.o: snmp.c cups-private.h string-private.h ../config.h \ ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \ thread-private.h snmp-private.h snprintf.o: snprintf.c string-private.h ../config.h -string.o: string.c string-private.h ../config.h debug-private.h \ - ../cups/versioning.h thread-private.h array.h +string.o: string.c cups-private.h string-private.h ../config.h \ + debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \ + ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \ + md5-private.h language-private.h ../cups/transcode.h pwg-private.h \ + ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \ + thread-private.h tempfile.o: tempfile.c cups-private.h string-private.h ../config.h \ debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \ ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \ diff --git a/cups/api-filter.shtml b/cups/api-filter.shtml index 4b8372edda..7c33179c8e 100644 --- a/cups/api-filter.shtml +++ b/cups/api-filter.shtml @@ -3,7 +3,7 @@ Filter and backend programming introduction for CUPS. - Copyright 2007-2013 by Apple Inc. + Copyright 2007-2014 by Apple Inc. Copyright 1997-2006 by Easy Software Products, all rights reserved. These coded instructions, statements, and computer programs are the @@ -81,7 +81,7 @@ directory to write to.

In addition, some operating systems provide additional security mechanisms that further limit file system access, even for backends running as root. On -OS X, for example, no backend may write to a user's home directory.

+OS X, for example, no backend may write to a user's home directory. See the Sandboxing on OS X section for more information.

Canceled Jobs and Signal Handling

@@ -852,3 +852,25 @@ void *my_data; cupsSNMPSideChannelWalk(".1.3.6.1.2.1.43", 5.0, my_callback, my_data); + +

Sandboxing on OS X

+ +

Starting with OS X 10.6, filters and backends are run inside a security "sandbox" which further limits (beyond the normal UNIX user/group permissions) what a filter or backend can do. This helps to both secure the printing system from malicious software and enforce the functional separation of components in the CUPS filter chain. What follows is a list of actions that are explicitly allowed for all filters and backends:

+ +
    + +
  1. Reading of files: pursuant to normal UNIX file permissions, filters and backends can read files for the current job from the /private/var/spool/cups directory and other files on mounted filesystems except for user home directories under /Users.
  2. + +
  3. Writing of files: pursuant to normal UNIX file permissions, filters and backends can read/write files to the cache directory specified by the CUPS_CACHEDIR environment variable, to the state directory specified by the CUPS_STATEDIR environment variable, to the temporary directory specified by the TMPDIR environment variable, and under the /private/var/db, /private/var/folders, /private/var/lib, /private/var/mysql, /private/var/run, /private/var/spool (except /private/var/spool/cups), /Library/Application Support, /Library/Caches, /Library/Logs, /Library/Preferences, /Library/WebServer, and /Users/Shared directories.
  4. + +
  5. Execution of programs: pursuant to normal UNIX file permissions, filters and backends can execute any program not located under the /Users directory. Child processes inherit the sandbox and are subject to the same restrictions as the parent.
  6. + +
  7. Bluetooth and USB: backends can access Bluetooth and USB printers through IOKit. Filters cannot access Bluetooth and USB printers directly.
  8. + +
  9. Network: filters and backends can access UNIX domain sockets under the /private/tmp, /private/var/run, and /private/var/tmp directories. Backends can also create IPv4 and IPv6 TCP (outgoing) and UDP (incoming and outgoing) socket, and bind to local source ports. Filters cannot directly create IPv4 and IPv6 TCP or UDP sockets.
  10. + +
  11. Notifications: filters and backends can send notifications via the Darwin notify_post() API.
  12. + +
+ +
Note: The sandbox profile used in CUPS 2.0 still allows some actions that are not listed above - these privileges will be removed over time until the profile matches the list above.
diff --git a/cups/cups.h b/cups/cups.h index 77e824d0bc..b7047dae5b 100644 --- a/cups/cups.h +++ b/cups/cups.h @@ -1,5 +1,5 @@ /* - * "$Id: cups.h 11884 2014-05-16 21:54:22Z msweet $" + * "$Id: cups.h 12094 2014-08-19 12:15:11Z msweet $" * * API definitions for CUPS. * @@ -615,7 +615,7 @@ extern int cupsGetDestMediaDefault(http_t *http, cups_dest_t *dest, extern void cupsSetUserAgent(const char *user_agent) _CUPS_API_1_7; extern const char *cupsUserAgent(void) _CUPS_API_1_7; -/* New in CUPS 2.0 */ +/* New in CUPS 2.0/OS X 10.10 */ extern cups_dest_t *cupsGetDestWithURI(const char *name, const char *uri) _CUPS_API_2_0; extern const char *cupsLocalizeDestMedia(http_t *http, cups_dest_t *dest, cups_dinfo_t *info, unsigned flags, cups_size_t *size) _CUPS_API_2_0; extern int cupsMakeServerCredentials(const char *path, const char *common_name, int num_alt_names, const char **alt_names, time_t expiration_date) _CUPS_API_2_0; @@ -628,5 +628,5 @@ extern int cupsSetServerCredentials(const char *path, const char *common_name, #endif /* !_CUPS_CUPS_H_ */ /* - * End of "$Id: cups.h 11884 2014-05-16 21:54:22Z msweet $". + * End of "$Id: cups.h 12094 2014-08-19 12:15:11Z msweet $". */ diff --git a/cups/dest-localization.c b/cups/dest-localization.c index f2bb9eb066..d76ae2b243 100644 --- a/cups/dest-localization.c +++ b/cups/dest-localization.c @@ -1,5 +1,5 @@ /* - * "$Id: dest-localization.c 11894 2014-05-23 03:18:00Z msweet $" + * "$Id: dest-localization.c 12094 2014-08-19 12:15:11Z msweet $" * * Destination localization support for CUPS. * @@ -38,7 +38,7 @@ static char *cups_scan_strings(char *buffer); * The returned string is stored in the destination information and will become * invalid if the destination information is deleted. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS X 10.10@ */ const char * /* O - Localized string */ @@ -535,5 +535,5 @@ cups_scan_strings(char *buffer) /* I - Start of string */ /* - * End of "$Id: dest-localization.c 11894 2014-05-23 03:18:00Z msweet $". + * End of "$Id: dest-localization.c 12094 2014-08-19 12:15:11Z msweet $". */ diff --git a/cups/dest.c b/cups/dest.c index ab36a06600..9e88aede6c 100644 --- a/cups/dest.c +++ b/cups/dest.c @@ -1,5 +1,5 @@ /* - * "$Id: dest.c 11959 2014-06-26 18:30:19Z msweet $" + * "$Id: dest.c 12094 2014-08-19 12:15:11Z msweet $" * * User-defined destination (and option) support for CUPS. * @@ -1310,7 +1310,7 @@ _cupsGetDestResource( * * "uri" is the "ipp" or "ipps" URI for the printer. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS X 10.10@ */ cups_dest_t * /* O - Destination or @code NULL@ */ @@ -3942,5 +3942,5 @@ cups_make_string( /* - * End of "$Id: dest.c 11959 2014-06-26 18:30:19Z msweet $". + * End of "$Id: dest.c 12094 2014-08-19 12:15:11Z msweet $". */ diff --git a/cups/globals.c b/cups/globals.c index 40727381d0..374f85005e 100644 --- a/cups/globals.c +++ b/cups/globals.c @@ -1,5 +1,5 @@ /* - * "$Id: globals.c 11851 2014-05-07 23:55:35Z msweet $" + * "$Id: globals.c 12124 2014-08-28 15:37:22Z msweet $" * * Global variable access routines for CUPS. * @@ -361,7 +361,9 @@ cups_globals_free(_cups_globals_t *cg) /* I - Pointer to global data */ httpClose(cg->http); +#ifdef HAVE_SSL _httpFreeCredentials(cg->tls_credentials); +#endif /* HAVE_SSL */ cupsFileClose(cg->stdio_files[0]); cupsFileClose(cg->stdio_files[1]); @@ -392,5 +394,5 @@ cups_globals_init(void) /* - * End of "$Id: globals.c 11851 2014-05-07 23:55:35Z msweet $". + * End of "$Id: globals.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/cups/http-addr.c b/cups/http-addr.c index 51bf039a58..3f68d0d498 100644 --- a/cups/http-addr.c +++ b/cups/http-addr.c @@ -1,5 +1,5 @@ /* - * "$Id: http-addr.c 11627 2014-02-20 16:15:09Z msweet $" + * "$Id: http-addr.c 12129 2014-08-28 19:26:31Z msweet $" * * HTTP address routines for CUPS. * @@ -64,7 +64,7 @@ httpAddrAny(const http_addr_t *addr) /* I - Address to check */ * listen address for sockets created with @link httpAddrListen@. This will * ensure that domain sockets are removed when closed. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 0 on success, -1 on failure */ @@ -653,7 +653,7 @@ httpAddrString(const http_addr_t *addr, /* I - Address to convert */ * * Returns @code NULL@ if the socket is currently unconnected. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ http_addr_t * /* O - Connected address or @code NULL@ */ @@ -865,6 +865,13 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */ } #endif /* HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */ } + + /* + * Make sure .local hostnames end with a period... + */ + + if (strlen(s) > 6 && !strcmp(s + strlen(s) - 6, ".local")) + strlcat(s, ".", (size_t)slen); } /* @@ -879,7 +886,7 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */ * 'httpResolveHostname()' - Resolve the hostname of the HTTP connection * address. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ const char * /* O - Resolved hostname or @code NULL@ */ @@ -917,5 +924,5 @@ httpResolveHostname(http_t *http, /* I - HTTP connection */ /* - * End of "$Id: http-addr.c 11627 2014-02-20 16:15:09Z msweet $". + * End of "$Id: http-addr.c 12129 2014-08-28 19:26:31Z msweet $". */ diff --git a/cups/http-private.h b/cups/http-private.h index 23aee761f2..2c18052c5c 100644 --- a/cups/http-private.h +++ b/cups/http-private.h @@ -1,5 +1,5 @@ /* - * "$Id: http-private.h 12044 2014-07-17 21:21:21Z msweet $" + * "$Id: http-private.h 12126 2014-08-28 16:02:00Z msweet $" * * Private HTTP definitions for CUPS. * @@ -76,7 +76,6 @@ typedef int socklen_t; # ifdef HAVE_GNUTLS # include # include -# include # elif defined(HAVE_CDSASSL) # include # include @@ -439,5 +438,5 @@ extern int _httpWait(http_t *http, int msec, int usessl); #endif /* !_CUPS_HTTP_PRIVATE_H_ */ /* - * End of "$Id: http-private.h 12044 2014-07-17 21:21:21Z msweet $". + * End of "$Id: http-private.h 12126 2014-08-28 16:02:00Z msweet $". */ diff --git a/cups/http-support.c b/cups/http-support.c index 0f224097a0..7e30608ceb 100644 --- a/cups/http-support.c +++ b/cups/http-support.c @@ -1,5 +1,5 @@ /* - * "$Id: http-support.c 11844 2014-05-02 11:58:54Z msweet $" + * "$Id: http-support.c 12124 2014-08-28 15:37:22Z msweet $" * * HTTP support routines for CUPS. * @@ -649,7 +649,7 @@ httpDecode64_2(char *out, /* I - String to write to */ break; case 3 : if (outptr < outend) - *outptr++ |= base64; + *outptr++ |= (char)base64; pos = 0; break; } @@ -1300,7 +1300,7 @@ httpSeparateURI( /* * 'httpStateString()' - Return the string describing a HTTP state value. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ const char * /* O - State string */ @@ -1433,7 +1433,7 @@ httpStatus(http_status_t status) /* I - HTTP status code */ /* * 'httpURIStatusString()' - Return a string describing a URI status code. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ const char * /* O - Localized status string */ @@ -2544,5 +2544,5 @@ http_resolve_cb( /* - * End of "$Id: http-support.c 11844 2014-05-02 11:58:54Z msweet $". + * End of "$Id: http-support.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/cups/http.c b/cups/http.c index b4c9d71fb8..b5cf4e167b 100644 --- a/cups/http.c +++ b/cups/http.c @@ -1,5 +1,5 @@ /* - * "$Id: http.c 12034 2014-07-16 19:37:34Z msweet $" + * "$Id: http.c 12125 2014-08-28 15:49:29Z msweet $" * * HTTP routines for CUPS. * @@ -393,7 +393,7 @@ httpClose(http_t *http) /* I - HTTP connection */ /* * 'httpCompareCredentials()' - Compare two sets of X.509 credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if they match, 0 if they do not */ @@ -759,7 +759,7 @@ httpGet(http_t *http, /* I - HTTP connection */ * * The return value is the UNIX time of the last read or write. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ time_t /* O - Time of last read or write */ @@ -911,7 +911,7 @@ httpGetCookie(http_t *http) /* I - HTTP connecion */ * @link httpIsEncrypted@ function to determine whether a TLS session has * been established. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ http_encryption_t /* O - Current encryption mode */ @@ -995,7 +995,7 @@ httpGetField(http_t *http, /* I - HTTP connection */ /* * 'httpGetKeepAlive()' - Get the current Keep-Alive state of the connection. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ http_keepalive_t /* O - Keep-Alive state */ @@ -1104,7 +1104,7 @@ httpGetLength2(http_t *http) /* I - HTTP connection */ /* * 'httpGetPending()' - Get the number of bytes that are buffered for writing. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Number of bytes buffered */ @@ -1117,7 +1117,7 @@ httpGetPending(http_t *http) /* I - HTTP connection */ /* * 'httpGetReady()' - Get the number of bytes that can be read without blocking. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Number of bytes available */ @@ -1143,7 +1143,7 @@ httpGetReady(http_t *http) /* I - HTTP connection */ * The @link httpIsChunked@ function can be used to determine whether the * message body is chunked or fixed-length. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Remaining bytes */ @@ -1582,7 +1582,7 @@ httpInitialize(void) * This function returns non-zero if the message body is composed of * variable-length chunks. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if chunked, 0 if not */ @@ -1597,7 +1597,7 @@ httpIsChunked(http_t *http) /* I - HTTP connection */ * * This function returns non-zero if the connection is currently encrypted. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if encrypted, 0 if not */ @@ -1793,8 +1793,8 @@ httpPeek(http_t *http, /* I - HTTP connection */ memcpy(http->sbuffer + http->stream.avail_in, http->buffer, buflen); http->stream.avail_in += buflen; - http->used -= buflen; - http->data_remaining -= buflen; + http->used -= (int)buflen; + http->data_remaining -= (off_t)buflen; if (http->used > 0) memmove(http->buffer, http->buffer + buflen, (size_t)http->used); @@ -2557,9 +2557,11 @@ httpSetCredentials(http_t *http, /* I - HTTP connection */ if (!http || cupsArrayCount(credentials) < 1) return (-1); +#ifdef HAVE_SSL _httpFreeCredentials(http->tls_credentials); http->tls_credentials = _httpCreateCredentials(credentials); +#endif /* HAVE_SSL */ return (http->tls_credentials ? 0 : -1); } @@ -2769,7 +2771,7 @@ httpSetField(http_t *http, /* I - HTTP connection */ /* * 'httpSetKeepAlive()' - Set the current Keep-Alive state of a connection. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ void @@ -2847,7 +2849,7 @@ httpSetTimeout( /* * 'httpShutdown()' - Shutdown one side of an HTTP connection. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ void @@ -2856,8 +2858,10 @@ httpShutdown(http_t *http) /* I - HTTP connection */ if (!http || http->fd < 0) return; +#ifdef HAVE_SSL if (http->tls) _httpTLSStop(http); +#endif /* HAVE_SSL */ #ifdef WIN32 shutdown(http->fd, SD_RECEIVE); /* Microsoft-ism... */ @@ -4822,5 +4826,5 @@ http_write_chunk(http_t *http, /* I - HTTP connection */ /* - * End of "$Id: http.c 12034 2014-07-16 19:37:34Z msweet $". + * End of "$Id: http.c 12125 2014-08-28 15:49:29Z msweet $". */ diff --git a/cups/http.h b/cups/http.h index bce03ca8ec..867517b719 100644 --- a/cups/http.h +++ b/cups/http.h @@ -1,5 +1,5 @@ /* - * "$Id: http.h 11850 2014-05-07 23:12:48Z msweet $" + * "$Id: http.h 12094 2014-08-19 12:15:11Z msweet $" * * Hyper-Text Transport Protocol definitions for CUPS. * @@ -342,7 +342,7 @@ typedef enum http_status_e /**** HTTP status codes ****/ # endif /* !_CUPS_NO_DEPRECATED */ } http_status_t; -typedef enum http_trust_e /**** Level of trust for credentials @since CUPS 2.0@ */ +typedef enum http_trust_e /**** Level of trust for credentials @since CUPS 2.0/OS 10.10@ */ { HTTP_TRUST_OK = 0, /* Credentials are OK/trusted */ HTTP_TRUST_INVALID, /* Credentials are invalid */ @@ -620,7 +620,7 @@ extern void httpSetDefaultField(http_t *http, http_field_t field, extern http_state_t httpWriteResponse(http_t *http, http_status_t status) _CUPS_API_1_7; -/* New in CUPS 2.0 */ +/* New in CUPS 2.0/OS X 10.10 */ extern int httpAddrClose(http_addr_t *addr, int fd) _CUPS_API_2_0; extern int httpAddrFamily(http_addr_t *addr) _CUPS_API_2_0; extern int httpCompareCredentials(cups_array_t *cred1, cups_array_t *cred2) _CUPS_API_2_0; @@ -656,5 +656,5 @@ extern const char *httpURIStatusString(http_uri_status_t status) _CUPS_API_2_0; #endif /* !_CUPS_HTTP_H_ */ /* - * End of "$Id: http.h 11850 2014-05-07 23:12:48Z msweet $". + * End of "$Id: http.h 12094 2014-08-19 12:15:11Z msweet $". */ diff --git a/cups/ipp-support.c b/cups/ipp-support.c index a94888160d..926be7a5ee 100644 --- a/cups/ipp-support.c +++ b/cups/ipp-support.c @@ -1,5 +1,5 @@ /* - * "$Id: ipp-support.c 11806 2014-04-09 16:12:27Z msweet $" + * "$Id: ipp-support.c 12095 2014-08-19 16:16:06Z msweet $" * * Internet Printing Protocol support functions for CUPS. * @@ -669,7 +669,14 @@ ippAttributeString( break; case IPP_TAG_RESOLUTION : - if (buffer && bufptr < bufend) + if (val->resolution.xres == val->resolution.yres) + { + if (buffer && bufptr < bufend) + bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + else + bufptr += snprintf(temp, sizeof(temp), "%d%s", val->resolution.xres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + } + else if (buffer && bufptr < bufend) bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else bufptr += snprintf(temp, sizeof(temp), "%dx%d%s", val->resolution.xres, val->resolution.yres, val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); @@ -2122,7 +2129,7 @@ ippSetPort(int p) /* I - Port number to use */ /* * 'ippStateString()' - Return the name corresponding to a state value. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ const char * /* O - State name */ @@ -2256,5 +2263,5 @@ ipp_col_string(ipp_t *col, /* I - Collection attribute */ /* - * End of "$Id: ipp-support.c 11806 2014-04-09 16:12:27Z msweet $". + * End of "$Id: ipp-support.c 12095 2014-08-19 16:16:06Z msweet $". */ diff --git a/cups/ipp.c b/cups/ipp.c index fab3384533..cc5eebcf89 100644 --- a/cups/ipp.c +++ b/cups/ipp.c @@ -1,5 +1,5 @@ /* - * "$Id: ipp.c 11840 2014-04-29 15:57:26Z msweet $" + * "$Id: ipp.c 12093 2014-08-19 12:10:17Z msweet $" * * Internet Printing Protocol functions for CUPS. * @@ -1728,7 +1728,7 @@ ippCopyAttribute( /* * 'ippCopyAttributes()' - Copy attributes from one IPP message to another. * - * Zero or more attributes are copied from the source IPP message, @code@ src, to the + * Zero or more attributes are copied from the source IPP message, @code src@, to the * destination IPP message, @code dst@. When @code quickcopy@ is non-zero, a "shallow" * reference copy of the attribute is created - this should only be done as long as the * original source IPP message will not be freed for the life of the destination. @@ -7046,5 +7046,5 @@ ipp_write_file(int *fd, /* I - File descriptor */ /* - * End of "$Id: ipp.c 11840 2014-04-29 15:57:26Z msweet $". + * End of "$Id: ipp.c 12093 2014-08-19 12:10:17Z msweet $". */ diff --git a/cups/md5.c b/cups/md5.c index 5f473cb365..8c87ac7eae 100644 --- a/cups/md5.c +++ b/cups/md5.c @@ -1,5 +1,5 @@ /* - * "$Id: md5.c 11594 2014-02-14 20:09:01Z msweet $" + * "$Id: md5.c 12124 2014-08-28 15:37:22Z msweet $" * * Private MD5 implementation for CUPS. * @@ -333,7 +333,7 @@ _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16]) for (i = 0; i < 8; ++i) data[i] = (unsigned char)(pms->count[i >> 2] >> ((i & 3) << 3)); /* Pad to 56 bytes mod 64. */ - _cupsMD5Append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); + _cupsMD5Append(pms, pad, (int)((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ _cupsMD5Append(pms, data, 8); for (i = 0; i < 16; ++i) @@ -342,5 +342,5 @@ _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16]) /* - * End of "$Id: md5.c 11594 2014-02-14 20:09:01Z msweet $". + * End of "$Id: md5.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c index 7b3a9e5bf6..f72fc9bf01 100644 --- a/cups/ppd-cache.c +++ b/cups/ppd-cache.c @@ -1,5 +1,5 @@ /* - * "$Id: ppd-cache.c 11832 2014-04-24 15:04:00Z msweet $" + * "$Id: ppd-cache.c 12124 2014-08-28 15:37:22Z msweet $" * * PPD cache implementation for CUPS. * @@ -2630,7 +2630,7 @@ pwg_compare_finishings( _pwg_finishings_t *a, /* I - First finishings value */ _pwg_finishings_t *b) /* I - Second finishings value */ { - return (b->value - a->value); + return ((int)b->value - (int)a->value); } @@ -2712,5 +2712,5 @@ pwg_unppdize_name(const char *ppd, /* I - PPD keyword */ /* - * End of "$Id: ppd-cache.c 11832 2014-04-24 15:04:00Z msweet $". + * End of "$Id: ppd-cache.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/cups/sidechannel.c b/cups/sidechannel.c index 8ecfbfc122..d9517e9dbe 100644 --- a/cups/sidechannel.c +++ b/cups/sidechannel.c @@ -1,5 +1,5 @@ /* - * "$Id: sidechannel.c 11594 2014-02-14 20:09:01Z msweet $" + * "$Id: sidechannel.c 12124 2014-08-28 15:37:22Z msweet $" * * Side-channel API code for CUPS. * @@ -490,7 +490,7 @@ cupsSideChannelSNMPWalk( real_data[real_datalen] = '\0'; real_oidlen = strlen(real_data) + 1; - real_datalen -= real_oidlen; + real_datalen -= (int)real_oidlen; /* * Call the callback with the OID and data... @@ -625,5 +625,5 @@ cupsSideChannelWrite( /* - * End of "$Id: sidechannel.c 11594 2014-02-14 20:09:01Z msweet $". + * End of "$Id: sidechannel.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/cups/tls-darwin.c b/cups/tls-darwin.c index 9fa0465dc5..dab7ba9e6c 100644 --- a/cups/tls-darwin.c +++ b/cups/tls-darwin.c @@ -1,5 +1,5 @@ /* - * "$Id: tls-darwin.c 12029 2014-07-15 18:59:26Z msweet $" + * "$Id: tls-darwin.c 12094 2014-08-19 12:15:11Z msweet $" * * TLS support code for CUPS on OS X. * @@ -61,7 +61,7 @@ static OSStatus http_cdsa_write(SSLConnectionRef connection, const void *data, /* * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ @@ -283,7 +283,7 @@ cleanup: * Note: The server credentials are used by all threads in the running process. * This function is threadsafe. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS X 10.10@ */ int /* O - 1 on success, 0 on failure */ @@ -452,7 +452,7 @@ _httpCreateCredentials( /* * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS X 10.10@ */ int /* O - 1 if valid, 0 otherwise */ @@ -515,7 +515,7 @@ httpCredentialsAreValidForName( /* * 'httpCredentialsGetTrust()' - Return the trust of credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS X 10.10@ */ http_trust_t /* O - Level of trust */ @@ -599,7 +599,7 @@ httpCredentialsGetTrust( /* * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS X 10.10@ */ time_t /* O - Expiration date of credentials */ @@ -624,7 +624,7 @@ httpCredentialsGetExpiration( /* * 'httpCredentialsString()' - Return a string representing the credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS X 10.10@ */ size_t /* O - Total size of credentials string */ @@ -697,7 +697,7 @@ _httpFreeCredentials( /* * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 0 on success, -1 on error */ @@ -803,7 +803,7 @@ httpLoadCredentials( /* * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - -1 on error, 0 on success */ @@ -1660,5 +1660,5 @@ http_cdsa_write( /* - * End of "$Id: tls-darwin.c 12029 2014-07-15 18:59:26Z msweet $". + * End of "$Id: tls-darwin.c 12094 2014-08-19 12:15:11Z msweet $". */ diff --git a/cups/tls-gnutls.c b/cups/tls-gnutls.c index c69327226b..5b32a8a675 100644 --- a/cups/tls-gnutls.c +++ b/cups/tls-gnutls.c @@ -1,5 +1,5 @@ /* - * "$Id: tls-gnutls.c 12050 2014-07-18 16:51:12Z msweet $" + * "$Id: tls-gnutls.c 12125 2014-08-28 15:49:29Z msweet $" * * TLS support code for CUPS using GNU TLS. * @@ -51,7 +51,7 @@ static ssize_t http_gnutls_write(gnutls_transport_ptr_t ptr, const void *data, /* * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ @@ -228,7 +228,7 @@ cupsMakeServerCredentials( * Note: The server credentials are used by all threads in the running process. * This function is threadsafe. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ @@ -357,7 +357,7 @@ _httpFreeCredentials( /* * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if valid, 0 otherwise */ @@ -383,7 +383,7 @@ httpCredentialsAreValidForName( /* * 'httpCredentialsGetTrust()' - Return the trust of credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ http_trust_t /* O - Level of trust */ @@ -475,7 +475,7 @@ httpCredentialsGetTrust( /* * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ time_t /* O - Expiration date of credentials */ @@ -500,7 +500,7 @@ httpCredentialsGetExpiration( /* * 'httpCredentialsString()' - Return a string representing the credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Total size of credentials string */ @@ -556,7 +556,7 @@ httpCredentialsString( /* * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 0 on success, -1 on error */ @@ -682,7 +682,7 @@ httpLoadCredentials( /* * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - -1 on error, 0 on success */ @@ -1186,7 +1186,9 @@ _httpTLSStart(http_t *http) /* I - Connection to server */ gnutls_transport_set_ptr(http->tls, (gnutls_transport_ptr_t)http); gnutls_transport_set_pull_function(http->tls, http_gnutls_read); +#ifdef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION gnutls_transport_set_pull_timeout_function(http->tls, (gnutls_pull_timeout_func)httpWait); +#endif /* HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */ gnutls_transport_set_push_function(http->tls, http_gnutls_write); while ((status = gnutls_handshake(http->tls)) != GNUTLS_E_SUCCESS) @@ -1289,5 +1291,5 @@ _httpTLSWrite(http_t *http, /* I - Connection to server */ /* - * End of "$Id: tls-gnutls.c 12050 2014-07-18 16:51:12Z msweet $". + * End of "$Id: tls-gnutls.c 12125 2014-08-28 15:49:29Z msweet $". */ diff --git a/cups/tls-sspi.c b/cups/tls-sspi.c index 868e6027a7..a676830d14 100644 --- a/cups/tls-sspi.c +++ b/cups/tls-sspi.c @@ -1,5 +1,5 @@ /* - * "$Id: tls-sspi.c 12047 2014-07-18 13:53:34Z msweet $" + * "$Id: tls-sspi.c 12094 2014-08-19 12:15:11Z msweet $" * * TLS support for CUPS on Windows using SSPI. * @@ -66,7 +66,7 @@ static DWORD http_sspi_verify(PCCERT_CONTEXT cert, const char *common_name, DWOR /* * 'cupsMakeServerCredentials()' - Make a self-signed certificate and private key pair. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ @@ -102,7 +102,7 @@ cupsMakeServerCredentials( * Note: The server credentials are used by all threads in the running process. * This function is threadsafe. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 on success, 0 on failure */ @@ -165,7 +165,7 @@ _httpCreateCredentials( /* * 'httpCredentialsAreValidForName()' - Return whether the credentials are valid for the given name. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 1 if valid, 0 otherwise */ @@ -230,7 +230,7 @@ httpCredentialsAreValidForName( /* * 'httpCredentialsGetTrust()' - Return the trust of credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ http_trust_t /* O - Level of trust */ @@ -272,7 +272,7 @@ httpCredentialsGetTrust( /* * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ time_t /* O - Expiration date of credentials */ @@ -309,7 +309,7 @@ httpCredentialsGetExpiration( /* * 'httpCredentialsString()' - Return a string representing the credentials. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ size_t /* O - Total size of credentials string */ @@ -399,7 +399,7 @@ _httpFreeCredentials( /* * 'httpLoadCredentials()' - Load X.509 credentials from a keychain file. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - 0 on success, -1 on error */ @@ -523,7 +523,7 @@ cleanup: /* * 'httpSaveCredentials()' - Save X.509 credentials to a keychain file. * - * @since CUPS 2.0@ + * @since CUPS 2.0/OS 10.10@ */ int /* O - -1 on error, 0 on success */ @@ -2359,5 +2359,5 @@ http_sspi_verify( /* - * End of "$Id: tls-sspi.c 12047 2014-07-18 13:53:34Z msweet $". + * End of "$Id: tls-sspi.c 12094 2014-08-19 12:15:11Z msweet $". */ diff --git a/cups/tls.c b/cups/tls.c index e7937a07fe..14b0260ed1 100644 --- a/cups/tls.c +++ b/cups/tls.c @@ -1,5 +1,5 @@ /* - * "$Id: tls.c 11841 2014-04-29 16:39:25Z msweet $" + * "$Id: tls.c 12136 2014-08-29 15:19:40Z msweet $" * * TLS routines for CUPS. * @@ -46,12 +46,67 @@ # include "tls-gnutls.c" # elif defined(HAVE_CDSASSL) # include "tls-darwin.c" -# else +# elif defined(HAVE_SSPISSL) # include "tls-sspi.c" # endif /* HAVE_GNUTLS */ +#else +/* Stubs for when TLS is not supported/available */ +int +httpCopyCredentials(http_t *http, cups_array_t **credentials) +{ + (void)http; + if (credentials) + *credentials = NULL; + return (-1); +} +int +httpCredentialsAreValidForName(cups_array_t *credentials, const char *common_name) +{ + (void)credentials; + (void)common_name; + return (1); +} +time_t +httpCredentialsGetExpiration(cups_array_t *credentials) +{ + (void)credentials; + return (INT_MAX); +} +http_trust_t +httpCredentialsGetTrust(cups_array_t *credentials, const char *common_name) +{ + (void)credentials; + (void)common_name; + return (HTTP_TRUST_OK); +} +size_t +httpCredentialsString(cups_array_t *credentials, char *buffer, size_t bufsize) +{ + (void)credentials; + (void)bufsize; + if (buffer) + *buffer = '\0'; + return (0); +} +int +httpLoadCredentials(const char *path, cups_array_t **credentials, const char *common_name) +{ + (void)path; + (void)credentials; + (void)common_name; + return (-1); +} +int +httpSaveCredentials(const char *path, cups_array_t *credentials, const char *common_name) +{ + (void)path; + (void)credentials; + (void)common_name; + return (-1); +} #endif /* HAVE_SSL */ /* - * End of "$Id: tls.c 11841 2014-04-29 16:39:25Z msweet $". + * End of "$Id: tls.c 12136 2014-08-29 15:19:40Z msweet $". */ diff --git a/cups/usersys.c b/cups/usersys.c index eef1b311e0..8b00cb8cd7 100644 --- a/cups/usersys.c +++ b/cups/usersys.c @@ -1,5 +1,5 @@ /* - * "$Id: usersys.c 11908 2014-06-09 18:57:44Z msweet $" + * "$Id: usersys.c 12124 2014-08-28 15:37:22Z msweet $" * * User, system, and password routines for CUPS. * @@ -211,8 +211,10 @@ cupsSetCredentials( if (cupsArrayCount(credentials) < 1) return (-1); +#ifdef HAVE_SSL _httpFreeCredentials(cg->tls_credentials); cg->tls_credentials = _httpCreateCredentials(credentials); +#endif /* HAVE_SSL */ return (cg->tls_credentials ? 0 : -1); } @@ -1127,5 +1129,5 @@ cups_read_client_conf( /* - * End of "$Id: usersys.c 11908 2014-06-09 18:57:44Z msweet $". + * End of "$Id: usersys.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/doc/help/api-cups.html b/doc/help/api-cups.html index dd9a4fb12d..19f7ccb908 100644 --- a/doc/help/api-cups.html +++ b/doc/help/api-cups.html @@ -2097,7 +2097,7 @@ example, passing CUPS_MEDIA_FLAGS_BORDERLESS will return the defaul borderless size, typically US Letter or A4, but sometimes 4x6 photo media.

-

 CUPS 2.0 cupsGetDestWithURI

+

 CUPS 2.0/OS X 10.10 cupsGetDestWithURI

Get a destination associated with a URI.

cups_dest_t *cupsGetDestWithURI (
@@ -2525,7 +2525,7 @@ cups_lang_t *cupsLangGet (

Return Value

Language data

-

 CUPS 2.0 cupsLocalizeDestMedia

+

 CUPS 2.0/OS X 10.10 cupsLocalizeDestMedia

Get the localized string for a destination media size.

diff --git a/doc/help/api-filter.html b/doc/help/api-filter.html index 416e2fbab4..1ab935b51e 100644 --- a/doc/help/api-filter.html +++ b/doc/help/api-filter.html @@ -408,6 +408,7 @@ div.contents ul.subcontents li {

  • Communicating with Filters
  • Doing SNMP Queries with Network Printers
  • +
  • Sandboxing on OS X
  • Functions
    • cupsBackChannelRead
    • cupsBackChannelWrite
    • @@ -442,7 +443,7 @@ div.contents ul.subcontents li { Filter and backend programming introduction for CUPS. - Copyright 2007-2013 by Apple Inc. + Copyright 2007-2014 by Apple Inc. Copyright 1997-2006 by Easy Software Products, all rights reserved. These coded instructions, statements, and computer programs are the @@ -520,7 +521,7 @@ directory to write to.

      In addition, some operating systems provide additional security mechanisms that further limit file system access, even for backends running as root. On -OS X, for example, no backend may write to a user's home directory.

      +OS X, for example, no backend may write to a user's home directory. See the Sandboxing on OS X section for more information.

      Canceled Jobs and Signal Handling

      @@ -1291,6 +1292,28 @@ void *my_data; cupsSNMPSideChannelWalk(".1.3.6.1.2.1.43", 5.0, my_callback, my_data); + +

      Sandboxing on OS X

      + +

      Starting with OS X 10.6, filters and backends are run inside a security "sandbox" which further limits (beyond the normal UNIX user/group permissions) what a filter or backend can do. This helps to both secure the printing system from malicious software and enforce the functional separation of components in the CUPS filter chain. What follows is a list of actions that are explicitly allowed for all filters and backends:

      + +
        + +
      1. Reading of files: pursuant to normal UNIX file permissions, filters and backends can read files for the current job from the /private/var/spool/cups directory and other files on mounted filesystems except for user home directories under /Users.
      2. + +
      3. Writing of files: pursuant to normal UNIX file permissions, filters and backends can read/write files to the cache directory specified by the CUPS_CACHEDIR environment variable, to the state directory specified by the CUPS_STATEDIR environment variable, to the temporary directory specified by the TMPDIR environment variable, and under the /private/var/db, /private/var/folders, /private/var/lib, /private/var/mysql, /private/var/run, /private/var/spool (except /private/var/spool/cups), /Library/Application Support, /Library/Caches, /Library/Logs, /Library/Preferences, /Library/WebServer, and /Users/Shared directories.
      4. + +
      5. Execution of programs: pursuant to normal UNIX file permissions, filters and backends can execute any program not located under the /Users directory. Child processes inherit the sandbox and are subject to the same restrictions as the parent.
      6. + +
      7. Bluetooth and USB: backends can access Bluetooth and USB printers through IOKit. Filters cannot access Bluetooth and USB printers directly.
      8. + +
      9. Network: filters and backends can access UNIX domain sockets under the /private/tmp, /private/var/run, and /private/var/tmp directories. Backends can also create IPv4 and IPv6 TCP (outgoing) and UDP (incoming and outgoing) socket, and bind to local source ports. Filters cannot directly create IPv4 and IPv6 TCP or UDP sockets.
      10. + +
      11. Notifications: filters and backends can send notifications via the Darwin notify_post() API.
      12. + +
      + +
      Note: The sandbox profile used in CUPS 2.0 still allows some actions that are not listed above - these privileges will be removed over time until the profile matches the list above.

      Functions

       CUPS 1.2/OS X 10.5 cupsBackChannelRead

      Read data from the backchannel.

      diff --git a/doc/help/api-httpipp.html b/doc/help/api-httpipp.html index 083794489d..ef21b674c1 100644 --- a/doc/help/api-httpipp.html +++ b/doc/help/api-httpipp.html @@ -1490,7 +1490,7 @@ int httpAddrAny (

      Return Value

      1 if "any", 0 otherwise

      -

       CUPS 2.0 httpAddrClose

      +

       CUPS 2.0/OS 10.10 httpAddrClose

      Close a socket created by httpAddrConnect or httpAddrListen.

      @@ -1820,7 +1820,7 @@ void httpClose (

      http
      HTTP connection
      -

       CUPS 2.0 httpCompareCredentials

      +

       CUPS 2.0/OS 10.10 httpCompareCredentials

      Compare two sets of X.509 credentials.

      int httpCompareCredentials (
      @@ -2107,7 +2107,7 @@ int httpGet (

      Return Value

      Status of call (0 = success)

      -

       CUPS 2.0 httpGetActivity

      +

       CUPS 2.0/OS 10.10 httpGetActivity

      Get the most recent activity for a connection.

      time_t httpGetActivity (
      @@ -2124,7 +2124,7 @@ time_t httpGetActivity (

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

      -

       CUPS 2.0 httpGetAddress

      +

       CUPS 2.0/OS 10.10 httpGetAddress

      Get the address of the connected peer of a connection.

      http_addr_t *httpGetAddress (
      @@ -2255,7 +2255,7 @@ time_t httpGetDateTime (

      Return Value

      UNIX time

      -

       CUPS 2.0 httpGetEncryption

      +

       CUPS 2.0/OS 10.10 httpGetEncryption

      Get the current encryption mode of a connection.

      http_encryption_t httpGetEncryption (
      @@ -2362,7 +2362,7 @@ Otherwise, return the FQDN for the local system using both gethostname() and gethostbyname() to get the local hostname with domain.

      -

       CUPS 2.0 httpGetKeepAlive

      +

       CUPS 2.0/OS 10.10 httpGetKeepAlive

      Get the current Keep-Alive state of the connection.

      http_keepalive_t httpGetKeepAlive (
      @@ -2413,7 +2413,7 @@ off_t httpGetLength2 (
      content larger than 2^31 - 1.

      -

       CUPS 2.0 httpGetPending

      +

       CUPS 2.0/OS 10.10 httpGetPending

      Get the number of bytes that are buffered for writing.

      size_t httpGetPending (
      @@ -2426,7 +2426,7 @@ size_t httpGetPending (

      Return Value

      Number of bytes buffered

      -

       CUPS 2.0 httpGetReady

      +

       CUPS 2.0/OS 10.10 httpGetReady

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

      size_t httpGetReady (
      @@ -2439,7 +2439,7 @@ size_t httpGetReady (

      Return Value

      Number of bytes available

      -

       CUPS 2.0 httpGetRemaining

      +

       CUPS 2.0/OS 10.10 httpGetRemaining

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

      @@ -2584,7 +2584,7 @@ int httpHead (
      default HTTP proxy (if any).

      void httpInitialize (void);

      -

       CUPS 2.0 httpIsChunked

      +

       CUPS 2.0/OS 10.10 httpIsChunked

      Report whether a message body is chunked.

      int httpIsChunked (
      @@ -2602,7 +2602,7 @@ int httpIsChunked (
      variable-length chunks.

      -

       CUPS 2.0 httpIsEncrypted

      +

       CUPS 2.0/OS 10.10 httpIsEncrypted

      Report whether a connection is encrypted.

      int httpIsEncrypted (
      @@ -2856,7 +2856,7 @@ int httpReconnect2 (

      Return Value

      0 on success, non-zero on failure

      -

       CUPS 2.0 httpResolveHostname

      +

       CUPS 2.0/OS 10.10 httpResolveHostname

      Resolve the hostname of the HTTP connection address.

      @@ -3109,7 +3109,7 @@ void httpSetField (

      value
      Value
      -

       CUPS 2.0 httpSetKeepAlive

      +

       CUPS 2.0/OS 10.10 httpSetKeepAlive

      Set the current Keep-Alive state of a connection.

      void httpSetKeepAlive (
      @@ -3163,7 +3163,7 @@ must be greater than 0 data pointer and must return 1 to continue or 0 to error (time) out.

      -

       CUPS 2.0 httpShutdown

      +

       CUPS 2.0/OS 10.10 httpShutdown

      Shutdown one side of an HTTP connection.

      void httpShutdown (
      @@ -3174,7 +3174,7 @@ void httpShutdown (

      http
      HTTP connection
      -

       CUPS 2.0 httpStateString

      +

       CUPS 2.0/OS 10.10 httpStateString

      Return the string describing a HTTP state value.

      const char *httpStateString (
      @@ -3219,7 +3219,7 @@ int httpTrace (

      Return Value

      Status of call (0 = success)

      -

       CUPS 2.0 httpURIStatusString

      +

       CUPS 2.0/OS 10.10 httpURIStatusString

      Return a string describing a URI status code.

      const char *httpURIStatusString (
      @@ -4140,7 +4140,7 @@ int ippCopyAttributes (

      Return Value

      1 on success, 0 on error

      Discussion

      -

      Zero or more attributes are copied from the source IPP message, @code@ src, to the +

      Zero or more attributes are copied from the source IPP message, src, to the destination IPP message, dst. When quickcopy is non-zero, a "shallow" reference copy of the attribute is created - this should only be done as long as the original source IPP message will not be freed for the life of the destination.
      @@ -5393,7 +5393,7 @@ the ippNew, ip The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2.

      -

       CUPS 2.0 ippStateString

      +

       CUPS 2.0/OS 10.10 ippStateString

      Return the name corresponding to a state value.

      const char *ippStateString (
      @@ -5616,7 +5616,7 @@ typedef struct _http_s http_t;

      typedef int (*http_timeout_cb_t)(http_t *http, void *user_data);

      -

       CUPS 2.0 http_trust_t

      +

       CUPS 2.0/OS 10.10 http_trust_t

      Level of trust for credentials

      typedef enum http_trust_e http_trust_t; @@ -6018,7 +6018,7 @@ are server-oriented...

      HTTP_STATUS_USE_PROXY
      Must use a proxy to access this URI
      -

       CUPS 2.0 http_trust_e

      +

       CUPS 2.0/OS 10.10 http_trust_e

      Level of trust for credentials

      Constants

      diff --git a/doc/help/man-ipptool.html b/doc/help/man-ipptool.html index fc6ac1b702..aba14e5510 100644 --- a/doc/help/man-ipptool.html +++ b/doc/help/man-ipptool.html @@ -71,9 +71,12 @@ ipptool - perform internet printing protocol requests ipptool sends IPP requests to the specified printer-uri -and tests and/or displays the results. Each named +and tests and/or displays the results. +Each named testfile -defines one or more requests, including the expected response status, attributes, and values. Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. The +defines one or more requests, including the expected response status, attributes, and values. +Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. +The testfile format is described in ipptoolfile(5). @@ -102,7 +105,8 @@ must connect to the printer or server using IPv4. ipptool must connect to the printer or server using IPv6.
      -C -
      Specifies that requests should be sent using the HTTP/1.1 "Transfer-Encoding: chunked" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files. +
      Specifies that requests should be sent using the HTTP/1.1 "Transfer-Encoding: chunked" header, which is required for conformance by all versions of IPP. +The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
      -E
      Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header.
      -I @@ -110,9 +114,11 @@ must connect to the printer or server using IPv6. ipptool will continue past errors.
      -L -
      Specifies that requests should be sent using the HTTP/1.0 "Content-Length:" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files. +
      Specifies that requests should be sent using the HTTP/1.0 "Content-Length:" header, which is required for conformance by all versions of IPP. +The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
      -P filename.plist -
      Specifies that the test results should be written to the named XML (Apple plist) file in addition to the plain text report. This option is incompatible with the -i (interval) and -n (repeat-count) options. +
      Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (-t). +This option is incompatible with the -i (interval) and -n (repeat-count) options.
      -S
      Forces (dedicated) TLS encryption when connecting to the server.
      -T seconds @@ -120,7 +126,8 @@ will continue past errors.
      -V version
      Specifies the default IPP version to use: 1.0, 1.1, 2.0, 2.1, or 2.2. If not specified, version 1.1 is used.
      -X -
      Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the -i (interval) and -n (repeat-count) options. +
      Specifies that XML (Apple plist) output is desired instead of the plain text report. +This option is incompatible with the -i (interval) and -n (repeat-count) options.
      -c
      Specifies that CSV (comma-separated values) output is desired instead of the plain text output.
      -d name=value @@ -130,17 +137,22 @@ will continue past errors.
      -i seconds
      Specifies that the (last) testfile -should be repeated at the specified interval. This option is incompatible with the -X (XML plist output) option. +should be repeated at the specified interval. +This option is incompatible with the -X (XML plist output) option.
      -l
      Specifies that plain text output is desired.
      -n repeat-count
      Specifies that the (last) testfile -should be repeated the specified number of times. This option is incompatible with the -X (XML plist output) option. +should be repeated the specified number of times. +This option is incompatible with the -X (XML plist output) option. +
      -q +
      Be quiet and produce no output.
      -t
      Specifies that CUPS test report output is desired instead of the plain text output.
      -v -
      Specifies that all request and response attributes should be output in CUPS test mode (-t). This is the default for XML output. +
      Specifies that all request and response attributes should be output in CUPS test mode (-t). +This is the default for XML output.

      Exit Status

      The diff --git a/filter/raster.c b/filter/raster.c index 8905a83d99..827215c686 100644 --- a/filter/raster.c +++ b/filter/raster.c @@ -1,5 +1,5 @@ /* - * "$Id: raster.c 11594 2014-02-14 20:09:01Z msweet $" + * "$Id: raster.c 12124 2014-08-28 15:37:22Z msweet $" * * Raster file routines for CUPS. * @@ -378,7 +378,7 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */ if (!cups_raster_read(r, &byte, 1)) return (0); - r->count = byte + 1; + r->count = (unsigned)byte + 1; if (r->count > 1) ptr = r->pixels; @@ -418,7 +418,7 @@ cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */ * Repeat the next N bytes... */ - count = (byte + 1) * r->bpp; + count = ((unsigned)byte + 1) * r->bpp; if (count > (unsigned)bytes) count = (unsigned)bytes; @@ -1448,5 +1448,5 @@ cups_write_fd(void *ctx, /* I - File descriptor pointer */ /* - * End of "$Id: raster.c 11594 2014-02-14 20:09:01Z msweet $". + * End of "$Id: raster.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/filter/rastertoepson.c b/filter/rastertoepson.c index 908ec48527..7d4cacd33b 100644 --- a/filter/rastertoepson.c +++ b/filter/rastertoepson.c @@ -1,5 +1,5 @@ /* - * "$Id: rastertoepson.c 11594 2014-02-14 20:09:01Z msweet $" + * "$Id: rastertoepson.c 12124 2014-08-28 15:37:22Z msweet $" * * EPSON ESC/P and ESC/P2 filter for CUPS. * @@ -201,14 +201,14 @@ StartPage( if (Model < EPSON_ICOLOR) { pwrite("\033(U\001\000", 5); /* Resolution/units */ - putchar(3600 / header->HWResolution[1]); + putchar((int)(3600 / header->HWResolution[1])); } else { pwrite("\033(U\005\000", 5); - putchar(1440 / header->HWResolution[1]); - putchar(1440 / header->HWResolution[1]); - putchar(1440 / header->HWResolution[0]); + putchar((int)(1440 / header->HWResolution[1])); + putchar((int)(1440 / header->HWResolution[1])); + putchar((int)(1440 / header->HWResolution[0])); putchar(0xa0); /* n/1440ths... */ putchar(0x05); } @@ -811,8 +811,8 @@ OutputRows( { putchar(0x1b); putchar('$'); - putchar(i & 255); - putchar(i >> 8); + putchar((int)(i & 255)); + putchar((int)(i >> 8)); } /* @@ -853,8 +853,8 @@ OutputRows( } n = dot_count / DotBytes; - putchar(n & 255); - putchar(n / 256); + putchar((int)(n & 255)); + putchar((int)(n / 256)); /* * Write the graphics data... @@ -883,8 +883,8 @@ OutputRows( { putchar(0x1b); putchar('$'); - putchar(i & 255); - putchar(i >> 8); + putchar((int)(i & 255)); + putchar((int)(i >> 8)); } if (header->HWResolution[0] == 120) @@ -893,8 +893,8 @@ OutputRows( printf("\033*\003"); /* Select bit image */ n = (unsigned)dot_count / DotBytes; - putchar(n & 255); - putchar(n / 256); + putchar((int)(n & 255)); + putchar((int)(n / 256)); for (n = dot_count / 2, ptr = dot_ptr + 1; n > 0; n --, ptr += 2) { @@ -1138,5 +1138,5 @@ main(int argc, /* I - Number of command-line arguments */ /* - * End of "$Id: rastertoepson.c 11594 2014-02-14 20:09:01Z msweet $". + * End of "$Id: rastertoepson.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/locale/cups.pot b/locale/cups.pot index 40b972896e..591989b866 100644 --- a/locale/cups.pot +++ b/locale/cups.pot @@ -30,7 +30,7 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 1.6\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2014-06-26 14:29-0400\n" +"POT-Creation-Date: 2014-08-29 22:25-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -39,12 +39,12 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: systemv/lpstat.c:1864 systemv/lpstat.c:1987 +#: systemv/lpstat.c:1867 systemv/lpstat.c:1990 msgid "\t\t(all)" msgstr "" -#: systemv/lpstat.c:1867 systemv/lpstat.c:1870 systemv/lpstat.c:1990 -#: systemv/lpstat.c:1993 +#: systemv/lpstat.c:1870 systemv/lpstat.c:1873 systemv/lpstat.c:1993 +#: systemv/lpstat.c:1996 msgid "\t\t(none)" msgstr "" @@ -58,99 +58,99 @@ msgstr "" msgid "\t%s" msgstr "" -#: systemv/lpstat.c:1845 systemv/lpstat.c:1968 +#: systemv/lpstat.c:1848 systemv/lpstat.c:1971 msgid "\tAfter fault: continue" msgstr "" -#: systemv/lpstat.c:1468 systemv/lpstat.c:1814 systemv/lpstat.c:1938 +#: systemv/lpstat.c:1471 systemv/lpstat.c:1817 systemv/lpstat.c:1941 #, c-format msgid "\tAlerts: %s" msgstr "" -#: systemv/lpstat.c:1868 systemv/lpstat.c:1991 +#: systemv/lpstat.c:1871 systemv/lpstat.c:1994 msgid "\tBanner required" msgstr "" -#: systemv/lpstat.c:1869 systemv/lpstat.c:1992 +#: systemv/lpstat.c:1872 systemv/lpstat.c:1995 msgid "\tCharset sets:" msgstr "" -#: systemv/lpstat.c:1833 systemv/lpstat.c:1956 +#: systemv/lpstat.c:1836 systemv/lpstat.c:1959 msgid "\tConnection: direct" msgstr "" -#: systemv/lpstat.c:1824 systemv/lpstat.c:1948 +#: systemv/lpstat.c:1827 systemv/lpstat.c:1951 msgid "\tConnection: remote" msgstr "" -#: systemv/lpstat.c:1790 systemv/lpstat.c:1914 +#: systemv/lpstat.c:1793 systemv/lpstat.c:1917 msgid "\tContent types: any" msgstr "" -#: systemv/lpstat.c:1872 systemv/lpstat.c:1995 +#: systemv/lpstat.c:1875 systemv/lpstat.c:1998 msgid "\tDefault page size:" msgstr "" -#: systemv/lpstat.c:1871 systemv/lpstat.c:1994 +#: systemv/lpstat.c:1874 systemv/lpstat.c:1997 msgid "\tDefault pitch:" msgstr "" -#: systemv/lpstat.c:1873 systemv/lpstat.c:1996 +#: systemv/lpstat.c:1876 systemv/lpstat.c:1999 msgid "\tDefault port settings:" msgstr "" -#: systemv/lpstat.c:1796 systemv/lpstat.c:1920 +#: systemv/lpstat.c:1799 systemv/lpstat.c:1923 #, c-format msgid "\tDescription: %s" msgstr "" -#: systemv/lpstat.c:1789 systemv/lpstat.c:1913 +#: systemv/lpstat.c:1792 systemv/lpstat.c:1916 msgid "\tForm mounted:" msgstr "" -#: systemv/lpstat.c:1866 systemv/lpstat.c:1989 +#: systemv/lpstat.c:1869 systemv/lpstat.c:1992 msgid "\tForms allowed:" msgstr "" -#: systemv/lpstat.c:1828 systemv/lpstat.c:1952 +#: systemv/lpstat.c:1831 systemv/lpstat.c:1955 #, c-format msgid "\tInterface: %s.ppd" msgstr "" -#: systemv/lpstat.c:1837 systemv/lpstat.c:1960 +#: systemv/lpstat.c:1840 systemv/lpstat.c:1963 #, c-format msgid "\tInterface: %s/interfaces/%s" msgstr "" -#: systemv/lpstat.c:1841 systemv/lpstat.c:1964 +#: systemv/lpstat.c:1844 systemv/lpstat.c:1967 #, c-format msgid "\tInterface: %s/ppd/%s.ppd" msgstr "" -#: systemv/lpstat.c:1819 systemv/lpstat.c:1943 +#: systemv/lpstat.c:1822 systemv/lpstat.c:1946 #, c-format msgid "\tLocation: %s" msgstr "" -#: systemv/lpstat.c:1844 systemv/lpstat.c:1967 +#: systemv/lpstat.c:1847 systemv/lpstat.c:1970 msgid "\tOn fault: no alert" msgstr "" -#: systemv/lpstat.c:1791 systemv/lpstat.c:1915 +#: systemv/lpstat.c:1794 systemv/lpstat.c:1918 msgid "\tPrinter types: unknown" msgstr "" -#: systemv/lpstat.c:1451 +#: systemv/lpstat.c:1454 #, c-format msgid "\tStatus: %s" msgstr "" -#: systemv/lpstat.c:1849 systemv/lpstat.c:1863 systemv/lpstat.c:1972 -#: systemv/lpstat.c:1986 +#: systemv/lpstat.c:1852 systemv/lpstat.c:1866 systemv/lpstat.c:1975 +#: systemv/lpstat.c:1989 msgid "\tUsers allowed:" msgstr "" -#: systemv/lpstat.c:1856 systemv/lpstat.c:1979 +#: systemv/lpstat.c:1859 systemv/lpstat.c:1982 msgid "\tUsers denied:" msgstr "" @@ -175,7 +175,7 @@ msgstr "" msgid "\tprinting is enabled" msgstr "" -#: systemv/lpstat.c:1471 +#: systemv/lpstat.c:1474 #, c-format msgid "\tqueued for %s" msgstr "" @@ -188,7 +188,7 @@ msgstr "" msgid "\tqueuing is enabled" msgstr "" -#: systemv/lpstat.c:1782 systemv/lpstat.c:1906 +#: systemv/lpstat.c:1785 systemv/lpstat.c:1909 msgid "\treason unknown" msgstr "" @@ -975,11 +975,11 @@ msgstr "" msgid " Warning: obsolete DSC version %.1f in file." msgstr "" -#: test/ippfind.c:2758 +#: test/ippfind.c:2788 msgid " ! expression Unary NOT of expression." msgstr "" -#: test/ippfind.c:2757 +#: test/ippfind.c:2787 msgid " ( expressions ) Group expressions." msgstr "" @@ -1011,25 +1011,29 @@ msgstr "" msgid " --crlf End lines with CR + LF (Windows)." msgstr "" -#: test/ippfind.c:2739 +#: test/ippfind.c:2769 msgid " --domain regex Match domain to regular expression." msgstr "" -#: test/ippfind.c:2740 +#: test/ippfind.c:2770 msgid "" " --exec utility [argument ...] ;\n" " Execute program if true." msgstr "" -#: test/ippfind.c:2760 +#: test/ippfind.c:2790 msgid " --false Always false." msgstr "" -#: test/ippfind.c:2722 +#: test/ipptool.c:4806 +msgid " --help Show help." +msgstr "" + +#: test/ippfind.c:2752 msgid " --help Show this help." msgstr "" -#: test/ippfind.c:2742 +#: test/ippfind.c:2772 msgid " --host regex Match hostname to regular expression." msgstr "" @@ -1041,75 +1045,85 @@ msgstr "" msgid " --list-filters List filters that will be used." msgstr "" -#: test/ippfind.c:2744 +#: test/ippfind.c:2774 msgid " --local True if service is local." msgstr "" -#: test/ippfind.c:2743 +#: test/ippfind.c:2773 msgid " --ls List attributes." msgstr "" -#: test/ippfind.c:2745 +#: test/ippfind.c:2775 msgid " --name regex Match service name to regular expression." msgstr "" -#: test/ippfind.c:2759 +#: test/ippfind.c:2789 msgid " --not expression Unary NOT of expression." msgstr "" -#: test/ippfind.c:2746 +#: test/ippfind.c:2776 msgid " --path regex Match resource path to regular expression." msgstr "" -#: test/ippfind.c:2747 +#: test/ippfind.c:2777 msgid " --port number[-number] Match port to number or range." msgstr "" -#: test/ippfind.c:2748 +#: test/ippfind.c:2778 msgid " --print Print URI if true." msgstr "" -#: test/ippfind.c:2749 +#: test/ippfind.c:2779 msgid " --print-name Print service name if true." msgstr "" -#: test/ippfind.c:2750 +#: test/ippfind.c:2780 msgid " --quiet Quietly report match via exit code." msgstr "" -#: test/ippfind.c:2751 +#: test/ippfind.c:2781 msgid " --remote True if service is remote." msgstr "" -#: test/ippfind.c:2761 +#: test/ipptool.c:4807 +msgid "" +" --stop-after-include-error\n" +" Stop tests after a failed INCLUDE." +msgstr "" + +#: test/ippfind.c:2791 msgid " --true Always true." msgstr "" -#: test/ippfind.c:2752 +#: test/ippfind.c:2782 msgid " --txt key True if the TXT record contains the key." msgstr "" -#: test/ippfind.c:2753 +#: test/ippfind.c:2783 msgid " --txt-* regex Match TXT record key to regular expression." msgstr "" -#: test/ippfind.c:2754 +#: test/ippfind.c:2784 msgid " --uri regex Match URI to regular expression." msgstr "" -#: test/ippfind.c:2723 +#: test/ippfind.c:2753 msgid " --version Show program version." msgstr "" -#: test/ippfind.c:2716 test/ipptool.c:4714 +#: test/ipptool.c:4809 +msgid " --version Show version." +msgstr "" + +#: test/ippfind.c:2746 test/ipptool.c:4810 msgid " -4 Connect using IPv4." msgstr "" -#: test/ippfind.c:2717 test/ipptool.c:4715 +#: test/ippfind.c:2747 test/ipptool.c:4811 msgid " -6 Connect using IPv6." msgstr "" -#: test/ipptool.c:4716 +#: test/ipptool.c:4812 msgid " -C Send requests using chunking (default)." msgstr "" @@ -1125,11 +1139,11 @@ msgstr "" msgid " -E Encrypt the connection." msgstr "" -#: test/ipptool.c:4718 +#: test/ipptool.c:4814 msgid " -E Test with HTTP Upgrade to TLS." msgstr "" -#: scheduler/main.c:2161 +#: scheduler/main.c:2149 msgid " -F Run in the foreground but detach from console." msgstr "" @@ -1137,7 +1151,7 @@ msgstr "" msgid " -H samba-server Use the named SAMBA server." msgstr "" -#: test/ipptool.c:4720 +#: test/ipptool.c:4816 msgid " -I Ignore errors." msgstr "" @@ -1149,15 +1163,19 @@ msgstr "" msgid " -I {filename,filters,none,profiles}" msgstr "" -#: test/ipptool.c:4721 +#: test/ipptool.c:4817 msgid " -L Send requests using content-length." msgstr "" +#: test/ipptool.c:4819 +msgid " -P filename.plist Produce XML plist to a file and test report to standard output." +msgstr "" + #: scheduler/cupsfilter.c:1485 msgid " -P filename.ppd Set PPD file." msgstr "" -#: test/ippfind.c:2726 +#: test/ippfind.c:2756 msgid " -P number[-number] Match port to number or range." msgstr "" @@ -1165,15 +1183,15 @@ msgstr "" msgid " -R root-directory Set alternate root." msgstr "" -#: test/ipptool.c:4723 +#: test/ipptool.c:4820 msgid " -S Test with SSL encryption." msgstr "" -#: test/ippfind.c:2718 +#: test/ippfind.c:2748 msgid " -T seconds Set the browse timeout in seconds." msgstr "" -#: test/ipptool.c:4725 +#: test/ipptool.c:4822 msgid " -T seconds Set the receive/send timeout in seconds." msgstr "" @@ -1181,7 +1199,7 @@ msgstr "" msgid " -U username Specify username." msgstr "" -#: test/ippfind.c:2720 test/ipptool.c:4727 +#: test/ippfind.c:2750 test/ipptool.c:4824 msgid " -V version Set default IPP version." msgstr "" @@ -1189,7 +1207,7 @@ msgstr "" msgid " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}" msgstr "" -#: test/ipptool.c:4729 +#: test/ipptool.c:4826 msgid " -X Produce XML plist instead of plain text." msgstr "" @@ -1201,6 +1219,10 @@ msgstr "" msgid " -a Export all printers." msgstr "" +#: test/ipptool.c:4828 +msgid " -c Produce CSV output." +msgstr "" + #: ppdc/ppdc.cxx:437 msgid " -c catalog.po Load the specified message catalog." msgstr "" @@ -1209,7 +1231,7 @@ msgstr "" msgid " -c cups-files.conf Set cups-files.conf file to use." msgstr "" -#: scheduler/main.c:2159 +#: scheduler/main.c:2147 msgid " -c cupsd.conf Set cupsd.conf file to use." msgstr "" @@ -1217,7 +1239,7 @@ msgstr "" msgid " -d domain Browse/resolve in specified domain." msgstr "" -#: test/ipptool.c:4731 +#: test/ipptool.c:4829 msgid " -d name=value Set named variable to value." msgstr "" @@ -1229,7 +1251,7 @@ msgstr "" msgid " -d printer Use the named printer." msgstr "" -#: test/ippfind.c:2727 +#: test/ippfind.c:2757 msgid " -d regex Match domain to regular expression." msgstr "" @@ -1237,19 +1259,19 @@ msgstr "" msgid " -e Use every filter from the PPD file." msgstr "" -#: scheduler/main.c:2160 +#: scheduler/main.c:2148 msgid " -f Run in the foreground." msgstr "" -#: test/ipptool.c:4733 +#: test/ipptool.c:4831 msgid " -f filename Set default request filename." msgstr "" -#: scheduler/main.c:2163 +#: scheduler/main.c:2151 msgid " -h Show this usage message." msgstr "" -#: test/ippfind.c:2728 +#: test/ippfind.c:2758 msgid " -h regex Match hostname to regular expression." msgstr "" @@ -1261,7 +1283,7 @@ msgstr "" msgid " -i mime/type Set input MIME type (otherwise auto-typed)." msgstr "" -#: test/ipptool.c:4735 +#: test/ipptool.c:4833 msgid " -i seconds Repeat the last file with the given time interval." msgstr "" @@ -1269,11 +1291,15 @@ msgstr "" msgid " -j job-id[,N] Filter file N from the specified job (default is file 1)." msgstr "" -#: test/ippfind.c:2729 +#: test/ippfind.c:2759 msgid " -l List attributes." msgstr "" -#: scheduler/main.c:2164 +#: test/ipptool.c:4835 +msgid " -l Produce plain text output." +msgstr "" + +#: scheduler/main.c:2152 msgid " -l Run cupsd on demand." msgstr "" @@ -1293,11 +1319,11 @@ msgstr "" msgid " -n copies Set number of copies." msgstr "" -#: test/ipptool.c:4737 +#: test/ipptool.c:4836 msgid " -n count Repeat the last file the given number of times." msgstr "" -#: test/ippfind.c:2730 +#: test/ippfind.c:2760 msgid " -n regex Match service name to regular expression." msgstr "" @@ -1313,7 +1339,7 @@ msgstr "" msgid " -o name=value Set option(s)." msgstr "" -#: test/ippfind.c:2731 +#: test/ippfind.c:2761 msgid " -p Print URI if true." msgstr "" @@ -1325,15 +1351,15 @@ msgstr "" msgid " -p program Run specified program for each service." msgstr "" -#: test/ippfind.c:2732 +#: test/ippfind.c:2762 msgid " -q Quietly report match via exit code." msgstr "" -#: systemv/cupstestppd.c:3826 test/ipptool.c:4739 +#: systemv/cupstestppd.c:3826 test/ipptool.c:4838 msgid " -q Run silently." msgstr "" -#: test/ippfind.c:2733 +#: test/ippfind.c:2763 msgid " -r True if service is remote." msgstr "" @@ -1341,11 +1367,11 @@ msgstr "" msgid " -r Use 'relaxed' open mode." msgstr "" -#: test/ippfind.c:2734 +#: test/ippfind.c:2764 msgid " -s Print service name if true." msgstr "" -#: test/ipptool.c:4740 +#: test/ipptool.c:4839 msgid " -t Produce a test report." msgstr "" @@ -1353,11 +1379,11 @@ msgstr "" msgid " -t Test PPDs instead of generating them." msgstr "" -#: scheduler/main.c:2165 +#: scheduler/main.c:2153 msgid " -t Test the configuration file." msgstr "" -#: test/ippfind.c:2735 +#: test/ippfind.c:2765 msgid " -t key True if the TXT record contains the key." msgstr "" @@ -1373,11 +1399,11 @@ msgstr "" msgid " -u Remove the PPD file when finished." msgstr "" -#: test/ippfind.c:2736 +#: test/ippfind.c:2766 msgid " -u regex Match URI to regular expression." msgstr "" -#: systemv/cupsaddsmb.c:291 systemv/cupstestppd.c:3828 test/ipptool.c:4741 +#: systemv/cupsaddsmb.c:291 systemv/cupstestppd.c:3828 test/ipptool.c:4840 #: ppdc/ppdc.cxx:447 ppdc/ppdpo.cxx:259 msgid " -v Be verbose." msgstr "" @@ -1386,7 +1412,7 @@ msgstr "" msgid " -vv Be very verbose." msgstr "" -#: test/ippfind.c:2737 +#: test/ippfind.c:2767 msgid "" " -x utility [argument ...] ;\n" " Execute program if true." @@ -1396,89 +1422,89 @@ msgstr "" msgid " -z Compress PPD files using GNU zip." msgstr "" -#: test/ippfind.c:2780 +#: test/ippfind.c:2810 msgid " IPPFIND_SERVICE_DOMAIN Domain name" msgstr "" -#: test/ippfind.c:2781 +#: test/ippfind.c:2811 msgid "" " IPPFIND_SERVICE_HOSTNAME\n" " Fully-qualified domain name" msgstr "" -#: test/ippfind.c:2783 +#: test/ippfind.c:2813 msgid " IPPFIND_SERVICE_NAME Service instance name" msgstr "" -#: test/ippfind.c:2784 +#: test/ippfind.c:2814 msgid " IPPFIND_SERVICE_PORT Port number" msgstr "" -#: test/ippfind.c:2785 +#: test/ippfind.c:2815 msgid " IPPFIND_SERVICE_REGTYPE DNS-SD registration type" msgstr "" -#: test/ippfind.c:2786 +#: test/ippfind.c:2816 msgid " IPPFIND_SERVICE_SCHEME URI scheme" msgstr "" -#: test/ippfind.c:2787 +#: test/ippfind.c:2817 msgid " IPPFIND_SERVICE_URI URI" msgstr "" -#: test/ippfind.c:2788 +#: test/ippfind.c:2818 msgid " IPPFIND_TXT_* Value of TXT record key" msgstr "" -#: test/ippfind.c:2763 +#: test/ippfind.c:2793 msgid "" " expression --and expression\n" " Logical AND." msgstr "" -#: test/ippfind.c:2765 +#: test/ippfind.c:2795 msgid "" " expression --or expression\n" " Logical OR." msgstr "" -#: test/ippfind.c:2762 +#: test/ippfind.c:2792 msgid " expression expression Logical AND." msgstr "" -#: test/ippfind.c:2770 +#: test/ippfind.c:2800 msgid " {service_domain} Domain name" msgstr "" -#: test/ippfind.c:2771 +#: test/ippfind.c:2801 msgid " {service_hostname} Fully-qualified domain name" msgstr "" -#: test/ippfind.c:2772 +#: test/ippfind.c:2802 msgid " {service_name} Service instance name" msgstr "" -#: test/ippfind.c:2773 +#: test/ippfind.c:2803 msgid " {service_port} Port number" msgstr "" -#: test/ippfind.c:2774 +#: test/ippfind.c:2804 msgid " {service_regtype} DNS-SD registration type" msgstr "" -#: test/ippfind.c:2775 +#: test/ippfind.c:2805 msgid " {service_scheme} URI scheme" msgstr "" -#: test/ippfind.c:2776 +#: test/ippfind.c:2806 msgid " {service_uri} URI" msgstr "" -#: test/ippfind.c:2777 +#: test/ippfind.c:2807 msgid " {txt_*} Value of TXT record key" msgstr "" -#: test/ippfind.c:2769 +#: test/ippfind.c:2799 msgid " {} URI" msgstr "" @@ -1758,7 +1784,7 @@ msgstr "" msgid "%s accepting requests since %s" msgstr "" -#: scheduler/ipp.c:9841 +#: scheduler/ipp.c:9952 #, c-format msgid "%s cannot be changed." msgstr "" @@ -1828,7 +1854,7 @@ msgstr "" msgid "%s: %s failed: %s" msgstr "" -#: test/ippfind.c:773 test/ipptool.c:376 +#: test/ippfind.c:777 test/ipptool.c:378 #, c-format msgid "%s: Bad version %s for \"-V\"." msgstr "" @@ -1848,8 +1874,8 @@ msgstr "" #: systemv/lpstat.c:195 systemv/lpstat.c:241 systemv/lpstat.c:332 #: systemv/lpstat.c:361 systemv/lpstat.c:385 systemv/lpstat.c:444 #: systemv/lpstat.c:510 systemv/lpstat.c:571 systemv/lpstat.c:696 -#: systemv/lpstat.c:880 systemv/lpstat.c:1141 systemv/lpstat.c:1338 -#: systemv/lpstat.c:1576 +#: systemv/lpstat.c:880 systemv/lpstat.c:1141 systemv/lpstat.c:1339 +#: systemv/lpstat.c:1579 #, c-format msgid "%s: Error - add '/version=1.1' to server name." msgstr "" @@ -2043,17 +2069,17 @@ msgstr "" msgid "%s: Invalid filter string \"%s\"." msgstr "" -#: test/ipptool.c:307 +#: test/ipptool.c:309 #, c-format msgid "%s: Missing filename for \"-P\"." msgstr "" -#: test/ippfind.c:745 test/ipptool.c:344 +#: test/ippfind.c:749 test/ipptool.c:346 #, c-format msgid "%s: Missing timeout for \"-T\"." msgstr "" -#: test/ippfind.c:758 test/ipptool.c:358 +#: test/ippfind.c:762 test/ipptool.c:360 #, c-format msgid "%s: Missing version for \"-V\"." msgstr "" @@ -2076,7 +2102,7 @@ msgstr "" #: berkeley/lpq.c:83 berkeley/lpr.c:67 berkeley/lprm.c:67 systemv/cancel.c:82 #: systemv/cupsaccept.c:88 systemv/cupsaddsmb.c:86 systemv/lp.c:96 #: systemv/lpadmin.c:225 systemv/lpinfo.c:88 systemv/lpmove.c:73 -#: systemv/lpstat.c:88 test/ipptool.c:289 test/ipptool.c:333 +#: systemv/lpstat.c:88 test/ipptool.c:291 test/ipptool.c:335 #, c-format msgid "%s: Sorry, no encryption support." msgstr "" @@ -2097,7 +2123,7 @@ msgstr "" msgid "%s: Unable to determine MIME type of \"%s\"." msgstr "" -#: test/ipptool.c:316 +#: test/ipptool.c:318 #, c-format msgid "%s: Unable to open \"%s\": %s" msgstr "" @@ -2132,12 +2158,12 @@ msgstr "" msgid "%s: Unknown option \"%c\"." msgstr "" -#: test/ippfind.c:644 +#: test/ippfind.c:648 #, c-format msgid "%s: Unknown option \"%s\"." msgstr "" -#: test/ippfind.c:924 +#: test/ippfind.c:928 #, c-format msgid "%s: Unknown option \"-%c\"." msgstr "" @@ -2172,159 +2198,159 @@ msgstr "" msgid "%s: Warning - mode option ignored." msgstr "" -#: ppdc/sample.c:310 +#: ppdc/sample.c:305 msgid "-1" msgstr "" -#: ppdc/sample.c:301 +#: ppdc/sample.c:296 msgid "-10" msgstr "" -#: ppdc/sample.c:393 +#: ppdc/sample.c:388 msgid "-100" msgstr "" -#: ppdc/sample.c:392 +#: ppdc/sample.c:387 msgid "-105" msgstr "" -#: ppdc/sample.c:300 +#: ppdc/sample.c:295 msgid "-11" msgstr "" -#: ppdc/sample.c:391 +#: ppdc/sample.c:386 msgid "-110" msgstr "" -#: ppdc/sample.c:390 +#: ppdc/sample.c:385 msgid "-115" msgstr "" -#: ppdc/sample.c:299 +#: ppdc/sample.c:294 msgid "-12" msgstr "" -#: ppdc/sample.c:389 +#: ppdc/sample.c:384 msgid "-120" msgstr "" -#: ppdc/sample.c:298 +#: ppdc/sample.c:293 msgid "-13" msgstr "" -#: ppdc/sample.c:297 +#: ppdc/sample.c:292 msgid "-14" msgstr "" -#: ppdc/sample.c:296 +#: ppdc/sample.c:291 msgid "-15" msgstr "" -#: ppdc/sample.c:309 +#: ppdc/sample.c:304 msgid "-2" msgstr "" -#: ppdc/sample.c:409 +#: ppdc/sample.c:404 msgid "-20" msgstr "" -#: ppdc/sample.c:408 +#: ppdc/sample.c:403 msgid "-25" msgstr "" -#: ppdc/sample.c:308 +#: ppdc/sample.c:303 msgid "-3" msgstr "" -#: ppdc/sample.c:407 +#: ppdc/sample.c:402 msgid "-30" msgstr "" -#: ppdc/sample.c:406 +#: ppdc/sample.c:401 msgid "-35" msgstr "" -#: ppdc/sample.c:307 +#: ppdc/sample.c:302 msgid "-4" msgstr "" -#: ppdc/sample.c:405 +#: ppdc/sample.c:400 msgid "-40" msgstr "" -#: ppdc/sample.c:404 +#: ppdc/sample.c:399 msgid "-45" msgstr "" -#: ppdc/sample.c:306 +#: ppdc/sample.c:301 msgid "-5" msgstr "" -#: ppdc/sample.c:403 +#: ppdc/sample.c:398 msgid "-50" msgstr "" -#: ppdc/sample.c:402 +#: ppdc/sample.c:397 msgid "-55" msgstr "" -#: ppdc/sample.c:305 +#: ppdc/sample.c:300 msgid "-6" msgstr "" -#: ppdc/sample.c:401 +#: ppdc/sample.c:396 msgid "-60" msgstr "" -#: ppdc/sample.c:400 +#: ppdc/sample.c:395 msgid "-65" msgstr "" -#: ppdc/sample.c:304 +#: ppdc/sample.c:299 msgid "-7" msgstr "" -#: ppdc/sample.c:399 +#: ppdc/sample.c:394 msgid "-70" msgstr "" -#: ppdc/sample.c:398 +#: ppdc/sample.c:393 msgid "-75" msgstr "" -#: ppdc/sample.c:303 +#: ppdc/sample.c:298 msgid "-8" msgstr "" -#: ppdc/sample.c:397 +#: ppdc/sample.c:392 msgid "-80" msgstr "" -#: ppdc/sample.c:396 +#: ppdc/sample.c:391 msgid "-85" msgstr "" -#: ppdc/sample.c:302 +#: ppdc/sample.c:297 msgid "-9" msgstr "" -#: ppdc/sample.c:395 +#: ppdc/sample.c:390 msgid "-90" msgstr "" -#: ppdc/sample.c:394 +#: ppdc/sample.c:389 msgid "-95" msgstr "" -#: ppdc/sample.c:311 +#: ppdc/sample.c:306 msgid "0" msgstr "" -#: ppdc/sample.c:312 +#: ppdc/sample.c:307 msgid "1" msgstr "" -#: ppdc/sample.c:384 +#: ppdc/sample.c:379 msgid "1 inch/sec." msgstr "" @@ -2336,7 +2362,7 @@ msgstr "" msgid "1.25x2.25\"" msgstr "" -#: ppdc/sample.c:432 +#: ppdc/sample.c:427 msgid "1.5 inch/sec." msgstr "" @@ -2356,11 +2382,11 @@ msgstr "" msgid "1.50x2.00\"" msgstr "" -#: ppdc/sample.c:321 +#: ppdc/sample.c:316 msgid "10" msgstr "" -#: ppdc/sample.c:443 +#: ppdc/sample.c:438 msgid "10 inches/sec." msgstr "" @@ -2376,39 +2402,39 @@ msgstr "" msgid "10 x 14" msgstr "" -#: ppdc/sample.c:423 +#: ppdc/sample.c:418 msgid "100" msgstr "" -#: ppdc/sample.c:334 +#: ppdc/sample.c:329 msgid "100 mm/sec." msgstr "" -#: ppdc/sample.c:424 +#: ppdc/sample.c:419 msgid "105" msgstr "" -#: ppdc/sample.c:322 +#: ppdc/sample.c:317 msgid "11" msgstr "" -#: ppdc/sample.c:444 +#: ppdc/sample.c:439 msgid "11 inches/sec." msgstr "" -#: ppdc/sample.c:425 +#: ppdc/sample.c:420 msgid "110" msgstr "" -#: ppdc/sample.c:426 +#: ppdc/sample.c:421 msgid "115" msgstr "" -#: ppdc/sample.c:323 +#: ppdc/sample.c:318 msgid "12" msgstr "" -#: ppdc/sample.c:445 +#: ppdc/sample.c:440 msgid "12 inches/sec." msgstr "" @@ -2416,11 +2442,11 @@ msgstr "" msgid "12 x 11" msgstr "" -#: ppdc/sample.c:427 +#: ppdc/sample.c:422 msgid "120" msgstr "" -#: ppdc/sample.c:335 +#: ppdc/sample.c:330 msgid "120 mm/sec." msgstr "" @@ -2432,7 +2458,7 @@ msgstr "" msgid "120x72dpi" msgstr "" -#: ppdc/sample.c:324 +#: ppdc/sample.c:319 msgid "13" msgstr "" @@ -2440,15 +2466,15 @@ msgstr "" msgid "136dpi" msgstr "" -#: ppdc/sample.c:325 +#: ppdc/sample.c:320 msgid "14" msgstr "" -#: ppdc/sample.c:326 +#: ppdc/sample.c:321 msgid "15" msgstr "" -#: ppdc/sample.c:328 +#: ppdc/sample.c:323 msgid "15 mm/sec." msgstr "" @@ -2456,23 +2482,23 @@ msgstr "" msgid "15 x 11" msgstr "" -#: ppdc/sample.c:336 +#: ppdc/sample.c:331 msgid "150 mm/sec." msgstr "" -#: ppdc/sample.c:283 +#: ppdc/sample.c:278 msgid "150dpi" msgstr "" -#: ppdc/sample.c:368 +#: ppdc/sample.c:363 msgid "16" msgstr "" -#: ppdc/sample.c:369 +#: ppdc/sample.c:364 msgid "17" msgstr "" -#: ppdc/sample.c:370 +#: ppdc/sample.c:365 msgid "18" msgstr "" @@ -2480,19 +2506,19 @@ msgstr "" msgid "180dpi" msgstr "" -#: ppdc/sample.c:371 +#: ppdc/sample.c:366 msgid "19" msgstr "" -#: ppdc/sample.c:313 +#: ppdc/sample.c:308 msgid "2" msgstr "" -#: ppdc/sample.c:385 +#: ppdc/sample.c:380 msgid "2 inches/sec." msgstr "" -#: ppdc/sample.c:270 +#: ppdc/sample.c:262 msgid "2-Sided Printing" msgstr "" @@ -2548,7 +2574,7 @@ msgstr "" msgid "2.38x5.50\"" msgstr "" -#: ppdc/sample.c:433 +#: ppdc/sample.c:428 msgid "2.5 inches/sec." msgstr "" @@ -2568,15 +2594,15 @@ msgstr "" msgid "2.9 x 1\"" msgstr "" -#: ppdc/sample.c:372 +#: ppdc/sample.c:367 msgid "20" msgstr "" -#: ppdc/sample.c:329 +#: ppdc/sample.c:324 msgid "20 mm/sec." msgstr "" -#: ppdc/sample.c:337 +#: ppdc/sample.c:332 msgid "200 mm/sec." msgstr "" @@ -2584,19 +2610,19 @@ msgstr "" msgid "203dpi" msgstr "" -#: ppdc/sample.c:373 +#: ppdc/sample.c:368 msgid "21" msgstr "" -#: ppdc/sample.c:374 +#: ppdc/sample.c:369 msgid "22" msgstr "" -#: ppdc/sample.c:375 +#: ppdc/sample.c:370 msgid "23" msgstr "" -#: ppdc/sample.c:376 +#: ppdc/sample.c:371 msgid "24" msgstr "" @@ -2608,35 +2634,35 @@ msgstr "" msgid "240x72dpi" msgstr "" -#: ppdc/sample.c:377 +#: ppdc/sample.c:372 msgid "25" msgstr "" -#: ppdc/sample.c:338 +#: ppdc/sample.c:333 msgid "250 mm/sec." msgstr "" -#: ppdc/sample.c:378 +#: ppdc/sample.c:373 msgid "26" msgstr "" -#: ppdc/sample.c:379 +#: ppdc/sample.c:374 msgid "27" msgstr "" -#: ppdc/sample.c:380 +#: ppdc/sample.c:375 msgid "28" msgstr "" -#: ppdc/sample.c:381 +#: ppdc/sample.c:376 msgid "29" msgstr "" -#: ppdc/sample.c:314 +#: ppdc/sample.c:309 msgid "3" msgstr "" -#: ppdc/sample.c:386 +#: ppdc/sample.c:381 msgid "3 inches/sec." msgstr "" @@ -2696,15 +2722,15 @@ msgstr "" msgid "3.50x1.00\"" msgstr "" -#: ppdc/sample.c:382 +#: ppdc/sample.c:377 msgid "30" msgstr "" -#: ppdc/sample.c:330 +#: ppdc/sample.c:325 msgid "30 mm/sec." msgstr "" -#: ppdc/sample.c:339 +#: ppdc/sample.c:334 msgid "300 mm/sec." msgstr "" @@ -2712,7 +2738,7 @@ msgstr "" msgid "300dpi" msgstr "" -#: ppdc/sample.c:410 +#: ppdc/sample.c:405 msgid "35" msgstr "" @@ -2724,11 +2750,11 @@ msgstr "" msgid "360x180dpi" msgstr "" -#: ppdc/sample.c:315 +#: ppdc/sample.c:310 msgid "4" msgstr "" -#: ppdc/sample.c:387 +#: ppdc/sample.c:382 msgid "4 inches/sec." msgstr "" @@ -2768,23 +2794,23 @@ msgstr "" msgid "4.00x6.50\"" msgstr "" -#: ppdc/sample.c:411 +#: ppdc/sample.c:406 msgid "40" msgstr "" -#: ppdc/sample.c:331 +#: ppdc/sample.c:326 msgid "40 mm/sec." msgstr "" -#: ppdc/sample.c:412 +#: ppdc/sample.c:407 msgid "45" msgstr "" -#: ppdc/sample.c:316 +#: ppdc/sample.c:311 msgid "5" msgstr "" -#: ppdc/sample.c:437 +#: ppdc/sample.c:432 msgid "5 inches/sec." msgstr "" @@ -2792,19 +2818,19 @@ msgstr "" msgid "5 x 7" msgstr "" -#: ppdc/sample.c:413 +#: ppdc/sample.c:408 msgid "50" msgstr "" -#: ppdc/sample.c:414 +#: ppdc/sample.c:409 msgid "55" msgstr "" -#: ppdc/sample.c:317 +#: ppdc/sample.c:312 msgid "6" msgstr "" -#: ppdc/sample.c:438 +#: ppdc/sample.c:433 msgid "6 inches/sec." msgstr "" @@ -2836,15 +2862,15 @@ msgstr "" msgid "6.00x6.50\"" msgstr "" -#: ppdc/sample.c:415 +#: ppdc/sample.c:410 msgid "60" msgstr "" -#: ppdc/sample.c:332 +#: ppdc/sample.c:327 msgid "60 mm/sec." msgstr "" -#: ppdc/sample.c:261 +#: ppdc/sample.c:253 msgid "600dpi" msgstr "" @@ -2856,15 +2882,15 @@ msgstr "" msgid "60x72dpi" msgstr "" -#: ppdc/sample.c:416 +#: ppdc/sample.c:411 msgid "65" msgstr "" -#: ppdc/sample.c:318 +#: ppdc/sample.c:313 msgid "7" msgstr "" -#: ppdc/sample.c:440 +#: ppdc/sample.c:435 msgid "7 inches/sec." msgstr "" @@ -2872,23 +2898,19 @@ msgstr "" msgid "7 x 9" msgstr "" -#: ppdc/sample.c:417 +#: ppdc/sample.c:412 msgid "70" msgstr "" -#: ppdc/sample.c:252 -msgid "720dpi" -msgstr "" - -#: ppdc/sample.c:418 +#: ppdc/sample.c:413 msgid "75" msgstr "" -#: ppdc/sample.c:319 +#: ppdc/sample.c:314 msgid "8" msgstr "" -#: ppdc/sample.c:441 +#: ppdc/sample.c:436 msgid "8 inches/sec." msgstr "" @@ -2924,23 +2946,23 @@ msgstr "" msgid "8.00x6.50\"" msgstr "" -#: ppdc/sample.c:419 +#: ppdc/sample.c:414 msgid "80" msgstr "" -#: ppdc/sample.c:333 +#: ppdc/sample.c:328 msgid "80 mm/sec." msgstr "" -#: ppdc/sample.c:420 +#: ppdc/sample.c:415 msgid "85" msgstr "" -#: ppdc/sample.c:320 +#: ppdc/sample.c:315 msgid "9" msgstr "" -#: ppdc/sample.c:442 +#: ppdc/sample.c:437 msgid "9 inches/sec." msgstr "" @@ -2956,11 +2978,11 @@ msgstr "" msgid "9-Pin Series" msgstr "" -#: ppdc/sample.c:421 +#: ppdc/sample.c:416 msgid "90" msgstr "" -#: ppdc/sample.c:422 +#: ppdc/sample.c:417 msgid "95" msgstr "" @@ -2976,7 +2998,7 @@ msgstr "" msgid "A Samba username is required to export printer drivers" msgstr "" -#: scheduler/ipp.c:2273 +#: scheduler/ipp.c:2274 #, c-format msgid "A class named \"%s\" already exists." msgstr "" @@ -3151,7 +3173,7 @@ msgstr "" msgid "Administration" msgstr "" -#: ppdc/sample.c:429 +#: ppdc/sample.c:424 msgid "Always" msgstr "" @@ -3159,7 +3181,7 @@ msgstr "" msgid "AppSocket/HP JetDirect" msgstr "" -#: ppdc/sample.c:450 +#: ppdc/sample.c:445 msgid "Applicator" msgstr "" @@ -3221,7 +3243,7 @@ msgstr "" msgid "B9" msgstr "" -#: scheduler/ipp.c:10764 +#: scheduler/ipp.c:10877 #, c-format msgid "Bad 'document-format' value \"%s\"." msgstr "" @@ -3280,27 +3302,27 @@ msgstr "" msgid "Bad custom parameter" msgstr "" -#: cups/http-support.c:1598 scheduler/ipp.c:2359 +#: cups/http-support.c:1598 scheduler/ipp.c:2360 #, c-format msgid "Bad device-uri \"%s\"." msgstr "" -#: scheduler/ipp.c:2398 +#: scheduler/ipp.c:2399 #, c-format msgid "Bad device-uri scheme \"%s\"." msgstr "" -#: scheduler/ipp.c:8016 scheduler/ipp.c:8032 scheduler/ipp.c:9250 +#: scheduler/ipp.c:8125 scheduler/ipp.c:8141 scheduler/ipp.c:9360 #, c-format msgid "Bad document-format \"%s\"." msgstr "" -#: scheduler/ipp.c:9266 +#: scheduler/ipp.c:9376 #, c-format msgid "Bad document-format-default \"%s\"." msgstr "" -#: cups/util.c:896 +#: cups/util.c:823 msgid "Bad filename buffer" msgstr "" @@ -3308,16 +3330,16 @@ msgstr "" msgid "Bad hostname/address in URI" msgstr "" -#: scheduler/ipp.c:1528 +#: scheduler/ipp.c:1527 #, c-format msgid "Bad job-name value: %s" msgstr "" -#: scheduler/ipp.c:1521 +#: scheduler/ipp.c:1520 msgid "Bad job-name value: Wrong type or count." msgstr "" -#: scheduler/ipp.c:9856 +#: scheduler/ipp.c:9967 msgid "Bad job-priority value." msgstr "" @@ -3330,24 +3352,24 @@ msgstr "" msgid "Bad job-sheets value type." msgstr "" -#: scheduler/ipp.c:9886 +#: scheduler/ipp.c:9997 msgid "Bad job-state value." msgstr "" -#: scheduler/ipp.c:2981 scheduler/ipp.c:3441 scheduler/ipp.c:5881 -#: scheduler/ipp.c:6028 scheduler/ipp.c:7450 scheduler/ipp.c:7719 -#: scheduler/ipp.c:8568 scheduler/ipp.c:8794 scheduler/ipp.c:9146 -#: scheduler/ipp.c:9749 +#: scheduler/ipp.c:2981 scheduler/ipp.c:3441 scheduler/ipp.c:5930 +#: scheduler/ipp.c:6077 scheduler/ipp.c:7559 scheduler/ipp.c:7828 +#: scheduler/ipp.c:8678 scheduler/ipp.c:8904 scheduler/ipp.c:9256 +#: scheduler/ipp.c:9860 #, c-format msgid "Bad job-uri \"%s\"." msgstr "" -#: scheduler/ipp.c:2039 scheduler/ipp.c:5419 +#: scheduler/ipp.c:2040 scheduler/ipp.c:5468 #, c-format msgid "Bad notify-pull-method \"%s\"." msgstr "" -#: scheduler/ipp.c:2003 scheduler/ipp.c:5383 +#: scheduler/ipp.c:2004 scheduler/ipp.c:5432 #, c-format msgid "Bad notify-recipient-uri \"%s\"." msgstr "" @@ -3371,12 +3393,12 @@ msgstr "" msgid "Bad port number in URI" msgstr "" -#: scheduler/ipp.c:2441 +#: scheduler/ipp.c:2442 #, c-format msgid "Bad port-monitor \"%s\"." msgstr "" -#: scheduler/ipp.c:2502 +#: scheduler/ipp.c:2503 #, c-format msgid "Bad printer-state value %d." msgstr "" @@ -3423,7 +3445,7 @@ msgstr "" msgid "Banners" msgstr "" -#: ppdc/sample.c:287 +#: ppdc/sample.c:282 msgid "Bond Paper" msgstr "" @@ -3436,11 +3458,11 @@ msgstr "" msgid "Buffer overflow detected, aborting." msgstr "" -#: ppdc/sample.c:254 +#: ppdc/sample.c:277 msgid "CMYK" msgstr "" -#: ppdc/sample.c:363 +#: ppdc/sample.c:358 msgid "CPCL Label Printer" msgstr "" @@ -3452,15 +3474,15 @@ msgstr "" msgid "Cancel RSS Subscription" msgstr "" -#: backend/ipp.c:2186 +#: backend/ipp.c:2198 msgid "Canceling print job." msgstr "" -#: scheduler/ipp.c:2482 +#: scheduler/ipp.c:2483 msgid "Cannot share a remote Kerberized printer." msgstr "" -#: ppdc/sample.c:279 +#: ppdc/sample.c:271 msgid "Cassette" msgstr "" @@ -3469,7 +3491,7 @@ msgstr "" msgid "Change Settings" msgstr "" -#: scheduler/ipp.c:2051 scheduler/ipp.c:5431 +#: scheduler/ipp.c:2052 scheduler/ipp.c:5480 #, c-format msgid "Character set \"%s\" not supported." msgstr "" @@ -3486,11 +3508,11 @@ msgstr "" msgid "Close-Job doesn't support the job-uri attribute." msgstr "" -#: ppdc/sample.c:282 +#: ppdc/sample.c:276 msgid "Color" msgstr "" -#: ppdc/sample.c:253 +#: ppdc/sample.c:274 msgid "Color Mode" msgstr "" @@ -3505,11 +3527,11 @@ msgstr "" msgid "Community name uses indefinite length" msgstr "" -#: backend/ipp.c:842 backend/lpd.c:879 backend/socket.c:400 +#: backend/ipp.c:854 backend/lpd.c:879 backend/socket.c:400 msgid "Connected to printer." msgstr "" -#: backend/ipp.c:747 backend/lpd.c:702 backend/socket.c:319 +#: backend/ipp.c:759 backend/lpd.c:702 backend/socket.c:319 msgid "Connecting to printer." msgstr "" @@ -3517,7 +3539,7 @@ msgstr "" msgid "Continue" msgstr "" -#: ppdc/sample.c:365 +#: ppdc/sample.c:360 msgid "Continuous" msgstr "" @@ -3525,7 +3547,7 @@ msgstr "" msgid "Control file sent successfully." msgstr "" -#: backend/ipp.c:1337 backend/lpd.c:472 +#: backend/ipp.c:1349 backend/lpd.c:472 msgid "Copying print data." msgstr "" @@ -3537,19 +3559,19 @@ msgstr "" msgid "Custom" msgstr "" -#: ppdc/sample.c:359 +#: ppdc/sample.c:354 msgid "CustominCutInterval" msgstr "" -#: ppdc/sample.c:357 +#: ppdc/sample.c:352 msgid "CustominTearInterval" msgstr "" -#: ppdc/sample.c:343 +#: ppdc/sample.c:338 msgid "Cut" msgstr "" -#: ppdc/sample.c:451 +#: ppdc/sample.c:446 msgid "Cutter" msgstr "" @@ -3573,7 +3595,7 @@ msgstr "" msgid "Delete Printer" msgstr "" -#: ppdc/sample.c:281 +#: ppdc/sample.c:273 msgid "DeskJet Series" msgstr "" @@ -3593,7 +3615,7 @@ msgid "" " location = %s" msgstr "" -#: ppdc/sample.c:436 +#: ppdc/sample.c:431 msgid "Direct Thermal Media" msgstr "" @@ -3622,16 +3644,16 @@ msgstr "" msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." msgstr "" -#: ppdc/sample.c:345 +#: ppdc/sample.c:340 msgid "Disabled" msgstr "" -#: scheduler/ipp.c:5930 +#: scheduler/ipp.c:5979 #, c-format msgid "Document #%d does not exist in job #%d." msgstr "" -#: ppdc/sample.c:275 +#: ppdc/sample.c:267 msgid "Duplexer" msgstr "" @@ -3639,11 +3661,11 @@ msgstr "" msgid "Dymo" msgstr "" -#: ppdc/sample.c:431 +#: ppdc/sample.c:426 msgid "EPL1 Label Printer" msgstr "" -#: ppdc/sample.c:434 +#: ppdc/sample.c:429 msgid "EPL2 Label Printer" msgstr "" @@ -3657,7 +3679,7 @@ msgstr "" msgid "Empty PPD file." msgstr "" -#: cups/http.c:4609 +#: cups/http.c:4624 msgid "Encryption is not supported." msgstr "" @@ -3670,7 +3692,7 @@ msgstr "" msgid "English" msgstr "" -#: scheduler/client.c:2203 +#: scheduler/client.c:2209 msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket." msgstr "" @@ -3762,7 +3784,7 @@ msgstr "" msgid "Envelope DL" msgstr "" -#: ppdc/sample.c:269 +#: ppdc/sample.c:261 msgid "Envelope Feed" msgstr "" @@ -3886,7 +3908,7 @@ msgstr "" msgid "Envelope You4 Long Edge" msgstr "" -#: test/ippfind.c:2779 +#: test/ippfind.c:2809 msgid "Environment Variables:" msgstr "" @@ -3907,43 +3929,43 @@ msgstr "" msgid "Error: need hostname after \"-h\" option." msgstr "" -#: ppdc/sample.c:355 +#: ppdc/sample.c:350 msgid "Every 10 Labels" msgstr "" -#: ppdc/sample.c:347 +#: ppdc/sample.c:342 msgid "Every 2 Labels" msgstr "" -#: ppdc/sample.c:348 +#: ppdc/sample.c:343 msgid "Every 3 Labels" msgstr "" -#: ppdc/sample.c:349 +#: ppdc/sample.c:344 msgid "Every 4 Labels" msgstr "" -#: ppdc/sample.c:350 +#: ppdc/sample.c:345 msgid "Every 5 Labels" msgstr "" -#: ppdc/sample.c:351 +#: ppdc/sample.c:346 msgid "Every 6 Labels" msgstr "" -#: ppdc/sample.c:352 +#: ppdc/sample.c:347 msgid "Every 7 Labels" msgstr "" -#: ppdc/sample.c:353 +#: ppdc/sample.c:348 msgid "Every 8 Labels" msgstr "" -#: ppdc/sample.c:354 +#: ppdc/sample.c:349 msgid "Every 9 Labels" msgstr "" -#: ppdc/sample.c:346 +#: ppdc/sample.c:341 msgid "Every Label" msgstr "" @@ -3959,7 +3981,7 @@ msgstr "" msgid "Export Printers to Samba" msgstr "" -#: test/ippfind.c:2725 +#: test/ippfind.c:2755 msgid "Expressions:" msgstr "" @@ -4014,7 +4036,7 @@ msgstr "" msgid "File Folder " msgstr "" -#: scheduler/ipp.c:2377 +#: scheduler/ipp.c:2378 #, c-format msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"." msgstr "" @@ -4037,7 +4059,7 @@ msgstr "" msgid "General" msgstr "" -#: ppdc/sample.c:259 +#: ppdc/sample.c:251 msgid "Generic" msgstr "" @@ -4045,22 +4067,22 @@ msgstr "" msgid "Get-Response-PDU uses indefinite length" msgstr "" -#: ppdc/sample.c:290 +#: ppdc/sample.c:285 msgid "Glossy Paper" msgstr "" #: scheduler/ipp.c:2959 scheduler/ipp.c:3367 scheduler/ipp.c:3905 -#: scheduler/ipp.c:5859 scheduler/ipp.c:6006 scheduler/ipp.c:7427 -#: scheduler/ipp.c:8546 scheduler/ipp.c:8772 scheduler/ipp.c:9124 -#: scheduler/ipp.c:9727 +#: scheduler/ipp.c:5908 scheduler/ipp.c:6055 scheduler/ipp.c:7536 +#: scheduler/ipp.c:8656 scheduler/ipp.c:8882 scheduler/ipp.c:9234 +#: scheduler/ipp.c:9838 msgid "Got a printer-uri attribute but no job-id." msgstr "" -#: ppdc/sample.c:255 +#: ppdc/sample.c:275 msgid "Grayscale" msgstr "" -#: ppdc/sample.c:280 +#: ppdc/sample.c:272 msgid "HP" msgstr "" @@ -4188,19 +4210,19 @@ msgstr "" msgid "Illegal whitespace character" msgstr "" -#: ppdc/sample.c:274 +#: ppdc/sample.c:266 msgid "Installable Options" msgstr "" -#: ppdc/sample.c:277 +#: ppdc/sample.c:269 msgid "Installed" msgstr "" -#: ppdc/sample.c:293 +#: ppdc/sample.c:288 msgid "IntelliBar Label Printer" msgstr "" -#: ppdc/sample.c:292 +#: ppdc/sample.c:287 msgid "Intellitech" msgstr "" @@ -4297,17 +4319,17 @@ msgstr "" msgid "JIS B9" msgstr "" -#: scheduler/ipp.c:8844 +#: scheduler/ipp.c:8954 #, c-format msgid "Job #%d cannot be restarted - no files." msgstr "" #: scheduler/ipp.c:2999 scheduler/ipp.c:3233 scheduler/ipp.c:3292 -#: scheduler/ipp.c:3469 scheduler/ipp.c:3915 scheduler/ipp.c:5517 -#: scheduler/ipp.c:5899 scheduler/ipp.c:6046 scheduler/ipp.c:6335 -#: scheduler/ipp.c:7274 scheduler/ipp.c:7296 scheduler/ipp.c:7468 -#: scheduler/ipp.c:7693 scheduler/ipp.c:7736 scheduler/ipp.c:8586 -#: scheduler/ipp.c:8812 scheduler/ipp.c:9164 scheduler/ipp.c:9767 +#: scheduler/ipp.c:3469 scheduler/ipp.c:3915 scheduler/ipp.c:5566 +#: scheduler/ipp.c:5948 scheduler/ipp.c:6095 scheduler/ipp.c:6433 +#: scheduler/ipp.c:7383 scheduler/ipp.c:7405 scheduler/ipp.c:7577 +#: scheduler/ipp.c:7802 scheduler/ipp.c:7845 scheduler/ipp.c:8696 +#: scheduler/ipp.c:8922 scheduler/ipp.c:9274 scheduler/ipp.c:9878 #, c-format msgid "Job #%d does not exist." msgstr "" @@ -4327,12 +4349,12 @@ msgstr "" msgid "Job #%d is already completed - can't cancel." msgstr "" -#: scheduler/ipp.c:7494 scheduler/ipp.c:7778 scheduler/ipp.c:9782 +#: scheduler/ipp.c:7603 scheduler/ipp.c:7887 scheduler/ipp.c:9893 #, c-format msgid "Job #%d is finished and cannot be altered." msgstr "" -#: scheduler/ipp.c:8826 +#: scheduler/ipp.c:8936 #, c-format msgid "Job #%d is not complete." msgstr "" @@ -4342,7 +4364,7 @@ msgstr "" msgid "Job #%d is not held for authentication." msgstr "" -#: scheduler/ipp.c:8600 +#: scheduler/ipp.c:8710 #, c-format msgid "Job #%d is not held." msgstr "" @@ -4363,7 +4385,7 @@ msgstr "" msgid "Job Stopped" msgstr "" -#: scheduler/ipp.c:9864 +#: scheduler/ipp.c:9975 msgid "Job is completed and cannot be changed." msgstr "" @@ -4371,11 +4393,11 @@ msgstr "" msgid "Job operation failed" msgstr "" -#: scheduler/ipp.c:9900 scheduler/ipp.c:9917 scheduler/ipp.c:9928 +#: scheduler/ipp.c:10011 scheduler/ipp.c:10028 scheduler/ipp.c:10039 msgid "Job state cannot be changed." msgstr "" -#: scheduler/ipp.c:8692 +#: scheduler/ipp.c:8802 msgid "Job subscriptions cannot be renewed." msgstr "" @@ -4391,11 +4413,11 @@ msgstr "" msgid "Label Printer" msgstr "" -#: ppdc/sample.c:446 +#: ppdc/sample.c:441 msgid "Label Top" msgstr "" -#: scheduler/ipp.c:2060 scheduler/ipp.c:5440 +#: scheduler/ipp.c:2061 scheduler/ipp.c:5489 #, c-format msgid "Language \"%s\" not supported." msgstr "" @@ -4404,7 +4426,7 @@ msgstr "" msgid "Large Address" msgstr "" -#: ppdc/sample.c:291 +#: ppdc/sample.c:286 msgid "LaserJet Series PCL 4/5" msgstr "" @@ -4432,7 +4454,7 @@ msgstr "" msgid "Load paper." msgstr "" -#: ppdc/sample.c:272 +#: ppdc/sample.c:264 msgid "Long-Edge (Portrait)" msgstr "" @@ -4440,7 +4462,7 @@ msgstr "" msgid "Looking for printer." msgstr "" -#: ppdc/sample.c:268 +#: ppdc/sample.c:260 msgid "Manual Feed" msgstr "" @@ -4448,15 +4470,15 @@ msgstr "" msgid "Media Size" msgstr "" -#: cups/ppd.c:751 cups/ppd.c:1317 ppdc/sample.c:262 +#: cups/ppd.c:751 cups/ppd.c:1317 ppdc/sample.c:254 msgid "Media Source" msgstr "" -#: ppdc/sample.c:364 +#: ppdc/sample.c:359 msgid "Media Tracking" msgstr "" -#: cups/ppd.c:749 cups/ppd.c:1315 ppdc/sample.c:285 +#: cups/ppd.c:749 cups/ppd.c:1315 ppdc/sample.c:280 msgid "Media Type" msgstr "" @@ -4480,7 +4502,7 @@ msgstr "" msgid "Missing asterisk in column 1" msgstr "" -#: scheduler/ipp.c:5922 +#: scheduler/ipp.c:5971 msgid "Missing document-number attribute." msgstr "" @@ -4495,7 +4517,7 @@ msgstr "" msgid "Missing form variable" msgstr "" -#: scheduler/ipp.c:9218 +#: scheduler/ipp.c:9328 msgid "Missing last-document attribute in request." msgstr "" @@ -4507,7 +4529,7 @@ msgstr "" msgid "Missing media-size in media-col." msgstr "" -#: scheduler/ipp.c:6465 +#: scheduler/ipp.c:6574 msgid "Missing notify-subscription-ids attribute." msgstr "" @@ -4557,7 +4579,7 @@ msgid "" " device-id = %s" msgstr "" -#: test/ippfind.c:2756 +#: test/ippfind.c:2786 msgid "Modifiers:" msgstr "" @@ -4593,18 +4615,10 @@ msgstr "" msgid "Nested classes are not allowed." msgstr "" -#: ppdc/sample.c:430 +#: ppdc/sample.c:425 msgid "Never" msgstr "" -#: ppdc/sample.c:256 -msgid "New Stylus Color Series" -msgstr "" - -#: ppdc/sample.c:258 -msgid "New Stylus Photo Series" -msgstr "" - #: cups/ppd.c:1904 msgid "No" msgstr "" @@ -4613,7 +4627,7 @@ msgstr "" msgid "No Content" msgstr "" -#: cups/util.c:1283 +#: cups/util.c:1123 msgid "No PPD name" msgstr "" @@ -4650,11 +4664,11 @@ msgstr "" msgid "No community name" msgstr "" -#: scheduler/ipp.c:5722 +#: scheduler/ipp.c:5771 msgid "No default printer." msgstr "" -#: cgi-bin/ipp-var.c:421 scheduler/ipp.c:7040 +#: cgi-bin/ipp-var.c:421 scheduler/ipp.c:7149 msgid "No destinations added." msgstr "" @@ -4670,11 +4684,11 @@ msgstr "" msgid "No error-status" msgstr "" -#: scheduler/ipp.c:7982 scheduler/ipp.c:9232 +#: scheduler/ipp.c:8091 scheduler/ipp.c:9342 msgid "No file in print request." msgstr "" -#: cups/util.c:890 +#: cups/util.c:817 msgid "No modification time" msgstr "" @@ -4687,19 +4701,19 @@ msgstr "" msgid "No pages were found." msgstr "" -#: cups/util.c:884 +#: cups/util.c:811 msgid "No printer name" msgstr "" -#: cups/util.c:1807 +#: cups/util.c:1647 msgid "No printer-uri found" msgstr "" -#: cups/util.c:1791 +#: cups/util.c:1631 msgid "No printer-uri found for class" msgstr "" -#: scheduler/ipp.c:6125 +#: scheduler/ipp.c:6179 msgid "No printer-uri in request." msgstr "" @@ -4719,11 +4733,11 @@ msgstr "" msgid "No request-id" msgstr "" -#: scheduler/ipp.c:5325 +#: scheduler/ipp.c:5374 msgid "No subscription attributes in request." msgstr "" -#: scheduler/ipp.c:7367 +#: scheduler/ipp.c:7476 msgid "No subscriptions found." msgstr "" @@ -4735,11 +4749,11 @@ msgstr "" msgid "No version number" msgstr "" -#: ppdc/sample.c:367 +#: ppdc/sample.c:362 msgid "Non-continuous (Mark sensing)" msgstr "" -#: ppdc/sample.c:366 +#: ppdc/sample.c:361 msgid "Non-continuous (Web sensing)" msgstr "" @@ -4755,7 +4769,7 @@ msgstr "" msgid "Not Implemented" msgstr "" -#: ppdc/sample.c:276 +#: ppdc/sample.c:268 msgid "Not Installed" msgstr "" @@ -4767,7 +4781,7 @@ msgstr "" msgid "Not Supported" msgstr "" -#: scheduler/ipp.c:1490 scheduler/ipp.c:10461 +#: scheduler/ipp.c:1490 scheduler/ipp.c:10572 msgid "Not allowed to print." msgstr "" @@ -4783,11 +4797,11 @@ msgstr "" msgid "OK" msgstr "" -#: ppdc/sample.c:271 +#: ppdc/sample.c:263 msgid "Off (1-Sided)" msgstr "" -#: ppdc/sample.c:361 +#: ppdc/sample.c:356 msgid "Oki" msgstr "" @@ -4821,9 +4835,9 @@ msgstr "" msgid "Options Installed" msgstr "" -#: scheduler/cupsfilter.c:1482 scheduler/main.c:2158 systemv/cupsaddsmb.c:284 +#: scheduler/cupsfilter.c:1482 scheduler/main.c:2146 systemv/cupsaddsmb.c:284 #: systemv/cupsctl.c:203 systemv/cupstestdsc.c:429 systemv/cupstestppd.c:3817 -#: test/ippfind.c:2715 test/ipptool.c:4713 ppdc/ppdc.cxx:432 +#: test/ippfind.c:2745 test/ipptool.c:4805 ppdc/ppdc.cxx:432 #: ppdc/ppdhtml.cxx:174 ppdc/ppdi.cxx:130 ppdc/ppdmerge.cxx:363 #: ppdc/ppdpo.cxx:254 msgid "Options:" @@ -4857,7 +4871,7 @@ msgstr "" msgid "PASS" msgstr "" -#: ppdc/sample.c:260 +#: ppdc/sample.c:252 msgid "PCL Laser Printer" msgstr "" @@ -4909,11 +4923,11 @@ msgstr "" msgid "Paper tray is missing." msgstr "" -#: ppdc/sample.c:360 +#: ppdc/sample.c:355 msgid "ParamCustominCutInterval" msgstr "" -#: ppdc/sample.c:358 +#: ppdc/sample.c:353 msgid "ParamCustominTearInterval" msgstr "" @@ -4935,7 +4949,7 @@ msgstr "" msgid "Pause Printer" msgstr "" -#: ppdc/sample.c:448 +#: ppdc/sample.c:443 msgid "Peel-Off" msgstr "" @@ -4947,7 +4961,7 @@ msgstr "" msgid "Photo Labels" msgstr "" -#: ppdc/sample.c:286 +#: ppdc/sample.c:281 msgid "Plain Paper" msgstr "" @@ -4959,7 +4973,7 @@ msgstr "" msgid "Port Monitor" msgstr "" -#: ppdc/sample.c:278 +#: ppdc/sample.c:270 msgid "PostScript Printer" msgstr "" @@ -4979,11 +4993,11 @@ msgstr "" msgid "Postcard Long Edge" msgstr "" -#: backend/ipp.c:949 backend/ipp.c:957 +#: backend/ipp.c:961 backend/ipp.c:969 msgid "Preparing to print." msgstr "" -#: ppdc/sample.c:295 +#: ppdc/sample.c:290 msgid "Print Density" msgstr "" @@ -4991,11 +5005,11 @@ msgstr "" msgid "Print Job:" msgstr "" -#: ppdc/sample.c:340 +#: ppdc/sample.c:335 msgid "Print Mode" msgstr "" -#: ppdc/sample.c:383 +#: ppdc/sample.c:378 msgid "Print Rate" msgstr "" @@ -5003,7 +5017,7 @@ msgstr "" msgid "Print Self-Test Page" msgstr "" -#: ppdc/sample.c:327 +#: ppdc/sample.c:322 msgid "Print Speed" msgstr "" @@ -5011,11 +5025,11 @@ msgstr "" msgid "Print Test Page" msgstr "" -#: ppdc/sample.c:356 +#: ppdc/sample.c:351 msgid "Print and Cut" msgstr "" -#: ppdc/sample.c:344 +#: ppdc/sample.c:339 msgid "Print and Tear" msgstr "" @@ -5023,15 +5037,15 @@ msgstr "" msgid "Print file sent." msgstr "" -#: backend/ipp.c:2160 +#: backend/ipp.c:2172 msgid "Print job canceled at printer." msgstr "" -#: backend/ipp.c:2152 +#: backend/ipp.c:2164 msgid "Print job too large." msgstr "" -#: backend/ipp.c:1630 +#: backend/ipp.c:1642 msgid "Print job was not accepted." msgstr "" @@ -5039,7 +5053,7 @@ msgstr "" msgid "Printer Added" msgstr "" -#: ppdc/sample.c:263 +#: ppdc/sample.c:255 msgid "Printer Default" msgstr "" @@ -5055,15 +5069,15 @@ msgstr "" msgid "Printer Paused" msgstr "" -#: ppdc/sample.c:294 +#: ppdc/sample.c:289 msgid "Printer Settings" msgstr "" -#: backend/ipp.c:2155 +#: backend/ipp.c:2167 msgid "Printer cannot print supplied content." msgstr "" -#: backend/ipp.c:2158 +#: backend/ipp.c:2170 msgid "Printer cannot print with supplied options." msgstr "" @@ -5085,7 +5099,7 @@ msgstr "" msgid "Quarto" msgstr "" -#: scheduler/ipp.c:1485 scheduler/ipp.c:10456 +#: scheduler/ipp.c:1485 scheduler/ipp.c:10567 msgid "Quota limit reached." msgstr "" @@ -5107,7 +5121,7 @@ msgstr "" msgid "Remote host did not accept data file (%d)." msgstr "" -#: ppdc/sample.c:428 +#: ppdc/sample.c:423 msgid "Reprint After Error" msgstr "" @@ -5131,7 +5145,7 @@ msgstr "" msgid "Return Address" msgstr "" -#: ppdc/sample.c:449 +#: ppdc/sample.c:444 msgid "Rewind" msgstr "" @@ -5172,7 +5186,7 @@ msgstr "" msgid "Server Stopped" msgstr "" -#: cups/tls-darwin.c:1028 +#: cups/tls-darwin.c:1008 cups/tls-gnutls.c:1024 msgid "Server credentials not set." msgstr "" @@ -5205,11 +5219,11 @@ msgstr "" msgid "Shipping Address" msgstr "" -#: ppdc/sample.c:273 +#: ppdc/sample.c:265 msgid "Short-Edge (Landscape)" msgstr "" -#: ppdc/sample.c:288 +#: ppdc/sample.c:283 msgid "Special Paper" msgstr "" @@ -5218,7 +5232,7 @@ msgstr "" msgid "Spooling job, %.0f%% complete." msgstr "" -#: ppdc/sample.c:341 +#: ppdc/sample.c:336 msgid "Standard" msgstr "" @@ -5237,21 +5251,13 @@ msgstr "" msgid "Statement" msgstr "" -#: ppdc/sample.c:251 -msgid "Stylus Color Series" -msgstr "" - -#: ppdc/sample.c:257 -msgid "Stylus Photo Series" -msgstr "" - -#: scheduler/ipp.c:3564 scheduler/ipp.c:6481 scheduler/ipp.c:7180 -#: scheduler/ipp.c:8680 +#: scheduler/ipp.c:3564 scheduler/ipp.c:6590 scheduler/ipp.c:7289 +#: scheduler/ipp.c:8790 #, c-format msgid "Subscription #%d does not exist." msgstr "" -#: test/ippfind.c:2768 +#: test/ippfind.c:2798 msgid "Substitutions:" msgstr "" @@ -5283,15 +5289,15 @@ msgstr "" msgid "Tabloid Oversize Long Edge" msgstr "" -#: ppdc/sample.c:342 +#: ppdc/sample.c:337 msgid "Tear" msgstr "" -#: ppdc/sample.c:447 +#: ppdc/sample.c:442 msgid "Tear-Off" msgstr "" -#: ppdc/sample.c:388 +#: ppdc/sample.c:383 msgid "Tear-Off Adjust Position" msgstr "" @@ -5300,8 +5306,8 @@ msgstr "" msgid "The \"%s\" attribute is required for print jobs." msgstr "" -#: scheduler/ipp.c:6196 scheduler/ipp.c:6274 scheduler/ipp.c:6290 -#: scheduler/ipp.c:6308 +#: scheduler/ipp.c:6250 scheduler/ipp.c:6330 scheduler/ipp.c:6343 +#: scheduler/ipp.c:6355 scheduler/ipp.c:6370 #, c-format msgid "The %s attribute cannot be provided with job-ids." msgstr "" @@ -5311,17 +5317,17 @@ msgstr "" msgid "The '%s' Job Description attribute cannot be supplied in a job creation request." msgstr "" -#: scheduler/ipp.c:5134 +#: scheduler/ipp.c:5183 #, c-format msgid "The '%s' operation attribute cannot be supplied in a Create-Job request." msgstr "" -#: scheduler/ipp.c:6711 +#: scheduler/ipp.c:6820 #, c-format msgid "The PPD file \"%s\" could not be found." msgstr "" -#: scheduler/ipp.c:6698 +#: scheduler/ipp.c:6807 #, c-format msgid "The PPD file \"%s\" could not be opened: %s" msgstr "" @@ -5351,11 +5357,11 @@ msgstr "" msgid "The fuser's temperature is low." msgstr "" -#: scheduler/ipp.c:2087 +#: scheduler/ipp.c:2088 msgid "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "" -#: scheduler/ipp.c:2070 scheduler/ipp.c:5450 +#: scheduler/ipp.c:2071 scheduler/ipp.c:5499 #, c-format msgid "The notify-user-data value is too large (%d > 63 octets)." msgstr "" @@ -5368,7 +5374,7 @@ msgstr "" msgid "The optical photoconductor will need to be replaced soon." msgstr "" -#: backend/ipp.c:969 +#: backend/ipp.c:981 msgid "The printer configuration is incorrect or the printer no longer exists." msgstr "" @@ -5376,8 +5382,8 @@ msgstr "" msgid "The printer did not respond." msgstr "" -#: backend/ipp.c:813 backend/ipp.c:932 backend/ipp.c:1046 backend/ipp.c:1437 -#: backend/ipp.c:1602 backend/lpd.c:836 backend/socket.c:379 +#: backend/ipp.c:825 backend/ipp.c:944 backend/ipp.c:1058 backend/ipp.c:1449 +#: backend/ipp.c:1614 backend/lpd.c:836 backend/socket.c:379 #: backend/usb-unix.c:124 backend/usb-unix.c:414 backend/usb-unix.c:497 msgid "The printer is in use." msgstr "" @@ -5394,7 +5400,7 @@ msgstr "" msgid "The printer is not connected." msgstr "" -#: backend/ipp.c:791 backend/ipp.c:824 backend/ipp.c:928 backend/lpd.c:815 +#: backend/ipp.c:803 backend/ipp.c:836 backend/ipp.c:940 backend/lpd.c:815 #: backend/lpd.c:856 backend/socket.c:358 backend/socket.c:391 msgid "The printer is not responding." msgstr "" @@ -5411,7 +5417,7 @@ msgstr "" msgid "The printer is offline." msgstr "" -#: backend/ipp.c:806 backend/lpd.c:829 backend/socket.c:372 +#: backend/ipp.c:818 backend/lpd.c:829 backend/socket.c:372 msgid "The printer is unreachable at this time." msgstr "" @@ -5423,7 +5429,7 @@ msgstr "" msgid "The printer may be out of toner." msgstr "" -#: backend/ipp.c:800 backend/lpd.c:823 backend/socket.c:366 +#: backend/ipp.c:812 backend/lpd.c:823 backend/socket.c:366 msgid "The printer may not exist or is unavailable at this time." msgstr "" @@ -5432,13 +5438,13 @@ msgid "The printer name may only contain up to 127 printable characters and may msgstr "" #: scheduler/ipp.c:788 scheduler/ipp.c:1048 scheduler/ipp.c:3205 -#: scheduler/ipp.c:3384 scheduler/ipp.c:5117 scheduler/ipp.c:5284 -#: scheduler/ipp.c:5598 scheduler/ipp.c:6162 scheduler/ipp.c:6916 -#: scheduler/ipp.c:6972 scheduler/ipp.c:7286 scheduler/ipp.c:7552 -#: scheduler/ipp.c:7641 scheduler/ipp.c:7674 scheduler/ipp.c:7997 -#: scheduler/ipp.c:8390 scheduler/ipp.c:8472 scheduler/ipp.c:9636 -#: scheduler/ipp.c:10088 scheduler/ipp.c:10419 scheduler/ipp.c:10501 -#: scheduler/ipp.c:10874 +#: scheduler/ipp.c:3384 scheduler/ipp.c:5166 scheduler/ipp.c:5333 +#: scheduler/ipp.c:5647 scheduler/ipp.c:6216 scheduler/ipp.c:7025 +#: scheduler/ipp.c:7081 scheduler/ipp.c:7395 scheduler/ipp.c:7661 +#: scheduler/ipp.c:7750 scheduler/ipp.c:7783 scheduler/ipp.c:8106 +#: scheduler/ipp.c:8500 scheduler/ipp.c:8582 scheduler/ipp.c:9747 +#: scheduler/ipp.c:10199 scheduler/ipp.c:10530 scheduler/ipp.c:10612 +#: scheduler/ipp.c:10987 msgid "The printer or class does not exist." msgstr "" @@ -5466,7 +5472,7 @@ msgstr "" msgid "The printer's waste bin is full." msgstr "" -#: scheduler/ipp.c:894 scheduler/ipp.c:2251 +#: scheduler/ipp.c:894 scheduler/ipp.c:2252 #, c-format msgid "The printer-uri \"%s\" contains invalid characters." msgstr "" @@ -5479,7 +5485,7 @@ msgstr "" msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." msgstr "" -#: scheduler/ipp.c:2235 +#: scheduler/ipp.c:2236 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "" @@ -5487,16 +5493,16 @@ msgstr "" msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)." msgstr "" -#: scheduler/client.c:2226 +#: scheduler/client.c:2232 msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." msgstr "" -#: scheduler/ipp.c:6257 +#: scheduler/ipp.c:6314 #, c-format msgid "The which-jobs value \"%s\" is not supported." msgstr "" -#: scheduler/ipp.c:5528 +#: scheduler/ipp.c:5577 msgid "There are too many subscriptions." msgstr "" @@ -5505,7 +5511,7 @@ msgstr "" msgid "There was an unrecoverable USB error." msgstr "" -#: ppdc/sample.c:435 +#: ppdc/sample.c:430 msgid "Thermal Transfer Media" msgstr "" @@ -5518,32 +5524,32 @@ msgstr "" msgid "Too many job-sheets values (%d > 2)." msgstr "" -#: scheduler/ipp.c:2536 +#: scheduler/ipp.c:2537 #, c-format msgid "Too many printer-state-reasons values (%d > %d)." msgstr "" -#: ppdc/sample.c:289 +#: ppdc/sample.c:284 msgid "Transparency" msgstr "" -#: ppdc/sample.c:284 +#: ppdc/sample.c:279 msgid "Tray" msgstr "" -#: ppdc/sample.c:264 +#: ppdc/sample.c:256 msgid "Tray 1" msgstr "" -#: ppdc/sample.c:265 +#: ppdc/sample.c:257 msgid "Tray 2" msgstr "" -#: ppdc/sample.c:266 +#: ppdc/sample.c:258 msgid "Tray 3" msgstr "" -#: ppdc/sample.c:267 +#: ppdc/sample.c:259 msgid "Tray 4" msgstr "" @@ -5603,11 +5609,11 @@ msgstr "" msgid "Unable to add class" msgstr "" -#: backend/ipp.c:1784 +#: backend/ipp.c:1796 msgid "Unable to add document to print job." msgstr "" -#: scheduler/ipp.c:1538 +#: scheduler/ipp.c:1537 #, c-format msgid "Unable to add job for destination \"%s\"." msgstr "" @@ -5632,7 +5638,7 @@ msgstr "" msgid "Unable to cancel RSS subscription" msgstr "" -#: backend/ipp.c:2065 backend/ipp.c:2500 +#: backend/ipp.c:2077 backend/ipp.c:2512 msgid "Unable to cancel print job." msgstr "" @@ -5666,7 +5672,7 @@ msgstr "" msgid "Unable to connect to host." msgstr "" -#: backend/ipp.c:769 backend/ipp.c:1242 backend/lpd.c:795 backend/socket.c:338 +#: backend/ipp.c:781 backend/ipp.c:1254 backend/lpd.c:795 backend/socket.c:338 #: backend/usb-unix.c:110 msgid "Unable to contact printer, queuing on next printer in class." msgstr "" @@ -5686,12 +5692,12 @@ msgstr "" msgid "Unable to copy CUPS printer driver files (%d)." msgstr "" -#: scheduler/ipp.c:2656 +#: scheduler/ipp.c:2657 #, c-format msgid "Unable to copy PPD file - %s" msgstr "" -#: scheduler/ipp.c:2711 +#: scheduler/ipp.c:2712 msgid "Unable to copy PPD file." msgstr "" @@ -5705,16 +5711,16 @@ msgstr "" msgid "Unable to copy Windows 9x printer driver files (%d)." msgstr "" -#: scheduler/ipp.c:2633 +#: scheduler/ipp.c:2634 #, c-format msgid "Unable to copy interface script - %s" msgstr "" -#: cups/util.c:569 cups/util.c:1639 +#: cups/util.c:496 cups/util.c:1479 msgid "Unable to create printer-uri" msgstr "" -#: cups/tls-darwin.c:1136 +#: cups/tls-darwin.c:1116 cups/tls-gnutls.c:1157 msgid "Unable to create server credentials." msgstr "" @@ -5738,36 +5744,35 @@ msgstr "" msgid "Unable to edit cupsd.conf files larger than 1MB" msgstr "" -#: cups/tls-darwin.c:1304 cups/tls-sspi.c:493 +#: cups/tls-darwin.c:1284 msgid "Unable to establish a secure connection to host (certificate chain invalid)." msgstr "" -#: cups/tls-darwin.c:1294 cups/tls-sspi.c:483 +#: cups/tls-darwin.c:1274 msgid "Unable to establish a secure connection to host (certificate not yet valid)." msgstr "" -#: cups/tls-darwin.c:1289 cups/tls-sspi.c:478 +#: cups/tls-darwin.c:1269 msgid "Unable to establish a secure connection to host (expired certificate)." msgstr "" -#: cups/tls-darwin.c:1299 cups/tls-sspi.c:488 +#: cups/tls-darwin.c:1279 msgid "Unable to establish a secure connection to host (host name mismatch)." msgstr "" -#: cups/tls-darwin.c:1309 cups/tls-sspi.c:498 +#: cups/tls-darwin.c:1289 msgid "Unable to establish a secure connection to host (peer dropped connection before responding)." msgstr "" -#: cups/tls-darwin.c:1284 cups/tls-sspi.c:473 +#: cups/tls-darwin.c:1264 msgid "Unable to establish a secure connection to host (self-signed certificate)." msgstr "" -#: cups/tls-darwin.c:1279 cups/tls-sspi.c:468 +#: cups/tls-darwin.c:1259 msgid "Unable to establish a secure connection to host (untrusted certificate)." msgstr "" -#: cups/tls-darwin.c:1336 cups/tls-sspi.c:269 cups/tls-sspi.c:525 -#: cups/tls-sspi.c:558 cups/tls-sspi.c:575 +#: cups/tls-darwin.c:1316 cups/tls-sspi.c:1247 cups/tls-sspi.c:1264 msgid "Unable to establish a secure connection to host." msgstr "" @@ -5779,11 +5784,11 @@ msgstr "" msgid "Unable to find printer." msgstr "" -#: cups/tls-darwin.c:1150 +#: cups/tls-darwin.c:1130 msgid "Unable to find server credentials." msgstr "" -#: backend/ipp.c:3481 +#: backend/ipp.c:3493 msgid "Unable to get backend exit status." msgstr "" @@ -5811,7 +5816,7 @@ msgstr "" msgid "Unable to get printer status" msgstr "" -#: backend/ipp.c:993 +#: backend/ipp.c:1005 msgid "Unable to get printer status." msgstr "" @@ -5867,7 +5872,7 @@ msgstr "" msgid "Unable to open device file" msgstr "" -#: scheduler/ipp.c:5943 +#: scheduler/ipp.c:5992 #, c-format msgid "Unable to open document #%d in job #%d." msgstr "" @@ -5876,7 +5881,7 @@ msgstr "" msgid "Unable to open help file." msgstr "" -#: backend/ipp.c:378 backend/ipp.c:1531 backend/ipp.c:1739 backend/lpd.c:496 +#: backend/ipp.c:378 backend/ipp.c:1543 backend/ipp.c:1751 backend/lpd.c:496 #: backend/socket.c:150 backend/usb.c:237 filter/gziptoany.c:67 #: filter/pstops.c:267 msgid "Unable to open print file" @@ -5930,7 +5935,7 @@ msgstr "" msgid "Unable to set server default" msgstr "" -#: backend/ipp.c:3340 backend/ipp.c:3417 backend/ipp.c:3425 +#: backend/ipp.c:3352 backend/ipp.c:3429 backend/ipp.c:3437 msgid "Unable to start backend process." msgstr "" @@ -6002,12 +6007,12 @@ msgstr "" msgid "Unknown print mode: \"%s\"." msgstr "" -#: scheduler/ipp.c:10290 +#: scheduler/ipp.c:10401 #, c-format msgid "Unknown printer-error-policy \"%s\"." msgstr "" -#: scheduler/ipp.c:10273 +#: scheduler/ipp.c:10384 #, c-format msgid "Unknown printer-op-policy \"%s\"." msgstr "" @@ -6033,17 +6038,17 @@ msgstr "" msgid "Unknown version option value: \"%s\"." msgstr "" -#: scheduler/ipp.c:10745 +#: scheduler/ipp.c:10858 #, c-format msgid "Unsupported 'compression' value \"%s\"." msgstr "" -#: scheduler/ipp.c:10775 +#: scheduler/ipp.c:10888 #, c-format msgid "Unsupported 'document-format' value \"%s\"." msgstr "" -#: scheduler/ipp.c:10850 +#: scheduler/ipp.c:10963 msgid "Unsupported 'job-name' value." msgstr "" @@ -6052,17 +6057,17 @@ msgstr "" msgid "Unsupported character set \"%s\"." msgstr "" -#: scheduler/ipp.c:7963 scheduler/ipp.c:9197 +#: scheduler/ipp.c:8072 scheduler/ipp.c:9307 #, c-format msgid "Unsupported compression \"%s\"." msgstr "" -#: scheduler/ipp.c:8097 scheduler/ipp.c:9347 +#: scheduler/ipp.c:8206 scheduler/ipp.c:9457 #, c-format msgid "Unsupported document-format \"%s\"." msgstr "" -#: scheduler/ipp.c:9330 +#: scheduler/ipp.c:9440 #, c-format msgid "Unsupported document-format \"%s/%s\"." msgstr "" @@ -6135,7 +6140,7 @@ msgstr "" msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" msgstr "" -#: scheduler/main.c:2157 +#: scheduler/main.c:2145 msgid "Usage: cupsd [options]" msgstr "" @@ -6159,7 +6164,7 @@ msgid "" "Options:" msgstr "" -#: test/ippfind.c:2708 +#: test/ippfind.c:2738 msgid "" "Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n" " ippfind [options] name[.regtype[.domain.]] ... [expression]\n" @@ -6167,7 +6172,7 @@ msgid "" " ippfind --version" msgstr "" -#: test/ipptool.c:4711 +#: test/ipptool.c:4803 msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" msgstr "" @@ -6223,7 +6228,7 @@ msgstr "" msgid "Version uses indefinite length" msgstr "" -#: backend/ipp.c:1901 +#: backend/ipp.c:1913 msgid "Waiting for job to complete." msgstr "" @@ -6247,16 +6252,16 @@ msgstr "" msgid "Yes" msgstr "" -#: scheduler/client.c:2213 +#: scheduler/client.c:2219 #, c-format msgid "You must access this page using the URL https://%s:%d%s." msgstr "" -#: ppdc/sample.c:439 +#: ppdc/sample.c:434 msgid "ZPL Label Printer" msgstr "" -#: ppdc/sample.c:362 +#: ppdc/sample.c:357 msgid "Zebra" msgstr "" @@ -6272,11 +6277,11 @@ msgstr "" msgid "completed" msgstr "" -#: scheduler/ipp.c:5815 +#: scheduler/ipp.c:5864 msgid "cups-deviced failed to execute." msgstr "" -#: scheduler/ipp.c:6634 scheduler/ipp.c:6883 +#: scheduler/ipp.c:6743 scheduler/ipp.c:6992 msgid "cups-driverd failed to execute." msgstr "" @@ -6304,36 +6309,36 @@ msgstr "" msgid "cupsctl: Unknown option \"-%c\"" msgstr "" -#: scheduler/main.c:172 +#: scheduler/main.c:171 msgid "cupsd: Expected config filename after \"-c\" option." msgstr "" -#: scheduler/main.c:259 +#: scheduler/main.c:258 msgid "cupsd: Expected cups-files.conf filename after \"-s\" option." msgstr "" -#: scheduler/main.c:237 +#: scheduler/main.c:236 msgid "cupsd: On-demand support not compiled in, running in normal mode." msgstr "" -#: scheduler/main.c:270 +#: scheduler/main.c:269 msgid "cupsd: Relative cups-files.conf filename not allowed." msgstr "" -#: scheduler/main.c:203 scheduler/main.c:210 +#: scheduler/main.c:202 scheduler/main.c:209 msgid "cupsd: Unable to get current directory." msgstr "" -#: scheduler/main.c:317 scheduler/main.c:326 +#: scheduler/main.c:316 scheduler/main.c:325 msgid "cupsd: Unable to get path to cups-files.conf file." msgstr "" -#: scheduler/main.c:299 +#: scheduler/main.c:298 #, c-format msgid "cupsd: Unknown argument \"%s\" - aborting." msgstr "" -#: scheduler/main.c:292 +#: scheduler/main.c:291 #, c-format msgid "cupsd: Unknown option \"%c\" - aborting." msgstr "" @@ -6395,148 +6400,148 @@ msgstr "" msgid "idle" msgstr "" -#: test/ippfind.c:2435 +#: test/ippfind.c:2465 #, c-format msgid "ippfind: Bad regular expression: %s" msgstr "" -#: test/ippfind.c:324 +#: test/ippfind.c:328 msgid "ippfind: Cannot use --and after --or." msgstr "" -#: test/ippfind.c:597 +#: test/ippfind.c:601 #, c-format msgid "ippfind: Expected key name after %s." msgstr "" -#: test/ippfind.c:547 test/ippfind.c:730 +#: test/ippfind.c:551 test/ippfind.c:734 #, c-format msgid "ippfind: Expected port range after %s." msgstr "" -#: test/ippfind.c:357 +#: test/ippfind.c:361 #, c-format msgid "ippfind: Expected program after %s." msgstr "" -#: test/ippfind.c:374 +#: test/ippfind.c:378 #, c-format msgid "ippfind: Expected semi-colon after %s." msgstr "" -#: test/ippfind.c:1958 +#: test/ippfind.c:1965 msgid "ippfind: Missing close brace in substitution." msgstr "" -#: test/ippfind.c:1049 +#: test/ippfind.c:1053 msgid "ippfind: Missing close parenthesis." msgstr "" -#: test/ippfind.c:331 +#: test/ippfind.c:335 msgid "ippfind: Missing expression before \"--and\"." msgstr "" -#: test/ippfind.c:444 +#: test/ippfind.c:448 msgid "ippfind: Missing expression before \"--or\"." msgstr "" -#: test/ippfind.c:867 +#: test/ippfind.c:871 #, c-format msgid "ippfind: Missing key name after %s." msgstr "" -#: test/ippfind.c:1020 +#: test/ippfind.c:1024 msgid "ippfind: Missing open parenthesis." msgstr "" -#: test/ippfind.c:897 +#: test/ippfind.c:901 #, c-format msgid "ippfind: Missing program after %s." msgstr "" -#: test/ippfind.c:343 test/ippfind.c:397 test/ippfind.c:426 test/ippfind.c:532 -#: test/ippfind.c:614 test/ippfind.c:629 test/ippfind.c:784 test/ippfind.c:799 -#: test/ippfind.c:822 test/ippfind.c:882 +#: test/ippfind.c:347 test/ippfind.c:401 test/ippfind.c:430 test/ippfind.c:536 +#: test/ippfind.c:618 test/ippfind.c:633 test/ippfind.c:788 test/ippfind.c:803 +#: test/ippfind.c:826 test/ippfind.c:886 #, c-format msgid "ippfind: Missing regular expression after %s." msgstr "" -#: test/ippfind.c:915 +#: test/ippfind.c:919 #, c-format msgid "ippfind: Missing semi-colon after %s." msgstr "" -#: test/ippfind.c:1905 test/ippfind.c:1930 +#: test/ippfind.c:1912 test/ippfind.c:1937 msgid "ippfind: Out of memory." msgstr "" -#: test/ippfind.c:993 +#: test/ippfind.c:997 msgid "ippfind: Too many parenthesis." msgstr "" -#: test/ippfind.c:1262 test/ippfind.c:1398 test/ippfind.c:2527 +#: test/ippfind.c:1266 test/ippfind.c:1402 test/ippfind.c:2557 #, c-format msgid "ippfind: Unable to browse or resolve: %s" msgstr "" -#: test/ippfind.c:2017 test/ippfind.c:2044 +#: test/ippfind.c:2035 test/ippfind.c:2062 #, c-format msgid "ippfind: Unable to execute \"%s\": %s" msgstr "" -#: test/ippfind.c:1139 test/ippfind.c:1147 test/ippfind.c:1158 +#: test/ippfind.c:1143 test/ippfind.c:1151 test/ippfind.c:1162 #, c-format msgid "ippfind: Unable to use Bonjour: %s" msgstr "" -#: test/ippfind.c:1987 +#: test/ippfind.c:1994 #, c-format msgid "ippfind: Unknown variable \"{%s}\"." msgstr "" -#: test/ipptool.c:324 test/ipptool.c:387 test/ipptool.c:542 test/ipptool.c:565 +#: test/ipptool.c:326 test/ipptool.c:389 test/ipptool.c:544 test/ipptool.c:567 msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"." msgstr "" -#: test/ipptool.c:621 +#: test/ipptool.c:623 #, c-format msgid "ipptool: Bad URI - %s." msgstr "" -#: test/ipptool.c:535 +#: test/ipptool.c:537 msgid "ipptool: Invalid seconds for \"-i\"." msgstr "" -#: test/ipptool.c:602 +#: test/ipptool.c:604 msgid "ipptool: May only specify a single URI." msgstr "" -#: test/ipptool.c:557 +#: test/ipptool.c:559 msgid "ipptool: Missing count for \"-n\"." msgstr "" -#: test/ipptool.c:421 +#: test/ipptool.c:423 msgid "ipptool: Missing filename for \"-f\"." msgstr "" -#: test/ipptool.c:402 +#: test/ipptool.c:404 msgid "ipptool: Missing name=value for \"-d\"." msgstr "" -#: test/ipptool.c:525 +#: test/ipptool.c:527 msgid "ipptool: Missing seconds for \"-i\"." msgstr "" -#: test/ipptool.c:647 +#: test/ipptool.c:649 msgid "ipptool: URI required before test file." msgstr "" -#: test/ipptool.c:583 +#: test/ipptool.c:585 #, c-format msgid "ipptool: Unknown option \"-%c\"." msgstr "" -#: scheduler/ipp.c:7630 +#: scheduler/ipp.c:7739 msgid "job-printer-uri attribute missing." msgstr "" @@ -6788,16 +6793,16 @@ msgstr "" msgid "no system default destination" msgstr "" -#: scheduler/ipp.c:5499 +#: scheduler/ipp.c:5548 msgid "notify-events not specified." msgstr "" -#: scheduler/ipp.c:2024 scheduler/ipp.c:5404 +#: scheduler/ipp.c:2025 scheduler/ipp.c:5453 #, c-format msgid "notify-recipient-uri URI \"%s\" is already used." msgstr "" -#: scheduler/ipp.c:2014 scheduler/ipp.c:5394 +#: scheduler/ipp.c:2015 scheduler/ipp.c:5443 #, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." msgstr "" @@ -7279,32 +7284,32 @@ msgstr "" msgid "ppdmerge: Unable to backup %s to %s - %s" msgstr "" -#: systemv/lpstat.c:1774 +#: systemv/lpstat.c:1777 #, c-format msgid "printer %s disabled since %s -" msgstr "" -#: systemv/lpstat.c:1763 +#: systemv/lpstat.c:1766 #, c-format msgid "printer %s is idle. enabled since %s" msgstr "" -#: systemv/lpstat.c:1768 +#: systemv/lpstat.c:1771 #, c-format msgid "printer %s now printing %s-%d. enabled since %s" msgstr "" -#: systemv/lpstat.c:1897 +#: systemv/lpstat.c:1900 #, c-format msgid "printer %s/%s disabled since %s -" msgstr "" -#: systemv/lpstat.c:1883 +#: systemv/lpstat.c:1886 #, c-format msgid "printer %s/%s is idle. enabled since %s" msgstr "" -#: systemv/lpstat.c:1890 +#: systemv/lpstat.c:1893 #, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s" msgstr "" @@ -7322,11 +7327,11 @@ msgstr "" msgid "request-id uses indefinite length" msgstr "" -#: systemv/lpstat.c:2029 +#: systemv/lpstat.c:2032 msgid "scheduler is not running" msgstr "" -#: systemv/lpstat.c:2025 +#: systemv/lpstat.c:2028 msgid "scheduler is running" msgstr "" diff --git a/locale/cups.strings b/locale/cups.strings index faaa462c24..33e9891aed 100644 --- a/locale/cups.strings +++ b/locale/cups.strings @@ -189,6 +189,7 @@ " --domain regex Match domain to regular expression." = " --domain regex Match domain to regular expression."; " --exec utility [argument ...] ;\n Execute program if true." = " --exec utility [argument ...] ;\n Execute program if true."; " --false Always false." = " --false Always false."; +" --help Show help." = " --help Show help."; " --help Show this help." = " --help Show this help."; " --host regex Match hostname to regular expression." = " --host regex Match hostname to regular expression."; " --lf End lines with LF (UNIX/Linux/OS X)." = " --lf End lines with LF (UNIX/Linux/OS X)."; @@ -203,11 +204,13 @@ " --print-name Print service name if true." = " --print-name Print service name if true."; " --quiet Quietly report match via exit code." = " --quiet Quietly report match via exit code."; " --remote True if service is remote." = " --remote True if service is remote."; +" --stop-after-include-error\n Stop tests after a failed INCLUDE." = " --stop-after-include-error\n Stop tests after a failed INCLUDE."; " --true Always true." = " --true Always true."; " --txt key True if the TXT record contains the key." = " --txt key True if the TXT record contains the key."; " --txt-* regex Match TXT record key to regular expression." = " --txt-* regex Match TXT record key to regular expression."; " --uri regex Match URI to regular expression." = " --uri regex Match URI to regular expression."; " --version Show program version." = " --version Show program version."; +" --version Show version." = " --version Show version."; " -4 Connect using IPv4." = " -4 Connect using IPv4."; " -6 Connect using IPv6." = " -6 Connect using IPv6."; " -C Send requests using chunking (default)." = " -C Send requests using chunking (default)."; @@ -221,6 +224,7 @@ " -I include-dir Add include directory to search path." = " -I include-dir Add include directory to search path."; " -I {filename,filters,none,profiles}" = " -I {filename,filters,none,profiles}"; " -L Send requests using content-length." = " -L Send requests using content-length."; +" -P filename.plist Produce XML plist to a file and test report to standard output." = " -P filename.plist Produce XML plist to a file and test report to standard output."; " -P filename.ppd Set PPD file." = " -P filename.ppd Set PPD file."; " -P number[-number] Match port to number or range." = " -P number[-number] Match port to number or range."; " -R root-directory Set alternate root." = " -R root-directory Set alternate root."; @@ -233,6 +237,7 @@ " -X Produce XML plist instead of plain text." = " -X Produce XML plist instead of plain text."; " -a Browse for all services." = " -a Browse for all services."; " -a Export all printers." = " -a Export all printers."; +" -c Produce CSV output." = " -c Produce CSV output."; " -c catalog.po Load the specified message catalog." = " -c catalog.po Load the specified message catalog."; " -c cups-files.conf Set cups-files.conf file to use." = " -c cups-files.conf Set cups-files.conf file to use."; " -c cupsd.conf Set cupsd.conf file to use." = " -c cupsd.conf Set cupsd.conf file to use."; @@ -251,6 +256,7 @@ " -i seconds Repeat the last file with the given time interval." = " -i seconds Repeat the last file with the given time interval."; " -j job-id[,N] Filter file N from the specified job (default is file 1)." = " -j job-id[,N] Filter file N from the specified job (default is file 1)."; " -l List attributes." = " -l List attributes."; +" -l Produce plain text output." = " -l Produce plain text output."; " -l Run cupsd on demand." = " -l Run cupsd on demand."; " -l lang[,lang,...] Specify the output language(s) (locale)." = " -l lang[,lang,...] Specify the output language(s) (locale)."; " -m Use the ModelName value as the filename." = " -m Use the ModelName value as the filename."; @@ -602,7 +608,6 @@ "7 inches/sec." = "7 inches/sec."; "7 x 9" = "7 x 9"; "70" = "70"; -"720dpi" = "720dpi"; "75" = "75"; "8" = "8"; "8 inches/sec." = "8 inches/sec."; @@ -1008,8 +1013,6 @@ "Name OID uses indefinite length" = "Name OID uses indefinite length"; "Nested classes are not allowed." = "Nested classes are not allowed."; "Never" = "Never"; -"New Stylus Color Series" = "New Stylus Color Series"; -"New Stylus Photo Series" = "New Stylus Photo Series"; "No" = "No"; "No Content" = "No Content"; "No PPD name" = "No PPD name"; @@ -1164,8 +1167,6 @@ "Starting Banner" = "Starting Banner"; "Starting page %d." = "Starting page %d."; "Statement" = "Statement"; -"Stylus Color Series" = "Stylus Color Series"; -"Stylus Photo Series" = "Stylus Photo Series"; "Subscription #%d does not exist." = "Subscription #%d does not exist."; "Substitutions:" = "Substitutions:"; "Super A" = "Super A"; diff --git a/locale/cups_ca.po b/locale/cups_ca.po index 8e524fc35c..9c6985f289 100644 --- a/locale/cups_ca.po +++ b/locale/cups_ca.po @@ -32,7 +32,7 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 1.4.6\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2014-06-26 14:29-0400\n" +"POT-Creation-Date: 2014-08-29 22:25-0400\n" "PO-Revision-Date: 2012-09-29 11:21+0200\n" "Last-Translator: Àngel Mompó \n" "Language-Team: Catalan \n" @@ -973,6 +973,9 @@ msgstr "" msgid " --false Always false." msgstr "" +msgid " --help Show help." +msgstr "" + msgid " --help Show this help." msgstr "" @@ -1015,6 +1018,11 @@ msgstr "" msgid " --remote True if service is remote." msgstr "" +msgid "" +" --stop-after-include-error\n" +" Stop tests after a failed INCLUDE." +msgstr "" + msgid " --true Always true." msgstr "" @@ -1030,6 +1038,9 @@ msgstr "" msgid " --version Show program version." msgstr "" +msgid " --version Show version." +msgstr "" + msgid " -4 Connect using IPv4." msgstr " -4 Connecta fent servir IPv4." @@ -1075,6 +1086,11 @@ msgid " -L Send requests using content-length." msgstr "" " -L Envia les peticions fent servir content-length." +msgid "" +" -P filename.plist Produce XML plist to a file and test report to " +"standard output." +msgstr "" + msgid " -P filename.ppd Set PPD file." msgstr " -P nomfitxer.ppd Estableix el fitxer PPD." @@ -1118,6 +1134,9 @@ msgstr "" msgid " -a Export all printers." msgstr " -a Exporta totes les impressores." +msgid " -c Produce CSV output." +msgstr "" + msgid " -c catalog.po Load the specified message catalog." msgstr " -c catàleg.po Carrega el catàleg de missatges indicat." @@ -1183,6 +1202,9 @@ msgstr "" msgid " -l List attributes." msgstr "" +msgid " -l Produce plain text output." +msgstr "" + msgid " -l Run cupsd on demand." msgstr "" @@ -2422,9 +2444,6 @@ msgstr "7 x 9" msgid "70" msgstr "70" -msgid "720dpi" -msgstr "720ppp" - msgid "75" msgstr "75" @@ -3734,12 +3753,6 @@ msgstr "No es permeten les classes imbricades." msgid "Never" msgstr "Mai" -msgid "New Stylus Color Series" -msgstr "Sèrie New Stylus Color" - -msgid "New Stylus Photo Series" -msgstr "Sèrie New Stylus Photo" - msgid "No" msgstr "No" @@ -4217,12 +4230,6 @@ msgstr "S'està començant la pàgina %d." msgid "Statement" msgstr "Declaració" -msgid "Stylus Color Series" -msgstr "Sèrie Stylus Color" - -msgid "Stylus Photo Series" -msgstr "Sèrie Stylus Photo" - #, c-format msgid "Subscription #%d does not exist." msgstr "La subscripció #%d no existeix." @@ -6080,6 +6087,9 @@ msgstr "La variable-bindings fa servir una longitud indefinida" #~ msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" #~ msgstr "Disc de 3.5 - 2 1/8 x 2 3/4\"" +#~ msgid "720dpi" +#~ msgstr "720ppp" + #~ msgid "Address - 1 1/8 x 3 1/2\"" #~ msgstr "Adreça - 1 1/8 x 3 1/2\"" @@ -6117,6 +6127,12 @@ msgstr "La variable-bindings fa servir una longitud indefinida" #~ msgid "Large Address - 1 4/10 x 3 1/2\"" #~ msgstr "Adreça gran - 1 4/10 x 3 1/2\"" +#~ msgid "New Stylus Color Series" +#~ msgstr "Sèrie New Stylus Color" + +#~ msgid "New Stylus Photo Series" +#~ msgstr "Sèrie New Stylus Photo" + #~ msgid "Output for printer %s is sent to %s" #~ msgstr "La sortida de la impressora %s s'envia a %s" @@ -6181,6 +6197,12 @@ msgstr "La variable-bindings fa servir una longitud indefinida" #~ msgid "Shipping Address - 2 5/16 x 4\"" #~ msgstr "Adreça de lliurament - 2 5/16 x 4\"" +#~ msgid "Stylus Color Series" +#~ msgstr "Sèrie Stylus Color" + +#~ msgid "Stylus Photo Series" +#~ msgstr "Sèrie Stylus Photo" + #~ msgid "The output bin is almost full." #~ msgstr "La safata de sortida és gairebé plena." diff --git a/locale/cups_cs.po b/locale/cups_cs.po index d72c190473..307c15fa84 100644 --- a/locale/cups_cs.po +++ b/locale/cups_cs.po @@ -29,7 +29,7 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 1.6\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2014-06-26 14:29-0400\n" +"POT-Creation-Date: 2014-08-29 22:25-0400\n" "PO-Revision-Date: 2012-09-14 10:26+0100\n" "Last-Translator: Jan Bartos \n" "Language-Team: Czech\n" @@ -826,6 +826,9 @@ msgstr "" msgid " --false Always false." msgstr "" +msgid " --help Show help." +msgstr "" + msgid " --help Show this help." msgstr "" @@ -868,6 +871,11 @@ msgstr "" msgid " --remote True if service is remote." msgstr "" +msgid "" +" --stop-after-include-error\n" +" Stop tests after a failed INCLUDE." +msgstr "" + msgid " --true Always true." msgstr "" @@ -883,6 +891,9 @@ msgstr "" msgid " --version Show program version." msgstr "" +msgid " --version Show version." +msgstr "" + msgid " -4 Connect using IPv4." msgstr "" @@ -923,6 +934,11 @@ msgstr "" msgid " -L Send requests using content-length." msgstr "" +msgid "" +" -P filename.plist Produce XML plist to a file and test report to " +"standard output." +msgstr "" + msgid " -P filename.ppd Set PPD file." msgstr "" @@ -961,6 +977,9 @@ msgstr "" msgid " -a Export all printers." msgstr "" +msgid " -c Produce CSV output." +msgstr "" + msgid " -c catalog.po Load the specified message catalog." msgstr "" @@ -1018,6 +1037,9 @@ msgstr "" msgid " -l List attributes." msgstr "" +msgid " -l Produce plain text output." +msgstr "" + msgid " -l Run cupsd on demand." msgstr "" @@ -2234,9 +2256,6 @@ msgstr "" msgid "70" msgstr "70" -msgid "720dpi" -msgstr "720 dpi" - msgid "75" msgstr "75" @@ -3524,12 +3543,6 @@ msgstr "" msgid "Never" msgstr "Nikdy" -msgid "New Stylus Color Series" -msgstr "New Stylus Color Series" - -msgid "New Stylus Photo Series" -msgstr "New Stylus Photo Series" - msgid "No" msgstr "Ne" @@ -4003,12 +4016,6 @@ msgstr "" msgid "Statement" msgstr "Prohlášení" -msgid "Stylus Color Series" -msgstr "Stylus Color Series" - -msgid "Stylus Photo Series" -msgstr "Stylus Photo Series" - #, c-format msgid "Subscription #%d does not exist." msgstr "" @@ -5675,6 +5682,9 @@ msgstr "nepojmenovaný" msgid "variable-bindings uses indefinite length" msgstr "\"variable-bindings\" má neomezenou délku" +#~ msgid "720dpi" +#~ msgstr "720 dpi" + #~ msgid "Enter old password:" #~ msgstr "Zadejte původní heslo:" @@ -5684,5 +5694,17 @@ msgstr "\"variable-bindings\" má neomezenou délku" #~ msgid "Enter password:" #~ msgstr "Zadejte heslo:" +#~ msgid "New Stylus Color Series" +#~ msgstr "New Stylus Color Series" + +#~ msgid "New Stylus Photo Series" +#~ msgstr "New Stylus Photo Series" + #~ msgid "Purge Jobs" #~ msgstr "Výmaz úloh" + +#~ msgid "Stylus Color Series" +#~ msgstr "Stylus Color Series" + +#~ msgid "Stylus Photo Series" +#~ msgstr "Stylus Photo Series" diff --git a/locale/cups_es.po b/locale/cups_es.po index 461553c9ab..47885aec10 100644 --- a/locale/cups_es.po +++ b/locale/cups_es.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 1.6\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2014-06-26 14:29-0400\n" +"POT-Creation-Date: 2014-08-29 22:25-0400\n" "PO-Revision-Date: 2012-07-01 20:21+0100\n" "Last-Translator: Juan Pablo González Riopedre \n" "Language-Team: Spanish\n" @@ -965,6 +965,9 @@ msgstr "" msgid " --false Always false." msgstr "" +msgid " --help Show help." +msgstr "" + msgid " --help Show this help." msgstr "" @@ -1007,6 +1010,11 @@ msgstr "" msgid " --remote True if service is remote." msgstr "" +msgid "" +" --stop-after-include-error\n" +" Stop tests after a failed INCLUDE." +msgstr "" + msgid " --true Always true." msgstr "" @@ -1022,6 +1030,9 @@ msgstr "" msgid " --version Show program version." msgstr "" +msgid " --version Show version." +msgstr "" + msgid " -4 Connect using IPv4." msgstr " -4 Conectar usando IPv4." @@ -1067,6 +1078,11 @@ msgstr " -I {filename,filters,none,profiles}" msgid " -L Send requests using content-length." msgstr " -L Envía peticiones usando content-length." +msgid "" +" -P filename.plist Produce XML plist to a file and test report to " +"standard output." +msgstr "" + msgid " -P filename.ppd Set PPD file." msgstr " -P nombre_archivo.ppd Establece archivo PPD." @@ -1110,6 +1126,9 @@ msgstr "" msgid " -a Export all printers." msgstr " -a Exporta todas las impresoras." +msgid " -c Produce CSV output." +msgstr "" + msgid " -c catalog.po Load the specified message catalog." msgstr " -c catálogo.po Carga el catálogo de mensajes especificado." @@ -1174,6 +1193,9 @@ msgstr "" msgid " -l List attributes." msgstr "" +msgid " -l Produce plain text output." +msgstr "" + msgid " -l Run cupsd on demand." msgstr "" @@ -2411,9 +2433,6 @@ msgstr "7 x 9" msgid "70" msgstr "70" -msgid "720dpi" -msgstr "720ppp" - msgid "75" msgstr "75" @@ -3721,12 +3740,6 @@ msgstr "No se permiten clases anidadas." msgid "Never" msgstr "Nunca" -msgid "New Stylus Color Series" -msgstr "Nueva Stylus Color Series" - -msgid "New Stylus Photo Series" -msgstr "Nueva Stylus Photo Series" - msgid "No" msgstr "No" @@ -4203,12 +4216,6 @@ msgstr "Iniciando página %d." msgid "Statement" msgstr "Declaración" -msgid "Stylus Color Series" -msgstr "Stylus Color Series" - -msgid "Stylus Photo Series" -msgstr "Stylus Photo Series" - #, c-format msgid "Subscription #%d does not exist." msgstr "Subscripción #%d no existe." @@ -5993,6 +6000,9 @@ msgstr "variable-bindings usa una longitud indefinida" #~ msgid "%s: Error - expected destination after \"-b\" option." #~ msgstr "%s: Error - se esperaba un destino tras la opción \"-b\"." +#~ msgid "720dpi" +#~ msgstr "720ppp" + #~ msgid "Bad printer URI." #~ msgstr "URI de impresora incorrecto." @@ -6005,6 +6015,12 @@ msgstr "variable-bindings usa una longitud indefinida" #~ msgid "Enter password:" #~ msgstr "Introduzca la contraseña:" +#~ msgid "New Stylus Color Series" +#~ msgstr "Nueva Stylus Color Series" + +#~ msgid "New Stylus Photo Series" +#~ msgstr "Nueva Stylus Photo Series" + #~ msgid "Output for printer %s is sent to %s" #~ msgstr "La salida de la impresora %s se ha enviado a %s" @@ -6040,6 +6056,12 @@ msgstr "variable-bindings usa una longitud indefinida" #~ msgstr "" #~ "Rango Propiet. Pri Trabajo Archivos Tamaño total" +#~ msgid "Stylus Color Series" +#~ msgstr "Stylus Color Series" + +#~ msgid "Stylus Photo Series" +#~ msgstr "Stylus Photo Series" + #~ msgid "The output bin is almost full." #~ msgstr "Recipiente de salida casi lleno" diff --git a/locale/cups_fr.po b/locale/cups_fr.po index 402e54a396..98433845bb 100644 --- a/locale/cups_fr.po +++ b/locale/cups_fr.po @@ -29,7 +29,7 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 1.6\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2014-06-26 14:29-0400\n" +"POT-Creation-Date: 2014-08-29 22:25-0400\n" "PO-Revision-Date: 2012-12-12 11:12+0100\n" "Last-Translator: denis meramdjougoma \n" "Language-Team: LANGUAGE \n" @@ -826,6 +826,9 @@ msgstr "" msgid " --false Always false." msgstr "" +msgid " --help Show help." +msgstr "" + msgid " --help Show this help." msgstr "" @@ -868,6 +871,11 @@ msgstr "" msgid " --remote True if service is remote." msgstr "" +msgid "" +" --stop-after-include-error\n" +" Stop tests after a failed INCLUDE." +msgstr "" + msgid " --true Always true." msgstr "" @@ -883,6 +891,9 @@ msgstr "" msgid " --version Show program version." msgstr "" +msgid " --version Show version." +msgstr "" + msgid " -4 Connect using IPv4." msgstr "" @@ -923,6 +934,11 @@ msgstr "" msgid " -L Send requests using content-length." msgstr "" +msgid "" +" -P filename.plist Produce XML plist to a file and test report to " +"standard output." +msgstr "" + msgid " -P filename.ppd Set PPD file." msgstr "" @@ -961,6 +977,9 @@ msgstr "" msgid " -a Export all printers." msgstr "" +msgid " -c Produce CSV output." +msgstr "" + msgid " -c catalog.po Load the specified message catalog." msgstr "" @@ -1018,6 +1037,9 @@ msgstr "" msgid " -l List attributes." msgstr "" +msgid " -l Produce plain text output." +msgstr "" + msgid " -l Run cupsd on demand." msgstr "" @@ -2234,9 +2256,6 @@ msgstr "" msgid "70" msgstr "70" -msgid "720dpi" -msgstr "720 ppp" - msgid "75" msgstr "75" @@ -3521,12 +3540,6 @@ msgstr "" msgid "Never" msgstr "Jamais" -msgid "New Stylus Color Series" -msgstr "Nouvelles série Stylus Color" - -msgid "New Stylus Photo Series" -msgstr "Nouvelles série Stylus Photo" - msgid "No" msgstr "Non" @@ -4000,12 +4013,6 @@ msgstr "" msgid "Statement" msgstr "Déclaration" -msgid "Stylus Color Series" -msgstr "Série Stylus Color" - -msgid "Stylus Photo Series" -msgstr "Série Stylus Photo" - #, c-format msgid "Subscription #%d does not exist." msgstr "" @@ -5677,6 +5684,9 @@ msgstr "sans titre" msgid "variable-bindings uses indefinite length" msgstr "" +#~ msgid "720dpi" +#~ msgstr "720 ppp" + #~ msgid "Enter old password:" #~ msgstr "Ancien mot de passe :" @@ -5686,5 +5696,17 @@ msgstr "" #~ msgid "Enter password:" #~ msgstr "Entrez le nouveau mot de passe :" +#~ msgid "New Stylus Color Series" +#~ msgstr "Nouvelles série Stylus Color" + +#~ msgid "New Stylus Photo Series" +#~ msgstr "Nouvelles série Stylus Photo" + #~ msgid "Purge Jobs" #~ msgstr "Purger les tâches" + +#~ msgid "Stylus Color Series" +#~ msgstr "Série Stylus Color" + +#~ msgid "Stylus Photo Series" +#~ msgstr "Série Stylus Photo" diff --git a/locale/cups_it.po b/locale/cups_it.po index 30b1027723..ad81332396 100644 --- a/locale/cups_it.po +++ b/locale/cups_it.po @@ -29,7 +29,7 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 1.6\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2014-06-26 14:29-0400\n" +"POT-Creation-Date: 2014-08-29 22:25-0400\n" "PO-Revision-Date: 2013-07-14 12:00+0200\n" "Last-Translator: Giovanni Scafora \n" "Language-Team: Arch Linux Italian Team \n" @@ -974,6 +974,9 @@ msgstr "" msgid " --false Always false." msgstr " --false Sempre falso." +msgid " --help Show help." +msgstr "" + msgid " --help Show this help." msgstr " --help Mostra questo aiuto." @@ -1026,6 +1029,11 @@ msgstr "" msgid " --remote True if service is remote." msgstr " --remote Vero se il servizio è remoto." +msgid "" +" --stop-after-include-error\n" +" Stop tests after a failed INCLUDE." +msgstr "" + msgid " --true Always true." msgstr " --true Sempre vero." @@ -1044,6 +1052,9 @@ msgstr "" msgid " --version Show program version." msgstr " --version Mostra la versione del programma." +msgid " --version Show version." +msgstr "" + msgid " -4 Connect using IPv4." msgstr " -4 Connetti utilizzando IPv4." @@ -1089,6 +1100,11 @@ msgstr " -I {file,filtri,nessuno,profili}" msgid " -L Send requests using content-length." msgstr " -L Invia richieste utilizzando content-length." +msgid "" +" -P filename.plist Produce XML plist to a file and test report to " +"standard output." +msgstr "" + msgid " -P filename.ppd Set PPD file." msgstr " -P filename.ppd Imposta il file PPD." @@ -1134,6 +1150,9 @@ msgstr " -a Mostra tutti i servizi." msgid " -a Export all printers." msgstr " -a Esporta tutte le stampanti." +msgid " -c Produce CSV output." +msgstr "" + msgid " -c catalog.po Load the specified message catalog." msgstr "" " -c catalog.po Carica il catalogo del messaggio specificato." @@ -1202,6 +1221,9 @@ msgstr "" msgid " -l List attributes." msgstr " -l Elenca gli attributi." +msgid " -l Produce plain text output." +msgstr "" + msgid " -l Run cupsd on demand." msgstr "" @@ -2500,9 +2522,6 @@ msgstr "7 x 9" msgid "70" msgstr "70" -msgid "720dpi" -msgstr "720dpi" - msgid "75" msgstr "75" @@ -3808,12 +3827,6 @@ msgstr "Le classi nidificate non sono consentite." msgid "Never" msgstr "Mai" -msgid "New Stylus Color Series" -msgstr "Nuova Stylus Color Series" - -msgid "New Stylus Photo Series" -msgstr "Nuova Stylus Photo Series" - msgid "No" msgstr "No" @@ -4291,12 +4304,6 @@ msgstr "Pagina iniziale %d." msgid "Statement" msgstr "Rapporto" -msgid "Stylus Color Series" -msgstr "Stylus Color Series" - -msgid "Stylus Photo Series" -msgstr "Stylus Photo Series" - #, c-format msgid "Subscription #%d does not exist." msgstr "La sottoscrizione #%d non esiste." @@ -6066,6 +6073,9 @@ msgstr "variable-bindings utilizza una lunghezza indefinita" #~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" #~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte" +#~ msgid "720dpi" +#~ msgstr "720dpi" + #~ msgid "Bad printer URI." #~ msgstr "L'URI della stampante non è valido." @@ -6078,6 +6088,12 @@ msgstr "variable-bindings utilizza una lunghezza indefinita" #~ msgid "Enter password:" #~ msgstr "Digitare la password:" +#~ msgid "New Stylus Color Series" +#~ msgstr "Nuova Stylus Color Series" + +#~ msgid "New Stylus Photo Series" +#~ msgstr "Nuova Stylus Photo Series" + #~ msgid "Output for printer %s is sent to %s" #~ msgstr "L'output della stampante %s è stato inviato a %s" @@ -6104,6 +6120,12 @@ msgstr "variable-bindings utilizza una lunghezza indefinita" #~ msgstr "" #~ "Rank Owner Pri Job Files Total Size" +#~ msgid "Stylus Color Series" +#~ msgstr "Stylus Color Series" + +#~ msgid "Stylus Photo Series" +#~ msgstr "Stylus Photo Series" + #~ msgid "The output bin is almost full." #~ msgstr "Il raccoglitore di uscita è quasi pieno." diff --git a/locale/cups_ja.po b/locale/cups_ja.po index 9f3dd4f8e2..d4b9f1b48a 100644 --- a/locale/cups_ja.po +++ b/locale/cups_ja.po @@ -28,7 +28,7 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 1.7\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2014-06-26 14:29-0400\n" +"POT-Creation-Date: 2014-08-29 22:25-0400\n" "PO-Revision-Date: 2013-08-19 11:51+0900\n" "Last-Translator: OPFC TRANSCUPS \n" "Language-Team: OPFC TRANSCUPS \n" @@ -972,6 +972,9 @@ msgstr "" msgid " --false Always false." msgstr " --false 常に失敗。" +msgid " --help Show help." +msgstr "" + msgid " --help Show this help." msgstr " --help このヘルプを表示する。" @@ -1016,6 +1019,11 @@ msgstr "" msgid " --remote True if service is remote." msgstr " --remote サービスがリモートなら真。" +msgid "" +" --stop-after-include-error\n" +" Stop tests after a failed INCLUDE." +msgstr "" + msgid " --true Always true." msgstr " --true 常に真。" @@ -1032,6 +1040,9 @@ msgstr " --uri <正規表現> URI が正規表現とマッチするか msgid " --version Show program version." msgstr " --version プログラムのバージョンを表示。" +msgid " --version Show version." +msgstr "" + msgid " -4 Connect using IPv4." msgstr " -4 IPv4 で接続する。" @@ -1078,6 +1089,11 @@ msgstr " -I {filename,filters,none,profiles}" msgid " -L Send requests using content-length." msgstr " -L content-length を用いてリクエストを送る。" +msgid "" +" -P filename.plist Produce XML plist to a file and test report to " +"standard output." +msgstr "" + msgid " -P filename.ppd Set PPD file." msgstr " -P filename.ppd PPD ファイルを指定する。" @@ -1119,6 +1135,9 @@ msgstr " -a すべてのサービスをブラウズする msgid " -a Export all printers." msgstr " -a すべてのプリンターをエクスポートする。" +msgid " -c Produce CSV output." +msgstr "" + msgid " -c catalog.po Load the specified message catalog." msgstr " -c catalog.po 指定したメッセージカタログをロードする。" @@ -1183,6 +1202,9 @@ msgstr "" msgid " -l List attributes." msgstr " -l 属性の一覧を表示する。" +msgid " -l Produce plain text output." +msgstr "" + msgid " -l Run cupsd on demand." msgstr "" @@ -2454,9 +2476,6 @@ msgstr "7 x 9 インチ" msgid "70" msgstr "70" -msgid "720dpi" -msgstr "720dpi" - msgid "75" msgstr "75" @@ -3766,12 +3785,6 @@ msgstr "入れ子になったクラスは許可されていません。" msgid "Never" msgstr "Never" -msgid "New Stylus Color Series" -msgstr "New Stylus Color シリーズ" - -msgid "New Stylus Photo Series" -msgstr "New Stylus Photo シリーズ" - msgid "No" msgstr "いいえ" @@ -4247,12 +4260,6 @@ msgstr "ページ %d を開始しています。" msgid "Statement" msgstr "記述" -msgid "Stylus Color Series" -msgstr "Stylus Color シリーズ" - -msgid "Stylus Photo Series" -msgstr "Stylus Photo シリーズ" - #, c-format msgid "Subscription #%d does not exist." msgstr "サブスクリプション番号 %d は存在しません。" @@ -6051,6 +6058,9 @@ msgstr "variable-bindings の長さが不定" #~ msgid "%s: Error - expected destination after \"-b\" option." #~ msgstr "%s: エラー - \"-b\" オプションのあとに宛先が必要です。" +#~ msgid "720dpi" +#~ msgstr "720dpi" + #~ msgid "Bad printer URI." #~ msgstr "不正なプリンター URI です。" @@ -6063,6 +6073,12 @@ msgstr "variable-bindings の長さが不定" #~ msgid "Enter password:" #~ msgstr "パスワードを入力:" +#~ msgid "New Stylus Color Series" +#~ msgstr "New Stylus Color シリーズ" + +#~ msgid "New Stylus Photo Series" +#~ msgstr "New Stylus Photo シリーズ" + #~ msgid "Output for printer %s is sent to %s" #~ msgstr "プリンター %s の出力は %s に送られます" @@ -6096,6 +6112,12 @@ msgstr "variable-bindings の長さが不定" #~ msgstr "" #~ "ランク 所有者 優先 ジョブ ファイル 合計サイズ" +#~ msgid "Stylus Color Series" +#~ msgstr "Stylus Color シリーズ" + +#~ msgid "Stylus Photo Series" +#~ msgstr "Stylus Photo シリーズ" + #~ msgid "The output bin is almost full." #~ msgstr "排紙トレイがほとんど一杯です。" diff --git a/locale/cups_ru.po b/locale/cups_ru.po index 425dbdf49c..afd0a8fff0 100644 --- a/locale/cups_ru.po +++ b/locale/cups_ru.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: CUPS 1.4\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2014-06-26 14:29-0400\n" +"POT-Creation-Date: 2014-08-29 22:25-0400\n" "PO-Revision-Date: 2009-02-16 12:00-0800\n" "Last-Translator: Apple Inc.\n" "Language-Team: Apple Inc.\n" @@ -799,6 +799,9 @@ msgstr "" msgid " --false Always false." msgstr "" +msgid " --help Show help." +msgstr "" + msgid " --help Show this help." msgstr "" @@ -841,6 +844,11 @@ msgstr "" msgid " --remote True if service is remote." msgstr "" +msgid "" +" --stop-after-include-error\n" +" Stop tests after a failed INCLUDE." +msgstr "" + msgid " --true Always true." msgstr "" @@ -856,6 +864,9 @@ msgstr "" msgid " --version Show program version." msgstr "" +msgid " --version Show version." +msgstr "" + msgid " -4 Connect using IPv4." msgstr "" @@ -896,6 +907,11 @@ msgstr "" msgid " -L Send requests using content-length." msgstr "" +msgid "" +" -P filename.plist Produce XML plist to a file and test report to " +"standard output." +msgstr "" + msgid " -P filename.ppd Set PPD file." msgstr "" @@ -934,6 +950,9 @@ msgstr "" msgid " -a Export all printers." msgstr "" +msgid " -c Produce CSV output." +msgstr "" + msgid " -c catalog.po Load the specified message catalog." msgstr "" @@ -991,6 +1010,9 @@ msgstr "" msgid " -l List attributes." msgstr "" +msgid " -l Produce plain text output." +msgstr "" + msgid " -l Run cupsd on demand." msgstr "" @@ -2207,9 +2229,6 @@ msgstr "" msgid "70" msgstr "70" -msgid "720dpi" -msgstr "720dpi" - msgid "75" msgstr "75" @@ -3497,12 +3516,6 @@ msgstr "" msgid "Never" msgstr "Никогда" -msgid "New Stylus Color Series" -msgstr "Серия Stylus Color нового поколения" - -msgid "New Stylus Photo Series" -msgstr "Серия Stylus Photo нового поколения" - msgid "No" msgstr "Нет" @@ -3976,12 +3989,6 @@ msgstr "" msgid "Statement" msgstr "Оператор" -msgid "Stylus Color Series" -msgstr "Серия Stylus Color" - -msgid "Stylus Photo Series" -msgstr "Серия Stylus Photo" - #, c-format msgid "Subscription #%d does not exist." msgstr "" @@ -7276,6 +7283,9 @@ msgstr "Для variable-bindings длина не установлена" #~ msgid "7 x 9\"" #~ msgstr "7 x 9\"" +#~ msgid "720dpi" +#~ msgstr "720dpi" + #~ msgid "8 x 10\"" #~ msgstr "8 x 10\"" @@ -8562,6 +8572,12 @@ msgstr "Для variable-bindings длина не установлена" #~ msgid "Nested classes are not allowed" #~ msgstr "Вложенные группы не допускаются" +#~ msgid "New Stylus Color Series" +#~ msgstr "Серия Stylus Color нового поколения" + +#~ msgid "New Stylus Photo Series" +#~ msgstr "Серия Stylus Photo нового поколения" + #~ msgid "No PPD name!" #~ msgstr "Нет имени PPD!" @@ -8738,6 +8754,12 @@ msgstr "Для variable-bindings длина не установлена" #~ msgid "Shipping Address - 2 5/16 x 4\"" #~ msgstr "Адрес доставки - 2 5/16 x 4\"" +#~ msgid "Stylus Color Series" +#~ msgstr "Серия Stylus Color" + +#~ msgid "Stylus Photo Series" +#~ msgstr "Серия Stylus Photo" + #~ msgid "Tabloid (Oversize)" #~ msgstr "Tabloid (расширенный)" diff --git a/man/ipptool.man b/man/ipptool.man index f88a0c1ad5..0b441dd4ca 100644 --- a/man/ipptool.man +++ b/man/ipptool.man @@ -1,5 +1,5 @@ .\" -.\" "$Id: ipptool.man 11880 2014-05-16 06:14:11Z msweet $" +.\" "$Id: ipptool.man 12140 2014-08-30 01:51:22Z msweet $" .\" .\" ipptool man page for CUPS. .\" @@ -11,7 +11,7 @@ .\" which should have been included with this file. If this file is .\" file is missing or damaged, see the license at "http://www.cups.org/". .\" -.TH ipptool 1 "CUPS" "15 May 2014" "Apple Inc." +.TH ipptool 1 "CUPS" "29 August 2014" "Apple Inc." .SH NAME ipptool \- perform internet printing protocol requests .SH SYNOPSIS @@ -76,9 +76,12 @@ ipptool \- perform internet printing protocol requests .B ipptool sends IPP requests to the specified .I printer-uri -and tests and/or displays the results. Each named +and tests and/or displays the results. +Each named .I testfile -defines one or more requests, including the expected response status, attributes, and values. Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. The +defines one or more requests, including the expected response status, attributes, and values. +Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. +The .I testfile format is described in .BR ipptoolfile (5). @@ -112,7 +115,8 @@ Specifies that must connect to the printer or server using IPv6. .TP 5 .B \-C -Specifies that requests should be sent using the HTTP/1.1 "Transfer\-Encoding: chunked" header, which is required for conformance by all versions of IPP. The default is to use "Transfer\-Encoding: chunked" for requests with attached files and "Content\-Length:" for requests without attached files. +Specifies that requests should be sent using the HTTP/1.1 "Transfer\-Encoding: chunked" header, which is required for conformance by all versions of IPP. +The default is to use "Transfer\-Encoding: chunked" for requests with attached files and "Content\-Length:" for requests without attached files. .TP 5 .B \-E Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header. @@ -123,10 +127,12 @@ Specifies that will continue past errors. .TP 5 .B \-L -Specifies that requests should be sent using the HTTP/1.0 "Content\-Length:" header, which is required for conformance by all versions of IPP. The default is to use "Transfer\-Encoding: chunked" for requests with attached files and "Content\-Length:" for requests without attached files. +Specifies that requests should be sent using the HTTP/1.0 "Content\-Length:" header, which is required for conformance by all versions of IPP. +The default is to use "Transfer\-Encoding: chunked" for requests with attached files and "Content\-Length:" for requests without attached files. .TP 5 .BI \-P \ filename.plist -Specifies that the test results should be written to the named XML (Apple plist) file in addition to the plain text report. This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options. +Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (\fB\-t\fR). +This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options. .TP 5 .B \-S Forces (dedicated) TLS encryption when connecting to the server. @@ -138,7 +144,8 @@ Specifies a timeout for IPP requests in seconds. Specifies the default IPP version to use: 1.0, 1.1, 2.0, 2.1, or 2.2. If not specified, version 1.1 is used. .TP 5 .B \-X -Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options. +Specifies that XML (Apple plist) output is desired instead of the plain text report. +This option is incompatible with the \fB\-i\fR (interval) and \fB\-n\fR (repeat\-count) options. .TP 5 .B \-c Specifies that CSV (comma\-separated values) output is desired instead of the plain text output. @@ -152,7 +159,8 @@ Defines the default request filename for tests. .BI \-i \ seconds Specifies that the (last) .I testfile -should be repeated at the specified interval. This option is incompatible with the \fB\-X\fR (XML plist output) option. +should be repeated at the specified interval. +This option is incompatible with the \fB\-X\fR (XML plist output) option. .TP 5 .B \-l Specifies that plain text output is desired. @@ -160,13 +168,18 @@ Specifies that plain text output is desired. .BI \-n \ repeat\-count Specifies that the (last) .I testfile -should be repeated the specified number of times. This option is incompatible with the \fI\-X\fR (XML plist output) option. +should be repeated the specified number of times. +This option is incompatible with the \fI\-X\fR (XML plist output) option. +.TP 5 +.B \-q +Be quiet and produce no output. .TP 5 .B \-t Specifies that CUPS test report output is desired instead of the plain text output. .TP 5 .B \-v -Specifies that all request and response attributes should be output in CUPS test mode (\fB\-t\fR). This is the default for XML output. +Specifies that all request and response attributes should be output in CUPS test mode (\fB\-t\fR). +This is the default for XML output. .SH EXIT STATUS The .B ipptool @@ -231,5 +244,5 @@ RFC 2911 (http://tools.ietf.org/html/rfc2911), .SH COPYRIGHT Copyright \[co] 2007-2014 by Apple Inc. .\" -.\" End of "$Id: ipptool.man 11880 2014-05-16 06:14:11Z msweet $". +.\" End of "$Id: ipptool.man 12140 2014-08-30 01:51:22Z msweet $". .\" diff --git a/notifier/rss.c b/notifier/rss.c index 65e577f0b5..7f518eca3b 100644 --- a/notifier/rss.c +++ b/notifier/rss.c @@ -1,27 +1,16 @@ /* - * "$Id: rss.c 10996 2013-05-29 11:51:34Z msweet $" + * "$Id: rss.c 12128 2014-08-28 19:23:23Z msweet $" * - * RSS notifier for CUPS. + * RSS notifier for CUPS. * - * Copyright 2007-2012 by Apple Inc. - * Copyright 2007 by Easy Software Products. + * Copyright 2007-2014 by Apple Inc. + * Copyright 2007 by Easy Software Products. * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * main() - Main entry for the test notifier. - * compare_rss() - Compare two messages. - * delete_message() - Free all memory used by a message. - * load_rss() - Load an existing RSS feed file. - * new_message() - Create a new RSS message. - * password_cb() - Return the cached password. - * save_rss() - Save messages to a RSS file. - * xml_escape() - Copy a string, escaping &, <, and > as needed. + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". */ /* @@ -29,6 +18,7 @@ */ #include +#include #include #include #include @@ -629,6 +619,8 @@ save_rss(cups_array_t *rss, /* I - RSS messages */ return (0); } + fchmod(fileno(fp), 0644); + fputs("\n", fp); fputs("\n", fp); fputs(" \n", fp); @@ -737,5 +729,5 @@ xml_escape(const char *s) /* I - String to escape */ /* - * End of "$Id: rss.c 10996 2013-05-29 11:51:34Z msweet $". + * End of "$Id: rss.c 12128 2014-08-28 19:23:23Z msweet $". */ diff --git a/packaging/cups.spec b/packaging/cups.spec index 8ea836b328..ca126f111b 100644 --- a/packaging/cups.spec +++ b/packaging/cups.spec @@ -44,12 +44,12 @@ Summary: CUPS Name: cups -Version: 2.0b1 +Version: 2.0rc1 Release: 1 Epoch: 1 License: GPL Group: System Environment/Daemons -Source: http://www.cups.org/software/2.0b1/cups-2.0b1-source.tar.bz2 +Source: http://www.cups.org/software/2.0rc1/cups-2.0rc1-source.tar.bz2 Url: http://www.cups.org Packager: Anonymous Vendor: Apple Inc. diff --git a/ppdc/sample.drv b/ppdc/sample.drv index 1b6bbceb25..4935feb831 100644 --- a/ppdc/sample.drv +++ b/ppdc/sample.drv @@ -1,5 +1,5 @@ // -// "$Id: sample.drv 11800 2014-04-08 19:53:57Z msweet $" +// "$Id: sample.drv 12105 2014-08-20 15:27:43Z msweet $" // // Driver info file for CUPS-supplied PPDs. // @@ -217,90 +217,6 @@ Version "2.0" *Resolution k 1 8 0 0 120x72dpi Resolution k 1 8 0 0 240x72dpi } - - // Epson Stylus Color Series - { - ModelName "Stylus Color Series" - Attribute NickName "" "Epson Stylus Color Series" - PCFileName "stcolor.ppd" - ModelNumber $EPSON_COLOR - ColorDevice Yes - - HWMargins 8.6 39.6 8.6 25.51 - *MediaSize Letter - MediaSize Legal - MediaSize A4 - - Resolution - 1 0 0 0 180dpi - *Resolution - 1 0 0 0 360dpi - Resolution - 1 0 0 0 720dpi - - *ColorModel CMYK cmyk banded 1 - ColorModel Gray/Grayscale k chunky 1 - } - - // Epson New Stylus Color Series - { - ModelName "New Stylus Color Series" - Attribute NickName "" "Epson New Stylus Color Series" - PCFileName "stcolor2.ppd" - ModelNumber $EPSON_ICOLOR - ColorDevice Yes - - HWMargins 8.6 39.6 8.6 25.51 - *MediaSize Letter - MediaSize Legal - MediaSize A4 - - Resolution - 1 0 0 0 180dpi - *Resolution - 1 0 0 0 360dpi - Resolution - 1 0 0 0 720dpi - - *ColorModel CMYK cmyk banded 1 - ColorModel Gray/Grayscale k chunky 1 - } - - // Epson Stylus Color Series - { - ModelName "Stylus Photo Series" - Attribute NickName "" "Epson Stylus Photo Series" - PCFileName "stphoto.ppd" - ModelNumber $EPSON_PHOTO - ColorDevice Yes - - HWMargins 8.6 39.6 8.6 25.51 - *MediaSize Letter - MediaSize Legal - MediaSize A4 - - Resolution - 1 0 0 0 180dpi - *Resolution - 1 0 0 0 360dpi - Resolution - 1 0 0 0 720dpi - - *ColorModel CMYK cmykcm banded 1 - ColorModel Gray/Grayscale k chunky 1 - } - - // Epson New Stylus Color Series - { - ModelName "New Stylus Photo Series" - Attribute NickName "" "Epson New Stylus Photo Series" - PCFileName "stphoto2.ppd" - ModelNumber $EPSON_IPHOTO - ColorDevice Yes - - HWMargins 8.6 39.6 8.6 25.51 - *MediaSize Letter - MediaSize Legal - MediaSize A4 - - Resolution - 1 0 0 0 180dpi - *Resolution - 1 0 0 0 360dpi - Resolution - 1 0 0 0 720dpi - - *ColorModel CMYK cmykcm banded 1 - ColorModel Gray/Grayscale k chunky 1 - } } // Generic drivers @@ -1252,5 +1168,5 @@ Version "2.0" } // -// End of "$Id: sample.drv 11800 2014-04-08 19:53:57Z msweet $". +// End of "$Id: sample.drv 12105 2014-08-20 15:27:43Z msweet $". // diff --git a/scheduler/Makefile b/scheduler/Makefile index cd12aca182..c0c54a4b6d 100644 --- a/scheduler/Makefile +++ b/scheduler/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 11718 2014-03-21 18:04:48Z msweet $" +# "$Id: Makefile 12132 2014-08-29 11:27:18Z msweet $" # # Scheduler Makefile for CUPS. # @@ -171,7 +171,7 @@ install-data: echo Creating $(REQUESTS)/tmp... $(INSTALL_DIR) -m 1770 -g $(CUPS_GROUP) $(REQUESTS)/tmp echo Creating $(CACHEDIR)... - $(INSTALL_DIR) -m 775 -g $(CUPS_GROUP) $(CACHEDIR) + $(INSTALL_DIR) -m 770 -g $(CUPS_GROUP) $(CACHEDIR) if test "x$(INITDIR)" != x; then \ echo Installing init scripts...; \ $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/init.d; \ @@ -547,5 +547,5 @@ include Dependencies # -# End of "$Id: Makefile 11718 2014-03-21 18:04:48Z msweet $". +# End of "$Id: Makefile 12132 2014-08-29 11:27:18Z msweet $". # diff --git a/scheduler/auth.c b/scheduler/auth.c index dbc90cec6d..4e5ad5b9a4 100644 --- a/scheduler/auth.c +++ b/scheduler/auth.c @@ -1,5 +1,5 @@ /* - * "$Id: auth.c 11776 2014-03-28 19:16:05Z msweet $" + * "$Id: auth.c 12124 2014-08-28 15:37:22Z msweet $" * * Authorization routines for the CUPS scheduler. * @@ -2171,23 +2171,23 @@ cups_crypt(const char *pw, /* I - Password string */ * Copy the final sum to the result string and return... */ - memcpy(result, salt, salt_end - salt); + memcpy(result, salt, (size_t)(salt_end - salt)); ptr = result + (salt_end - salt); *ptr++ = '$'; for (i = 0; i < 5; i ++, ptr += 4) { - n = (((digest[i] << 8) | digest[i + 6]) << 8); + n = ((((unsigned)digest[i] << 8) | (unsigned)digest[i + 6]) << 8); if (i < 4) - n |= digest[i + 12]; + n |= (unsigned)digest[i + 12]; else - n |= digest[5]; + n |= (unsigned)digest[5]; to64(ptr, n, 4); } - to64(ptr, digest[11], 2); + to64(ptr, (unsigned)digest[11], 2); ptr += 2; *ptr = '\0'; @@ -2327,5 +2327,5 @@ to64(char *s, /* O - Output string */ /* - * End of "$Id: auth.c 11776 2014-03-28 19:16:05Z msweet $". + * End of "$Id: auth.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/scheduler/client.c b/scheduler/client.c index 7b74131aed..949191000b 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -1,5 +1,5 @@ /* - * "$Id: client.c 12056 2014-07-22 14:02:56Z msweet $" + * "$Id: client.c 12124 2014-08-28 15:37:22Z msweet $" * * Client routines for the CUPS scheduler. * @@ -934,7 +934,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ return; } #else - if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE)) + if (!cupsdSendError(con, HTTP_STATUS_NOT_IMPLEMENTED, CUPSD_AUTH_NONE)) { cupsdCloseClient(con); return; @@ -993,7 +993,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ return; } #else - if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE)) + if (!cupsdSendError(con, HTTP_STATUS_NOT_IMPLEMENTED, CUPSD_AUTH_NONE)) { cupsdCloseClient(con); return; @@ -1891,7 +1891,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ con->request->request.op.version[1], ippOpString(con->request->request.op.operation_id), con->request->request.op.request_id); - con->bytes += ippLength(con->request); + con->bytes += (off_t)ippLength(con->request); } } @@ -2912,6 +2912,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */ char *ptr; /* Pointer info filename */ size_t plen; /* Remaining length after pointer */ char language[7]; /* Language subdirectory, if any */ + int perm_check = 1; /* Do permissions check? */ /* @@ -2921,17 +2922,27 @@ get_file(cupsd_client_t *con, /* I - Client connection */ language[0] = '\0'; if (!strncmp(con->uri, "/ppd/", 5) && !strchr(con->uri + 5, '/')) + { snprintf(filename, len, "%s%s", ServerRoot, con->uri); + + perm_check = 0; + } else if (!strncmp(con->uri, "/icons/", 7) && !strchr(con->uri + 7, '/')) { snprintf(filename, len, "%s/%s", CacheDir, con->uri + 7); if (access(filename, F_OK) < 0) snprintf(filename, len, "%s/images/generic.png", DocumentRoot); + + perm_check = 0; } else if (!strncmp(con->uri, "/rss/", 5) && !strchr(con->uri + 5, '/')) snprintf(filename, len, "%s/rss/%s", CacheDir, con->uri + 5); - else if (!strncmp(con->uri, "/admin/conf/", 12)) - snprintf(filename, len, "%s%s", ServerRoot, con->uri + 11); + else if (!strcmp(con->uri, "/admin/conf/cupsd.conf")) + { + strlcpy(filename, ConfigurationFile, len); + + perm_check = 0; + } else if (!strncmp(con->uri, "/admin/log/", 11)) { if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/') @@ -2942,6 +2953,8 @@ get_file(cupsd_client_t *con, /* I - Client connection */ strlcpy(filename, PageLog, len); else return (NULL); + + perm_check = 0; } else if (con->language) { @@ -3007,7 +3020,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */ * not allow access... */ - if (!status && !(filestats->st_mode & S_IROTH)) + if (!status && perm_check && !(filestats->st_mode & S_IROTH)) { cupsdLogClient(con, CUPSD_LOG_INFO, "Files/directories such as \"%s\" must be world-readable.", filename); return (NULL); @@ -3115,7 +3128,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */ * not allow access... */ - if (!status && !(filestats->st_mode & S_IROTH)) + if (!status && perm_check && !(filestats->st_mode & S_IROTH)) { cupsdLogClient(con, CUPSD_LOG_INFO, "Files/directories such as \"%s\" must be world-readable.", filename); return (NULL); @@ -4042,5 +4055,5 @@ write_pipe(cupsd_client_t *con) /* I - Client connection */ /* - * End of "$Id: client.c 12056 2014-07-22 14:02:56Z msweet $". + * End of "$Id: client.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/scheduler/conf.c b/scheduler/conf.c index cd468934ce..bf9a079e44 100644 --- a/scheduler/conf.c +++ b/scheduler/conf.c @@ -1,5 +1,5 @@ /* - * "$Id: conf.c 11931 2014-06-16 16:10:58Z msweet $" + * "$Id: conf.c 12132 2014-08-29 11:27:18Z msweet $" * * Configuration routines for the CUPS scheduler. * @@ -1076,7 +1076,7 @@ cupsdReadConfiguration(void) if ((cupsdCheckPermissions(RequestRoot, NULL, 0710, RunUser, Group, 1, 1) < 0 || - cupsdCheckPermissions(CacheDir, NULL, 0775, RunUser, + cupsdCheckPermissions(CacheDir, NULL, 0770, RunUser, Group, 1, 1) < 0 || cupsdCheckPermissions(temp, NULL, 0775, RunUser, Group, 1, 1) < 0 || @@ -4087,5 +4087,5 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */ /* - * End of "$Id: conf.c 11931 2014-06-16 16:10:58Z msweet $". + * End of "$Id: conf.c 12132 2014-08-29 11:27:18Z msweet $". */ diff --git a/scheduler/cups-driverd.cxx b/scheduler/cups-driverd.cxx index 8b047a9e75..7828448054 100644 --- a/scheduler/cups-driverd.cxx +++ b/scheduler/cups-driverd.cxx @@ -1,5 +1,5 @@ /* - * "$Id: cups-driverd.cxx 11558 2014-02-06 18:33:34Z msweet $" + * "$Id: cups-driverd.cxx 12124 2014-08-28 15:37:22Z msweet $" * * PPD/driver support for CUPS. * @@ -1321,7 +1321,7 @@ list_ppds(int request_id, /* I - Request ID */ if (device_id_re && !regexec(device_id_re, ppd->record.device_id, - (int)(sizeof(re_matches) / sizeof(re_matches[0])), + (size_t)(sizeof(re_matches) / sizeof(re_matches[0])), re_matches, 0)) { /* @@ -1351,7 +1351,7 @@ list_ppds(int request_id, /* I - Request ID */ if (make_and_model_re && !regexec(make_and_model_re, ppd->record.make_and_model, - (int)(sizeof(re_matches) / sizeof(re_matches[0])), + (size_t)(sizeof(re_matches) / sizeof(re_matches[0])), re_matches, 0)) { // See how much of the make-and-model string we matched... @@ -2903,5 +2903,5 @@ regex_string(const char *s) /* I - String to compare */ /* - * End of "$Id: cups-driverd.cxx 11558 2014-02-06 18:33:34Z msweet $". + * End of "$Id: cups-driverd.cxx 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/scheduler/ipp.c b/scheduler/ipp.c index 9806f10582..05371e6ded 100644 --- a/scheduler/ipp.c +++ b/scheduler/ipp.c @@ -1,5 +1,5 @@ /* - * "$Id: ipp.c 12067 2014-07-31 00:02:30Z msweet $" + * "$Id: ipp.c 12124 2014-08-28 15:37:22Z msweet $" * * IPP routines for the CUPS scheduler. * @@ -2715,7 +2715,6 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG, "Copied PPD file successfully"); - chmod(dstfile, 0644); } } @@ -4623,7 +4622,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ * Open the destination file for a copy... */ - if ((dst = cupsFileOpen(to, "wb")) == NULL) + if ((dst = cupsdCreateConfFile(to, ConfigFilePerm)) == NULL) { cupsFreeOptions(num_defaults, defaults); cupsFileClose(src); @@ -4678,7 +4677,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ unlink(tempfile); - return (cupsFileClose(dst)); + return (cupsdCloseCreatedConfFile(dst, to)); } @@ -10824,8 +10823,10 @@ validate_job(cupsd_client_t *con, /* I - Client connection */ ipp_attribute_t *uri) /* I - Printer URI */ { http_status_t status; /* Policy status */ - ipp_attribute_t *attr, /* Current attribute */ - *auth_info; /* auth-info attribute */ + ipp_attribute_t *attr; /* Current attribute */ +#ifdef HAVE_SSL + ipp_attribute_t *auth_info; /* auth-info attribute */ +#endif /* HAVE_SSL */ ipp_attribute_t *format, /* Document-format attribute */ *name; /* Job-name attribute */ cups_ptype_t dtype; /* Destination type (printer/class) */ @@ -10991,7 +10992,9 @@ validate_job(cupsd_client_t *con, /* I - Client connection */ * Check policy... */ +#ifdef HAVE_SSL auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT); +#endif /* HAVE_SSL */ if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) { @@ -11093,5 +11096,5 @@ validate_user(cupsd_job_t *job, /* I - Job */ /* - * End of "$Id: ipp.c 12067 2014-07-31 00:02:30Z msweet $". + * End of "$Id: ipp.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/scheduler/job.c b/scheduler/job.c index 0dbf39b6fa..b05050b6a0 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -1,5 +1,5 @@ /* - * "$Id: job.c 12067 2014-07-31 00:02:30Z msweet $" + * "$Id: job.c 12140 2014-08-30 01:51:22Z msweet $" * * Job management routines for the CUPS scheduler. * @@ -235,10 +235,7 @@ cupsdCheckJobs(void) curtime = time(NULL); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdCheckJobs: %d active jobs, sleeping=%d, reload=%d, " - "curtime=%ld", cupsArrayCount(ActiveJobs), Sleeping, - NeedReload, (long)curtime); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckJobs: %d active jobs, sleeping=%d, ac-power=%d, reload=%d, curtime=%ld", cupsArrayCount(ActiveJobs), Sleeping, ACPower, NeedReload, (long)curtime); for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); job; @@ -332,7 +329,7 @@ cupsdCheckJobs(void) */ if (job->state_value == IPP_JOB_PENDING && !NeedReload && - !Sleeping && !DoingShutdown && !job->printer) + (!Sleeping || ACPower) && !DoingShutdown && !job->printer) { printer = cupsdFindDest(job->dest); pclass = NULL; @@ -5289,5 +5286,5 @@ update_job_attrs(cupsd_job_t *job, /* I - Job to update */ /* - * End of "$Id: job.c 12067 2014-07-31 00:02:30Z msweet $". + * End of "$Id: job.c 12140 2014-08-30 01:51:22Z msweet $". */ diff --git a/scheduler/listen.c b/scheduler/listen.c index 842d378771..a704121654 100644 --- a/scheduler/listen.c +++ b/scheduler/listen.c @@ -1,5 +1,5 @@ /* - * "$Id: listen.c 11717 2014-03-21 16:42:53Z msweet $" + * "$Id: listen.c 12080 2014-08-04 13:23:50Z msweet $" * * Server listening routines for the CUPS scheduler. * @@ -274,23 +274,14 @@ cupsdStopListening(void) lis; lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) { -#ifdef HAVE_SYSTEMD +#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD) if (lis->fd != -1 && !lis->on_demand) httpAddrClose(&(lis->address), lis->fd); -#elif defined(HAVE_LAUNCHD) - if (lis->fd != -1) - { - if (lis->on_demand) - httpAddrClose(NULL, lis->fd); - else - httpAddrClose(&(lis->address), lis->fd); - } - #else if (lis->fd != -1) httpAddrClose(&(lis->address), lis->fd); -#endif /* HAVE_SYSTEMD */ +#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */ lis->fd = -1; } @@ -298,5 +289,5 @@ cupsdStopListening(void) /* - * End of "$Id: listen.c 11717 2014-03-21 16:42:53Z msweet $". + * End of "$Id: listen.c 12080 2014-08-04 13:23:50Z msweet $". */ diff --git a/scheduler/main.c b/scheduler/main.c index 92c10b127e..1d3ac1b555 100644 --- a/scheduler/main.c +++ b/scheduler/main.c @@ -1,5 +1,5 @@ /* - * "$Id: main.c 11722 2014-03-21 18:28:30Z msweet $" + * "$Id: main.c 12140 2014-08-30 01:51:22Z msweet $" * * Main loop for the CUPS scheduler. * @@ -119,8 +119,7 @@ main(int argc, /* I - Number of command-line args */ int run_as_child = 0; /* Needed for background fork/exec */ #ifdef __APPLE__ - int use_sysman = !getuid(); - /* Use system management functions? */ + int use_sysman = 1; /* Use system management functions? */ #else time_t netif_time = 0; /* Time since last network update */ #endif /* __APPLE__ */ @@ -137,7 +136,7 @@ main(int argc, /* I - Number of command-line args */ if (getuid() != geteuid()) { - fputs("cupsd: Cannot run as a setuid program\n", stderr); + fputs("cupsd: Cannot run as a setuid program.\n", stderr); return (1); } #endif /* HAVE_GETEUID */ @@ -726,19 +725,6 @@ main(int argc, /* I - Number of command-line args */ break; } -#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD) - if (OnDemand) - { - /* - * If we were started by launchd or systemd, get the listen socket file - * descriptors... - */ - - service_checkin(); - service_checkout(); - } -#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */ - /* * Startup the server... */ @@ -1885,6 +1871,8 @@ service_checkin(void) # endif /* HAVE_SSL */ } + free(ld_sockets); + # elif defined(HAVE_LAUNCHD) size_t i, /* Looping var */ count; /* Number of listeners */ @@ -2170,5 +2158,5 @@ usage(int status) /* O - Exit status */ /* - * End of "$Id: main.c 11722 2014-03-21 18:28:30Z msweet $". + * End of "$Id: main.c 12140 2014-08-30 01:51:22Z msweet $". */ diff --git a/scheduler/process.c b/scheduler/process.c index 1b1aeae8ff..d23a352c7f 100644 --- a/scheduler/process.c +++ b/scheduler/process.c @@ -1,5 +1,5 @@ /* - * "$Id: process.c 12034 2014-07-16 19:37:34Z msweet $" + * "$Id: process.c 12102 2014-08-20 15:19:09Z msweet $" * * Process management routines for the CUPS scheduler. * @@ -215,6 +215,8 @@ cupsdCreateProfile(int job_id, /* I - Job ID or 0 for none */ " #\"^/private/var/mysql$\"" " #\"^/private/var/run$\"" " #\"^/private/var/spool$\"" + " #\"^/private/var/tmp$\"" + " #\"^/private/var/tmp/\"" " #\"^/usr/bin$\"" /* /usr/bin */ " #\"^/usr/bin/\"" /* /usr/bin/... */ " #\"^/usr/libexec/cups$\"" /* /usr/libexec/cups */ @@ -223,27 +225,10 @@ cupsdCreateProfile(int job_id, /* I - Job ID or 0 for none */ " #\"^/usr/libexec/fax/\"" /* /usr/libexec/fax/... */ " #\"^/usr/sbin$\"" /* /usr/sbin */ " #\"^/usr/sbin/\"" /* /usr/sbin/... */ - " #\"^/Library/Application Support$\"" - " #\"^/Library/Application Support/\"" - " #\"^/Library/Caches$\"" - " #\"^/Library/ColorSync$\"" - " #\"^/Library/ColorSync/Profiles$\"" - " #\"^/Library/ColorSync/Profiles/\"" - " #\"^/Library/Fonts$\"" - " #\"^/Library/Fonts/\"" - " #\"^/Library/Frameworks$\"" - " #\"^/Library/Frameworks/\"" - " #\"^/Library/Keychains$\"" - " #\"^/Library/Keychains/\"" - " #\"^/Library/Logs$\"" - " #\"^/Library/Printers$\"" - " #\"^/Library/Printers/\"" - " #\"^/Library/Security$\"" - " #\"^/Library/Security/\"" - " #\"^/Library/WebServer$\"" - " #\"^/System/Library/ColorSync$\"" - " #\"^/System/Library/ColorSync/Profiles$\"" - " #\"^/System/Library/ColorSync/Profiles/\"" + " #\"^/Library$\"" /* /Library */ + " #\"^/Library/\"" /* /Library/... */ + " #\"^/System$\"" /* /System */ + " #\"^/System/\"" /* /System/... */ " #\"^%s/Library$\"" /* RequestRoot/Library */ " #\"^%s/Library/\"" /* RequestRoot/Library/... */ " #\"^%s$\"" /* ServerBin */ @@ -292,6 +277,7 @@ cupsdCreateProfile(int job_id, /* I - Job ID or 0 for none */ " #\"^%s/\"" /* CUPS_TESTROOT/... */ "))\n", testroot); + cupsFilePrintf(fp, "(allow sysctl*)\n"); } if (job_id) { @@ -314,7 +300,7 @@ cupsdCreateProfile(int job_id, /* I - Job ID or 0 for none */ cupsFilePuts(fp, "(allow distributed-notification-post)\n"); /* Allow outbound networking to local services */ cupsFilePuts(fp, "(allow network-outbound" - "\n (regex #\"^/private/var/run/\" #\"^/private/tmp/\")"); + "\n (regex #\"^/private/var/run/\" #\"^/private/tmp/\" #\"^/private/var/tmp/\")"); for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); lis; lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) @@ -884,5 +870,5 @@ cupsd_requote(char *dst, /* I - Destination buffer */ /* - * End of "$Id: process.c 12034 2014-07-16 19:37:34Z msweet $". + * End of "$Id: process.c 12102 2014-08-20 15:19:09Z msweet $". */ diff --git a/scheduler/sysman.c b/scheduler/sysman.c index 4b64215319..315db7f4d5 100644 --- a/scheduler/sysman.c +++ b/scheduler/sysman.c @@ -1,9 +1,9 @@ /* - * "$Id: sysman.c 11406 2013-11-07 12:47:57Z msweet $" + * "$Id: sysman.c 12140 2014-08-30 01:51:22Z msweet $" * * System management functions for the CUPS scheduler. * - * Copyright 2007-2013 by Apple Inc. + * Copyright 2007-2014 by Apple Inc. * Copyright 2006 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -19,31 +19,29 @@ */ #include "cupsd.h" -#ifdef HAVE_VPROC_TRANSACTION_BEGIN -# include -#endif /* HAVE_VPROC_TRANSACTION_BEGIN */ #ifdef __APPLE__ +# include # include #endif /* __APPLE__ */ /* * The system management functions cover disk and power management which - * are primarily used on portable computers. + * are primarily used for portable computers. * * Disk management involves delaying the write of certain configuration * and state files to minimize the number of times the disk has to spin - * up. + * up or flash to be written to. * * Power management support is currently only implemented on OS X, but * essentially we use four functions to let the OS know when it is OK to * put the system to sleep, typically when we are not in the middle of - * printing a job. - * - * Once put to sleep, we invalidate all remote printers since it is common - * to wake up in a new location/on a new wireless network. + * printing a job. And on OS X we can also "sleep print" - basically the + * system only wakes up long enough to service network requests and process + * print jobs. */ + /* * 'cupsdCleanDirty()' - Write dirty config and state files. */ @@ -132,9 +130,10 @@ cupsdSetBusyState(void) "Active clients and printing jobs", "Active clients, printing jobs, and dirty files" }; -#ifdef HAVE_VPROC_TRANSACTION_BEGIN +#ifdef __APPLE__ static vproc_transaction_t vtran = 0; /* Current busy transaction */ -#endif /* HAVE_VPROC_TRANSACTION_BEGIN */ + static IOPMAssertionID keep_awake = 0;/* Keep the system awake while printing */ +#endif /* __APPLE__ */ /* @@ -174,7 +173,7 @@ cupsdSetBusyState(void) { busy = newbusy; -#ifdef HAVE_VPROC_TRANSACTION_BEGIN +#ifdef __APPLE__ if (busy && !vtran) vtran = vproc_transaction_begin(NULL); else if (!busy && vtran) @@ -182,8 +181,25 @@ cupsdSetBusyState(void) vproc_transaction_end(NULL, vtran); vtran = 0; } -#endif /* HAVE_VPROC_TRANSACTION_BEGIN */ +#endif /* __APPLE__ */ + } + +#ifdef __APPLE__ + if (cupsArrayCount(PrintingJobs) > 0 && !keep_awake) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting NetworkClientActive."); + + IOPMAssertionCreateWithName(kIOPMAssertNetworkClientActive, + kIOPMAssertionLevelOn, + CFSTR("org.cups.cupsd"), &keep_awake); } + else if (cupsArrayCount(PrintingJobs) == 0 && keep_awake) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing power assertion."); + IOPMAssertionRelease(keep_awake); + keep_awake = 0; + } +#endif /* __APPLE__ */ } @@ -198,8 +214,10 @@ cupsdSetBusyState(void) * Include MacOS-specific headers... */ +# include # include # include +# include # include # include # include @@ -265,6 +283,7 @@ static CFStringRef ComputerNameKey = NULL, /* Netowrk interface key */ static cupsd_sysevent_t LastSysEvent; /* Last system event (for delayed sleep) */ static int NameChanged = 0;/* Did we get a 'name changed' event during sleep? */ +static int PSToken = 0; /* Power source notifications */ /* @@ -308,6 +327,8 @@ cupsdStartSystemMonitor(void) int flags; /* fcntl flags on pipe */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSystemMonitor()"); + if (cupsdOpenPipe(SysEventPipes)) { cupsdLogMessage(CUPSD_LOG_ERROR, "System event monitor pipe() failed - %s!", @@ -332,6 +353,14 @@ cupsdStartSystemMonitor(void) pthread_mutex_init(&SysEventThreadMutex, NULL); pthread_cond_init(&SysEventThreadCond, NULL); pthread_create(&SysEventThread, NULL, (void *(*)())sysEventThreadEntry, NULL); + + /* + * Monitor for power source changes via dispatch queue... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSystemMonitor: IOPSGetTimeRemainingEstimate=%f", IOPSGetTimeRemainingEstimate()); + ACPower = IOPSGetTimeRemainingEstimate() == kIOPSTimeRemainingUnlimited; + notify_register_dispatch(kIOPSNotifyPowerSource, &PSToken, dispatch_get_main_queue(), ^(int t) { ACPower = IOPSGetTimeRemainingEstimate() == kIOPSTimeRemainingUnlimited; }); } @@ -345,6 +374,8 @@ cupsdStopSystemMonitor(void) CFRunLoopRef rl; /* The event handler runloop */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopSystemMonitor()"); + if (SysEventThread) { /* @@ -375,6 +406,12 @@ cupsdStopSystemMonitor(void) cupsdRemoveSelect(SysEventPipes[0]); cupsdClosePipe(SysEventPipes); } + + if (PSToken != 0) + { + notify_cancel(PSToken); + PSToken = 0; + } } @@ -1034,5 +1071,5 @@ sysUpdateNames(void) /* - * End of "$Id: sysman.c 11406 2013-11-07 12:47:57Z msweet $". + * End of "$Id: sysman.c 12140 2014-08-30 01:51:22Z msweet $". */ diff --git a/scheduler/sysman.h b/scheduler/sysman.h index b911feb97a..9da386da51 100644 --- a/scheduler/sysman.h +++ b/scheduler/sysman.h @@ -1,16 +1,16 @@ /* - * "$Id: sysman.h 10996 2013-05-29 11:51:34Z msweet $" + * "$Id: sysman.h 12140 2014-08-30 01:51:22Z msweet $" * - * System management definitions for the CUPS scheduler. + * System management definitions for the CUPS scheduler. * - * Copyright 2007-2011 by Apple Inc. - * Copyright 2006 by Easy Software Products. + * Copyright 2007-2014 by Apple Inc. + * Copyright 2006 by Easy Software Products. * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". */ /* @@ -35,7 +35,9 @@ VAR int DirtyFiles VALUE(CUPSD_DIRTY_NONE), /* How often do we write dirty files? */ VAR time_t DirtyCleanTime VALUE(0); /* When to clean dirty files next */ -VAR int Sleeping VALUE(0); +VAR int ACPower VALUE(-1), + /* Is the system on AC power? */ + Sleeping VALUE(0); /* Non-zero if machine is entering or * * in a sleep state... */ VAR time_t SleepJobs VALUE(0); @@ -60,5 +62,5 @@ extern void cupsdStopSystemMonitor(void); /* - * End of "$Id: sysman.h 10996 2013-05-29 11:51:34Z msweet $". + * End of "$Id: sysman.h 12140 2014-08-30 01:51:22Z msweet $". */ diff --git a/systemv/lpstat.c b/systemv/lpstat.c index 8190ba11b6..9c076cb255 100644 --- a/systemv/lpstat.c +++ b/systemv/lpstat.c @@ -1,5 +1,5 @@ /* - * "$Id: lpstat.c 12066 2014-07-30 18:30:44Z msweet $" + * "$Id: lpstat.c 12124 2014-08-28 15:37:22Z msweet $" * * "lpstat" command for CUPS. * @@ -1270,7 +1270,6 @@ show_jobs(const char *dests, /* I - Destinations */ *reasons; /* Job state reasons attribute */ const char *dest, /* Pointer into job-printer-uri */ *username, /* Pointer to job-originating-user-name */ - *title, /* Pointer to job-name */ *message, /* Pointer to job-printer-state-message */ *time_at; /* time-at-xxx attribute name to use */ int rank, /* Rank in queue */ @@ -1385,7 +1384,6 @@ show_jobs(const char *dests, /* I - Destinations */ username = NULL; dest = NULL; jobtime = 0; - title = "no title"; message = NULL; reasons = NULL; @@ -1411,9 +1409,6 @@ show_jobs(const char *dests, /* I - Destinations */ else if (!strcmp(attr->name, "job-originating-user-name") && attr->value_tag == IPP_TAG_NAME) username = attr->values[0].string.text; - else if (!strcmp(attr->name, "job-name") && - attr->value_tag == IPP_TAG_NAME) - title = attr->values[0].string.text; else if (!strcmp(attr->name, "job-state-reasons") && attr->value_tag == IPP_TAG_KEYWORD) reasons = attr; @@ -2039,5 +2034,5 @@ show_scheduler(void) /* - * End of "$Id: lpstat.c 12066 2014-07-30 18:30:44Z msweet $". + * End of "$Id: lpstat.c 12124 2014-08-28 15:37:22Z msweet $". */ diff --git a/templates/restart.tmpl b/templates/restart.tmpl index 6455652f89..47d39d0716 100644 --- a/templates/restart.tmpl +++ b/templates/restart.tmpl @@ -1,4 +1,4 @@

      Change Settings

      -

      Busy Indicator Please stand by while the server restarts...

      diff --git a/test/Dependencies b/test/Dependencies index e7f0cfc5ee..8405117d24 100644 --- a/test/Dependencies +++ b/test/Dependencies @@ -7,8 +7,7 @@ ippfind.o: ippfind.c ../cups/cups-private.h ../cups/string-private.h \ ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h ippserver.o: ippserver.c ../cups/cups.h ../cups/file.h \ ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \ - ../cups/language.h ../cups/pwg.h ../config.h ../cups/string-private.h \ - ../cups/thread-private.h + ../cups/language.h ../cups/pwg.h ../config.h ../cups/thread-private.h ipptool.o: ipptool.c ../cups/cups-private.h ../cups/string-private.h \ ../config.h ../cups/debug-private.h ../cups/versioning.h \ ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \ diff --git a/test/get-completed-jobs.test b/test/get-completed-jobs.test index 00d3754d21..504ab824f3 100644 --- a/test/get-completed-jobs.test +++ b/test/get-completed-jobs.test @@ -1,9 +1,9 @@ # -# "$Id: get-completed-jobs.test 11398 2013-11-06 20:11:11Z msweet $" +# "$Id: get-completed-jobs.test 12088 2014-08-07 01:09:21Z msweet $" # # Get list of completed jobs. # -# Copyright 2007-2012 by Apple Inc. +# Copyright 2007-2014 by Apple Inc. # Copyright 2001-2006 by Easy Software Products. All rights reserved. # # These coded instructions, statements, and computer programs are the @@ -32,7 +32,7 @@ ATTR uri printer-uri $uri ATTR keyword which-jobs completed ATTR keyword requested-attributes - job-id,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets-completed + job-id,job-uri,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets-completed # What statuses are OK? STATUS successful-ok @@ -47,5 +47,5 @@ # -# End of "$Id: get-completed-jobs.test 11398 2013-11-06 20:11:11Z msweet $". +# End of "$Id: get-completed-jobs.test 12088 2014-08-07 01:09:21Z msweet $". # diff --git a/test/get-jobs.test b/test/get-jobs.test index 2b2c031e8c..d8cc5149dd 100644 --- a/test/get-jobs.test +++ b/test/get-jobs.test @@ -1,9 +1,9 @@ # -# "$Id: get-jobs.test 11398 2013-11-06 20:11:11Z msweet $" +# "$Id: get-jobs.test 12088 2014-08-07 01:09:21Z msweet $" # # Get list of not-completed jobs. # -# Copyright 2007-2012 by Apple Inc. +# Copyright 2007-2014 by Apple Inc. # Copyright 2001-2006 by Easy Software Products. All rights reserved. # # These coded instructions, statements, and computer programs are the @@ -31,7 +31,7 @@ ATTR language attributes-natural-language en ATTR uri printer-uri $uri ATTR keyword requested-attributes - job-id,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets,job-media-sheets-completed,job-impressions,job-impressions-completed + job-id,job-uri,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets,job-media-sheets-completed,job-impressions,job-impressions-completed # What statuses are OK? STATUS successful-ok @@ -49,5 +49,5 @@ # -# End of "$Id: get-jobs.test 11398 2013-11-06 20:11:11Z msweet $". +# End of "$Id: get-jobs.test 12088 2014-08-07 01:09:21Z msweet $". # diff --git a/test/identify-printer.test b/test/identify-printer.test new file mode 100644 index 0000000000..b97bb71dc8 --- /dev/null +++ b/test/identify-printer.test @@ -0,0 +1,20 @@ +# Make the printer beep +{ + # The name of the test... + NAME "Identify Printer with Sound" + + # The operation to use + OPERATION Identify-Printer + + # Attributes, starting in the operation group... + GROUP operation-attributes-tag + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR name requesting-user-name $user + ATTR keyword identify-actions sound + + # What statuses are OK? + STATUS successful-ok + STATUS successful-ok-ignored-or-substituted-attributes +} diff --git a/test/ippfind.c b/test/ippfind.c index 517eacb43c..758de0c703 100644 --- a/test/ippfind.c +++ b/test/ippfind.c @@ -1,5 +1,5 @@ /* - * "$Id: ippfind.c 11594 2014-02-14 20:09:01Z msweet $" + * "$Id: ippfind.c 12139 2014-08-29 17:50:38Z msweet $" * * Utility to find IPP printers via Bonjour/DNS-SD and optionally run * commands such as IPP and Bonjour conformance tests. This tool is @@ -242,7 +242,7 @@ main(int argc, /* I - Number of command-line args */ { int i, /* Looping var */ have_output = 0,/* Have output expression */ - status = IPPFIND_EXIT_TRUE; + status = IPPFIND_EXIT_FALSE; /* Exit status */ const char *opt, /* Option character */ *search; /* Current browse/resolve string */ @@ -307,6 +307,10 @@ main(int argc, /* I - Number of command-line args */ * Parse command-line... */ + if (getenv("IPPFIND_DEBUG")) + for (i = 1; i < argc; i ++) + fprintf(stderr, "argv[%d]=\"%s\"\n", i, argv[i]); + for (i = 1; i < argc; i ++) { if (argv[i][0] == '-') @@ -603,9 +607,9 @@ main(int argc, /* I - Number of command-line args */ NULL)) == NULL) return (IPPFIND_EXIT_MEMORY); } - else if (!strncmp(argv[i], "--txt-", 5)) + else if (!strncmp(argv[i], "--txt-", 6)) { - const char *key = argv[i] + 5;/* TXT key */ + const char *key = argv[i] + 6;/* TXT key */ i ++; if (i >= argc) @@ -1420,8 +1424,8 @@ main(int argc, /* I - Number of command-line args */ service->ref = NULL; } - if (!eval_expr(service, expressions)) - status = IPPFIND_EXIT_FALSE; + if (eval_expr(service, expressions)) + status = IPPFIND_EXIT_TRUE; service->is_processed = 1; } @@ -1803,6 +1807,9 @@ eval_expr(ippfind_srv_t *service, /* I - Service */ result = !regexec(&(expression->re), val, 0, NULL, 0); else result = 0; + + if (getenv("IPPFIND_DEBUG")) + printf("TXT_REGEX of \"%s\": %d\n", val, result); break; case IPPFIND_OP_URI_REGEX : result = !regexec(&(expression->re), service->uri, 0, NULL, 0); @@ -1976,9 +1983,9 @@ exec_program(ippfind_srv_t *service, /* I - Service */ strlcpy(tptr, scheme + 22, sizeof(temp) - (size_t)(tptr - temp)); else if (!strncmp(keyword, "txt_", 4)) { - if ((ptr = (char *)cupsGetOption(keyword + 4, service->num_txt, - service->txt)) != NULL) - strlcpy(tptr, strdup(ptr), sizeof(temp) - (size_t)(tptr - temp)); + const char *txt = cupsGetOption(keyword + 4, service->num_txt, service->txt); + if (txt) + strlcpy(tptr, txt, sizeof(temp) - (size_t)(tptr - temp)); else *tptr = '\0'; } @@ -2003,6 +2010,17 @@ exec_program(ippfind_srv_t *service, /* I - Service */ } #ifdef WIN32 + if (getenv("IPPFIND_DEBUG")) + { + printf("\nProgram:\n %s\n", args[0]); + puts("\nArguments:"); + for (i = 0; i < num_args; i ++) + printf(" %s\n", myargv[i]); + puts("\nEnvironment:"); + for (i = 0; i < myenvc; i ++) + printf(" %s\n", myenvp[i]); + } + status = _spawnvpe(_P_WAIT, args[0], myargv, myenvp); #else @@ -2070,6 +2088,18 @@ exec_program(ippfind_srv_t *service, /* I - Service */ * Return whether the program succeeded or crashed... */ + if (getenv("IPPFIND_DEBUG")) + { +#ifdef WIN32 + printf("Exit Status: %d\n", status); +#else + if (WIFEXITED(status)) + printf("Exit Status: %d\n", WEXITSTATUS(status)); + else + printf("Terminating Signal: %d\n", WTERMSIG(status)); +#endif /* WIN32 */ + } + return (status == 0); } @@ -2805,5 +2835,5 @@ show_version(void) /* - * End of "$Id: ippfind.c 11594 2014-02-14 20:09:01Z msweet $". + * End of "$Id: ippfind.c 12139 2014-08-29 17:50:38Z msweet $". */ diff --git a/test/ippserver.c b/test/ippserver.c index 8ee491fbfc..f2055a1971 100644 --- a/test/ippserver.c +++ b/test/ippserver.c @@ -1,7 +1,7 @@ /* - * "$Id: ippserver.c 11986 2014-07-02 15:52:01Z msweet $" + * "$Id: ippserver.c 12136 2014-08-29 15:19:40Z msweet $" * - * Sample IPP/2.0 server for CUPS. + * Sample IPP Everywhere server for CUPS. * * Copyright 2010-2014 by Apple Inc. * @@ -27,20 +27,37 @@ * Include necessary headers... */ -#include /* Public API */ #include /* CUPS configuration header */ -#include /* For string functions */ +#include /* Public API */ +#include /* CUPS string functions */ #include /* For multithreading functions */ +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +# include +# include +# include +# define WEXITSTATUS(s) (s) +# include +typedef ULONG nfds_t; +# define poll WSAPoll +#else +extern char **environ; -#include +# include +# include +# include +#endif /* WIN32 */ #ifdef HAVE_DNSSD # include #endif /* HAVE_DNSSD */ -#include -#include -#include -#include #ifdef HAVE_SYS_MOUNT_H # include #endif /* HAVE_SYS_MOUNT_H */ @@ -59,33 +76,33 @@ * Constants... */ -enum _ipp_preasons_e /* printer-state-reasons bit values */ +enum _ipp_preason_e /* printer-state-reasons bit values */ { - _IPP_PSTATE_NONE = 0x0000, /* none */ - _IPP_PSTATE_OTHER = 0x0001, /* other */ - _IPP_PSTATE_COVER_OPEN = 0x0002, /* cover-open */ - _IPP_PSTATE_INPUT_TRAY_MISSING = 0x0004, + _IPP_PREASON_NONE = 0x0000, /* none */ + _IPP_PREASON_OTHER = 0x0001, /* other */ + _IPP_PREASON_COVER_OPEN = 0x0002, /* cover-open */ + _IPP_PREASON_INPUT_TRAY_MISSING = 0x0004, /* input-tray-missing */ - _IPP_PSTATE_MARKER_SUPPLY_EMPTY = 0x0008, + _IPP_PREASON_MARKER_SUPPLY_EMPTY = 0x0008, /* marker-supply-empty */ - _IPP_PSTATE_MARKER_SUPPLY_LOW = 0x0010, - /* marker-suply-low */ - _IPP_PSTATE_MARKER_WASTE_ALMOST_FULL = 0x0020, + _IPP_PREASON_MARKER_SUPPLY_LOW = 0x0010, + /* marker-supply-low */ + _IPP_PREASON_MARKER_WASTE_ALMOST_FULL = 0x0020, /* marker-waste-almost-full */ - _IPP_PSTATE_MARKER_WASTE_FULL = 0x0040, + _IPP_PREASON_MARKER_WASTE_FULL = 0x0040, /* marker-waste-full */ - _IPP_PSTATE_MEDIA_EMPTY = 0x0080, /* media-empty */ - _IPP_PSTATE_MEDIA_JAM = 0x0100, /* media-jam */ - _IPP_PSTATE_MEDIA_LOW = 0x0200, /* media-low */ - _IPP_PSTATE_MEDIA_NEEDED = 0x0400, /* media-needed */ - _IPP_PSTATE_MOVING_TO_PAUSED = 0x0800, + _IPP_PREASON_MEDIA_EMPTY = 0x0080, /* media-empty */ + _IPP_PREASON_MEDIA_JAM = 0x0100, /* media-jam */ + _IPP_PREASON_MEDIA_LOW = 0x0200, /* media-low */ + _IPP_PREASON_MEDIA_NEEDED = 0x0400, /* media-needed */ + _IPP_PREASON_MOVING_TO_PAUSED = 0x0800, /* moving-to-paused */ - _IPP_PSTATE_PAUSED = 0x1000, /* paused */ - _IPP_PSTATE_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */ - _IPP_PSTATE_TONER_EMPTY = 0x4000, /* toner-empty */ - _IPP_PSTATE_TONER_LOW = 0x8000 /* toner-low */ + _IPP_PREASON_PAUSED = 0x1000, /* paused */ + _IPP_PREASON_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */ + _IPP_PREASON_TONER_EMPTY = 0x4000, /* toner-empty */ + _IPP_PREASON_TONER_LOW = 0x8000 /* toner-low */ }; -typedef unsigned int _ipp_preasons_t; /* Bitfield for printer-state-reasons */ +typedef unsigned int _ipp_preason_t; /* Bitfield for printer-state-reasons */ typedef enum _ipp_media_class_e { @@ -94,6 +111,21 @@ typedef enum _ipp_media_class_e _IPP_ENV_ONLY /* Envelope-only size */ } _ipp_media_class_t; +typedef enum _ipp_media_size_e +{ + _IPP_MEDIA_SIZE_NONE = -1, + _IPP_MEDIA_SIZE_A4, + _IPP_MEDIA_SIZE_A5, + _IPP_MEDIA_SIZE_A6, + _IPP_MEDIA_SIZE_DL, + _IPP_MEDIA_SIZE_LEGAL, + _IPP_MEDIA_SIZE_LETTER, + _IPP_MEDIA_SIZE_COM10, + _IPP_MEDIA_SIZE_3x5, + _IPP_MEDIA_SIZE_L, + _IPP_MEDIA_SIZE_4x6, + _IPP_MEDIA_SIZE_5x7 +} _ipp_media_size_t; static const char * const media_supported[] = { /* media-supported values */ "iso_a4_210x297mm", /* A4 */ @@ -122,6 +154,43 @@ static const int media_col_sizes[][3] = { 10160, 15240, _IPP_PHOTO_ONLY }, /* 4x6 */ { 12700, 17780, _IPP_PHOTO_ONLY } /* 5x7 aka 2L */ }; + +typedef enum _ipp_media_source_e +{ + _IPP_MEDIA_SOURCE_NONE = -1, + _IPP_MEDIA_SOURCE_AUTO, + _IPP_MEDIA_SOURCE_MAIN, + _IPP_MEDIA_SOURCE_MANUAL, + _IPP_MEDIA_SOURCE_ENVELOPE, + _IPP_MEDIA_SOURCE_PHOTO +} _ipp_media_source_t; +static const char * const media_source_supported[] = + /* media-source-supported values */ +{ + "auto", + "main", + "manual", + "envelope", + "photo" +}; + +typedef enum _ipp_media_type_e +{ + _IPP_MEDIA_TYPE_NONE = -1, + _IPP_MEDIA_TYPE_AUTO, + _IPP_MEDIA_TYPE_CARDSTOCK, + _IPP_MEDIA_TYPE_ENVELOPE, + _IPP_MEDIA_TYPE_LABELS, + _IPP_MEDIA_TYPE_OTHER, + _IPP_MEDIA_TYPE_GLOSSY, + _IPP_MEDIA_TYPE_HIGH_GLOSS, + _IPP_MEDIA_TYPE_MATTE, + _IPP_MEDIA_TYPE_SATIN, + _IPP_MEDIA_TYPE_SEMI_GLOSS, + _IPP_MEDIA_TYPE_STATIONERY, + _IPP_MEDIA_TYPE_LETTERHEAD, + _IPP_MEDIA_TYPE_TRANSPARENCY +} _ipp_media_type_t; static const char * const media_type_supported[] = /* media-type-supported values */ { @@ -140,11 +209,34 @@ static const char * const media_type_supported[] = "transparency" }; +typedef enum _ipp_supply_e +{ + _IPP_SUPPLY_CYAN, /* Cyan Toner */ + _IPP_SUPPLY_MAGENTA, /* Magenta Toner */ + _IPP_SUPPLY_YELLOW, /* Yellow Toner */ + _IPP_SUPPLY_BLACK, /* Black Toner */ + _IPP_SUPPLY_WASTE /* Waste Toner */ +} _ipp_supply_t; +static const char * const printer_supplies[] = +{ /* printer-supply-description values */ + "Cyan Toner", + "Magenta Toner", + "Yellow Toner", + "Black Toner", + "Toner Waste" +}; + /* * Structures... */ +typedef struct _ipp_filter_s /**** Attribute filter ****/ +{ + cups_array_t *ra; /* Requested attributes */ + ipp_tag_t group_tag; /* Group to copy */ +} _ipp_filter_t; + typedef struct _ipp_job_s _ipp_job_t; typedef struct _ipp_printer_s /**** Printer data ****/ @@ -171,12 +263,24 @@ typedef struct _ipp_printer_s /**** Printer data ****/ int port; /* Port */ size_t urilen; /* Length of printer URI */ ipp_t *attrs; /* Static attributes */ + time_t start_time; /* Startup time */ + time_t config_time; /* printer-config-change-time */ ipp_pstate_t state; /* printer-state value */ - _ipp_preasons_t state_reasons; /* printer-state-reasons values */ + _ipp_preason_t state_reasons; /* printer-state-reasons values */ + time_t state_time; /* printer-state-change-time */ cups_array_t *jobs; /* Jobs */ _ipp_job_t *active_job; /* Current active/pending job */ int next_job_id; /* Next job-id value */ _cups_rwlock_t rwlock; /* Printer lock */ + _ipp_media_size_t main_size; /* Ready media */ + _ipp_media_type_t main_type; + int main_level; + _ipp_media_size_t envelope_size; + int envelope_level; + _ipp_media_size_t photo_size; + _ipp_media_type_t photo_type; + int photo_level; + int supplies[5]; /* Supply levels (0-100) */ } _ipp_printer_t; struct _ipp_job_s /**** Job data ****/ @@ -186,8 +290,11 @@ struct _ipp_job_s /**** Job data ****/ *username, /* job-originating-user-name */ *format; /* document-format */ ipp_jstate_t state; /* job-state value */ - time_t processing, /* time-at-processing value */ + time_t created, /* time-at-creation value */ + processing, /* time-at-processing value */ completed; /* time-at-completed value */ + int impressions, /* job-impressions value */ + impcompleted; /* job-impressions-completed value */ ipp_t *attrs; /* Static attributes */ int cancel; /* Non-zero when job canceled */ char *filename; /* Print file name */ @@ -203,7 +310,8 @@ typedef struct _ipp_client_s /**** Client data ****/ time_t start; /* Request start time */ http_state_t operation; /* Request operation */ ipp_op_t operation_id; /* IPP operation-id */ - char uri[1024]; /* Request URI */ + char uri[1024], /* Request URI */ + *options; /* URI options */ http_addr_t addr; /* Client address */ char hostname[256]; /* Client hostname */ _ipp_printer_t *printer; /* Printer */ @@ -223,9 +331,8 @@ static void copy_job_attributes(_ipp_client_t *client, _ipp_job_t *job, cups_array_t *ra); static _ipp_client_t *create_client(_ipp_printer_t *printer, int sock); static _ipp_job_t *create_job(_ipp_client_t *client); -static int create_listener(int family, int *port); -static ipp_t *create_media_col(const char *media, const char *type, - int width, int length, int margins); +static int create_listener(int family, int port); +static ipp_t *create_media_col(const char *media, const char *source, const char *type, int width, int length, int margins); static ipp_t *create_media_size(int width, int length); static _ipp_printer_t *create_printer(const char *servername, const char *name, const char *location, @@ -253,32 +360,34 @@ static void dnssd_callback(DNSServiceRef sdRef, const char *domain, _ipp_printer_t *printer); #endif /* HAVE_DNSSD */ +static int filter_cb(_ipp_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr); static _ipp_job_t *find_job(_ipp_client_t *client); static void html_escape(_ipp_client_t *client, const char *s, size_t slen); +static void html_footer(_ipp_client_t *client); +static void html_header(_ipp_client_t *client, const char *title); static void html_printf(_ipp_client_t *client, const char *format, ...) __attribute__((__format__(__printf__, 2, 3))); static void ipp_cancel_job(_ipp_client_t *client); +static void ipp_close_job(_ipp_client_t *client); static void ipp_create_job(_ipp_client_t *client); static void ipp_get_job_attributes(_ipp_client_t *client); static void ipp_get_jobs(_ipp_client_t *client); static void ipp_get_printer_attributes(_ipp_client_t *client); +static void ipp_identify_printer(_ipp_client_t *client); static void ipp_print_job(_ipp_client_t *client); static void ipp_print_uri(_ipp_client_t *client); static void ipp_send_document(_ipp_client_t *client); static void ipp_send_uri(_ipp_client_t *client); static void ipp_validate_job(_ipp_client_t *client); +static int parse_options(_ipp_client_t *client, cups_option_t **options); static void *process_client(_ipp_client_t *client); static int process_http(_ipp_client_t *client); static int process_ipp(_ipp_client_t *client); static void *process_job(_ipp_job_t *job); #ifdef HAVE_DNSSD -static int register_printer(_ipp_printer_t *printer, - const char *location, const char *make, - const char *model, const char *formats, - const char *adminurl, int color, - int duplex, const char *regtype); +static int register_printer(_ipp_printer_t *printer, const char *location, const char *make, const char *model, const char *formats, const char *adminurl, const char *uuid, int color, int duplex, const char *regtype); #endif /* HAVE_DNSSD */ static int respond_http(_ipp_client_t *client, http_status_t code, const char *content_coding, @@ -289,6 +398,7 @@ static void respond_ipp(_ipp_client_t *client, ipp_status_t status, static void respond_unsupported(_ipp_client_t *client, ipp_attribute_t *attr); static void run_printer(_ipp_printer_t *printer); +static char *time_string(time_t tv, char *buffer, size_t bufsize); static void usage(int status) __attribute__((noreturn)); static int valid_doc_attributes(_ipp_client_t *client); static int valid_job_attributes(_ipp_client_t *client); @@ -327,12 +437,13 @@ main(int argc, /* I - Number of command-line args */ #ifdef HAVE_DNSSD const char *subtype = "_print"; /* Bonjour service subtype */ #endif /* HAVE_DNSSD */ - int port = 8631, /* Port number (0 = auto) */ + int port = 0, /* Port number (0 = auto) */ duplex = 0, /* Duplex mode */ ppm = 10, /* Pages per minute for mono */ ppm_color = 0, /* Pages per minute for color */ pin = 0; /* PIN printing mode? */ - char directory[1024] = ""; /* Spool directory */ + char directory[1024] = "", /* Spool directory */ + hostname[1024]; /* Auto-detected hostname */ _ipp_printer_t *printer; /* Printer object */ @@ -479,6 +590,30 @@ main(int argc, /* I - Number of command-line args */ * Apply defaults as needed... */ + if (!servername) + servername = httpGetHostname(NULL, hostname, sizeof(hostname)); + + if (!port) + { +#ifdef WIN32 + /* + * Windows is almost always used as a single user system, so use a default port + * number of 8631. + */ + + port = 8631; + +#else + /* + * Use 8000 + UID mod 1000 for the default port number... + */ + + port = 8000 + ((int)getuid() % 1000); +#endif /* WIN32 */ + + fprintf(stderr, "Listening on port %d.\n", port); + } + if (!directory[0]) { snprintf(directory, sizeof(directory), "/tmp/ippserver.%d", (int)getpid()); @@ -580,30 +715,13 @@ copy_attributes(ipp_t *to, /* I - Destination request */ ipp_tag_t group_tag, /* I - Group to copy */ int quickcopy) /* I - Do a quick copy? */ { - ipp_attribute_t *fromattr; /* Source attribute */ - - - if (!to || !from) - return; - - for (fromattr = ippFirstAttribute(from); - fromattr; - fromattr = ippNextAttribute(from)) - { - /* - * Filter attributes as needed... - */ + _ipp_filter_t filter; /* Filter data */ - ipp_tag_t fromgroup = ippGetGroupTag(fromattr); - const char *fromname = ippGetName(fromattr); - if ((group_tag != IPP_TAG_ZERO && fromgroup != group_tag && - fromgroup != IPP_TAG_ZERO) || !fromname) - continue; + filter.ra = ra; + filter.group_tag = group_tag; - if (!ra || cupsArrayFind(ra, (void *)fromname)) - ippCopyAttribute(to, fromattr, quickcopy); - } + ippCopyAttributes(to, from, quickcopy, (ipp_copycb_t)filter_cb, &filter); } @@ -619,14 +737,77 @@ copy_job_attributes( { copy_attributes(client->response, job->attrs, ra, IPP_TAG_JOB, 0); + if (!ra || cupsArrayFind(ra, "date-time-at-completed")) + { + if (job->completed) + ippAddDate(client->response, IPP_TAG_JOB, "date-time-at-completed", ippTimeToDate(job->completed)); + else + ippAddOutOfBand(client->response, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-completed"); + } + + if (!ra || cupsArrayFind(ra, "date-time-at-processing")) + { + if (job->processing) + ippAddDate(client->response, IPP_TAG_JOB, "date-time-at-processing", ippTimeToDate(job->processing)); + else + ippAddOutOfBand(client->response, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-processing"); + } + + if (!ra || cupsArrayFind(ra, "job-impressions")) + ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions", job->impressions); + + if (!ra || cupsArrayFind(ra, "job-impressions-completed")) + ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", job->impcompleted); + if (!ra || cupsArrayFind(ra, "job-printer-up-time")) - ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, - "job-printer-up-time", (int)time(NULL)); + ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-printer-up-time", (int)(time(NULL) - client->printer->start_time)); if (!ra || cupsArrayFind(ra, "job-state")) ippAddInteger(client->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", job->state); + if (!ra || cupsArrayFind(ra, "job-state-message")) + { + switch (job->state) + { + case IPP_JSTATE_PENDING : + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job pending."); + break; + + case IPP_JSTATE_HELD : + if (job->fd >= 0) + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job incoming."); + else if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO)) + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job held."); + else + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job created."); + break; + + case IPP_JSTATE_PROCESSING : + if (job->cancel) + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job canceling."); + else + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job printing."); + break; + + case IPP_JSTATE_STOPPED : + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job stopped."); + break; + + case IPP_JSTATE_CANCELED : + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job canceled."); + break; + + case IPP_JSTATE_ABORTED : + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job aborted."); + break; + + case IPP_JSTATE_COMPLETED : + ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, "Job completed."); + break; + } + } + if (!ra || cupsArrayFind(ra, "job-state-reasons")) { switch (job->state) @@ -692,12 +873,12 @@ copy_job_attributes( if (!ra || cupsArrayFind(ra, "time-at-completed")) ippAddInteger(client->response, IPP_TAG_JOB, job->completed ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE, - "time-at-completed", (int)job->completed); + "time-at-completed", (int)(job->completed - client->printer->start_time)); if (!ra || cupsArrayFind(ra, "time-at-processing")) ippAddInteger(client->response, IPP_TAG_JOB, job->processing ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE, - "time-at-processing", (int)job->processing); + "time-at-processing", (int)(job->processing - client->printer->start_time)); } @@ -753,7 +934,8 @@ create_job(_ipp_client_t *client) /* I - Client */ { _ipp_job_t *job; /* Job */ ipp_attribute_t *attr; /* Job attribute */ - char uri[1024]; /* job-uri value */ + char uri[1024], /* job-uri value */ + uuid[64]; /* job-uuid value */ _cupsRWLockWrite(&(client->printer->rwlock)); @@ -779,44 +961,42 @@ create_job(_ipp_client_t *client) /* I - Client */ } job->printer = client->printer; - job->attrs = client->request; + job->attrs = ippNew(); job->state = IPP_JSTATE_HELD; job->fd = -1; - client->request = NULL; /* - * Set all but the first two attributes to the job attributes group... + * Copy all of the job attributes... */ - for (ippFirstAttribute(job->attrs), - ippNextAttribute(job->attrs), - attr = ippNextAttribute(job->attrs); - attr; - attr = ippNextAttribute(job->attrs)) - ippSetGroupTag(job->attrs, &attr, IPP_TAG_JOB); + copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0); /* * Get the requesting-user-name, document format, and priority... */ - if ((attr = ippFindAttribute(job->attrs, "requesting-user-name", - IPP_TAG_NAME)) != NULL) - ippSetName(job->attrs, &attr, "job-originating-user-name"); - else - attr = ippAddString(job->attrs, IPP_TAG_JOB, - IPP_CONST_TAG(IPP_TAG_NAME), - "job-originating-user-name", NULL, "anonymous"); - - if (attr) + if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) != NULL) job->username = ippGetString(attr, 0, NULL); else job->username = "anonymous"; - if ((attr = ippFindAttribute(job->attrs, "document-format", - IPP_TAG_MIMETYPE)) != NULL) - job->format = ippGetString(attr, 0, NULL); - else - job->format = "application/octet-stream"; + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-user-name", NULL, job->username); + + if (ippGetOperation(client->request) != IPP_OP_CREATE_JOB) + { + if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL) + job->format = ippGetString(attr, 0, NULL); + else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL) + job->format = ippGetString(attr, 0, NULL); + else + job->format = "application/octet-stream"; + } + + if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_INTEGER)) != NULL) + job->impressions = ippGetInteger(attr, 0); + + if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_NAME)) != NULL) + job->name = ippGetString(attr, 0, NULL); /* * Add job description attributes and add to the jobs array... @@ -825,13 +1005,14 @@ create_job(_ipp_client_t *client) /* I - Client */ job->id = client->printer->next_job_id ++; snprintf(uri, sizeof(uri), "%s/%d", client->printer->uri, job->id); + httpAssembleUUID(client->printer->hostname, client->printer->port, client->printer->name, job->id, uuid, sizeof(uuid)); + ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(&job->created))); ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, uri); - ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, - client->printer->uri); - ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", - (int)time(NULL)); + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, uuid); + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, client->printer->uri); + ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)(job->created - client->printer->start_time)); cupsArrayAdd(client->printer->jobs, job); client->printer->active_job = job; @@ -842,30 +1023,85 @@ create_job(_ipp_client_t *client) /* I - Client */ } +/* + * 'create_job_filename()' - Create the filename for a document in a job. + */ + +static void create_job_filename( + _ipp_printer_t *printer, /* I - Printer */ + _ipp_job_t *job, /* I - Job */ + char *fname, /* I - Filename buffer */ + size_t fnamesize) /* I - Size of filename buffer */ +{ + char name[256], /* "Safe" filename */ + *nameptr; /* Pointer into filename */ + const char *ext, /* Filename extension */ + *job_name; /* job-name value */ + ipp_attribute_t *job_name_attr; /* job-name attribute */ + + + /* + * Make a name from the job-name attribute... + */ + + if ((job_name_attr = ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME)) != NULL) + job_name = ippGetString(job_name_attr, 0, NULL); + else + job_name = "untitled"; + + for (nameptr = name; *job_name && nameptr < (name + sizeof(name) - 1); job_name ++) + if (isalnum(*job_name & 255) || *job_name == '-') + *nameptr++ = (char)tolower(*job_name & 255); + else + *nameptr++ = '_'; + + *nameptr = '\0'; + + /* + * Figure out the extension... + */ + + if (!strcasecmp(job->format, "image/jpeg")) + ext = "jpg"; + else if (!strcasecmp(job->format, "image/png")) + ext = "png"; + else if (!strcasecmp(job->format, "image/pwg-raster")) + ext = "ras"; + else if (!strcasecmp(job->format, "image/urf")) + ext = "urf"; + else if (!strcasecmp(job->format, "application/pdf")) + ext = "pdf"; + else if (!strcasecmp(job->format, "application/postscript")) + ext = "ps"; + else + ext = "prn"; + + /* + * Create a filename with the job-id, job-name, and document-format (extension)... + */ + + snprintf(fname, fnamesize, "%s/%d-%s.%s", printer->directory, job->id, name, ext); +} + + /* * 'create_listener()' - Create a listener socket. */ -static int /* O - Listener socket or -1 on error */ -create_listener(int family, /* I - Address family */ - int *port) /* IO - Port number */ +static int /* O - Listener socket or -1 on error */ +create_listener(int family, /* I - Address family */ + int port) /* I - Port number */ { int sock; /* Listener socket */ http_addrlist_t *addrlist; /* Listen address */ char service[255]; /* Service port */ - if (!*port) - { - *port = 8000 + (getuid() % 1000); - fprintf(stderr, "Listening on port %d.\n", *port); - } - - snprintf(service, sizeof(service), "%d", *port); + snprintf(service, sizeof(service), "%d", port); if ((addrlist = httpAddrGetList(NULL, family, service)) == NULL) return (-1); - sock = httpAddrListen(&(addrlist->addr), *port); + sock = httpAddrListen(&(addrlist->addr), port); httpAddrFreeList(addrlist); @@ -879,7 +1115,8 @@ create_listener(int family, /* I - Address family */ static ipp_t * /* O - media-col collection */ create_media_col(const char *media, /* I - Media name */ - const char *type, /* I - Nedua type */ + const char *source, /* I - Media source */ + const char *type, /* I - Media type */ int width, /* I - x-dimension in 2540ths */ int length, /* I - y-dimension in 2540ths */ int margins) /* I - Value for margins */ @@ -890,12 +1127,19 @@ create_media_col(const char *media, /* I - Media name */ char media_key[256]; /* media-key value */ - snprintf(media_key, sizeof(media_key), "%s_%s%s", media, type, - margins == 0 ? "_borderless" : ""); + if (type && source) + snprintf(media_key, sizeof(media_key), "%s_%s_%s%s", media, source, type, margins == 0 ? "_borderless" : ""); + else if (type) + snprintf(media_key, sizeof(media_key), "%s__%s%s", media, type, margins == 0 ? "_borderless" : ""); + else if (source) + snprintf(media_key, sizeof(media_key), "%s_%s%s", media, source, margins == 0 ? "_borderless" : ""); + else + snprintf(media_key, sizeof(media_key), "%s%s", media, margins == 0 ? "_borderless" : ""); ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-key", NULL, media_key); ippAddCollection(media_col, IPP_TAG_PRINTER, "media-size", media_size); + ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-size-name", NULL, media); ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin", margins); ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, @@ -904,8 +1148,10 @@ create_media_col(const char *media, /* I - Media name */ "media-right-margin", margins); ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin", margins); - ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type", - NULL, type); + if (source) + ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-source", NULL, source); + if (type) + ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type", NULL, type); ippDelete(media_size); @@ -959,12 +1205,16 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) { int i, j; /* Looping vars */ _ipp_printer_t *printer; /* Printer */ - char hostname[256], /* Hostname */ - uri[1024], /* Printer URI */ +#ifndef WIN32 + char path[1024]; /* Full path to command */ +#endif /* !WIN32 */ + char uri[1024], /* Printer URI */ icons[1024], /* printer-icons URI */ adminurl[1024], /* printer-more-info URI */ + supplyurl[1024],/* printer-supply-info-uri URI */ device_id[1024],/* printer-device-id */ - make_model[128];/* printer-make-and-model */ + make_model[128],/* printer-make-and-model */ + uuid[128]; /* printer-uuid */ int num_formats; /* Number of document-format-supported values */ char *defformat, /* document-format-default value */ *formats[100], /* document-format-supported values */ @@ -999,6 +1249,10 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) "1.1", "2.0" }; + static const char * const features[] =/* ipp-features-supported values */ + { + "ipp-everywhere" + }; static const int ops[] = /* operations-supported values */ { IPP_OP_PRINT_JOB, @@ -1010,7 +1264,10 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) IPP_OP_CANCEL_JOB, IPP_OP_GET_JOB_ATTRIBUTES, IPP_OP_GET_JOBS, - IPP_OP_GET_PRINTER_ATTRIBUTES + IPP_OP_GET_PRINTER_ATTRIBUTES, + IPP_OP_CANCEL_MY_JOBS, + IPP_OP_CLOSE_JOB, + IPP_OP_IDENTIFY_PRINTER }; static const char * const charsets[] =/* charset-supported values */ { @@ -1025,6 +1282,11 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) #endif /* HAVE_LIBZ */ "none" }; + static const char * const identify_actions[] = + { + "display", + "sound" + }; static const char * const job_creation[] = { /* job-creation-attributes-supported values */ "copies", @@ -1047,6 +1309,7 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) "media-left-margin", "media-right-margin", "media-size", + "media-source", "media-top-margin", "media-type" }; @@ -1060,6 +1323,17 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) "separate-documents-uncollated-copies", "separate-documents-collated-copies" }; + static const char * const overrides[] = + { /* overrides-supported */ + "document-number", + "pages" + }; + static const char * const print_color_mode_supported[] = + { /* print-color-mode-supported values */ + "auto", + "color", + "monochrome" + }; static const int print_quality_supported[] = { /* print-quality-supported values */ IPP_QUALITY_DRAFT, @@ -1095,6 +1369,17 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) "two-sided-long-edge", "two-sided-short-edge" }; + static const char * const urf_supported[] = + { /* urf-supported values */ + "CP1", + "IS1-5-7", + "MT1-2-3-4-5-6-8-9-10-11-12-13", + "RS600", + "SRGB24", + "V1.4", + "W8", + "DM1" + }; static const char * const which_jobs[] = { /* which-jobs-supported values */ "completed", @@ -1109,13 +1394,41 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) }; +#ifndef WIN32 + /* + * If a command was specified, make sure it exists and is executable... + */ + + if (command) + { + if (*command == '/' || !strncmp(command, "./", 2)) + { + if (access(command, X_OK)) + { + fprintf(stderr, "ippserver: Unable to execute command \"%s\": %s\n", command, strerror(errno)); + return (NULL); + } + } + else + { + if (!cupsFileFind(command, getenv("PATH"), 1, path, sizeof(path))) + { + fprintf(stderr, "ippserver: Unable to find command \"%s\".\n", command); + return (NULL); + } + + command = path; + } + } +#endif /* !WIN32 */ + /* * Allocate memory for the printer... */ if ((printer = calloc(1, sizeof(_ipp_printer_t))) == NULL) { - perror("Unable to allocate memory for printer"); + perror("ippserver: Unable to allocate memory for printer"); return (NULL); } @@ -1127,12 +1440,13 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) #endif /* HAVE_DNSSD */ printer->command = command ? strdup(command) : NULL; printer->directory = strdup(directory); - printer->hostname = strdup(servername ? servername : - httpGetHostname(NULL, hostname, - sizeof(hostname))); + printer->hostname = strdup(servername); printer->port = port; + printer->start_time = time(NULL); + printer->config_time = printer->start_time; printer->state = IPP_PSTATE_IDLE; - printer->state_reasons = _IPP_PSTATE_NONE; + printer->state_reasons = _IPP_PREASON_NONE; + printer->state_time = printer->start_time; printer->jobs = cupsArrayNew((cups_array_func_t)compare_jobs, NULL); printer->next_job_id = 1; @@ -1144,19 +1458,36 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) if (icon) printer->icon = strdup(icon); + printer->main_size = _IPP_MEDIA_SIZE_A4; + printer->main_type = _IPP_MEDIA_TYPE_STATIONERY; + printer->main_level = 500; + + printer->envelope_size = _IPP_MEDIA_SIZE_NONE; + printer->envelope_level = 0; + + printer->photo_size = _IPP_MEDIA_SIZE_NONE; + printer->photo_type = _IPP_MEDIA_TYPE_NONE; + printer->photo_level = 0; + + printer->supplies[_IPP_SUPPLY_CYAN] = 100; + printer->supplies[_IPP_SUPPLY_MAGENTA] = 100; + printer->supplies[_IPP_SUPPLY_YELLOW] = 100; + printer->supplies[_IPP_SUPPLY_BLACK] = 100; + printer->supplies[_IPP_SUPPLY_WASTE] = 0; + _cupsRWInit(&(printer->rwlock)); /* * Create the listener sockets... */ - if ((printer->ipv4 = create_listener(AF_INET, &(printer->port))) < 0) + if ((printer->ipv4 = create_listener(AF_INET, printer->port)) < 0) { perror("Unable to create IPv4 listener"); goto bad_printer; } - if ((printer->ipv6 = create_listener(AF_INET6, &(printer->port))) < 0) + if ((printer->ipv6 = create_listener(AF_INET6, printer->port)) < 0) { perror("Unable to create IPv6 listener"); goto bad_printer; @@ -1168,12 +1499,13 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) httpAssembleURI(HTTP_URI_CODING_ALL, icons, sizeof(icons), "http", NULL, printer->hostname, printer->port, "/icon.png"); - httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), "http", NULL, - printer->hostname, printer->port, "/"); + httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), "http", NULL, printer->hostname, printer->port, "/"); + httpAssembleURI(HTTP_URI_CODING_ALL, supplyurl, sizeof(supplyurl), "http", NULL, printer->hostname, printer->port, "/supplies"); if (Verbosity) { fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl); + fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl); fprintf(stderr, "printer-uri=\"%s\"\n", uri); } @@ -1187,7 +1519,7 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) *ptr++ = '\0'; formats[num_formats++] = ptr; - if (!_cups_strcasecmp(ptr, "application/octet-stream")) + if (!strcasecmp(ptr, "application/octet-stream")) defformat = ptr; } @@ -1196,23 +1528,27 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) prefix = "CMD:"; for (i = 0; i < num_formats; i ++) { - if (!_cups_strcasecmp(formats[i], "application/pdf")) + if (!strcasecmp(formats[i], "application/pdf")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPDF", prefix); - else if (!_cups_strcasecmp(formats[i], "application/postscript")) + else if (!strcasecmp(formats[i], "application/postscript")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPS", prefix); - else if (!_cups_strcasecmp(formats[i], "application/vnd.hp-PCL")) + else if (!strcasecmp(formats[i], "application/vnd.hp-PCL")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPCL", prefix); - else if (!_cups_strcasecmp(formats[i], "image/jpeg")) + else if (!strcasecmp(formats[i], "image/jpeg")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sJPEG", prefix); - else if (!_cups_strcasecmp(formats[i], "image/png")) + else if (!strcasecmp(formats[i], "image/png")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPNG", prefix); - else if (_cups_strcasecmp(formats[i], "application/octet-stream")) + else if (strcasecmp(formats[i], "application/octet-stream")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%s%s", prefix, formats[i]); ptr += strlen(ptr); prefix = ","; } - strlcat(device_id, ";", sizeof(device_id)); + if (ptr < (device_id + sizeof(device_id) - 1)) + { + *ptr++ = ';'; + *ptr = '\0'; + } /* * Get the maximum spool size based on the size of the filesystem used for @@ -1287,6 +1623,9 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) "document-format-supported", num_formats, NULL, (const char * const *)formats); + /* document-password-supported */ + ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 127); + /* finishings-default */ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE); @@ -1300,25 +1639,35 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) IPP_CONST_TAG(IPP_TAG_LANGUAGE), "generated-natural-language-supported", NULL, "en"); + /* identify-actions-default */ + ippAddString (printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-default", NULL, "sound"); + + /* identify-actions-supported */ + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-supported", sizeof(identify_actions) / sizeof(identify_actions[0]), NULL, identify_actions); + + /* ipp-features-supported */ + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-features-supported", sizeof(features) / sizeof(features[0]), NULL, features); + /* ipp-versions-supported */ - ippAddStrings(printer->attrs, IPP_TAG_PRINTER, - IPP_CONST_TAG(IPP_TAG_KEYWORD), - "ipp-versions-supported", - sizeof(versions) / sizeof(versions[0]), NULL, versions); + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", sizeof(versions) / sizeof(versions[0]), NULL, versions); + + /* job-account-id-default */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-account-id-default", NULL, ""); /* job-account-id-supported */ ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-account-id-supported", 1); + /* job-accounting-user-id-default */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-accounting-user-id-default", NULL, ""); + /* job-accounting-user-id-supported */ - ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, - "job-accounting-user-id-supported", 1); + ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-accounting-user-id-supported", 1); /* job-creation-attributes-supported */ - ippAddStrings(printer->attrs, IPP_TAG_PRINTER, - IPP_CONST_TAG(IPP_TAG_KEYWORD), - "job-creation-attributes-supported", - sizeof(job_creation) / sizeof(job_creation[0]), - NULL, job_creation); + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-creation-attributes-supported", sizeof(job_creation) / sizeof(job_creation[0]), NULL, job_creation); + + /* job-ids-supported */ + ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-ids-supported", 1); /* job-k-octets-supported */ ippAddRange(printer->attrs, IPP_TAG_PRINTER, "job-k-octets-supported", 0, @@ -1328,6 +1677,9 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-password-supported", 4); + /* job-preferred-attributes-supported */ + ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-preferred-attributes-supported", 0); + /* job-priority-default */ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-default", 50); @@ -1359,13 +1711,11 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) i ++) { if (media_col_sizes[i][2] == _IPP_ENV_ONLY) - num_database += 2; /* auto + envelope */ + num_database += 3; /* auto + manual + envelope */ else if (media_col_sizes[i][2] == _IPP_PHOTO_ONLY) - num_database += 12; /* auto + photographic-* + borderless */ + num_database += 6 * 3; /* auto + photographic-* from auto, manual, and photo */ else - num_database += (int)(sizeof(media_type_supported) / - sizeof(media_type_supported[0])) + 6; - /* All types + borderless */ + num_database += 2; /* Regular + borderless */ } media_col_database = ippAddCollections(printer->attrs, IPP_TAG_PRINTER, @@ -1375,49 +1725,52 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0])); i ++) { - for (j = 0; - j < (int)(sizeof(media_type_supported) / - sizeof(media_type_supported[0])); - j ++) + switch (media_col_sizes[i][2]) { - if (media_col_sizes[i][2] == _IPP_ENV_ONLY && - strcmp(media_type_supported[j], "auto") && - strcmp(media_type_supported[j], "envelope")) - continue; - else if (media_col_sizes[i][2] == _IPP_PHOTO_ONLY && - strcmp(media_type_supported[j], "auto") && - strncmp(media_type_supported[j], "photographic-", 13)) - continue; + case _IPP_GENERAL : + /* + * Regular + borderless for the general class; no source/type + * selectors... + */ - ippSetCollection(printer->attrs, &media_col_database, media_col_index, - create_media_col(media_supported[i], - media_type_supported[j], - media_col_sizes[i][0], - media_col_sizes[i][1], - media_xxx_margin_supported[1])); - media_col_index ++; - - if (media_col_sizes[i][2] != _IPP_ENV_ONLY && - (!strcmp(media_type_supported[j], "auto") || - !strncmp(media_type_supported[j], "photographic-", 13))) - { - /* - * Add borderless version for this combination... - */ + ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], NULL, NULL, media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1])); + ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], NULL, NULL, media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0])); + break; - ippSetCollection(printer->attrs, &media_col_database, media_col_index, - create_media_col(media_supported[i], - media_type_supported[j], - media_col_sizes[i][0], - media_col_sizes[i][1], - media_xxx_margin_supported[0])); - media_col_index ++; - } + case _IPP_ENV_ONLY : + /* + * Regular margins for "auto", "manual", and "envelope" sources. + */ + + ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "auto", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1])); + ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "manual", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1])); + ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "envelope", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1])); + break; + case _IPP_PHOTO_ONLY : + /* + * Photos have specific media types and can only be printed via + * the auto, manual, and photo sources... + */ + + for (j = 0; + j < (int)(sizeof(media_type_supported) / + sizeof(media_type_supported[0])); + j ++) + { + if (strcmp(media_type_supported[j], "auto") && strncmp(media_type_supported[j], "photographic-", 13)) + continue; + + ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "auto", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0])); + ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "manual", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0])); + ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "photo", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0])); + } + break; } } /* media-col-default */ media_col_default = create_media_col(media_supported[0], + media_source_supported[0], media_type_supported[0], media_col_sizes[0][0], media_col_sizes[0][1], @@ -1474,6 +1827,9 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) create_media_size(media_col_sizes[i][0], media_col_sizes[i][1])); + /* media-source-supported */ + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-source-supported", (int)(sizeof(media_source_supported) / sizeof(media_source_supported[0])), NULL, media_source_supported); + /* media-top-margin-supported */ ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", @@ -1482,24 +1838,19 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) media_xxx_margin_supported); /* media-type-supported */ - ippAddStrings(printer->attrs, IPP_TAG_PRINTER, - IPP_CONST_TAG(IPP_TAG_KEYWORD), - "media-type-supported", - (int)(sizeof(media_type_supported) / - sizeof(media_type_supported[0])), - NULL, media_type_supported); + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-type-supported", (int)(sizeof(media_type_supported) / sizeof(media_type_supported[0])), NULL, media_type_supported); /* multiple-document-handling-supported */ - ippAddStrings(printer->attrs, IPP_TAG_PRINTER, - IPP_CONST_TAG(IPP_TAG_KEYWORD), - "multiple-document-handling-supported", - sizeof(multiple_document_handling) / - sizeof(multiple_document_handling[0]), NULL, - multiple_document_handling); + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-document-handling-supported", sizeof(multiple_document_handling) / sizeof(multiple_document_handling[0]), NULL, multiple_document_handling); /* multiple-document-jobs-supported */ - ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, - "multiple-document-jobs-supported", 0); + ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "multiple-document-jobs-supported", 0); + + /* multiple-operation-time-out */ + ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "multiple-operation-time-out", 60); + + /* multiple-operation-time-out-action */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-operation-time-out-action", NULL, "abort-job"); /* natural-language-configured */ ippAddString(printer->attrs, IPP_TAG_PRINTER, @@ -1536,6 +1887,12 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-down"); + /* overrides-supported */ + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "overrides-supported", (int)(sizeof(overrides) / sizeof(overrides[0])), NULL, overrides); + + /* page-ranges-supported */ + ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "page-ranges-supported", 1); + /* pages-per-minute */ ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute", ppm); @@ -1550,21 +1907,40 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) IPP_CONST_TAG(IPP_TAG_KEYWORD), "pdl-override-supported", NULL, "attempted"); + /* print-color-mode-default */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-default", NULL, "auto"); + + /* print-color-mode-supported */ + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported) / sizeof(print_color_mode_supported[0])), NULL, print_color_mode_supported); + + /* print-content-optimize-default */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-default", NULL, "auto"); + + /* print-content-optimize-supported */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-supported", NULL, "auto"); + + /* print-rendering-intent-default */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-default", NULL, "auto"); + + /* print-rendering-intent-supported */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-supported", NULL, "auto"); + /* print-quality-default */ - ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, - "print-quality-default", IPP_QUALITY_NORMAL); + ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-default", IPP_QUALITY_NORMAL); /* print-quality-supported */ - ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, - "print-quality-supported", - (int)(sizeof(print_quality_supported) / - sizeof(print_quality_supported[0])), - print_quality_supported); + ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-supported", (int)(sizeof(print_quality_supported) / sizeof(print_quality_supported[0])), print_quality_supported); /* printer-device-id */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, device_id); + /* printer-get-attributes-supported */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-get-attributes-supported", NULL, "document-format"); + + /* printer-geo-location */ + ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location", 0); + /* printer-icons */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", NULL, icons); @@ -1600,13 +1976,18 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) } /* printer-more-info */ - ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, - "printer-more-info", NULL, adminurl); + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, adminurl); /* printer-name */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name); + /* printer-organization */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organization", NULL, "Apple Inc."); + + /* printer-organizational-unit */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organizational-unit", NULL, "Printing Engineering"); + /* printer-resolution-default */ ippAddResolution(printer->attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, 600, 600); @@ -1615,13 +1996,22 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) ippAddResolution(printer->attrs, IPP_TAG_PRINTER, "printer-resolution-supported", IPP_RES_PER_INCH, 600, 600); + /* printer-supply-description */ + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])), NULL, printer_supplies); + + /* printer-supply-info-uri */ + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl); + /* printer-uri-supported */ - ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, - "printer-uri-supported", NULL, uri); + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri); + + /* printer-uuid */ + httpAssembleUUID(printer->hostname, port, name, 0, uuid, sizeof(uuid)); + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid); /* pwg-raster-document-xxx-supported */ for (i = 0; i < num_formats; i ++) - if (!_cups_strcasecmp(formats[i], "image/pwg-raster")) + if (!strcasecmp(formats[i], "image/pwg-raster")) break; if (i < num_formats) @@ -1660,6 +2050,14 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", duplex ? 3 : 1, NULL, sides_supported); + /* urf-supported */ + for (i = 0; i < num_formats; i ++) + if (!strcasecmp(formats[i], "image/urf")) + break; + + if (i < num_formats) + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported) / sizeof(urf_supported[0])) - !duplex, NULL, urf_supported); + /* uri-authentication-supported */ ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), @@ -1685,8 +2083,7 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default) * Register the printer with Bonjour... */ - if (!register_printer(printer, location, make, model, docformats, adminurl, - ppm_color > 0, duplex, subtype)) + if (!register_printer(printer, location, make, model, docformats, adminurl, uuid + 9, ppm_color > 0, duplex, subtype)) goto bad_printer; #endif /* HAVE_DNSSD */ @@ -1895,7 +2292,7 @@ dnssd_callback( regtype, (int)errorCode); return; } - else if (_cups_strcasecmp(name, printer->dnssd_name)) + else if (strcasecmp(name, printer->dnssd_name)) { if (Verbosity) fprintf(stderr, "Now using DNS-SD service name \"%s\".\n", name); @@ -1908,6 +2305,31 @@ dnssd_callback( #endif /* HAVE_DNSSD */ +/* + * 'filter_cb()' - Filter printer attributes based on the requested array. + */ + +static int /* O - 1 to copy, 0 to ignore */ +filter_cb(_ipp_filter_t *filter, /* I - Filter parameters */ + ipp_t *dst, /* I - Destination (unused) */ + ipp_attribute_t *attr) /* I - Source attribute */ +{ + /* + * Filter attributes as needed... + */ + +// (void)dst; + + ipp_tag_t group = ippGetGroupTag(attr); + const char *name = ippGetName(attr); + + if ((filter->group_tag != IPP_TAG_ZERO && group != filter->group_tag && group != IPP_TAG_ZERO) || !name || (!strcmp(name, "media-col-database") && !cupsArrayFind(filter->ra, (void *)name))) + return (0); + + return (!filter->ra || cupsArrayFind(filter->ra, (void *)name) != NULL); +} + + /* * 'find_job()' - Find a job specified in a request. */ @@ -1920,19 +2342,17 @@ find_job(_ipp_client_t *client) /* I - Client */ *job; /* Matching job, if any */ - key.id = 0; - - if ((attr = ippFindAttribute(client->request, "job-uri", - IPP_TAG_URI)) != NULL) + if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL) { const char *uri = ippGetString(attr, 0, NULL); if (!strncmp(uri, client->printer->uri, client->printer->urilen) && uri[client->printer->urilen] == '/') key.id = atoi(uri + client->printer->urilen + 1); + else + return (NULL); } - else if ((attr = ippFindAttribute(client->request, "job-id", - IPP_TAG_INTEGER)) != NULL) + else if ((attr = ippFindAttribute(client->request, "job-id", IPP_TAG_INTEGER)) != NULL) key.id = ippGetInteger(attr, 0); _cupsRWLockRead(&(client->printer->rwlock)); @@ -1982,6 +2402,71 @@ html_escape(_ipp_client_t *client, /* I - Client */ } +/* + * 'html_footer()' - Show the web interface footer. + * + * This function also writes the trailing 0-length chunk. + */ + +static void +html_footer(_ipp_client_t *client) /* I - Client */ +{ + html_printf(client, + "\n" + "\n" + "\n"); + httpWrite2(client->http, "", 0); +} + + +/* + * 'html_header()' - Show the web interface header and title. + */ + +static void +html_header(_ipp_client_t *client, /* I - Client */ + const char *title) /* I - Title */ +{ + html_printf(client, + "\n" + "\n" + "\n" + "%s\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "" + "" + "" + "" + "
      StatusSuppliesMedia
      \n" + "
      \n", title, !strcmp(client->uri, "/") ? " sel" : "", !strcmp(client->uri, "/supplies") ? " sel" : "", !strcmp(client->uri, "/media") ? " sel" : ""); +} + + /* * 'html_printf()' - Send formatted text to the client, quoting as needed. */ @@ -2024,6 +2509,7 @@ html_printf(_ipp_client_t *client, /* I - Client */ { httpWrite2(client->http, "%", 1); format ++; + start = format; continue; } else if (strchr(" -+#\'", *format)) @@ -2267,6 +2753,61 @@ ipp_cancel_job(_ipp_client_t *client) /* I - Client */ } +/* + * 'ipp_close_job()' - Close an open job. + */ + +static void +ipp_close_job(_ipp_client_t *client) /* I - Client */ +{ + _ipp_job_t *job; /* Job information */ + + + /* + * Get the job... + */ + + if ((job = find_job(client)) == NULL) + { + respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); + return; + } + + /* + * See if the job is already completed, canceled, or aborted; if so, + * we can't cancel... + */ + + switch (job->state) + { + case IPP_JSTATE_CANCELED : + respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, + "Job #%d is canceled - can\'t close.", job->id); + break; + + case IPP_JSTATE_ABORTED : + respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, + "Job #%d is aborted - can\'t close.", job->id); + break; + + case IPP_JSTATE_COMPLETED : + respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, + "Job #%d is completed - can\'t close.", job->id); + break; + + case IPP_JSTATE_PROCESSING : + case IPP_JSTATE_STOPPED : + respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, + "Job #%d is already closed.", job->id); + break; + + default : + respond_ipp(client, IPP_STATUS_OK, NULL); + break; + } +} + + /* * 'ipp_create_job()' - Create a job object. */ @@ -2319,6 +2860,7 @@ ipp_create_job(_ipp_client_t *client) /* I - Client */ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); + cupsArrayAdd(ra, "job-state-message"); cupsArrayAdd(ra, "job-state-reasons"); cupsArrayAdd(ra, "job-uri"); @@ -2517,7 +3059,7 @@ ipp_get_jobs(_ipp_client_t *client) /* I - Client */ (job_comparison > 0 && job->state < job_state) || job->id < first_job_id || (username && job->username && - _cups_strcasecmp(username, job->username))) + strcasecmp(username, job->username))) continue; if (count > 0) @@ -2545,27 +3087,103 @@ ipp_get_printer_attributes( _ipp_printer_t *printer; /* Printer */ - /* - * Send the attributes... - */ + /* + * Send the attributes... + */ + + ra = ippCreateRequestedArray(client->request); + printer = client->printer; + + respond_ipp(client, IPP_STATUS_OK, NULL); + + _cupsRWLockRead(&(printer->rwlock)); + + copy_attributes(client->response, printer->attrs, ra, IPP_TAG_ZERO, + IPP_TAG_CUPS_CONST); + + if (!ra || cupsArrayFind(ra, "media-col-ready")) + { + int i, /* Looping var */ + num_ready = 0; /* Number of ready media */ + ipp_t *ready[3]; /* Ready media */ + + if (printer->main_size != _IPP_MEDIA_SIZE_NONE) + { + if (printer->main_type != _IPP_MEDIA_TYPE_NONE) + ready[num_ready ++] = create_media_col(media_supported[printer->main_size], "main", media_type_supported[printer->main_type], media_col_sizes[printer->main_size][0], media_col_sizes[printer->main_size][1], 635); + else + ready[num_ready ++] = create_media_col(media_supported[printer->main_size], "main", NULL, media_col_sizes[printer->main_size][0], media_col_sizes[printer->main_size][1], 635); + } + if (printer->envelope_size != _IPP_MEDIA_SIZE_NONE) + ready[num_ready ++] = create_media_col(media_supported[printer->envelope_size], "envelope", NULL, media_col_sizes[printer->envelope_size][0], media_col_sizes[printer->envelope_size][1], 635); + if (printer->photo_size != _IPP_MEDIA_SIZE_NONE) + { + if (printer->photo_type != _IPP_MEDIA_TYPE_NONE) + ready[num_ready ++] = create_media_col(media_supported[printer->photo_size], "photo", media_type_supported[printer->photo_type], media_col_sizes[printer->photo_size][0], media_col_sizes[printer->photo_size][1], 0); + else + ready[num_ready ++] = create_media_col(media_supported[printer->photo_size], "photo", NULL, media_col_sizes[printer->photo_size][0], media_col_sizes[printer->photo_size][1], 0); + } + + if (num_ready) + { + ippAddCollections(client->response, IPP_TAG_PRINTER, "media-col-ready", num_ready, (const ipp_t **)ready); + for (i = 0; i < num_ready; i ++) + ippDelete(ready[i]); + } + else + ippAddOutOfBand(client->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "media-col-ready"); + } + + if (!ra || cupsArrayFind(ra, "media-ready")) + { + int num_ready = 0; /* Number of ready media */ + const char *ready[3]; /* Ready media */ + + if (printer->main_size != _IPP_MEDIA_SIZE_NONE) + ready[num_ready ++] = media_supported[printer->main_size]; + + if (printer->envelope_size != _IPP_MEDIA_SIZE_NONE) + ready[num_ready ++] = media_supported[printer->envelope_size]; + + if (printer->photo_size != _IPP_MEDIA_SIZE_NONE) + ready[num_ready ++] = media_supported[printer->photo_size]; + + if (num_ready) + ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-ready", num_ready, NULL, ready); + else + ippAddOutOfBand(client->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "media-ready"); + } - ra = ippCreateRequestedArray(client->request); - printer = client->printer; + if (!ra || cupsArrayFind(ra, "printer-config-change-date-time")) + ippAddDate(client->response, IPP_TAG_PRINTER, "printer-config-change-date-time", ippTimeToDate(printer->config_time)); - respond_ipp(client, IPP_STATUS_OK, NULL); + if (!ra || cupsArrayFind(ra, "printer-config-change-time")) + ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-config-change-time", (int)(printer->config_time - printer->start_time)); - _cupsRWLockRead(&(printer->rwlock)); + if (!ra || cupsArrayFind(ra, "printer-current-time")) + ippAddDate(client->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(time(NULL))); - copy_attributes(client->response, printer->attrs, ra, IPP_TAG_ZERO, - IPP_TAG_CUPS_CONST); if (!ra || cupsArrayFind(ra, "printer-state")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", printer->state); + if (!ra || cupsArrayFind(ra, "printer-state-change-date-time")) + ippAddDate(client->response, IPP_TAG_PRINTER, "printer-state-change-date-time", ippTimeToDate(printer->state_time)); + + if (!ra || cupsArrayFind(ra, "printer-state-change-time")) + ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-state-change-time", (int)(printer->state_time - printer->start_time)); + + if (!ra || cupsArrayFind(ra, "printer-state-message")) + { + static const char * const messages[] = { "Idle.", "Printing.", "Stopped." }; + + ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-state-message", NULL, messages[printer->state - IPP_PSTATE_IDLE]); + } + if (!ra || cupsArrayFind(ra, "printer-state-reasons")) { - if (printer->state_reasons == _IPP_PSTATE_NONE) + if (printer->state_reasons == _IPP_PREASON_NONE) ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-state-reasons", NULL, "none"); @@ -2574,37 +3192,37 @@ ipp_get_printer_attributes( int num_reasons = 0;/* Number of reasons */ const char *reasons[32]; /* Reason strings */ - if (printer->state_reasons & _IPP_PSTATE_OTHER) + if (printer->state_reasons & _IPP_PREASON_OTHER) reasons[num_reasons ++] = "other"; - if (printer->state_reasons & _IPP_PSTATE_COVER_OPEN) + if (printer->state_reasons & _IPP_PREASON_COVER_OPEN) reasons[num_reasons ++] = "cover-open"; - if (printer->state_reasons & _IPP_PSTATE_INPUT_TRAY_MISSING) + if (printer->state_reasons & _IPP_PREASON_INPUT_TRAY_MISSING) reasons[num_reasons ++] = "input-tray-missing"; - if (printer->state_reasons & _IPP_PSTATE_MARKER_SUPPLY_EMPTY) + if (printer->state_reasons & _IPP_PREASON_MARKER_SUPPLY_EMPTY) reasons[num_reasons ++] = "marker-supply-empty-warning"; - if (printer->state_reasons & _IPP_PSTATE_MARKER_SUPPLY_LOW) + if (printer->state_reasons & _IPP_PREASON_MARKER_SUPPLY_LOW) reasons[num_reasons ++] = "marker-supply-low-report"; - if (printer->state_reasons & _IPP_PSTATE_MARKER_WASTE_ALMOST_FULL) + if (printer->state_reasons & _IPP_PREASON_MARKER_WASTE_ALMOST_FULL) reasons[num_reasons ++] = "marker-waste-almost-full-report"; - if (printer->state_reasons & _IPP_PSTATE_MARKER_WASTE_FULL) + if (printer->state_reasons & _IPP_PREASON_MARKER_WASTE_FULL) reasons[num_reasons ++] = "marker-waste-full-warning"; - if (printer->state_reasons & _IPP_PSTATE_MEDIA_EMPTY) + if (printer->state_reasons & _IPP_PREASON_MEDIA_EMPTY) reasons[num_reasons ++] = "media-empty-warning"; - if (printer->state_reasons & _IPP_PSTATE_MEDIA_JAM) + if (printer->state_reasons & _IPP_PREASON_MEDIA_JAM) reasons[num_reasons ++] = "media-jam-warning"; - if (printer->state_reasons & _IPP_PSTATE_MEDIA_LOW) + if (printer->state_reasons & _IPP_PREASON_MEDIA_LOW) reasons[num_reasons ++] = "media-low-report"; - if (printer->state_reasons & _IPP_PSTATE_MEDIA_NEEDED) + if (printer->state_reasons & _IPP_PREASON_MEDIA_NEEDED) reasons[num_reasons ++] = "media-needed-report"; - if (printer->state_reasons & _IPP_PSTATE_MOVING_TO_PAUSED) + if (printer->state_reasons & _IPP_PREASON_MOVING_TO_PAUSED) reasons[num_reasons ++] = "moving-to-paused"; - if (printer->state_reasons & _IPP_PSTATE_PAUSED) + if (printer->state_reasons & _IPP_PREASON_PAUSED) reasons[num_reasons ++] = "paused"; - if (printer->state_reasons & _IPP_PSTATE_SPOOL_AREA_FULL) + if (printer->state_reasons & _IPP_PREASON_SPOOL_AREA_FULL) reasons[num_reasons ++] = "spool-area-full"; - if (printer->state_reasons & _IPP_PSTATE_TONER_EMPTY) + if (printer->state_reasons & _IPP_PREASON_TONER_EMPTY) reasons[num_reasons ++] = "toner-empty-warning"; - if (printer->state_reasons & _IPP_PSTATE_TONER_LOW) + if (printer->state_reasons & _IPP_PREASON_TONER_LOW) reasons[num_reasons ++] = "toner-low-report"; ippAddStrings(client->response, IPP_TAG_PRINTER, @@ -2613,15 +3231,30 @@ ipp_get_printer_attributes( } } + if (!ra || cupsArrayFind(ra, "printer-supply")) + { + int i; /* Looping var */ + char buffer[256]; /* Supply value buffer */ + ipp_attribute_t *attr = NULL; /* Attribute */ + static const char * const colorants[] = { "cyan", "magenta", "yellow", "black", "unknown" }; + + for (i = 0; i < 5; i ++) + { + snprintf(buffer, sizeof(buffer), "index=%d;class=%s;type=%s;unit=percent;maxcapacity=100;level=%d;colorantname=%s;", i + 1, i < 4 ? "supplyThatIsConsumed" : "receptacleThatIsFilled", i < 4 ? "toner" : "wasteToner", printer->supplies[i], colorants[i]); + + if (!attr) + attr = ippAddOctetString(client->response, IPP_TAG_PRINTER, "printer-supply", buffer, (int)strlen(buffer)); + else + ippSetOctetString(client->response, &attr, i, buffer, (int)strlen(buffer)); + } + } + if (!ra || cupsArrayFind(ra, "printer-up-time")) - ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, - "printer-up-time", (int)time(NULL)); + ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "printer-up-time", (int)(time(NULL) - printer->start_time)); if (!ra || cupsArrayFind(ra, "queued-job-count")) ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, - "queued-job-count", - printer->active_job && - printer->active_job->state < IPP_JSTATE_CANCELED); + "queued-job-count", printer->active_job && printer->active_job->state < IPP_JSTATE_CANCELED); _cupsRWUnlock(&(printer->rwlock)); @@ -2629,6 +3262,20 @@ ipp_get_printer_attributes( } +/* + * 'ipp_identify_printer()' - Beep or display a message. + */ + +static void +ipp_identify_printer( + _ipp_client_t *client) /* I - Client */ +{ + /* TODO: Do something */ + + respond_ipp(client, IPP_STATUS_OK, NULL); +} + + /* * 'ipp_print_job()' - Create a job object with an attached document. */ @@ -2678,24 +3325,7 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */ * Create a file for the request data... */ - if (!_cups_strcasecmp(job->format, "image/jpeg")) - snprintf(filename, sizeof(filename), "%s/%d.jpg", - client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "image/png")) - snprintf(filename, sizeof(filename), "%s/%d.png", - client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "image/pwg-raster")) - snprintf(filename, sizeof(filename), "%s/%d.ras", - client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "application/pdf")) - snprintf(filename, sizeof(filename), "%s/%d.pdf", - client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "application/postscript")) - snprintf(filename, sizeof(filename), "%s/%d.ps", - client->printer->directory, job->id); - else - snprintf(filename, sizeof(filename), "%s/%d.prn", - client->printer->directory, job->id); + create_job_filename(client->printer, job, filename, sizeof(filename)); if (Verbosity) fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format); @@ -2768,7 +3398,6 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */ * Process the job... */ -#if 0 if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job)) { job->state = IPP_JSTATE_ABORTED; @@ -2776,10 +3405,6 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */ return; } -#else - process_job(job); -#endif /* 0 */ - /* * Return the job info... */ @@ -2789,6 +3414,7 @@ ipp_print_job(_ipp_client_t *client) /* I - Client */ ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); + cupsArrayAdd(ra, "job-state-message"); cupsArrayAdd(ra, "job-state-reasons"); cupsArrayAdd(ra, "job-uri"); @@ -2916,16 +3542,16 @@ ipp_print_uri(_ipp_client_t *client) /* I - Client */ * Create a file for the request data... */ - if (!_cups_strcasecmp(job->format, "image/jpeg")) + if (!strcasecmp(job->format, "image/jpeg")) snprintf(filename, sizeof(filename), "%s/%d.jpg", client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "image/png")) + else if (!strcasecmp(job->format, "image/png")) snprintf(filename, sizeof(filename), "%s/%d.png", client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "application/pdf")) + else if (!strcasecmp(job->format, "application/pdf")) snprintf(filename, sizeof(filename), "%s/%d.pdf", client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "application/postscript")) + else if (!strcasecmp(job->format, "application/postscript")) snprintf(filename, sizeof(filename), "%s/%d.ps", client->printer->directory, job->id); else @@ -3181,13 +3807,17 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */ return; } + copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0); + /* * Get the document format for the job... */ _cupsRWLockWrite(&(client->printer->rwlock)); - if ((attr = ippFindAttribute(client->request, "document-format", IPP_TAG_MIMETYPE)) != NULL) + if ((attr = ippFindAttribute(job->attrs, "document-format-detected", IPP_TAG_MIMETYPE)) != NULL) + job->format = ippGetString(attr, 0, NULL); + else if ((attr = ippFindAttribute(job->attrs, "document-format-supplied", IPP_TAG_MIMETYPE)) != NULL) job->format = ippGetString(attr, 0, NULL); else job->format = "application/octet-stream"; @@ -3196,21 +3826,7 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */ * Create a file for the request data... */ - if (!_cups_strcasecmp(job->format, "image/jpeg")) - snprintf(filename, sizeof(filename), "%s/%d.jpg", - client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "image/png")) - snprintf(filename, sizeof(filename), "%s/%d.png", - client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "application/pdf")) - snprintf(filename, sizeof(filename), "%s/%d.pdf", - client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "application/postscript")) - snprintf(filename, sizeof(filename), "%s/%d.ps", - client->printer->directory, job->id); - else - snprintf(filename, sizeof(filename), "%s/%d.prn", - client->printer->directory, job->id); + create_job_filename(client->printer, job, filename, sizeof(filename)); if (Verbosity) fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format); @@ -3489,16 +4105,16 @@ ipp_send_uri(_ipp_client_t *client) /* I - Client */ * Create a file for the request data... */ - if (!_cups_strcasecmp(job->format, "image/jpeg")) + if (!strcasecmp(job->format, "image/jpeg")) snprintf(filename, sizeof(filename), "%s/%d.jpg", client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "image/png")) + else if (!strcasecmp(job->format, "image/png")) snprintf(filename, sizeof(filename), "%s/%d.png", client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "application/pdf")) + else if (!strcasecmp(job->format, "application/pdf")) snprintf(filename, sizeof(filename), "%s/%d.pdf", client->printer->directory, job->id); - else if (!_cups_strcasecmp(job->format, "application/postscript")) + else if (!strcasecmp(job->format, "application/postscript")) snprintf(filename, sizeof(filename), "%s/%d.ps", client->printer->directory, job->id); else @@ -3701,6 +4317,40 @@ ipp_validate_job(_ipp_client_t *client) /* I - Client */ } +/* + * 'parse_options()' - Parse URL options into CUPS options. + * + * The client->options string is destroyed by this function. + */ + +static int /* O - Number of options */ +parse_options(_ipp_client_t *client, /* I - Client */ + cups_option_t **options) /* O - Options */ +{ + char *name, /* Name */ + *value, /* Value */ + *next; /* Next name=value pair */ + int num_options = 0; /* Number of options */ + + + *options = NULL; + + for (name = client->options; name && *name; name = next) + { + if ((value = strchr(name, '=')) == NULL) + break; + + *value++ = '\0'; + if ((next = strchr(value, '&')) != NULL) + *next++ = '\0'; + + num_options = cupsAddOption(name, value, num_options, options); + } + + return (num_options); +} + + /* * 'process_client()' - Process client requests on a thread. */ @@ -3729,13 +4379,15 @@ process_client(_ipp_client_t *client) /* I - Client */ if (recv(httpGetFd(client->http), buf, 1, MSG_PEEK) == 1 && (!buf[0] || !strchr("DGHOPT", buf[0]))) { - fprintf(stderr, "%s Negotiating TLS session.\n", client->hostname); + fprintf(stderr, "%s Starting HTTPS session.\n", client->hostname); if (httpEncryption(client->http, HTTP_ENCRYPTION_ALWAYS)) { fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsLastErrorString()); break; } + + fprintf(stderr, "%s Connection now encrypted.\n", client->hostname); } first_time = 0; @@ -3850,13 +4502,17 @@ process_http(_ipp_client_t *client) /* I - Client connection */ if (httpSeparateURI(HTTP_URI_CODING_MOST, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, - client->uri, sizeof(client->uri)) < HTTP_URI_STATUS_OK) + client->uri, sizeof(client->uri)) < HTTP_URI_STATUS_OK && + (http_state != HTTP_STATE_OPTIONS || strcmp(uri, "*"))) { fprintf(stderr, "%s Bad URI \"%s\".\n", client->hostname, uri); respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); } + if ((client->options = strchr(client->uri, '?')) != NULL) + *(client->options)++ = '\0'; + /* * Process the request... */ @@ -3891,9 +4547,28 @@ process_http(_ipp_client_t *client) /* I - Client connection */ * Handle HTTP Upgrade... */ - if (!_cups_strcasecmp(httpGetField(client->http, HTTP_FIELD_CONNECTION), + if (!strcasecmp(httpGetField(client->http, HTTP_FIELD_CONNECTION), "Upgrade")) { +#ifdef HAVE_SSL + if (strstr(httpGetField(client->http, HTTP_FIELD_UPGRADE), "TLS/") != NULL && !httpIsEncrypted(client->http)) + { + if (!respond_http(client, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL, NULL, 0)) + return (0); + + fprintf(stderr, "%s Upgrading to encrypted connection.\n", client->hostname); + + if (httpEncryption(client->http, HTTP_ENCRYPTION_REQUIRED)) + { + fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsLastErrorString()); + return (0); + } + + fprintf(stderr, "%s Connection now encrypted.\n", client->hostname); + } + else +#endif /* HAVE_SSL */ + if (!respond_http(client, HTTP_STATUS_NOT_IMPLEMENTED, NULL, NULL, 0)) return (0); } @@ -3936,7 +4611,7 @@ process_http(_ipp_client_t *client) /* I - Client connection */ { case HTTP_STATE_OPTIONS : /* - * Do HEAD/OPTIONS command... + * Do OPTIONS command... */ return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0)); @@ -3944,7 +4619,7 @@ process_http(_ipp_client_t *client) /* I - Client connection */ case HTTP_STATE_HEAD : if (!strcmp(client->uri, "/icon.png")) return (respond_http(client, HTTP_STATUS_OK, NULL, "image/png", 0)); - else if (!strcmp(client->uri, "/")) + else if (!strcmp(client->uri, "/") || !strcmp(client->uri, "/media") || !strcmp(client->uri, "/supplies")) return (respond_http(client, HTTP_STATUS_OK, NULL, "text/html", 0)); else return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0)); @@ -3989,30 +4664,300 @@ process_http(_ipp_client_t *client) /* I - Client connection */ * Show web status page... */ + _ipp_job_t *job; /* Current job */ + int i; /* Looping var */ + _ipp_preason_t reason; /* Current reason */ + static const char * const reasons[] = + { /* Reason strings */ + "Other", + "Cover Open", + "Input Tray Missing", + "Marker Supply Empty", + "Marker Supply Low", + "Marker Waste Almost Full", + "Marker Waste Full", + "Media Empty", + "Media Jam", + "Media Low", + "Media Needed", + "Moving to Paused", + "Paused", + "Spool Area Full", + "Toner Empty", + "Toner Low" + }; + + if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0)) + return (0); + + html_header(client, client->printer->name); + html_printf(client, + "

      ippserver (" CUPS_SVERSION ")

      \n" + "

      %s, %d job(s).", client->printer->state == IPP_PSTATE_IDLE ? "Idle" : client->printer->state == IPP_PSTATE_PROCESSING ? "Printing" : "Stopped", cupsArrayCount(client->printer->jobs)); + for (i = 0, reason = 1; i < (int)(sizeof(reasons) / sizeof(reasons[0])); i ++, reason <<= 1) + if (client->printer->state_reasons & reason) + html_printf(client, "\n
          %s", reasons[i]); + html_printf(client, "

      \n"); + + if (cupsArrayCount(client->printer->jobs) > 0) + { + _cupsRWLockRead(&(client->printer->rwlock)); + + html_printf(client, "\n"); + for (job = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs); job; job = (_ipp_job_t *)cupsArrayNext(client->printer->jobs)) + { + char when[256], /* When job queued/started/finished */ + hhmmss[64]; /* Time HH:MM:SS */ + + switch (job->state) + { + case IPP_JSTATE_PENDING : + case IPP_JSTATE_HELD : + snprintf(when, sizeof(when), "Queued at %s", time_string(job->created, hhmmss, sizeof(hhmmss))); + break; + case IPP_JSTATE_PROCESSING : + case IPP_JSTATE_STOPPED : + snprintf(when, sizeof(when), "Started at %s", time_string(job->processing, hhmmss, sizeof(hhmmss))); + break; + case IPP_JSTATE_ABORTED : + snprintf(when, sizeof(when), "Aborted at %s", time_string(job->completed, hhmmss, sizeof(hhmmss))); + break; + case IPP_JSTATE_CANCELED : + snprintf(when, sizeof(when), "Canceled at %s", time_string(job->completed, hhmmss, sizeof(hhmmss))); + break; + case IPP_JSTATE_COMPLETED : + snprintf(when, sizeof(when), "Completed at %s", time_string(job->completed, hhmmss, sizeof(hhmmss))); + break; + } + + html_printf(client, "\n", job->id, job->name, job->username, when); + } + html_printf(client, "
      Job #NameOwnerWhen
      %d%s%s%s
      \n"); + + _cupsRWUnlock(&(client->printer->rwlock)); + } + html_footer(client); + + return (1); + } + else if (!strcmp(client->uri, "/media")) + { + /* + * Show web media page... + */ + + int i, /* Looping var */ + num_options; /* Number of form options */ + cups_option_t *options; /* Form options */ + static const char * const sizes[] = + { /* Size strings */ + "ISO A4", + "ISO A5", + "ISO A6", + "DL Envelope", + "US Legal", + "US Letter", + "#10 Envelope", + "3x5 Photo", + "3.5x5 Photo", + "4x6 Photo", + "5x7 Photo" + }; + static const char * const types[] = + /* Type strings */ + { + "Auto", + "Cardstock", + "Envelope", + "Labels", + "Other", + "Glossy Photo", + "High-Gloss Photo", + "Matte Photo", + "Satin Photo", + "Semi-Gloss Photo", + "Plain", + "Letterhead", + "Transparency" + }; + static const int sheets[] = /* Number of sheets */ + { + 250, + 100, + 25, + 5, + 0 + }; + if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0)) return (0); + html_header(client, client->printer->name); + + if ((num_options = parse_options(client, &options)) > 0) + { + /* + * WARNING: A real printer/server implementation MUST NOT implement + * media updates via a GET request - GET requests are supposed to be + * idempotent (without side-effects) and we obviously are not + * authenticating access here. This form is provided solely to + * enable testing and development! + */ + + const char *val; /* Form value */ + + if ((val = cupsGetOption("main_size", num_options, options)) != NULL) + client->printer->main_size = atoi(val); + if ((val = cupsGetOption("main_type", num_options, options)) != NULL) + client->printer->main_type = atoi(val); + if ((val = cupsGetOption("main_level", num_options, options)) != NULL) + client->printer->main_level = atoi(val); + + if ((val = cupsGetOption("envelope_size", num_options, options)) != NULL) + client->printer->envelope_size = atoi(val); + if ((val = cupsGetOption("envelope_level", num_options, options)) != NULL) + client->printer->envelope_level = atoi(val); + + if ((val = cupsGetOption("photo_size", num_options, options)) != NULL) + client->printer->photo_size = atoi(val); + if ((val = cupsGetOption("photo_type", num_options, options)) != NULL) + client->printer->photo_type = atoi(val); + if ((val = cupsGetOption("photo_level", num_options, options)) != NULL) + client->printer->photo_level = atoi(val); + + if ((client->printer->main_level < 100 && client->printer->main_level > 0) || (client->printer->envelope_level < 25 && client->printer->envelope_level > 0) || (client->printer->photo_level < 25 && client->printer->photo_level > 0)) + client->printer->state_reasons |= _IPP_PREASON_MEDIA_LOW; + else + client->printer->state_reasons &= (_ipp_preason_t)~_IPP_PREASON_MEDIA_LOW; + + if ((client->printer->main_level == 0 && client->printer->main_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->envelope_level == 0 && client->printer->envelope_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->photo_level == 0 && client->printer->photo_size > _IPP_MEDIA_SIZE_NONE)) + { + client->printer->state_reasons |= _IPP_PREASON_MEDIA_EMPTY; + if (client->printer->active_job) + client->printer->state_reasons |= _IPP_PREASON_MEDIA_NEEDED; + } + else + client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MEDIA_EMPTY | _IPP_PREASON_MEDIA_NEEDED); + + html_printf(client, "
      Media updated.
      \n"); + } + + html_printf(client, "
      \n"); + + html_printf(client, "\n"); + html_printf(client, "\n"); + html_printf(client, - "\n" - "\n" - "\n" - "%s\n" - "\n" - "\n" - "\n" - "\n" - "

      %s

      \n" - "

      %s, %d job(s).

      \n" - "\n" - "\n", - client->printer->name, client->printer->name, - client->printer->state == IPP_PSTATE_IDLE ? "Idle" : - client->printer->state == IPP_PSTATE_PROCESSING ? - "Printing" : "Stopped", - cupsArrayCount(client->printer->jobs)); - httpWrite2(client->http, "", 0); + "\n"); + + html_printf(client, + "\n"); + + html_printf(client, "
      Main Tray:
      Envelope Feeder:
      Photo Tray:
      \n"); + html_footer(client); + + return (1); + } + else if (!strcmp(client->uri, "/supplies")) + { + /* + * Show web supplies page... + */ + + int i, j, /* Looping vars */ + num_options; /* Number of form options */ + cups_option_t *options; /* Form options */ + static const int levels[] = { 0, 5, 10, 25, 50, 75, 90, 95, 100 }; + + if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0)) + return (0); + + html_header(client, client->printer->name); + + if ((num_options = parse_options(client, &options)) > 0) + { + /* + * WARNING: A real printer/server implementation MUST NOT implement + * supply updates via a GET request - GET requests are supposed to be + * idempotent (without side-effects) and we obviously are not + * authenticating access here. This form is provided solely to + * enable testing and development! + */ + + char name[64]; /* Form field */ + const char *val; /* Form value */ + + client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MARKER_SUPPLY_EMPTY | _IPP_PREASON_MARKER_SUPPLY_LOW | _IPP_PREASON_MARKER_WASTE_ALMOST_FULL | _IPP_PREASON_MARKER_WASTE_FULL | _IPP_PREASON_TONER_EMPTY | _IPP_PREASON_TONER_LOW); + + for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++) + { + snprintf(name, sizeof(name), "supply_%d", i); + if ((val = cupsGetOption(name, num_options, options)) != NULL) + { + int level = client->printer->supplies[i] = atoi(val); + /* New level */ + + if (i < 4) + { + if (level == 0) + client->printer->state_reasons |= _IPP_PREASON_TONER_EMPTY; + else if (level < 10) + client->printer->state_reasons |= _IPP_PREASON_TONER_LOW; + } + else + { + if (level == 100) + client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_FULL; + else if (level > 90) + client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_ALMOST_FULL; + } + } + } + + html_printf(client, "
      Supplies updated.
      \n"); + } + + html_printf(client, "
      \n"); + + html_printf(client, "\n"); + for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++) + { + html_printf(client, "\n"); + } + html_printf(client, "\n
      %s:
      \n
      \n"); + html_footer(client); return (1); } @@ -4173,8 +5118,8 @@ process_ipp(_ipp_client_t *client) /* I - Client */ uri = NULL; if (charset && - _cups_strcasecmp(ippGetString(charset, 0, NULL), "us-ascii") && - _cups_strcasecmp(ippGetString(charset, 0, NULL), "utf-8")) + strcasecmp(ippGetString(charset, 0, NULL), "us-ascii") && + strcasecmp(ippGetString(charset, 0, NULL), "utf-8")) { /* * Bad character set... @@ -4266,6 +5211,14 @@ process_ipp(_ipp_client_t *client) /* I - Client */ ipp_get_printer_attributes(client); break; + case IPP_OP_CLOSE_JOB : + ipp_close_job(client); + break; + + case IPP_OP_IDENTIFY_PRINTER : + ipp_identify_printer(client); + break; + default : respond_ipp(client, IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, "Operation not supported."); @@ -4297,6 +5250,16 @@ process_job(_ipp_job_t *job) /* I - Job */ { job->state = IPP_JSTATE_PROCESSING; job->printer->state = IPP_PSTATE_PROCESSING; + job->processing = time(NULL); + + while (job->printer->state_reasons & _IPP_PREASON_MEDIA_EMPTY) + { + job->printer->state_reasons |= _IPP_PREASON_MEDIA_NEEDED; + + sleep(1); + } + + job->printer->state_reasons &= (_ipp_preason_t)~_IPP_PREASON_MEDIA_NEEDED; if (job->printer->command) { @@ -4308,19 +5271,79 @@ process_job(_ipp_job_t *job) /* I - Job */ status; /* Exit status */ time_t start, /* Start time */ end; /* End time */ + char *myargv[3], /* Command-line arguments */ + *myenvp[200]; /* Environment variables */ + int myenvc; /* Number of environment variables */ + ipp_attribute_t *attr; /* Job attribute */ + char val[1280], /* IPP_NAME=value */ + *valptr; /* Pointer into string */ fprintf(stderr, "Running command \"%s %s\".\n", job->printer->command, job->filename); time(&start); + /* + * Setup the command-line arguments... + */ + + myargv[0] = job->printer->command; + myargv[1] = job->filename; + myargv[2] = NULL; + + /* + * Copy the current environment, then add ENV variables for every Job + * attribute... + */ + + for (myenvc = 0; environ[myenvc] && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); myenvc ++) + myenvp[myenvc] = strdup(environ[myenvc]); + + for (attr = ippFirstAttribute(job->attrs); attr && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); attr = ippNextAttribute(job->attrs)) + { + /* + * Convert "attribute-name" to "IPP_ATTRIBUTE_NAME=" and then add the + * value(s) from the attribute. + */ + + const char *name = ippGetName(attr); + if (!name) + continue; + + valptr = val; + *valptr++ = 'I'; + *valptr++ = 'P'; + *valptr++ = 'P'; + *valptr++ = '_'; + while (*name && valptr < (val + sizeof(val) - 2)) + { + if (*name == '-') + *valptr++ = '_'; + else + *valptr++ = (char)toupper(*name & 255); + + name ++; + } + *valptr++ = '='; + ippAttributeString(attr, valptr, sizeof(val) - (size_t)(valptr - val)); + + myenvp[myenvc++] = strdup(val); + } + myenvp[myenvc] = NULL; + + /* + * Now run the program... + */ + +#ifdef WIN32 + status = _spawnvpe(_P_WAIT, job->printer->command, myargv, myenvp); +#else if ((pid = fork()) == 0) { /* * Child comes here... */ - execlp(job->printer->command, job->printer->command, job->filename, - (void *)NULL); + execve(job->printer->command, myargv, myenvp); exit(errno); } else if (pid < 0) @@ -4330,32 +5353,48 @@ process_job(_ipp_job_t *job) /* I - Job */ */ perror("Unable to start job processing command"); + status = -1; } else { + /* + * Free memory used for environment... + */ + + while (myenvc > 0) + free(myenvp[-- myenvc]); + /* * Wait for child to complete... */ -#ifdef HAVE_WAITPID +# ifdef HAVE_WAITPID while (waitpid(pid, &status, 0) < 0); -#else +# else while (wait(&status) < 0); -#endif /* HAVE_WAITPID */ +# endif /* HAVE_WAITPID */ + } +#endif /* WIN32 */ - if (status) - { - if (WIFEXITED(status)) - fprintf(stderr, "Command \"%s\" exited with status %d.\n", - job->printer->command, WEXITSTATUS(status)); - else - fprintf(stderr, "Command \"%s\" terminated with signal %d.\n", - job->printer->command, WTERMSIG(status)); - } + if (status) + { +#ifndef WIN32 + if (WIFEXITED(status)) +#endif /* !WIN32 */ + fprintf(stderr, "Command \"%s\" exited with status %d.\n", + job->printer->command, WEXITSTATUS(status)); +#ifndef WIN32 else - fprintf(stderr, "Command \"%s\" completed successfully.\n", - job->printer->command); + fprintf(stderr, "Command \"%s\" terminated with signal %d.\n", + job->printer->command, WTERMSIG(status)); +#endif /* !WIN32 */ + job->state = IPP_JSTATE_ABORTED; } + else if (status < 0) + job->state = IPP_JSTATE_ABORTED; + else + fprintf(stderr, "Command \"%s\" completed successfully.\n", + job->printer->command); /* * Make sure processing takes at least 5 seconds... @@ -4371,12 +5410,12 @@ process_job(_ipp_job_t *job) /* I - Job */ * Sleep for a random amount of time to simulate job processing. */ - sleep(5 + (rand() % 11)); + sleep((unsigned)(5 + (rand() % 11))); } if (job->cancel) job->state = IPP_JSTATE_CANCELED; - else + else if (job->state == IPP_JSTATE_PROCESSING) job->state = IPP_JSTATE_COMPLETED; job->completed = time(NULL); @@ -4400,6 +5439,7 @@ register_printer( const char *model, /* I - Model name */ const char *formats, /* I - Supported formats */ const char *adminurl, /* I - Web interface URL */ + const char *uuid, /* I - Printer UUID */ int color, /* I - 1 = color, 0 = monochrome */ int duplex, /* I - 1 = duplex, 0 = simplex */ const char *subtype) /* I - Service subtype */ @@ -4436,6 +5476,10 @@ register_printer( make); TXTRecordSetValue(&(printer->ipp_txt), "usb_MDL", (uint8_t)strlen(model), model); + TXTRecordSetValue(&(printer->ipp_txt), "UUID", (uint8_t)strlen(uuid), uuid); +# ifdef HAVE_SSL + TXTRecordSetValue(&(printer->ipp_txt), "TLS", 3, "1.2"); +# endif /* HAVE_SSL */ /* * Create a shared service reference for Bonjour... @@ -4581,7 +5625,7 @@ respond_http( * Format an error message... */ - if (!type && !length && code != HTTP_STATUS_OK) + if (!type && !length && code != HTTP_STATUS_OK && code != HTTP_STATUS_SWITCHING_PROTOCOLS) { snprintf(message, sizeof(message), "%d - %s\n", code, httpStatus(code)); @@ -4801,6 +5845,23 @@ run_printer(_ipp_printer_t *printer) /* I - Printer */ } +/* + * 'time_string()' - Return the local time in hours, minutes, and seconds. + */ + +static char * +time_string(time_t tv, /* I - Time value */ + char *buffer, /* I - Buffer */ + size_t bufsize) /* I - Size of buffer */ +{ + struct tm *curtime = localtime(&tv); + /* Local time */ + + strftime(buffer, bufsize, "%X", curtime); + return (buffer); +} + + /* * 'usage()' - Show program usage. */ @@ -4871,8 +5932,7 @@ valid_doc_attributes( * Check operation attributes... */ - if ((attr = ippFindAttribute(client->request, "compression", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "compression", IPP_TAG_ZERO)) != NULL) { /* * If compression is specified, only accept a supported value in a Print-Job @@ -4894,11 +5954,16 @@ valid_doc_attributes( } else { - fprintf(stderr, "%s %s compression=\"%s\"\n", - client->hostname, op_name, compression); + fprintf(stderr, "%s %s compression=\"%s\"\n", client->hostname, op_name, compression); + + ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "compression-supplied", NULL, compression); if (strcmp(compression, "none")) + { + if (Verbosity) + fprintf(stderr, "Receiving job file with \"%s\" compression.\n", compression); httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, compression); + } } } @@ -4906,8 +5971,7 @@ valid_doc_attributes( * Is it a format we support? */ - if ((attr = ippFindAttribute(client->request, "document-format", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "document-format", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_MIMETYPE || ippGetGroupTag(attr) != IPP_TAG_OPERATION) @@ -4921,29 +5985,26 @@ valid_doc_attributes( fprintf(stderr, "%s %s document-format=\"%s\"\n", client->hostname, op_name, format); + + ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, format); } } else { - format = ippGetString(ippFindAttribute(client->printer->attrs, - "document-format-default", - IPP_TAG_MIMETYPE), 0, NULL); + format = ippGetString(ippFindAttribute(client->printer->attrs, "document-format-default", IPP_TAG_MIMETYPE), 0, NULL); if (!format) format = "application/octet-stream"; /* Should never happen */ - attr = ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, - "document-format", NULL, format); + attr = ippAddString(client->request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format); } - if (!strcmp(format, "application/octet-stream") && - (ippGetOperation(client->request) == IPP_OP_PRINT_JOB || - ippGetOperation(client->request) == IPP_OP_SEND_DOCUMENT)) + if (!strcmp(format, "application/octet-stream") && (ippGetOperation(client->request) == IPP_OP_PRINT_JOB || ippGetOperation(client->request) == IPP_OP_SEND_DOCUMENT)) { /* - * Auto-type the file using the first 4 bytes of the file... + * Auto-type the file using the first 8 bytes of the file... */ - unsigned char header[4]; /* First 4 bytes of file */ + unsigned char header[8]; /* First 8 bytes of file */ memset(header, 0, sizeof(header)); httpPeek(client->http, (char *)header, sizeof(header)); @@ -4952,33 +6013,39 @@ valid_doc_attributes( format = "application/pdf"; else if (!memcmp(header, "%!", 2)) format = "application/postscript"; - else if (!memcmp(header, "\377\330\377", 3) && - header[3] >= 0xe0 && header[3] <= 0xef) + else if (!memcmp(header, "\377\330\377", 3) && header[3] >= 0xe0 && header[3] <= 0xef) format = "image/jpeg"; else if (!memcmp(header, "\211PNG", 4)) format = "image/png"; + else if (!memcmp(header, "RAS2", 4)) + format = "image/pwg-raster"; + else if (!memcmp(header, "UNIRAST", 8)) + format = "image/urf"; + else + format = NULL; if (format) + { fprintf(stderr, "%s %s Auto-typed document-format=\"%s\"\n", client->hostname, op_name, format); - if (!attr) - attr = ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, - "document-format", NULL, format); - else - ippSetString(client->request, &attr, 0, format); + ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, format); + } } - if (op != IPP_OP_CREATE_JOB && - (supported = ippFindAttribute(client->printer->attrs, - "document-format-supported", - IPP_TAG_MIMETYPE)) != NULL && - !ippContainsString(supported, format)) + if (op != IPP_OP_CREATE_JOB && (supported = ippFindAttribute(client->printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL && !ippContainsString(supported, format)) { respond_unsupported(client, attr); valid = 0; } + /* + * document-name + */ + + if ((attr = ippFindAttribute(client->request, "document-name", IPP_TAG_NAME)) != NULL) + ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "document-name-supplied", NULL, ippGetString(attr, 0, NULL)); + return (valid); } @@ -5010,8 +6077,7 @@ valid_job_attributes( * Check the various job template attributes... */ - if ((attr = ippFindAttribute(client->request, "copies", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "copies", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 999) @@ -5021,8 +6087,7 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "ipp-attribute-fidelity", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "ipp-attribute-fidelity", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BOOLEAN) { @@ -5031,8 +6096,7 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "job-hold-until", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "job-hold-until", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || (ippGetValueTag(attr) != IPP_TAG_NAME && @@ -5045,8 +6109,16 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "job-name", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_ZERO)) != NULL) + { + if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 0) + { + respond_unsupported(client, attr); + valid = 0; + } + } + + if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || (ippGetValueTag(attr) != IPP_TAG_NAME && @@ -5055,10 +6127,13 @@ valid_job_attributes( respond_unsupported(client, attr); valid = 0; } + + ippSetGroupTag(client->request, &attr, IPP_TAG_JOB); } + else + ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled"); - if ((attr = ippFindAttribute(client->request, "job-priority", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "job-priority", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 100) @@ -5068,8 +6143,7 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "job-sheets", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "job-sheets", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || (ippGetValueTag(attr) != IPP_TAG_NAME && @@ -5082,8 +6156,7 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "media", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "media", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || (ippGetValueTag(attr) != IPP_TAG_NAME && @@ -5109,8 +6182,7 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "media-col", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "media-col", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BEGIN_COLLECTION) @@ -5121,8 +6193,7 @@ valid_job_attributes( /* TODO: check for valid media-col */ } - if ((attr = ippFindAttribute(client->request, "multiple-document-handling", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "multiple-document-handling", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD || (strcmp(ippGetString(attr, 0, NULL), @@ -5135,8 +6206,7 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "orientation-requested", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "orientation-requested", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_ENUM || ippGetInteger(attr, 0) < IPP_ORIENT_PORTRAIT || @@ -5147,15 +6217,16 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "page-ranges", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "page-ranges", IPP_TAG_ZERO)) != NULL) { - respond_unsupported(client, attr); + if (ippGetValueTag(attr) != IPP_TAG_RANGE) + { + respond_unsupported(client, attr); valid = 0; + } } - if ((attr = ippFindAttribute(client->request, "print-quality", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "print-quality", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_ENUM || ippGetInteger(attr, 0) < IPP_QUALITY_DRAFT || @@ -5166,28 +6237,53 @@ valid_job_attributes( } } - if ((attr = ippFindAttribute(client->request, "printer-resolution", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "printer-resolution", IPP_TAG_ZERO)) != NULL) { - respond_unsupported(client, attr); - valid = 0; + supported = ippFindAttribute(client->printer->attrs, "printer-resolution-supported", IPP_TAG_RESOLUTION); + + if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_RESOLUTION || + !supported) + { + respond_unsupported(client, attr); + valid = 0; + } + else + { + int count, /* Number of supported values */ + xdpi, /* Horizontal resolution for job template attribute */ + ydpi, /* Vertical resolution for job template attribute */ + sydpi; /* Vertical resolution for supported value */ + ipp_res_t units, /* Units for job template attribute */ + sunits; /* Units for supported value */ + + xdpi = ippGetResolution(attr, 0, &ydpi, &units); + count = ippGetCount(supported); + + for (i = 0; i < count; i ++) + { + if (xdpi == ippGetResolution(supported, i, &sydpi, &sunits) && ydpi == sydpi && units == sunits) + break; + } + + if (i >= count) + { + respond_unsupported(client, attr); + valid = 0; + } + } } - if ((attr = ippFindAttribute(client->request, "sides", - IPP_TAG_ZERO)) != NULL) + if ((attr = ippFindAttribute(client->request, "sides", IPP_TAG_ZERO)) != NULL) { - const char *sides = NULL; /* "sides" value... */ + const char *sides = ippGetString(attr, 0, NULL); + /* "sides" value... */ if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD) { respond_unsupported(client, attr); valid = 0; } - - sides = ippGetString(attr, 0, NULL); - - if ((supported = ippFindAttribute(client->printer->attrs, "sides-supported", - IPP_TAG_KEYWORD)) != NULL) + else if ((supported = ippFindAttribute(client->printer->attrs, "sides-supported", IPP_TAG_KEYWORD)) != NULL) { if (!ippContainsString(supported, sides)) { @@ -5207,5 +6303,5 @@ valid_job_attributes( /* - * End of "$Id: ippserver.c 11986 2014-07-02 15:52:01Z msweet $". + * End of "$Id: ippserver.c 12136 2014-08-29 15:19:40Z msweet $". */ diff --git a/test/ippserver.man b/test/ippserver.man new file mode 100644 index 0000000000..a5c1c1c59c --- /dev/null +++ b/test/ippserver.man @@ -0,0 +1,172 @@ +.\" +.\" "$Id$" +.\" +.\" ippserver man page for CUPS. +.\" +.\" Copyright 2014 by Apple Inc. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ippserver 1 "CUPS" "28 August 2014" "Apple Inc." +.SH NAME +ippserver \- a simple internet printing protocol server +.SH SYNOPSIS +.B ippserver +[ +.B \-2 +] [ +.B \-M +.I manufacturer +] [ +.B \-P +] [ +.B \-c +.I command +] [ +.B \-d +.I spool-directory +] [ +.B \-f +.I type/subtype[,...] +] [ +.B \-h +] [ +.B \-i +.I iconfile.png +] [ +.B \-k +] [ +.B \-l +.I location +] [ +.B \-m +.I model +] [ +.B \-n +.I hostname +] [ +.B \-p +.I port +] [ +.B \-r +.I subtype +] [ +.B \-s +.I speed[,color-speed] +] [ +.B \-v[vvv] +] +.I service-name +.SH DESCRIPTION +.B ippserver +is a simple Internet Printing Protocol (IPP) server conforming to the IPP Everywhere (PWG 5100.14) specification. It can be used to test client software or act as a very basic print server that runs a command for every job that is printed. +.SH OPTIONS +The following options are recognized by +.B ippserver: +.TP 5 +.B \-2 +Report support for two-sided (duplex) printing. +.TP 5 +\fB\-M \fImanufacturer\fR +Set the manufacturer of the printer. +The default is "Test". +.TP 5 +.B \-P +Report support for PIN printing. +.TP 5 +\fB\-c \fIcommand\fR +Run the specified command for each document that is printed. +.TP 5 +\fB\-d \fIspool-directory\fR +Specifies the directory that will hold the print files. +The default is a directory under the user's current temporary directory. +.TP 5 +\fB\-f \fItype/subtype[,...]\fR +Specifies a list of MIME media types that the server will accept. +The default is "application/pdf,image/jpeg,image/pwg-raster". +.TP 5 +.B \-h +Shows program help. +.TP 5 +\fB\-i \fIiconfile.png\fR +Specifies the printer icon file for the server. +The default is "printer.png". +.TP 5 +.B \-k +Keeps the print documents in the spool directory rather than deleting them. +.TP 5 +\fB\-l \fIlocation\fR +Specifies the human-readable location string that is reported by the server. +The default is the empty string. +.TP 5 +\fB\-m \fImodel\fR +Specifies the model name of the printer. +The default is "Printer". +.TP 5 +\fB\-n \fIhostname\fR +Specifies the hostname that is reported by the server. +The default is the name returned by the +.BR hostname (1) +command. +.TP 5 +\fB\-p \fIport\fR +Specifies the port number to listen on. +The default is a user-specific number from 8000 to 8999. +.TP 5 +\fB\-r \fIsubtype\fR +Specifies the Bonjour subtype(s) to advertise. +Separate multiple subtypes with a comma. +The default is "_print". +.TP 5 +\fB\-s \fIspeed[,color-speed]\fR +Specifies the printer speed in pages per minute. +If two numbers are specified and the second number is greater than zero, the server will report support for color printing. +The default is "10,0". +.TP 5 +.B \-v[vvv] +Be (very) verbose when logging activity to the standard output. +.SH EXIT STATUS +The +.B ippserver +program returns 1 if it is unable to process the command-line arguments or register the IPP service. +Otherwise +.B ippserver +will run continuously until terminated. +.SH CONFORMING TO +The +.B ippserver +program is unique to CUPS and conforms to the IPP Everywhere (PWG 5100.14) specification. +.SH ENVIRONMENT +.B ippserver +adds environment variables starting with "IPP_" for all IPP Job attributes in the print request. +For example, when executing a command for an IPP Job containing the "media" Job Template attribute, the "IPP_MEDIA" environment variable will be set to the value of that attribute. +.LP +Enumerated values are converted to their keyword equivalents. +For example, a "print-quality" Job Template attribute with a enum value of 3 will become the "IPP_PRINT_QUALITY" environment variable with a value of "draft". +.SH EXAMPLES +Run +.B ippserver +with a service name of My Cool Printer: +.nf + + ippserver "My Cool Printer" +.fi +.LP +Run the +.BR file (1) +command whenever a job is sent to the server: +.nf + + ippserver \-c file "My Cool Printer" +.fi +.SH SEE ALSO +PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp) +.SH COPYRIGHT +Copyright \[co] 2007-2014 by Apple Inc. +.\" +.\" End of "$Id$". +.\" diff --git a/test/ipptool.c b/test/ipptool.c index 6e91d83d24..5e6d07f87d 100644 --- a/test/ipptool.c +++ b/test/ipptool.c @@ -1,5 +1,5 @@ /* - * "$Id: ipptool.c 12031 2014-07-15 19:57:59Z msweet $" + * "$Id: ipptool.c 12143 2014-09-02 13:37:30Z msweet $" * * ipptool command for CUPS. * @@ -647,6 +647,7 @@ main(int argc, /* I - Number of command-line args */ if (!vars.uri) { _cupsLangPuts(stderr, _("ipptool: URI required before test file.")); + _cupsLangPuts(stderr, argv[i]); usage(); } @@ -1371,7 +1372,8 @@ do_tests(FILE *outfile, /* I - Output file */ * Name of test... */ - get_token(fp, name, sizeof(name), &linenum); + get_token(fp, temp, sizeof(temp), &linenum); + expand_variables(vars, name, temp, sizeof(name)); } else if (!_cups_strcasecmp(token, "PAUSE")) { @@ -2470,6 +2472,8 @@ do_tests(FILE *outfile, /* I - Output file */ { fputs("Successful\n", outfile); fputs("\n", outfile); + fputs("Skipped\n", outfile); + fputs("\n", outfile); fputs("StatusCode\n", outfile); print_xml_string(outfile, "string", "skip"); fputs("ResponseAttributes\n", outfile); @@ -3060,7 +3064,62 @@ do_tests(FILE *outfile, /* I - Output file */ set_variable(outfile, vars, expect->define_match, "1"); if (found && expect->define_value) + { + if (!expect->with_value) + { + int last = ippGetCount(found) - 1; + /* Last element in attribute */ + + switch (ippGetValueTag(found)) + { + case IPP_TAG_ENUM : + case IPP_TAG_INTEGER : + snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(found, last)); + break; + + case IPP_TAG_BOOLEAN : + if (ippGetBoolean(found, last)) + strlcpy(buffer, "true", sizeof(buffer)); + else + strlcpy(buffer, "false", sizeof(buffer)); + break; + + case IPP_TAG_RESOLUTION : + { + int xres, /* Horizontal resolution */ + yres; /* Vertical resolution */ + ipp_res_t units; /* Resolution units */ + + xres = ippGetResolution(found, last, &yres, &units); + + if (xres == yres) + snprintf(buffer, sizeof(buffer), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + else + snprintf(buffer, sizeof(buffer), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + } + break; + + case IPP_TAG_CHARSET : + case IPP_TAG_KEYWORD : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + case IPP_TAG_NAME : + case IPP_TAG_NAMELANG : + case IPP_TAG_TEXT : + case IPP_TAG_TEXTLANG : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + strlcpy(buffer, ippGetString(found, last, NULL), sizeof(buffer)); + break; + + default : + ippAttributeString(found, buffer, sizeof(buffer)); + break; + } + } + set_variable(outfile, vars, expect->define_value, buffer); + } if (found && expect->repeat_match && repeat_count < expect->repeat_limit) @@ -3079,6 +3138,25 @@ do_tests(FILE *outfile, /* I - Output file */ { printf("%04d]\n", repeat_count); fflush(stdout); + + if (num_displayed > 0) + { + for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) + { + const char *attrname = ippGetName(attrptr); + if (attrname) + { + for (i = 0; i < num_displayed; i ++) + { + if (!strcmp(displayed[i], attrname)) + { + print_attr(stdout, _CUPS_OUTPUT_TEST, attrptr, NULL); + break; + } + } + } + } + } } sleep((unsigned)repeat_interval); @@ -3134,7 +3212,7 @@ do_tests(FILE *outfile, /* I - Output file */ printf(" status-code = %s (%s)\n", ippErrorString(cupsLastError()), cupsLastErrorString()); - if (response) + if (Verbosity && response) { for (attrptr = response->attrs; attrptr != NULL; @@ -3143,7 +3221,7 @@ do_tests(FILE *outfile, /* I - Output file */ } } } - else if (!prev_pass) + else if (!prev_pass && Output != _CUPS_OUTPUT_QUIET) fprintf(stderr, "%s\n", cupsLastErrorString()); if (prev_pass && Output >= _CUPS_OUTPUT_LIST && !Verbosity && @@ -3214,7 +3292,7 @@ do_tests(FILE *outfile, /* I - Output file */ } } - if (num_displayed > 0 && !Verbosity && response && Output == _CUPS_OUTPUT_TEST) + if (num_displayed > 0 && !Verbosity && response && (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))) { for (attrptr = response->attrs; attrptr != NULL; @@ -3387,14 +3465,26 @@ expand_variables(_cups_vars_t *vars, /* I - Variables */ } else if (vars) { - strlcpy(temp, src + 1, sizeof(temp)); + if (src[1] == '{') + { + src += 2; + strlcpy(temp, src, sizeof(temp)); + if ((tempptr = strchr(temp, '}')) != NULL) + *tempptr = '\0'; + else + tempptr = temp + strlen(temp); + } + else + { + strlcpy(temp, src + 1, sizeof(temp)); - for (tempptr = temp; *tempptr; tempptr ++) - if (!isalnum(*tempptr & 255) && *tempptr != '-' && *tempptr != '_') - break; + for (tempptr = temp; *tempptr; tempptr ++) + if (!isalnum(*tempptr & 255) && *tempptr != '-' && *tempptr != '_') + break; - if (*tempptr) - *tempptr = '\0'; + if (*tempptr) + *tempptr = '\0'; + } if (!strcmp(temp, "uri")) value = vars->uri; @@ -4713,6 +4803,10 @@ usage(void) _cupsLangPuts(stderr, _("Usage: ipptool [options] URI filename [ ... " "filenameN ]")); _cupsLangPuts(stderr, _("Options:")); + _cupsLangPuts(stderr, _(" --help Show help.")); + _cupsLangPuts(stderr, _(" --stop-after-include-error\n" + " Stop tests after a failed INCLUDE.")); + _cupsLangPuts(stderr, _(" --version Show version.")); _cupsLangPuts(stderr, _(" -4 Connect using IPv4.")); _cupsLangPuts(stderr, _(" -6 Connect using IPv6.")); _cupsLangPuts(stderr, _(" -C Send requests using " @@ -4722,6 +4816,7 @@ usage(void) _cupsLangPuts(stderr, _(" -I Ignore errors.")); _cupsLangPuts(stderr, _(" -L Send requests using " "content-length.")); + _cupsLangPuts(stderr, _(" -P filename.plist Produce XML plist to a file and test report to standard output.")); _cupsLangPuts(stderr, _(" -S Test with SSL " "encryption.")); _cupsLangPuts(stderr, _(" -T seconds Set the receive/send " @@ -4730,12 +4825,14 @@ usage(void) "version.")); _cupsLangPuts(stderr, _(" -X Produce XML plist instead " "of plain text.")); + _cupsLangPuts(stderr, _(" -c Produce CSV output.")); _cupsLangPuts(stderr, _(" -d name=value Set named variable to " "value.")); _cupsLangPuts(stderr, _(" -f filename Set default request " "filename.")); _cupsLangPuts(stderr, _(" -i seconds Repeat the last file with " "the given time interval.")); + _cupsLangPuts(stderr, _(" -l Produce plain text output.")); _cupsLangPuts(stderr, _(" -n count Repeat the last file the " "given number of times.")); _cupsLangPuts(stderr, _(" -q Run silently.")); @@ -5769,5 +5866,5 @@ with_value(FILE *outfile, /* I - Output file */ /* - * End of "$Id: ipptool.c 12031 2014-07-15 19:57:59Z msweet $". + * End of "$Id: ipptool.c 12143 2014-09-02 13:37:30Z msweet $". */ diff --git a/test/printer.opacity b/test/printer.opacity index 595854a243..44d805449f 100644 Binary files a/test/printer.opacity and b/test/printer.opacity differ diff --git a/test/printer.png b/test/printer.png index 18c05db107..08430fcde9 100644 Binary files a/test/printer.png and b/test/printer.png differ diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh index d437e07a41..d362126e98 100755 --- a/test/run-stp-tests.sh +++ b/test/run-stp-tests.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# "$Id: run-stp-tests.sh 12065 2014-07-30 17:56:35Z msweet $" +# "$Id: run-stp-tests.sh 12101 2014-08-20 15:10:51Z msweet $" # # Perform the complete set of IPP compliance tests specified in the # CUPS Software Test Plan. @@ -623,8 +623,7 @@ echo " $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_l echo "" if test `uname` = Darwin -a "x$VALGRIND" = x; then - DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib - ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 & + DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib MallocStackLogging=1 ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 & else $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 & fi @@ -767,6 +766,13 @@ for file in 5*.sh; do fi done +# +# Log all allocations made by the scheduler... +# +if test `uname` = Darwin -a "x$VALGRIND" = x; then + malloc_history $cupsd -callTree -showContent >$BASE/log/malloc_log 2>&1 +fi + # # Restart the server... # @@ -778,12 +784,12 @@ echo "\"5.10-restart\":" >>$strfile kill -HUP $cupsd while true; do + sleep 10 + running=`../systemv/lpstat -r 2>/dev/null` if test "x$running" = "xscheduler is running"; then break fi - - sleep 10 done description="`lpstat -l -p Test1 | grep Description | sed -e '1,$s/^[^:]*: //g'`" @@ -1060,5 +1066,5 @@ if test $fail != 0; then fi # -# End of "$Id: run-stp-tests.sh 12065 2014-07-30 17:56:35Z msweet $" +# End of "$Id: run-stp-tests.sh 12101 2014-08-20 15:10:51Z msweet $" # diff --git a/vcnet/config.h b/vcnet/config.h index 98db19a3be..9db00bc920 100644 --- a/vcnet/config.h +++ b/vcnet/config.h @@ -1,9 +1,9 @@ /* - * "$Id: config.h 12031 2014-07-15 19:57:59Z msweet $" + * "$Id: config.h 12136 2014-08-29 15:19:40Z msweet $" * * Configuration file for CUPS on Windows. * - * Copyright 2007-2013 by Apple Inc. + * Copyright 2007-2014 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -53,6 +53,15 @@ #define write _write +/* + * Map the POSIX strcasecmp() and strncasecmp() functions to the Win32 stricmp() + * and strnicmp() functions... + */ + +#define strcasecmp stricmp +#define strncasecmp strnicmp + + /* * Map the POSIX sleep() and usleep() functions to the Win32 Sleep() function... */ @@ -71,7 +80,7 @@ typedef unsigned long useconds_t; # define R_OK 04 # define O_RDONLY _O_RDONLY # define O_WRONLY _O_WRONLY -# define O_CREATE _O_CREAT +# define O_CREAT _O_CREAT # define O_TRUNC _O_TRUNC @@ -163,7 +172,7 @@ typedef unsigned long useconds_t; /* - * Do we have domain socket support? + * Do we have domain socket support, and if so what is the default one? */ #undef CUPS_DEFAULT_DOMAINSOCKET @@ -197,6 +206,13 @@ typedef unsigned long useconds_t; #define CUPS_STATEDIR "C:/CUPS/run" +/* + * Do we have posix_spawn? + */ + +/* #undef HAVE_POSIX_SPAWN */ + + /* * Do we have ZLIB? */ @@ -209,10 +225,7 @@ typedef unsigned long useconds_t; * Do we have PAM stuff? */ -#ifndef HAVE_LIBPAM #define HAVE_LIBPAM 0 -#endif /* !HAVE_LIBPAM */ - /* #undef HAVE_PAM_PAM_APPL_H */ /* #undef HAVE_PAM_SET_ITEM */ /* #undef HAVE_PAM_SETCRED */ @@ -360,6 +373,13 @@ typedef unsigned long useconds_t; #define HAVE_SSL +/* + * Do we have the gnutls_transport_set_pull_timeout_function function? + */ + +/* #undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */ + + /* * What Security framework headers do we have? */ @@ -382,6 +402,20 @@ typedef unsigned long useconds_t; /* #undef HAVE_CSSMERRORSTRING */ +/* + * Do we have the SecGenerateSelfSignedCertificate function? + */ + +/* #undef HAVE_SECGENERATESELFSIGNEDCERTIFICATE */ + + +/* + * Do we have the SecKeychainOpen function? + */ + +/* #undef HAVE_SECKEYCHAINOPEN */ + + /* * Do we have libpaper? */ @@ -502,6 +536,13 @@ typedef unsigned long useconds_t; /* #undef HAVE_LAUNCHD */ +/* + * Do we have systemd support? + */ + +/* #undef HAVE_SYSTEMD */ + + /* * Various scripting languages... */ @@ -579,6 +620,7 @@ typedef unsigned long useconds_t; /* #undef HAVE_DBUS */ /* #undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */ +/* #undef HAVE_DBUS_THREADS_INIT */ /* @@ -750,5 +792,5 @@ static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); } #endif /* !_CUPS_CONFIG_H_ */ /* - * End of "$Id: config.h 12031 2014-07-15 19:57:59Z msweet $". + * End of "$Id: config.h 12136 2014-08-29 15:19:40Z msweet $". */ diff --git a/vcnet/cups.sln b/vcnet/cups.sln index 4f3c0d9cbb..277d7623f9 100644 --- a/vcnet/cups.sln +++ b/vcnet/cups.sln @@ -50,6 +50,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ippfind", "ippfind.vcproj", {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} EndProjectSection EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "sw-ippeveselfcert10", "sw-ippeveselfcert10.vdproj", "{7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ippserver", "ippserver.vcproj", "{82A03BC7-0746-4B85-8908-3C7A3FAA58A9}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -137,6 +144,22 @@ Global {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|Win32.Build.0 = Release|Win32 {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|x64.ActiveCfg = Release|x64 {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|x64.Build.0 = Release|x64 + {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|Win32.ActiveCfg = Debug + {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|Win32.Build.0 = Debug + {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|x64.ActiveCfg = Debug + {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|x64.Build.0 = Debug + {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|Win32.ActiveCfg = Release + {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|Win32.Build.0 = Release + {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|x64.ActiveCfg = Release + {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|x64.Build.0 = Release + {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|Win32.ActiveCfg = Debug|Win32 + {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|Win32.Build.0 = Debug|Win32 + {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|x64.ActiveCfg = Debug|x64 + {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|x64.Build.0 = Debug|x64 + {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|Win32.ActiveCfg = Release|Win32 + {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|Win32.Build.0 = Release|Win32 + {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|x64.ActiveCfg = Release|x64 + {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/vcnet/ippserver.vcproj b/vcnet/ippserver.vcproj new file mode 100644 index 0000000000..fe5aaad6e7 --- /dev/null +++ b/vcnet/ippserver.vcproj @@ -0,0 +1,357 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vcnet/libcups2.vcproj b/vcnet/libcups2.vcproj index d2f0e4fac7..d22a863ba1 100644 --- a/vcnet/libcups2.vcproj +++ b/vcnet/libcups2.vcproj @@ -1530,6 +1530,10 @@ RelativePath=".\config.h" > + + diff --git a/vcnet/sw-ippeveselfcert10.vdproj b/vcnet/sw-ippeveselfcert10.vdproj new file mode 100644 index 0000000000..2895a46dad --- /dev/null +++ b/vcnet/sw-ippeveselfcert10.vdproj @@ -0,0 +1,1581 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:sw-ippeveselfcert10" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_156E3B06B7D14775B28242360FB7D1A0" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1A1324305D78463BBFC62269C56DCF0B" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1BCBABF5693841AE92515645BB7765F4" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE" + "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_27AB74FFFBC7436B9EBC6AE23968CFCC" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_299D5816FF7142F3B2791685551AD1DC" + "OwnerKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_43D276E6E3054544A6A9828BE66519CD" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_466C1CF41795452A8B76425F8D05D8B8" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_58DC0E72F0944BEFB927AED718CD1660" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_592FC984DBFD494D9FB7DFFEA35AD7A5" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_842C04D73EBC4F5DBC2FD58D5B98D5D1" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_965005559A264140806149D54E2243BB" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_9967519E7058965D4C7DEF47EB39CC50" + "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_9CB71023ADF84278A4A5EBC398F6C9F3" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_9FBF78D7B89EEA843380D5F10E1954D7" + "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A" + "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A" + "OwnerKey" = "8:_58DC0E72F0944BEFB927AED718CD1660" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A" + "OwnerKey" = "8:_466C1CF41795452A8B76425F8D05D8B8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A" + "OwnerKey" = "8:_E97571D3FBE048DABDC59B37762D800F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A" + "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A9EA3BF89F284AB4853F0682CE277275" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B7D835B019744E61A7CC37B57B38694E" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BD5B70C103EF41D9A30CF249D2B93CEB" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C430646D6E7C4CBDA84F951AE95EB76F" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D02EB13951314EFD9C539150EF8E53B8" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D219587BACAC4D5FB4C8010900A781AD" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5CD9D9AB1644688A1D54B1589BDF724" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E3C6C5A7FDD94965B68960844461D5EA" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E5E464C7DD97439B929E1EA1844F1FF0" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E97571D3FBE048DABDC59B37762D800F" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F22F5380A6E14A43A15A452C7C6F6C07" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:sw-ippeveselfcert10-windows.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:3" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1" + { + "Name" = "8:.NET Framework 3.5 SP1" + "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1" + } + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" + { + "Name" = "8:Windows Installer 3.1" + "ProductCode" = "8:Microsoft.Windows.Installer.3.1" + } + } + } + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:ipptool-windows.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:3" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1" + { + "Name" = "8:.NET Framework 3.5 SP1" + "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1" + } + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" + { + "Name" = "8:Windows Installer 3.1" + "ProductCode" = "8:Microsoft.Windows.Installer.3.1" + } + } + } + } + } + "Deployable" + { + "CustomAction" + { + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + } + } + "File" + { + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_156E3B06B7D14775B28242360FB7D1A0" + { + "SourcePath" = "8:..\\everywhere\\document-tests.bat" + "TargetName" = "8:document-tests.bat" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1A1324305D78463BBFC62269C56DCF0B" + { + "SourcePath" = "8:..\\doc\\help\\man-ipptoolfile.html" + "TargetName" = "8:man-ipptoolfile.html" + "Tag" = "8:" + "Folder" = "8:_26743E387598422398CF503F7478F9E1" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1BCBABF5693841AE92515645BB7765F4" + { + "SourcePath" = "8:..\\everywhere\\man-ippserver.html" + "TargetName" = "8:man-ippserver.html" + "Tag" = "8:" + "Folder" = "8:_26743E387598422398CF503F7478F9E1" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE" + { + "SourcePath" = "8:zlibwapi.dll" + "TargetName" = "8:zlibwapi.dll" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_27AB74FFFBC7436B9EBC6AE23968CFCC" + { + "SourcePath" = "8:..\\everywhere\\README.txt" + "TargetName" = "8:README.txt" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_43D276E6E3054544A6A9828BE66519CD" + { + "SourcePath" = "8:..\\test\\printer.png" + "TargetName" = "8:printer.png" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_592FC984DBFD494D9FB7DFFEA35AD7A5" + { + "SourcePath" = "8:..\\doc\\help\\man-ippfind.html" + "TargetName" = "8:man-ippfind.html" + "Tag" = "8:" + "Folder" = "8:_26743E387598422398CF503F7478F9E1" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_842C04D73EBC4F5DBC2FD58D5B98D5D1" + { + "SourcePath" = "8:..\\test\\document-a4.pdf" + "TargetName" = "8:document-a4.pdf" + "Tag" = "8:" + "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_965005559A264140806149D54E2243BB" + { + "SourcePath" = "8:..\\everywhere\\bonjour-access-tests.test" + "TargetName" = "8:bonjour-access-tests.test" + "Tag" = "8:" + "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9967519E7058965D4C7DEF47EB39CC50" + { + "SourcePath" = "8:CRYPT32.dll" + "TargetName" = "8:CRYPT32.dll" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9CB71023ADF84278A4A5EBC398F6C9F3" + { + "SourcePath" = "8:..\\everywhere\\bonjour-tests.bat" + "TargetName" = "8:bonjour-tests.bat" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9FBF78D7B89EEA843380D5F10E1954D7" + { + "SourcePath" = "8:Secur32.dll" + "TargetName" = "8:Secur32.dll" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A9EA3BF89F284AB4853F0682CE277275" + { + "SourcePath" = "8:..\\everywhere\\bonjour-value-tests.test" + "TargetName" = "8:bonjour-value-tests.test" + "Tag" = "8:" + "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B7D835B019744E61A7CC37B57B38694E" + { + "SourcePath" = "8:..\\everywhere\\document-tests.test" + "TargetName" = "8:document-tests.test" + "Tag" = "8:" + "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_BD5B70C103EF41D9A30CF249D2B93CEB" + { + "SourcePath" = "8:setdebug.bat" + "TargetName" = "8:setdebug.bat" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C430646D6E7C4CBDA84F951AE95EB76F" + { + "SourcePath" = "8:..\\test\\color.jpg" + "TargetName" = "8:color.jpg" + "Tag" = "8:" + "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D219587BACAC4D5FB4C8010900A781AD" + { + "SourcePath" = "8:..\\everywhere\\ipp-tests.test" + "TargetName" = "8:ipp-tests.test" + "Tag" = "8:" + "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D5CD9D9AB1644688A1D54B1589BDF724" + { + "SourcePath" = "8:..\\doc\\help\\man-ipptool.html" + "TargetName" = "8:man-ipptool.html" + "Tag" = "8:" + "Folder" = "8:_26743E387598422398CF503F7478F9E1" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E3C6C5A7FDD94965B68960844461D5EA" + { + "SourcePath" = "8:..\\LICENSE.txt" + "TargetName" = "8:LICENSE.txt" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E5E464C7DD97439B929E1EA1844F1FF0" + { + "SourcePath" = "8:..\\everywhere\\ipp-tests.bat" + "TargetName" = "8:ipp-tests.bat" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F22F5380A6E14A43A15A452C7C6F6C07" + { + "SourcePath" = "8:..\\test\\document-letter.pdf" + "TargetName" = "8:document-letter.pdf" + "Tag" = "8:" + "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + } + "FileType" + { + } + "Folder" + { + "{1525181F-901A-416C-8A58-119130FE478E}:_BEC0EAE20C954C78B294B83E6696156E" + { + "Name" = "8:#1919" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:ProgramMenuFolder" + "Folders" + { + "{9EF0B969-E518-4E46-987F-47570745A589}:_E379D4EDBAD0460BB876711E9062ADB4" + { + "Name" = "8:IPP Everywhere Printer Self-Certification Tools" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_D115D2F4F12143B09D5FDA447A6A7D04" + "Folders" + { + } + } + } + } + "{1525181F-901A-416C-8A58-119130FE478E}:_D02CDADE99F344CF92CA1A8D0278861F" + { + "Name" = "8:#1916" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:DesktopFolder" + "Folders" + { + } + } + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + { + "DefaultLocation" = "8:[ProgramFilesFolder]\\sw-ippeveselfcert10" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + "{9EF0B969-E518-4E46-987F-47570745A589}:_26743E387598422398CF503F7478F9E1" + { + "Name" = "8:doc" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_5CD53B90FF754768B11ECBEB671A1749" + "Folders" + { + } + } + "{9EF0B969-E518-4E46-987F-47570745A589}:_EB00D0298C7E441EBD0257AC04FB3560" + { + "Name" = "8:ipptool" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_6F223FB51798428A9F2D64A5A7F2B49C" + "Folders" + { + } + } + } + } + } + "LaunchCondition" + { + } + "Locator" + { + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:IPP Everywhere Printer Self-Certification Tools" + "ProductCode" = "8:{C08E3AC5-4FBF-40DD-BD19-9BE69A609DAF}" + "PackageCode" = "8:{25FF31C9-52A0-4838-8F1D-02FB5D5296F4}" + "UpgradeCode" = "8:{BAB6EBBB-515D-4155-9FEF-D98DA76814CA}" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:TRUE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:TRUE" + "ProductVersion" = "8:14.08.2600" + "Manufacturer" = "8:Apple Inc." + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:http://www.cups.org/str.php" + "Title" = "8:sw-ippeveselfcert10" + "Subject" = "8:" + "ARPCONTACT" = "8:Apple Inc." + "Keywords" = "8:IPP, Internet Printing Protocol" + "ARPCOMMENTS" = "8:IPP Everywhere Printer Self-Certification Tools" + "ARPURLINFOABOUT" = "8:http://www.cups.org/" + "ARPPRODUCTICON" = "8:" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BC4E66686BCA4F9A8B24B6CF2728DACD" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F9AB9B310C7545D993D690F529048AA2" + { + "Name" = "8:cups.org" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4E5BAC705A1D44E78C90C6D2A4A7BE20" + { + "Name" = "8:installdir" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:2" + "Value" = "8:[TARGETDIR]" + } + } + } + } + "Values" + { + } + } + } + } + "HKCU" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A4C9879F42874B6B92960A55F2D98922" + { + "Name" = "8:Software" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1ACB03C307FB4B85BB27C9913FB58B09" + { + "Name" = "8:[Manufacturer]" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + } + } + "HKCR" + { + "Keys" + { + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_57BCED85BA5944009F56A11D5A9FBBEE" + { + "Name" = "8:ippfind Documentation" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_592FC984DBFD494D9FB7DFFEA35AD7A5" + "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4" + "WorkingFolder" = "8:_26743E387598422398CF503F7478F9E1" + "Icon" = "8:" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_63715171338D40FFBC5B47A1418B4814" + { + "Name" = "8:README" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_27AB74FFFBC7436B9EBC6AE23968CFCC" + "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4" + "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Icon" = "8:" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_70CF74DB997A408DBBFD48AB10F92321" + { + "Name" = "8:ipptool Documentation" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_D5CD9D9AB1644688A1D54B1589BDF724" + "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4" + "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Icon" = "8:" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_962004B0D5CA479A91EFA7F7BF7814C8" + { + "Name" = "8:ippserver Documentation" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_1BCBABF5693841AE92515645BB7765F4" + "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4" + "WorkingFolder" = "8:_26743E387598422398CF503F7478F9E1" + "Icon" = "8:" + "Feature" = "8:" + } + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_BD2A7DF74D844FF5919EE8340EE36ECD" + { + "Name" = "8:Test File Documentation" + "Arguments" = "8:" + "Description" = "8:" + "ShowCmd" = "3:1" + "IconIndex" = "3:0" + "Transitive" = "11:FALSE" + "Target" = "8:_1A1324305D78463BBFC62269C56DCF0B" + "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4" + "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Icon" = "8:" + "Feature" = "8:" + } + } + "UserInterface" + { + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_045DF90B1FF941A9BA7A742CFC0A6C00" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_345BD86390E841A98B74ED3E07945F8C" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_067C143A8731427180B1568AF8C07375" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A2F2CC6EB9D7453599E7598D4D0629A5" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C2B41369B7334F419318792EBA031412" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:This computer program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2." + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_6B654A06090344BA9AA443E0D0296737" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FB4E7BBC3DA242309FFB58F9A6194A93" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_712819C7C4F042ABB708949BD4426628" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2F49D4FACB954AF2B786D2AD9206D053" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:2" + "Value" = "8:This computer program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2." + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_770E25BC453A464EA8CD51381FDDDD9F" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9534A64B629F4F868D6D7A384C76DCB2" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_770CCEFF81BD46A182A6E816A41A0E81" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_75E0C1FD245D493DA0D7E3E0BC0C365F" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_933B15E9A383418F8ADF3B13F68458F3" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E310DA8CED734E00950A3C5D630CE987" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CB172E69F9C74901BE1040336CFD4F72" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F44F9BE9B54940848289669635E4A5A2" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_14751F327A634B989283C8F28CFB6DFC" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_299D5816FF7142F3B2791685551AD1DC" + { + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:TRUE" + "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm" + "Properties" + { + } + "LanguageId" = "3:0" + "Exclude" = "11:FALSE" + "Folder" = "8:" + "Feature" = "8:" + "IsolateTo" = "8:" + } + "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_A1CB27EFF4094C39B58D0BE5A272DF1A" + { + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:TRUE" + "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm" + "Properties" + { + } + "LanguageId" = "3:0" + "Exclude" = "11:FALSE" + "Folder" = "8:" + "Feature" = "8:" + "IsolateTo" = "8:" + } + } + "ProjectOutput" + { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_466C1CF41795452A8B76425F8D05D8B8" + { + "SourcePath" = "8:Win32\\Debug\\ippserver.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{82A03BC7-0746-4B85-8908-3C7A3FAA58A9}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_58DC0E72F0944BEFB927AED718CD1660" + { + "SourcePath" = "8:Win32\\Debug\\ippfind.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{B484DA0C-62C8-4C32-83B6-CCEB58968B85}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D02EB13951314EFD9C539150EF8E53B8" + { + "SourcePath" = "8:Win32\\Debug\\regex.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E97571D3FBE048DABDC59B37762D800F" + { + "SourcePath" = "8:Win32\\Debug\\ipptool.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_EA282F32A10B4ED1A81AA6133B997C6A" + { + "SourcePath" = "8:Win32\\Debug\\libcups2.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + } +} diff --git a/xcode/CUPS.xcodeproj/project.pbxproj b/xcode/CUPS.xcodeproj/project.pbxproj index bff5aa0363..9d658ffeda 100644 --- a/xcode/CUPS.xcodeproj/project.pbxproj +++ b/xcode/CUPS.xcodeproj/project.pbxproj @@ -30,6 +30,7 @@ ); dependencies = ( 274FF5E313332D4300317ECB /* PBXTargetDependency */, + 72BEA8D819AFA8BB0085F0F3 /* PBXTargetDependency */, 72F75A711336FACD004BB496 /* PBXTargetDependency */, 274FF5E513332D4300317ECB /* PBXTargetDependency */, 274FF622133331D300317ECB /* PBXTargetDependency */, @@ -44,6 +45,8 @@ 274FF65E13333A3400317ECB /* PBXTargetDependency */, 724379531333FECE009631B9 /* PBXTargetDependency */, 724379111333E4EA009631B9 /* PBXTargetDependency */, + 72BEA8D619AFA8A00085F0F3 /* PBXTargetDependency */, + 72BEA8D419AFA89C0085F0F3 /* PBXTargetDependency */, 276683FF1337F7C5000D33D0 /* PBXTargetDependency */, 7243792B1333E962009631B9 /* PBXTargetDependency */, 276683D71337B24A000D33D0 /* PBXTargetDependency */, @@ -893,6 +896,27 @@ remoteGlobalIDString = 274FF6891333B1C400317ECB; remoteInfo = libcups_static; }; + 72BEA8D319AFA89C0085F0F3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 726AD6F6135E88F0002C930D; + remoteInfo = ippserver; + }; + 72BEA8D519AFA8A00085F0F3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72CF95E618A19134000FCAE4; + remoteInfo = ippfind; + }; + 72BEA8D719AFA8BB0085F0F3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF6891333B1C400317ECB; + remoteInfo = libcups_static; + }; 72CF95E818A19134000FCAE4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 72BF96371333042100B1EAD7 /* Project object */; @@ -3925,6 +3949,21 @@ target = 274FF6891333B1C400317ECB /* libcups_static */; targetProxy = 726AD705135E8AC5002C930D /* PBXContainerItemProxy */; }; + 72BEA8D419AFA89C0085F0F3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 726AD6F6135E88F0002C930D /* ippserver */; + targetProxy = 72BEA8D319AFA89C0085F0F3 /* PBXContainerItemProxy */; + }; + 72BEA8D619AFA8A00085F0F3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72CF95E618A19134000FCAE4 /* ippfind */; + targetProxy = 72BEA8D519AFA8A00085F0F3 /* PBXContainerItemProxy */; + }; + 72BEA8D819AFA8BB0085F0F3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF6891333B1C400317ECB /* libcups_static */; + targetProxy = 72BEA8D719AFA8BB0085F0F3 /* PBXContainerItemProxy */; + }; 72CF95E718A19134000FCAE4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 72220EAD1333047D00FCA411 /* libcups */; diff --git a/xcode/config.h b/xcode/config.h index bd8124dc11..51a9938291 100644 --- a/xcode/config.h +++ b/xcode/config.h @@ -1,5 +1,5 @@ /* - * "$Id: config.h 11591 2014-02-14 16:07:13Z msweet $" + * "$Id: config.h 12140 2014-08-30 01:51:22Z msweet $" * * Configuration file for CUPS and Xcode. * @@ -624,13 +624,6 @@ #endif /* HAVE_ARC4RANDOM */ -/* - * Do we have vproc_transaction_begin/end? - */ - -#define HAVE_VPROC_TRANSACTION_BEGIN 1 - - /* * Do we have libusb? */ @@ -706,5 +699,5 @@ static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); } #endif /* !_CUPS_CONFIG_H_ */ /* - * End of "$Id: config.h 11591 2014-02-14 16:07:13Z msweet $". + * End of "$Id: config.h 12140 2014-08-30 01:51:22Z msweet $". */