Comparar commits
1 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 9249a35bcd |
@@ -1,6 +1,185 @@
|
||||
CHANGES.txt - 2007-07-12
|
||||
CHANGES.txt - 2007-09-28
|
||||
------------------------
|
||||
|
||||
CHANGES IN CUPS V1.3.3
|
||||
|
||||
- The scheduler did not use the attributes-natural-language
|
||||
attribute when passing the LANG environment variable to
|
||||
cups-deviced or cups-driverd.
|
||||
- The scheduler did not use the printer-op-policy when
|
||||
modifying classes or printers (STR #2525)
|
||||
- The auth-info-required attribute was not always updated
|
||||
for remote queues that required authentication.
|
||||
- The German web interface localization contained errors
|
||||
(STR #2523)
|
||||
- The Swedish localization contained errors (STR #2522)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.3.2
|
||||
|
||||
- The 1.3.1 release was incorrectly created from the
|
||||
1.4.x source tree (STR #2519)
|
||||
- Added support for 32/64-bit libraries on HP-UX
|
||||
(STR #2520)
|
||||
- The scheduler incorrectly used portrait as the default
|
||||
orientation (STR #2513)
|
||||
- The scheduler no longer writes the printcap file for
|
||||
every remote printer update (STR #2512)
|
||||
- Remote raw printing with multiple copies did not work
|
||||
(STR #2518)
|
||||
- Updated the configure script to require at least autoconf
|
||||
2.60 (STR #2515)
|
||||
- Some gzip'd PPD files were not read in their entirety
|
||||
(STR #2510)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.3.1
|
||||
|
||||
- Documentation updates.
|
||||
- The USB backend on Mac OS X could hang if the driver and
|
||||
printer did not match.
|
||||
- Delegated Kerberos credentials were not working.
|
||||
- "make distclean" incorrectly removed the edit-config.tmpl
|
||||
files (STR #2508)
|
||||
- Fix compile problem on HP-UX (STR #2501)
|
||||
- The cupstestppd utility now tests for resolutions greater
|
||||
than 99999 DPI to detect a missing "x" between the X and Y
|
||||
resolutions.
|
||||
- Fixed many problems in the various translations and added
|
||||
a new "checkpo" utility to validate them.
|
||||
- The cupstestppd utility now tests the custom page size code
|
||||
for CUPS raster drivers.
|
||||
- cupsLangDefault() did not attempt to return a language that
|
||||
was supported by the calling application.
|
||||
- If a remote printer stopped while a job was being sent, the
|
||||
local queue would also get stopped and the job re-queued,
|
||||
resulting in duplicate prints in some cases.
|
||||
- A few Apple-specific job options needed to be omitted when
|
||||
printing a banner page.
|
||||
- The new peer credential support did not compile on FreeBSD
|
||||
(STR #2495)
|
||||
- Direct links to help files did not set the current section
|
||||
so the table-of-contents was not shown.
|
||||
- The configure script did not support --localedir=foo (STR #2488)
|
||||
- The backends were not displaying their localized messages.
|
||||
- CUPS-Authenticate-Job did not require Kerberos authentication
|
||||
on queues protected by Kerberos.
|
||||
- The Zebra ZPL driver did not work with Brady label printers
|
||||
(STR #2487)
|
||||
- Norwegian wasn't localized on Mac OS X.
|
||||
- getnameinfo() returns an error on some systems when DNS is
|
||||
not available, leading to numerous problems (STR #2486)
|
||||
- The cupsfilter command did not work properly on Mac OS X.
|
||||
- The scheduler makefile contained a typo (STR #2483)
|
||||
- The TBCP and BCP port monitors did not handle the trailing
|
||||
CTRL-D in some PostScript output properly.
|
||||
- Fixed the localization instructions and German template for
|
||||
the "Find New Printers" button (STR #2478)
|
||||
- The web interface did not work with the Chinese localization
|
||||
(STR #2477)
|
||||
- The web interface home page did not work for languages that
|
||||
were only partially localized (STR #2472)
|
||||
- Updated the Spanish web interface localization (STR #2473)
|
||||
- ppdLocalize() did not work for country-specific localizations.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.3.0
|
||||
|
||||
- The scheduler did not handle out-of-file conditions
|
||||
gracefully when accepting new connections, leading to
|
||||
heavy CPU usage.
|
||||
- The scheduler did not detect ServerBin misconfigurations
|
||||
(STR #2470)
|
||||
- "AuthType Default" did not work as expected when the
|
||||
"DefaultAuthType foo" line appeared after it in the
|
||||
cupsd.conf file.
|
||||
- The on-line help did not describe many common printing
|
||||
options (STR #1846)
|
||||
- The IPP backend did not return the "auth required" status
|
||||
when printing to a Kerberos-protected queue.
|
||||
- The scheduler was not looking in the correct directories
|
||||
for LSB PPD files (STR #2464)
|
||||
- Changed references to ESP Ghostscript to GPL Ghostscript
|
||||
(STR #2463)
|
||||
- The PostScript filter did not cleanly terminate when
|
||||
the job was canceled or stopped.
|
||||
- Fixed generation of Kerberos credentials for remote
|
||||
printing. Note that this requires a recent version of
|
||||
MIT Kerberos with a working krb5_cc_new_unique()
|
||||
function or Heimdal Kerberos.
|
||||
- Added Portuguese and updated Italian message catalogs.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.3rc2
|
||||
|
||||
- Added more range checking to the pdftops filter.
|
||||
- The scheduler would crash if a remote IPP queue was stopped
|
||||
(STR #2460)
|
||||
- The scheduler did not allow "DefaultAuthType None".
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.3rc1
|
||||
|
||||
- Updated the German localization (STR #2443)
|
||||
- cupsAdminGetServerSettings() did not handle </Foo> properly.
|
||||
- When lprm and cancel are run with no job ID, they now will
|
||||
cancel the first stopped job if no pending or processing
|
||||
jobs are left in the queue.
|
||||
- The scheduler now logs successful print jobs, filter
|
||||
failures, and the job file types at the default log
|
||||
level (STR #2458)
|
||||
- The scheduler now logs the usernames it is using for
|
||||
authorization at LogLevel debug instead of debug2 (STR #2448)
|
||||
- Added Intellitech Intellibar and Zebra CPCL PPDs to the list
|
||||
of installed PPDs.
|
||||
- Added 6" and 8" wide label sizes for the Zebra ZPL Label
|
||||
Printer driver (STR #2442)
|
||||
- The cupsaddsmb program and web interface now support
|
||||
exporting of 64-bit Windows drivers, when available
|
||||
(STR #2439)
|
||||
- Moving a job that was printing did not stop the job on the
|
||||
original printer (STR #2262)
|
||||
- The cups-lpd mini-daemon did not work on Mac OS X server.
|
||||
- Added httpGetAuthString() and httpSetAuthString() APIs to get
|
||||
and set the current (cached) authorization string to use for
|
||||
HTTP requests.
|
||||
- Updated the default cupsd.conf policy to list the
|
||||
"administrative" operations separately from the "printer
|
||||
control" operations so that it is easier to define a
|
||||
group of users that are "printer operators".
|
||||
- The web interface now pulls the default cupsd.conf file
|
||||
from cupsd.conf.default in the CUPS config directory.
|
||||
- Added a help file for using Kerberos with CUPS.
|
||||
- The scheduler now strips the "@KDC" portion of Kerberos
|
||||
usernames since those usernames typically do not appear in
|
||||
the group membership lists used by CUPS.
|
||||
- cupsMarkOptions() could (incorrectly) leave multiple option
|
||||
choices marked.
|
||||
- Backends could (incorrectly) run as root during discovery
|
||||
(STR #2454)
|
||||
- Avahi is now supported for DNS-SD (Bonjour) printer sharing
|
||||
(STR #2455)
|
||||
- The default cupsd.conf file had typos and old operation names
|
||||
(STR #2450)
|
||||
- The scheduler now erases authentication cache files using the
|
||||
7-pass US DoD algorithm.
|
||||
- Delegated Kerberos credentials (proxy authentication) did not
|
||||
work.
|
||||
- The filter makefile did not optimize the libcupsimage.2.dylib
|
||||
with a sectorder file.
|
||||
- The IPP backend incorrectly wrote an empty printer message
|
||||
when processing the "none" state reason.
|
||||
- The USB backend could deadlock on Mac OS X while performing
|
||||
a side-channel command.
|
||||
- The scheduler did not prevent remote queues from being
|
||||
shared/published.
|
||||
- The scheduler did not remove the temporary request file on
|
||||
authentication errors.
|
||||
- ppdLocalizeIPPReason() did not handle "scheme:" schemes or
|
||||
"file" URLs.
|
||||
- ppdLocalizeIPPReason() was not exported on Mac OS X.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.3b1
|
||||
|
||||
- Copyright updates - CUPS is now owned by Apple Inc.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
CREDITS.txt - 2007-02-05
|
||||
CREDITS.txt - 2007-09-10
|
||||
------------------------
|
||||
|
||||
Few projects are completed by one person, and CUPS is no exception. We'd
|
||||
@@ -19,6 +19,7 @@ like to thank the following individuals for their contributions:
|
||||
Till Kamppeter - Bug fixes, beta testing, evangelism.
|
||||
Kenshi Muto - Japanese localization, patches, and
|
||||
testing.
|
||||
Tomohiro Kato - Japanese localization.
|
||||
Kiko - Bug fixes.
|
||||
Sergey V. Kovalyov - ESP Print Pro and CUPS beta tester.
|
||||
Marek Laane - Estonian translation.
|
||||
@@ -36,7 +37,7 @@ like to thank the following individuals for their contributions:
|
||||
Opher Shachar - Hebrew localization.
|
||||
Stuart Stevens - HP JetDirect IPP information.
|
||||
Andrea Suatoni - IRIX desktop integration and testing.
|
||||
Tomohiro Kato - Japanese localization.
|
||||
Teppo Turlianen - Finnish localization.
|
||||
Tim Waugh - Lots of patches, testing, and Linux
|
||||
integration.
|
||||
Yugami - LDAP browsing support.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
INSTALL - CUPS v1.3b1 - 2007-07-12
|
||||
INSTALL - CUPS v1.3.2 - 2007-09-18
|
||||
----------------------------------
|
||||
|
||||
This file describes how to compile and install CUPS from source
|
||||
@@ -6,8 +6,10 @@ code. For more information on CUPS see the file called
|
||||
"README.txt". A complete change log can be found in
|
||||
"CHANGES.txt".
|
||||
|
||||
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO ****
|
||||
**** NEED TO INSTALL ESP GHOSTSCRIPT AFTER YOU INSTALL CUPS ****
|
||||
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER AND ARE NOT ****
|
||||
**** RUNNING MAC OS X, YOU WILL ALSO NEED TO INSTALL GPL ****
|
||||
**** GHOSTSCRIPT WITH THE "cups" DRIVER AFTER YOU INSTALL ****
|
||||
**** CUPS. ****
|
||||
|
||||
|
||||
BEFORE YOU BEGIN
|
||||
@@ -20,7 +22,7 @@ BEFORE YOU BEGIN
|
||||
The makefiles used by the project should work with all
|
||||
versions of make. We've tested them with GNU make as well as
|
||||
the make programs shipped by Compaq, HP, SGI, and Sun.
|
||||
FreeBSD users should use GNU make (gmake).
|
||||
BSD users should use GNU make (gmake).
|
||||
|
||||
Besides these tools you'll want the JPEG, PNG, TIFF, and ZLIB
|
||||
libraries for image support, the CDSA, GNU TLS, or OpenSSL
|
||||
@@ -29,10 +31,16 @@ BEFORE YOU BEGIN
|
||||
compile and run without these, however you'll miss out on
|
||||
many of the features provided by CUPS.
|
||||
|
||||
Kerberos support requires a very recent version of the MIT
|
||||
implementation with the krb5_cc_new_unique() function or the
|
||||
Heimdal implementation, along with the corresponding GSSAPI
|
||||
pieces.
|
||||
|
||||
Also, please note that CUPS no longer includes the
|
||||
Ghostscript- based pstoraster filter. You *must* download
|
||||
ESP Ghostscript separately from the CUPS web site if you want
|
||||
to print PostScript files to non-PostScript printers.
|
||||
GPL Ghostscript separately from the CUPS web site if you want
|
||||
to print PostScript files to non-PostScript printers on
|
||||
operating systems other than Mac OS X.
|
||||
|
||||
|
||||
COMPILING FROM SUBVERSION
|
||||
|
||||
@@ -131,6 +131,7 @@ LDFLAGS = -L../cups -L../filter @LDARCHFLAGS@ \
|
||||
@LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM)
|
||||
LEGACY_BACKENDS = @LEGACY_BACKENDS@
|
||||
LIBCUPSORDER = @LIBCUPSORDER@
|
||||
LIBCUPSIMAGEORDER = @LIBCUPSIMAGEORDER@
|
||||
LINKCUPS = @LINKCUPS@ $(SSLLIBS)
|
||||
LINKCUPSIMAGE = @LINKCUPSIMAGE@
|
||||
LIBS = $(LINKCUPS) $(COMMONLIBS)
|
||||
|
||||
@@ -63,9 +63,8 @@ distclean: clean
|
||||
$(RM) man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
|
||||
$(RM) man/cupsd.conf.man man/lpoptions.man
|
||||
$(RM) packaging/cups.list
|
||||
$(RM) templates/edit-config.tmpl templates/header.tmpl
|
||||
$(RM) templates/header.tmpl
|
||||
-$(RM) doc/*/index.html
|
||||
-$(RM) templates/*/edit-config.tmpl
|
||||
-$(RM) templates/*/header.tmpl
|
||||
-$(RM) -r autom4te*.cache
|
||||
|
||||
|
||||
@@ -1,14 +1,6 @@
|
||||
README - CUPS v1.3b1 - 2007-07-13
|
||||
README - CUPS v1.3.2 - 2007-09-18
|
||||
---------------------------------
|
||||
|
||||
******************************************************************
|
||||
******************************************************************
|
||||
**** ****
|
||||
**** BETA SOFTWARE - USE AT YOUR OWN RISK ****
|
||||
**** ****
|
||||
******************************************************************
|
||||
******************************************************************
|
||||
|
||||
Looking for compile instructions? Read the file "INSTALL.txt"
|
||||
instead...
|
||||
|
||||
@@ -30,12 +22,11 @@ INTRODUCTION
|
||||
to support real-world printing under UNIX.
|
||||
|
||||
CUPS includes an image file RIP that supports printing of
|
||||
image files to non-PostScript printers. A customized version
|
||||
of GPL Ghostscript for CUPS called ESP Ghostscript is
|
||||
available separately to support printing of PostScript files
|
||||
within the CUPS driver framework. Sample drivers for Dymo,
|
||||
EPSON, HP, OKIDATA, and Zebra printers are included that use
|
||||
these filters.
|
||||
image files to non-PostScript printers. GPL Ghostscript now
|
||||
includes the "cups" driver to support printing of PostScript
|
||||
files within the CUPS driver framework. Sample drivers for
|
||||
Dymo, EPSON, HP, OKIDATA, and Zebra printers are included that
|
||||
use these filters.
|
||||
|
||||
CUPS is licensed under the GNU General Public License and GNU
|
||||
Library General Public License versions 2.
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
|
||||
include ../Makedefs
|
||||
|
||||
RBACKENDS = lpd
|
||||
UBACKENDS = ipp $(PAP) $(LEGACY_BACKENDS) serial snmp socket usb
|
||||
RBACKENDS = ipp lpd
|
||||
UBACKENDS = $(PAP) $(LEGACY_BACKENDS) serial snmp socket usb
|
||||
TARGETS = betest test1284 libbackend.a $(RBACKENDS) $(UBACKENDS)
|
||||
LIBOBJS = ieee1284.o runloop.o
|
||||
OBJS = betest.o ipp.o lpd.o pap.o parallel.o scsi.o \
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
*/
|
||||
|
||||
static char *password = NULL; /* Password for device URI */
|
||||
static int password_tries = 0; /* Password tries */
|
||||
#ifdef __APPLE__
|
||||
static char pstmpname[1024] = ""; /* Temporary PostScript file name */
|
||||
#endif /* __APPLE__ */
|
||||
@@ -66,12 +67,12 @@ static void cancel_job(http_t *http, const char *uri, int id,
|
||||
const char *resource, const char *user, int version);
|
||||
static void check_printer_state(http_t *http, const char *uri,
|
||||
const char *resource, const char *user,
|
||||
int version);
|
||||
int version, int job_id);
|
||||
#ifdef HAVE_LIBZ
|
||||
static void compress_files(int num_files, char **files);
|
||||
#endif /* HAVE_LIBZ */
|
||||
static const char *password_cb(const char *);
|
||||
static int report_printer_state(ipp_t *ipp);
|
||||
static int report_printer_state(ipp_t *ipp, int job_id);
|
||||
|
||||
#ifdef __APPLE__
|
||||
static int run_pictwps_filter(char **argv, const char *filename);
|
||||
@@ -101,9 +102,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
addrname[256], /* Address name */
|
||||
*optptr, /* Pointer to URI options */
|
||||
name[255], /* Name of option */
|
||||
value[255], /* Value of option */
|
||||
*ptr; /* Pointer into name or value */
|
||||
*name, /* Name of option */
|
||||
*value, /* Value of option */
|
||||
sep; /* Separator character */
|
||||
int num_files; /* Number of files to print */
|
||||
char **files, /* Files to print */
|
||||
*filename; /* Pointer to single filename */
|
||||
@@ -131,7 +132,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */
|
||||
int copies, /* Number of copies for job */
|
||||
copies_remaining; /* Number of copies remaining */
|
||||
const char *content_type; /* CONTENT_TYPE environment variable */
|
||||
const char *content_type, /* CONTENT_TYPE environment variable */
|
||||
*final_content_type; /* FINAL_CONTENT_TYPE environment var */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Actions for POSIX signals */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
@@ -198,8 +200,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
}
|
||||
else if (argc < 6)
|
||||
{
|
||||
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
@@ -207,12 +210,16 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Get the (final) content type...
|
||||
*/
|
||||
|
||||
if ((content_type = getenv("FINAL_CONTENT_TYPE")) == NULL)
|
||||
if ((content_type = getenv("CONTENT_TYPE")) == NULL)
|
||||
content_type = "application/octet-stream";
|
||||
if ((content_type = getenv("CONTENT_TYPE")) == NULL)
|
||||
content_type = "application/octet-stream";
|
||||
|
||||
if (!strncmp(content_type, "printer/", 8))
|
||||
content_type = "application/vnd.cups-raw";
|
||||
if ((final_content_type = getenv("FINAL_CONTENT_TYPE")) == NULL)
|
||||
{
|
||||
final_content_type = content_type;
|
||||
|
||||
if (!strncmp(final_content_type, "printer/", 8))
|
||||
final_content_type = "application/vnd.cups-raw";
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the hostname and printer name from the URI...
|
||||
@@ -223,8 +230,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
hostname, sizeof(hostname), &port,
|
||||
resource, sizeof(resource)) < HTTP_URI_OK)
|
||||
{
|
||||
fputs(_("ERROR: Missing device URI on command-line and no "
|
||||
"DEVICE_URI environment variable!\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("ERROR: Missing device URI on command-line and no "
|
||||
"DEVICE_URI environment variable!\n"));
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
@@ -262,29 +270,30 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Get the name...
|
||||
*/
|
||||
|
||||
for (ptr = name; *optptr && *optptr != '=';)
|
||||
if (ptr < (name + sizeof(name) - 1))
|
||||
*ptr++ = *optptr++;
|
||||
*ptr = '\0';
|
||||
name = optptr;
|
||||
|
||||
if (*optptr == '=')
|
||||
while (*optptr && *optptr != '=' && *optptr != '+' && *optptr != '&')
|
||||
optptr ++;
|
||||
|
||||
if ((sep = *optptr) != '\0')
|
||||
*optptr++ = '\0';
|
||||
|
||||
if (sep == '=')
|
||||
{
|
||||
/*
|
||||
* Get the value...
|
||||
*/
|
||||
|
||||
optptr ++;
|
||||
value = optptr;
|
||||
|
||||
for (ptr = value; *optptr && *optptr != '+' && *optptr != '&';)
|
||||
if (ptr < (value + sizeof(value) - 1))
|
||||
*ptr++ = *optptr++;
|
||||
*ptr = '\0';
|
||||
|
||||
if (*optptr == '+' || *optptr == '&')
|
||||
while (*optptr && *optptr != '+' && *optptr != '&')
|
||||
optptr ++;
|
||||
|
||||
if (*optptr)
|
||||
*optptr++ = '\0';
|
||||
}
|
||||
else
|
||||
value[0] = '\0';
|
||||
value = (char *)"";
|
||||
|
||||
/*
|
||||
* Process the option...
|
||||
@@ -326,7 +335,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED);
|
||||
else
|
||||
{
|
||||
fprintf(stderr,
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unknown encryption option value \"%s\"!\n"),
|
||||
value);
|
||||
}
|
||||
@@ -339,7 +348,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
version = 1;
|
||||
else
|
||||
{
|
||||
fprintf(stderr,
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unknown version option value \"%s\"!\n"),
|
||||
value);
|
||||
}
|
||||
@@ -368,8 +377,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Unknown option...
|
||||
*/
|
||||
|
||||
fprintf(stderr, _("ERROR: Unknown option \"%s\" with value \"%s\"!\n"),
|
||||
name, value);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unknown option \"%s\" with value \"%s\"!\n"),
|
||||
name, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -421,10 +431,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Point to the single file from stdin...
|
||||
*/
|
||||
|
||||
filename = tmpfilename;
|
||||
files = &filename;
|
||||
num_files = 1;
|
||||
|
||||
filename = tmpfilename;
|
||||
num_files = 1;
|
||||
files = &filename;
|
||||
send_options = 0;
|
||||
}
|
||||
else
|
||||
@@ -433,10 +442,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Point to the files on the command-line...
|
||||
*/
|
||||
|
||||
num_files = argc - 6;
|
||||
files = argv + 6;
|
||||
|
||||
send_options = strncasecmp(content_type, "application/vnd.cups-", 21) != 0;
|
||||
num_files = argc - 6;
|
||||
files = argv + 6;
|
||||
send_options = 1;
|
||||
|
||||
#ifdef HAVE_LIBZ
|
||||
if (compression)
|
||||
@@ -469,7 +477,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Try loading authentication information from the environment.
|
||||
*/
|
||||
|
||||
if ((ptr = getenv("AUTH_USERNAME")) != NULL)
|
||||
const char *ptr = getenv("AUTH_USERNAME");
|
||||
|
||||
if (ptr)
|
||||
cupsSetUser(ptr);
|
||||
|
||||
password = getenv("AUTH_PASSWORD");
|
||||
@@ -487,8 +497,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
do
|
||||
{
|
||||
fprintf(stderr, _("INFO: Connecting to %s on port %d...\n"),
|
||||
hostname, port);
|
||||
_cupsLangPrintf(stderr, _("INFO: Connecting to %s on port %d...\n"),
|
||||
hostname, port);
|
||||
|
||||
if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL)
|
||||
{
|
||||
@@ -504,8 +514,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"));
|
||||
|
||||
if (argc == 6 || strcmp(filename, argv[6]))
|
||||
unlink(filename);
|
||||
@@ -524,16 +535,16 @@ main(int argc, /* I - Number of command-line args */
|
||||
{
|
||||
if (contimeout && (time(NULL) - start_time) > contimeout)
|
||||
{
|
||||
fputs(_("ERROR: Printer not responding!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
recoverable = 1;
|
||||
|
||||
fprintf(stderr,
|
||||
_("WARNING: recoverable: Network host \'%s\' is busy; will "
|
||||
"retry in %d seconds...\n"),
|
||||
hostname, delay);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: recoverable: Network host \'%s\' is busy; "
|
||||
"will retry in %d seconds...\n"),
|
||||
hostname, delay);
|
||||
|
||||
sleep(delay);
|
||||
|
||||
@@ -542,8 +553,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
}
|
||||
else if (h_errno)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
|
||||
hostname);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
|
||||
hostname);
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
else
|
||||
@@ -551,8 +562,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
recoverable = 1;
|
||||
|
||||
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
|
||||
fputs(_("ERROR: recoverable: Unable to connect to printer; will "
|
||||
"retry in 30 seconds...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("ERROR: recoverable: Unable to connect to printer; will "
|
||||
"retry in 30 seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
|
||||
@@ -571,7 +583,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
}
|
||||
|
||||
fputs("STATE: -connecting-to-device\n", stderr);
|
||||
fprintf(stderr, _("INFO: Connected to %s...\n"), hostname);
|
||||
_cupsLangPrintf(stderr, _("INFO: Connected to %s...\n"), hostname);
|
||||
|
||||
#ifdef AF_INET6
|
||||
if (http->hostaddr->addr.sa_family == AF_INET6)
|
||||
@@ -637,18 +649,18 @@ main(int argc, /* I - Number of command-line args */
|
||||
{
|
||||
if (contimeout && (time(NULL) - start_time) > contimeout)
|
||||
{
|
||||
fputs(_("ERROR: Printer not responding!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
recoverable = 1;
|
||||
|
||||
fprintf(stderr,
|
||||
_("WARNING: recoverable: Network host \'%s\' is busy; will "
|
||||
"retry in %d seconds...\n"),
|
||||
hostname, delay);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: recoverable: Network host \'%s\' is busy; "
|
||||
"will retry in %d seconds...\n"),
|
||||
hostname, delay);
|
||||
|
||||
report_printer_state(supported);
|
||||
report_printer_state(supported, 0);
|
||||
|
||||
sleep(delay);
|
||||
|
||||
@@ -662,14 +674,15 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Switch to IPP/1.0...
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Printer does not support IPP/1.1, trying IPP/1.0...\n"),
|
||||
stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer does not support IPP/1.1, trying "
|
||||
"IPP/1.0...\n"));
|
||||
version = 0;
|
||||
httpReconnect(http);
|
||||
}
|
||||
else if (ipp_status == IPP_NOT_FOUND)
|
||||
{
|
||||
fputs(_("ERROR: Destination printer does not exist!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Destination printer does not exist!\n"));
|
||||
|
||||
if (supported)
|
||||
ippDelete(supported);
|
||||
@@ -678,8 +691,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to get printer status (%s)!\n"),
|
||||
cupsLastErrorString());
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to get printer status (%s)!\n"),
|
||||
cupsLastErrorString());
|
||||
sleep(10);
|
||||
}
|
||||
|
||||
@@ -712,7 +726,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
format_sup->values[i].string.text);
|
||||
}
|
||||
|
||||
report_printer_state(supported);
|
||||
report_printer_state(supported, 0);
|
||||
}
|
||||
while (ipp_status > IPP_OK_CONFLICT);
|
||||
|
||||
@@ -741,8 +755,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"));
|
||||
|
||||
ippDelete(supported);
|
||||
httpClose(http);
|
||||
@@ -847,8 +862,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
num_options = cupsParseOptions(argv[5], 0, &options);
|
||||
|
||||
#ifdef __APPLE__
|
||||
if (content_type != NULL &&
|
||||
!strcasecmp(content_type, "application/pictwps") && num_files == 1)
|
||||
if (!strcasecmp(content_type, "application/pictwps") && num_files == 1)
|
||||
{
|
||||
if (format_sup != NULL)
|
||||
{
|
||||
@@ -874,23 +888,23 @@ main(int argc, /* I - Number of command-line args */
|
||||
* number of copies to 1...
|
||||
*/
|
||||
|
||||
content_type = "application/postscript";
|
||||
copies = 1;
|
||||
copies_remaining = 1;
|
||||
send_options = 0;
|
||||
final_content_type = "application/postscript";
|
||||
copies = 1;
|
||||
copies_remaining = 1;
|
||||
send_options = 0;
|
||||
}
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
if (content_type != NULL && format_sup != NULL)
|
||||
if (format_sup != NULL)
|
||||
{
|
||||
for (i = 0; i < format_sup->num_values; i ++)
|
||||
if (!strcasecmp(content_type, format_sup->values[i].string.text))
|
||||
if (!strcasecmp(final_content_type, format_sup->values[i].string.text))
|
||||
break;
|
||||
|
||||
if (i < format_sup->num_values)
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
|
||||
"document-format", NULL, content_type);
|
||||
"document-format", NULL, final_content_type);
|
||||
}
|
||||
|
||||
if (copies_sup && version > 0 && send_options)
|
||||
@@ -943,7 +957,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
if (ipp_status == IPP_SERVICE_UNAVAILABLE ||
|
||||
ipp_status == IPP_PRINTER_BUSY)
|
||||
{
|
||||
fputs(_("INFO: Printer busy; will retry in 10 seconds...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer busy; will retry in 10 seconds...\n"));
|
||||
sleep(10);
|
||||
}
|
||||
else if ((ipp_status == IPP_BAD_REQUEST ||
|
||||
@@ -953,25 +968,28 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Switch to IPP/1.0...
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Printer does not support IPP/1.1, trying IPP/1.0...\n"),
|
||||
stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer does not support IPP/1.1, trying "
|
||||
"IPP/1.0...\n"));
|
||||
version = 0;
|
||||
httpReconnect(http);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"),
|
||||
cupsLastErrorString());
|
||||
_cupsLangPrintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"),
|
||||
cupsLastErrorString());
|
||||
}
|
||||
else if ((job_id_attr = ippFindAttribute(response, "job-id",
|
||||
IPP_TAG_INTEGER)) == NULL)
|
||||
{
|
||||
fputs(_("NOTICE: Print file accepted - job ID unknown.\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("NOTICE: Print file accepted - job ID unknown.\n"));
|
||||
job_id = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
job_id = job_id_attr->values[0].integer;
|
||||
fprintf(stderr, _("NOTICE: Print file accepted - job ID %d.\n"), job_id);
|
||||
_cupsLangPrintf(stderr, _("NOTICE: Print file accepted - job ID %d.\n"),
|
||||
job_id);
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
@@ -1009,8 +1027,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
{
|
||||
ipp_status = cupsLastError();
|
||||
|
||||
fprintf(stderr, _("ERROR: Unable to add file %d to job: %s\n"),
|
||||
job_id, cupsLastErrorString());
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to add file %d to job: %s\n"),
|
||||
job_id, cupsLastErrorString());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1034,7 +1053,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
if (!job_id || !waitjob)
|
||||
continue;
|
||||
|
||||
fputs(_("INFO: Waiting for job to complete...\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Waiting for job to complete...\n"));
|
||||
|
||||
for (; !job_cancelled;)
|
||||
{
|
||||
@@ -1088,8 +1107,9 @@ main(int argc, /* I - Number of command-line args */
|
||||
{
|
||||
ippDelete(response);
|
||||
|
||||
fprintf(stderr, _("ERROR: Unable to get job %d attributes (%s)!\n"),
|
||||
job_id, cupsLastErrorString());
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to get job %d attributes (%s)!\n"),
|
||||
job_id, cupsLastErrorString());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1123,7 +1143,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Check the printer state and report it if necessary...
|
||||
*/
|
||||
|
||||
check_printer_state(http, uri, resource, argv[2], version);
|
||||
check_printer_state(http, uri, resource, argv[2], version, job_id);
|
||||
|
||||
/*
|
||||
* Wait 10 seconds before polling again...
|
||||
@@ -1144,7 +1164,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Check the printer state and report it if necessary...
|
||||
*/
|
||||
|
||||
check_printer_state(http, uri, resource, argv[2], version);
|
||||
check_printer_state(http, uri, resource, argv[2], version, job_id);
|
||||
|
||||
/*
|
||||
* Free memory...
|
||||
@@ -1178,7 +1198,20 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Return the queue status...
|
||||
*/
|
||||
|
||||
return (ipp_status > IPP_OK_CONFLICT ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
|
||||
if (ipp_status == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
/*
|
||||
* Authorization failures here mean that we need Kerberos. Username +
|
||||
* password authentication is handled in the password_cb function.
|
||||
*/
|
||||
|
||||
fputs("ATTR: auth-info-required=negotiate\n", stderr);
|
||||
return (CUPS_BACKEND_AUTH_REQUIRED);
|
||||
}
|
||||
else if (ipp_status > IPP_OK_CONFLICT)
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
else
|
||||
return (CUPS_BACKEND_OK);
|
||||
}
|
||||
|
||||
|
||||
@@ -1197,7 +1230,7 @@ cancel_job(http_t *http, /* I - HTTP connection */
|
||||
ipp_t *request; /* Cancel-Job request */
|
||||
|
||||
|
||||
fputs(_("INFO: Canceling print job...\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Canceling print job...\n"));
|
||||
|
||||
request = ippNewRequest(IPP_CANCEL_JOB);
|
||||
request->request.op.version[1] = version;
|
||||
@@ -1217,8 +1250,8 @@ cancel_job(http_t *http, /* I - HTTP connection */
|
||||
ippDelete(cupsDoRequest(http, request, resource));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
fprintf(stderr, _("ERROR: Unable to cancel job %d: %s\n"), id,
|
||||
cupsLastErrorString());
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to cancel job %d: %s\n"), id,
|
||||
cupsLastErrorString());
|
||||
}
|
||||
|
||||
|
||||
@@ -1232,7 +1265,8 @@ check_printer_state(
|
||||
const char *uri, /* I - Printer URI */
|
||||
const char *resource, /* I - Resource path */
|
||||
const char *user, /* I - Username, if any */
|
||||
int version) /* I - IPP version */
|
||||
int version, /* I - IPP version */
|
||||
int job_id) /* I - Current job ID */
|
||||
{
|
||||
ipp_t *request, /* IPP request */
|
||||
*response; /* IPP response */
|
||||
@@ -1267,7 +1301,7 @@ check_printer_state(
|
||||
|
||||
if ((response = cupsDoRequest(http, request, resource)) != NULL)
|
||||
{
|
||||
report_printer_state(response);
|
||||
report_printer_state(response, job_id);
|
||||
ippDelete(response);
|
||||
}
|
||||
}
|
||||
@@ -1298,25 +1332,25 @@ compress_files(int num_files, /* I - Number of files */
|
||||
{
|
||||
if ((fd = cupsTempFd(filename, sizeof(filename))) < 0)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("ERROR: Unable to create temporary compressed print file: "
|
||||
"%s\n"),
|
||||
strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to create temporary compressed print "
|
||||
"file: %s\n"), strerror(errno));
|
||||
exit(CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
if ((out = cupsFileOpenFd(fd, "w9")) == NULL)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("ERROR: Unable to open temporary compressed print file: %s\n"),
|
||||
strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to open temporary compressed print "
|
||||
"file: %s\n"), strerror(errno));
|
||||
exit(CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
if ((in = cupsFileOpen(files[i], "r")) == NULL)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to open print file \"%s\": %s\n"),
|
||||
files[i], strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to open print file \"%s\": %s\n"),
|
||||
files[i], strerror(errno));
|
||||
cupsFileClose(out);
|
||||
exit(CUPS_BACKEND_FAILED);
|
||||
}
|
||||
@@ -1325,8 +1359,9 @@ compress_files(int num_files, /* I - Number of files */
|
||||
while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0)
|
||||
if (cupsFileWrite(out, buffer, bytes) < bytes)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to write %d bytes to \"%s\": %s\n"),
|
||||
(int)bytes, filename, strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to write %d bytes to \"%s\": %s\n"),
|
||||
(int)bytes, filename, strerror(errno));
|
||||
cupsFileClose(in);
|
||||
cupsFileClose(out);
|
||||
exit(CUPS_BACKEND_FAILED);
|
||||
@@ -1359,8 +1394,12 @@ password_cb(const char *prompt) /* I - Prompt (not used) */
|
||||
{
|
||||
(void)prompt;
|
||||
|
||||
if (password)
|
||||
if (password && password_tries < 3)
|
||||
{
|
||||
password_tries ++;
|
||||
|
||||
return (password);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
@@ -1390,7 +1429,8 @@ password_cb(const char *prompt) /* I - Prompt (not used) */
|
||||
*/
|
||||
|
||||
static int /* O - Number of reasons shown */
|
||||
report_printer_state(ipp_t *ipp) /* I - IPP response */
|
||||
report_printer_state(ipp_t *ipp, /* I - IPP response */
|
||||
int job_id) /* I - Current job ID */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int count; /* Count of reasons shown... */
|
||||
@@ -1401,6 +1441,7 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
|
||||
char unknown[1024]; /* Unknown message string */
|
||||
const char *prefix; /* Prefix for STATE: line */
|
||||
char state[1024]; /* State string */
|
||||
cups_lang_t *language; /* Current localization */
|
||||
|
||||
|
||||
if ((psm = ippFindAttribute(ipp, "printer-state-message",
|
||||
@@ -1413,15 +1454,20 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
|
||||
|
||||
state[0] = '\0';
|
||||
prefix = "STATE: ";
|
||||
language = cupsLangDefault();
|
||||
|
||||
for (i = 0, count = 0; i < reasons->num_values; i ++)
|
||||
{
|
||||
reason = reasons->values[i].string.text;
|
||||
|
||||
strlcat(state, prefix, sizeof(state));
|
||||
strlcat(state, reason, sizeof(state));
|
||||
if (job_id == 0 || strcmp(reason, "paused"))
|
||||
{
|
||||
strlcat(state, prefix, sizeof(state));
|
||||
strlcat(state, reason, sizeof(state));
|
||||
|
||||
prefix = ",";
|
||||
}
|
||||
|
||||
prefix = ",";
|
||||
message = "";
|
||||
|
||||
if (!strncmp(reason, "media-needed", 12))
|
||||
@@ -1482,15 +1528,15 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
|
||||
reason);
|
||||
}
|
||||
|
||||
if (message)
|
||||
if (message[0])
|
||||
{
|
||||
count ++;
|
||||
if (strstr(reasons->values[i].string.text, "error"))
|
||||
fprintf(stderr, "ERROR: %s\n", message);
|
||||
fprintf(stderr, "ERROR: %s\n", _cupsLangString(language, message));
|
||||
else if (strstr(reasons->values[i].string.text, "warning"))
|
||||
fprintf(stderr, "WARNING: %s\n", message);
|
||||
fprintf(stderr, "WARNING: %s\n", _cupsLangString(language, message));
|
||||
else
|
||||
fprintf(stderr, "INFO: %s\n", message);
|
||||
fprintf(stderr, "INFO: %s\n", _cupsLangString(language, message));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1532,15 +1578,16 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
|
||||
printer = getenv("PRINTER");
|
||||
if (!printer)
|
||||
{
|
||||
fputs(_("ERROR: PRINTER environment variable not defined!\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("ERROR: PRINTER environment variable not defined!\n"));
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if ((ppdfile = cupsGetPPD(printer)) == NULL)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("ERROR: Unable to get PPD file for printer \"%s\" - %s.\n"),
|
||||
printer, cupsLastErrorString());
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to get PPD file for printer \"%s\" - "
|
||||
"%s.\n"), printer, cupsLastErrorString());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1554,8 +1601,8 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
|
||||
|
||||
if ((fd = cupsTempFd(pstmpname, sizeof(pstmpname))) < 0)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to create temporary file - %s.\n"),
|
||||
strerror(errno));
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to create temporary file - %s.\n"),
|
||||
strerror(errno));
|
||||
if (ppdfile)
|
||||
unlink(ppdfile);
|
||||
return (-1);
|
||||
@@ -1611,8 +1658,8 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
|
||||
|
||||
execlp("pictwpstops", printer, argv[1], argv[2], argv[3], argv[4], argv[5],
|
||||
filename, NULL);
|
||||
fprintf(stderr, _("ERROR: Unable to exec pictwpstops: %s\n"),
|
||||
strerror(errno));
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to exec pictwpstops: %s\n"),
|
||||
strerror(errno));
|
||||
return (errno);
|
||||
}
|
||||
|
||||
@@ -1624,8 +1671,8 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
|
||||
* Error!
|
||||
*/
|
||||
|
||||
fprintf(stderr, _("ERROR: Unable to fork pictwpstops: %s\n"),
|
||||
strerror(errno));
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to fork pictwpstops: %s\n"),
|
||||
strerror(errno));
|
||||
unlink(filename);
|
||||
if (ppdfile)
|
||||
unlink(ppdfile);
|
||||
@@ -1638,8 +1685,8 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
|
||||
|
||||
if (wait(&status) < 0)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to wait for pictwpstops: %s\n"),
|
||||
strerror(errno));
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to wait for pictwpstops: %s\n"),
|
||||
strerror(errno));
|
||||
close(fd);
|
||||
unlink(filename);
|
||||
if (ppdfile)
|
||||
@@ -1655,11 +1702,11 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
|
||||
if (status)
|
||||
{
|
||||
if (status >= 256)
|
||||
fprintf(stderr, _("ERROR: pictwpstops exited with status %d!\n"),
|
||||
status / 256);
|
||||
_cupsLangPrintf(stderr, _("ERROR: pictwpstops exited with status %d!\n"),
|
||||
status / 256);
|
||||
else
|
||||
fprintf(stderr, _("ERROR: pictwpstops exited on signal %d!\n"),
|
||||
status);
|
||||
_cupsLangPrintf(stderr, _("ERROR: pictwpstops exited on signal %d!\n"),
|
||||
status);
|
||||
|
||||
unlink(filename);
|
||||
return (status);
|
||||
|
||||
@@ -125,9 +125,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
username[255], /* Username info */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
*options, /* Pointer to options */
|
||||
name[255], /* Name of option */
|
||||
value[255], /* Value of option */
|
||||
*ptr, /* Pointer into name or value */
|
||||
*name, /* Name of option */
|
||||
*value, /* Value of option */
|
||||
sep, /* Separator character */
|
||||
*filename, /* File to print */
|
||||
title[256]; /* Title string */
|
||||
int port; /* Port number */
|
||||
@@ -186,8 +186,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
@@ -276,29 +277,30 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Get the name...
|
||||
*/
|
||||
|
||||
for (ptr = name; *options && *options != '=';)
|
||||
if (ptr < (name + sizeof(name) - 1))
|
||||
*ptr++ = *options++;
|
||||
*ptr = '\0';
|
||||
name = options;
|
||||
|
||||
if (*options == '=')
|
||||
while (*options && *options != '=' && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
if ((sep = *options) != '\0')
|
||||
*options++ = '\0';
|
||||
|
||||
if (sep == '=')
|
||||
{
|
||||
/*
|
||||
* Get the value...
|
||||
*/
|
||||
|
||||
options ++;
|
||||
value = options;
|
||||
|
||||
for (ptr = value; *options && *options != '+' && *options != '&';)
|
||||
if (ptr < (value + sizeof(value) - 1))
|
||||
*ptr++ = *options++;
|
||||
*ptr = '\0';
|
||||
|
||||
if (*options == '+' || *options == '&')
|
||||
while (*options && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
if (*options)
|
||||
*options++ = '\0';
|
||||
}
|
||||
else
|
||||
value[0] = '\0';
|
||||
value = (char *)"";
|
||||
|
||||
/*
|
||||
* Process the option...
|
||||
@@ -322,8 +324,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
if (strchr("cdfglnoprtv", value[0]))
|
||||
format = value[0];
|
||||
else
|
||||
fprintf(stderr, _("ERROR: Unknown format character \"%c\"\n"),
|
||||
value[0]);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unknown format character \"%c\"\n"),
|
||||
value[0]);
|
||||
}
|
||||
else if (!strcasecmp(name, "mode") && value[0])
|
||||
{
|
||||
@@ -336,7 +338,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
else if (!strcasecmp(value, "stream"))
|
||||
mode = MODE_STREAM;
|
||||
else
|
||||
fprintf(stderr, _("ERROR: Unknown print mode \"%s\"\n"), value);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unknown print mode \"%s\"\n"),
|
||||
value);
|
||||
}
|
||||
else if (!strcasecmp(name, "order") && value[0])
|
||||
{
|
||||
@@ -349,7 +352,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
else if (!strcasecmp(value, "data,control"))
|
||||
order = ORDER_DATA_CONTROL;
|
||||
else
|
||||
fprintf(stderr, _("ERROR: Unknown file order \"%s\"\n"), value);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unknown file order \"%s\"\n"),
|
||||
value);
|
||||
}
|
||||
else if (!strcasecmp(name, "reserve"))
|
||||
{
|
||||
@@ -457,8 +461,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (fd == -1)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to open print file %s: %s\n"),
|
||||
filename, strerror(errno));
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to open print file %s: %s\n"),
|
||||
filename, strerror(errno));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
}
|
||||
@@ -476,6 +480,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* the remote end...
|
||||
*/
|
||||
|
||||
char *ptr;
|
||||
|
||||
for (ptr = title; *ptr; ptr ++)
|
||||
if (!isalnum(*ptr & 255) && !isspace(*ptr & 255))
|
||||
*ptr = '_';
|
||||
@@ -585,9 +591,9 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
|
||||
|
||||
if (recv(fd, &status, 1, 0) < 1)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("WARNING: Remote host did not respond with command status "
|
||||
"byte after %d seconds!\n"), timeout);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: Remote host did not respond with command "
|
||||
"status byte after %d seconds!\n"), timeout);
|
||||
status = errno;
|
||||
}
|
||||
|
||||
@@ -668,7 +674,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), hostname);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
|
||||
hostname);
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
@@ -690,9 +697,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
*/
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
fprintf(stderr,
|
||||
_("INFO: Attempting to connect to host %s for printer %s\n"),
|
||||
hostname, printer);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("INFO: Attempting to connect to host %s for printer %s\n"),
|
||||
hostname, printer);
|
||||
|
||||
for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist,
|
||||
delay = 5;;
|
||||
@@ -791,8 +798,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"));
|
||||
|
||||
httpAddrFreeList(addrlist);
|
||||
|
||||
@@ -810,16 +818,15 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
{
|
||||
if (contimeout && (time(NULL) - start_time) > contimeout)
|
||||
{
|
||||
fputs(_("ERROR: Printer not responding!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
recoverable = 1;
|
||||
|
||||
fprintf(stderr,
|
||||
_("WARNING: recoverable: Network host \'%s\' is busy; will "
|
||||
"retry in %d seconds...\n"),
|
||||
hostname, delay);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: recoverable: Network host \'%s\' is busy; "
|
||||
"will retry in %d seconds...\n"), hostname, delay);
|
||||
|
||||
sleep(delay);
|
||||
|
||||
@@ -839,8 +846,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
recoverable = 1;
|
||||
|
||||
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
|
||||
fputs(_("ERROR: recoverable: Unable to connect to printer; will "
|
||||
"retry in 30 seconds...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("ERROR: recoverable: Unable to connect to printer; "
|
||||
"will retry in 30 seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
@@ -858,7 +866,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
}
|
||||
|
||||
fputs("STATE: -connecting-to-device\n", stderr);
|
||||
fprintf(stderr, _("INFO: Connected to %s...\n"), hostname);
|
||||
_cupsLangPrintf(stderr, _("INFO: Connected to %s...\n"), hostname);
|
||||
|
||||
#ifdef AF_INET6
|
||||
if (addr->addr.addr.sa_family == AF_INET6)
|
||||
@@ -964,8 +972,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
fprintf(stderr, _("INFO: Sending control file (%u bytes)\n"),
|
||||
(unsigned)strlen(control));
|
||||
_cupsLangPrintf(stderr, _("INFO: Sending control file (%u bytes)\n"),
|
||||
(unsigned)strlen(control));
|
||||
|
||||
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
|
||||
{
|
||||
@@ -978,9 +986,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
if (read(fd, &status, 1) < 1)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("WARNING: Remote host did not respond with control "
|
||||
"status byte after %d seconds!\n"), timeout);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: Remote host did not respond with control "
|
||||
"status byte after %d seconds!\n"), timeout);
|
||||
status = errno;
|
||||
}
|
||||
|
||||
@@ -988,11 +996,11 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
}
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr,
|
||||
_("ERROR: Remote host did not accept control file (%d)\n"),
|
||||
status);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Remote host did not accept control file "
|
||||
"(%d)\n"), status);
|
||||
else
|
||||
fputs(_("INFO: Control file sent successfully\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Control file sent successfully\n"));
|
||||
}
|
||||
else
|
||||
status = 0;
|
||||
@@ -1013,13 +1021,13 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
fprintf(stderr,
|
||||
_cupsLangPrintf(stderr,
|
||||
#ifdef HAVE_LONG_LONG
|
||||
_("INFO: Sending data file (%lld bytes)\n"),
|
||||
_("INFO: Sending data file (%lld bytes)\n"),
|
||||
#else
|
||||
_("INFO: Sending data file (%ld bytes)\n"),
|
||||
_("INFO: Sending data file (%ld bytes)\n"),
|
||||
#endif /* HAVE_LONG_LONG */
|
||||
CUPS_LLCAST filestats.st_size);
|
||||
CUPS_LLCAST filestats.st_size);
|
||||
|
||||
tbytes = 0;
|
||||
for (copy = 0; copy < manual_copies; copy ++)
|
||||
@@ -1028,8 +1036,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
while ((nbytes = read(print_fd, buffer, sizeof(buffer))) > 0)
|
||||
{
|
||||
fprintf(stderr, _("INFO: Spooling LPR job, %.0f%% complete...\n"),
|
||||
100.0 * tbytes / filestats.st_size);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("INFO: Spooling LPR job, %.0f%% complete...\n"),
|
||||
100.0 * tbytes / filestats.st_size);
|
||||
|
||||
if (lpd_write(fd, buffer, nbytes) < nbytes)
|
||||
{
|
||||
@@ -1063,9 +1072,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
if (recv(fd, &status, 1, 0) < 1)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("WARNING: Remote host did not respond with data "
|
||||
"status byte after %d seconds!\n"), timeout);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: Remote host did not respond with data "
|
||||
"status byte after %d seconds!\n"), timeout);
|
||||
status = 0;
|
||||
}
|
||||
|
||||
@@ -1076,10 +1085,11 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
status = 0;
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr, _("ERROR: Remote host did not accept data file (%d)\n"),
|
||||
status);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Remote host did not accept data file (%d)\n"),
|
||||
status);
|
||||
else
|
||||
fputs(_("INFO: Data file sent successfully\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Data file sent successfully\n"));
|
||||
}
|
||||
|
||||
if (status == 0 && order == ORDER_DATA_CONTROL)
|
||||
@@ -1093,8 +1103,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
fprintf(stderr, _("INFO: Sending control file (%lu bytes)\n"),
|
||||
(unsigned long)strlen(control));
|
||||
_cupsLangPrintf(stderr, _("INFO: Sending control file (%lu bytes)\n"),
|
||||
(unsigned long)strlen(control));
|
||||
|
||||
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
|
||||
{
|
||||
@@ -1107,9 +1117,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
if (read(fd, &status, 1) < 1)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("WARNING: Remote host did not respond with control "
|
||||
"status byte after %d seconds!\n"), timeout);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: Remote host did not respond with control "
|
||||
"status byte after %d seconds!\n"), timeout);
|
||||
status = errno;
|
||||
}
|
||||
|
||||
@@ -1117,11 +1127,11 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
}
|
||||
|
||||
if (status != 0)
|
||||
fprintf(stderr,
|
||||
_("ERROR: Remote host did not accept control file (%d)\n"),
|
||||
status);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Remote host did not accept control file "
|
||||
"(%d)\n"), status);
|
||||
else
|
||||
fputs(_("INFO: Control file sent successfully\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Control file sent successfully\n"));
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -242,7 +242,9 @@ int main (int argc, const char * argv[])
|
||||
/* Try to open the print file... */
|
||||
if ((fp = fopen(argv[6], "rb")) == NULL)
|
||||
{
|
||||
fprintf(stderr, "ERROR: unable to open print file \"%s\": %s\n", argv[6], strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to open print file \"%s\": %s\n"),
|
||||
argv[6], strerror(errno));
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -1363,9 +1365,9 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
|
||||
*resourcePtr,
|
||||
*typePtr,
|
||||
*options, /* Pointer to options */
|
||||
optionName[255], /* Name of option */
|
||||
value[255], /* Value of option */
|
||||
*ptr; /* Pointer into name or value */
|
||||
*optionName, /* Name of option */
|
||||
*value, /* Value of option */
|
||||
sep; /* Separator character */
|
||||
int port; /* Port number (not used) */
|
||||
int statusInterval; /* */
|
||||
|
||||
@@ -1393,53 +1395,54 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
|
||||
|
||||
while (*options != '\0')
|
||||
{
|
||||
/*
|
||||
/*
|
||||
* Get the name...
|
||||
*/
|
||||
for (ptr = optionName; *options && *options != '=' && *options != '+'; )
|
||||
*ptr++ = *options++;
|
||||
|
||||
*ptr = '\0';
|
||||
value[0] = '\0';
|
||||
optionName = options;
|
||||
|
||||
if (*options == '=')
|
||||
while (*options && *options != '=' && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
if ((sep = *options) != '\0')
|
||||
*options++ = '\0';
|
||||
|
||||
if (sep == '=')
|
||||
{
|
||||
/*
|
||||
/*
|
||||
* Get the value...
|
||||
*/
|
||||
|
||||
options ++;
|
||||
|
||||
for (ptr = value; *options && *options != '+';)
|
||||
*ptr++ = *options++;
|
||||
*/
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
if (*options == '+')
|
||||
options ++;
|
||||
}
|
||||
else if (*options == '+')
|
||||
{
|
||||
options ++;
|
||||
}
|
||||
value = options;
|
||||
|
||||
/*
|
||||
while (*options && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
if (*options)
|
||||
*options++ = '\0';
|
||||
}
|
||||
else
|
||||
value = (char *)"";
|
||||
|
||||
/*
|
||||
* Process the option...
|
||||
*/
|
||||
if (strcasecmp(optionName, "waiteof") == 0)
|
||||
|
||||
if (!strcasecmp(optionName, "waiteof"))
|
||||
{
|
||||
/*
|
||||
* Set the banner...
|
||||
/*
|
||||
* Wait for the end of the print file?
|
||||
*/
|
||||
if (strcasecmp(value, "on") == 0 ||
|
||||
strcasecmp(value, "yes") == 0 ||
|
||||
strcasecmp(value, "true") == 0)
|
||||
|
||||
if (!strcasecmp(value, "on") ||
|
||||
!strcasecmp(value, "yes") ||
|
||||
!strcasecmp(value, "true"))
|
||||
{
|
||||
gWaitEOF = true;
|
||||
}
|
||||
else if (strcasecmp(value, "off") == 0 ||
|
||||
strcasecmp(value, "no") == 0 ||
|
||||
strcasecmp(value, "false") == 0)
|
||||
else if (!strcasecmp(value, "off") ||
|
||||
!strcasecmp(value, "no") ||
|
||||
!strcasecmp(value, "false"))
|
||||
{
|
||||
gWaitEOF = false;
|
||||
}
|
||||
@@ -1448,13 +1451,17 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
|
||||
fprintf(stderr, "WARNING: Boolean expected for waiteof option \"%s\"\n", value);
|
||||
}
|
||||
}
|
||||
else if (strcasecmp(optionName, "status") == 0)
|
||||
else if (!strcasecmp(optionName, "status"))
|
||||
{
|
||||
/*
|
||||
* Set status reporting interval...
|
||||
*/
|
||||
|
||||
statusInterval = atoi(value);
|
||||
if (value[0] < '0' || value[0] > '9' ||
|
||||
statusInterval < 0)
|
||||
if (value[0] < '0' || value[0] > '9' || statusInterval < 0)
|
||||
{
|
||||
fprintf(stderr, "WARNING: number expected for status option \"%s\"\n", value);
|
||||
fprintf(stderr, "WARNING: number expected for status option \"%s\"\n",
|
||||
value);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1469,20 +1476,24 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
|
||||
if (*resourcePtr == '/')
|
||||
resourcePtr++;
|
||||
|
||||
/* If the resource has a slash we assume the slash seperates the AppleTalk object
|
||||
* name from the AppleTalk type. If the slash is not present we assume the AppleTalk
|
||||
* type is LaserWriter.
|
||||
*/
|
||||
typePtr = strchr(resourcePtr, '/');
|
||||
if (typePtr != NULL) {
|
||||
*typePtr++ = '\0';
|
||||
} else {
|
||||
typePtr = "LaserWriter";
|
||||
}
|
||||
/* If the resource has a slash we assume the slash seperates the AppleTalk object
|
||||
* name from the AppleTalk type. If the slash is not present we assume the AppleTalk
|
||||
* type is LaserWriter.
|
||||
*/
|
||||
|
||||
removePercentEscapes(hostname, zone, NBP_NVE_STR_SIZE + 1);
|
||||
removePercentEscapes(resourcePtr, name, NBP_NVE_STR_SIZE + 1);
|
||||
removePercentEscapes(typePtr, type, NBP_NVE_STR_SIZE + 1);
|
||||
typePtr = strchr(resourcePtr, '/');
|
||||
if (typePtr != NULL)
|
||||
{
|
||||
*typePtr++ = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
typePtr = "LaserWriter";
|
||||
}
|
||||
|
||||
removePercentEscapes(hostname, zone, NBP_NVE_STR_SIZE + 1);
|
||||
removePercentEscapes(resourcePtr, name, NBP_NVE_STR_SIZE + 1);
|
||||
removePercentEscapes(typePtr, type, NBP_NVE_STR_SIZE + 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -122,8 +122,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
@@ -213,8 +214,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"));
|
||||
|
||||
/*
|
||||
* Sleep 5 seconds to keep the job from requeuing too rapidly...
|
||||
@@ -227,19 +229,22 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (errno == EBUSY)
|
||||
{
|
||||
fputs(_("INFO: Printer busy; will retry in 30 seconds...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer busy; will retry in 30 seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
else if (errno == ENXIO || errno == EIO || errno == ENOENT)
|
||||
{
|
||||
fputs(_("INFO: Printer not connected; will retry in 30 seconds...\n"),
|
||||
stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer not connected; will retry in 30 "
|
||||
"seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
}
|
||||
@@ -279,13 +284,13 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
tbytes = backendRunLoop(print_fd, device_fd, use_bc, side_cb);
|
||||
|
||||
if (print_fd != 0 && tbytes >= 0)
|
||||
fprintf(stderr,
|
||||
_cupsLangPrintf(stderr,
|
||||
#ifdef HAVE_LONG_LONG
|
||||
_("INFO: Sent print file, %lld bytes...\n"),
|
||||
_("INFO: Sent print file, %lld bytes...\n"),
|
||||
#else
|
||||
_("INFO: Sent print file, %ld bytes...\n"),
|
||||
_("INFO: Sent print file, %ld bytes...\n"),
|
||||
#endif /* HAVE_LONG_LONG */
|
||||
CUPS_LLCAST tbytes);
|
||||
CUPS_LLCAST tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -613,7 +618,7 @@ side_cb(int print_fd, /* I - Print file */
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -118,8 +118,8 @@ backendDrainOutput(int print_fd, /* I - Print file descriptor */
|
||||
if (errno != ENOSPC && errno != ENXIO && errno != EAGAIN &&
|
||||
errno != EINTR && errno != ENOTTY)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to write print data: %s\n"),
|
||||
strerror(errno));
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to write print data: %s\n"),
|
||||
strerror(errno));
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
@@ -230,7 +230,7 @@ backendRunLoop(
|
||||
if (errno == ENXIO && offline != 1)
|
||||
{
|
||||
fputs("STATE: +offline-error\n", stderr);
|
||||
fputs(_("INFO: Printer is currently off-line.\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Printer is currently off-line.\n"));
|
||||
offline = 1;
|
||||
}
|
||||
else if (errno == EINTR && total_bytes == 0)
|
||||
@@ -321,7 +321,7 @@ backendRunLoop(
|
||||
if (paperout != 1)
|
||||
{
|
||||
fputs("STATE: +media-empty-error\n", stderr);
|
||||
fputs(_("ERROR: Out of paper!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Out of paper!\n"));
|
||||
paperout = 1;
|
||||
}
|
||||
}
|
||||
@@ -330,7 +330,7 @@ backendRunLoop(
|
||||
if (offline != 1)
|
||||
{
|
||||
fputs("STATE: +offline-error\n", stderr);
|
||||
fputs(_("INFO: Printer is currently off-line.\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Printer is currently off-line.\n"));
|
||||
offline = 1;
|
||||
}
|
||||
}
|
||||
@@ -352,7 +352,7 @@ backendRunLoop(
|
||||
if (offline)
|
||||
{
|
||||
fputs("STATE: -offline-error\n", stderr);
|
||||
fputs(_("INFO: Printer is now on-line.\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Printer is now on-line.\n"));
|
||||
offline = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -96,7 +96,8 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
|
||||
if (strncmp(resource, "/dev/scsi/", 10) != 0)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Bad SCSI device file \"%s\"!\n"), resource);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Bad SCSI device file \"%s\"!\n"),
|
||||
resource);
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
@@ -119,8 +120,9 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"));
|
||||
|
||||
/*
|
||||
* Sleep 5 seconds to keep the job from requeuing too rapidly...
|
||||
@@ -133,13 +135,15 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
|
||||
if (errno != EAGAIN && errno != EBUSY)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs(_("INFO: Printer busy; will retry in 30 seconds...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer busy; will retry in 30 seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
@@ -201,9 +205,9 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
if (ioctl(scsi_fd, DS_ENTER, &scsi_req) < 0 ||
|
||||
scsi_req.ds_status != 0)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("WARNING: SCSI command timed out (%d); retrying...\n"),
|
||||
scsi_req.ds_status);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: SCSI command timed out (%d); "
|
||||
"retrying...\n"), scsi_req.ds_status);
|
||||
sleep(try + 1);
|
||||
}
|
||||
else
|
||||
@@ -211,8 +215,8 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
|
||||
if (try >= 10)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to send print data (%d)\n"),
|
||||
scsi_req.ds_status);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to send print data (%d)\n"),
|
||||
scsi_req.ds_status);
|
||||
close(scsi_fd);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
@@ -110,7 +110,8 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
|
||||
if (strncmp(resource, "/dev/sg", 7) != 0)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Bad SCSI device file \"%s\"!\n"), resource);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Bad SCSI device file \"%s\"!\n"),
|
||||
resource);
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
@@ -148,13 +149,15 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
|
||||
if (errno != EAGAIN && errno != EBUSY)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
else
|
||||
{
|
||||
fputs(_("INFO: Printer busy; will retry in 30 seconds...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer busy; will retry in 30 seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
@@ -220,9 +223,9 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
if (ioctl(scsi_fd, SG_IO, &scsi_req) < 0 ||
|
||||
scsi_req.status != 0)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("WARNING: SCSI command timed out (%d); retrying...\n"),
|
||||
scsi_req.status);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: SCSI command timed out (%d); "
|
||||
"retrying...\n"), scsi_req.status);
|
||||
sleep(try + 1);
|
||||
}
|
||||
else
|
||||
@@ -230,8 +233,8 @@ print_device(const char *resource, /* I - SCSI device */
|
||||
|
||||
if (try >= 10)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to send print data (%d)\n"),
|
||||
scsi_req.status);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to send print data (%d)\n"),
|
||||
scsi_req.status);
|
||||
close(scsi_fd);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
@@ -153,8 +153,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
|
||||
@@ -104,9 +104,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
username[255], /* Username info (not used) */
|
||||
resource[1024], /* Resource info (device and options) */
|
||||
*options, /* Pointer to options */
|
||||
name[255], /* Name of option */
|
||||
value[255], /* Value of option */
|
||||
*ptr; /* Pointer into name or value */
|
||||
*name, /* Name of option */
|
||||
*value, /* Value of option */
|
||||
sep; /* Option separator */
|
||||
int port; /* Port number (not used) */
|
||||
int copies; /* Number of copies to print */
|
||||
int print_fd, /* Print file */
|
||||
@@ -161,8 +161,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
@@ -234,8 +235,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"));
|
||||
|
||||
/*
|
||||
* Sleep 5 seconds to keep the job from requeuing too rapidly...
|
||||
@@ -248,13 +250,15 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if (errno == EBUSY)
|
||||
{
|
||||
fputs(_("INFO: Printer busy; will retry in 30 seconds...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer busy; will retry in 30 seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
}
|
||||
@@ -285,29 +289,30 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Get the name...
|
||||
*/
|
||||
|
||||
for (ptr = name; *options && *options != '=';)
|
||||
if (ptr < (name + sizeof(name) - 1))
|
||||
*ptr++ = *options++;
|
||||
*ptr = '\0';
|
||||
name = options;
|
||||
|
||||
if (*options == '=')
|
||||
while (*options && *options != '=' && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
if ((sep = *options) != '\0')
|
||||
*options++ = '\0';
|
||||
|
||||
if (sep == '=')
|
||||
{
|
||||
/*
|
||||
* Get the value...
|
||||
*/
|
||||
|
||||
options ++;
|
||||
value = options;
|
||||
|
||||
for (ptr = value; *options && *options != '+' && *options != '&';)
|
||||
if (ptr < (value + sizeof(value) - 1))
|
||||
*ptr++ = *options++;
|
||||
*ptr = '\0';
|
||||
|
||||
if (*options == '+' || *options == '&')
|
||||
while (*options && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
if (*options)
|
||||
*options++ = '\0';
|
||||
}
|
||||
else
|
||||
value[0] = '\0';
|
||||
value = (char *)"";
|
||||
|
||||
/*
|
||||
* Process the option...
|
||||
@@ -370,8 +375,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
break;
|
||||
# endif /* B230400 */
|
||||
default :
|
||||
fprintf(stderr, _("WARNING: Unsupported baud rate %s!\n"),
|
||||
value);
|
||||
_cupsLangPrintf(stderr, _("WARNING: Unsupported baud rate %s!\n"),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
#endif /* B19200 == 19200 */
|
||||
@@ -1247,7 +1252,8 @@ side_cb(int print_fd, /* I - Print file */
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("WARNING: Failed to read side-channel request!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,9 +68,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
username[255], /* Username info (not used) */
|
||||
resource[1024], /* Resource info (not used) */
|
||||
*options, /* Pointer to options */
|
||||
name[255], /* Name of option */
|
||||
value[255], /* Value of option */
|
||||
*ptr; /* Pointer into name or value */
|
||||
*name, /* Name of option */
|
||||
*value, /* Value of option */
|
||||
sep; /* Option separator */
|
||||
int print_fd; /* Print file */
|
||||
int copies; /* Number of copies to print */
|
||||
time_t start_time; /* Time of first connect */
|
||||
@@ -83,7 +83,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
int device_fd; /* AppSocket */
|
||||
int error; /* Error code (if any) */
|
||||
http_addrlist_t *addrlist, /* Address list */
|
||||
*addr; /* Connected address */
|
||||
*addr; /* Connected address */
|
||||
char addrname[256]; /* Address name */
|
||||
ssize_t tbytes; /* Total number of bytes written */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
@@ -122,8 +122,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
@@ -190,29 +191,30 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Get the name...
|
||||
*/
|
||||
|
||||
for (ptr = name; *options && *options != '=';)
|
||||
if (ptr < (name + sizeof(name) - 1))
|
||||
*ptr++ = *options++;
|
||||
*ptr = '\0';
|
||||
name = options;
|
||||
|
||||
if (*options == '=')
|
||||
while (*options && *options != '=' && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
if ((sep = *options) != '\0')
|
||||
*options++ = '\0';
|
||||
|
||||
if (sep == '=')
|
||||
{
|
||||
/*
|
||||
* Get the value...
|
||||
*/
|
||||
|
||||
options ++;
|
||||
value = options;
|
||||
|
||||
for (ptr = value; *options && *options != '+' && *options != '&';)
|
||||
if (ptr < (value + sizeof(value) - 1))
|
||||
*ptr++ = *options++;
|
||||
*ptr = '\0';
|
||||
|
||||
if (*options == '+' || *options == '&')
|
||||
while (*options && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
if (*options)
|
||||
*options++ = '\0';
|
||||
}
|
||||
else
|
||||
value[0] = '\0';
|
||||
value = (char *)"";
|
||||
|
||||
/*
|
||||
* Process the option...
|
||||
@@ -250,12 +252,14 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), hostname);
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
|
||||
hostname);
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
fprintf(stderr, _("INFO: Attempting to connect to host %s on port %d\n"),
|
||||
hostname, port);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("INFO: Attempting to connect to host %s on port %d\n"),
|
||||
hostname, port);
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
|
||||
@@ -275,8 +279,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"));
|
||||
|
||||
/*
|
||||
* Sleep 5 seconds to keep the job from requeuing too rapidly...
|
||||
@@ -292,16 +297,16 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
if (contimeout && (time(NULL) - start_time) > contimeout)
|
||||
{
|
||||
fputs(_("ERROR: Printer not responding!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
recoverable = 1;
|
||||
|
||||
fprintf(stderr,
|
||||
_("WARNING: recoverable: Network host \'%s\' is busy; will "
|
||||
"retry in %d seconds...\n"),
|
||||
hostname, delay);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: recoverable: Network host \'%s\' is busy; "
|
||||
"will retry in %d seconds...\n"),
|
||||
hostname, delay);
|
||||
|
||||
sleep(delay);
|
||||
|
||||
@@ -312,9 +317,11 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
{
|
||||
recoverable = 1;
|
||||
|
||||
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
|
||||
fputs(_("ERROR: recoverable: Unable to connect to printer; will "
|
||||
"retry in 30 seconds...\n"), stderr);
|
||||
_cupsLangPrintf(stderr, "DEBUG: Connection error: %s\n",
|
||||
strerror(errno));
|
||||
_cupsLangPuts(stderr,
|
||||
_("ERROR: recoverable: Unable to connect to printer; "
|
||||
"will retry in 30 seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
}
|
||||
@@ -335,7 +342,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
fputs("STATE: -connecting-to-device\n", stderr);
|
||||
fprintf(stderr, _("INFO: Connected to %s...\n"), hostname);
|
||||
_cupsLangPrintf(stderr, _("INFO: Connected to %s...\n"), hostname);
|
||||
|
||||
#ifdef AF_INET6
|
||||
if (addr->addr.addr.sa_family == AF_INET6)
|
||||
@@ -368,13 +375,13 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
tbytes = backendRunLoop(print_fd, device_fd, 1, side_cb);
|
||||
|
||||
if (print_fd != 0 && tbytes >= 0)
|
||||
fprintf(stderr,
|
||||
_cupsLangPrintf(stderr,
|
||||
#ifdef HAVE_LONG_LONG
|
||||
_("INFO: Sent print file, %lld bytes...\n"),
|
||||
_("INFO: Sent print file, %lld bytes...\n"),
|
||||
#else
|
||||
_("INFO: Sent print file, %ld bytes...\n"),
|
||||
_("INFO: Sent print file, %ld bytes...\n"),
|
||||
#endif /* HAVE_LONG_LONG */
|
||||
CUPS_LLCAST tbytes);
|
||||
CUPS_LLCAST tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -389,8 +396,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* Shutdown the socket and wait for the other end to finish...
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Print file sent, waiting for printer to finish...\n"),
|
||||
stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Print file sent, waiting for printer to finish...\n"));
|
||||
|
||||
shutdown(device_fd, 1);
|
||||
|
||||
@@ -413,7 +420,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
close(print_fd);
|
||||
|
||||
if (tbytes >= 0)
|
||||
fputs(_("INFO: Ready to print.\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Ready to print.\n"));
|
||||
|
||||
return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
|
||||
}
|
||||
@@ -432,13 +439,14 @@ side_cb(int print_fd, /* I - Print file */
|
||||
cups_sc_status_t status; /* Request/response status */
|
||||
char data[2048]; /* Request/response data */
|
||||
int datalen; /* Request/response data size */
|
||||
const char *device_id; /* 1284DEVICEID env var */
|
||||
|
||||
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -462,6 +470,14 @@ side_cb(int print_fd, /* I - Print file */
|
||||
datalen = 1;
|
||||
break;
|
||||
|
||||
case CUPS_SC_CMD_GET_DEVICE_ID :
|
||||
if ((device_id = getenv("1284DEVICEID")) != NULL)
|
||||
{
|
||||
strlcpy(data, device_id, sizeof(data));
|
||||
datalen = (int)strlen(data);
|
||||
break;
|
||||
}
|
||||
|
||||
default :
|
||||
status = CUPS_SC_STATUS_NOT_IMPLEMENTED;
|
||||
datalen = 0;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Copyright © 2005-2007 Apple Inc. All rights reserved.
|
||||
* Copyright � 2005-2007 Apple Inc. All rights reserved.
|
||||
*
|
||||
* IMPORTANT: This Apple software is supplied to you by Apple Computer,
|
||||
* Inc. ("Apple") in consideration of your agreement to the following
|
||||
@@ -104,7 +104,8 @@
|
||||
* the printer after we've finished sending all the data
|
||||
*/
|
||||
#define WAIT_EOF_DELAY 7
|
||||
#define DEFAULT_TIMEOUT 60L
|
||||
#define WAIT_SIDE_DELAY 3
|
||||
#define DEFAULT_TIMEOUT 5000L
|
||||
|
||||
#define USB_INTERFACE_KIND CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID190)
|
||||
#define kUSBLanguageEnglish 0x409
|
||||
@@ -230,6 +231,11 @@ typedef struct globals_s
|
||||
Boolean wait_eof;
|
||||
int drain_output; /* Drain all pending output */
|
||||
int bidi_flag; /* 0=unidirectional, 1=bidirectional */
|
||||
|
||||
pthread_mutex_t sidechannel_thread_mutex;
|
||||
pthread_cond_t sidechannel_thread_cond;
|
||||
int sidechannel_thread_stop;
|
||||
int sidechannel_thread_done;
|
||||
} globals_t;
|
||||
|
||||
|
||||
@@ -261,7 +267,7 @@ static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID,
|
||||
static void device_added(void *userdata, io_iterator_t iterator);
|
||||
static void get_device_id(cups_sc_status_t *status, char *data, int *datalen);
|
||||
static void iterate_printers(iterator_callback_t callBack, void *userdata);
|
||||
static void parse_options(const char *options, char *serial, UInt32 *location, Boolean *wait_eof);
|
||||
static void parse_options(char *options, char *serial, int serial_size, UInt32 *location, Boolean *wait_eof);
|
||||
static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial);
|
||||
static void setup_cfLanguage(void);
|
||||
static void soft_reset();
|
||||
@@ -298,7 +304,7 @@ int /* O - Exit status */
|
||||
print_device(const char *uri, /* I - Device URI */
|
||||
const char *hostname, /* I - Hostname/manufacturer */
|
||||
const char *resource, /* I - Resource/modelname */
|
||||
const char *options, /* I - Device options/serial number */
|
||||
char *options, /* I - Device options/serial number */
|
||||
int print_fd, /* I - File descriptor to print */
|
||||
int copies, /* I - Copies to print */
|
||||
int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
@@ -307,7 +313,8 @@ print_device(const char *uri, /* I - Device URI */
|
||||
char serial[1024]; /* Serial number buffer */
|
||||
OSStatus status; /* Function results */
|
||||
pthread_t read_thread_id, /* Read thread */
|
||||
sidechannel_thread_id;/* Side channel thread */
|
||||
sidechannel_thread_id;/* Side-channel thread */
|
||||
int sidechannel_started = 0;/* Was the side-channel thread started? */
|
||||
char print_buffer[8192], /* Print data buffer */
|
||||
*print_ptr; /* Pointer into print data buffer */
|
||||
UInt32 location; /* Unique location in bus topology */
|
||||
@@ -321,9 +328,10 @@ print_device(const char *uri, /* I - Device URI */
|
||||
stimeout; /* Timeout for select() */
|
||||
struct timespec cond_timeout; /* pthread condition timeout */
|
||||
|
||||
|
||||
setup_cfLanguage();
|
||||
|
||||
parse_options(options, serial, &location, &g.wait_eof);
|
||||
parse_options(options, serial, sizeof(serial), &location, &g.wait_eof);
|
||||
|
||||
if (resource[0] == '/')
|
||||
resource++;
|
||||
@@ -334,6 +342,13 @@ print_device(const char *uri, /* I - Device URI */
|
||||
g.serial = cfstr_create_trim(serial);
|
||||
g.location = location;
|
||||
|
||||
if (!g.make || !g.model)
|
||||
{
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to create make and model strings\n"));
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
|
||||
countdown = INITIAL_LOG_INTERVAL;
|
||||
@@ -381,7 +396,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
strlcpy(print_buffer, "USB class driver", sizeof(print_buffer));
|
||||
|
||||
fputs("STATE: +apple-missing-usbclassdriver-error\n", stderr);
|
||||
fprintf(stderr, _("FATAL: Could not load %s\n"), print_buffer);
|
||||
_cupsLangPrintf(stderr, _("FATAL: Could not load %s\n"), print_buffer);
|
||||
|
||||
if (driverBundlePath)
|
||||
CFRelease(driverBundlePath);
|
||||
@@ -398,7 +413,8 @@ print_device(const char *uri, /* I - Device URI */
|
||||
countdown -= PRINTER_POLLING_INTERVAL;
|
||||
if (countdown <= 0)
|
||||
{
|
||||
fprintf(stderr, _("INFO: Printer busy (status:0x%08x)\n"), (int)status);
|
||||
_cupsLangPrintf(stderr, _("INFO: Printer busy (status:0x%08x)\n"),
|
||||
(int)status);
|
||||
countdown = SUBSEQUENT_LOG_INTERVAL; /* subsequent log entries, every 15 seconds */
|
||||
}
|
||||
}
|
||||
@@ -442,11 +458,19 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if ((select(CUPS_SC_FD+1, &input_set, NULL, NULL, &stimeout)) >= 0)
|
||||
{
|
||||
g.sidechannel_thread_stop = 0;
|
||||
g.sidechannel_thread_done = 0;
|
||||
|
||||
pthread_cond_init(&g.sidechannel_thread_cond, NULL);
|
||||
pthread_mutex_init(&g.sidechannel_thread_mutex, NULL);
|
||||
|
||||
if (pthread_create(&sidechannel_thread_id, NULL, sidechannel_thread, NULL))
|
||||
{
|
||||
fputs(_("WARNING: Couldn't create side channel\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("WARNING: Couldn't create side channel\n"));
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
|
||||
sidechannel_started = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -461,7 +485,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (pthread_create(&read_thread_id, NULL, read_thread, NULL))
|
||||
{
|
||||
fputs(_("WARNING: Couldn't create read channel\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("WARNING: Couldn't create read channel\n"));
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
|
||||
@@ -476,7 +500,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
while (status == noErr && copies-- > 0)
|
||||
{
|
||||
fputs(_("INFO: Sending data\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Sending data\n"));
|
||||
|
||||
if (print_fd != STDIN_FILENO)
|
||||
{
|
||||
@@ -544,7 +568,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
}
|
||||
else if (errno != EAGAIN)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: select() returned %d\n"), (int)errno);
|
||||
_cupsLangPrintf(stderr, _("ERROR: select() returned %d\n"), (int)errno);
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
}
|
||||
@@ -620,8 +644,10 @@ print_device(const char *uri, /* I - Device URI */
|
||||
*/
|
||||
|
||||
OSStatus err = (*g.classdriver)->Abort(g.classdriver);
|
||||
fprintf(stderr, _("ERROR: %ld: (canceled:%ld)\n"), (long)status, (long)err);
|
||||
return CUPS_BACKEND_STOP;
|
||||
_cupsLangPrintf(stderr, _("ERROR: %ld: (canceled:%ld)\n"),
|
||||
(long)status, (long)err);
|
||||
status = CUPS_BACKEND_STOP;
|
||||
break;
|
||||
}
|
||||
|
||||
fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", (int)bytes);
|
||||
@@ -643,13 +669,42 @@ print_device(const char *uri, /* I - Device URI */
|
||||
* Wait for the side channel thread to exit...
|
||||
*/
|
||||
|
||||
close(CUPS_SC_FD);
|
||||
pthread_mutex_lock(&g.readwrite_lock_mutex);
|
||||
g.readwrite_lock = 0;
|
||||
pthread_cond_signal(&g.readwrite_lock_cond);
|
||||
pthread_mutex_unlock(&g.readwrite_lock_mutex);
|
||||
if (sidechannel_started)
|
||||
{
|
||||
close(CUPS_SC_FD);
|
||||
pthread_mutex_lock(&g.readwrite_lock_mutex);
|
||||
g.readwrite_lock = 0;
|
||||
pthread_cond_signal(&g.readwrite_lock_cond);
|
||||
pthread_mutex_unlock(&g.readwrite_lock_mutex);
|
||||
|
||||
pthread_join(sidechannel_thread_id, NULL);
|
||||
g.sidechannel_thread_stop = 1;
|
||||
pthread_mutex_lock(&g.sidechannel_thread_mutex);
|
||||
if (!g.sidechannel_thread_done)
|
||||
{
|
||||
/*
|
||||
* Wait for the side-channel thread to exit...
|
||||
*/
|
||||
|
||||
cond_timeout.tv_sec = time(NULL) + WAIT_SIDE_DELAY;
|
||||
cond_timeout.tv_nsec = 0;
|
||||
if (pthread_cond_timedwait(&g.sidechannel_thread_cond,
|
||||
&g.sidechannel_thread_mutex,
|
||||
&cond_timeout) != 0)
|
||||
{
|
||||
/*
|
||||
* Force the side-channel thread to exit...
|
||||
*/
|
||||
|
||||
pthread_kill(sidechannel_thread_id, SIGTERM);
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&g.sidechannel_thread_mutex);
|
||||
|
||||
pthread_join(sidechannel_thread_id, NULL);
|
||||
|
||||
pthread_cond_destroy(&g.sidechannel_thread_cond);
|
||||
pthread_mutex_destroy(&g.sidechannel_thread_mutex);
|
||||
}
|
||||
|
||||
pthread_cond_destroy(&g.readwrite_lock_cond);
|
||||
pthread_mutex_destroy(&g.readwrite_lock_mutex);
|
||||
@@ -662,9 +717,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
/*
|
||||
* Give the read thread WAIT_EOF_DELAY seconds to complete all the data. If
|
||||
* we are not signaled in that time then force the thread to exit by setting
|
||||
* the waiteof to be false. Plese note that this relies on us using the timeout
|
||||
* class driver.
|
||||
* we are not signaled in that time then force the thread to exit.
|
||||
*/
|
||||
|
||||
pthread_mutex_lock(&g.read_thread_mutex);
|
||||
@@ -674,8 +727,15 @@ print_device(const char *uri, /* I - Device URI */
|
||||
cond_timeout.tv_sec = time(NULL) + WAIT_EOF_DELAY;
|
||||
cond_timeout.tv_nsec = 0;
|
||||
|
||||
if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, &cond_timeout) != 0)
|
||||
g.wait_eof = false;
|
||||
if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex,
|
||||
&cond_timeout) != 0)
|
||||
{
|
||||
/*
|
||||
* Force the read thread to exit...
|
||||
*/
|
||||
|
||||
pthread_kill(read_thread_id, SIGTERM);
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&g.read_thread_mutex);
|
||||
|
||||
@@ -788,18 +848,27 @@ sidechannel_thread(void *reference)
|
||||
char data[2048]; /* Request/response data */
|
||||
int datalen; /* Request/response data size */
|
||||
|
||||
for (;;)
|
||||
|
||||
do
|
||||
{
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
break;
|
||||
continue;
|
||||
|
||||
switch (command)
|
||||
{
|
||||
case CUPS_SC_CMD_SOFT_RESET: /* Do a soft reset */
|
||||
soft_reset();
|
||||
cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, NULL, 0, 1.0);
|
||||
if ((*g.classdriver)->SoftReset != NULL)
|
||||
{
|
||||
soft_reset();
|
||||
cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, NULL, 0, 1.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED,
|
||||
NULL, 0, 1.0);
|
||||
}
|
||||
break;
|
||||
|
||||
case CUPS_SC_CMD_DRAIN_OUTPUT: /* Drain all pending output */
|
||||
@@ -828,6 +897,13 @@ sidechannel_thread(void *reference)
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (!g.sidechannel_thread_stop);
|
||||
|
||||
pthread_mutex_lock(&g.sidechannel_thread_mutex);
|
||||
g.sidechannel_thread_done = 1;
|
||||
pthread_cond_signal(&g.sidechannel_thread_cond);
|
||||
pthread_mutex_unlock(&g.sidechannel_thread_mutex);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1004,9 +1080,9 @@ static Boolean find_device_cb(void *refcon,
|
||||
CFStringRef make = NULL, model = NULL, serial = NULL;
|
||||
|
||||
copy_deviceinfo(idString, &make, &model, &serial);
|
||||
if (CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
|
||||
if (make && CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
|
||||
{
|
||||
if (CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
|
||||
if (model && CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
|
||||
{
|
||||
if (g.serial != NULL && CFStringGetLength(g.serial) > 0)
|
||||
{
|
||||
@@ -1055,7 +1131,7 @@ static Boolean find_device_cb(void *refcon,
|
||||
if (!keepLooking && g.status_timer != NULL)
|
||||
{
|
||||
fputs("STATE: -offline-error\n", stderr);
|
||||
fputs(_("INFO: Printer is now on-line.\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Printer is now on-line.\n"));
|
||||
CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), g.status_timer, kCFRunLoopDefaultMode);
|
||||
CFRelease(g.status_timer);
|
||||
g.status_timer = NULL;
|
||||
@@ -1073,7 +1149,7 @@ static void status_timer_cb(CFRunLoopTimerRef timer,
|
||||
void *info)
|
||||
{
|
||||
fputs("STATE: +offline-error\n", stderr);
|
||||
fputs(_("INFO: Printer is currently off-line.\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Printer is currently off-line.\n"));
|
||||
}
|
||||
|
||||
|
||||
@@ -1505,18 +1581,19 @@ CFStringRef cfstr_create_trim(const char *cstr)
|
||||
|
||||
#pragma mark -
|
||||
/*
|
||||
* 'parse_options()' - Parse uri options.
|
||||
* 'parse_options()' - Parse URI options.
|
||||
*/
|
||||
|
||||
static void parse_options(const char *options,
|
||||
static void parse_options(char *options,
|
||||
char *serial,
|
||||
int serial_size,
|
||||
UInt32 *location,
|
||||
Boolean *wait_eof)
|
||||
{
|
||||
char *serialnumber; /* ?serial=<serial> or ?location=<location> */
|
||||
char optionName[255], /* Name of option */
|
||||
value[255], /* Value of option */
|
||||
*ptr; /* Pointer into name or value */
|
||||
char sep, /* Separator character */
|
||||
*name, /* Name of option */
|
||||
*value; /* Value of option */
|
||||
|
||||
|
||||
if (serial)
|
||||
*serial = '\0';
|
||||
@@ -1526,59 +1603,61 @@ static void parse_options(const char *options,
|
||||
if (!options)
|
||||
return;
|
||||
|
||||
serialnumber = NULL;
|
||||
|
||||
while (*options != '\0')
|
||||
while (*options)
|
||||
{
|
||||
/* Get the name... */
|
||||
for (ptr = optionName; *options && *options != '=' && *options != '+';)
|
||||
*ptr++ = *options++;
|
||||
/*
|
||||
* Get the name...
|
||||
*/
|
||||
|
||||
*ptr = '\0';
|
||||
value[0] = '\0';
|
||||
name = options;
|
||||
|
||||
if (*options == '=')
|
||||
{
|
||||
/* Get the value... */
|
||||
while (*options && *options != '=' && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
|
||||
for (ptr = value; *options && *options != '+';)
|
||||
*ptr++ = *options++;
|
||||
if ((sep = *options) != '\0')
|
||||
*options++ = '\0';
|
||||
|
||||
*ptr = '\0';
|
||||
if (sep == '=')
|
||||
{
|
||||
/*
|
||||
* Get the value...
|
||||
*/
|
||||
|
||||
if (*options == '+')
|
||||
value = options;
|
||||
|
||||
while (*options && *options != '+' && *options != '&')
|
||||
options ++;
|
||||
}
|
||||
else if (*options == '+')
|
||||
options ++;
|
||||
|
||||
/*
|
||||
* Process the option...
|
||||
*/
|
||||
if (strcasecmp(optionName, "waiteof") == 0)
|
||||
if (*options)
|
||||
*options++ = '\0';
|
||||
}
|
||||
else
|
||||
value = (char *)"";
|
||||
|
||||
/*
|
||||
* Process the option...
|
||||
*/
|
||||
|
||||
if (!strcasecmp(name, "waiteof"))
|
||||
{
|
||||
if (strcasecmp(value, "on") == 0 ||
|
||||
strcasecmp(value, "yes") == 0 ||
|
||||
strcasecmp(value, "true") == 0)
|
||||
if (!strcasecmp(value, "on") ||
|
||||
!strcasecmp(value, "yes") ||
|
||||
!strcasecmp(value, "true"))
|
||||
*wait_eof = true;
|
||||
else if (strcasecmp(value, "off") == 0 ||
|
||||
strcasecmp(value, "no") == 0 ||
|
||||
strcasecmp(value, "false") == 0)
|
||||
else if (!strcasecmp(value, "off") ||
|
||||
!strcasecmp(value, "no") ||
|
||||
!strcasecmp(value, "false"))
|
||||
*wait_eof = false;
|
||||
else
|
||||
fprintf(stderr, _("WARNING: Boolean expected for waiteof option \"%s\"\n"), value);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("WARNING: Boolean expected for waiteof option "
|
||||
"\"%s\"\n"), value);
|
||||
}
|
||||
else if (strcasecmp(optionName, "serial") == 0)
|
||||
{
|
||||
strcpy(serial, value);
|
||||
serialnumber = serial;
|
||||
}
|
||||
else if (strcasecmp(optionName, "location") == 0 && location)
|
||||
else if (!strcasecmp(name, "serial"))
|
||||
strlcpy(serial, value, serial_size);
|
||||
else if (!strcasecmp(name, "location") && location)
|
||||
*location = strtol(value, NULL, 16);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1852,7 +1931,7 @@ static void parse_pserror(char *sockBuffer,
|
||||
|
||||
|
||||
/*
|
||||
* 'soft_reset'
|
||||
* 'soft_reset()' - Send a soft reset to the device.
|
||||
*/
|
||||
|
||||
static void soft_reset()
|
||||
@@ -1900,7 +1979,7 @@ static void soft_reset()
|
||||
* Send the reset...
|
||||
*/
|
||||
|
||||
(*g.classdriver)->SoftReset(g.classdriver, 0);
|
||||
(*g.classdriver)->SoftReset(g.classdriver, DEFAULT_TIMEOUT);
|
||||
|
||||
/*
|
||||
* Release the I/O lock...
|
||||
|
||||
@@ -48,7 +48,7 @@ int /* O - Exit status */
|
||||
print_device(const char *uri, /* I - Device URI */
|
||||
const char *hostname, /* I - Hostname/manufacturer */
|
||||
const char *resource, /* I - Resource/modelname */
|
||||
const char *options, /* I - Device options/serial number */
|
||||
char *options, /* I - Device options/serial number */
|
||||
int print_fd, /* I - File descriptor to print */
|
||||
int copies, /* I - Copies to print */
|
||||
int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
@@ -105,8 +105,9 @@ print_device(const char *uri, /* I - Device URI */
|
||||
* available printer in the class.
|
||||
*/
|
||||
|
||||
fputs(_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Unable to contact printer, queuing on next "
|
||||
"printer in class...\n"));
|
||||
|
||||
/*
|
||||
* Sleep 5 seconds to keep the job from requeuing too rapidly...
|
||||
@@ -119,20 +120,23 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (errno == EBUSY)
|
||||
{
|
||||
fputs(_("INFO: Printer busy; will retry in 10 seconds...\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer busy; will retry in 10 seconds...\n"));
|
||||
sleep(10);
|
||||
}
|
||||
else if (errno == ENXIO || errno == EIO || errno == ENOENT ||
|
||||
errno == ENODEV)
|
||||
{
|
||||
fputs(_("INFO: Printer not connected; will retry in 30 seconds...\n"),
|
||||
stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer not connected; will retry in 30 "
|
||||
"seconds...\n"));
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
_cupsLangPrintf(stderr,
|
||||
_("ERROR: Unable to open device file \"%s\": %s\n"),
|
||||
resource, strerror(errno));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
}
|
||||
@@ -172,13 +176,13 @@ print_device(const char *uri, /* I - Device URI */
|
||||
tbytes = backendRunLoop(print_fd, device_fd, use_bc, side_cb);
|
||||
|
||||
if (print_fd != 0 && tbytes >= 0)
|
||||
fprintf(stderr,
|
||||
_cupsLangPrintf(stderr,
|
||||
#ifdef HAVE_LONG_LONG
|
||||
_("INFO: Sent print file, %lld bytes...\n"),
|
||||
_("INFO: Sent print file, %lld bytes...\n"),
|
||||
#else
|
||||
_("INFO: Sent print file, %ld bytes...\n"),
|
||||
_("INFO: Sent print file, %ld bytes...\n"),
|
||||
#endif /* HAVE_LONG_LONG */
|
||||
CUPS_LLCAST tbytes);
|
||||
CUPS_LLCAST tbytes);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -411,8 +415,8 @@ open_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (busy)
|
||||
{
|
||||
fputs(_("INFO: Printer busy; will retry in 5 seconds...\n"),
|
||||
stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer busy; will retry in 5 seconds...\n"));
|
||||
sleep(5);
|
||||
}
|
||||
}
|
||||
@@ -504,8 +508,8 @@ open_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (busy)
|
||||
{
|
||||
fputs(_("INFO: Printer is busy; will retry in 5 seconds...\n"),
|
||||
stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer is busy; will retry in 5 seconds...\n"));
|
||||
sleep(5);
|
||||
}
|
||||
}
|
||||
@@ -562,7 +566,7 @@ side_cb(int print_fd, /* I - Print file */
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
|
||||
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
void list_devices(void);
|
||||
int print_device(const char *uri, const char *hostname,
|
||||
const char *resource, const char *options,
|
||||
const char *resource, char *options,
|
||||
int print_fd, int copies, int argc, char *argv[]);
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ int /* O - Exit status */
|
||||
print_device(const char *uri, /* I - Device URI */
|
||||
const char *hostname, /* I - Hostname/manufacturer */
|
||||
const char *resource, /* I - Resource/modelname */
|
||||
const char *options, /* I - Device options/serial number */
|
||||
char *options, /* I - Device options/serial number */
|
||||
int print_fd, /* I - File descriptor to print */
|
||||
int copies, /* I - Copies to print */
|
||||
int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
@@ -184,8 +184,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
else if (argc < 6 || argc > 7)
|
||||
{
|
||||
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
_cupsLangPrintf(stderr,
|
||||
_("Usage: %s job-id user title copies options [file]\n"),
|
||||
argv[0]);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
@@ -200,8 +201,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
hostname, sizeof(hostname), &port,
|
||||
resource, sizeof(resource)) < HTTP_URI_OK)
|
||||
{
|
||||
fputs(_("ERROR: No device URI found in argv[0] or in DEVICE_URI "
|
||||
"environment variable!\n"), stderr);
|
||||
_cupsLangPuts(stderr,
|
||||
_("ERROR: No device URI found in argv[0] or in DEVICE_URI "
|
||||
"environment variable!\n"));
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -237,8 +239,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
if ((print_fd = open(argv[6], O_RDONLY)) < 0)
|
||||
{
|
||||
fprintf(stderr, _("ERROR: Unable to open print file %s - %s\n"),
|
||||
argv[6], strerror(errno));
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to open print file %s - %s\n"),
|
||||
argv[6], strerror(errno));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
|
||||
@@ -165,7 +165,8 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
do_printer_op(http, CUPS_SET_DEFAULT, cgiText(_("Set As Default")));
|
||||
else if (!strcmp(op, "set-sharing"))
|
||||
do_set_sharing(http);
|
||||
else if (!strcmp(op, "list-available-printers"))
|
||||
else if (!strcmp(op, "find-new-printers") ||
|
||||
!strcmp(op, "list-available-printers"))
|
||||
do_list_printers(http);
|
||||
else if (!strcmp(op, "add-class"))
|
||||
do_am_class(http, 0);
|
||||
@@ -366,7 +367,12 @@ do_add_rss_subscription(http_t *http) /* I - HTTP connection */
|
||||
|
||||
ippDelete(cupsDoRequest(http, request, "/"));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiStartHTML(_("Add RSS Subscription"));
|
||||
cgiShowIPPError(_("Unable to add RSS subscription:"));
|
||||
@@ -627,7 +633,12 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
|
||||
ippDelete(cupsDoRequest(http, request, "/admin/"));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiStartHTML(title);
|
||||
cgiShowIPPError(modify ? _("Unable to modify class:") :
|
||||
@@ -1179,7 +1190,12 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
else
|
||||
ippDelete(cupsDoRequest(http, request, "/admin/"));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiStartHTML(title);
|
||||
cgiShowIPPError(modify ? _("Unable to modify printer:") :
|
||||
@@ -1271,7 +1287,12 @@ do_cancel_subscription(http_t *http)/* I - HTTP connection */
|
||||
|
||||
ippDelete(cupsDoRequest(http, request, "/"));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiStartHTML(_("Cancel RSS Subscription"));
|
||||
cgiShowIPPError(_("Unable to cancel RSS subscription:"));
|
||||
@@ -1399,6 +1420,12 @@ do_config_server(http_t *http) /* I - HTTP connection */
|
||||
|
||||
if (!cupsAdminSetServerSettings(http, num_settings, settings))
|
||||
{
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
cgiStartHTML(cgiText(_("Change Settings")));
|
||||
cgiSetVariable("MESSAGE",
|
||||
cgiText(_("Unable to change server settings:")));
|
||||
@@ -1501,7 +1528,13 @@ do_config_server(http_t *http) /* I - HTTP connection */
|
||||
|
||||
status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile);
|
||||
|
||||
if (status != HTTP_CREATED)
|
||||
if (status == HTTP_UNAUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
unlink(tempfile);
|
||||
exit(0);
|
||||
}
|
||||
else if (status != HTTP_CREATED)
|
||||
{
|
||||
cgiSetVariable("MESSAGE",
|
||||
cgiText(_("Unable to upload cupsd.conf file:")));
|
||||
@@ -1526,7 +1559,10 @@ do_config_server(http_t *http) /* I - HTTP connection */
|
||||
{
|
||||
struct stat info; /* cupsd.conf information */
|
||||
cups_file_t *cupsd; /* cupsd.conf file */
|
||||
char *buffer; /* Buffer for entire file */
|
||||
char *buffer, /* Buffer for entire file */
|
||||
*bufptr, /* Pointer into buffer */
|
||||
*bufend; /* End of buffer */
|
||||
int ch; /* Character from file */
|
||||
char filename[1024]; /* Filename */
|
||||
const char *server_root; /* Location of config files */
|
||||
|
||||
@@ -1606,14 +1642,55 @@ do_config_server(http_t *http) /* I - HTTP connection */
|
||||
cgiSetVariable("CUPSDCONF", buffer);
|
||||
free(buffer);
|
||||
|
||||
/*
|
||||
* Then get the default cupsd.conf file and put that into a string as
|
||||
* well...
|
||||
*/
|
||||
|
||||
strlcat(filename, ".default", sizeof(filename));
|
||||
|
||||
if (!stat(filename, &info) && info.st_size < (1024 * 1024) &&
|
||||
(cupsd = cupsFileOpen(filename, "r")) != NULL)
|
||||
{
|
||||
buffer = calloc(1, 2 * info.st_size + 1);
|
||||
bufend = buffer + 2 * info.st_size - 1;
|
||||
|
||||
for (bufptr = buffer;
|
||||
bufptr < bufend && (ch = cupsFileGetChar(cupsd)) != EOF;)
|
||||
{
|
||||
if (ch == '\\' || ch == '\"')
|
||||
{
|
||||
*bufptr++ = '\\';
|
||||
*bufptr++ = ch;
|
||||
}
|
||||
else if (ch == '\n')
|
||||
{
|
||||
*bufptr++ = '\\';
|
||||
*bufptr++ = 'n';
|
||||
}
|
||||
else if (ch == '\t')
|
||||
{
|
||||
*bufptr++ = '\\';
|
||||
*bufptr++ = 't';
|
||||
}
|
||||
else if (ch >= ' ')
|
||||
*bufptr++ = ch;
|
||||
}
|
||||
|
||||
*bufptr = '\0';
|
||||
|
||||
cupsFileClose(cupsd);
|
||||
|
||||
cgiSetVariable("CUPSDCONF_DEFAULT", buffer);
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
* Show the current config file...
|
||||
*/
|
||||
|
||||
cgiStartHTML(cgiText(_("Edit Configuration File")));
|
||||
|
||||
printf("<!-- \"%s\" -->\n", filename);
|
||||
|
||||
cgiCopyTemplateLang("edit-config.tmpl");
|
||||
|
||||
cgiEndHTML();
|
||||
@@ -1681,7 +1758,12 @@ do_delete_class(http_t *http) /* I - HTTP connection */
|
||||
* Show the results...
|
||||
*/
|
||||
|
||||
if (cupsLastError() <= IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() <= IPP_OK_CONFLICT)
|
||||
{
|
||||
/*
|
||||
* Redirect successful updates back to the classes page...
|
||||
@@ -1761,7 +1843,12 @@ do_delete_printer(http_t *http) /* I - HTTP connection */
|
||||
* Show the results...
|
||||
*/
|
||||
|
||||
if (cupsLastError() <= IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() <= IPP_OK_CONFLICT)
|
||||
{
|
||||
/*
|
||||
* Redirect successful updates back to the printers page...
|
||||
@@ -2325,7 +2412,12 @@ do_printer_op(http_t *http, /* I - HTTP connection */
|
||||
|
||||
ippDelete(cupsDoRequest(http, request, "/admin/"));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiStartHTML(title);
|
||||
cgiShowIPPError(_("Unable to change printer:"));
|
||||
@@ -2446,7 +2538,12 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */
|
||||
|
||||
cgiStartHTML(cgiText(_("Set Allowed Users")));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
cgiShowIPPError(_("Unable to get printer attributes:"));
|
||||
else
|
||||
cgiCopyTemplateLang("users.tmpl");
|
||||
@@ -2583,7 +2680,12 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */
|
||||
|
||||
ippDelete(cupsDoRequest(http, request, "/admin/"));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiStartHTML(cgiText(_("Set Allowed Users")));
|
||||
cgiShowIPPError(_("Unable to change printer:"));
|
||||
@@ -3127,7 +3229,12 @@ do_set_options(http_t *http, /* I - HTTP connection */
|
||||
else
|
||||
ippDelete(cupsDoRequest(http, request, "/admin/"));
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiStartHTML(title);
|
||||
cgiShowIPPError(_("Unable to set options:"));
|
||||
@@ -3221,7 +3328,12 @@ do_set_sharing(http_t *http) /* I - HTTP connection */
|
||||
ippDelete(response);
|
||||
}
|
||||
|
||||
if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
if (cupsLastError() == IPP_NOT_AUTHORIZED)
|
||||
{
|
||||
puts("Status: 401\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (cupsLastError() > IPP_OK_CONFLICT)
|
||||
{
|
||||
cgiStartHTML(cgiText(_("Set Publishing")));
|
||||
cgiShowIPPError(_("Unable to change printer-is-shared attribute:"));
|
||||
|
||||
@@ -151,6 +151,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
cgiSetVariable("HELPFILE", helpfile);
|
||||
cgiSetVariable("HELPTITLE", n->text);
|
||||
cgiSetVariable("TOPIC", n->section);
|
||||
|
||||
/*
|
||||
* Send a standard page header...
|
||||
|
||||
@@ -50,7 +50,7 @@ cgiCopyTemplateFile(FILE *out, /* I - Output file */
|
||||
FILE *in; /* Input file */
|
||||
|
||||
|
||||
fprintf(stderr, "DEBUG: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out,
|
||||
fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out,
|
||||
tmpl ? tmpl : "(null)");
|
||||
|
||||
/*
|
||||
@@ -85,37 +85,34 @@ cgiCopyTemplateFile(FILE *out, /* I - Output file */
|
||||
void
|
||||
cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
char filename[1024], /* Filename */
|
||||
locale[16]; /* Locale name */
|
||||
locale[16], /* Locale name */
|
||||
*locptr; /* Pointer into locale name */
|
||||
const char *directory, /* Directory for templates */
|
||||
*lang; /* Language */
|
||||
FILE *in; /* Input file */
|
||||
|
||||
|
||||
fprintf(stderr, "DEBUG: cgiCopyTemplateLang(tmpl=\"%s\")\n",
|
||||
fprintf(stderr, "DEBUG2: cgiCopyTemplateLang(tmpl=\"%s\")\n",
|
||||
tmpl ? tmpl : "(null)");
|
||||
|
||||
/*
|
||||
* Convert the language to a locale name...
|
||||
*/
|
||||
|
||||
locale[0] = '\0';
|
||||
|
||||
if ((lang = getenv("LANG")) != NULL)
|
||||
{
|
||||
for (i = 0; lang[i] && i < 15; i ++)
|
||||
if (isalnum(lang[i] & 255) || lang[i] == '_')
|
||||
locale[i] = tolower(lang[i]);
|
||||
else if (lang[i] == '-')
|
||||
locale[i] = '_';
|
||||
else
|
||||
break;
|
||||
locale[0] = '/';
|
||||
strlcpy(locale + 1, lang, sizeof(locale) - 1);
|
||||
|
||||
locale[i] = '\0';
|
||||
if ((locptr = strchr(locale, '.')) != NULL)
|
||||
*locptr = '\0'; /* Strip charset */
|
||||
}
|
||||
else
|
||||
locale[0] = '\0';
|
||||
|
||||
fprintf(stderr, "DEBUG: locale=\"%s\"...\n", locale);
|
||||
fprintf(stderr, "DEBUG: lang=\"%s\", locale=\"%s\"...\n",
|
||||
lang ? lang : "(null)", locale);
|
||||
|
||||
/*
|
||||
* See if we have a template file for this language...
|
||||
@@ -123,23 +120,26 @@ cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */
|
||||
|
||||
directory = cgiGetTemplateDir();
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
|
||||
if (access(filename, 0))
|
||||
snprintf(filename, sizeof(filename), "%s%s/%s", directory, locale, tmpl);
|
||||
if ((in = fopen(filename, "r")) == NULL)
|
||||
{
|
||||
locale[2] = '\0';
|
||||
locale[3] = '\0';
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
|
||||
if (access(filename, 0))
|
||||
snprintf(filename, sizeof(filename), "%s%s/%s", directory, locale, tmpl);
|
||||
if ((in = fopen(filename, "r")) == NULL)
|
||||
{
|
||||
snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl);
|
||||
in = fopen(filename, "r");
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "DEBUG: Template file is \"%s\"...\n", filename);
|
||||
fprintf(stderr, "DEBUG2: Template file is \"%s\"...\n", filename);
|
||||
|
||||
/*
|
||||
* Open the template file...
|
||||
*/
|
||||
|
||||
if ((in = fopen(filename, "r")) == NULL)
|
||||
if (!in)
|
||||
{
|
||||
fprintf(stderr, "ERROR: Unable to open template file \"%s\" - %s\n",
|
||||
filename, strerror(errno));
|
||||
@@ -231,7 +231,7 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
int uriencode; /* Encode as URI */
|
||||
|
||||
|
||||
fprintf(stderr, "DEBUG: %*sStarting at file position %ld...\n", indent, "",
|
||||
fprintf(stderr, "DEBUG2: %*sStarting at file position %ld...\n", indent, "",
|
||||
ftell(in));
|
||||
|
||||
/*
|
||||
@@ -263,7 +263,7 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
|
||||
if (s == name && isspace(ch & 255))
|
||||
{
|
||||
fprintf(stderr, "DEBUG: %*sLone { at %ld...\n", indent, "", ftell(in));
|
||||
fprintf(stderr, "DEBUG2: %*sLone { at %ld...\n", indent, "", ftell(in));
|
||||
|
||||
if (out)
|
||||
{
|
||||
@@ -275,7 +275,7 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
}
|
||||
|
||||
if (ch == '}')
|
||||
fprintf(stderr, "DEBUG: %*s\"{%s}\" at %ld...\n", indent, "", name,
|
||||
fprintf(stderr, "DEBUG2: %*s\"{%s}\" at %ld...\n", indent, "", name,
|
||||
ftell(in));
|
||||
|
||||
/*
|
||||
@@ -339,7 +339,7 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
|
||||
pos = ftell(in);
|
||||
|
||||
fprintf(stderr, "DEBUG: %*sLooping on \"%s\" at %ld, count=%d...\n",
|
||||
fprintf(stderr, "DEBUG2: %*sLooping on \"%s\" at %ld, count=%d...\n",
|
||||
indent, "", name + 1, pos, count);
|
||||
|
||||
if (count > 0)
|
||||
@@ -355,7 +355,7 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
else
|
||||
cgi_copy(NULL, in, 0, '}', indent + 2);
|
||||
|
||||
fprintf(stderr, "DEBUG: %*sFinished looping on \"%s\"...\n", indent,
|
||||
fprintf(stderr, "DEBUG2: %*sFinished looping on \"%s\"...\n", indent,
|
||||
"", name + 1);
|
||||
|
||||
continue;
|
||||
@@ -400,6 +400,8 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
{
|
||||
if (uriencode)
|
||||
cgi_puturi(outptr, out);
|
||||
else if (!strcasecmp(name, "?cupsdconf_default"))
|
||||
fputs(outptr, stdout);
|
||||
else
|
||||
cgi_puts(outptr, out);
|
||||
}
|
||||
@@ -491,7 +493,7 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
if (ch != '?')
|
||||
{
|
||||
fprintf(stderr,
|
||||
"DEBUG: %*sBad terminator '%c' at file position %ld...\n",
|
||||
"DEBUG2: %*sBad terminator '%c' at file position %ld...\n",
|
||||
indent, "", ch, ftell(in));
|
||||
return;
|
||||
}
|
||||
@@ -521,7 +523,7 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
}
|
||||
|
||||
fprintf(stderr,
|
||||
"DEBUG: %*sStarting \"{%s%c%s\" at %ld, result=%d...\n",
|
||||
"DEBUG2: %*sStarting \"{%s%c%s\" at %ld, result=%d...\n",
|
||||
indent, "", name, op, compare, ftell(in), result);
|
||||
|
||||
if (result)
|
||||
@@ -530,10 +532,10 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
* Comparison true; output first part and ignore second...
|
||||
*/
|
||||
|
||||
fprintf(stderr, "DEBUG: %*sOutput first part...\n", indent, "");
|
||||
fprintf(stderr, "DEBUG2: %*sOutput first part...\n", indent, "");
|
||||
cgi_copy(out, in, element, ':', indent + 2);
|
||||
|
||||
fprintf(stderr, "DEBUG: %*sSkip second part...\n", indent, "");
|
||||
fprintf(stderr, "DEBUG2: %*sSkip second part...\n", indent, "");
|
||||
cgi_copy(NULL, in, element, '}', indent + 2);
|
||||
}
|
||||
else
|
||||
@@ -542,14 +544,14 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
* Comparison false; ignore first part and output second...
|
||||
*/
|
||||
|
||||
fprintf(stderr, "DEBUG: %*sSkip first part...\n", indent, "");
|
||||
fprintf(stderr, "DEBUG2: %*sSkip first part...\n", indent, "");
|
||||
cgi_copy(NULL, in, element, ':', indent + 2);
|
||||
|
||||
fprintf(stderr, "DEBUG: %*sOutput second part...\n", indent, "");
|
||||
fprintf(stderr, "DEBUG2: %*sOutput second part...\n", indent, "");
|
||||
cgi_copy(out, in, element, '}', indent + 2);
|
||||
}
|
||||
|
||||
fprintf(stderr, "DEBUG: %*sFinished \"{%s%c%s\", out=%p...\n", indent, "",
|
||||
fprintf(stderr, "DEBUG2: %*sFinished \"{%s%c%s\", out=%p...\n", indent, "",
|
||||
name, op, compare, out);
|
||||
}
|
||||
else if (ch == '\\') /* Quoted char */
|
||||
@@ -563,11 +565,11 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
putc(ch, out);
|
||||
|
||||
if (ch == EOF)
|
||||
fprintf(stderr, "DEBUG: %*sReturning at file position %ld on EOF...\n",
|
||||
fprintf(stderr, "DEBUG2: %*sReturning at file position %ld on EOF...\n",
|
||||
indent, "", ftell(in));
|
||||
else
|
||||
fprintf(stderr,
|
||||
"DEBUG: %*sReturning at file position %ld on character '%c'...\n",
|
||||
"DEBUG2: %*sReturning at file position %ld on character '%c'...\n",
|
||||
indent, "", ftell(in), ch);
|
||||
|
||||
if (ch == EOF && term)
|
||||
|
||||
@@ -49,22 +49,29 @@ DefaultAuthType Basic
|
||||
|
||||
# Set the default printer/job policies...
|
||||
<Policy default>
|
||||
# Job-related operations must be done by the owner or an adminstrator...
|
||||
# Job-related operations must be done by the owner or an administrator...
|
||||
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>
|
||||
Require user @OWNER @SYSTEM
|
||||
Order deny,allow
|
||||
</Limit>
|
||||
|
||||
# All administration operations require an adminstrator to authenticate...
|
||||
<Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>
|
||||
# All administration operations require an administrator to authenticate...
|
||||
<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
|
||||
AuthType Default
|
||||
Require user @SYSTEM
|
||||
Order deny,allow
|
||||
</Limit>
|
||||
|
||||
# All printer operations require a printer operator to authenticate...
|
||||
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Accept-Jobs CUPS-Reject-Jobs>
|
||||
AuthType Default
|
||||
Require user @CUPS_DEFAULT_PRINTADMIN_AUTH@
|
||||
Order deny,allow
|
||||
</Limit>
|
||||
|
||||
# Only the owner or an administrator can cancel or authenticate a job...
|
||||
<Limit Cancel-Job CUPS-Authenticate-Job>
|
||||
Require user @OWNER @SYSTEM
|
||||
Require user @OWNER @CUPS_DEFAULT_PRINTADMIN_AUTH@
|
||||
Order deny,allow
|
||||
</Limit>
|
||||
|
||||
|
||||
@@ -95,8 +95,8 @@ image/x-xpixmap application/vnd.cups-raster 100 imagetoraster
|
||||
#image/x-xwindowdump application/vnd.cups-raster 100 imagetoraster
|
||||
image/x-sun-raster application/vnd.cups-raster 100 imagetoraster
|
||||
|
||||
# pstoraster is now part of ESP Ghostscript...
|
||||
#application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
|
||||
# pstoraster is part of GPL Ghostscript...
|
||||
application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
|
||||
|
||||
########################################################################
|
||||
#
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-common.m4 6661 2007-07-13 05:53:03Z mike $"
|
||||
dnl "$Id: cups-common.m4 6981 2007-09-19 21:51:55Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -13,14 +13,14 @@ dnl which should have been included with this file. If this file is
|
||||
dnl file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
dnl
|
||||
|
||||
dnl We need at least autoconf 2.50...
|
||||
AC_PREREQ(2.50)
|
||||
dnl We need at least autoconf 2.60...
|
||||
AC_PREREQ(2.60)
|
||||
|
||||
dnl Set the name of the config header file...
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Versio number information...
|
||||
CUPS_VERSION="1.3b1"
|
||||
CUPS_VERSION="1.3.3"
|
||||
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'`"
|
||||
@@ -123,6 +123,7 @@ AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H))
|
||||
AC_CHECK_HEADER(bstring.h,AC_DEFINE(HAVE_BSTRING_H))
|
||||
AC_CHECK_HEADER(usersec.h,AC_DEFINE(HAVE_USERSEC_H))
|
||||
AC_CHECK_HEADER(sys/ioctl.h,AC_DEFINE(HAVE_SYS_IOCTL_H))
|
||||
AC_CHECK_HEADER(sys/param.h,AC_DEFINE(HAVE_SYS_PARAM_H))
|
||||
AC_CHECK_HEADER(sys/ucred.h,AC_DEFINE(HAVE_SYS_UCRED_H))
|
||||
AC_CHECK_HEADER(scsi/sg.h,AC_DEFINE(HAVE_SCSI_SG_H))
|
||||
|
||||
@@ -157,8 +158,7 @@ esac
|
||||
AC_CHECK_FUNCS(sigaction)
|
||||
|
||||
dnl Checks for wait functions.
|
||||
AC_CHECK_FUNCS(waitpid)
|
||||
AC_CHECK_FUNCS(wait3)
|
||||
AC_CHECK_FUNCS(waitpid wait3)
|
||||
|
||||
dnl See if the tm structure has the tm_gmtoff member...
|
||||
AC_MSG_CHECKING(for tm_gmtoff member in tm structure)
|
||||
@@ -168,6 +168,9 @@ AC_TRY_COMPILE([#include <time.h>],[struct tm t;
|
||||
AC_DEFINE(HAVE_TM_GMTOFF),
|
||||
AC_MSG_RESULT(no))
|
||||
|
||||
dnl See if we have the removefile(3) function for securely removing files
|
||||
AC_CHECK_FUNCS(removefile)
|
||||
|
||||
dnl Flags for "ar" command...
|
||||
case $uname in
|
||||
Darwin* | *BSD*)
|
||||
@@ -184,15 +187,11 @@ dnl Extra platform-specific libraries...
|
||||
BACKLIBS=""
|
||||
CUPSDLIBS=""
|
||||
DBUSDIR=""
|
||||
CUPS_DEFAULT_PRINTADMIN_AUTH="@SYSTEM"
|
||||
CUPS_SYSTEM_AUTHKEY=""
|
||||
|
||||
AC_ARG_ENABLE(dbus, [ --enable-dbus enable DBUS support, default=auto])
|
||||
|
||||
AC_ARG_WITH(libcupsorder, [ --with-libcupsorder libcups secorder file, default=libcups.order],
|
||||
LIBCUPSORDER="$withval",
|
||||
LIBCUPSORDER="libcups.order")
|
||||
AC_SUBST(LIBCUPSORDER)
|
||||
|
||||
FONTS="fonts"
|
||||
AC_SUBST(FONTS)
|
||||
LEGACY_BACKENDS="parallel scsi"
|
||||
@@ -235,6 +234,7 @@ case $uname in
|
||||
dnl Check for Authorization Services support
|
||||
AC_CHECK_HEADER(Security/Authorization.h, [
|
||||
AC_DEFINE(HAVE_AUTHORIZATION_H)
|
||||
CUPS_DEFAULT_PRINTADMIN_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin"
|
||||
CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.preferences"])
|
||||
AC_CHECK_HEADER(Security/SecBasePriv.h,AC_DEFINE(HAVE_SECBASEPRIV_H))
|
||||
;;
|
||||
@@ -263,6 +263,8 @@ case $uname in
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(CUPS_DEFAULT_PRINTADMIN_AUTH)
|
||||
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTADMIN_AUTH, "$CUPS_DEFAULT_PRINTADMIN_AUTH")
|
||||
AC_SUBST(CUPS_SYSTEM_AUTHKEY)
|
||||
|
||||
dnl See if we have POSIX ACL support...
|
||||
@@ -285,5 +287,5 @@ AC_SUBST(DEFAULT_IPP_PORT)
|
||||
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-common.m4 6661 2007-07-13 05:53:03Z mike $".
|
||||
dnl End of "$Id: cups-common.m4 6981 2007-09-19 21:51:55Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-compiler.m4 6649 2007-07-11 21:46:42Z mike $"
|
||||
dnl "$Id: cups-compiler.m4 6976 2007-09-18 20:39:31Z mike $"
|
||||
dnl
|
||||
dnl Compiler stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -72,6 +72,21 @@ AC_SUBST(PIEFLAGS)
|
||||
RELROFLAGS=""
|
||||
AC_SUBST(RELROFLAGS)
|
||||
|
||||
LIBCUPSORDER="libcups.order"
|
||||
AC_ARG_WITH(libcupsorder, [ --with-libcupsorder libcups secorder file, default=libcups.order],
|
||||
if test -f "$withval"; then
|
||||
LIBCUPSORDER="$withval"
|
||||
fi)
|
||||
AC_SUBST(LIBCUPSORDER)
|
||||
|
||||
LIBCUPSIMAGEORDER="libcupsimage.order"
|
||||
AC_ARG_WITH(libcupsimageorder, [ --with-libcupsimagesorder
|
||||
libcupsimage secorder file, default=libcupsimage.order],
|
||||
if test -f "$withval"; then
|
||||
LIBCUPSIMAGEORDER="$withval"
|
||||
fi)
|
||||
AC_SUBST(LIBCUPSIMAGEORDER)
|
||||
|
||||
if test -n "$GCC"; then
|
||||
# Add GCC-specific compiler options...
|
||||
if test -z "$OPTIM"; then
|
||||
@@ -286,6 +301,40 @@ else
|
||||
if test $PICFLAG = 1; then
|
||||
OPTIM="+z $OPTIM"
|
||||
fi
|
||||
|
||||
if test "x$enable_32bit" = xyes; then
|
||||
# Build 32-bit libraries, 64-bit base...
|
||||
if test -z "$with_arch32flags"; then
|
||||
ARCH32FLAGS="+DD32"
|
||||
else
|
||||
ARCH32FLAGS="$with_arch32flags"
|
||||
fi
|
||||
|
||||
if test -z "$with_archflags"; then
|
||||
if test -z "$with_arch64flags"; then
|
||||
ARCHFLAGS="+DD64"
|
||||
else
|
||||
ARCHFLAGS="$with_arch64flags"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$enable_64bit" = xyes; then
|
||||
# Build 64-bit libraries, 32-bit base...
|
||||
if test -z "$with_arch64flags"; then
|
||||
ARCH64FLAGS="+DD64"
|
||||
else
|
||||
ARCH64FLAGS="$with_arch64flags"
|
||||
fi
|
||||
|
||||
if test -z "$with_archflags"; then
|
||||
if test -z "$with_arch32flags"; then
|
||||
ARCHFLAGS="+DD32"
|
||||
else
|
||||
ARCHFLAGS="$with_arch32flags"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
IRIX)
|
||||
if test -z "$OPTIM"; then
|
||||
@@ -449,5 +498,5 @@ case $uname in
|
||||
esac
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-compiler.m4 6649 2007-07-11 21:46:42Z mike $".
|
||||
dnl End of "$Id: cups-compiler.m4 6976 2007-09-18 20:39:31Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-defaults.m4 6656 2007-07-12 23:56:23Z mike $"
|
||||
dnl "$Id: cups-defaults.m4 6754 2007-08-01 19:00:07Z mike $"
|
||||
dnl
|
||||
dnl Default cupsd configuration settings for the Common UNIX Printing System
|
||||
dnl (CUPS).
|
||||
@@ -159,7 +159,14 @@ dnl Determine the correct username and group for this OS...
|
||||
AC_ARG_WITH(cups_user, [ --with-cups-user set default user for CUPS],
|
||||
CUPS_USER="$withval",
|
||||
AC_MSG_CHECKING(for default print user)
|
||||
if test -f /etc/passwd; then
|
||||
if test x$uname = xDarwin; then
|
||||
if test x`id -u _lp 2>/dev/null` = x; then
|
||||
CUPS_USER="lp";
|
||||
else
|
||||
CUPS_USER="_lp";
|
||||
fi
|
||||
AC_MSG_RESULT($CUPS_USER)
|
||||
elif test -f /etc/passwd; then
|
||||
CUPS_USER=""
|
||||
for user in lp lpd guest daemon nobody; do
|
||||
if test "`grep \^${user}: /etc/passwd`" != ""; then
|
||||
@@ -181,8 +188,15 @@ AC_ARG_WITH(cups_user, [ --with-cups-user set default user for CUPS],
|
||||
AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS],
|
||||
CUPS_GROUP="$withval",
|
||||
AC_MSG_CHECKING(for default print group)
|
||||
if test -f /etc/group; then
|
||||
GROUP_LIST="lp nobody"
|
||||
if test x$uname = xDarwin; then
|
||||
if test x`id -g _lp 2>/dev/null` = x; then
|
||||
CUPS_GROUP="lp";
|
||||
else
|
||||
CUPS_GROUP="_lp";
|
||||
fi
|
||||
AC_MSG_RESULT($CUPS_GROUP)
|
||||
elif test -f /etc/group; then
|
||||
GROUP_LIST="_lp lp nobody"
|
||||
CUPS_GROUP=""
|
||||
for group in $GROUP_LIST; do
|
||||
if test "`grep \^${group}: /etc/group`" != ""; then
|
||||
@@ -204,7 +218,7 @@ AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS],
|
||||
AC_ARG_WITH(system_groups, [ --with-system-groups set default system groups for CUPS],
|
||||
CUPS_SYSTEM_GROUPS="$withval",
|
||||
if test x$uname = xDarwin; then
|
||||
CUPS_SYSTEM_GROUPS="lpadmin admin"
|
||||
CUPS_SYSTEM_GROUPS="admin"
|
||||
else
|
||||
AC_MSG_CHECKING(for default system groups)
|
||||
if test -f /etc/group; then
|
||||
@@ -324,5 +338,5 @@ AC_SUBST(CUPS_SNMP_ADDRESS)
|
||||
AC_SUBST(CUPS_SNMP_COMMUNITY)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-defaults.m4 6656 2007-07-12 23:56:23Z mike $".
|
||||
dnl End of "$Id: cups-defaults.m4 6754 2007-08-01 19:00:07Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-directories.m4 6649 2007-07-11 21:46:42Z mike $"
|
||||
dnl "$Id: cups-directories.m4 6976 2007-09-18 20:39:31Z mike $"
|
||||
dnl
|
||||
dnl Directory stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -99,17 +99,23 @@ if test "$sysconfdir" = "\${prefix}/etc"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Fix "libdir" variable for IRIX 6.x...
|
||||
dnl Fix "libdir" variable...
|
||||
if test "$libdir" = "\${exec_prefix}/lib"; then
|
||||
if test "$uname" = "IRIX"; then
|
||||
libdir="$exec_prefix/lib32"
|
||||
else
|
||||
if test "$uname" = Linux -a -d /usr/lib64; then
|
||||
libdir="$exec_prefix/lib64"
|
||||
else
|
||||
libdir="$exec_prefix/lib"
|
||||
fi
|
||||
fi
|
||||
case "$uname" in
|
||||
IRIX*)
|
||||
libdir="$exec_prefix/lib32"
|
||||
;;
|
||||
Linux*)
|
||||
if test -d /usr/lib64; then
|
||||
libdir="$exec_prefix/lib64"
|
||||
fi
|
||||
;;
|
||||
HP-UX*)
|
||||
if test -d /usr/lib/hpux32; then
|
||||
libdir="$exec_prefix/lib/hpux32"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
dnl Setup init.d locations...
|
||||
@@ -146,8 +152,8 @@ if test x$rcdir = x; then
|
||||
HP-UX*)
|
||||
INITDIR="/sbin"
|
||||
RCLEVELS="2"
|
||||
RCSTART="620"
|
||||
RCSTOP="380"
|
||||
RCSTART="380"
|
||||
RCSTOP="620"
|
||||
;;
|
||||
|
||||
IRIX*)
|
||||
@@ -291,21 +297,26 @@ fi
|
||||
AC_SUBST(CUPS_FONTPATH)
|
||||
AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$CUPS_FONTPATH")
|
||||
|
||||
# Locale data
|
||||
case "$uname" in
|
||||
Linux | GNU | *BSD* | Darwin*)
|
||||
CUPS_LOCALEDIR="$datadir/locale"
|
||||
;;
|
||||
# Locale data (initial assignment allows us not to require autoconf 2.60)
|
||||
localedir="${localedir:=}"
|
||||
if test "$localedir" = "\${datarootdir}/locale" -o "$localedir" = ""; then
|
||||
case "$uname" in
|
||||
Linux | GNU | *BSD* | Darwin*)
|
||||
CUPS_LOCALEDIR="$datadir/locale"
|
||||
;;
|
||||
|
||||
OSF1* | AIX*)
|
||||
CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
|
||||
;;
|
||||
OSF1* | AIX*)
|
||||
CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
|
||||
;;
|
||||
|
||||
*)
|
||||
# This is the standard System V location...
|
||||
CUPS_LOCALEDIR="$exec_prefix/lib/locale"
|
||||
;;
|
||||
esac
|
||||
*)
|
||||
# This is the standard System V location...
|
||||
CUPS_LOCALEDIR="$exec_prefix/lib/locale"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
CUPS_LOCALEDIR="$localedir"
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$CUPS_LOCALEDIR")
|
||||
AC_SUBST(CUPS_LOCALEDIR)
|
||||
@@ -356,5 +367,5 @@ AC_DEFINE_UNQUOTED(CUPS_STATEDIR, "$localstatedir/run/cups")
|
||||
AC_SUBST(CUPS_STATEDIR)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-directories.m4 6649 2007-07-11 21:46:42Z mike $".
|
||||
dnl End of "$Id: cups-directories.m4 6976 2007-09-18 20:39:31Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -29,17 +29,19 @@ DNSSDLIBS=""
|
||||
|
||||
if test x$enable_dnssd != xno; then
|
||||
AC_CHECK_HEADER(dns_sd.h, [
|
||||
AC_DEFINE(HAVE_DNSSD)
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
# Darwin and MacOS X...
|
||||
DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration"
|
||||
AC_DEFINE(HAVE_DNSSD)
|
||||
AC_DEFINE(HAVE_COREFOUNDATION)
|
||||
AC_DEFINE(HAVE_SYSTEMCONFIGURATION)
|
||||
;;
|
||||
*)
|
||||
# All others...
|
||||
DNSSDLIBS="???"
|
||||
AC_CHECK_LIB(dns_sd,DNSServiceProcessResult,
|
||||
AC_DEFINE(HAVE_DNSSD)
|
||||
DNSSDLIBS="-ldns_sd")
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
@@ -60,7 +60,7 @@ if test x$enable_gssapi != xno; then
|
||||
|
||||
AC_CHECK_FUNC(gsskrb5_register_acceptor_identity,
|
||||
AC_DEFINE(HAVE_GSSKRB5_REGISTER_ACCEPTOR_IDENTITY))
|
||||
AC_CHECK_FUNC(krb5_cc_resolve, AC_DEFINE(HAVE_KRB5_CC_RESOLVE))
|
||||
AC_CHECK_FUNC(krb5_cc_new_unique, AC_DEFINE(HAVE_KRB5_CC_NEW_UNIQUE))
|
||||
|
||||
AC_MSG_CHECKING(for GSS_C_NT_HOSTBASED_SERVICE)
|
||||
if test $ac_cv_header_gssapi_gssapi_h = yes; then
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#define CUPS_DEFAULT_USER "lp"
|
||||
#define CUPS_DEFAULT_GROUP "sys"
|
||||
#define CUPS_DEFAULT_SYSTEM_GROUPS "sys root system"
|
||||
#define CUPS_DEFAULT_PRINTADMIN_AUTH "@SYSTEM"
|
||||
|
||||
|
||||
/*
|
||||
@@ -494,7 +495,7 @@
|
||||
#undef HAVE_GSSAPI_GSSAPI_KRB5_H
|
||||
#undef HAVE_GSSKRB5_REGISTER_ACCEPTOR_IDENTITY
|
||||
#undef HAVE_GSS_C_NT_HOSTBASED_SERVICE
|
||||
#undef HAVE_KRB5_CC_RESOLVE
|
||||
#undef HAVE_KRB5_CC_NEW_UNIQUE
|
||||
#undef HAVE_KRB5_H
|
||||
#undef HAVE_HEIMDAL
|
||||
|
||||
@@ -522,6 +523,13 @@
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <sys/param.h>?
|
||||
*/
|
||||
|
||||
#undef HAVE_SYS_PARAM_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <sys/ucred.h>?
|
||||
*/
|
||||
@@ -529,6 +537,13 @@
|
||||
#undef HAVE_SYS_UCRED_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have removefile()?
|
||||
*/
|
||||
|
||||
#undef HAVE_REMOVEFILE
|
||||
|
||||
|
||||
#endif /* !_CUPS_CONFIG_H_ */
|
||||
|
||||
/*
|
||||
|
||||
@@ -53,10 +53,6 @@ if test "x$LANGUAGES" != x; then
|
||||
LANGFILES="$LANGFILES doc/$lang/index.html"
|
||||
fi
|
||||
|
||||
if test -f templates/$lang/edit-config.tmpl.in; then
|
||||
LANGFILES="$LANGFILES templates/$lang/edit-config.tmpl"
|
||||
fi
|
||||
|
||||
if test -f templates/$lang/header.tmpl.in; then
|
||||
LANGFILES="$LANGFILES templates/$lang/header.tmpl"
|
||||
fi
|
||||
@@ -69,10 +65,11 @@ AC_SUBST(UNINSTALL_LANGUAGES)
|
||||
AC_OUTPUT(Makedefs packaging/cups.list init/cups.sh init/cups-lpd cups-config
|
||||
conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf
|
||||
doc/index.html doc/help/ref-cupsd-conf.html doc/help/standard.html
|
||||
init/org.cups.cups-lpd.plist
|
||||
man/client.conf.man man/cups-deviced.man man/cups-driverd.man
|
||||
man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
|
||||
man/cupsd.conf.man man/lpoptions.man
|
||||
templates/edit-config.tmpl templates/header.tmpl
|
||||
templates/header.tmpl
|
||||
$LANGFILES)
|
||||
|
||||
chmod +x cups-config
|
||||
|
||||
@@ -583,6 +583,10 @@ cupsAdminExportSamba(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we have the Win9x PS driver...
|
||||
*/
|
||||
|
||||
snprintf(file, sizeof(file), "%s/drivers/ADOBEPS4.DRV", cg->cups_datadir);
|
||||
if (!access(file, 0))
|
||||
{
|
||||
@@ -653,6 +657,136 @@ cupsAdminExportSamba(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we have the 64-bit Windows PS driver...
|
||||
*
|
||||
* Files:
|
||||
*
|
||||
* x64/ps5ui.dll
|
||||
* x64/pscript.hlp
|
||||
* x64/pscript.ntf
|
||||
* x64/pscript5.dll
|
||||
*/
|
||||
|
||||
snprintf(file, sizeof(file), "%s/drivers/x64/pscript5.dll", cg->cups_datadir);
|
||||
if (!access(file, 0))
|
||||
{
|
||||
have_drivers |= 4;
|
||||
|
||||
/*
|
||||
* 64-bit Windows driver is installed; do the smbclient commands needed
|
||||
* to copy the Win64 drivers over...
|
||||
*/
|
||||
|
||||
snprintf(address, sizeof(address), "//%s/print$", samba_server);
|
||||
|
||||
snprintf(subcmd, sizeof(subcmd),
|
||||
"mkdir x64;"
|
||||
"put %s x64/%s.ppd;"
|
||||
"put %s/drivers/x64/ps5ui.dll x64/ps5ui.dll;"
|
||||
"put %s/drivers/x64/pscript.hlp x64/pscript.hlp;"
|
||||
"put %s/drivers/x64/pscript.ntf x64/pscript.ntf;"
|
||||
"put %s/drivers/x64/pscript5.dll x64/pscript5.dll",
|
||||
ppd, dest, cg->cups_datadir, cg->cups_datadir,
|
||||
cg->cups_datadir, cg->cups_datadir);
|
||||
|
||||
if ((status = do_samba_command("smbclient", address, subcmd,
|
||||
authfile, logfile)) != 0)
|
||||
{
|
||||
snprintf(message, sizeof(message),
|
||||
_cupsLangString(language,
|
||||
_("Unable to copy 64-bit Windows printer "
|
||||
"driver files (%d)!")), status);
|
||||
|
||||
_cupsSetError(IPP_INTERNAL_ERROR, message);
|
||||
|
||||
if (logfile)
|
||||
_cupsLangPrintf(logfile, "%s\n", message);
|
||||
|
||||
unlink(authfile);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we also have the CUPS driver files; if so, use them!
|
||||
*/
|
||||
|
||||
snprintf(file, sizeof(file), "%s/drivers/x64/cupsps6.dll", cg->cups_datadir);
|
||||
if (!access(file, 0))
|
||||
{
|
||||
/*
|
||||
* Copy the CUPS driver files over...
|
||||
*/
|
||||
|
||||
snprintf(subcmd, sizeof(subcmd),
|
||||
"put %s/drivers/x64/cups6.ini x64/cups6.ini;"
|
||||
"put %s/drivers/x64/cupsps6.dll x64/cupsps6.dll;"
|
||||
"put %s/drivers/x64/cupsui6.dll x64/cupsui6.dll",
|
||||
cg->cups_datadir, cg->cups_datadir, cg->cups_datadir);
|
||||
|
||||
if ((status = do_samba_command("smbclient", address, subcmd,
|
||||
authfile, logfile)) != 0)
|
||||
{
|
||||
snprintf(message, sizeof(message),
|
||||
_cupsLangString(language,
|
||||
_("Unable to copy 64-bit CUPS printer driver "
|
||||
"files (%d)!")), status);
|
||||
|
||||
_cupsSetError(IPP_INTERNAL_ERROR, message);
|
||||
|
||||
if (logfile)
|
||||
_cupsLangPrintf(logfile, "%s\n", message);
|
||||
|
||||
unlink(authfile);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the rpcclient command needed for the CUPS drivers...
|
||||
*/
|
||||
|
||||
snprintf(subcmd, sizeof(subcmd),
|
||||
"adddriver \"Windows x64\" \"%s:"
|
||||
"pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:"
|
||||
"pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf,"
|
||||
"cups6.ini,cupsps6.dll,cupsui6.dll\"",
|
||||
dest, dest, dest);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Don't have the CUPS drivers, so just use the standard Windows
|
||||
* drivers...
|
||||
*/
|
||||
|
||||
snprintf(subcmd, sizeof(subcmd),
|
||||
"adddriver \"Windows x64\" \"%s:"
|
||||
"pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:"
|
||||
"pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf\"",
|
||||
dest, dest, dest);
|
||||
}
|
||||
|
||||
if ((status = do_samba_command("rpcclient", samba_server, subcmd,
|
||||
authfile, logfile)) != 0)
|
||||
{
|
||||
snprintf(message, sizeof(message),
|
||||
_cupsLangString(language,
|
||||
_("Unable to install Windows 2000 printer "
|
||||
"driver files (%d)!")), status);
|
||||
|
||||
_cupsSetError(IPP_INTERNAL_ERROR, message);
|
||||
|
||||
if (logfile)
|
||||
_cupsLangPrintf(logfile, "%s\n", message);
|
||||
|
||||
unlink(authfile);
|
||||
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
if (logfile && !(have_drivers & 1))
|
||||
{
|
||||
if (!have_drivers)
|
||||
@@ -821,7 +955,7 @@ _cupsAdminGetServerSettings(
|
||||
|
||||
while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum))
|
||||
{
|
||||
if (!value)
|
||||
if (!value && strncmp(line, "</", 2))
|
||||
continue;
|
||||
|
||||
if (!strcasecmp(line, "Port") || !strcasecmp(line, "Listen"))
|
||||
@@ -1403,8 +1537,8 @@ _cupsAdminSetServerSettings(
|
||||
"cancel a job...\n"
|
||||
" <Limit Cancel-Job>\n"
|
||||
" Order deny,allow\n"
|
||||
" Allow @SYSTEM\n"
|
||||
" Allow @OWNER\n"
|
||||
" Require user @OWNER "
|
||||
CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
|
||||
" </Limit>\n");
|
||||
}
|
||||
|
||||
@@ -1556,7 +1690,8 @@ _cupsAdminSetServerSettings(
|
||||
"a job...\n"
|
||||
" <Limit Cancel-Job>\n"
|
||||
" Order deny,allow\n"
|
||||
" Require user @OWNER @SYSTEM\n"
|
||||
" Require user @OWNER "
|
||||
CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
|
||||
" </Limit>\n");
|
||||
|
||||
in_cancel_job = 0;
|
||||
@@ -1754,7 +1889,7 @@ _cupsAdminSetServerSettings(
|
||||
{
|
||||
cupsFilePuts(temp, "<Policy default>\n"
|
||||
" # Job-related operations must be done by the owner "
|
||||
"or an adminstrator...\n"
|
||||
"or an administrator...\n"
|
||||
" <Limit Send-Document Send-URI Hold-Job Release-Job "
|
||||
"Restart-Job Purge-Jobs Set-Job-Attributes "
|
||||
"Create-Job-Subscription Renew-Subscription "
|
||||
@@ -1765,7 +1900,7 @@ _cupsAdminSetServerSettings(
|
||||
" Order deny,allow\n"
|
||||
" </Limit>\n"
|
||||
" # All administration operations require an "
|
||||
"adminstrator to authenticate...\n"
|
||||
"administrator to authenticate...\n"
|
||||
" <Limit Pause-Printer Resume-Printer "
|
||||
"Set-Printer-Attributes Enable-Printer "
|
||||
"Disable-Printer Pause-Printer-After-Current-Job "
|
||||
@@ -1785,8 +1920,9 @@ _cupsAdminSetServerSettings(
|
||||
cupsFilePuts(temp, " # Only the owner or an administrator can cancel "
|
||||
"a job...\n"
|
||||
" <Limit Cancel-Job>\n"
|
||||
" Require user @OWNER @SYSTEM\n"
|
||||
" Order deny,allow\n"
|
||||
" Require user @OWNER "
|
||||
CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
|
||||
" </Limit>\n");
|
||||
|
||||
cupsFilePuts(temp, " <Limit All>\n"
|
||||
|
||||
@@ -65,6 +65,8 @@ extern const char *cssmErrorString(int error);
|
||||
# ifdef DEBUG
|
||||
static void DEBUG_gss_printf(OM_uint32 major_status, OM_uint32 minor_status,
|
||||
const char *message);
|
||||
# else
|
||||
# define DEBUG_gss_printf(major, minor, message)
|
||||
# endif /* DEBUG */
|
||||
static gss_name_t cups_get_gss_creds(http_t *http, const char *service_name);
|
||||
#endif /* HAVE_GSSAPI */
|
||||
@@ -106,12 +108,7 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
* Clear the current authentication string...
|
||||
*/
|
||||
|
||||
http->_authstring[0] = '\0';
|
||||
|
||||
if (http->authstring && http->authstring != http->_authstring)
|
||||
free(http->authstring);
|
||||
|
||||
http->authstring = http->_authstring;
|
||||
httpSetAuthString(http, NULL, NULL);
|
||||
|
||||
/*
|
||||
* See if we can do local authentication...
|
||||
@@ -176,13 +173,6 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
if (!strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
|
||||
{
|
||||
if (http->status == HTTP_UNAUTHORIZED && http->digest_tries >= 3)
|
||||
{
|
||||
DEBUG_printf(("cupsDoAuthentication: too many Negotiate tries (%d)\n",
|
||||
http->digest_tries));
|
||||
|
||||
return (-1);
|
||||
}
|
||||
#ifdef HAVE_GSSAPI
|
||||
/*
|
||||
* Kerberos authentication...
|
||||
@@ -196,8 +186,10 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
/* Input token */
|
||||
char *gss_service_name;
|
||||
/* GSS service name */
|
||||
# ifdef USE_SPNEGO
|
||||
const char *authorization;
|
||||
/* Pointer into Authorization string */
|
||||
# endif /* USE_SPNEGO */
|
||||
|
||||
|
||||
# ifdef __APPLE__
|
||||
@@ -214,6 +206,14 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
}
|
||||
# endif /* __APPLE__ */
|
||||
|
||||
if (http->status == HTTP_UNAUTHORIZED && http->digest_tries >= 3)
|
||||
{
|
||||
DEBUG_printf(("cupsDoAuthentication: too many Negotiate tries (%d)\n",
|
||||
http->digest_tries));
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (http->gssname == GSS_C_NO_NAME)
|
||||
{
|
||||
if ((gss_service_name = getenv("CUPS_GSSSERVICENAME")) == NULL)
|
||||
@@ -224,6 +224,7 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
http->gssname = cups_get_gss_creds(http, gss_service_name);
|
||||
}
|
||||
|
||||
# ifdef USE_SPNEGO /* We don't implement SPNEGO just yet... */
|
||||
/*
|
||||
* Find the start of the Kerberos input token...
|
||||
*/
|
||||
@@ -237,10 +238,36 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
if (*authorization)
|
||||
{
|
||||
/*
|
||||
* For SPNEGO, this is where we'll feed the server's authorization data
|
||||
* back into gss via input_token...
|
||||
* Decode the authorization string to get the input token...
|
||||
*/
|
||||
|
||||
int len = strlen(authorization);
|
||||
|
||||
input_token.value = malloc(len);
|
||||
input_token.value = httpDecode64_2(input_token.value, &len,
|
||||
authorization);
|
||||
input_token.length = len;
|
||||
|
||||
# ifdef DEBUG
|
||||
{
|
||||
char *ptr = (char *)input_token.value;
|
||||
int left = len;
|
||||
|
||||
fputs("input_token=", stdout);
|
||||
while (left > 0)
|
||||
{
|
||||
if (*ptr < ' ')
|
||||
printf("\\%03o", *ptr & 255);
|
||||
else
|
||||
putchar(*ptr);
|
||||
ptr ++;
|
||||
left --;
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
}
|
||||
# endif /* USE_SPNEGO */
|
||||
|
||||
if (http->gssctx != GSS_C_NO_CONTEXT)
|
||||
{
|
||||
@@ -252,7 +279,8 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
major_status = gss_init_sec_context(&minor_status, GSS_C_NO_CREDENTIAL,
|
||||
&http->gssctx,
|
||||
http->gssname, http->gssmech,
|
||||
GSS_C_DELEG_FLAG | GSS_C_MUTUAL_FLAG,
|
||||
GSS_C_DELEG_FLAG | GSS_C_MUTUAL_FLAG |
|
||||
GSS_C_INTEG_FLAG,
|
||||
GSS_C_INDEFINITE,
|
||||
GSS_C_NO_CHANNEL_BINDINGS,
|
||||
&input_token, &http->gssmech,
|
||||
@@ -265,32 +293,22 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
{
|
||||
# ifdef DEBUG
|
||||
DEBUG_gss_printf(major_status, minor_status,
|
||||
"Unable to initialise security context");
|
||||
"Unable to initialize security context");
|
||||
# endif /* DEBUG */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
# ifdef DEBUG
|
||||
if (major_status == GSS_S_CONTINUE_NEEDED)
|
||||
DEBUG_gss_printf(major_status, minor_status, "Continuation needed!");
|
||||
# endif /* DEBUG */
|
||||
|
||||
if (output_token.length)
|
||||
{
|
||||
httpEncode64_2(encode, sizeof(encode), output_token.value,
|
||||
output_token.length);
|
||||
|
||||
http->authstring = malloc(strlen(encode) + 11);
|
||||
sprintf(http->authstring, "Negotiate %s", encode); /* Safe because allocated */
|
||||
httpSetAuthString(http, "Negotiate", encode);
|
||||
|
||||
major_status = gss_release_buffer(&minor_status, &output_token);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy back what we can to _authstring for backwards compatibility...
|
||||
*/
|
||||
|
||||
strlcpy(http->_authstring, http->authstring, sizeof(http->_authstring));
|
||||
#endif /* HAVE_GSSAPI */
|
||||
}
|
||||
else if (strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Digest", 6))
|
||||
@@ -301,7 +319,7 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
httpEncode64_2(encode, sizeof(encode), http->userpass,
|
||||
(int)strlen(http->userpass));
|
||||
snprintf(http->_authstring, sizeof(http->_authstring), "Basic %s", encode);
|
||||
httpSetAuthString(http, "Basic", encode);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -309,15 +327,18 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
|
||||
* Digest authentication...
|
||||
*/
|
||||
|
||||
char digest[1024]; /* Digest auth data */
|
||||
|
||||
|
||||
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
|
||||
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce);
|
||||
|
||||
httpMD5(cupsUser(), realm, strchr(http->userpass, ':') + 1, encode);
|
||||
httpMD5Final(nonce, method, resource, encode);
|
||||
snprintf(http->_authstring, sizeof(http->_authstring),
|
||||
"Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", "
|
||||
"uri=\"%s\", response=\"%s\"", cupsUser(), realm, nonce,
|
||||
resource, encode);
|
||||
snprintf(digest, sizeof(digest),
|
||||
"username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", "
|
||||
"response=\"%s\"", cupsUser(), realm, nonce, resource, encode);
|
||||
httpSetAuthString(http, "Digest", digest);
|
||||
}
|
||||
|
||||
DEBUG_printf(("cupsDoAuthentication: authstring=\"%s\"\n", http->authstring));
|
||||
@@ -404,6 +425,8 @@ cups_get_gss_creds(
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s@%s", service_name, fqdn);
|
||||
|
||||
DEBUG_printf(("cups_get_gss_creds: Looking up %s...\n", buf));
|
||||
|
||||
token.value = buf;
|
||||
token.length = strlen(buf);
|
||||
server_name = GSS_C_NO_NAME;
|
||||
@@ -523,11 +546,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
httpEncode64_2(buffer, sizeof(buffer), (void *)&auth_extrn,
|
||||
sizeof(auth_extrn));
|
||||
|
||||
http->authstring = malloc(strlen(buffer) + 9);
|
||||
sprintf(http->authstring, "AuthRef %s", buffer);
|
||||
|
||||
/* Copy back to _authstring for backwards compatibility */
|
||||
strlcpy(http->_authstring, http->authstring, sizeof(http->_authstring));
|
||||
httpSetAuthString(http, "AuthRef", buffer);
|
||||
|
||||
DEBUG_printf(("cups_local_auth: Returning authstring = \"%s\"\n",
|
||||
http->authstring));
|
||||
@@ -563,7 +582,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
* check if we need Kerberos authentication...
|
||||
*/
|
||||
|
||||
if (!strcmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate"))
|
||||
if (!strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
|
||||
{
|
||||
/*
|
||||
* Yes, don't try the root certificate...
|
||||
@@ -590,11 +609,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
* Set the authorization string and return...
|
||||
*/
|
||||
|
||||
http->authstring = malloc(strlen(certificate) + 7);
|
||||
sprintf(http->authstring, "Local %s", certificate);
|
||||
|
||||
/* Copy back to _authstring for backwards compatibility */
|
||||
strlcpy(http->_authstring, http->authstring, sizeof(http->_authstring));
|
||||
httpSetAuthString(http, "Local", certificate);
|
||||
|
||||
DEBUG_printf(("cups_local_auth: Returning authstring = \"%s\"\n",
|
||||
http->authstring));
|
||||
@@ -623,11 +638,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
|
||||
|
||||
if ((pwd = getpwnam(username)) != NULL && pwd->pw_uid == getuid())
|
||||
{
|
||||
http->authstring = malloc(strlen(username) + 10);
|
||||
sprintf(http->authstring, "PeerCred %s", username);
|
||||
|
||||
/* Copy back to _authstring for backwards compatibility */
|
||||
strlcpy(http->_authstring, http->authstring, sizeof(http->_authstring));
|
||||
httpSetAuthString(http, "PeerCred", username);
|
||||
|
||||
DEBUG_printf(("cups_local_auth: Returning authstring = \"%s\"\n",
|
||||
http->authstring));
|
||||
|
||||
@@ -59,10 +59,10 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define CUPS_VERSION 1.0300
|
||||
# define CUPS_VERSION 1.0303
|
||||
# define CUPS_VERSION_MAJOR 1
|
||||
# define CUPS_VERSION_MINOR 3
|
||||
# define CUPS_VERSION_PATCH 0
|
||||
# define CUPS_VERSION_PATCH 3
|
||||
# define CUPS_DATE_ANY -1
|
||||
|
||||
|
||||
|
||||
@@ -1207,7 +1207,7 @@ cupsFileRead(cups_file_t *fp, /* I - CUPS file */
|
||||
if (fp->ptr >= fp->end)
|
||||
if (cups_fill(fp) <= 0)
|
||||
{
|
||||
DEBUG_printf((" cups_fill() returned -1, total=%d\n", total));
|
||||
DEBUG_printf((" cups_fill() returned -1, total=%d\n", (int)total));
|
||||
|
||||
if (total > 0)
|
||||
return ((ssize_t)total);
|
||||
@@ -1235,7 +1235,7 @@ cupsFileRead(cups_file_t *fp, /* I - CUPS file */
|
||||
* Return the total number of bytes read...
|
||||
*/
|
||||
|
||||
DEBUG_printf((" total=%d\n", total));
|
||||
DEBUG_printf((" total=%d\n", (int)total));
|
||||
|
||||
return ((ssize_t)total);
|
||||
}
|
||||
@@ -1703,6 +1703,7 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
|
||||
{
|
||||
ssize_t bytes; /* Number of bytes read */
|
||||
#ifdef HAVE_LIBZ
|
||||
int status; /* Decompression status */
|
||||
const unsigned char *ptr, /* Pointer into buffer */
|
||||
*end; /* End of buffer */
|
||||
#endif /* HAVE_LIBZ */
|
||||
@@ -1921,7 +1922,13 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
|
||||
fp->stream.next_out = (Bytef *)fp->buf;
|
||||
fp->stream.avail_out = sizeof(fp->buf);
|
||||
|
||||
if (inflate(&(fp->stream), Z_NO_FLUSH) == Z_STREAM_END)
|
||||
status = inflate(&(fp->stream), Z_NO_FLUSH);
|
||||
|
||||
if (fp->stream.next_out > (Bytef *)fp->buf)
|
||||
fp->crc = crc32(fp->crc, (Bytef *)fp->buf,
|
||||
fp->stream.next_out - (Bytef *)fp->buf);
|
||||
|
||||
if (status == Z_STREAM_END)
|
||||
{
|
||||
/*
|
||||
* Read the CRC and length...
|
||||
@@ -1950,6 +1957,9 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
|
||||
* Bad CRC, mark end-of-file...
|
||||
*/
|
||||
|
||||
DEBUG_printf(("cups_fill: tcrc=%08x, fp->crc=%08x\n",
|
||||
(unsigned int)tcrc, (unsigned int)fp->crc));
|
||||
|
||||
fp->eof = 1;
|
||||
|
||||
return (-1);
|
||||
|
||||
@@ -26,10 +26,9 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "http-private.h"
|
||||
#include "globals.h"
|
||||
#include "cups.h"
|
||||
#include "language.h"
|
||||
#include "string.h"
|
||||
#include "debug.h"
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
@@ -167,7 +166,10 @@ cupsGetFd(http_t *http, /* I - HTTP connection to server */
|
||||
write(fd, buffer, bytes);
|
||||
}
|
||||
else
|
||||
{
|
||||
_cupsSetHTTPError(status);
|
||||
httpFlush(http);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the request status...
|
||||
@@ -416,7 +418,10 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */
|
||||
*/
|
||||
|
||||
if (status != HTTP_CREATED)
|
||||
{
|
||||
_cupsSetHTTPError(status);
|
||||
httpFlush(http);
|
||||
}
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
@@ -127,6 +127,7 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
|
||||
extern const char *_cupsGetPassword(const char *prompt);
|
||||
extern _cups_globals_t *_cupsGlobals(void);
|
||||
extern void _cupsSetError(ipp_status_t status, const char *message);
|
||||
extern void _cupsSetHTTPError(http_status_t status);
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -197,18 +197,17 @@ httpAddrLookup(
|
||||
#endif /* AF_LOCAL */
|
||||
#ifdef HAVE_GETNAMEINFO
|
||||
{
|
||||
/*
|
||||
* STR #2486: httpAddrLookup() fails when getnameinfo() returns EAI_AGAIN
|
||||
*
|
||||
* FWIW, I think this is really a bug in the implementation of
|
||||
* getnameinfo(), but falling back on httpAddrString() is easy to
|
||||
* do...
|
||||
*/
|
||||
|
||||
if (getnameinfo(&addr->addr, httpAddrLength(addr), name, namelen,
|
||||
NULL, 0, 0))
|
||||
{
|
||||
/*
|
||||
* If we get an error back, then the address type is not supported
|
||||
* and we should zero out the buffer...
|
||||
*/
|
||||
|
||||
name[0] = '\0';
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
NULL, 0, 0))
|
||||
return (httpAddrString(addr, name, namelen));
|
||||
}
|
||||
#else
|
||||
{
|
||||
|
||||
@@ -62,6 +62,9 @@
|
||||
# ifndef HAVE_GSS_C_NT_HOSTBASED_SERVICE
|
||||
# define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name
|
||||
# endif /* !HAVE_GSS_C_NT_HOSTBASED_SERVICE */
|
||||
# ifdef HAVE_KRB5_H
|
||||
# include <krb5.h>
|
||||
# endif /* HAVE_KRB5_H */
|
||||
# endif /* HAVE_GSSAPI */
|
||||
|
||||
# ifdef HAVE_AUTHORIZATION_H
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
* httpFlush() - Flush data from a HTTP connection.
|
||||
* httpFlushWrite() - Flush data in write buffer.
|
||||
* httpGet() - Send a GET request to the server.
|
||||
* httpGetAuthString() - Get the current authorization string.
|
||||
* httpGetBlocking() - Get the blocking/non-block state of a connection.
|
||||
* httpGetCookie() - Get any cookie data from the response.
|
||||
* httpGetFd() - Get the file descriptor associated with a
|
||||
@@ -58,6 +59,7 @@
|
||||
* _httpReadCDSA() - Read function for the CDSA library.
|
||||
* _httpReadGNUTLS() - Read function for the GNU TLS library.
|
||||
* httpReconnect() - Reconnect to a HTTP server...
|
||||
* httpSetAuthString() - Set the current authorization string.
|
||||
* httpSetCookie() - Set the cookie value(s)...
|
||||
* httpSetExpect() - Set the Expect: header in a request.
|
||||
* httpSetField() - Set the value of an HTTP header.
|
||||
@@ -605,6 +607,27 @@ httpGet(http_t *http, /* I - HTTP connection */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpGetAuthString()' - Get the current authorization string.
|
||||
*
|
||||
* The authorization string is set by cupsDoAuthentication() and
|
||||
* httpSetAuthString(). Use httpGetAuthString() to retrieve the
|
||||
* string to use with httpSetField() for the HTTP_FIELD_AUTHORIZATION
|
||||
* value.
|
||||
*
|
||||
* @since CUPS 1.3@
|
||||
*/
|
||||
|
||||
char * /* O - Authorization string */
|
||||
httpGetAuthString(http_t *http) /* I - HTTP connection */
|
||||
{
|
||||
if (http)
|
||||
return (http->authstring);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpGetBlocking()' - Get the blocking/non-block state of a connection.
|
||||
*
|
||||
@@ -1677,6 +1700,61 @@ httpReconnect(http_t *http) /* I - HTTP connection */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpSetAuthString()' - Set the current authorization string.
|
||||
*
|
||||
* This function just stores a copy of the current authorization string in
|
||||
* the HTTP connection object. You must still call httpSetField() to set
|
||||
* HTTP_FIELD_AUTHORIZATION prior to issuing a HTTP request using httpGet(),
|
||||
* httpHead(), httpOptions(), httpPost, or httpPut().
|
||||
*
|
||||
* @since CUPS 1.3@
|
||||
*/
|
||||
|
||||
void
|
||||
httpSetAuthString(http_t *http, /* I - HTTP connection */
|
||||
const char *scheme, /* I - Auth scheme (NULL to clear it) */
|
||||
const char *data) /* I - Auth data (NULL for none) */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!http)
|
||||
return;
|
||||
|
||||
if (http->authstring && http->authstring != http->_authstring)
|
||||
free(http->authstring);
|
||||
|
||||
http->authstring = http->_authstring;
|
||||
|
||||
if (scheme)
|
||||
{
|
||||
/*
|
||||
* Set the current authorization string...
|
||||
*/
|
||||
|
||||
int len = (int)strlen(scheme) + (data ? (int)strlen(data) + 1 : 0) + 1;
|
||||
|
||||
if (len > (int)sizeof(http->_authstring))
|
||||
http->authstring = malloc(len);
|
||||
|
||||
if (data)
|
||||
snprintf(http->authstring, len, "%s %s", scheme, data);
|
||||
else
|
||||
strlcpy(http->authstring, scheme, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Clear the current authorization string...
|
||||
*/
|
||||
|
||||
http->_authstring[0] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'httpSetCookie()' - Set the cookie value(s)...
|
||||
*
|
||||
|
||||
@@ -442,6 +442,10 @@ extern void httpSetLength(http_t *http, size_t length);
|
||||
extern ssize_t httpWrite2(http_t *http, const char *buffer,
|
||||
size_t length);
|
||||
|
||||
/**** New in CUPS 1.3 ****/
|
||||
extern char *httpGetAuthString(http_t *http);
|
||||
extern void httpSetAuthString(http_t *http, const char *scheme,
|
||||
const char *data);
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
|
||||
@@ -985,11 +985,12 @@ typedef struct
|
||||
static const _apple_name_locale_t apple_name_locale[] =
|
||||
{
|
||||
{ "en" , "en_US" },
|
||||
{ "no" , "nb" },
|
||||
{ "nb" , "no" },
|
||||
{ "zh-Hans" , "zh_CN" },
|
||||
{ "zh-Hant" , "zh_TW" }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* 'appleLangDefault()' - Get the default locale string.
|
||||
*/
|
||||
@@ -998,6 +999,8 @@ static const char * /* O - Locale string */
|
||||
appleLangDefault(void)
|
||||
{
|
||||
int i; /* Looping var */
|
||||
CFBundleRef bundle; /* Main bundle (if any) */
|
||||
CFArrayRef bundleList; /* List of localizations in bundle */
|
||||
CFPropertyListRef localizationList;
|
||||
/* List of localization data */
|
||||
CFStringRef languageName; /* Current name */
|
||||
@@ -1014,63 +1017,77 @@ appleLangDefault(void)
|
||||
if (!cg->language[0])
|
||||
{
|
||||
if ((lang = getenv("LANG")))
|
||||
{
|
||||
strlcpy(cg->language, lang, sizeof(cg->language));
|
||||
else
|
||||
return (cg->language);
|
||||
}
|
||||
else if ((bundle = CFBundleGetMainBundle()) != NULL &&
|
||||
(bundleList = CFBundleCopyBundleLocalizations(bundle)) != NULL)
|
||||
{
|
||||
localizationList =
|
||||
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
|
||||
kCFPreferencesCurrentApplication);
|
||||
CFBundleCopyPreferredLocalizationsFromArray(bundleList);
|
||||
|
||||
if (localizationList != NULL)
|
||||
CFRelease(bundleList);
|
||||
}
|
||||
else
|
||||
localizationList =
|
||||
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
|
||||
kCFPreferencesCurrentApplication);
|
||||
|
||||
if (localizationList)
|
||||
{
|
||||
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
|
||||
CFArrayGetCount(localizationList) > 0)
|
||||
{
|
||||
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
|
||||
CFArrayGetCount(localizationList) > 0)
|
||||
languageName = CFArrayGetValueAtIndex(localizationList, 0);
|
||||
|
||||
if (languageName &&
|
||||
CFGetTypeID(languageName) == CFStringGetTypeID())
|
||||
{
|
||||
languageName = CFArrayGetValueAtIndex(localizationList, 0);
|
||||
localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(
|
||||
kCFAllocatorDefault, languageName);
|
||||
|
||||
if (languageName != NULL &&
|
||||
CFGetTypeID(languageName) == CFStringGetTypeID())
|
||||
{
|
||||
localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(
|
||||
kCFAllocatorDefault, languageName);
|
||||
if (localeName)
|
||||
{
|
||||
CFStringGetCString(localeName, cg->language, sizeof(cg->language),
|
||||
kCFStringEncodingASCII);
|
||||
CFRelease(localeName);
|
||||
|
||||
if (localeName != NULL)
|
||||
DEBUG_printf(("appleLangDefault: cg->language=\"%s\"\n",
|
||||
cg->language));
|
||||
|
||||
/*
|
||||
* Map new language identifiers to locales...
|
||||
*/
|
||||
|
||||
for (i = 0;
|
||||
i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
|
||||
i++)
|
||||
{
|
||||
CFStringGetCString(localeName, cg->language, sizeof(cg->language),
|
||||
kCFStringEncodingASCII);
|
||||
CFRelease(localeName);
|
||||
|
||||
/*
|
||||
* Map new language identifiers to locales...
|
||||
*/
|
||||
|
||||
for (i = 0;
|
||||
i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
|
||||
i++)
|
||||
if (!strcmp(cg->language, apple_name_locale[i].name))
|
||||
{
|
||||
if (!strcmp(cg->language, apple_name_locale[i].name))
|
||||
{
|
||||
strlcpy(cg->language, apple_name_locale[i].locale,
|
||||
sizeof(cg->language));
|
||||
break;
|
||||
}
|
||||
DEBUG_printf(("appleLangDefault: mapping \"%s\" to \"%s\"...\n",
|
||||
cg->language, apple_name_locale[i].locale));
|
||||
strlcpy(cg->language, apple_name_locale[i].locale,
|
||||
sizeof(cg->language));
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert language subtag into region subtag...
|
||||
*/
|
||||
|
||||
if (cg->language[2] == '-')
|
||||
cg->language[2] = '_';
|
||||
|
||||
if (strchr(cg->language, '.') == NULL)
|
||||
strlcat(cg->language, ".UTF-8", sizeof(cg->language));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(localizationList);
|
||||
/*
|
||||
* Convert language subtag into region subtag...
|
||||
*/
|
||||
|
||||
if (cg->language[2] == '-')
|
||||
cg->language[2] = '_';
|
||||
|
||||
if (!strchr(cg->language, '.'))
|
||||
strlcat(cg->language, ".UTF-8", sizeof(cg->language));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(localizationList);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -183,6 +183,7 @@ _httpError
|
||||
_httpFlush
|
||||
_httpFlushWrite
|
||||
_httpGet
|
||||
_httpGetAuthString
|
||||
_httpGetBlocking
|
||||
_httpGetCookie
|
||||
_httpGetDateString
|
||||
@@ -213,6 +214,7 @@ _httpReconnect
|
||||
_httpSeparate
|
||||
_httpSeparate2
|
||||
_httpSeparateURI
|
||||
_httpSetAuthString
|
||||
_httpSetCookie
|
||||
_httpSetExpect
|
||||
_httpSetField
|
||||
@@ -282,6 +284,7 @@ _ppdFirstOption
|
||||
_ppdIsMarked
|
||||
_ppdLastError
|
||||
_ppdLocalize
|
||||
_ppdLocalizeIPPReason
|
||||
_ppdMarkDefaults
|
||||
_ppdMarkOption
|
||||
_ppdNextCustomParam
|
||||
|
||||
@@ -44,7 +44,8 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static void ppd_ll_CC(char *ll_CC, char *ll);
|
||||
static void ppd_ll_CC(char *ll_CC, int ll_CC_size,
|
||||
char *ll, int ll_size);
|
||||
static ppd_attr_t *ppd_localized_attr(ppd_file_t *ppd,
|
||||
const char *keyword,
|
||||
const char *spec, const char *ll_CC,
|
||||
@@ -54,6 +55,10 @@ static ppd_attr_t *ppd_localized_attr(ppd_file_t *ppd,
|
||||
/*
|
||||
* 'ppdLocalize()' - Localize the PPD file to the current locale.
|
||||
*
|
||||
* All groups, options, and choices are localized, as are ICC profile
|
||||
* descriptions, printer presets, and custom option parameters. Each
|
||||
* localized string uses the UTF-8 character encoding.
|
||||
*
|
||||
* @since CUPS 1.2@
|
||||
*/
|
||||
|
||||
@@ -86,7 +91,7 @@ ppdLocalize(ppd_file_t *ppd) /* I - PPD file */
|
||||
* Get the default language...
|
||||
*/
|
||||
|
||||
ppd_ll_CC(ll_CC, ll);
|
||||
ppd_ll_CC(ll_CC, sizeof(ll_CC), ll, sizeof(ll));
|
||||
|
||||
/*
|
||||
* Now lookup all of the groups, options, choices, etc.
|
||||
@@ -195,7 +200,7 @@ ppdLocalize(ppd_file_t *ppd) /* I - PPD file */
|
||||
*
|
||||
* This function uses the current locale to find the corresponding reason
|
||||
* text or URI from the attribute value. If "scheme" is NULL or "text",
|
||||
* the returned value contains human-readable text from the translation
|
||||
* the returned value contains human-readable (UTF-8) text from the translation
|
||||
* string or attribute value. Otherwise the corresponding URI is returned.
|
||||
*
|
||||
* If no value of the requested scheme can be found, NULL is returned.
|
||||
@@ -236,7 +241,7 @@ ppdLocalizeIPPReason(
|
||||
* Get the default language...
|
||||
*/
|
||||
|
||||
ppd_ll_CC(ll_CC, ll);
|
||||
ppd_ll_CC(ll_CC, sizeof(ll_CC), ll, sizeof(ll));
|
||||
|
||||
/*
|
||||
* Find the localized attribute...
|
||||
@@ -265,6 +270,7 @@ ppdLocalizeIPPReason(
|
||||
strlcpy(buffer, locattr->text, bufsize);
|
||||
|
||||
for (valptr = locattr->value, bufptr = buffer; *valptr && bufptr < bufend;)
|
||||
{
|
||||
if (!strncmp(valptr, "text:", 5))
|
||||
{
|
||||
/*
|
||||
@@ -307,10 +313,24 @@ ppdLocalizeIPPReason(
|
||||
else
|
||||
*bufptr++ = *valptr++;
|
||||
}
|
||||
|
||||
while (isspace(*valptr & 255))
|
||||
valptr ++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Skip this URI...
|
||||
*/
|
||||
|
||||
while (*valptr && !isspace(*valptr & 255))
|
||||
valptr++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip whitespace...
|
||||
*/
|
||||
|
||||
while (isspace(*valptr & 255))
|
||||
valptr ++;
|
||||
}
|
||||
|
||||
if (bufptr > buffer)
|
||||
*bufptr = '\0';
|
||||
@@ -324,9 +344,18 @@ ppdLocalizeIPPReason(
|
||||
*/
|
||||
|
||||
schemelen = strlen(scheme);
|
||||
if (scheme[schemelen - 1] == ':') /* Force scheme to be just the name */
|
||||
schemelen --;
|
||||
|
||||
for (valptr = locattr->value, bufptr = buffer; *valptr && bufptr < bufend;)
|
||||
if (!strncmp(valptr, scheme, schemelen) && valptr[schemelen] == ':')
|
||||
{
|
||||
if ((!strncmp(valptr, scheme, schemelen) && valptr[schemelen] == ':') ||
|
||||
(*valptr == '/' && !strcmp(scheme, "file")))
|
||||
{
|
||||
/*
|
||||
* Copy URI...
|
||||
*/
|
||||
|
||||
while (*valptr && !isspace(*valptr & 255) && bufptr < bufend)
|
||||
*bufptr++ = *valptr++;
|
||||
|
||||
@@ -334,6 +363,23 @@ ppdLocalizeIPPReason(
|
||||
|
||||
return (buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Skip this URI...
|
||||
*/
|
||||
|
||||
while (*valptr && !isspace(*valptr & 255))
|
||||
valptr++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip whitespace...
|
||||
*/
|
||||
|
||||
while (isspace(*valptr & 255))
|
||||
valptr ++;
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
@@ -346,8 +392,9 @@ ppdLocalizeIPPReason(
|
||||
|
||||
static void
|
||||
ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
|
||||
char *ll) /* O - Generic locale name */
|
||||
|
||||
int ll_CC_size, /* I - Size of country-specific name */
|
||||
char *ll, /* O - Generic locale name */
|
||||
int ll_size) /* I - Size of generic name */
|
||||
{
|
||||
cups_lang_t *lang; /* Current language */
|
||||
|
||||
@@ -358,8 +405,8 @@ ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
|
||||
|
||||
if ((lang = cupsLangDefault()) == NULL)
|
||||
{
|
||||
strcpy(ll_CC, "en_US");
|
||||
strcpy(ll, "en");
|
||||
strlcpy(ll_CC, "en_US", ll_CC_size);
|
||||
strlcpy(ll, "en", ll_size);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -367,8 +414,10 @@ ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
|
||||
* Copy the locale name...
|
||||
*/
|
||||
|
||||
strlcpy(ll_CC, lang->language, sizeof(ll_CC));
|
||||
strlcpy(ll, lang->language, sizeof(ll));
|
||||
strlcpy(ll_CC, lang->language, ll_CC_size);
|
||||
strlcpy(ll, lang->language, ll_size);
|
||||
|
||||
DEBUG_printf(("ll_CC=\"%s\", ll=\"%s\"\n", ll_CC, ll));
|
||||
|
||||
if (strlen(ll_CC) == 2)
|
||||
{
|
||||
@@ -378,16 +427,16 @@ ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
|
||||
*/
|
||||
|
||||
if (!strcmp(ll_CC, "cs"))
|
||||
strcpy(ll_CC, "cs_CZ");
|
||||
strlcpy(ll_CC, "cs_CZ", ll_CC_size);
|
||||
else if (!strcmp(ll_CC, "en"))
|
||||
strcpy(ll_CC, "en_US");
|
||||
strlcpy(ll_CC, "en_US", ll_CC_size);
|
||||
else if (!strcmp(ll_CC, "ja"))
|
||||
strcpy(ll_CC, "ja_JP");
|
||||
strlcpy(ll_CC, "ja_JP", ll_CC_size);
|
||||
else if (!strcmp(ll_CC, "sv"))
|
||||
strcpy(ll_CC, "sv_SE");
|
||||
else if (!strcmp(ll_CC, "zh"))
|
||||
strcpy(ll_CC, "zh_CN"); /* Simplified Chinese */
|
||||
else
|
||||
strlcpy(ll_CC, "sv_SE", ll_CC_size);
|
||||
else if (!strcmp(ll_CC, "zh")) /* Simplified Chinese */
|
||||
strlcpy(ll_CC, "zh_CN", ll_CC_size);
|
||||
else if (ll_CC_size >= 6)
|
||||
{
|
||||
ll_CC[2] = '_';
|
||||
ll_CC[3] = toupper(ll_CC[0] & 255);
|
||||
@@ -430,17 +479,31 @@ ppd_localized_attr(ppd_file_t *ppd, /* I - PPD file */
|
||||
snprintf(lkeyword, sizeof(lkeyword), "%s.%s", ll, keyword);
|
||||
attr = ppdFindAttr(ppd, lkeyword, spec);
|
||||
|
||||
if (!attr && !strcmp(ll, "ja"))
|
||||
if (!attr)
|
||||
{
|
||||
/*
|
||||
* Due to a bug in the CUPS DDK 1.1.0 ppdmerge program, Japanese
|
||||
* PPD files were incorrectly assigned "jp" as the locale name
|
||||
* instead of "ja". Support both the old (incorrect) and new
|
||||
* locale names for Japanese...
|
||||
*/
|
||||
if (!strcmp(ll, "ja"))
|
||||
{
|
||||
/*
|
||||
* Due to a bug in the CUPS DDK 1.1.0 ppdmerge program, Japanese
|
||||
* PPD files were incorrectly assigned "jp" as the locale name
|
||||
* instead of "ja". Support both the old (incorrect) and new
|
||||
* locale names for Japanese...
|
||||
*/
|
||||
|
||||
snprintf(lkeyword, sizeof(lkeyword), "jp.%s", keyword);
|
||||
attr = ppdFindAttr(ppd, lkeyword, spec);
|
||||
snprintf(lkeyword, sizeof(lkeyword), "jp.%s", keyword);
|
||||
attr = ppdFindAttr(ppd, lkeyword, spec);
|
||||
}
|
||||
else if (!strcmp(ll, "no"))
|
||||
{
|
||||
/*
|
||||
* Norway has two languages, "Bokmal" (the primary one)
|
||||
* and "Nynorsk" (new Norwegian); we map "no" to "nb" here as
|
||||
* recommended by the locale folks...
|
||||
*/
|
||||
|
||||
snprintf(lkeyword, sizeof(lkeyword), "nb.%s", keyword);
|
||||
attr = ppdFindAttr(ppd, lkeyword, spec);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -73,6 +73,8 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
for (o1 = ppdFirstOption(ppd); o1; o1 = ppdNextOption(ppd))
|
||||
o1->conflicted = 0;
|
||||
|
||||
cupsArraySave(ppd->marked);
|
||||
|
||||
/*
|
||||
* Loop through all of the UI constraints and flag any options
|
||||
* that conflict...
|
||||
@@ -173,6 +175,8 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
}
|
||||
}
|
||||
|
||||
cupsArrayRestore(ppd->marked);
|
||||
|
||||
/*
|
||||
* Return the number of conflicts found...
|
||||
*/
|
||||
@@ -617,8 +621,7 @@ ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */
|
||||
else if (!strcasecmp(option, "InputSlot"))
|
||||
{
|
||||
/*
|
||||
* Unmark ManualFeed True and possibly mark ManualFeed False
|
||||
* option...
|
||||
* Unmark ManualFeed option...
|
||||
*/
|
||||
|
||||
if ((o = ppdFindOption(ppd, "ManualFeed")) != NULL)
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
* cupsMarkOptions() - Mark command-line options in a PPD file.
|
||||
* cupsParseOptions() - Parse options from a command-line argument.
|
||||
* cupsRemoveOptions() - Remove an option from an option array.
|
||||
* debug_marked() - Output the marked array to stdout...
|
||||
* ppd_mark_choices() - Mark one or more option choices from a string.
|
||||
*/
|
||||
|
||||
@@ -40,6 +41,11 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
static void debug_marked(ppd_file_t *ppd, const char *title);
|
||||
#else
|
||||
# define debug_marked(ppd,title)
|
||||
#endif /* DEBUG */
|
||||
static int ppd_mark_choices(ppd_file_t *ppd, const char *options);
|
||||
|
||||
|
||||
@@ -205,6 +211,8 @@ cupsMarkOptions(
|
||||
if (ppd == NULL || num_options <= 0 || options == NULL)
|
||||
return (0);
|
||||
|
||||
debug_marked(ppd, "Before...");
|
||||
|
||||
/*
|
||||
* Mark options...
|
||||
*/
|
||||
@@ -256,7 +264,7 @@ cupsMarkOptions(
|
||||
conflict = 1;
|
||||
|
||||
if (cupsGetOption("EFMediaType", num_options, options) == NULL)
|
||||
if (ppdMarkOption(ppd, "EFMediaType", s))
|
||||
if (ppdMarkOption(ppd, "EFMediaType", s)) /* EFI */
|
||||
conflict = 1;
|
||||
|
||||
if (cupsGetOption("EFMediaQualityMode", num_options, options) == NULL)
|
||||
@@ -429,12 +437,16 @@ cupsMarkOptions(
|
||||
conflict = 1;
|
||||
}
|
||||
}
|
||||
else if (!strcasecmp(optptr->name, "mirror") &&
|
||||
ppdMarkOption(ppd, "MirrorPrint", optptr->value))
|
||||
conflict = 1;
|
||||
else if (!strcasecmp(optptr->name, "mirror"))
|
||||
{
|
||||
if (ppdMarkOption(ppd, "MirrorPrint", optptr->value))
|
||||
conflict = 1;
|
||||
}
|
||||
else if (ppdMarkOption(ppd, optptr->name, optptr->value))
|
||||
conflict = 1;
|
||||
|
||||
debug_marked(ppd, "After...");
|
||||
|
||||
return (conflict);
|
||||
}
|
||||
|
||||
@@ -695,6 +707,28 @@ cupsRemoveOption(
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
/*
|
||||
* 'debug_marked()' - Output the marked array to stdout...
|
||||
*/
|
||||
|
||||
static void
|
||||
debug_marked(ppd_file_t *ppd, /* I - PPD file data */
|
||||
const char *title) /* I - Title for list */
|
||||
{
|
||||
ppd_choice_t *c; /* Current choice */
|
||||
|
||||
|
||||
printf("cupsMarkOptions: %s\n", title);
|
||||
|
||||
for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked);
|
||||
c;
|
||||
c = (ppd_choice_t *)cupsArrayNext(ppd->marked))
|
||||
printf("cupsMarkOptions: %s=%s\n", c->option->keyword, c->choice);
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
/*
|
||||
* 'ppd_mark_choices()' - Mark one or more option choices from a string.
|
||||
*/
|
||||
|
||||
@@ -573,7 +573,7 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
ppd->language_level = 1;
|
||||
ppd->language_level = 2;
|
||||
ppd->color_device = 0;
|
||||
ppd->colorspace = PPD_CS_GRAY;
|
||||
ppd->landscape = -90;
|
||||
@@ -2248,7 +2248,7 @@ static int /* O - Result of comparison */
|
||||
ppd_compare_choices(ppd_choice_t *a, /* I - First choice */
|
||||
ppd_choice_t *b) /* I - Second choice */
|
||||
{
|
||||
return (a->option - b->option);
|
||||
return (strcmp(a->option->keyword, b->option->keyword));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
* cupsDoFileRequest() - Do an IPP request with a file.
|
||||
* cupsDoRequest() - Do an IPP request.
|
||||
* _cupsSetError() - Set the last IPP status code and status-message.
|
||||
* _cupsSetHTTPError() - Set the last error using the HTTP status.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -455,44 +456,7 @@ cupsDoIORequest(http_t *http, /* I - HTTP connection to server */
|
||||
ippErrorString(response->request.status.status_code));
|
||||
}
|
||||
else if (status != HTTP_OK)
|
||||
{
|
||||
switch (status)
|
||||
{
|
||||
case HTTP_NOT_FOUND :
|
||||
_cupsSetError(IPP_NOT_FOUND, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_UNAUTHORIZED :
|
||||
_cupsSetError(IPP_NOT_AUTHORIZED, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_FORBIDDEN :
|
||||
_cupsSetError(IPP_FORBIDDEN, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_BAD_REQUEST :
|
||||
_cupsSetError(IPP_BAD_REQUEST, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_REQUEST_TOO_LARGE :
|
||||
_cupsSetError(IPP_REQUEST_VALUE, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_NOT_IMPLEMENTED :
|
||||
_cupsSetError(IPP_OPERATION_NOT_SUPPORTED, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_NOT_SUPPORTED :
|
||||
_cupsSetError(IPP_VERSION_NOT_SUPPORTED, httpStatus(status));
|
||||
break;
|
||||
|
||||
default :
|
||||
DEBUG_printf(("HTTP error %d mapped to IPP_SERVICE_UNAVAILABLE!\n",
|
||||
status));
|
||||
_cupsSetError(IPP_SERVICE_UNAVAILABLE, httpStatus(status));
|
||||
break;
|
||||
}
|
||||
}
|
||||
_cupsSetHTTPError(status);
|
||||
|
||||
return (response);
|
||||
}
|
||||
@@ -541,6 +505,52 @@ _cupsSetError(ipp_status_t status, /* I - IPP status code */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* '_cupsSetHTTPError()' - Set the last error using the HTTP status.
|
||||
*/
|
||||
|
||||
void
|
||||
_cupsSetHTTPError(http_status_t status) /* I - HTTP status code */
|
||||
{
|
||||
switch (status)
|
||||
{
|
||||
case HTTP_NOT_FOUND :
|
||||
_cupsSetError(IPP_NOT_FOUND, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_UNAUTHORIZED :
|
||||
_cupsSetError(IPP_NOT_AUTHORIZED, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_FORBIDDEN :
|
||||
_cupsSetError(IPP_FORBIDDEN, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_BAD_REQUEST :
|
||||
_cupsSetError(IPP_BAD_REQUEST, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_REQUEST_TOO_LARGE :
|
||||
_cupsSetError(IPP_REQUEST_VALUE, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_NOT_IMPLEMENTED :
|
||||
_cupsSetError(IPP_OPERATION_NOT_SUPPORTED, httpStatus(status));
|
||||
break;
|
||||
|
||||
case HTTP_NOT_SUPPORTED :
|
||||
_cupsSetError(IPP_VERSION_NOT_SUPPORTED, httpStatus(status));
|
||||
break;
|
||||
|
||||
default :
|
||||
DEBUG_printf(("HTTP error %d mapped to IPP_SERVICE_UNAVAILABLE!\n",
|
||||
status));
|
||||
_cupsSetError(IPP_SERVICE_UNAVAILABLE, httpStatus(status));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
@@ -2,36 +2,26 @@
|
||||
*%
|
||||
*% "$Id$"
|
||||
*%
|
||||
*% Test PPD file for the Common UNIX Printing System (CUPS).
|
||||
*% Test PPD file for the Common UNIX Printing System (CUPS).
|
||||
*%
|
||||
*% This file is used to test the CUPS PPD API functions and cannot be
|
||||
*% used with any known printers. Look at the PPD files in the "ppd"
|
||||
*% subdirectory as well as the CUPS web site for working PPD files.
|
||||
*% This file is used to test the CUPS PPD API functions and cannot be
|
||||
*% used with any known printers. Look at the PPD files in the "ppd"
|
||||
*% subdirectory as well as the CUPS web site for working PPD files.
|
||||
*%
|
||||
*% If you are a PPD file developer, consider using the CUPS DDK to
|
||||
*% create your PPD files - not only will it save you time, it produces
|
||||
*% consistently high-quality files.
|
||||
*%
|
||||
*% Copyright 2002-2006 by Easy Software Products.
|
||||
*%
|
||||
*% These coded instructions, statements, and computer programs are the
|
||||
*% property of Easy Software Products and are protected by Federal
|
||||
*% copyright law. Distribution and use rights are outlined in the file
|
||||
*% "LICENSE.txt" which should have been included with this file. If this
|
||||
*% file is missing or damaged please contact Easy Software Products
|
||||
*% at:
|
||||
*%
|
||||
*% Attn: CUPS Licensing Information
|
||||
*% Easy Software Products
|
||||
*% 44141 Airport View Drive, Suite 204
|
||||
*% Hollywood, Maryland 20636-3111 USA
|
||||
*%
|
||||
*% Voice: (301) 373-9603
|
||||
*% EMail: cups-info@cups.org
|
||||
*% WWW: http://www.cups.org
|
||||
*% If you are a PPD file developer, consider using the CUPS DDK to
|
||||
*% create your PPD files - not only will it save you time, it produces
|
||||
*% consistently high-quality files.
|
||||
*%
|
||||
*% Copyright 2007 by Apple Inc.
|
||||
*% Copyright 2002-2006 by Easy Software Products.
|
||||
*%
|
||||
*% These coded instructions, statements, and computer programs are the
|
||||
*% property of Apple Inc. and are protected by Federal copyright
|
||||
*% law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
*% which should have been included with this file. If this file is
|
||||
*% file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
*FormatVersion: "4.3"
|
||||
*FileVersion: "1.2"
|
||||
*FileVersion: "1.3"
|
||||
*LanguageVersion: English
|
||||
*LanguageEncoding: ISOLatin1
|
||||
*PCFileName: "TEST.PPD"
|
||||
@@ -43,7 +33,7 @@
|
||||
*cupsModelNumber: 1
|
||||
*ModelName: "Test"
|
||||
*ShortNickName: "Test"
|
||||
*NickName: "Test for CUPS v1.2"
|
||||
*NickName: "Test for CUPS v1.3"
|
||||
*PSVersion: "(3010.000) 81501"
|
||||
*LanguageLevel: "3"
|
||||
*ColorDevice: True
|
||||
@@ -148,6 +138,30 @@
|
||||
|
||||
*CloseGroup: Extended
|
||||
|
||||
*% IPP reasons (for ppdLocalizeIPPReason tests)
|
||||
*cupsIPPReason foo/Foo Reason: "http://foo/bar.html
|
||||
help:anchor='foo'%20bookID=Vendor%20Help
|
||||
/help/foo/bar.html"
|
||||
*End
|
||||
*fr.cupsIPPReason foo/La Foo Reason: "text:La%20Long
|
||||
text:Foo%20Reason
|
||||
http://foo/fr/bar.html
|
||||
help:anchor='foo'%20bookID=Vendor%20Help
|
||||
/help/fr/foo/bar.html"
|
||||
*End
|
||||
*zh_TW.cupsIPPReason foo/Number 1 Foo Reason: "text:Number%201
|
||||
text:Foo%20Reason
|
||||
http://foo/zh_TW/bar.html
|
||||
help:anchor='foo'%20bookID=Vendor%20Help
|
||||
/help/zh_TW/foo/bar.html"
|
||||
*End
|
||||
*zh.cupsIPPReason foo/Number 2 Foo Reason: "text:Number%202
|
||||
text:Foo%20Reason
|
||||
http://foo/zh/bar.html
|
||||
help:anchor='foo'%20bookID=Vendor%20Help
|
||||
/help/zh/foo/bar.html"
|
||||
*End
|
||||
|
||||
*DefaultFont: Courier
|
||||
*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
|
||||
*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Main entry.
|
||||
* main() - Main entry.
|
||||
* read_write_tests() - Perform read/write tests.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -149,6 +150,8 @@ read_write_tests(int compression) /* I - Use compression? */
|
||||
unsigned char readbuf[8192], /* Read buffer */
|
||||
writebuf[8192]; /* Write buffer */
|
||||
int byte; /* Byte from file */
|
||||
static const char *partial_line = "partial line";
|
||||
/* Partial line */
|
||||
|
||||
|
||||
/*
|
||||
@@ -253,11 +256,25 @@ read_write_tests(int compression) /* I - Use compression? */
|
||||
|
||||
fputs("cupsFileWrite(): ", stdout);
|
||||
|
||||
for (i = 0; i < 100; i ++)
|
||||
for (i = 0; i < 10000; i ++)
|
||||
if (cupsFileWrite(fp, (char *)writebuf, sizeof(writebuf)) < 0)
|
||||
break;
|
||||
|
||||
if (i >= 100)
|
||||
if (i >= 10000)
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
printf("FAIL (%s)\n", strerror(errno));
|
||||
status ++;
|
||||
}
|
||||
|
||||
/*
|
||||
* cupsFilePuts() with partial line...
|
||||
*/
|
||||
|
||||
fputs("cupsFilePuts(\"partial line\"): ", stdout);
|
||||
|
||||
if (cupsFilePuts(fp, partial_line) > 0)
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
@@ -405,13 +422,13 @@ read_write_tests(int compression) /* I - Use compression? */
|
||||
|
||||
fputs("cupsFileRead(): ", stdout);
|
||||
|
||||
for (i = 0; i < 100; i ++)
|
||||
for (i = 0; i < 10000; i ++)
|
||||
if ((byte = cupsFileRead(fp, (char *)readbuf, sizeof(readbuf))) < 0)
|
||||
break;
|
||||
else if (memcmp(readbuf, writebuf, sizeof(readbuf)))
|
||||
break;
|
||||
|
||||
if (i >= 100)
|
||||
if (i >= 10000)
|
||||
puts("PASS");
|
||||
else if (byte > 0)
|
||||
{
|
||||
@@ -430,6 +447,26 @@ read_write_tests(int compression) /* I - Use compression? */
|
||||
status ++;
|
||||
}
|
||||
|
||||
/*
|
||||
* cupsFileGetChar() with partial line...
|
||||
*/
|
||||
|
||||
fputs("cupsFileGetChar(partial line): ", stdout);
|
||||
|
||||
for (i = 0; i < strlen(partial_line); i ++)
|
||||
if ((byte = cupsFileGetChar(fp)) < 0)
|
||||
break;
|
||||
else if (byte != partial_line[i])
|
||||
break;
|
||||
|
||||
if (!partial_line[i])
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
printf("FAIL (got '%c', expected '%c')\n", byte, partial_line[i]);
|
||||
status ++;
|
||||
}
|
||||
|
||||
/*
|
||||
* cupsFileClose()
|
||||
*/
|
||||
|
||||
@@ -98,6 +98,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
int status; /* Status of tests (0 = success, 1 = fail) */
|
||||
int conflicts; /* Number of conflicts */
|
||||
char *s; /* String */
|
||||
char buffer[8192]; /* String buffer */
|
||||
|
||||
|
||||
status = 0;
|
||||
@@ -137,6 +138,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
status ++;
|
||||
printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
|
||||
(int)strlen(default_code));
|
||||
|
||||
@@ -155,6 +157,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
status ++;
|
||||
printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
|
||||
(int)strlen(custom_code));
|
||||
|
||||
@@ -165,6 +168,74 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
if (s)
|
||||
free(s);
|
||||
|
||||
/*
|
||||
* Test localization...
|
||||
*/
|
||||
|
||||
fputs("ppdLocalizeIPPReason(text): ", stdout);
|
||||
if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
|
||||
!strcmp(buffer, "Foo Reason"))
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
status ++;
|
||||
printf("FAIL (\"%s\" instead of \"Foo Reason\")\n", buffer);
|
||||
}
|
||||
|
||||
fputs("ppdLocalizeIPPReason(http): ", stdout);
|
||||
if (ppdLocalizeIPPReason(ppd, "foo", "http", buffer, sizeof(buffer)) &&
|
||||
!strcmp(buffer, "http://foo/bar.html"))
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
status ++;
|
||||
printf("FAIL (\"%s\" instead of \"http://foo/bar.html\")\n", buffer);
|
||||
}
|
||||
|
||||
fputs("ppdLocalizeIPPReason(help): ", stdout);
|
||||
if (ppdLocalizeIPPReason(ppd, "foo", "help", buffer, sizeof(buffer)) &&
|
||||
!strcmp(buffer, "help:anchor='foo'%20bookID=Vendor%20Help"))
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
status ++;
|
||||
printf("FAIL (\"%s\" instead of \"help:anchor='foo'%%20bookID=Vendor%%20Help\")\n", buffer);
|
||||
}
|
||||
|
||||
fputs("ppdLocalizeIPPReason(file): ", stdout);
|
||||
if (ppdLocalizeIPPReason(ppd, "foo", "file", buffer, sizeof(buffer)) &&
|
||||
!strcmp(buffer, "/help/foo/bar.html"))
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
status ++;
|
||||
printf("FAIL (\"%s\" instead of \"/help/foo/bar.html\")\n", buffer);
|
||||
}
|
||||
|
||||
putenv("LANG=fr");
|
||||
|
||||
fputs("ppdLocalizeIPPReason(fr text): ", stdout);
|
||||
if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
|
||||
!strcmp(buffer, "La Long Foo Reason"))
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
status ++;
|
||||
printf("FAIL (\"%s\" instead of \"La Long Foo Reason\")\n", buffer);
|
||||
}
|
||||
|
||||
putenv("LANG=zh_TW");
|
||||
|
||||
fputs("ppdLocalizeIPPReason(zh_TW text): ", stdout);
|
||||
if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
|
||||
!strcmp(buffer, "Number 1 Foo Reason"))
|
||||
puts("PASS");
|
||||
else
|
||||
{
|
||||
status ++;
|
||||
printf("FAIL (\"%s\" instead of \"Number 1 Foo Reason\")\n", buffer);
|
||||
}
|
||||
|
||||
ppdClose(ppd);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -42,9 +42,9 @@ WEBBUTTONS = \
|
||||
images/button-delete-printer.gif \
|
||||
images/button-edit-configuration-file.gif \
|
||||
images/button-export-samba.gif \
|
||||
images/button-find-new-printers.gif \
|
||||
images/button-help.gif \
|
||||
images/button-hold-job.gif \
|
||||
images/button-list-available-printers.gif \
|
||||
images/button-manage-classes.gif \
|
||||
images/button-manage-jobs.gif \
|
||||
images/button-manage-printers.gif \
|
||||
@@ -92,6 +92,8 @@ WEBIMAGES = \
|
||||
images/printer-idle.gif \
|
||||
images/printer-processing.gif \
|
||||
images/printer-stopped.gif \
|
||||
images/raster.png \
|
||||
images/raster.svg \
|
||||
images/smiley.jpg \
|
||||
images/tab-left.gif \
|
||||
images/tab-right.gif \
|
||||
@@ -115,6 +117,7 @@ HELPFILES = \
|
||||
help/api-raster.html \
|
||||
help/cgi.html \
|
||||
help/glossary.html \
|
||||
help/kerberos.html \
|
||||
help/license.html \
|
||||
help/man-accept.html \
|
||||
help/man-backend.html \
|
||||
|
||||
@@ -110,14 +110,13 @@ SPAN.info {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
H2 SPAN.info, H3 SPAN.info {
|
||||
H2 SPAN.info, H3 SPAN.info, H4 SPAN.info {
|
||||
float: right;
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
H2.title, H3.title {
|
||||
border-bottom: solid 2pt #000000;
|
||||
page-break-before: always;
|
||||
}
|
||||
|
||||
DT {
|
||||
@@ -134,7 +133,7 @@ DL.category DT {
|
||||
}
|
||||
|
||||
P.summary {
|
||||
margin-left: 54pt;
|
||||
margin-left: 36pt;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ SPAN.info {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
H2 SPAN.info, H3 SPAN.info {
|
||||
H2 SPAN.info, H3 SPAN.info, H4 SPAN.info {
|
||||
float: right;
|
||||
font-size: 100%;
|
||||
}
|
||||
@@ -196,9 +196,10 @@ DIV.sidebar {
|
||||
background: #ddddaa;
|
||||
border: solid 2px #cccc99;
|
||||
float: right;
|
||||
min-width: 25%;
|
||||
margin-left: 10pt;
|
||||
max-width: 33%;
|
||||
padding: 5pt;
|
||||
width: 25%;
|
||||
/* These are not implemented by all browsers, but that's OK */
|
||||
border-radius: 10pt;
|
||||
-moz-border-radius: 10pt;
|
||||
@@ -254,7 +255,7 @@ DL.category DT {
|
||||
}
|
||||
|
||||
P.summary {
|
||||
margin-left: 54pt;
|
||||
margin-left: 36pt;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
|
||||
|
Depois Largura: | Altura: | Tamanho: 853 B |
|
Depois Largura: | Altura: | Tamanho: 713 B |
|
Depois Largura: | Altura: | Tamanho: 671 B |
|
Depois Largura: | Altura: | Tamanho: 864 B |
@@ -115,8 +115,8 @@ WIDTH="15" HEIGHT="15" ALT=""></TD>
|
||||
<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
|
||||
|
||||
<P><SMALL>Das Common UNIX Printing System, CUPS, und das CUPS Logo sind
|
||||
Warenzeichen der <A HREF="http://www.apple.com">Apple Inc./A> CUPS ist urheberrechtlich geschützt 2007 von Apple Inc,
|
||||
Alle Rechte vorbehalten.</SMALL></P>
|
||||
eingetragene Warenzeichen der <A HREF="http://www.apple.com">Apple Inc.</A>
|
||||
CUPS ist urheberrechtlich geschützt 2007 von Apple Inc, alle Rechte vorbehalten.</SMALL></P>
|
||||
|
||||
</TD>
|
||||
|
||||
|
||||
|
Antes Largura: | Altura: | Tamanho: 623 B Depois Largura: | Altura: | Tamanho: 716 B |
|
Antes Largura: | Altura: | Tamanho: 527 B Depois Largura: | Altura: | Tamanho: 561 B |
|
Antes Largura: | Altura: | Tamanho: 617 B Depois Largura: | Altura: | Tamanho: 724 B |
|
Depois Largura: | Altura: | Tamanho: 948 B |
|
Antes Largura: | Altura: | Tamanho: 706 B Depois Largura: | Altura: | Tamanho: 892 B |
|
Antes Largura: | Altura: | Tamanho: 769 B Depois Largura: | Altura: | Tamanho: 897 B |
|
Antes Largura: | Altura: | Tamanho: 560 B Depois Largura: | Altura: | Tamanho: 646 B |
|
Depois Largura: | Altura: | Tamanho: 881 B |
|
Antes Largura: | Altura: | Tamanho: 777 B Depois Largura: | Altura: | Tamanho: 871 B |
|
Antes Largura: | Altura: | Tamanho: 882 B Depois Largura: | Altura: | Tamanho: 1.0 KiB |
|
Antes Largura: | Altura: | Tamanho: 359 B Depois Largura: | Altura: | Tamanho: 396 B |
|
Antes Largura: | Altura: | Tamanho: 461 B Depois Largura: | Altura: | Tamanho: 498 B |
|
Antes Largura: | Altura: | Tamanho: 483 B Depois Largura: | Altura: | Tamanho: 543 B |
|
Antes Largura: | Altura: | Tamanho: 562 B Depois Largura: | Altura: | Tamanho: 627 B |
|
Antes Largura: | Altura: | Tamanho: 788 B Depois Largura: | Altura: | Tamanho: 910 B |
|
Antes Largura: | Altura: | Tamanho: 838 B Depois Largura: | Altura: | Tamanho: 928 B |
|
Depois Largura: | Altura: | Tamanho: 977 B |
|
Antes Largura: | Altura: | Tamanho: 393 B Depois Largura: | Altura: | Tamanho: 424 B |
|
Antes Largura: | Altura: | Tamanho: 567 B Depois Largura: | Altura: | Tamanho: 603 B |
|
Antes Largura: | Altura: | Tamanho: 636 B Depois Largura: | Altura: | Tamanho: 807 B |
|
Antes Largura: | Altura: | Tamanho: 658 B Depois Largura: | Altura: | Tamanho: 744 B |
|
Antes Largura: | Altura: | Tamanho: 718 B Depois Largura: | Altura: | Tamanho: 914 B |
|
Antes Largura: | Altura: | Tamanho: 672 B Depois Largura: | Altura: | Tamanho: 788 B |
|
Antes Largura: | Altura: | Tamanho: 579 B Depois Largura: | Altura: | Tamanho: 618 B |
|
Antes Largura: | Altura: | Tamanho: 659 B Depois Largura: | Altura: | Tamanho: 797 B |
|
Antes Largura: | Altura: | Tamanho: 551 B Depois Largura: | Altura: | Tamanho: 669 B |
|
Antes Largura: | Altura: | Tamanho: 744 B Depois Largura: | Altura: | Tamanho: 918 B |
|
Antes Largura: | Altura: | Tamanho: 856 B Depois Largura: | Altura: | Tamanho: 930 B |
|
Antes Largura: | Altura: | Tamanho: 783 B Depois Largura: | Altura: | Tamanho: 858 B |
|
Antes Largura: | Altura: | Tamanho: 625 B Depois Largura: | Altura: | Tamanho: 722 B |
|
Antes Largura: | Altura: | Tamanho: 642 B Depois Largura: | Altura: | Tamanho: 781 B |
|
Antes Largura: | Altura: | Tamanho: 550 B Depois Largura: | Altura: | Tamanho: 640 B |
|
Antes Largura: | Altura: | Tamanho: 615 B Depois Largura: | Altura: | Tamanho: 738 B |
|
Antes Largura: | Altura: | Tamanho: 601 B Depois Largura: | Altura: | Tamanho: 737 B |
|
Antes Largura: | Altura: | Tamanho: 389 B Depois Largura: | Altura: | Tamanho: 416 B |
|
Antes Largura: | Altura: | Tamanho: 822 B Depois Largura: | Altura: | Tamanho: 888 B |
|
Antes Largura: | Altura: | Tamanho: 794 B Depois Largura: | Altura: | Tamanho: 977 B |
|
Antes Largura: | Altura: | Tamanho: 809 B Depois Largura: | Altura: | Tamanho: 925 B |
|
Antes Largura: | Altura: | Tamanho: 726 B Depois Largura: | Altura: | Tamanho: 910 B |