Comparar commits
1 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 5b5a12ad96 |
@@ -3,6 +3,12 @@ CHANGES-1.3.txt
|
||||
|
||||
CHANGES IN CUPS V1.3.11
|
||||
|
||||
- The scheduler did not prevent nested classes (STR #3211)
|
||||
- The scheduler did not reprint processing jobs that were moved to
|
||||
another destination (STR #3222)
|
||||
- The scheduler did not reset the current job file when stopping a
|
||||
printer (STR #3226)
|
||||
- The scheduler did not handle POSTs to custom CGIs properly (STR #3221)
|
||||
- The pdftops filter did not print landscape PDF pages properly
|
||||
(STR #2881)
|
||||
- The scheduler did not handle partial header lines properly from CGI
|
||||
|
||||
+176
-1
@@ -1,6 +1,181 @@
|
||||
CHANGES.txt - 2009-06-08
|
||||
CHANGES.txt - 2010-03-30
|
||||
------------------------
|
||||
|
||||
CHANGES IN CUPS V1.4.3
|
||||
|
||||
- SECURITY: The scheduler could try responding on a closed client
|
||||
connection, leading to a crash (STR #3200)
|
||||
- SECURITY: The lppasswd program allowed the localization files to be
|
||||
overridden when running in setuid mode (STR #3482)
|
||||
- Localization updates (STR #3352, STR #3409, STR #3422, STR #3452,
|
||||
STR #3473, STR #3502)
|
||||
- Documentation updates (STR #3451, STR #3504)
|
||||
- The IPP backend now sets the printer-state-message to "Ready to
|
||||
print." at the end of a successful job (STR #3460)
|
||||
- The PPD compiler did not correctly add the manufacturer to the output
|
||||
filename when using the "-m" option (STR #3469)
|
||||
- The IPP backend did not handle authentication properly for the Get-
|
||||
Printer-Attributes operation (STR 3458)
|
||||
- Getting SNMP values larger than 127 bytes did not work.
|
||||
- IPP conformance: Get-Jobs has a default value for requested-attributes
|
||||
(STR #3383)
|
||||
- cupsPrintFiles() did not report all errors (STR #3449)
|
||||
- cupsAddDest() could read freed memory (STR #3448)
|
||||
- The DBUS notifier did not build (STR #3447)
|
||||
- The scheduler would crash when an active printer was deleted.
|
||||
- The snmp backend did not work with some printers (STR #3413)
|
||||
- The web interface did not show the conflicting values when setting
|
||||
options (STR #3440)
|
||||
- Setting options in the web interface did not always work (STR #3439)
|
||||
- The scheduler did not use the Get-Job-Attributes policy for a printer
|
||||
(STR #3431)
|
||||
- The scheduler added two job-name attributes to each job object
|
||||
(STR #3428)
|
||||
- CSS files would not print (STR #3442)
|
||||
- The scheduler did not clean out completed jobs when PreserveJobHistory
|
||||
was turned off (STR #3425)
|
||||
- The web interface did not show completed jobs for a printer
|
||||
(STR #3436)
|
||||
- Authenticated printing did not always work when printing directly to
|
||||
a remote server (STR #3435)
|
||||
- The USB backend did not work on Solaris (STR #3423)
|
||||
- cupstestppd didn't catch problems with JobPatchFile definitions
|
||||
(STR #3421)
|
||||
- The socket backend could crash if a SNMP string had a negative length.
|
||||
- Fixed some termination issues with the USB backend on Mac OS X.
|
||||
- The side-channel APIs did not handle interrupts properly.
|
||||
- The network backends incorrectly cleared the media-empty-warning
|
||||
state.
|
||||
- The web interface did not allow users to successfully add serial
|
||||
printers (STR #3391)
|
||||
- cupsTempFd() did not work in some situations (STR #3382)
|
||||
- Some C API headers were missing C++ wrapper logic.
|
||||
- The PPD compiler did not localize single-language PPD options properly
|
||||
(STR #3386)
|
||||
- Modifying a printer from the web interface sometimes caused the wrong
|
||||
driver to be selected (STR #3418)
|
||||
- The scheduler did not handle out-of-memory conditions properly when
|
||||
loading a job (STR #3407)
|
||||
- When adding printers from the web interface, the dynamic updates of
|
||||
the device list made it hard to pick a device (STR #3406)
|
||||
- Fixed a typo in the web interface admin page template (STR 3403)
|
||||
- The web interface did not preserve the "printer is shared" state when
|
||||
modifying a printer (STR #3390)
|
||||
- The PPD compiler incorrectly inserted translations of empty strings
|
||||
(STR #3411)
|
||||
- The scheduler did not reset the SIGPIPE handler of child processes
|
||||
(STR #3399)
|
||||
- cupsGetNamedDest() incorrectly returned the default printer if the
|
||||
named printer did not exist (STR #3397)
|
||||
- Fixed a GNU TLS error handling bug (STR #3381)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.4.2
|
||||
|
||||
- SECURITY: The CUPS web interface was vulnerable to several XSS and
|
||||
HTTP header/body attacks via attribute injection (STR #3367,
|
||||
STR #3401)
|
||||
- Fixed localization errors (STR #3359, STR #3372, STR #3380, STR #3387)
|
||||
- The documentation for classes.conf and printers.conf did not provide
|
||||
the correct instructions for manual changes (STR #3351)
|
||||
- The scheduler did not always rebuild printer cache files when the
|
||||
driver was changed (STR #3356)
|
||||
- The documentation makefile failed to install localizations when using
|
||||
newer versions of Bash (STR #3360)
|
||||
- The configure script did not use the --with-xinetd value for the
|
||||
default LPD configuration path (STR #3347)
|
||||
- The configure script incorrectly required glib for DBUS support
|
||||
(STR #3346)
|
||||
- The cupstestppd program incorrectly reported filters with bad
|
||||
permisssions as missing (STR #3363)
|
||||
- The cups.desktop file used the wrong locale names (STR #3358)
|
||||
- cupsSideChannelRead() did not return an error for short reads.
|
||||
- The installed PAM configuration file did not use the correct options
|
||||
with the pam_unix2 module (STR #3313)
|
||||
- The scheduler did not preserve default options that contained special
|
||||
characters (STR #3340)
|
||||
- The scheduler did not remove old pre-filters when updating a printer
|
||||
driver (STR #3342)
|
||||
- The HP/GL-2 filter did not check for early end-of-file (STR #3319)
|
||||
- The USB backend did not compile on some platforms (STR #3332)
|
||||
- cupsSideChannelSNMPWalk() could go into an infinite loop with broken
|
||||
SNMP implementations.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.4.1
|
||||
|
||||
- Documention fixes (STR #3296)
|
||||
- SNMP supply levels and states were wrong for some printers.
|
||||
- The IPP backend did not update the auth-info-required value.
|
||||
- The libusb-based USB backend would hang at the end of the job
|
||||
(STR #3315, STR #3318)
|
||||
- DNS-SD registrations for raw queues had an empty "ty" key (STR #3299)
|
||||
- The JPEG and BMP MIME type rules were broken (STR #3284)
|
||||
- cupsGetNamedDest returned the default printer when the named
|
||||
destination did not exist (STR #3285)
|
||||
- The JobKillDelay was not triggered for canceled jobs (STR #3292)
|
||||
- The PPD compiler could get in an infinite loop (STR #3293)
|
||||
- The configure check for dns-sd.h was broken (STR #3297)
|
||||
- The "Query Printer for Default Options" page did not go away if the
|
||||
query job was held (STR #3302)
|
||||
- Boolean options did not show up as selected in the web interface
|
||||
(STR #3303)
|
||||
- The scheduler did not cache or report driver information files
|
||||
correctly, leading to a variety of issues (STR #3283, STR #3297,
|
||||
STR #3305)
|
||||
- cupsDoIORequest() did not abort on permanent errors (STR #3311)
|
||||
- Modifying a class in the web interface did not work (STR #3312)
|
||||
- BrowseLocalProtocols could be cleared when changing the sharing
|
||||
setting (STR #3287)
|
||||
- The scheduler could return an empty supported document format
|
||||
(STR #3308)
|
||||
- The PPD compiler generated invalid PPD files when the locale used
|
||||
something other than "." for the decimal point (STR #3300)
|
||||
- The IPP backend did not handle some non-comforming IPP printer
|
||||
implementations (STR #3262)
|
||||
- The scheduler leaked three file descriptors to each job filter
|
||||
(STR #3263)
|
||||
- The scheduler now uses a default CUPS-Get-Devices timeout of 15
|
||||
seconds (STR #3307)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.4.0
|
||||
|
||||
- Localization updates (STR #3223, STR #3246, STR #3248, STR #3250)
|
||||
- Documentation updates (STR #3225, STR #3230, STR #3242, STR #3260)
|
||||
- The --with-pdftops configure option did not accept a full path to the
|
||||
filter (STR #3278)
|
||||
- The banner filter did not position the back side image correctly
|
||||
(STR #3277)
|
||||
- The dnssd backend could crash (STR #3272)
|
||||
- The 1284 device ID sometimes contained trailing garbage (STR #3266)
|
||||
- The USB backend returned different URIs for some printers than in
|
||||
CUPS 1.3 (STR #3259)
|
||||
- The scheduler did not do local job-hold-until processing for remote
|
||||
queues (STR #3258)
|
||||
- The scheduler did not try all possible SSL certificates on Mac OS X.
|
||||
- The scheduler did not always remove a file descriptor when using the
|
||||
kqueue interface (STR #3256)
|
||||
- The scheduler did not protect against bad job control files in all
|
||||
cases (STR #3253)
|
||||
- The scheduler did not encode "+" in model names (STR #3254)
|
||||
- The web interface didn't show the default options (STR #3244)
|
||||
- The IPP and LPD backends needed print data before they would do an
|
||||
SNMP query.
|
||||
- Fixed a GNU TLS compatibility issue (STR #3231)
|
||||
- Fixed a HTML error in the add and modify printer web interface
|
||||
templates (STR #3229)
|
||||
- The scheduler did not minimize the number of printer state events that
|
||||
were generated by filter STATE: messages, which could lead to poor
|
||||
performance.
|
||||
- The USB backend on Mac OS X did not cleanly cancel a job.
|
||||
- The network backends now set the connecting-to-device printer-state-
|
||||
reasons value when looking up the address and copying the print data
|
||||
for consistency.
|
||||
- The scheduler now supports the com.apple.print.recoverable-warning
|
||||
reason on all platforms.
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.4rc1
|
||||
|
||||
- The PPD compiler documentation was missing information on localization
|
||||
|
||||
+4
-2
@@ -1,4 +1,4 @@
|
||||
CREDITS.txt - 2008-12-08
|
||||
CREDITS.txt - 2010-03-13
|
||||
------------------------
|
||||
|
||||
Few projects are completed by one person, and CUPS is no exception. We'd
|
||||
@@ -17,6 +17,7 @@ like to thank the following individuals for their contributions:
|
||||
Wang Jian - CUPS RPM corrections.
|
||||
Roderick Johnstone - Beta tester of the millenium.
|
||||
Till Kamppeter - Bug fixes, beta testing, evangelism.
|
||||
I–aki Larra–aga - Basque localization.
|
||||
Kenshi Muto - Japanese localization, patches, and
|
||||
testing.
|
||||
Tomohiro Kato - Japanese localization.
|
||||
@@ -28,6 +29,7 @@ like to thank the following individuals for their contributions:
|
||||
Jason McMullan - Original CUPS RPM distributions.
|
||||
Wes Morgan - *BSD fixes.
|
||||
Daniel Nylander - Swedish localization.
|
||||
Niklas 'Nille' �kerstršm - Swedish localization.
|
||||
Giulio Orsero - Bug fixes and testing.
|
||||
Michal Osowiecki - Polish localization.
|
||||
Citra Paska - Indonesian localization.
|
||||
@@ -38,7 +40,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.
|
||||
Teppo Turlianen - Finnish localization.
|
||||
Teppo Turliainen - Finnish localization.
|
||||
Tim Waugh - Lots of patches, testing, and Linux
|
||||
integration.
|
||||
Yugami - LDAP browsing support.
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
INSTALL - CUPS v1.4rc1 - 2009-05-22
|
||||
-----------------------------------
|
||||
INSTALL - CUPS v1.4.3 - 2009-12-15
|
||||
----------------------------------
|
||||
|
||||
This file describes how to compile and install CUPS from source code. For more
|
||||
information on CUPS see the file called "README.txt". A complete change log can
|
||||
@@ -43,7 +43,7 @@ COMPILING THE SUBVERSION REPOSITORY CODE
|
||||
configure script. You'll need to run the GNU autoconf software (2.60 or
|
||||
higher) to create it:
|
||||
|
||||
autoconf -f
|
||||
autoconf
|
||||
|
||||
|
||||
CONFIGURATION
|
||||
|
||||
+7
-4
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# Top-level Makefile for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
# Copyright 2007-2009 by Apple Inc.
|
||||
# Copyright 2007-2010 by Apple Inc.
|
||||
# Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
#
|
||||
# These coded instructions, statements, and computer programs are the
|
||||
@@ -139,13 +139,15 @@ depend:
|
||||
|
||||
#
|
||||
# Run the clang.llvm.org static code analysis tool on the C sources.
|
||||
# (at least checker-231 is required for scan-build to work this way)
|
||||
#
|
||||
|
||||
.PHONY: clang
|
||||
.PHONY: clang clang-changes
|
||||
clang:
|
||||
$(RM) -r clang
|
||||
scan-build -V -k -o `pwd`/clang $(MAKE) $(MFLAGS) \
|
||||
CC=ccc-analyzer CXX=ccc-analyzer clean all
|
||||
scan-build -V -k -o `pwd`/clang $(MAKE) $(MFLAGS) clean all
|
||||
clang-changes:
|
||||
scan-build -V -k -o `pwd`/clang $(MAKE) $(MFLAGS) all
|
||||
|
||||
|
||||
#
|
||||
@@ -392,6 +394,7 @@ docset: apihelp
|
||||
echo Indexing docset...
|
||||
/Developer/usr/bin/docsetutil index org.cups.docset
|
||||
echo Generating docset archive and feed...
|
||||
$(RM) org.cups.docset.atom
|
||||
/Developer/usr/bin/docsetutil package --output org.cups.docset.xar \
|
||||
--atom org.cups.docset.atom \
|
||||
--download-url http://www.cups.org/org.cups.docset.xar \
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
README - CUPS v1.4rc1 - 2009-05-22
|
||||
----------------------------------
|
||||
README - CUPS v1.4.3 - 2009-12-15
|
||||
---------------------------------
|
||||
|
||||
Looking for compile instructions? Read the file "INSTALL.txt"
|
||||
instead...
|
||||
|
||||
@@ -34,6 +34,26 @@
|
||||
# include <cups/string.h>
|
||||
# include <signal.h>
|
||||
|
||||
# ifdef __linux
|
||||
# include <sys/ioctl.h>
|
||||
# include <linux/lp.h>
|
||||
# define IOCNR_GET_DEVICE_ID 1
|
||||
# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
|
||||
# include <linux/parport.h>
|
||||
# include <linux/ppdev.h>
|
||||
# include <unistd.h>
|
||||
# include <fcntl.h>
|
||||
# endif /* __linux */
|
||||
|
||||
# ifdef __sun
|
||||
# ifdef __sparc
|
||||
# include <sys/ecppio.h>
|
||||
# else
|
||||
# include <sys/ioccom.h>
|
||||
# include <sys/ecppsys.h>
|
||||
# endif /* __sparc */
|
||||
# endif /* __sun */
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
@@ -276,16 +296,17 @@ extern int backendGetDeviceID(int fd, char *device_id,
|
||||
extern int backendGetMakeModel(const char *device_id,
|
||||
char *make_model,
|
||||
int make_model_size);
|
||||
extern void backendNetworkSideCB(int print_fd, int device_fd,
|
||||
extern int backendNetworkSideCB(int print_fd, int device_fd,
|
||||
int snmp_fd, http_addr_t *addr,
|
||||
int use_bc);
|
||||
extern ssize_t backendRunLoop(int print_fd, int device_fd, int snmp_fd,
|
||||
http_addr_t *addr, int use_bc,
|
||||
void (*side_cb)(int print_fd,
|
||||
int device_fd,
|
||||
int snmp_fd,
|
||||
http_addr_t *addr,
|
||||
int use_bc));
|
||||
http_addr_t *addr, int use_bc,
|
||||
int update_state,
|
||||
int (*side_cb)(int print_fd,
|
||||
int device_fd,
|
||||
int snmp_fd,
|
||||
http_addr_t *addr,
|
||||
int use_bc));
|
||||
extern int backendSNMPSupplies(int snmp_fd, http_addr_t *addr,
|
||||
int *page_count,
|
||||
int *printer_state);
|
||||
|
||||
+2
-2
@@ -153,8 +153,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
memset(&action, 0, sizeof(action));
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGTERM, &action, sigterm_handler);
|
||||
action.sa_handler = sigterm_handler;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
#else
|
||||
signal(SIGTERM, sigterm_handler);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
+19
-24
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IEEE-1284 support functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2007-2008 by Apple Inc.
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -27,26 +27,6 @@
|
||||
|
||||
#include "backend-private.h"
|
||||
|
||||
#ifdef __linux
|
||||
# include <sys/ioctl.h>
|
||||
# include <linux/lp.h>
|
||||
# define IOCNR_GET_DEVICE_ID 1
|
||||
# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
|
||||
# include <linux/parport.h>
|
||||
# include <linux/ppdev.h>
|
||||
# include <unistd.h>
|
||||
# include <fcntl.h>
|
||||
#endif /* __linux */
|
||||
|
||||
#ifdef __sun
|
||||
# ifdef __sparc
|
||||
# include <sys/ecppio.h>
|
||||
# else
|
||||
# include <sys/ioccom.h>
|
||||
# include <sys/ecppsys.h>
|
||||
# endif /* __sparc */
|
||||
#endif /* __sun */
|
||||
|
||||
|
||||
/*
|
||||
* 'backendGetDeviceID()' - Get the IEEE-1284 device ID string and
|
||||
@@ -196,12 +176,19 @@ backendGetDeviceID(
|
||||
* and then limit the length to the size of our buffer...
|
||||
*/
|
||||
|
||||
if (length > (device_id_size - 2))
|
||||
if (length > device_id_size)
|
||||
length = (((unsigned)device_id[1] & 255) << 8) +
|
||||
((unsigned)device_id[0] & 255);
|
||||
|
||||
if (length > (device_id_size - 2))
|
||||
length = device_id_size - 2;
|
||||
if (length > device_id_size)
|
||||
length = device_id_size;
|
||||
|
||||
/*
|
||||
* The length field counts the number of bytes in the string
|
||||
* including the length field itself (2 bytes).
|
||||
*/
|
||||
|
||||
length -= 2;
|
||||
|
||||
/*
|
||||
* Copy the device ID text to the beginning of the buffer and
|
||||
@@ -306,6 +293,14 @@ backendGetDeviceID(
|
||||
mfg = temp;
|
||||
}
|
||||
|
||||
if (!strncasecmp(mdl, mfg, strlen(mfg)))
|
||||
{
|
||||
mdl += strlen(mfg);
|
||||
|
||||
while (isspace(*mdl & 255))
|
||||
mdl ++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate the device URI from the manufacturer, make_model, and
|
||||
* serial number strings.
|
||||
|
||||
+77
-57
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* IPP backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 2007-2010 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -45,6 +45,8 @@
|
||||
|
||||
static char *password = NULL; /* Password for device URI */
|
||||
static int password_tries = 0; /* Password tries */
|
||||
static const char *auth_info_required = "none";
|
||||
/* New auth-info-required value */
|
||||
#ifdef __APPLE__
|
||||
static char pstmpname[1024] = ""; /* Temporary PostScript file name */
|
||||
#endif /* __APPLE__ */
|
||||
@@ -91,7 +93,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
int num_options; /* Number of printer options */
|
||||
cups_option_t *options; /* Printer options */
|
||||
const char *device_uri; /* Device URI */
|
||||
char method[255], /* Method in URI */
|
||||
char scheme[255], /* Scheme in URI */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
@@ -236,21 +238,14 @@ main(int argc, /* I - Number of command-line args */
|
||||
if ((device_uri = cupsBackendDeviceURI(argv)) == NULL)
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
|
||||
if (httpSeparateURI(HTTP_URI_CODING_ALL, device_uri,
|
||||
method, sizeof(method), username, sizeof(username),
|
||||
hostname, sizeof(hostname), &port,
|
||||
resource, sizeof(resource)) < HTTP_URI_OK)
|
||||
{
|
||||
_cupsLangPuts(stderr,
|
||||
_("ERROR: Missing device URI on command-line and no "
|
||||
"DEVICE_URI environment variable!\n"));
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme),
|
||||
username, sizeof(username), hostname, sizeof(hostname), &port,
|
||||
resource, sizeof(resource));
|
||||
|
||||
if (!port)
|
||||
port = IPP_PORT; /* Default to port 631 */
|
||||
|
||||
if (!strcmp(method, "https"))
|
||||
if (!strcmp(scheme, "https"))
|
||||
cupsSetEncryption(HTTP_ENCRYPT_ALWAYS);
|
||||
else
|
||||
cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED);
|
||||
@@ -416,11 +411,12 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
int fd; /* File descriptor */
|
||||
http_addrlist_t *addrlist; /* Address list */
|
||||
char buffer[8192]; /* Buffer for copying */
|
||||
int bytes; /* Number of bytes read */
|
||||
off_t tbytes; /* Total bytes copied */
|
||||
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
|
||||
|
||||
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, "1")) == NULL)
|
||||
{
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
|
||||
@@ -438,23 +434,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
_cupsLangPuts(stderr, _("INFO: Copying print data...\n"));
|
||||
|
||||
tbytes = 0;
|
||||
|
||||
while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
|
||||
{
|
||||
if (write(fd, buffer, bytes) < bytes)
|
||||
{
|
||||
_cupsLangPrintError(_("ERROR: Unable to write to temporary file"));
|
||||
close(fd);
|
||||
unlink(tmpfilename);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
else
|
||||
tbytes += bytes;
|
||||
|
||||
if (snmp_fd >= 0)
|
||||
backendCheckSideChannel(snmp_fd, &(addrlist->addr));
|
||||
}
|
||||
tbytes = backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0,
|
||||
backendNetworkSideCB);
|
||||
|
||||
if (snmp_fd >= 0)
|
||||
_cupsSNMPClose(snmp_fd);
|
||||
@@ -544,8 +525,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
do
|
||||
{
|
||||
fprintf(stderr, "DEBUG: Connecting to %s:%d\n",
|
||||
hostname, port);
|
||||
fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port);
|
||||
_cupsLangPuts(stderr, _("INFO: Connecting to printer...\n"));
|
||||
|
||||
if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL)
|
||||
@@ -661,7 +641,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
* might contain username:password information...
|
||||
*/
|
||||
|
||||
snprintf(uri, sizeof(uri), "%s://%s:%d%s", method, hostname, port, resource);
|
||||
httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL, hostname,
|
||||
port, resource);
|
||||
|
||||
/*
|
||||
* First validate the destination and see if the device supports multiple
|
||||
@@ -757,6 +738,15 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
else if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN)
|
||||
{
|
||||
if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE),
|
||||
"Negotiate", 9))
|
||||
auth_info_required = "negotiate";
|
||||
|
||||
fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required);
|
||||
return (CUPS_BACKEND_AUTH_REQUIRED);
|
||||
}
|
||||
else
|
||||
{
|
||||
_cupsLangPrintf(stderr,
|
||||
@@ -1070,16 +1060,21 @@ main(int argc, /* I - Number of command-line args */
|
||||
_cupsLangPrintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"),
|
||||
cupsLastErrorString());
|
||||
|
||||
if (ipp_status == IPP_NOT_AUTHORIZED)
|
||||
if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN)
|
||||
{
|
||||
fprintf(stderr, "DEBUG: WWW-Authenticate=\"%s\"\n",
|
||||
httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE));
|
||||
|
||||
/*
|
||||
* Normal authentication goes through the password callback, which sets
|
||||
* auth_info_required to "username,password". Kerberos goes directly
|
||||
* through GSSAPI, so look for Negotiate in the WWW-Authenticate header
|
||||
* here and set auth_info_required as needed...
|
||||
*/
|
||||
|
||||
if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE),
|
||||
"Negotiate", 9))
|
||||
fputs("ATTR: auth-info-required=negotiate\n", stderr);
|
||||
else
|
||||
fputs("ATTR: auth-info-required=username,password\n", stderr);
|
||||
auth_info_required = "negotiate";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1260,6 +1255,19 @@ main(int argc, /* I - Number of command-line args */
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* If the printer does not return a job-state attribute, it does not
|
||||
* conform to the IPP specification - break out immediately and fail
|
||||
* the job...
|
||||
*/
|
||||
|
||||
fputs("DEBUG: No job-state available from printer - stopping queue.\n",
|
||||
stderr);
|
||||
ipp_status = IPP_INTERNAL_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
@@ -1304,6 +1312,15 @@ main(int argc, /* I - Number of command-line args */
|
||||
page_count > start_count)
|
||||
fprintf(stderr, "PAGE: total %d\n", page_count - start_count);
|
||||
|
||||
#ifdef HAVE_GSSAPI
|
||||
/*
|
||||
* See if we used Kerberos at all...
|
||||
*/
|
||||
|
||||
if (http->gssctx)
|
||||
auth_info_required = "negotiate";
|
||||
#endif /* HAVE_GSSAPI */
|
||||
|
||||
/*
|
||||
* Free memory...
|
||||
*/
|
||||
@@ -1336,12 +1353,19 @@ main(int argc, /* I - Number of command-line args */
|
||||
* Return the queue status...
|
||||
*/
|
||||
|
||||
if (ipp_status == IPP_NOT_AUTHORIZED)
|
||||
fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required);
|
||||
|
||||
if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN)
|
||||
return (CUPS_BACKEND_AUTH_REQUIRED);
|
||||
else if (ipp_status == IPP_INTERNAL_ERROR)
|
||||
return (CUPS_BACKEND_STOP);
|
||||
else if (ipp_status > IPP_OK_CONFLICT)
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
else
|
||||
{
|
||||
_cupsLangPuts(stderr, _("INFO: Ready to print.\n"));
|
||||
return (CUPS_BACKEND_OK);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1538,6 +1562,12 @@ password_cb(const char *prompt) /* I - Prompt (not used) */
|
||||
{
|
||||
(void)prompt;
|
||||
|
||||
/*
|
||||
* Remember that we need to authenticate...
|
||||
*/
|
||||
|
||||
auth_info_required = "username,password";
|
||||
|
||||
if (password && *password && password_tries < 3)
|
||||
{
|
||||
password_tries ++;
|
||||
@@ -1547,23 +1577,10 @@ password_cb(const char *prompt) /* I - Prompt (not used) */
|
||||
else
|
||||
{
|
||||
/*
|
||||
* If there is no password set in the device URI, return the
|
||||
* "authentication required" exit code...
|
||||
* Give up after 3 tries or if we don't have a password to begin with...
|
||||
*/
|
||||
|
||||
if (tmpfilename[0])
|
||||
unlink(tmpfilename);
|
||||
|
||||
#ifdef __APPLE__
|
||||
if (pstmpname[0])
|
||||
unlink(pstmpname);
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
fputs("ATTR: auth-info-required=username,password\n", stderr);
|
||||
|
||||
exit(CUPS_BACKEND_AUTH_REQUIRED);
|
||||
|
||||
return (NULL); /* Eliminate compiler warning */
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1826,8 +1843,11 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
|
||||
* Change to an unpriviledged user...
|
||||
*/
|
||||
|
||||
setgid(fileinfo.st_gid);
|
||||
setuid(fileinfo.st_uid);
|
||||
if (setgid(fileinfo.st_gid))
|
||||
return (errno);
|
||||
|
||||
if (setuid(fileinfo.st_uid))
|
||||
return (errno);
|
||||
}
|
||||
|
||||
execlp("pictwpstops", printer, argv[1], argv[2], argv[3], argv[4], argv[5],
|
||||
|
||||
+11
-23
@@ -113,7 +113,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
const char *device_uri; /* Device URI */
|
||||
char method[255], /* Method in URI */
|
||||
char scheme[255], /* Scheme in URI */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
@@ -193,9 +193,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
if ((device_uri = cupsBackendDeviceURI(argv)) == NULL)
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
|
||||
httpSeparateURI(HTTP_URI_CODING_ALL, device_uri,
|
||||
method, sizeof(method), username, sizeof(username),
|
||||
hostname, sizeof(hostname), &port,
|
||||
httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme),
|
||||
username, sizeof(username), hostname, sizeof(hostname), &port,
|
||||
resource, sizeof(resource));
|
||||
|
||||
if (!port)
|
||||
@@ -426,10 +425,11 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
http_addrlist_t *addrlist; /* Address list */
|
||||
int snmp_fd; /* SNMP socket */
|
||||
char buffer[8192]; /* Buffer for copying */
|
||||
int bytes; /* Number of bytes read */
|
||||
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
|
||||
|
||||
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, "1")) == NULL)
|
||||
{
|
||||
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
|
||||
@@ -447,19 +447,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
_cupsLangPuts(stderr, _("INFO: Copying print data...\n"));
|
||||
|
||||
while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
|
||||
{
|
||||
if (write(fd, buffer, bytes) < bytes)
|
||||
{
|
||||
_cupsLangPrintError(_("ERROR: Unable to write to temporary file"));
|
||||
close(fd);
|
||||
unlink(tmpfilename);
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
if (snmp_fd >= 0)
|
||||
backendCheckSideChannel(snmp_fd, &(addrlist->addr));
|
||||
}
|
||||
backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0,
|
||||
backendNetworkSideCB);
|
||||
|
||||
if (snmp_fd >= 0)
|
||||
_cupsSNMPClose(snmp_fd);
|
||||
@@ -695,6 +684,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
sprintf(portname, "%d", port);
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
|
||||
|
||||
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
|
||||
@@ -721,9 +711,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
* First try to reserve a port for this connection...
|
||||
*/
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n",
|
||||
hostname, port, printer);
|
||||
fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n", hostname,
|
||||
port, printer);
|
||||
_cupsLangPuts(stderr, _("INFO: Connecting to printer...\n"));
|
||||
|
||||
for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist,
|
||||
@@ -809,7 +798,6 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
error = errno;
|
||||
close(fd);
|
||||
fd = -1;
|
||||
|
||||
if (addr->next)
|
||||
continue;
|
||||
|
||||
+9
-8
@@ -61,7 +61,7 @@ backendCheckSideChannel(
|
||||
* 'backendNetworkSideCB()' - Handle common network side-channel commands.
|
||||
*/
|
||||
|
||||
void
|
||||
int /* O - -1 on error, 0 on success */
|
||||
backendNetworkSideCB(
|
||||
int print_fd, /* I - Print file or -1 */
|
||||
int device_fd, /* I - Device file or -1 */
|
||||
@@ -79,10 +79,7 @@ backendNetworkSideCB(
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
|
||||
return;
|
||||
}
|
||||
return (-1);
|
||||
|
||||
switch (command)
|
||||
{
|
||||
@@ -173,9 +170,13 @@ backendNetworkSideCB(
|
||||
|
||||
case CUPS_ASN1_BIT_STRING :
|
||||
case CUPS_ASN1_OCTET_STRING :
|
||||
i = (int)(sizeof(data) - (dataptr - data));
|
||||
if (packet.object_value.string.num_bytes < i)
|
||||
if (packet.object_value.string.num_bytes < 0)
|
||||
i = 0;
|
||||
else if (packet.object_value.string.num_bytes <
|
||||
(sizeof(data) - (dataptr - data)))
|
||||
i = packet.object_value.string.num_bytes;
|
||||
else
|
||||
i = (int)(sizeof(data) - (dataptr - data));
|
||||
|
||||
memcpy(dataptr, packet.object_value.string.bytes, i);
|
||||
|
||||
@@ -284,7 +285,7 @@ backendNetworkSideCB(
|
||||
break;
|
||||
}
|
||||
|
||||
cupsSideChannelWrite(command, status, data, datalen, 1.0);
|
||||
return (cupsSideChannelWrite(command, status, data, datalen, 1.0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+7
-10
@@ -1278,7 +1278,7 @@ int papCancelRequest(int sockfd, u_short tid)
|
||||
* 'sidechannel_request()' - Handle side-channel requests.
|
||||
*/
|
||||
|
||||
static void
|
||||
static int
|
||||
sidechannel_request()
|
||||
{
|
||||
cups_sc_command_t command; /* Request command */
|
||||
@@ -1289,32 +1289,29 @@ sidechannel_request()
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
|
||||
return;
|
||||
}
|
||||
return (-1);
|
||||
|
||||
switch (command)
|
||||
{
|
||||
case CUPS_SC_CMD_GET_BIDI: /* Is the connection bidirectional? */
|
||||
data[0] = 1;
|
||||
cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0);
|
||||
return (cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0));
|
||||
break;
|
||||
|
||||
case CUPS_SC_CMD_GET_STATE: /* Return device state */
|
||||
data[0] = CUPS_SC_STATE_ONLINE;
|
||||
cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0);
|
||||
return (cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0));
|
||||
break;
|
||||
|
||||
case CUPS_SC_CMD_DRAIN_OUTPUT: /* Drain all pending output */
|
||||
case CUPS_SC_CMD_SOFT_RESET: /* Do a soft reset */
|
||||
case CUPS_SC_CMD_GET_DEVICE_ID: /* Return IEEE-1284 device ID */
|
||||
default:
|
||||
cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED,
|
||||
NULL, 0, 1.0);
|
||||
return (cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED,
|
||||
NULL, 0, 1.0));
|
||||
break;
|
||||
}
|
||||
return;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
*/
|
||||
|
||||
static void list_devices(void);
|
||||
static void side_cb(int print_fd, int device_fd, int snmp_fd,
|
||||
static int side_cb(int print_fd, int device_fd, int snmp_fd,
|
||||
http_addr_t *addr, int use_bc);
|
||||
|
||||
|
||||
@@ -284,7 +284,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
lseek(print_fd, 0, SEEK_SET);
|
||||
}
|
||||
|
||||
tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, side_cb);
|
||||
tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb);
|
||||
|
||||
if (print_fd != 0 && tbytes >= 0)
|
||||
_cupsLangPrintf(stderr,
|
||||
@@ -615,7 +615,7 @@ list_devices(void)
|
||||
* 'side_cb()' - Handle side-channel requests...
|
||||
*/
|
||||
|
||||
static void
|
||||
static int /* O - 0 on success, -1 on error */
|
||||
side_cb(int print_fd, /* I - Print file */
|
||||
int device_fd, /* I - Device file */
|
||||
int snmp_fd, /* I - SNMP socket (unused) */
|
||||
@@ -634,10 +634,7 @@ side_cb(int print_fd, /* I - Print file */
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
|
||||
return;
|
||||
}
|
||||
return (-1);
|
||||
|
||||
switch (command)
|
||||
{
|
||||
@@ -680,7 +677,7 @@ side_cb(int print_fd, /* I - Print file */
|
||||
break;
|
||||
}
|
||||
|
||||
cupsSideChannelWrite(command, status, data, datalen, 1.0);
|
||||
return (cupsSideChannelWrite(command, status, data, datalen, 1.0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+17
-7
@@ -147,7 +147,8 @@ backendRunLoop(
|
||||
int snmp_fd, /* I - SNMP socket or -1 if none */
|
||||
http_addr_t *addr, /* I - Address of device */
|
||||
int use_bc, /* I - Use back-channel? */
|
||||
void (*side_cb)(int, int, int, http_addr_t *, int))
|
||||
int update_state, /* I - Update printer-state-reasons? */
|
||||
int (*side_cb)(int, int, int, http_addr_t *, int))
|
||||
/* I - Side-channel callback */
|
||||
{
|
||||
int nfds; /* Maximum file descriptor value + 1 */
|
||||
@@ -196,6 +197,14 @@ backendRunLoop(
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
}
|
||||
else if (print_fd < 0)
|
||||
{
|
||||
/*
|
||||
* Copy print data from stdin, but don't mess with the signal handlers...
|
||||
*/
|
||||
|
||||
print_fd = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Figure out the maximum file descriptor value to use with select()...
|
||||
@@ -237,7 +246,7 @@ backendRunLoop(
|
||||
* Pause printing to clear any pending errors...
|
||||
*/
|
||||
|
||||
if (errno == ENXIO && offline != 1)
|
||||
if (errno == ENXIO && offline != 1 && update_state)
|
||||
{
|
||||
fputs("STATE: +offline-report\n", stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Printer is currently offline.\n"));
|
||||
@@ -266,7 +275,8 @@ backendRunLoop(
|
||||
* loop since it may have read from print_fd...
|
||||
*/
|
||||
|
||||
(*side_cb)(print_fd, device_fd, snmp_fd, addr, use_bc);
|
||||
if ((*side_cb)(print_fd, device_fd, snmp_fd, addr, use_bc))
|
||||
side_cb = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -342,7 +352,7 @@ backendRunLoop(
|
||||
|
||||
if (errno == ENOSPC)
|
||||
{
|
||||
if (paperout != 1)
|
||||
if (paperout != 1 && update_state)
|
||||
{
|
||||
fputs("STATE: +media-empty-warning\n", stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Out of paper!\n"));
|
||||
@@ -351,7 +361,7 @@ backendRunLoop(
|
||||
}
|
||||
else if (errno == ENXIO)
|
||||
{
|
||||
if (offline != 1)
|
||||
if (offline != 1 && update_state)
|
||||
{
|
||||
fputs("STATE: +offline-report\n", stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Printer is currently off-line.\n"));
|
||||
@@ -367,13 +377,13 @@ backendRunLoop(
|
||||
}
|
||||
else
|
||||
{
|
||||
if (paperout)
|
||||
if (paperout && update_state)
|
||||
{
|
||||
fputs("STATE: -media-empty-warning\n", stderr);
|
||||
paperout = 0;
|
||||
}
|
||||
|
||||
if (offline)
|
||||
if (offline && update_state)
|
||||
{
|
||||
fputs("STATE: -offline-report\n", stderr);
|
||||
_cupsLangPuts(stderr, _("INFO: Printer is now online.\n"));
|
||||
|
||||
+9
-11
@@ -84,7 +84,7 @@
|
||||
*/
|
||||
|
||||
static void list_devices(void);
|
||||
static void side_cb(int print_fd, int device_fd, int use_bc);
|
||||
static int side_cb(int print_fd, int device_fd, int use_bc);
|
||||
|
||||
|
||||
/*
|
||||
@@ -109,7 +109,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
sep; /* Option separator */
|
||||
int port; /* Port number (not used) */
|
||||
int copies; /* Number of copies to print */
|
||||
int print_fd, /* Print file */
|
||||
int side_eof = 0, /* Saw EOF on side-channel? */
|
||||
print_fd, /* Print file */
|
||||
device_fd; /* Serial device */
|
||||
int nfds; /* Maximum file descriptor value + 1 */
|
||||
fd_set input, /* Input set for reading */
|
||||
@@ -558,7 +559,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
if (!print_bytes)
|
||||
FD_SET(print_fd, &input);
|
||||
FD_SET(device_fd, &input);
|
||||
if (!print_bytes)
|
||||
if (!print_bytes && !side_eof)
|
||||
FD_SET(CUPS_SC_FD, &input);
|
||||
|
||||
FD_ZERO(&output);
|
||||
@@ -579,7 +580,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
* loop since it may have read from print_fd...
|
||||
*/
|
||||
|
||||
side_cb(print_fd, device_fd, 1);
|
||||
if (side_cb(print_fd, device_fd, 1))
|
||||
side_eof = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1278,7 +1280,7 @@ list_devices(void)
|
||||
* 'side_cb()' - Handle side-channel requests...
|
||||
*/
|
||||
|
||||
static void
|
||||
static int /* O - 0 on success, -1 on error */
|
||||
side_cb(int print_fd, /* I - Print file */
|
||||
int device_fd, /* I - Device file */
|
||||
int use_bc) /* I - Using back-channel? */
|
||||
@@ -1292,11 +1294,7 @@ side_cb(int print_fd, /* I - Print file */
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
_cupsLangPuts(stderr,
|
||||
_("WARNING: Failed to read side-channel request!\n"));
|
||||
return;
|
||||
}
|
||||
return (-1);
|
||||
|
||||
switch (command)
|
||||
{
|
||||
@@ -1323,7 +1321,7 @@ side_cb(int print_fd, /* I - Print file */
|
||||
break;
|
||||
}
|
||||
|
||||
cupsSideChannelWrite(command, status, data, datalen, 1.0);
|
||||
return (cupsSideChannelWrite(command, status, data, datalen, 1.0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -229,8 +229,13 @@ backendSNMPSupplies(
|
||||
packet.object_type != CUPS_ASN1_OCTET_STRING)
|
||||
return (-1);
|
||||
|
||||
new_state = (packet.object_value.string.bytes[0] << 8) |
|
||||
packet.object_value.string.bytes[1];
|
||||
if (packet.object_value.string.num_bytes == 2)
|
||||
new_state = (packet.object_value.string.bytes[0] << 8) |
|
||||
packet.object_value.string.bytes[1];
|
||||
else if (packet.object_value.string.num_bytes == 1)
|
||||
new_state = (packet.object_value.string.bytes[0] << 8);
|
||||
else
|
||||
new_state = 0;
|
||||
|
||||
if (current_state < 0)
|
||||
change_state = 0xffff;
|
||||
|
||||
+5
-3
@@ -999,7 +999,7 @@ read_snmp_response(int fd) /* I - SNMP socket file descriptor */
|
||||
DEVICE_PRODUCT, LexmarkProductOID2);
|
||||
_cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
|
||||
packet.community, CUPS_ASN1_GET_REQUEST,
|
||||
DEVICE_URI, LexmarkDeviceIdOID);
|
||||
DEVICE_ID, LexmarkDeviceIdOID);
|
||||
_cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
|
||||
packet.community, CUPS_ASN1_GET_REQUEST,
|
||||
DEVICE_PRODUCT, XeroxProductOID);
|
||||
@@ -1054,7 +1054,9 @@ read_snmp_response(int fd) /* I - SNMP socket file descriptor */
|
||||
break;
|
||||
|
||||
case DEVICE_ID :
|
||||
if (device && packet.object_type == CUPS_ASN1_OCTET_STRING)
|
||||
if (device && packet.object_type == CUPS_ASN1_OCTET_STRING &&
|
||||
(!device->id ||
|
||||
strlen(device->id) < packet.object_value.string.num_bytes))
|
||||
{
|
||||
/*
|
||||
* Update an existing cache entry...
|
||||
@@ -1107,7 +1109,7 @@ read_snmp_response(int fd) /* I - SNMP socket file descriptor */
|
||||
|
||||
case DEVICE_URI :
|
||||
if (device && packet.object_type == CUPS_ASN1_OCTET_STRING &&
|
||||
!device->uri)
|
||||
!device->uri && packet.object_value.string.num_bytes > 0)
|
||||
{
|
||||
/*
|
||||
* Update an existing cache entry...
|
||||
|
||||
+9
-13
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* AppSocket backend for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2007-2008 by Apple Inc.
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -62,7 +62,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
const char *device_uri; /* Device URI */
|
||||
char method[255], /* Method in URI */
|
||||
char scheme[255], /* Scheme in URI */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info (not used) */
|
||||
resource[1024], /* Resource info (not used) */
|
||||
@@ -168,9 +168,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
if ((device_uri = cupsBackendDeviceURI(argv)) == NULL)
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
|
||||
httpSeparateURI(HTTP_URI_CODING_ALL, device_uri,
|
||||
method, sizeof(method), username, sizeof(username),
|
||||
hostname, sizeof(hostname), &port,
|
||||
httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme),
|
||||
username, sizeof(username), hostname, sizeof(hostname), &port,
|
||||
resource, sizeof(resource));
|
||||
|
||||
if (port == 0)
|
||||
@@ -261,6 +260,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
sprintf(portname, "%d", port);
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname);
|
||||
|
||||
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
|
||||
@@ -270,12 +270,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
fprintf(stderr, "DEBUG: Connecting to %s:%d\n",
|
||||
hostname, port);
|
||||
fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port);
|
||||
_cupsLangPuts(stderr, _("INFO: Connecting to printer...\n"));
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
|
||||
for (delay = 5;;)
|
||||
{
|
||||
if ((addr = httpAddrConnect(addrlist, &device_fd)) == NULL)
|
||||
@@ -345,9 +342,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
if (recoverable)
|
||||
{
|
||||
/*
|
||||
* If we've shown a recoverable error make sure the printer proxies
|
||||
* have a chance to see the recovered message. Not pretty but
|
||||
* necessary for now...
|
||||
* If we've shown a recoverable error make sure the printer proxies have a
|
||||
* chance to see the recovered message. Not pretty but necessary for now...
|
||||
*/
|
||||
|
||||
fputs("INFO: recovered: \n", stderr);
|
||||
@@ -397,7 +393,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
lseek(print_fd, 0, SEEK_SET);
|
||||
}
|
||||
|
||||
tbytes = backendRunLoop(print_fd, device_fd, snmp_fd, &(addr->addr), 1,
|
||||
tbytes = backendRunLoop(print_fd, device_fd, snmp_fd, &(addr->addr), 1, 0,
|
||||
backendNetworkSideCB);
|
||||
|
||||
if (print_fd != 0 && tbytes >= 0)
|
||||
|
||||
+83
-70
@@ -104,6 +104,14 @@
|
||||
extern char **environ;
|
||||
|
||||
|
||||
/*
|
||||
* DEBUG_WRITES, if defined, causes the backend to write data to the printer in
|
||||
* 512 byte increments, up to 8192 bytes, to make debugging with a USB bus
|
||||
* analyzer easier.
|
||||
*/
|
||||
|
||||
#define DEBUG_WRITES 0
|
||||
|
||||
/*
|
||||
* WAIT_EOF_DELAY is number of seconds we'll wait for responses from
|
||||
* the printer after we've finished sending all the data
|
||||
@@ -232,6 +240,9 @@ typedef struct globals_s
|
||||
|
||||
int print_fd; /* File descriptor to print */
|
||||
ssize_t print_bytes; /* Print bytes read */
|
||||
#if DEBUG_WRITES
|
||||
ssize_t debug_bytes; /* Current bytes to read */
|
||||
#endif /* DEBUG_WRITES */
|
||||
|
||||
Boolean wait_eof;
|
||||
int drain_output; /* Drain all pending output */
|
||||
@@ -281,9 +292,8 @@ static void status_timer_cb(CFRunLoopTimerRef timer, void *info);
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
static pid_t child_pid; /* Child PID */
|
||||
static void run_legacy_backend(int argc, char *argv[], int fd); /* Starts child backend process running as a ppc executable */
|
||||
#endif /* __i386__ || __x86_64__ */
|
||||
static int job_canceled = 0; /* Was the job canceled? */
|
||||
static void sigterm_handler(int sig); /* SIGTERM handler */
|
||||
#endif /* __i386__ || __x86_64__ */
|
||||
|
||||
#ifdef PARSE_PS_ERRORS
|
||||
static const char *next_line (const char *buffer);
|
||||
@@ -318,8 +328,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
{
|
||||
char serial[1024]; /* Serial number buffer */
|
||||
OSStatus status; /* Function results */
|
||||
IOReturn iostatus, /* Current IO status */
|
||||
prev_iostatus = 0; /* Previous IO status */
|
||||
IOReturn iostatus; /* Current IO status */
|
||||
pthread_t read_thread_id, /* Read thread */
|
||||
sidechannel_thread_id;/* Side-channel thread */
|
||||
int have_sidechannel = 0; /* Was the side-channel thread started? */
|
||||
@@ -364,12 +373,12 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (!g.make || !g.model)
|
||||
{
|
||||
_cupsLangPuts(stderr, _("ERROR: Fatal USB error!\n"));
|
||||
_cupsLangPuts(stderr, _("ERROR: Fatal USB error\n"));
|
||||
|
||||
if (!g.make)
|
||||
fputs("DEBUG: USB make string is NULL!\n", stderr);
|
||||
fputs("DEBUG: USB make string is NULL\n", stderr);
|
||||
if (!g.model)
|
||||
fputs("DEBUG: USB model string is NULL!\n", stderr);
|
||||
fputs("DEBUG: USB model string is NULL\n", stderr);
|
||||
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
@@ -422,7 +431,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);
|
||||
_cupsLangPuts(stderr, _("ERROR: Fatal USB error!\n"));
|
||||
_cupsLangPuts(stderr, _("ERROR: Fatal USB error\n"));
|
||||
fprintf(stderr, "DEBUG: Could not load %s\n", print_buffer);
|
||||
|
||||
if (driverBundlePath)
|
||||
@@ -451,9 +460,9 @@ print_device(const char *uri, /* I - Device URI */
|
||||
fputs("STATE: -connecting-to-device\n", stderr);
|
||||
|
||||
/*
|
||||
* Now that we are "connected" to the port, catch SIGTERM so that we
|
||||
* Now that we are "connected" to the port, ignore SIGTERM so that we
|
||||
* can finish out any page data the driver sends (e.g. to eject the
|
||||
* current page... Only catch SIGTERM if we are printing data from
|
||||
* current page... Only ignore SIGTERM if we are printing data from
|
||||
* stdin (otherwise you can't cancel raw jobs...)
|
||||
*/
|
||||
|
||||
@@ -465,7 +474,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
memset(&action, 0, sizeof(action));
|
||||
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_handler = sigterm_handler;
|
||||
action.sa_handler = SIG_IGN;
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
}
|
||||
|
||||
@@ -487,8 +496,9 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (pthread_create(&sidechannel_thread_id, NULL, sidechannel_thread, NULL))
|
||||
{
|
||||
_cupsLangPuts(stderr, _("ERROR: Fatal USB error!\n"));
|
||||
fputs("DEBUG: Couldn't create side-channel thread!\n", stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Fatal USB error\n"));
|
||||
fputs("DEBUG: Couldn't create side-channel thread\n", stderr);
|
||||
registry_close();
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
}
|
||||
@@ -505,8 +515,9 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (pthread_create(&read_thread_id, NULL, read_thread, NULL))
|
||||
{
|
||||
_cupsLangPuts(stderr, _("ERROR: Fatal USB error!\n"));
|
||||
fputs("DEBUG: Couldn't create read thread!\n", stderr);
|
||||
_cupsLangPuts(stderr, _("ERROR: Fatal USB error\n"));
|
||||
fputs("DEBUG: Couldn't create read thread\n", stderr);
|
||||
registry_close();
|
||||
return (CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
@@ -584,14 +595,16 @@ print_device(const char *uri, /* I - Device URI */
|
||||
if (errno == EINTR && total_bytes == 0)
|
||||
{
|
||||
fputs("DEBUG: Received an interrupt before any bytes were "
|
||||
"written, aborting!\n", stderr);
|
||||
"written, aborting\n", stderr);
|
||||
registry_close();
|
||||
return (CUPS_BACKEND_OK);
|
||||
}
|
||||
else if (errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
_cupsLangPuts(stderr, _("ERROR: Unable to read print data!\n"));
|
||||
_cupsLangPuts(stderr, _("ERROR: Unable to read print data\n"));
|
||||
perror("DEBUG: select");
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
registry_close();
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -612,7 +625,16 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (FD_ISSET(print_fd, &input_set))
|
||||
{
|
||||
#if DEBUG_WRITES
|
||||
g.debug_bytes += 512;
|
||||
if (g.debug_bytes > sizeof(print_buffer))
|
||||
g.debug_bytes = 512;
|
||||
|
||||
g.print_bytes = read(print_fd, print_buffer, g.debug_bytes);
|
||||
|
||||
#else
|
||||
g.print_bytes = read(print_fd, print_buffer, sizeof(print_buffer));
|
||||
#endif /* DEBUG_WRITES */
|
||||
|
||||
if (g.print_bytes < 0)
|
||||
{
|
||||
@@ -622,8 +644,9 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
{
|
||||
_cupsLangPuts(stderr, _("ERROR: Unable to read print data!\n"));
|
||||
_cupsLangPuts(stderr, _("ERROR: Unable to read print data\n"));
|
||||
perror("DEBUG: read");
|
||||
registry_close();
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
|
||||
@@ -646,8 +669,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (g.print_bytes)
|
||||
{
|
||||
bytes = g.print_bytes;
|
||||
|
||||
bytes = g.print_bytes;
|
||||
iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
|
||||
|
||||
/*
|
||||
@@ -657,50 +679,41 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
if (iostatus == kIOUSBTransactionTimeout)
|
||||
{
|
||||
fputs("DEBUG: Got USB transaction timeout during write!\n", stderr);
|
||||
fputs("DEBUG: Got USB transaction timeout during write\n", stderr);
|
||||
iostatus = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore the first stall error we get since we try to clear any stalls
|
||||
* in the class driver...
|
||||
* If we've stalled, retry the write...
|
||||
*/
|
||||
|
||||
else if (iostatus == kIOUSBPipeStalled)
|
||||
{
|
||||
fputs("DEBUG: Got USB pipe stalled during write!\n", stderr);
|
||||
fputs("DEBUG: Got USB pipe stalled during write\n", stderr);
|
||||
|
||||
bytes = 0;
|
||||
|
||||
if (prev_iostatus != kIOUSBPipeStalled)
|
||||
{
|
||||
prev_iostatus = iostatus;
|
||||
iostatus = 0;
|
||||
}
|
||||
bytes = g.print_bytes;
|
||||
iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore the first "aborted" status we get, since we might have
|
||||
* received a signal (<rdar://problem/6860126>)...
|
||||
* Retry a write after an aborted write since we probably just got
|
||||
* SIGTERM (<rdar://problem/6860126>)...
|
||||
*/
|
||||
|
||||
else if (iostatus == kIOReturnAborted)
|
||||
{
|
||||
fputs("DEBUG: Got return aborted during write!\n", stderr);
|
||||
fputs("DEBUG: Got USB return aborted during write\n", stderr);
|
||||
|
||||
IOReturn err = (*g.classdriver)->Abort(g.classdriver);
|
||||
fprintf(stderr, "DEBUG: USB class driver Abort returned %x\n", err);
|
||||
|
||||
bytes = 0;
|
||||
#if DEBUG_WRITES
|
||||
sleep(5);
|
||||
#endif /* DEBUG_WRITES */
|
||||
|
||||
if (prev_iostatus != kIOReturnAborted)
|
||||
{
|
||||
prev_iostatus = iostatus;
|
||||
iostatus = 0;
|
||||
}
|
||||
bytes = g.print_bytes;
|
||||
iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
|
||||
}
|
||||
else
|
||||
prev_iostatus = iostatus;
|
||||
|
||||
if (iostatus || bytes < 0)
|
||||
{
|
||||
@@ -708,7 +721,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
* Write error - bail if we don't see an error we can retry...
|
||||
*/
|
||||
|
||||
_cupsLangPuts(stderr, _("ERROR: Unable to send print data!\n"));
|
||||
_cupsLangPuts(stderr, _("ERROR: Unable to send print data\n"));
|
||||
fprintf(stderr, "DEBUG: USB class driver WritePipe returned %x\n",
|
||||
iostatus);
|
||||
|
||||
@@ -716,7 +729,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
fprintf(stderr, "DEBUG: USB class driver Abort returned %x\n",
|
||||
err);
|
||||
|
||||
status = job_canceled ? CUPS_BACKEND_FAILED : CUPS_BACKEND_STOP;
|
||||
status = CUPS_BACKEND_FAILED;
|
||||
break;
|
||||
}
|
||||
else if (bytes > 0)
|
||||
@@ -889,11 +902,11 @@ static void *read_thread(void *reference)
|
||||
#endif
|
||||
}
|
||||
else if (readstatus == kIOUSBTransactionTimeout)
|
||||
fputs("DEBUG: Got USB transaction timeout during write!\n", stderr);
|
||||
fputs("DEBUG: Got USB transaction timeout during read\n", stderr);
|
||||
else if (readstatus == kIOUSBPipeStalled)
|
||||
fputs("DEBUG: Got USB pipe stalled during read!\n", stderr);
|
||||
fputs("DEBUG: Got USB pipe stalled during read\n", stderr);
|
||||
else if (readstatus == kIOReturnAborted)
|
||||
fputs("DEBUG: Got return aborted during read!\n", stderr);
|
||||
fputs("DEBUG: Got USB return aborted during read\n", stderr);
|
||||
|
||||
/*
|
||||
* Make sure this loop executes no more than once every 250 miliseconds...
|
||||
@@ -935,7 +948,12 @@ sidechannel_thread(void *reference)
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
continue;
|
||||
{
|
||||
if (status == CUPS_SC_STATUS_TIMEOUT)
|
||||
continue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
switch (command)
|
||||
{
|
||||
@@ -1156,7 +1174,7 @@ static Boolean list_device_cb(void *refcon,
|
||||
snprintf(optionsstr, sizeof(optionsstr), "?location=%x", (unsigned)deviceLocation);
|
||||
|
||||
httpAssembleURI(HTTP_URI_CODING_ALL, uristr, sizeof(uristr), "usb", NULL, makestr, 0, modelstr);
|
||||
strncat(uristr, optionsstr, sizeof(uristr));
|
||||
strlcat(uristr, optionsstr, sizeof(uristr));
|
||||
|
||||
cupsBackendReport("direct", uristr, make_modelstr, make_modelstr, idstr,
|
||||
NULL);
|
||||
@@ -1893,6 +1911,7 @@ static void run_legacy_backend(int argc,
|
||||
* Setup a SIGTERM handler then block it before forking...
|
||||
*/
|
||||
|
||||
int err; /* posix_spawn result */
|
||||
struct sigaction action; /* POSIX signal action */
|
||||
sigset_t newmask, /* New signal mask */
|
||||
oldmask; /* Old signal mask */
|
||||
@@ -1941,7 +1960,7 @@ static void run_legacy_backend(int argc,
|
||||
# else
|
||||
perror("DEBUG: Unable to set binary preference to ppc");
|
||||
# endif /* __x86_64__ */
|
||||
_cupsLangPrintf(stderr, _("Unable to use legacy USB class driver!\n"));
|
||||
_cupsLangPrintf(stderr, _("Unable to use legacy USB class driver\n"));
|
||||
exit(CUPS_BACKEND_STOP);
|
||||
}
|
||||
}
|
||||
@@ -1959,11 +1978,12 @@ static void run_legacy_backend(int argc,
|
||||
|
||||
my_argv[i] = NULL;
|
||||
|
||||
if (posix_spawn(&child_pid, usbpath, NULL, &attrs, my_argv, environ))
|
||||
if ((err = posix_spawn(&child_pid, usbpath, NULL, &attrs, my_argv,
|
||||
environ)) != 0)
|
||||
{
|
||||
fprintf(stderr, "DEBUG: Unable to exec %s: %s\n", usbpath,
|
||||
strerror(errno));
|
||||
_cupsLangPrintf(stderr, _("Unable to use legacy USB class driver!\n"));
|
||||
strerror(err));
|
||||
_cupsLangPrintf(stderr, _("Unable to use legacy USB class driver\n"));
|
||||
exit(CUPS_BACKEND_STOP);
|
||||
}
|
||||
|
||||
@@ -1989,14 +2009,14 @@ static void run_legacy_backend(int argc,
|
||||
if (WIFSIGNALED(childstatus))
|
||||
{
|
||||
exitstatus = CUPS_BACKEND_STOP;
|
||||
fprintf(stderr, "DEBUG: usb(legacy) backend %d crashed on signal %d!\n",
|
||||
fprintf(stderr, "DEBUG: usb(legacy) backend %d crashed on signal %d\n",
|
||||
child_pid, WTERMSIG(childstatus));
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((exitstatus = WEXITSTATUS(childstatus)) != 0)
|
||||
fprintf(stderr,
|
||||
"DEBUG: usb(legacy) backend %d stopped with status %d!\n",
|
||||
"DEBUG: usb(legacy) backend %d stopped with status %d\n",
|
||||
child_pid, exitstatus);
|
||||
else
|
||||
fprintf(stderr, "DEBUG: usb(legacy) backend %d exited with no errors\n",
|
||||
@@ -2011,8 +2031,6 @@ static void run_legacy_backend(int argc,
|
||||
|
||||
exit(exitstatus);
|
||||
}
|
||||
#endif /* __i386__ || __x86_64__ */
|
||||
|
||||
|
||||
/*
|
||||
* 'sigterm_handler()' - SIGTERM handler.
|
||||
@@ -2021,7 +2039,8 @@ static void run_legacy_backend(int argc,
|
||||
static void
|
||||
sigterm_handler(int sig) /* I - Signal */
|
||||
{
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
/* If we started a child process pass the signal on to it...
|
||||
*/
|
||||
if (child_pid)
|
||||
{
|
||||
/*
|
||||
@@ -2039,19 +2058,14 @@ sigterm_handler(int sig) /* I - Signal */
|
||||
exit(0);
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "DEBUG: Child crashed on signal %d!\n", status);
|
||||
fprintf(stderr, "DEBUG: Child crashed on signal %d\n", status);
|
||||
exit(CUPS_BACKEND_STOP);
|
||||
}
|
||||
}
|
||||
#endif /* __i386__ || __x86_64__ */
|
||||
|
||||
/*
|
||||
* Otherwise just flag that the job has been canceled...
|
||||
*/
|
||||
|
||||
job_canceled = 1;
|
||||
}
|
||||
|
||||
#endif /* __i386__ || __x86_64__ */
|
||||
|
||||
|
||||
#ifdef PARSE_PS_ERRORS
|
||||
/*
|
||||
@@ -2201,12 +2215,11 @@ static void get_device_id(cups_sc_status_t *status,
|
||||
char *data,
|
||||
int *datalen)
|
||||
{
|
||||
UInt32 deviceLocation = 0;
|
||||
UInt8 interfaceNum = 0;
|
||||
CFStringRef deviceIDString = NULL;
|
||||
|
||||
/* GetDeviceID */
|
||||
copy_devicestring(g.printer_obj, &deviceIDString, &deviceLocation, &interfaceNum);
|
||||
copy_deviceid(g.classdriver, &deviceIDString);
|
||||
|
||||
if (deviceIDString)
|
||||
{
|
||||
CFStringGetCString(deviceIDString, data, *datalen, kCFStringEncodingUTF8);
|
||||
|
||||
+23
-10
@@ -158,7 +158,16 @@ print_device(const char *uri, /* I - Device URI */
|
||||
|
||||
while (poll(pfds, 2, -1) > 0)
|
||||
{
|
||||
if (pfds[0].revents & POLLIN)
|
||||
/*
|
||||
* CUPS STR #3318: USB process hangs on end-of-file, making further
|
||||
* printing impossible
|
||||
*
|
||||
* From a strict interpretation of POSIX poll(), POLLHUP should never be
|
||||
* set without POLLIN, since POLLIN is the event you request. That said,
|
||||
* it appears that some versions of Linux break this.
|
||||
*/
|
||||
|
||||
if (pfds[0].revents & (POLLIN | POLLHUP))
|
||||
{
|
||||
if ((bytes = read(print_fd, buffer, sizeof(buffer))) > 0)
|
||||
{
|
||||
@@ -178,8 +187,13 @@ print_device(const char *uri, /* I - Device URI */
|
||||
break;
|
||||
}
|
||||
|
||||
if (pfds[1].revents & POLLIN)
|
||||
tbytes += side_cb(printer, print_fd);
|
||||
if (pfds[1].revents & (POLLIN | POLLHUP))
|
||||
{
|
||||
if ((bytes = side_cb(printer, print_fd)) < 0)
|
||||
pfds[1].events = 0; /* Filter has gone away... */
|
||||
else
|
||||
tbytes += bytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -418,12 +432,14 @@ get_device_id(usb_printer_t *printer, /* I - Printer */
|
||||
* and then limit the length to the size of our buffer...
|
||||
*/
|
||||
|
||||
if (length > (bufsize - 2))
|
||||
if (length > bufsize)
|
||||
length = (((unsigned)buffer[1] & 255) << 8) +
|
||||
((unsigned)buffer[0] & 255);
|
||||
|
||||
if (length > (bufsize - 2))
|
||||
length = bufsize - 2;
|
||||
if (length > bufsize)
|
||||
length = bufsize;
|
||||
|
||||
length -= 2;
|
||||
|
||||
/*
|
||||
* Copy the device ID text to the beginning of the buffer and
|
||||
@@ -743,10 +759,7 @@ side_cb(usb_printer_t *printer, /* I - Printer */
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
|
||||
return (0);
|
||||
}
|
||||
return (-1);
|
||||
|
||||
switch (command)
|
||||
{
|
||||
|
||||
+7
-10
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* This file is included from "usb.c" when compiled on UNIX/Linux.
|
||||
*
|
||||
* Copyright 2007-2008 by Apple Inc.
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -36,7 +36,7 @@
|
||||
*/
|
||||
|
||||
static int open_device(const char *uri, int *use_bc);
|
||||
static void side_cb(int print_fd, int device_fd, int snmp_fd,
|
||||
static int side_cb(int print_fd, int device_fd, int snmp_fd,
|
||||
http_addr_t *addr, int use_bc);
|
||||
|
||||
|
||||
@@ -187,10 +187,10 @@ print_device(const char *uri, /* I - Device URI */
|
||||
* select() or poll(), so we can't support the sidechannel either...
|
||||
*/
|
||||
|
||||
tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, NULL);
|
||||
tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, NULL);
|
||||
|
||||
#else
|
||||
tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, side_cb);
|
||||
tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb);
|
||||
#endif /* __sun */
|
||||
|
||||
if (print_fd != 0 && tbytes >= 0)
|
||||
@@ -560,7 +560,7 @@ open_device(const char *uri, /* I - Device URI */
|
||||
* 'side_cb()' - Handle side-channel requests...
|
||||
*/
|
||||
|
||||
static void
|
||||
static int /* O - 0 on success, -1 on error */
|
||||
side_cb(int print_fd, /* I - Print file */
|
||||
int device_fd, /* I - Device file */
|
||||
int snmp_fd, /* I - SNMP socket (unused) */
|
||||
@@ -579,10 +579,7 @@ side_cb(int print_fd, /* I - Print file */
|
||||
datalen = sizeof(data);
|
||||
|
||||
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
|
||||
{
|
||||
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
|
||||
return;
|
||||
}
|
||||
return (-1);
|
||||
|
||||
switch (command)
|
||||
{
|
||||
@@ -625,7 +622,7 @@ side_cb(int print_fd, /* I - Print file */
|
||||
break;
|
||||
}
|
||||
|
||||
cupsSideChannelWrite(command, status, data, datalen, 1.0);
|
||||
return (cupsSideChannelWrite(command, status, data, datalen, 1.0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
+17
-1
@@ -340,7 +340,18 @@ show_jobs(const char *command, /* I - Command name */
|
||||
char resource[1024]; /* Resource string */
|
||||
char rankstr[255]; /* Rank string */
|
||||
char namestr[1024]; /* Job name string */
|
||||
static const char *ranks[10] = /* Ranking strings */
|
||||
static const char * const jobattrs[] =/* Job attributes we want to see */
|
||||
{
|
||||
"copies",
|
||||
"job-id",
|
||||
"job-k-octets",
|
||||
"job-name",
|
||||
"job-originating-user-name",
|
||||
"job-printer-uri",
|
||||
"job-priority",
|
||||
"job-state"
|
||||
};
|
||||
static const char * const ranks[10] = /* Ranking strings */
|
||||
{
|
||||
"th",
|
||||
"st",
|
||||
@@ -368,6 +379,7 @@ show_jobs(const char *command, /* I - Command name */
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* job-uri or printer-uri
|
||||
* requested-attributes
|
||||
*/
|
||||
|
||||
request = ippNewRequest(id ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS);
|
||||
@@ -397,6 +409,10 @@ show_jobs(const char *command, /* I - Command name */
|
||||
ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
|
||||
}
|
||||
|
||||
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes",
|
||||
(int)(sizeof(jobattrs) / sizeof(jobattrs[0])), NULL, jobattrs);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
+160
-59
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Administration CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 2007-2010 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -52,8 +52,7 @@
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static int current_device; /* Current device for add/modify */
|
||||
static time_t last_device_time; /* Last update time for device list */
|
||||
static int current_device = 0; /* Current device shown */
|
||||
|
||||
|
||||
/*
|
||||
@@ -122,6 +121,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
*/
|
||||
|
||||
cgiSetVariable("SECTION", "admin");
|
||||
cgiSetVariable("REFRESH_PAGE", "");
|
||||
|
||||
/*
|
||||
* See if we have form data...
|
||||
@@ -191,7 +191,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
}
|
||||
else if (op && !strcmp(op, "redirect"))
|
||||
{
|
||||
const char *url; /* Redirection URL... */
|
||||
const char *url; /* Redirection URL... */
|
||||
char prefix[1024]; /* URL prefix */
|
||||
|
||||
|
||||
@@ -205,7 +205,50 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
fprintf(stderr, "DEBUG: redirecting with prefix %s!\n", prefix);
|
||||
|
||||
if ((url = cgiGetVariable("URL")) != NULL)
|
||||
printf("Location: %s%s\n\n", prefix, url);
|
||||
{
|
||||
char encoded[1024], /* Encoded URL string */
|
||||
*ptr; /* Pointer into encoded string */
|
||||
|
||||
|
||||
ptr = encoded;
|
||||
if (*url != '/')
|
||||
*ptr++ = '/';
|
||||
|
||||
for (; *url && ptr < (encoded + sizeof(encoded) - 4); url ++)
|
||||
{
|
||||
if (strchr("%@&+ <>#=", *url) || *url < ' ' || *url & 128)
|
||||
{
|
||||
/*
|
||||
* Percent-encode this character; safe because we have at least 4
|
||||
* bytes left in the array...
|
||||
*/
|
||||
|
||||
sprintf(ptr, "%%%02X", *url & 255);
|
||||
ptr += 3;
|
||||
}
|
||||
else
|
||||
*ptr++ = *url;
|
||||
}
|
||||
|
||||
*ptr = '\0';
|
||||
|
||||
if (*url)
|
||||
{
|
||||
/*
|
||||
* URL was too long, just redirect to the admin page...
|
||||
*/
|
||||
|
||||
printf("Location: %s/admin\n\n", prefix);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* URL is OK, redirect there...
|
||||
*/
|
||||
|
||||
printf("Location: %s%s\n\n", prefix, encoded);
|
||||
}
|
||||
}
|
||||
else
|
||||
printf("Location: %s/admin\n\n", prefix);
|
||||
}
|
||||
@@ -248,6 +291,21 @@ choose_device_cb(
|
||||
const char *device_location, /* I - Location */
|
||||
const char *title) /* I - Page title */
|
||||
{
|
||||
/*
|
||||
* For modern browsers, start a multi-part page so we can show that something
|
||||
* is happening. Non-modern browsers just get everything at the end...
|
||||
*/
|
||||
|
||||
if (current_device == 0 && cgiSupportsMultipart())
|
||||
{
|
||||
cgiStartMultipart();
|
||||
cgiStartHTML(title);
|
||||
cgiCopyTemplateLang("choose-device.tmpl");
|
||||
cgiEndHTML();
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Add the device to the array...
|
||||
*/
|
||||
@@ -260,23 +318,6 @@ choose_device_cb(
|
||||
cgiSetArray("device_location", current_device, device_location);
|
||||
|
||||
current_device ++;
|
||||
|
||||
if (time(NULL) > last_device_time && cgiSupportsMultipart())
|
||||
{
|
||||
/*
|
||||
* Update the page...
|
||||
*/
|
||||
|
||||
if (!last_device_time)
|
||||
cgiStartMultipart();
|
||||
|
||||
cgiStartHTML(title);
|
||||
cgiCopyTemplateLang("choose-device.tmpl");
|
||||
cgiEndHTML();
|
||||
fflush(stdout);
|
||||
|
||||
time(&last_device_time);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -345,6 +386,31 @@ do_add_rss_subscription(http_t *http) /* I - HTTP connection */
|
||||
* and classes and (re)show the add page...
|
||||
*/
|
||||
|
||||
if (cgiGetVariable("EVENT_JOB_CREATED"))
|
||||
cgiSetVariable("EVENT_JOB_CREATED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_JOB_COMPLETED"))
|
||||
cgiSetVariable("EVENT_JOB_COMPLETED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_JOB_STOPPED"))
|
||||
cgiSetVariable("EVENT_JOB_STOPPED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_JOB_CONFIG_CHANGED"))
|
||||
cgiSetVariable("EVENT_JOB_CONFIG_CHANGED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_PRINTER_STOPPED"))
|
||||
cgiSetVariable("EVENT_PRINTER_STOPPED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_PRINTER_ADDED"))
|
||||
cgiSetVariable("EVENT_PRINTER_ADDED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_PRINTER_MODIFIED"))
|
||||
cgiSetVariable("EVENT_PRINTER_MODIFIED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_PRINTER_DELETED"))
|
||||
cgiSetVariable("EVENT_PRINTER_DELETED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_SERVER_STARTED"))
|
||||
cgiSetVariable("EVENT_SERVER_STARTED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_SERVER_STOPPED"))
|
||||
cgiSetVariable("EVENT_SERVER_STOPPED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_SERVER_RESTARTED"))
|
||||
cgiSetVariable("EVENT_SERVER_RESTARTED", "CHECKED");
|
||||
if (cgiGetVariable("EVENT_SERVER_AUDIT"))
|
||||
cgiSetVariable("EVENT_SERVER_AUDIT", "CHECKED");
|
||||
|
||||
request = ippNewRequest(CUPS_GET_PRINTERS);
|
||||
response = cupsDoRequest(http, request, "/");
|
||||
|
||||
@@ -467,6 +533,7 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
ipp_attribute_t *attr; /* member-uris attribute */
|
||||
char uri[HTTP_MAX_URI]; /* Device or printer URI */
|
||||
const char *name, /* Pointer to class name */
|
||||
*op, /* Operation name */
|
||||
*ptr; /* Pointer to CGI variable */
|
||||
const char *title; /* Title of page */
|
||||
static const char * const pattrs[] = /* Requested printer attributes */
|
||||
@@ -478,6 +545,7 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
|
||||
|
||||
title = cgiText(modify ? _("Modify Class") : _("Add Class"));
|
||||
op = cgiGetVariable("OP");
|
||||
name = cgiGetVariable("PRINTER_NAME");
|
||||
|
||||
if (cgiGetVariable("PRINTER_LOCATION") == NULL)
|
||||
@@ -492,10 +560,22 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
|
||||
request = ippNewRequest(CUPS_GET_PRINTERS);
|
||||
|
||||
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type",
|
||||
CUPS_PRINTER_LOCAL);
|
||||
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask",
|
||||
CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE |
|
||||
CUPS_PRINTER_IMPLICIT);
|
||||
|
||||
/*
|
||||
* Do the request and get back a response...
|
||||
*/
|
||||
|
||||
cgiClearVariables();
|
||||
if (op)
|
||||
cgiSetVariable("OP", op);
|
||||
if (name)
|
||||
cgiSetVariable("PRINTER_NAME", name);
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
/*
|
||||
@@ -628,6 +708,15 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
return;
|
||||
}
|
||||
|
||||
if (!name)
|
||||
{
|
||||
cgiStartHTML(title);
|
||||
cgiSetVariable("ERROR", cgiText(_("Missing form variable!")));
|
||||
cgiCopyTemplateLang("error.tmpl");
|
||||
cgiEndHTML();
|
||||
return;
|
||||
}
|
||||
|
||||
for (ptr = name; *ptr; ptr ++)
|
||||
if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || *ptr == '#')
|
||||
break;
|
||||
@@ -662,8 +751,7 @@ do_am_class(http_t *http, /* I - HTTP connection */
|
||||
request = ippNewRequest(CUPS_ADD_CLASS);
|
||||
|
||||
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
|
||||
"localhost", 0, "/classes/%s",
|
||||
cgiGetVariable("PRINTER_NAME"));
|
||||
"localhost", 0, "/classes/%s", name);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
|
||||
NULL, uri);
|
||||
|
||||
@@ -881,7 +969,8 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
if (isalnum(*uriptr & 255) || *uriptr == '_' || *uriptr == '-' ||
|
||||
*uriptr == '.')
|
||||
*tptr++ = *uriptr;
|
||||
else if ((*uriptr == ' ' || *uriptr == '/') && tptr[-1] != '_')
|
||||
else if ((*uriptr == ' ' || *uriptr == '/') && tptr > template &&
|
||||
tptr[-1] != '_')
|
||||
*tptr++ = '_';
|
||||
else if (*uriptr == '?' || *uriptr == '(')
|
||||
break;
|
||||
@@ -910,31 +999,28 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
}
|
||||
|
||||
/*
|
||||
* Scan for devices for up to 30 seconds, updating the page as we find
|
||||
* them...
|
||||
* Scan for devices for up to 30 seconds...
|
||||
*/
|
||||
|
||||
fputs("DEBUG: Getting list of devices...\n", stderr);
|
||||
|
||||
last_device_time = 0;
|
||||
current_device = 0;
|
||||
current_device = 0;
|
||||
if (cupsGetDevices(http, 30, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE,
|
||||
(cups_device_cb_t)choose_device_cb,
|
||||
(void *)title) == IPP_OK)
|
||||
{
|
||||
fputs("DEBUG: Got device list!\n", stderr);
|
||||
|
||||
if (!cgiSupportsMultipart())
|
||||
{
|
||||
/*
|
||||
* Non-modern browsers that don't support multi-part documents get
|
||||
* everything at the end...
|
||||
*/
|
||||
if (cgiSupportsMultipart())
|
||||
cgiStartMultipart();
|
||||
|
||||
cgiStartHTML(title);
|
||||
cgiCopyTemplateLang("choose-device.tmpl");
|
||||
cgiEndHTML();
|
||||
}
|
||||
cgiSetVariable("CUPS_GET_DEVICES_DONE", "1");
|
||||
cgiStartHTML(title);
|
||||
cgiCopyTemplateLang("choose-device.tmpl");
|
||||
cgiEndHTML();
|
||||
|
||||
if (cgiSupportsMultipart())
|
||||
cgiEndMultipart();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -955,16 +1041,6 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Show the final selection page...
|
||||
*/
|
||||
|
||||
cgiSetVariable("CUPS_GET_DEVICES_DONE", "1");
|
||||
cgiStartHTML(title);
|
||||
cgiCopyTemplateLang("choose-device.tmpl");
|
||||
cgiEndHTML();
|
||||
cgiEndMultipart();
|
||||
}
|
||||
else if (strchr(var, '/') == NULL)
|
||||
{
|
||||
@@ -1030,6 +1106,11 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
if ((attr = ippFindAttribute(oldinfo, "printer-location",
|
||||
IPP_TAG_TEXT)) != NULL)
|
||||
cgiSetVariable("PRINTER_LOCATION", attr->values[0].string.text);
|
||||
|
||||
if ((attr = ippFindAttribute(oldinfo, "printer-is-shared",
|
||||
IPP_TAG_BOOLEAN)) != NULL)
|
||||
cgiSetVariable("PRINTER_IS_SHARED",
|
||||
attr->values[0].boolean ? "1" : "0");
|
||||
}
|
||||
|
||||
cgiCopyTemplateLang("modify-printer.tmpl");
|
||||
@@ -1165,7 +1246,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
* Got the list of PPDs, see if the user has selected a make...
|
||||
*/
|
||||
|
||||
if (cgiSetIPPVars(response, NULL, NULL, NULL, 0) == 0)
|
||||
if (cgiSetIPPVars(response, NULL, NULL, NULL, 0) == 0 && !modify)
|
||||
{
|
||||
/*
|
||||
* No PPD files with this make, try again with all makes...
|
||||
@@ -1201,8 +1282,11 @@ do_am_printer(http_t *http, /* I - HTTP connection */
|
||||
*/
|
||||
|
||||
cgiStartHTML(title);
|
||||
cgiSetVariable("CURRENT_MAKE_AND_MODEL",
|
||||
cgiGetArray("PPD_MAKE_AND_MODEL", 0));
|
||||
if (!cgiGetVariable("PPD_MAKE"))
|
||||
cgiSetVariable("PPD_MAKE", cgiGetVariable("CURRENT_MAKE"));
|
||||
if (!modify)
|
||||
cgiSetVariable("CURRENT_MAKE_AND_MODEL",
|
||||
cgiGetArray("PPD_MAKE_AND_MODEL", 0));
|
||||
cgiCopyTemplateLang("choose-model.tmpl");
|
||||
cgiEndHTML();
|
||||
}
|
||||
@@ -1494,7 +1578,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
|
||||
#ifdef HAVE_GSSAPI
|
||||
char default_auth_type[255];
|
||||
/* DefaultAuthType value */
|
||||
const char *val; /* Setting value */
|
||||
const char *val; /* Setting value */
|
||||
#endif /* HAVE_GSSAPI */
|
||||
|
||||
|
||||
@@ -1566,7 +1650,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
|
||||
strcat(local_protocols, "slp");
|
||||
}
|
||||
#endif /* HAVE_SLP */
|
||||
|
||||
|
||||
if (cgiGetVariable("BROWSE_REMOTE_CUPS"))
|
||||
strcpy(remote_protocols, "cups");
|
||||
else
|
||||
@@ -1819,7 +1903,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
|
||||
cgiSetVariable("ERROR", strerror(errno));
|
||||
cgiCopyTemplateLang("error.tmpl");
|
||||
cgiEndHTML();
|
||||
|
||||
|
||||
perror(tempfile);
|
||||
return;
|
||||
}
|
||||
@@ -1831,7 +1915,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
|
||||
cgiSetVariable("ERROR", strerror(errno));
|
||||
cgiCopyTemplateLang("error.tmpl");
|
||||
cgiEndHTML();
|
||||
|
||||
|
||||
perror(tempfile);
|
||||
close(tempfd);
|
||||
unlink(tempfile);
|
||||
@@ -2607,7 +2691,9 @@ do_menu(http_t *http) /* I - HTTP connection */
|
||||
if ((val = cupsGetOption("DefaultAuthType", num_settings,
|
||||
settings)) != NULL && !strcasecmp(val, "Negotiate"))
|
||||
cgiSetVariable("KERBEROS", "CHECKED");
|
||||
else
|
||||
#endif /* HAVE_GSSAPI */
|
||||
cgiSetVariable("KERBEROS", "");
|
||||
|
||||
#ifdef HAVE_DNSSD
|
||||
cgiSetVariable("HAVE_DNSSD", "1");
|
||||
@@ -3219,11 +3305,16 @@ do_set_options(http_t *http, /* I - HTTP connection */
|
||||
for (option = ppdFirstOption(ppd);
|
||||
option;
|
||||
option = ppdNextOption(ppd))
|
||||
{
|
||||
if ((var = cgiGetVariable(option->keyword)) != NULL)
|
||||
{
|
||||
have_options = 1;
|
||||
ppdMarkOption(ppd, option->keyword, var);
|
||||
fprintf(stderr, "DEBUG: Set %s to %s...\n", option->keyword, var);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "DEBUG: Didn't find %s...\n", option->keyword);
|
||||
}
|
||||
}
|
||||
|
||||
if (!have_options || ppdConflicts(ppd))
|
||||
@@ -3244,7 +3335,7 @@ do_set_options(http_t *http, /* I - HTTP connection */
|
||||
((ppdattr = ppdFindAttr(ppd, "cupsCommands", NULL)) != NULL &&
|
||||
ppdattr->value && strstr(ppdattr->value, "AutoConfigure")))
|
||||
cgiSetVariable("HAVE_AUTOCONFIGURE", "YES");
|
||||
else
|
||||
else
|
||||
{
|
||||
for (i = 0; i < ppd->num_filters; i ++)
|
||||
if (!strncmp(ppd->filters[i], "application/vnd.cups-postscript", 31))
|
||||
@@ -3330,6 +3421,16 @@ do_set_options(http_t *http, /* I - HTTP connection */
|
||||
{
|
||||
cgiSetArray("ckeyword", k, option->keyword);
|
||||
cgiSetArray("ckeytext", k, option->text);
|
||||
|
||||
for (m = 0; m < option->num_choices; m ++)
|
||||
{
|
||||
if (option->choices[m].marked)
|
||||
{
|
||||
cgiSetArray("cchoice", k, option->choices[m].text);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
k ++;
|
||||
}
|
||||
|
||||
@@ -3348,7 +3449,7 @@ do_set_options(http_t *http, /* I - HTTP connection */
|
||||
cgiSetVariable("GROUP", group->text);
|
||||
|
||||
cgiCopyTemplateLang("option-header.tmpl");
|
||||
|
||||
|
||||
for (j = group->num_options, option = group->options;
|
||||
j > 0;
|
||||
j --, option ++)
|
||||
@@ -3992,7 +4093,7 @@ get_option_value(
|
||||
|
||||
snprintf(buffer, bufsize, "Custom.%gx%g%s", width, length, uval);
|
||||
}
|
||||
else if (cupsArrayCount(coption->params) == 1)
|
||||
else if (cupsArrayCount(coption->params) == 1)
|
||||
{
|
||||
cparam = ppdFirstCustomParam(coption);
|
||||
snprintf(keyword, sizeof(keyword), "%s.%s", coption->keyword, cparam->name);
|
||||
|
||||
@@ -33,6 +33,14 @@
|
||||
# include "help-index.h"
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif /* __cplusplus */
|
||||
|
||||
/*
|
||||
* Types...
|
||||
*/
|
||||
@@ -54,6 +62,7 @@ typedef struct cgi_file_s /**** Uploaded file data ****/
|
||||
extern void cgiAbort(const char *title, const char *stylesheet,
|
||||
const char *format, ...);
|
||||
extern int cgiCheckVariables(const char *names);
|
||||
extern void cgiClearVariables(void);
|
||||
extern void *cgiCompileSearch(const char *query);
|
||||
extern void cgiCopyTemplateFile(FILE *out, const char *tmpl);
|
||||
extern void cgiCopyTemplateLang(const char *tmpl);
|
||||
@@ -98,6 +107,10 @@ extern void cgiStartMultipart(void);
|
||||
extern int cgiSupportsMultipart(void);
|
||||
extern const char *cgiText(const char *message);
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif /* __cplusplus */
|
||||
|
||||
#endif /* !_CUPS_CGI_H_ */
|
||||
|
||||
/*
|
||||
|
||||
@@ -72,6 +72,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
*/
|
||||
|
||||
cgiSetVariable("SECTION", "classes");
|
||||
cgiSetVariable("REFRESH_PAGE", "");
|
||||
|
||||
/*
|
||||
* See if we are displaying a printer or all classes...
|
||||
|
||||
@@ -23,6 +23,14 @@
|
||||
# include <cups/array.h>
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif /* __cplusplus */
|
||||
|
||||
/*
|
||||
* Data structures...
|
||||
*/
|
||||
@@ -68,6 +76,10 @@ extern help_index_t *helpSearchIndex(help_index_t *hi, const char *query,
|
||||
const char *filename);
|
||||
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif /* __cplusplus */
|
||||
|
||||
#endif /* !_CUPS_HELP_INDEX_H_ */
|
||||
|
||||
/*
|
||||
|
||||
+9
-2
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Online help CGI for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2007-2008 by Apple Inc.
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 1997-2006 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -63,6 +63,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
*/
|
||||
|
||||
cgiSetVariable("SECTION", "help");
|
||||
cgiSetVariable("REFRESH_PAGE", "");
|
||||
|
||||
/*
|
||||
* Load the help index...
|
||||
@@ -102,7 +103,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
*/
|
||||
|
||||
for (i = 0; i < argc; i ++)
|
||||
fprintf(stderr, "argv[%d]=\"%s\"\n", i, argv[i]);
|
||||
fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]);
|
||||
|
||||
if ((helpfile = getenv("PATH_INFO")) != NULL)
|
||||
{
|
||||
@@ -182,6 +183,12 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
topic = cgiGetVariable("TOPIC");
|
||||
si = helpSearchIndex(hi, query, topic, helpfile);
|
||||
|
||||
cgiClearVariables();
|
||||
if (query)
|
||||
cgiSetVariable("QUERY", query);
|
||||
if (topic)
|
||||
cgiSetVariable("TOPIC", topic);
|
||||
|
||||
fprintf(stderr, "DEBUG: query=\"%s\", topic=\"%s\"\n",
|
||||
query ? query : "(null)", topic ? topic : "(null)");
|
||||
|
||||
|
||||
+34
-13
@@ -333,7 +333,7 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */
|
||||
NULL, job_uri);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", NULL, "job-printer-uri");
|
||||
|
||||
|
||||
if ((response = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
if ((attr = ippFindAttribute(response, "job-printer-uri",
|
||||
@@ -650,7 +650,8 @@ cgiPrintCommand(http_t *http, /* I - Connection to server */
|
||||
cgiSetIPPVars(response, NULL, NULL, NULL, 0);
|
||||
|
||||
attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM);
|
||||
if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED)
|
||||
if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED ||
|
||||
attr->values[0].integer == IPP_JOB_HELD)
|
||||
{
|
||||
ippDelete(response);
|
||||
break;
|
||||
@@ -925,7 +926,7 @@ cgiRewriteURL(const char *uri, /* I - Current URI */
|
||||
ishttps ? "https" : "http",
|
||||
userpass, hostname, port, resource);
|
||||
else
|
||||
snprintf(url, urlsize, "%s://%s:%d%s",
|
||||
snprintf(url, urlsize, "%s://%s:%d%s",
|
||||
ishttps ? "https" : "http",
|
||||
hostname, port, resource);
|
||||
}
|
||||
@@ -1397,7 +1398,9 @@ cgiShowJobs(http_t *http, /* I - Connection to server */
|
||||
int ascending, /* Order of jobs (0 = descending) */
|
||||
first, /* First job to show */
|
||||
count; /* Number of jobs */
|
||||
const char *var; /* Form variable */
|
||||
const char *var, /* Form variable */
|
||||
*query, /* Query string */
|
||||
*section; /* Section in web interface */
|
||||
void *search; /* Search data */
|
||||
char url[1024], /* Printer URI */
|
||||
val[1024]; /* Form variable */
|
||||
@@ -1441,11 +1444,14 @@ cgiShowJobs(http_t *http, /* I - Connection to server */
|
||||
* Get a list of matching job objects.
|
||||
*/
|
||||
|
||||
if ((var = cgiGetVariable("QUERY")) != NULL &&
|
||||
if ((query = cgiGetVariable("QUERY")) != NULL &&
|
||||
!cgiGetVariable("CLEAR"))
|
||||
search = cgiCompileSearch(var);
|
||||
search = cgiCompileSearch(query);
|
||||
else
|
||||
{
|
||||
query = NULL;
|
||||
search = NULL;
|
||||
}
|
||||
|
||||
jobs = cgiGetIPPObjects(response, search);
|
||||
count = cupsArrayCount(jobs);
|
||||
@@ -1470,16 +1476,27 @@ cgiShowJobs(http_t *http, /* I - Connection to server */
|
||||
if (first < 0)
|
||||
first = 0;
|
||||
|
||||
sprintf(val, "%d", count);
|
||||
cgiSetVariable("TOTAL", val);
|
||||
|
||||
if ((var = cgiGetVariable("ORDER")) != NULL)
|
||||
ascending = !strcasecmp(var, "asc");
|
||||
else
|
||||
{
|
||||
ascending = !which_jobs || !strcasecmp(which_jobs, "not-completed");
|
||||
cgiSetVariable("ORDER", ascending ? "asc" : "dec");
|
||||
}
|
||||
|
||||
section = cgiGetVariable("SECTION");
|
||||
|
||||
cgiClearVariables();
|
||||
|
||||
if (query)
|
||||
cgiSetVariable("QUERY", query);
|
||||
|
||||
cgiSetVariable("ORDER", ascending ? "asc" : "dec");
|
||||
|
||||
cgiSetVariable("SECTION", section);
|
||||
|
||||
sprintf(val, "%d", count);
|
||||
cgiSetVariable("TOTAL", val);
|
||||
|
||||
if (which_jobs)
|
||||
cgiSetVariable("WHICH_JOBS", which_jobs);
|
||||
|
||||
if (ascending)
|
||||
{
|
||||
@@ -1501,7 +1518,11 @@ cgiShowJobs(http_t *http, /* I - Connection to server */
|
||||
*/
|
||||
|
||||
if (dest)
|
||||
snprintf(val, sizeof(val), "/%s/%s", cgiGetVariable("SECTION"), dest);
|
||||
{
|
||||
snprintf(val, sizeof(val), "/%s/%s", section, dest);
|
||||
cgiSetVariable("PRINTER_NAME", dest);
|
||||
cgiSetVariable("PRINTER_URI_SUPPORTED", val);
|
||||
}
|
||||
else
|
||||
strlcpy(val, "/jobs/", sizeof(val));
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
*/
|
||||
|
||||
cgiSetVariable("SECTION", "jobs");
|
||||
cgiSetVariable("REFRESH_PAGE", "");
|
||||
|
||||
/*
|
||||
* Connect to the HTTP server...
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
_cgiCheckVariables
|
||||
_cgiClearVariables
|
||||
_cgiCompileSearch
|
||||
_cgiCopyTemplateFile
|
||||
_cgiCopyTemplateLang
|
||||
|
||||
+12
-4
@@ -357,7 +357,7 @@ write_index(const char *path, /* I - File to write */
|
||||
|
||||
static void
|
||||
write_info(const char *path, /* I - File to write */
|
||||
const char *revision) /* I - Version number */
|
||||
const char *revision) /* I - Subversion revision number */
|
||||
{
|
||||
cups_file_t *fp; /* File */
|
||||
|
||||
@@ -379,14 +379,22 @@ write_info(const char *path, /* I - File to write */
|
||||
"\t<key>CFBundleName</key>\n"
|
||||
"\t<string>CUPS Documentation</string>\n"
|
||||
"\t<key>CFBundleVersion</key>\n"
|
||||
"\t<string>1.4.%s</string>\n"
|
||||
"\t<string>%d.%d.%s</string>\n"
|
||||
"\t<key>CFBundleShortVersionString</key>\n"
|
||||
"\t<string>%d.%d.%d</string>\n"
|
||||
"\t<key>DocSetFeedName</key>\n"
|
||||
"\t<string>cups.org</string>\n"
|
||||
"\t<key>DocSetFeedURL</key>\n"
|
||||
"\t<string>http://www.cups.org/org.cups.docset.xar"
|
||||
"\t<string>http://www.cups.org/org.cups.docset.atom"
|
||||
"</string>\n"
|
||||
"\t<key>DocSetPublisherIdentifier</key>\n"
|
||||
"\t<string>org.cups</string>\n"
|
||||
"\t<key>DocSetPublisherName</key>\n"
|
||||
"\t<string>CUPS</string>\n"
|
||||
"</dict>\n"
|
||||
"</plist>\n", revision);
|
||||
"</plist>\n",
|
||||
CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, revision,
|
||||
CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, CUPS_VERSION_PATCH);
|
||||
|
||||
cupsFileClose(fp);
|
||||
}
|
||||
|
||||
@@ -73,6 +73,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
*/
|
||||
|
||||
cgiSetVariable("SECTION", "printers");
|
||||
cgiSetVariable("REFRESH_PAGE", "");
|
||||
|
||||
/*
|
||||
* See if we are displaying a printer or all printers...
|
||||
|
||||
+13
-4
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* CGI template function.
|
||||
*
|
||||
* Copyright 2007-2008 by Apple Inc.
|
||||
* Copyright 2007-2010 by Apple Inc.
|
||||
* Copyright 1997-2006 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -119,7 +119,7 @@ cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */
|
||||
*locptr = '\0'; /* Strip charset */
|
||||
}
|
||||
|
||||
fprintf(stderr, "DEBUG: lang=\"%s\", locale=\"%s\"...\n",
|
||||
fprintf(stderr, "DEBUG2: lang=\"%s\", locale=\"%s\"...\n",
|
||||
lang ? lang : "(null)", locale);
|
||||
|
||||
/*
|
||||
@@ -437,7 +437,14 @@ cgi_copy(FILE *out, /* I - Output file */
|
||||
* Test for existance...
|
||||
*/
|
||||
|
||||
result = cgiGetArray(name, element) != NULL && outptr[0];
|
||||
if (name[0] == '?')
|
||||
result = cgiGetArray(name + 1, element) != NULL;
|
||||
else if (name[0] == '#')
|
||||
result = cgiGetVariable(name + 1) != NULL;
|
||||
else
|
||||
result = cgiGetArray(name, element) != NULL;
|
||||
|
||||
result = result && outptr[0];
|
||||
compare[0] = '\0';
|
||||
}
|
||||
else
|
||||
@@ -675,6 +682,8 @@ cgi_puts(const char *s, /* I - String to output */
|
||||
fputs(">", out);
|
||||
else if (*s == '\"')
|
||||
fputs(""", out);
|
||||
else if (*s == '\'')
|
||||
fputs("'", out);
|
||||
else if (*s == '&')
|
||||
fputs("&", out);
|
||||
else
|
||||
@@ -695,7 +704,7 @@ cgi_puturi(const char *s, /* I - String to output */
|
||||
{
|
||||
while (*s)
|
||||
{
|
||||
if (strchr("%&+ <>#=", *s) || *s & 128)
|
||||
if (strchr("%@&+ <>#=", *s) || *s < ' ' || *s & 128)
|
||||
fprintf(out, "%%%02X", *s & 255);
|
||||
else
|
||||
putc(*s, out);
|
||||
|
||||
+35
-9
@@ -15,6 +15,7 @@
|
||||
* Contents:
|
||||
*
|
||||
* cgiCheckVariables() - Check for the presence of "required" variables.
|
||||
* cgiClearVariables() - Clear all form variables.
|
||||
* cgiGetArray() - Get an element from a form array...
|
||||
* cgiGetFile() - Get the file (if any) that was submitted in the form.
|
||||
* cgiGetSize() - Get the size of a form array value.
|
||||
@@ -134,6 +135,31 @@ cgiCheckVariables(const char *names) /* I - Variables to look for */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiClearVariables()' - Clear all form variables.
|
||||
*/
|
||||
|
||||
void
|
||||
cgiClearVariables(void)
|
||||
{
|
||||
int i, j; /* Looping vars */
|
||||
_cgi_var_t *v; /* Current variable */
|
||||
|
||||
|
||||
for (v = form_vars, i = form_count; i > 0; v ++, i --)
|
||||
{
|
||||
_cupsStrFree(v->name);
|
||||
for (j = 0; j < v->nvalues; j ++)
|
||||
if (v->values[j])
|
||||
_cupsStrFree(v->values[j]);
|
||||
}
|
||||
|
||||
form_count = 0;
|
||||
|
||||
cgi_unlink_file();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cgiGetArray()' - Get an element from a form array...
|
||||
*/
|
||||
@@ -151,7 +177,7 @@ cgiGetArray(const char *name, /* I - Name of array variable */
|
||||
if (element < 0 || element >= var->nvalues)
|
||||
return (NULL);
|
||||
|
||||
return (var->values[element]);
|
||||
return (_cupsStrRetain(var->values[element]));
|
||||
}
|
||||
|
||||
|
||||
@@ -206,7 +232,7 @@ cgiGetVariable(const char *name) /* I - Name of variable */
|
||||
var->values[var->nvalues - 1]));
|
||||
#endif /* DEBUG */
|
||||
|
||||
return ((var == NULL) ? NULL : var->values[var->nvalues - 1]);
|
||||
return ((var == NULL) ? NULL : _cupsStrRetain(var->values[var->nvalues - 1]));
|
||||
}
|
||||
|
||||
|
||||
@@ -337,9 +363,9 @@ cgiSetArray(const char *name, /* I - Name of variable */
|
||||
var->nvalues = element + 1;
|
||||
}
|
||||
else if (var->values[element])
|
||||
free((char *)var->values[element]);
|
||||
_cupsStrFree((char *)var->values[element]);
|
||||
|
||||
var->values[element] = strdup(value);
|
||||
var->values[element] = _cupsStrAlloc(value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -384,7 +410,7 @@ cgiSetSize(const char *name, /* I - Name of variable */
|
||||
{
|
||||
for (i = size; i < var->nvalues; i ++)
|
||||
if (var->values[i])
|
||||
free((void *)(var->values[i]));
|
||||
_cupsStrFree((void *)(var->values[i]));
|
||||
}
|
||||
|
||||
var->nvalues = size;
|
||||
@@ -417,9 +443,9 @@ cgiSetVariable(const char *name, /* I - Name of variable */
|
||||
{
|
||||
for (i = 0; i < var->nvalues; i ++)
|
||||
if (var->values[i])
|
||||
free((char *)var->values[i]);
|
||||
_cupsStrFree((char *)var->values[i]);
|
||||
|
||||
var->values[0] = strdup(value);
|
||||
var->values[0] = _cupsStrAlloc(value);
|
||||
var->nvalues = 1;
|
||||
}
|
||||
}
|
||||
@@ -465,10 +491,10 @@ cgi_add_variable(const char *name, /* I - Variable name */
|
||||
if ((var->values = calloc(element + 1, sizeof(char *))) == NULL)
|
||||
return;
|
||||
|
||||
var->name = strdup(name);
|
||||
var->name = _cupsStrAlloc(name);
|
||||
var->nvalues = element + 1;
|
||||
var->avalues = element + 1;
|
||||
var->values[element] = strdup(value);
|
||||
var->values[element] = _cupsStrAlloc(value);
|
||||
|
||||
form_count ++;
|
||||
}
|
||||
|
||||
+1
-1
@@ -90,7 +90,7 @@ install-data:
|
||||
done
|
||||
-if test x$(PAMDIR) != x; then \
|
||||
$(INSTALL_DIR) -m 755 $(BUILDROOT)$(PAMDIR); \
|
||||
if test -r $(BUILDROOT)$(PAMDIR)/cups/$(PAMFILE) ; then \
|
||||
if test -r $(BUILDROOT)$(PAMDIR)/cups ; then \
|
||||
$(INSTALL_DATA) $(PAMFILE) $(BUILDROOT)$(PAMDIR)/cups.N ; \
|
||||
else \
|
||||
$(INSTALL_DATA) $(PAMFILE) $(BUILDROOT)$(PAMDIR)/cups ; \
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# Sample configuration file for the Common UNIX Printing System (CUPS)
|
||||
# scheduler. See "man cupsd.conf" for a complete description of this
|
||||
# file.
|
||||
# Sample configuration file for the CUPS scheduler. See "man cupsd.conf" for a
|
||||
# complete description of this file.
|
||||
#
|
||||
|
||||
# Log general information in error_log - change "@CUPS_LOG_LEVEL@" to "debug"
|
||||
|
||||
@@ -46,6 +46,7 @@ application/x-csource application/postscript 33 texttops
|
||||
application/x-perl application/postscript 33 texttops
|
||||
application/x-shell application/postscript 33 texttops
|
||||
text/plain application/postscript 33 texttops
|
||||
text/css application/postscript 33 texttops
|
||||
text/html application/postscript 33 texttops
|
||||
image/gif application/vnd.cups-postscript 66 imagetops
|
||||
image/png application/vnd.cups-postscript 66 imagetops
|
||||
|
||||
+4
-4
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# "$Id: mime.types 8652 2009-05-16 23:48:35Z mike $"
|
||||
# "$Id: mime.types 8783 2009-08-28 17:51:05Z mike $"
|
||||
#
|
||||
# MIME types file for the Common UNIX Printing System (CUPS).
|
||||
#
|
||||
@@ -95,7 +95,7 @@ application/vnd.hp-HPGL hpgl \
|
||||
|
||||
image/gif gif string(0,GIF87a) string(0,GIF89a)
|
||||
image/png png string(0,<89>PNG)
|
||||
image/jpeg jpeg jpg jpe string(0,<FFD8FF>) &&\
|
||||
image/jpeg jpeg jpg jpe string(0,<FFD8FF>) +\
|
||||
(char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
|
||||
char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
|
||||
char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
|
||||
@@ -114,7 +114,7 @@ image/x-sun-raster ras string(0,<59a66a95>)
|
||||
|
||||
#image/fpx fpx
|
||||
image/x-alias pix short(8,8) short(8,24)
|
||||
image/x-bitmap bmp string(0,BM) && !printable(2,14)
|
||||
image/x-bitmap bmp string(0,BM) + !printable(2,14)
|
||||
image/x-icon ico
|
||||
|
||||
########################################################################
|
||||
@@ -177,5 +177,5 @@ application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \
|
||||
application/octet-stream
|
||||
|
||||
#
|
||||
# End of "$Id: mime.types 8652 2009-05-16 23:48:35Z mike $".
|
||||
# End of "$Id: mime.types 8783 2009-08-28 17:51:05Z mike $".
|
||||
#
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
#%PAM-1.0
|
||||
auth required pam_unix.so shadow nodelay nullok
|
||||
account required pam_unix.so
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
auth required @PAMMOD@ nullok shadow
|
||||
auth required @PAMMODAUTH@
|
||||
account required @PAMMOD@
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-common.m4 8686 2009-05-26 23:27:06Z mike $"
|
||||
dnl "$Id: cups-common.m4 8938 2009-12-18 23:52:01Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -20,7 +20,7 @@ dnl Set the name of the config header file...
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Version number information...
|
||||
CUPS_VERSION="1.4rc1"
|
||||
CUPS_VERSION="1.4.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'`"
|
||||
@@ -142,10 +142,7 @@ else
|
||||
fi
|
||||
|
||||
dnl Check for random number functions...
|
||||
AC_CHECK_FUNCS(random mrand48 lrand48)
|
||||
|
||||
dnl Checks for mkstemp and mkstemps functions.
|
||||
AC_CHECK_FUNCS(mkstemp mkstemps)
|
||||
AC_CHECK_FUNCS(random lrand48 arc4random)
|
||||
|
||||
dnl Check for geteuid function.
|
||||
AC_CHECK_FUNCS(geteuid)
|
||||
@@ -265,15 +262,12 @@ if test "x$enable_dbus" != xno; then
|
||||
AC_DEFINE(HAVE_DBUS)
|
||||
CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE"
|
||||
CUPSDLIBS="$CUPSDLIBS `$PKGCONFIG --libs dbus-1`"
|
||||
DBUS_NOTIFIER="dbus"
|
||||
DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs dbus-1`"
|
||||
AC_CHECK_LIB(dbus-1,
|
||||
dbus_message_iter_init_append,
|
||||
AC_DEFINE(HAVE_DBUS_MESSAGE_ITER_INIT_APPEND),,
|
||||
`$PKGCONFIG --libs dbus-1`)
|
||||
if $PKGCONFIG --exists glib-2.0 && $PKGCONFIG --exists dbus-glib-1; then
|
||||
DBUS_NOTIFIER="dbus"
|
||||
DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs glib-2.0` `$PKGCONFIG --libs dbus-glib-1` `$PKGCONFIG --libs dbus-1`"
|
||||
CFLAGS="$CFLAGS `$PKGCONFIG --cflags glib-2.0`"
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
@@ -292,7 +286,6 @@ LEGACY_BACKENDS="parallel scsi"
|
||||
|
||||
case $uname in
|
||||
Darwin*)
|
||||
# FONTS=""
|
||||
LEGACY_BACKENDS=""
|
||||
BACKLIBS="$BACKLIBS -framework IOKit"
|
||||
CUPSDLIBS="$CUPSDLIBS -sectorder __TEXT __text cupsd.order -e start -framework IOKit -framework SystemConfiguration -weak_framework ApplicationServices"
|
||||
@@ -358,5 +351,5 @@ AC_SUBST(FONTS)
|
||||
AC_SUBST(LEGACY_BACKENDS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-common.m4 8686 2009-05-26 23:27:06Z mike $".
|
||||
dnl End of "$Id: cups-common.m4 8938 2009-12-18 23:52:01Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-defaults.m4 8344 2009-02-10 17:05:35Z mike $"
|
||||
dnl "$Id: cups-defaults.m4 8929 2009-12-15 22:40:37Z mike $"
|
||||
dnl
|
||||
dnl Default cupsd configuration settings for the Common UNIX Printing System
|
||||
dnl (CUPS).
|
||||
@@ -208,6 +208,10 @@ AC_ARG_WITH(cups_user, [ --with-cups-user set default user for CUPS],
|
||||
AC_MSG_RESULT(no password file, using "$CUPS_USER")
|
||||
fi)
|
||||
|
||||
if test "x$CUPS_USER" = "xroot" -o "x$CUPS_USER" = "x0"; then
|
||||
AC_MSG_ERROR([The default user for CUPS cannot be root!])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS],
|
||||
CUPS_GROUP="$withval",
|
||||
AC_MSG_CHECKING(for default print group)
|
||||
@@ -238,6 +242,10 @@ AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS],
|
||||
AC_MSG_RESULT(no group file, using "$CUPS_GROUP")
|
||||
fi)
|
||||
|
||||
if test "x$CUPS_GROUP" = "xroot" -o "x$CUPS_GROUP" = "xwheel" -o "x$CUPS_GROUP" = "x0"; then
|
||||
AC_MSG_ERROR([The default group for CUPS cannot be root!])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(system_groups, [ --with-system-groups set default system groups for CUPS],
|
||||
CUPS_SYSTEM_GROUPS="$withval",
|
||||
if test x$uname = xDarwin; then
|
||||
@@ -269,9 +277,14 @@ AC_ARG_WITH(system_groups, [ --with-system-groups set default system groups
|
||||
fi
|
||||
fi)
|
||||
|
||||
|
||||
CUPS_PRIMARY_SYSTEM_GROUP="`echo $CUPS_SYSTEM_GROUPS | awk '{print $1}'`"
|
||||
|
||||
for group in $CUPS_SYSTEM_GROUPS; do
|
||||
if test "x$CUPS_GROUP" = "x$group"; then
|
||||
AC_MSG_ERROR([The default system groups cannot contain the default CUPS group!])
|
||||
fi
|
||||
done
|
||||
|
||||
AC_SUBST(CUPS_USER)
|
||||
AC_SUBST(CUPS_GROUP)
|
||||
AC_SUBST(CUPS_SYSTEM_GROUPS)
|
||||
@@ -325,8 +338,8 @@ if test x$default_lpdconfigfile != xno; then
|
||||
CUPS_DEFAULT_LPD_CONFIG_FILE="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist"
|
||||
;;
|
||||
*)
|
||||
if test -d /etc/xinetd.d; then
|
||||
CUPS_DEFAULT_LPD_CONFIG_FILE="xinetd:///etc/xinetd.d/cups-lpd"
|
||||
if test "x$XINETD" != x; then
|
||||
CUPS_DEFAULT_LPD_CONFIG_FILE="xinetd://$XINETD/cups-lpd"
|
||||
else
|
||||
CUPS_DEFAULT_LPD_CONFIG_FILE=""
|
||||
fi
|
||||
@@ -435,5 +448,5 @@ AC_SUBST(BANNERTOPS)
|
||||
AC_SUBST(TEXTTOPS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-defaults.m4 8344 2009-02-10 17:05:35Z mike $".
|
||||
dnl End of "$Id: cups-defaults.m4 8929 2009-12-15 22:40:37Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-dnssd.m4 8344 2009-02-10 17:05:35Z mike $"
|
||||
dnl "$Id: cups-dnssd.m4 8789 2009-08-28 22:54:34Z mike $"
|
||||
dnl
|
||||
dnl DNS Service Discovery (aka Bonjour) stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -43,7 +43,7 @@ if test x$enable_dnssd != xno; then
|
||||
AC_MSG_CHECKING(for current version of dns_sd library)
|
||||
SAVELIBS="$LIBS"
|
||||
LIBS="$LIBS -ldns_sd"
|
||||
AC_TRY_COMPILE([#include <dns_sd.h],
|
||||
AC_TRY_COMPILE([#include <dns_sd.h>],
|
||||
[int constant = kDNSServiceFlagsShareConnection;
|
||||
unsigned char txtRecord[100];
|
||||
uint8_t valueLen;
|
||||
@@ -64,5 +64,5 @@ AC_SUBST(DNSSDLIBS)
|
||||
AC_SUBST(DNSSD_BACKEND)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-dnssd.m4 8344 2009-02-10 17:05:35Z mike $".
|
||||
dnl End of "$Id: cups-dnssd.m4 8789 2009-08-28 22:54:34Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-pam.m4 8344 2009-02-10 17:05:35Z mike $"
|
||||
dnl "$Id: cups-pam.m4 8825 2009-09-22 21:53:31Z mike $"
|
||||
dnl
|
||||
dnl PAM stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -22,9 +22,10 @@ if test $uname = AIX; then
|
||||
fi
|
||||
|
||||
PAMDIR=""
|
||||
PAMFILE=""
|
||||
PAMFILE="pam.std"
|
||||
PAMLIBS=""
|
||||
PAMMOD="pam_unknown.so"
|
||||
PAMMODAUTH="pam_unknown.so"
|
||||
|
||||
if test x$enable_pam != xno; then
|
||||
SAVELIBS="$LIBS"
|
||||
@@ -60,7 +61,7 @@ if test x$enable_pam != xno; then
|
||||
|
||||
case "$uname" in
|
||||
Darwin*)
|
||||
# Darwin, MacOS X
|
||||
# Darwin/Mac OS X
|
||||
if test "x$with_pam_module" != x; then
|
||||
PAMFILE="pam.$with_pam_module"
|
||||
elif test -f /usr/lib/pam/pam_opendirectory.so.2; then
|
||||
@@ -70,26 +71,22 @@ if test x$enable_pam != xno; then
|
||||
fi
|
||||
;;
|
||||
|
||||
IRIX)
|
||||
# SGI IRIX
|
||||
PAMFILE="pam.irix"
|
||||
;;
|
||||
|
||||
*)
|
||||
# All others; this test might need to be updated
|
||||
# as Linux distributors move things around...
|
||||
if test "x$with_pam_module" != x; then
|
||||
PAMMOD="pam_${with_pam_module}.so"
|
||||
else
|
||||
for mod in pam_unix2.so pam_unix.so pam_pwdb.so; do
|
||||
if test -f /lib/security/$mod; then
|
||||
PAMMOD="$mod"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
elif test -f /lib/security/pam_unix2.so; then
|
||||
PAMMOD="pam_unix2.so"
|
||||
elif test -f /lib/security/pam_unix.so; then
|
||||
PAMMOD="pam_unix.so"
|
||||
fi
|
||||
|
||||
PAMFILE="pam.std"
|
||||
if test "x$PAMMOD" = xpam_unix.so; then
|
||||
PAMMODAUTH="$PAMMOD shadow nodelay"
|
||||
else
|
||||
PAMMODAUTH="$PAMMOD nodelay"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
@@ -98,7 +95,8 @@ AC_SUBST(PAMDIR)
|
||||
AC_SUBST(PAMFILE)
|
||||
AC_SUBST(PAMLIBS)
|
||||
AC_SUBST(PAMMOD)
|
||||
AC_SUBST(PAMMODAUTH)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-pam.m4 8344 2009-02-10 17:05:35Z mike $".
|
||||
dnl End of "$Id: cups-pam.m4 8825 2009-09-22 21:53:31Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-pdf.m4 8430 2009-03-12 21:50:44Z mike $"
|
||||
dnl "$Id: cups-pdf.m4 8760 2009-08-07 22:30:30Z mike $"
|
||||
dnl
|
||||
dnl PDF filter configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -13,7 +13,7 @@ dnl which should have been included with this file. If this file is
|
||||
dnl file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
dnl
|
||||
|
||||
AC_ARG_WITH(pdftops, [ --with-pdftops set pdftops filter (gs,pdftops,none), default=pdftops ])
|
||||
AC_ARG_WITH(pdftops, [ --with-pdftops set pdftops filter (gs,/path/to/gs,pdftops,/path/to/pdftops,none), default=pdftops ])
|
||||
|
||||
PDFTOPS=""
|
||||
CUPS_PDFTOPS=""
|
||||
@@ -47,6 +47,12 @@ case "x$with_pdftops" in
|
||||
fi
|
||||
;;
|
||||
|
||||
x/*/gs) # Use /path/to/gs without any check:
|
||||
CUPS_GHOSTSCRIPT="$with_pdftops"
|
||||
AC_DEFINE(HAVE_GHOSTSCRIPT)
|
||||
PDFTOPS="pdftops"
|
||||
;;
|
||||
|
||||
xpdftops)
|
||||
AC_PATH_PROG(CUPS_PDFTOPS, pdftops)
|
||||
if test "x$CUPS_PDFTOPS" != x; then
|
||||
@@ -57,6 +63,20 @@ case "x$with_pdftops" in
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
x/*/pdftops) # Use /path/to/pdftops without any check:
|
||||
CUPS_PDFTOPS="$with_pdftops"
|
||||
AC_DEFINE(HAVE_PDFTOPS)
|
||||
PDFTOPS="pdftops"
|
||||
;;
|
||||
|
||||
xnone) # Make no pdftops filter if with_pdftops=none:
|
||||
;;
|
||||
|
||||
*) # Invalid with_pdftops value:
|
||||
AC_MSG_ERROR(Invalid with_pdftops value!)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_DEFINE_UNQUOTED(CUPS_PDFTOPS, "$CUPS_PDFTOPS")
|
||||
@@ -64,5 +84,5 @@ AC_DEFINE_UNQUOTED(CUPS_GHOSTSCRIPT, "$CUPS_GHOSTSCRIPT")
|
||||
AC_SUBST(PDFTOPS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-pdf.m4 8430 2009-03-12 21:50:44Z mike $".
|
||||
dnl End of "$Id: cups-pdf.m4 8760 2009-08-07 22:30:30Z mike $".
|
||||
dnl
|
||||
|
||||
+15
-17
@@ -335,14 +335,6 @@
|
||||
#undef HAVE_DNSSD
|
||||
|
||||
|
||||
/*
|
||||
* Do we have Darwin's CoreFoundation and SystemConfiguration frameworks?
|
||||
*/
|
||||
|
||||
#undef HAVE_COREFOUNDATION
|
||||
#undef HAVE_SYSTEMCONFIGURATION
|
||||
|
||||
|
||||
/*
|
||||
* Do we have <sys/ioctl.h>?
|
||||
*/
|
||||
@@ -350,14 +342,6 @@
|
||||
#undef HAVE_SYS_IOCTL_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have mkstemp() and/or mkstemps()?
|
||||
*/
|
||||
|
||||
#undef HAVE_MKSTEMP
|
||||
#undef HAVE_MKSTEMPS
|
||||
|
||||
|
||||
/*
|
||||
* Does the "tm" structure contain the "tm_gmtoff" member?
|
||||
*/
|
||||
@@ -602,10 +586,24 @@
|
||||
* Which random number generator function to use...
|
||||
*/
|
||||
|
||||
#undef HAVE_ARC4RANDOM
|
||||
#undef HAVE_RANDOM
|
||||
#undef HAVE_MRAND48
|
||||
#undef HAVE_LRAND48
|
||||
|
||||
#ifdef HAVE_ARC4RANDOM
|
||||
# define CUPS_RAND() arc4random()
|
||||
# define CUPS_SRAND(v) arc4random_stir()
|
||||
#elif defined(HAVE_RANDOM)
|
||||
# define CUPS_RAND() random()
|
||||
# define CUPS_SRAND(v) srandom(v)
|
||||
#elif defined(HAVE_LRAND48)
|
||||
# define CUPS_RAND() lrand48()
|
||||
# define CUPS_SRAND(v) srand48(v)
|
||||
#else
|
||||
# define CUPS_RAND() rand()
|
||||
# define CUPS_SRAND(v) srand(v)
|
||||
#endif /* HAVE_ARC4RANDOM */
|
||||
|
||||
|
||||
/*
|
||||
* Do we have vproc_transaction_begin/end?
|
||||
|
||||
+1
-1
@@ -1553,7 +1553,7 @@ _cupsAdminSetServerSettings(
|
||||
const char *remotep = cupsGetOption("BrowseRemoteProtocols",
|
||||
num_settings, settings);
|
||||
|
||||
if (!localp)
|
||||
if (!localp || !localp[0])
|
||||
localp = cupsGetOption("BrowseLocalProtocols", cupsd_num_settings,
|
||||
cupsd_settings);
|
||||
|
||||
|
||||
+12
-4
@@ -1,5 +1,5 @@
|
||||
<!--
|
||||
"$Id: api-filter.shtml 8628 2009-05-13 22:25:34Z mike $"
|
||||
"$Id: api-filter.shtml 8718 2009-06-18 17:41:03Z mike $"
|
||||
|
||||
Filter and backend programming introduction for the Common UNIX Printing
|
||||
System (CUPS).
|
||||
@@ -127,7 +127,7 @@ when running print filters and backends:</p>
|
||||
|
||||
<dl class="code">
|
||||
|
||||
<dt>APPLE_LANGUAGES</dt>
|
||||
<dt>APPLE_LANGUAGE</dt>
|
||||
<dd>The Apple language identifier associated with the job
|
||||
(Mac OS X only).</dd>
|
||||
|
||||
@@ -264,7 +264,16 @@ prefix strings:</p>
|
||||
current queue. Typically this is used to indicate persistent media,
|
||||
ink, toner, and configuration conditions or errors on a printer.
|
||||
<a href='#TABLE2'>Table 2</a> lists the standard state keywords -
|
||||
use vendor-prefixed ("com.acme.foo") keywords for custom states.</dd>
|
||||
use vendor-prefixed ("com.acme.foo") keywords for custom states.
|
||||
|
||||
<blockquote><b>Note:</b>
|
||||
|
||||
<p>"STATE:" messages often provide visible alerts to the user. For example, on
|
||||
Mac OS X setting a printer-state-reason value with an "-error" or "-warning"
|
||||
suffix will cause the printer's dock item to bounce if the corresponding reason
|
||||
is localized with a cupsIPPReason keyword in the printer's PPD file.</p>
|
||||
|
||||
</blockquote></dd>
|
||||
|
||||
<dt>WARNING: message</dt>
|
||||
<dd>Sets the printer-state-message attribute and adds the specified
|
||||
@@ -276,7 +285,6 @@ prefix strings:</p>
|
||||
<p>Messages without one of these prefixes are treated as if they began with
|
||||
the "DEBUG:" prefix string.</p>
|
||||
|
||||
|
||||
<div class='table'><table width='80%' summary='Table 1: Standard marker-types Values'>
|
||||
<caption>Table 1: <a name='TABLE1'>Standard marker-types Values</a></caption>
|
||||
<thead>
|
||||
|
||||
@@ -26,6 +26,14 @@
|
||||
# include "versioning.h"
|
||||
|
||||
|
||||
/*
|
||||
* C++ magic...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif /* __cplusplus */
|
||||
|
||||
/*
|
||||
* Constants...
|
||||
*/
|
||||
@@ -57,6 +65,10 @@ extern void cupsBackendReport(const char *device_scheme,
|
||||
_CUPS_API_1_4;
|
||||
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif /* __cplusplus */
|
||||
|
||||
#endif /* !_CUPS_BACKEND_H_ */
|
||||
|
||||
/*
|
||||
|
||||
+5
-1
@@ -583,9 +583,13 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
|
||||
* Clear all conflicts...
|
||||
*/
|
||||
|
||||
cupsArraySave(ppd->options);
|
||||
|
||||
for (o = ppdFirstOption(ppd); o; o = ppdNextOption(ppd))
|
||||
o->conflicted = 0;
|
||||
|
||||
cupsArrayRestore(ppd->options);
|
||||
|
||||
/*
|
||||
* Test for conflicts...
|
||||
*/
|
||||
@@ -641,7 +645,7 @@ ppdInstallableConflict(
|
||||
DEBUG_printf(("2ppdInstallableConflict(ppd=%p, option=\"%s\", choice=\"%s\")",
|
||||
ppd, option, choice));
|
||||
|
||||
/*
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
|
||||
+2
-2
@@ -59,10 +59,10 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define CUPS_VERSION 1.0400
|
||||
# define CUPS_VERSION 1.0403
|
||||
# define CUPS_VERSION_MAJOR 1
|
||||
# define CUPS_VERSION_MINOR 4
|
||||
# define CUPS_VERSION_PATCH 0
|
||||
# define CUPS_VERSION_PATCH 3
|
||||
|
||||
# define CUPS_BC_FD 3 /* Back-channel file descriptor for select/poll */
|
||||
# define CUPS_DATE_ANY (time_t)-1
|
||||
|
||||
+13
-6
@@ -33,7 +33,6 @@
|
||||
* server.
|
||||
* appleCopyLocations() - Copy the location history array.
|
||||
* appleCopyNetwork() - Get the network ID for the current location.
|
||||
* appleGetDefault() - Get the default printer for this location.
|
||||
* appleGetPaperSize() - Get the default paper size.
|
||||
* appleGetPrinter() - Get a printer from the history array.
|
||||
* appleSetDefault() - Set the default printer for this location.
|
||||
@@ -139,12 +138,17 @@ cupsAddDest(const char *name, /* I - Destination name */
|
||||
|
||||
if (!cupsGetDest(name, instance, num_dests, *dests))
|
||||
{
|
||||
if (instance &&
|
||||
(parent = cupsGetDest(name, NULL, num_dests, *dests)) == NULL)
|
||||
if (instance && !cupsGetDest(name, NULL, num_dests, *dests))
|
||||
return (num_dests);
|
||||
|
||||
dest = cups_add_dest(name, instance, &num_dests, dests);
|
||||
|
||||
/*
|
||||
* Find the base dest again now the array has been realloc'd.
|
||||
*/
|
||||
|
||||
parent = cupsGetDest(name, NULL, num_dests, *dests);
|
||||
|
||||
if (instance && parent && parent->num_options > 0)
|
||||
{
|
||||
/*
|
||||
@@ -549,7 +553,7 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
|
||||
|
||||
if (!cups_get_sdests(http, op, name, 0, &dest))
|
||||
{
|
||||
if (op == CUPS_GET_DEFAULT)
|
||||
if (op == CUPS_GET_DEFAULT || name)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
@@ -557,7 +561,7 @@ cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTT
|
||||
* configuration file does not exist. Find out the real default.
|
||||
*/
|
||||
|
||||
if (!cups_get_sdests(http, CUPS_GET_DEFAULT, name, 0, &dest))
|
||||
if (!cups_get_sdests(http, CUPS_GET_DEFAULT, NULL, 0, &dest))
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1288,6 +1292,9 @@ appleUseLastPrinter(void)
|
||||
CFPropertyListRef uselast; /* Use last printer preference value */
|
||||
|
||||
|
||||
if (getenv("CUPS_DISABLE_APPLE_DEFAULT"))
|
||||
return (0);
|
||||
|
||||
if ((uselast = CFPreferencesCopyAppValue(kUseLastPrinterAsCurrentPrinterKey,
|
||||
kPMPrintingPreferences)) != NULL)
|
||||
{
|
||||
@@ -1800,7 +1807,7 @@ cups_get_sdests(http_t *http, /* I - Connection to server or CUPS_HTTP_DEFA
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
|
||||
"requesting-user-name", NULL, cupsUser());
|
||||
|
||||
if (name)
|
||||
if (name && op != CUPS_GET_DEFAULT)
|
||||
{
|
||||
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
|
||||
"localhost", ippPort(), "/printers/%s", name);
|
||||
|
||||
@@ -772,6 +772,7 @@ ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */
|
||||
if (section == PPD_ORDER_JCL)
|
||||
{
|
||||
if (!strcasecmp(choices[i]->choice, "Custom") &&
|
||||
choices[i]->code &&
|
||||
(coption = ppdFindCustomOption(ppd, choices[i]->option->keyword))
|
||||
!= NULL)
|
||||
{
|
||||
|
||||
+34
-10
@@ -38,20 +38,44 @@
|
||||
static void
|
||||
cups_env_init(_cups_globals_t *g) /* I - Global data */
|
||||
{
|
||||
if ((g->cups_datadir = getenv("CUPS_DATADIR")) == NULL)
|
||||
g->cups_datadir = CUPS_DATADIR;
|
||||
#ifdef HAVE_GETEUID
|
||||
if ((geteuid() != getuid() && getuid()) || getegid() != getgid())
|
||||
#else
|
||||
if (!getuid())
|
||||
#endif /* HAVE_GETEUID */
|
||||
{
|
||||
/*
|
||||
* When running setuid/setgid, don't allow environment variables to override
|
||||
* the directories...
|
||||
*/
|
||||
|
||||
if ((g->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL)
|
||||
g->cups_serverbin = CUPS_SERVERBIN;
|
||||
|
||||
if ((g->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
|
||||
g->cups_datadir = CUPS_DATADIR;
|
||||
g->cups_serverbin = CUPS_SERVERBIN;
|
||||
g->cups_serverroot = CUPS_SERVERROOT;
|
||||
g->cups_statedir = CUPS_STATEDIR;
|
||||
g->localedir = CUPS_LOCALEDIR;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Allow directories to be overridden by environment variables.
|
||||
*/
|
||||
|
||||
if ((g->cups_statedir = getenv("CUPS_STATEDIR")) == NULL)
|
||||
g->cups_statedir = CUPS_STATEDIR;
|
||||
if ((g->cups_datadir = getenv("CUPS_DATADIR")) == NULL)
|
||||
g->cups_datadir = CUPS_DATADIR;
|
||||
|
||||
if ((g->localedir = getenv("LOCALEDIR")) == NULL)
|
||||
g->localedir = CUPS_LOCALEDIR;
|
||||
if ((g->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL)
|
||||
g->cups_serverbin = CUPS_SERVERBIN;
|
||||
|
||||
if ((g->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
|
||||
g->cups_serverroot = CUPS_SERVERROOT;
|
||||
|
||||
if ((g->cups_statedir = getenv("CUPS_STATEDIR")) == NULL)
|
||||
g->cups_statedir = CUPS_STATEDIR;
|
||||
|
||||
if ((g->localedir = getenv("LOCALEDIR")) == NULL)
|
||||
g->localedir = CUPS_LOCALEDIR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+48
-19
@@ -50,6 +50,7 @@
|
||||
#include "debug.h"
|
||||
#include "globals.h"
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#ifdef HAVE_DNSSD
|
||||
# include <dns_sd.h>
|
||||
# include <poll.h>
|
||||
@@ -1406,7 +1407,6 @@ _httpResolveURI(
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", "
|
||||
"domain=\"local.\"...\n", hostname, regtype);
|
||||
_cupsLangPuts(stderr, _("INFO: Looking for printer...\n"));
|
||||
}
|
||||
|
||||
uri = NULL;
|
||||
@@ -1418,36 +1418,65 @@ _httpResolveURI(
|
||||
hostname, regtype, "local.", resolve_callback,
|
||||
&uribuf) == kDNSServiceErr_NoError)
|
||||
{
|
||||
if (strcasecmp(domain, "local."))
|
||||
int fds; /* Number of ready descriptors */
|
||||
time_t timeout, /* Poll timeout */
|
||||
start_time = time(NULL);/* Start time */
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (logit)
|
||||
_cupsLangPuts(stderr, _("INFO: Looking for printer...\n"));
|
||||
|
||||
/*
|
||||
* Wait 2 seconds for a response to the local resolve; if nothing comes
|
||||
* in, do an additional domain resolution...
|
||||
* For the first minute, wakeup every 2 seconds to emit a
|
||||
* "looking for printer" message...
|
||||
*/
|
||||
|
||||
timeout = (time(NULL) < (start_time + 60)) ? 2000 : -1;
|
||||
|
||||
polldata.fd = DNSServiceRefSockFD(ref);
|
||||
polldata.events = POLLIN;
|
||||
|
||||
if (poll(&polldata, 1, 2000) != 1)
|
||||
fds = poll(&polldata, 1, timeout);
|
||||
|
||||
if (fds < 0)
|
||||
{
|
||||
if (errno != EINTR && errno != EAGAIN)
|
||||
{
|
||||
DEBUG_printf(("5_httpResolveURI: poll error: %s", strerror(errno)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (fds == 0)
|
||||
{
|
||||
/*
|
||||
* OK, send the domain name resolve...
|
||||
* Wait 2 seconds for a response to the local resolve; if nothing
|
||||
* comes in, do an additional domain resolution...
|
||||
*/
|
||||
|
||||
if (logit)
|
||||
fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", "
|
||||
"domain=\"%s\"...\n", hostname, regtype, domain);
|
||||
|
||||
domainref = ref;
|
||||
if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection, 0,
|
||||
hostname, regtype, domain, resolve_callback,
|
||||
&uribuf) == kDNSServiceErr_NoError)
|
||||
domainsent = 1;
|
||||
if (domainsent == 0 && strcasecmp(domain, "local."))
|
||||
{
|
||||
if (logit)
|
||||
fprintf(stderr,
|
||||
"DEBUG: Resolving \"%s\", regtype=\"%s\", "
|
||||
"domain=\"%s\"...\n", hostname, regtype, domain);
|
||||
|
||||
domainref = ref;
|
||||
if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection, 0,
|
||||
hostname, regtype, domain, resolve_callback,
|
||||
&uribuf) == kDNSServiceErr_NoError)
|
||||
domainsent = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError)
|
||||
uri = resolved_uri;
|
||||
else
|
||||
{
|
||||
if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError)
|
||||
{
|
||||
uri = resolved_uri;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (domainsent)
|
||||
DNSServiceRefDeallocate(domainref);
|
||||
|
||||
+85
-18
@@ -26,7 +26,6 @@
|
||||
* httpClearCookie() - Clear the cookie value(s).
|
||||
* httpClearFields() - Clear HTTP request fields.
|
||||
* httpClose() - Close an HTTP connection...
|
||||
* httpConnect() - Connect to a HTTP server.
|
||||
* httpConnectEncrypt() - Connect to a HTTP server using encryption.
|
||||
* _httpCreate() - Create an unconnected HTTP connection.
|
||||
* httpDelete() - Send a DELETE request to the server.
|
||||
@@ -721,7 +720,7 @@ httpGetField(http_t *http, /* I - Connection to server */
|
||||
{
|
||||
if (!http || field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX)
|
||||
return (NULL);
|
||||
else if (field == HTTP_FIELD_AUTHORIZATION &&
|
||||
else if (field == HTTP_FIELD_AUTHORIZATION &&
|
||||
http->field_authorization)
|
||||
{
|
||||
/*
|
||||
@@ -1137,7 +1136,7 @@ httpGets(char *line, /* I - Line to read into */
|
||||
http->activity = time(NULL);
|
||||
|
||||
*lineptr = '\0';
|
||||
|
||||
|
||||
DEBUG_printf(("3httpGets: Returning \"%s\"", line));
|
||||
|
||||
return (line);
|
||||
@@ -2283,7 +2282,7 @@ httpWait(http_t *http, /* I - Connection to server */
|
||||
*
|
||||
* @deprecated@
|
||||
*/
|
||||
|
||||
|
||||
int /* O - Number of bytes written */
|
||||
httpWrite(http_t *http, /* I - Connection to server */
|
||||
const char *buffer, /* I - Buffer for data */
|
||||
@@ -2298,7 +2297,7 @@ httpWrite(http_t *http, /* I - Connection to server */
|
||||
*
|
||||
* @since CUPS 1.2/Mac OS X 10.5@
|
||||
*/
|
||||
|
||||
|
||||
ssize_t /* O - Number of bytes written */
|
||||
httpWrite2(http_t *http, /* I - Connection to server */
|
||||
const char *buffer, /* I - Buffer for data */
|
||||
@@ -2456,7 +2455,7 @@ _httpWriteCDSA(
|
||||
else
|
||||
{
|
||||
*dataLength = 0;
|
||||
|
||||
|
||||
if (errno == EAGAIN)
|
||||
result = errSSLWouldBlock;
|
||||
else
|
||||
@@ -2517,7 +2516,7 @@ http_bio_ctrl(BIO *h, /* I - BIO data */
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
|
||||
|
||||
case BIO_CTRL_DUP :
|
||||
case BIO_CTRL_FLUSH :
|
||||
return (1);
|
||||
@@ -2719,7 +2718,36 @@ http_read_ssl(http_t *http, /* I - Connection to server */
|
||||
return (SSL_read((SSL *)(http->tls), buf, len));
|
||||
|
||||
# elif defined(HAVE_GNUTLS)
|
||||
return (gnutls_record_recv(((http_tls_t *)(http->tls))->session, buf, len));
|
||||
ssize_t result; /* Return value */
|
||||
|
||||
|
||||
result = gnutls_record_recv(((http_tls_t *)(http->tls))->session, buf, len);
|
||||
|
||||
if (result < 0 && !errno)
|
||||
{
|
||||
/*
|
||||
* Convert GNU TLS error to errno value...
|
||||
*/
|
||||
|
||||
switch (result)
|
||||
{
|
||||
case GNUTLS_E_INTERRUPTED :
|
||||
errno = EINTR;
|
||||
break;
|
||||
|
||||
case GNUTLS_E_AGAIN :
|
||||
errno = EAGAIN;
|
||||
break;
|
||||
|
||||
default :
|
||||
errno = EPIPE;
|
||||
break;
|
||||
}
|
||||
|
||||
result = -1;
|
||||
}
|
||||
|
||||
return ((int)result);
|
||||
|
||||
# elif defined(HAVE_CDSASSL)
|
||||
int result; /* Return value */
|
||||
@@ -2857,7 +2885,7 @@ http_send(http_t *http, /* I - Connection to server */
|
||||
DEBUG_printf(("9http_send: %s: %s", http_fields[i],
|
||||
httpGetField(http, i)));
|
||||
|
||||
if (httpPrintf(http, "%s: %s\r\n", http_fields[i],
|
||||
if (httpPrintf(http, "%s: %s\r\n", http_fields[i],
|
||||
httpGetField(http, i)) < 1)
|
||||
{
|
||||
http->status = HTTP_ERROR;
|
||||
@@ -2896,15 +2924,15 @@ http_send(http_t *http, /* I - Connection to server */
|
||||
* The Kerberos and AuthRef authentication strings can only be used once...
|
||||
*/
|
||||
|
||||
if (http->field_authorization && http->authstring &&
|
||||
(!strncmp(http->authstring, "Negotiate", 9) ||
|
||||
if (http->field_authorization && http->authstring &&
|
||||
(!strncmp(http->authstring, "Negotiate", 9) ||
|
||||
!strncmp(http->authstring, "AuthRef", 7)))
|
||||
{
|
||||
http->_authstring[0] = '\0';
|
||||
|
||||
if (http->authstring != http->_authstring)
|
||||
free(http->authstring);
|
||||
|
||||
|
||||
http->authstring = http->_authstring;
|
||||
}
|
||||
|
||||
@@ -3004,6 +3032,11 @@ http_setup_ssl(http_t *http) /* I - Connection to server */
|
||||
http->error = errno;
|
||||
http->status = HTTP_ERROR;
|
||||
|
||||
gnutls_deinit(conn->session);
|
||||
gnutls_certificate_free_credentials(*credentials);
|
||||
free(credentials);
|
||||
free(conn);
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -3138,6 +3171,13 @@ http_upgrade(http_t *http) /* I - Connection to server */
|
||||
|
||||
DEBUG_printf(("7http_upgrade(%p)", http));
|
||||
|
||||
/*
|
||||
* Flush the connection to make sure any previous "Upgrade" message
|
||||
* has been read.
|
||||
*/
|
||||
|
||||
httpFlush(http);
|
||||
|
||||
/*
|
||||
* Copy the HTTP data to a local variable so we can do the OPTIONS
|
||||
* request without interfering with the existing request data...
|
||||
@@ -3165,8 +3205,6 @@ http_upgrade(http_t *http) /* I - Connection to server */
|
||||
while (httpUpdate(http) == HTTP_CONTINUE);
|
||||
}
|
||||
|
||||
httpFlush(http);
|
||||
|
||||
/*
|
||||
* Restore the HTTP request data...
|
||||
*/
|
||||
@@ -3210,7 +3248,7 @@ http_upgrade(http_t *http) /* I - Connection to server */
|
||||
/*
|
||||
* 'http_write()' - Write a buffer to a HTTP connection.
|
||||
*/
|
||||
|
||||
|
||||
static int /* O - Number of bytes written */
|
||||
http_write(http_t *http, /* I - Connection to server */
|
||||
const char *buffer, /* I - Buffer for data */
|
||||
@@ -3325,7 +3363,36 @@ http_write_ssl(http_t *http, /* I - Connection to server */
|
||||
return (SSL_write((SSL *)(http->tls), buf, len));
|
||||
|
||||
# elif defined(HAVE_GNUTLS)
|
||||
return (gnutls_record_send(((http_tls_t *)(http->tls))->session, buf, len));
|
||||
ssize_t result; /* Return value */
|
||||
|
||||
result = gnutls_record_send(((http_tls_t *)(http->tls))->session, buf, len);
|
||||
|
||||
if (result < 0 && !errno)
|
||||
{
|
||||
/*
|
||||
* Convert GNU TLS error to errno value...
|
||||
*/
|
||||
|
||||
switch (result)
|
||||
{
|
||||
case GNUTLS_E_INTERRUPTED :
|
||||
errno = EINTR;
|
||||
break;
|
||||
|
||||
case GNUTLS_E_AGAIN :
|
||||
errno = EAGAIN;
|
||||
break;
|
||||
|
||||
default :
|
||||
errno = EPIPE;
|
||||
break;
|
||||
}
|
||||
|
||||
result = -1;
|
||||
}
|
||||
|
||||
return ((int)result);
|
||||
|
||||
# elif defined(HAVE_CDSASSL)
|
||||
int result; /* Return value */
|
||||
OSStatus error; /* Error info */
|
||||
@@ -3348,11 +3415,11 @@ http_write_ssl(http_t *http, /* I - Connection to server */
|
||||
else
|
||||
{
|
||||
result = -1;
|
||||
errno = EINTR;
|
||||
errno = EINTR;
|
||||
}
|
||||
break;
|
||||
default :
|
||||
errno = EPIPE;
|
||||
errno = EPIPE;
|
||||
result = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
* Hyper-Text Transport Protocol definitions for the Common UNIX Printing
|
||||
* System (CUPS).
|
||||
*
|
||||
* Copyright 2007 by Apple Inc.
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
|
||||
@@ -29,10 +29,14 @@ _cupsStrStatistics
|
||||
_cups_strcpy
|
||||
_cups_strlcat
|
||||
_cups_strlcpy
|
||||
_httpResolveURI
|
||||
_ippAddAttr
|
||||
_ippFindOption
|
||||
_ippFreeAttr
|
||||
_ppdFreeLanguages
|
||||
_ppdGetEncoding
|
||||
_ppdGetLanguages
|
||||
_ppdHashName
|
||||
cupsAddDest
|
||||
cupsAddOption
|
||||
cupsAdminCreateWindowsPPD
|
||||
@@ -129,6 +133,7 @@ cupsPrintFiles2
|
||||
cupsPutFd
|
||||
cupsPutFile
|
||||
cupsRemoveOption
|
||||
cupsResolveConflicts
|
||||
cupsServer
|
||||
cupsSetDests
|
||||
cupsSetDests2
|
||||
+29
-7
@@ -842,6 +842,8 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
|
||||
if (!strcasecmp(option, "AP_D_InputSlot"))
|
||||
{
|
||||
cupsArraySave(ppd->options);
|
||||
|
||||
if ((o = ppdFindOption(ppd, "InputSlot")) != NULL)
|
||||
{
|
||||
key.option = o;
|
||||
@@ -851,13 +853,21 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
cupsArrayRemove(ppd->marked, oldc);
|
||||
}
|
||||
}
|
||||
|
||||
cupsArrayRestore(ppd->options);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for custom options...
|
||||
*/
|
||||
|
||||
if ((o = ppdFindOption(ppd, option)) == NULL)
|
||||
cupsArraySave(ppd->options);
|
||||
|
||||
o = ppdFindOption(ppd, option);
|
||||
|
||||
cupsArrayRestore(ppd->options);
|
||||
|
||||
if (!o)
|
||||
return;
|
||||
|
||||
loc = localeconv();
|
||||
@@ -912,15 +922,15 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
if (units)
|
||||
{
|
||||
if (!strcasecmp(units, "cm"))
|
||||
cparam->current.custom_points *= 72.0f / 2.54f;
|
||||
cparam->current.custom_points *= 72.0f / 2.54f;
|
||||
else if (!strcasecmp(units, "mm"))
|
||||
cparam->current.custom_points *= 72.0f / 25.4f;
|
||||
cparam->current.custom_points *= 72.0f / 25.4f;
|
||||
else if (!strcasecmp(units, "m"))
|
||||
cparam->current.custom_points *= 72.0f / 0.0254f;
|
||||
cparam->current.custom_points *= 72.0f / 0.0254f;
|
||||
else if (!strcasecmp(units, "in"))
|
||||
cparam->current.custom_points *= 72.0f;
|
||||
cparam->current.custom_points *= 72.0f;
|
||||
else if (!strcasecmp(units, "ft"))
|
||||
cparam->current.custom_points *= 12.0f * 72.0f;
|
||||
cparam->current.custom_points *= 12.0f * 72.0f;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1060,6 +1070,8 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
* appropriate...
|
||||
*/
|
||||
|
||||
cupsArraySave(ppd->options);
|
||||
|
||||
if (!strcasecmp(option, "PageSize"))
|
||||
{
|
||||
if ((o = ppdFindOption(ppd, "PageRegion")) != NULL)
|
||||
@@ -1084,6 +1096,8 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cupsArrayRestore(ppd->options);
|
||||
}
|
||||
else if (!strcasecmp(option, "InputSlot"))
|
||||
{
|
||||
@@ -1091,6 +1105,8 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
* Unmark ManualFeed option...
|
||||
*/
|
||||
|
||||
cupsArraySave(ppd->options);
|
||||
|
||||
if ((o = ppdFindOption(ppd, "ManualFeed")) != NULL)
|
||||
{
|
||||
key.option = o;
|
||||
@@ -1100,6 +1116,8 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
cupsArrayRemove(ppd->marked, oldc);
|
||||
}
|
||||
}
|
||||
|
||||
cupsArrayRestore(ppd->options);
|
||||
}
|
||||
else if (!strcasecmp(option, "ManualFeed") &&
|
||||
!strcasecmp(choice, "True"))
|
||||
@@ -1108,6 +1126,8 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
* Unmark InputSlot option...
|
||||
*/
|
||||
|
||||
cupsArraySave(ppd->options);
|
||||
|
||||
if ((o = ppdFindOption(ppd, "InputSlot")) != NULL)
|
||||
{
|
||||
key.option = o;
|
||||
@@ -1117,6 +1137,8 @@ ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */
|
||||
cupsArrayRemove(ppd->marked, oldc);
|
||||
}
|
||||
}
|
||||
|
||||
cupsArrayRestore(ppd->options);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1197,7 +1219,7 @@ ppd_mark_size(ppd_file_t *ppd, /* I - PPD file */
|
||||
return;
|
||||
}
|
||||
else
|
||||
return;
|
||||
return;
|
||||
|
||||
/*
|
||||
* Search the PPD file for a matching size...
|
||||
|
||||
+9
-13
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Page size functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 2007-2010 by Apple Inc.
|
||||
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -250,6 +250,9 @@ ppdPageSizeLimits(ppd_file_t *ppd, /* I - PPD file record */
|
||||
* Figure out the current minimum width and length...
|
||||
*/
|
||||
|
||||
width = ppd->custom_min[0];
|
||||
length = ppd->custom_min[1];
|
||||
|
||||
if (qualifier2)
|
||||
{
|
||||
/*
|
||||
@@ -277,18 +280,13 @@ ppdPageSizeLimits(ppd_file_t *ppd, /* I - PPD file record */
|
||||
attr = ppdFindAttr(ppd, "cupsMinSize", spec);
|
||||
}
|
||||
|
||||
if (!attr ||
|
||||
(attr->value && sscanf(attr->value, "%f%f", &width, &length) != 2))
|
||||
if ((attr && attr->value &&
|
||||
sscanf(attr->value, "%f%f", &width, &length) != 2) || !attr)
|
||||
{
|
||||
width = ppd->custom_min[0];
|
||||
length = ppd->custom_min[1];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
width = ppd->custom_min[0];
|
||||
length = ppd->custom_min[1];
|
||||
}
|
||||
|
||||
minimum->width = width;
|
||||
minimum->length = length;
|
||||
@@ -301,6 +299,9 @@ ppdPageSizeLimits(ppd_file_t *ppd, /* I - PPD file record */
|
||||
* Figure out the current maximum width and length...
|
||||
*/
|
||||
|
||||
width = ppd->custom_max[0];
|
||||
length = ppd->custom_max[1];
|
||||
|
||||
if (qualifier2)
|
||||
{
|
||||
/*
|
||||
@@ -335,11 +336,6 @@ ppdPageSizeLimits(ppd_file_t *ppd, /* I - PPD file record */
|
||||
length = ppd->custom_max[1];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
width = ppd->custom_max[0];
|
||||
length = ppd->custom_max[1];
|
||||
}
|
||||
|
||||
maximum->width = width;
|
||||
maximum->length = length;
|
||||
|
||||
+35
-2
@@ -352,11 +352,13 @@ ppdErrorString(ppd_status_t status) /* I - PPD status */
|
||||
_("Illegal option keyword string"),
|
||||
_("Illegal translation string"),
|
||||
_("Illegal whitespace character"),
|
||||
_("Bad custom parameter")
|
||||
_("Bad custom parameter"),
|
||||
_("Missing option keyword"),
|
||||
_("Bad value string")
|
||||
};
|
||||
|
||||
|
||||
if (status < PPD_OK || status > PPD_ILLEGAL_WHITESPACE)
|
||||
if (status < PPD_OK || status >= PPD_MAX_STATUS)
|
||||
return (_cupsLangString(cupsLangDefault(), _("Unknown")));
|
||||
else
|
||||
return (_cupsLangString(cupsLangDefault(), messages[status]));
|
||||
@@ -1177,6 +1179,37 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
|
||||
}
|
||||
else if (!strcmp(keyword, "JobPatchFile"))
|
||||
{
|
||||
/*
|
||||
* CUPS STR #3421: Check for "*JobPatchFile: int: string"
|
||||
*/
|
||||
|
||||
if (isdigit(*string & 255))
|
||||
{
|
||||
for (sptr = string + 1; isdigit(*sptr & 255); sptr ++);
|
||||
|
||||
if (*sptr == ':')
|
||||
{
|
||||
/*
|
||||
* Found "*JobPatchFile: int: string"...
|
||||
*/
|
||||
|
||||
cg->ppd_status = PPD_BAD_VALUE;
|
||||
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
if (!name[0])
|
||||
{
|
||||
/*
|
||||
* Found "*JobPatchFile: string"...
|
||||
*/
|
||||
|
||||
cg->ppd_status = PPD_MISSING_OPTION_KEYWORD;
|
||||
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (ppd->patches == NULL)
|
||||
ppd->patches = strdup(string);
|
||||
else
|
||||
|
||||
+4
-1
@@ -115,7 +115,10 @@ typedef enum ppd_status_e /**** Status Codes @since CUPS 1.1.19/Mac OS X 10.3@
|
||||
PPD_ILLEGAL_OPTION_KEYWORD, /* Illegal option keyword string */
|
||||
PPD_ILLEGAL_TRANSLATION, /* Illegal translation string */
|
||||
PPD_ILLEGAL_WHITESPACE, /* Illegal whitespace character */
|
||||
PPD_BAD_CUSTOM_PARAM /* Bad custom parameter */
|
||||
PPD_BAD_CUSTOM_PARAM, /* Bad custom parameter */
|
||||
PPD_MISSING_OPTION_KEYWORD, /* Missing option keyword */
|
||||
PPD_BAD_VALUE, /* Bad value string */
|
||||
PPD_MAX_STATUS /* @private@ */
|
||||
} ppd_status_t;
|
||||
|
||||
enum ppd_conform_e /**** Conformance Levels @since CUPS 1.1.19/Mac OS X 10.3@ ****/
|
||||
|
||||
+4
-2
@@ -266,9 +266,11 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP
|
||||
|
||||
DEBUG_printf(("2cupsDoIORequest: status=%d", status));
|
||||
|
||||
if (status == HTTP_FORBIDDEN || status == HTTP_ERROR ||
|
||||
status >= HTTP_SERVER_ERROR)
|
||||
if (status >= HTTP_BAD_REQUEST &&
|
||||
status != HTTP_UNAUTHORIZED &&
|
||||
status != HTTP_UPGRADE_REQUIRED)
|
||||
{
|
||||
httpFlush(http);
|
||||
_cupsSetHTTPError(status);
|
||||
break;
|
||||
}
|
||||
|
||||
+39
-26
@@ -116,6 +116,7 @@ cupsSideChannelRead(
|
||||
char buffer[16388]; /* Message buffer */
|
||||
int bytes; /* Bytes read */
|
||||
int templen; /* Data length from message */
|
||||
int nfds; /* Number of file descriptors */
|
||||
#ifdef HAVE_POLL
|
||||
struct pollfd pfd; /* Poll structure for poll() */
|
||||
#else /* select() */
|
||||
@@ -143,39 +144,31 @@ cupsSideChannelRead(
|
||||
pfd.fd = CUPS_SC_FD;
|
||||
pfd.events = POLLIN;
|
||||
|
||||
if (timeout < 0.0)
|
||||
{
|
||||
if (poll(&pfd, 1, -1) < 1)
|
||||
return (-1);
|
||||
}
|
||||
else if (poll(&pfd, 1, (long)(timeout * 1000)) < 1)
|
||||
return (-1);
|
||||
while ((nfds = poll(&pfd, 1,
|
||||
timeout < 0.0 ? -1 : (long)(timeout * 1000))) < 0 &&
|
||||
(errno == EINTR || errno == EAGAIN))
|
||||
;
|
||||
|
||||
#else /* select() */
|
||||
FD_ZERO(&input_set);
|
||||
FD_SET(CUPS_SC_FD, &input_set);
|
||||
|
||||
if (timeout < 0.0)
|
||||
{
|
||||
if (select(CUPS_SC_FD + 1, &input_set, NULL, NULL, NULL) < 1)
|
||||
{
|
||||
DEBUG_printf(("1cupsSideChannelRead: Select error: %s", strerror(errno)));
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stimeout.tv_sec = (int)timeout;
|
||||
stimeout.tv_usec = (int)(timeout * 1000000) % 1000000;
|
||||
stimeout.tv_sec = (int)timeout;
|
||||
stimeout.tv_usec = (int)(timeout * 1000000) % 1000000;
|
||||
|
||||
while ((nfds = select(CUPS_SC_FD + 1, &input_set, NULL, NULL,
|
||||
timeout < 0.0 ? NULL : &stimeout)) < 0 &&
|
||||
(errno == EINTR || errno == EAGAIN))
|
||||
;
|
||||
|
||||
if (select(CUPS_SC_FD + 1, &input_set, NULL, NULL, &stimeout) < 1)
|
||||
{
|
||||
DEBUG_puts("1cupsSideChannelRead: Select timeout");
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_POLL */
|
||||
|
||||
if (nfds < 1)
|
||||
{
|
||||
*status = nfds==0 ? CUPS_SC_STATUS_TIMEOUT : CUPS_SC_STATUS_IO_ERROR;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read a side-channel message for the format:
|
||||
*
|
||||
@@ -191,9 +184,23 @@ cupsSideChannelRead(
|
||||
if (errno != EINTR && errno != EAGAIN)
|
||||
{
|
||||
DEBUG_printf(("1cupsSideChannelRead: Read error: %s", strerror(errno)));
|
||||
*command = CUPS_SC_CMD_NONE;
|
||||
*status = CUPS_SC_STATUS_IO_ERROR;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Watch for EOF or too few bytes...
|
||||
*/
|
||||
|
||||
if (bytes < 4)
|
||||
{
|
||||
DEBUG_printf(("1cupsSideChannelRead: Short read of %d bytes", bytes));
|
||||
*command = CUPS_SC_CMD_NONE;
|
||||
*status = CUPS_SC_STATUS_BAD_MESSAGE;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate the command code in the message...
|
||||
*/
|
||||
@@ -202,6 +209,8 @@ cupsSideChannelRead(
|
||||
buffer[0] > CUPS_SC_CMD_SNMP_GET_NEXT)
|
||||
{
|
||||
DEBUG_printf(("1cupsSideChannelRead: Bad command %d!", buffer[0]));
|
||||
*command = CUPS_SC_CMD_NONE;
|
||||
*status = CUPS_SC_STATUS_BAD_MESSAGE;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -379,6 +388,7 @@ cupsSideChannelSNMPWalk(
|
||||
real_oidlen, /* Length of returned OID string */
|
||||
oidlen; /* Length of first OID */
|
||||
const char *current_oid; /* Current OID */
|
||||
char last_oid[2048]; /* Last OID */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsSideChannelSNMPWalk(oid=\"%s\", timeout=%.3f, cb=%p, "
|
||||
@@ -397,6 +407,7 @@ cupsSideChannelSNMPWalk(
|
||||
|
||||
current_oid = oid;
|
||||
oidlen = (int)strlen(oid);
|
||||
last_oid[0] = '\0';
|
||||
|
||||
do
|
||||
{
|
||||
@@ -422,7 +433,8 @@ cupsSideChannelSNMPWalk(
|
||||
* Parse the response of the form "oid\0value"...
|
||||
*/
|
||||
|
||||
if (strncmp(real_data, oid, oidlen) || real_data[oidlen] != '.')
|
||||
if (strncmp(real_data, oid, oidlen) || real_data[oidlen] != '.' ||
|
||||
!strcmp(real_data, last_oid))
|
||||
{
|
||||
/*
|
||||
* Done with this set of OIDs...
|
||||
@@ -448,6 +460,7 @@ cupsSideChannelSNMPWalk(
|
||||
*/
|
||||
|
||||
current_oid = real_data;
|
||||
strlcpy(last_oid, current_oid, sizeof(last_oid));
|
||||
}
|
||||
}
|
||||
while (status == CUPS_SC_STATUS_OK);
|
||||
|
||||
@@ -55,6 +55,7 @@ typedef enum cups_sc_bidi_e cups_sc_bidi_t;
|
||||
|
||||
enum cups_sc_command_e /**** Request command codes ****/
|
||||
{
|
||||
CUPS_SC_CMD_NONE = 0, /* No command @private@ */
|
||||
CUPS_SC_CMD_SOFT_RESET = 1, /* Do a soft reset */
|
||||
CUPS_SC_CMD_DRAIN_OUTPUT = 2, /* Drain all pending output */
|
||||
CUPS_SC_CMD_GET_BIDI = 3, /* Return bidirectional capabilities */
|
||||
|
||||
+37
-11
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* SNMP functions for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 2007-2010 by Apple Inc.
|
||||
* Copyright 2006-2007 by Easy Software Products, all rights reserved.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -89,14 +89,14 @@ static char *asn1_get_string(unsigned char **buffer,
|
||||
unsigned char *bufend,
|
||||
int length, char *string,
|
||||
int strsize);
|
||||
static int asn1_get_length(unsigned char **buffer,
|
||||
static unsigned asn1_get_length(unsigned char **buffer,
|
||||
unsigned char *bufend);
|
||||
static int asn1_get_type(unsigned char **buffer,
|
||||
unsigned char *bufend);
|
||||
static void asn1_set_integer(unsigned char **buffer,
|
||||
int integer);
|
||||
static void asn1_set_length(unsigned char **buffer,
|
||||
int length);
|
||||
unsigned length);
|
||||
static void asn1_set_oid(unsigned char **buffer,
|
||||
const int *oid);
|
||||
static void asn1_set_packed(unsigned char **buffer,
|
||||
@@ -608,6 +608,8 @@ _cupsSNMPWalk(int fd, /* I - SNMP socket */
|
||||
int count = 0; /* Number of OIDs found */
|
||||
int request_id = 0; /* Current request ID */
|
||||
cups_snmp_t packet; /* Current response packet */
|
||||
int lastoid[CUPS_SNMP_MAX_OID];
|
||||
/* Last OID we got */
|
||||
|
||||
|
||||
/*
|
||||
@@ -631,14 +633,15 @@ _cupsSNMPWalk(int fd, /* I - SNMP socket */
|
||||
*/
|
||||
|
||||
_cupsSNMPCopyOID(packet.object_name, prefix, CUPS_SNMP_MAX_OID);
|
||||
lastoid[0] = -1;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
request_id ++;
|
||||
|
||||
if (!_cupsSNMPWrite(fd, address, version, community,
|
||||
CUPS_ASN1_GET_NEXT_REQUEST, request_id,
|
||||
packet.object_name))
|
||||
CUPS_ASN1_GET_NEXT_REQUEST, request_id,
|
||||
packet.object_name))
|
||||
{
|
||||
DEBUG_puts("5_cupsSNMPWalk: Returning -1");
|
||||
|
||||
@@ -652,7 +655,8 @@ _cupsSNMPWalk(int fd, /* I - SNMP socket */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (!_cupsSNMPIsOIDPrefixed(&packet, prefix))
|
||||
if (!_cupsSNMPIsOIDPrefixed(&packet, prefix) ||
|
||||
_cupsSNMPIsOID(&packet, lastoid))
|
||||
{
|
||||
DEBUG_printf(("5_cupsSNMPWalk: Returning %d", count));
|
||||
|
||||
@@ -666,6 +670,8 @@ _cupsSNMPWalk(int fd, /* I - SNMP socket */
|
||||
return (count > 0 ? count : -1);
|
||||
}
|
||||
|
||||
_cupsSNMPCopyOID(lastoid, packet.object_name, CUPS_SNMP_MAX_OID);
|
||||
|
||||
count ++;
|
||||
|
||||
(*cb)(&packet, data);
|
||||
@@ -1280,7 +1286,13 @@ asn1_get_integer(
|
||||
int value; /* Integer value */
|
||||
|
||||
|
||||
for (value = 0;
|
||||
if (length > sizeof(int))
|
||||
{
|
||||
(*buffer) += length;
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (value = (**buffer & 0x80) ? -1 : 0;
|
||||
length > 0 && *buffer < bufend;
|
||||
length --, (*buffer) ++)
|
||||
value = (value << 8) | **buffer;
|
||||
@@ -1293,18 +1305,32 @@ asn1_get_integer(
|
||||
* 'asn1_get_length()' - Get a value length.
|
||||
*/
|
||||
|
||||
static int /* O - Length */
|
||||
static unsigned /* O - Length */
|
||||
asn1_get_length(unsigned char **buffer, /* IO - Pointer in buffer */
|
||||
unsigned char *bufend) /* I - End of buffer */
|
||||
{
|
||||
int length; /* Length */
|
||||
unsigned length; /* Length */
|
||||
|
||||
|
||||
length = **buffer;
|
||||
(*buffer) ++;
|
||||
|
||||
if (length & 128)
|
||||
length = asn1_get_integer(buffer, bufend, length & 127);
|
||||
{
|
||||
int count; /* Number of bytes for length */
|
||||
|
||||
|
||||
if ((count = length & 127) > sizeof(unsigned))
|
||||
{
|
||||
(*buffer) += count;
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (length = 0;
|
||||
count > 0 && *buffer < bufend;
|
||||
count --, (*buffer) ++)
|
||||
length = (length << 8) | **buffer;
|
||||
}
|
||||
|
||||
return (length);
|
||||
}
|
||||
@@ -1523,7 +1549,7 @@ asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */
|
||||
|
||||
static void
|
||||
asn1_set_length(unsigned char **buffer, /* IO - Pointer in buffer */
|
||||
int length) /* I - Length value */
|
||||
unsigned length) /* I - Length value */
|
||||
{
|
||||
if (length > 255)
|
||||
{
|
||||
|
||||
+2
-2
@@ -118,8 +118,8 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */
|
||||
* Format a string using the hex time values...
|
||||
*/
|
||||
|
||||
snprintf(filename, len - 1, "%s/%08lx%05lx", tmpdir,
|
||||
(unsigned long)curtime.tv_sec, (unsigned long)curtime.tv_usec);
|
||||
snprintf(filename, len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(),
|
||||
(unsigned)(curtime.tv_sec + curtime.tv_usec + tries));
|
||||
#endif /* WIN32 */
|
||||
|
||||
/*
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@
|
||||
*Throughput: "1"
|
||||
*LandscapeOrientation: Plus90
|
||||
*TTRasterizer: Type42
|
||||
*cupsFilter: "application/vnd.cups-raster - 0"
|
||||
*cupsFilter: "application/vnd.cups-raster 0 -"
|
||||
*RequiresPageRegion All: True
|
||||
|
||||
*% These constraints are used to test ppdConflicts() and cupsResolveConflicts()
|
||||
|
||||
+9
-9
@@ -64,8 +64,10 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
int status; /* Exit status */
|
||||
char filename[1024]; /* Filename buffer */
|
||||
cups_file_t *fp; /* File pointer */
|
||||
#ifndef WIN32
|
||||
int fds[2]; /* Open file descriptors */
|
||||
cups_file_t *fdfile; /* File opened with cupsFileOpenFd() */
|
||||
#endif /* !WIN32 */
|
||||
int count; /* Number of lines in file */
|
||||
|
||||
|
||||
@@ -93,6 +95,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
status += random_tests();
|
||||
|
||||
#ifndef WIN32
|
||||
/*
|
||||
* Test fdopen and close without reading...
|
||||
*/
|
||||
@@ -126,6 +129,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
|
||||
puts("PASS");
|
||||
}
|
||||
#endif /* !WIN32 */
|
||||
|
||||
/*
|
||||
* Count lines in euc-jp.txt, rewind, then count again.
|
||||
@@ -371,9 +375,9 @@ random_tests(void)
|
||||
fputs("cupsFileSeek(), cupsFileRead(): ", stdout);
|
||||
|
||||
for (num_records = (pass + 1) * 256, count = (pass + 1) * 256,
|
||||
record = rand() % num_records;
|
||||
record = CUPS_RAND() % num_records;
|
||||
count > 0;
|
||||
count --, record = (record + (rand() & 31) - 16 + num_records) %
|
||||
count --, record = (record + (CUPS_RAND() & 31) - 16 + num_records) %
|
||||
num_records)
|
||||
{
|
||||
/*
|
||||
@@ -467,14 +471,10 @@ read_write_tests(int compression) /* I - Use compression? */
|
||||
* Initialize the write buffer with random data...
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
srand((unsigned)time(NULL));
|
||||
#else
|
||||
srand(time(NULL));
|
||||
#endif /* WIN32 */
|
||||
CUPS_SRAND(time(NULL));
|
||||
|
||||
for (i = 0; i < (int)sizeof(writebuf); i ++)
|
||||
writebuf[i] = rand();
|
||||
writebuf[i] = CUPS_RAND();
|
||||
|
||||
/*
|
||||
* cupsFileOpen(write)
|
||||
@@ -756,7 +756,7 @@ read_write_tests(int compression) /* I - Use compression? */
|
||||
|
||||
fputs("cupsFileGetChar(partial line): ", stdout);
|
||||
|
||||
for (i = 0; i < strlen(partial_line); i ++)
|
||||
for (i = 0; i < (int)strlen(partial_line); i ++)
|
||||
if ((byte = cupsFileGetChar(fp)) < 0)
|
||||
break;
|
||||
else if (byte != partial_line[i])
|
||||
|
||||
+1
-1
@@ -247,7 +247,7 @@ main(int argc, /* I - Number of command-line arguments */
|
||||
for (i = 0, j = 0; i < (int)(sizeof(base64_tests) / sizeof(base64_tests[0])); i ++)
|
||||
{
|
||||
httpEncode64_2(encode, sizeof(encode), base64_tests[i][0],
|
||||
strlen(base64_tests[i][0]));
|
||||
(int)strlen(base64_tests[i][0]));
|
||||
decodelen = (int)sizeof(decode);
|
||||
httpDecode64_2(decode, &decodelen, base64_tests[i][1]);
|
||||
|
||||
|
||||
+66
-18
@@ -570,17 +570,17 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
|
||||
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
|
||||
static const char * const attrs[] = /* Requested attributes */
|
||||
{
|
||||
"document-format",
|
||||
"job-id",
|
||||
"job-priority",
|
||||
"job-k-octets",
|
||||
"job-name",
|
||||
"job-originating-user-name",
|
||||
"job-printer-uri",
|
||||
"job-priority",
|
||||
"job-state",
|
||||
"time-at-completed",
|
||||
"time-at-creation",
|
||||
"time-at-processing",
|
||||
"job-printer-uri",
|
||||
"document-format",
|
||||
"job-name",
|
||||
"job-originating-user-name"
|
||||
"time-at-processing"
|
||||
};
|
||||
|
||||
|
||||
@@ -809,7 +809,8 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D
|
||||
* in the class.
|
||||
*
|
||||
* The returned filename is stored in a static buffer and is overwritten with
|
||||
* each call to @code cupsGetPPD@ or @link cupsGetPPD2@.
|
||||
* each call to @code cupsGetPPD@ or @link cupsGetPPD2@. The caller "owns" the
|
||||
* file that is created and must @code unlink@ the returned filename.
|
||||
*/
|
||||
|
||||
const char * /* O - Filename for PPD file */
|
||||
@@ -840,7 +841,8 @@ cupsGetPPD(const char *name) /* I - Destination name */
|
||||
* in the class.
|
||||
*
|
||||
* The returned filename is stored in a static buffer and is overwritten with
|
||||
* each call to @link cupsGetPPD@ or @code cupsGetPPD2@.
|
||||
* each call to @link cupsGetPPD@ or @code cupsGetPPD2@. The caller "owns" the
|
||||
* file that is created and must @code unlink@ the returned filename.
|
||||
*
|
||||
* @since CUPS 1.1.21/Mac OS X 10.4@
|
||||
*/
|
||||
@@ -873,7 +875,8 @@ cupsGetPPD2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DE
|
||||
*
|
||||
* The "buffer" parameter contains the local PPD filename. If it contains
|
||||
* the empty string, a new temporary file is created, otherwise the existing
|
||||
* file will be overwritten as needed.
|
||||
* file will be overwritten as needed. The caller "owns" the file that is
|
||||
* created and must @code unlink@ the returned filename.
|
||||
*
|
||||
* On success, @code HTTP_OK@ is returned for a new PPD file and
|
||||
* @code HTTP_NOT_MODIFIED@ if the existing PPD file is up-to-date. Any other
|
||||
@@ -1453,6 +1456,9 @@ cupsPrintFiles2(
|
||||
char buffer[8192]; /* Copy buffer */
|
||||
ssize_t bytes; /* Bytes in buffer */
|
||||
http_status_t status; /* Status of write */
|
||||
_cups_globals_t *cg = _cupsGlobals(); /* Global data */
|
||||
ipp_status_t cancel_status; /* Status code to preserve */
|
||||
char *cancel_message; /* Error message to preserve */
|
||||
|
||||
|
||||
DEBUG_printf(("cupsPrintFiles2(http=%p, name=\"%s\", num_files=%d, "
|
||||
@@ -1504,16 +1510,40 @@ cupsPrintFiles2(
|
||||
* Unable to open print file, cancel the job and return...
|
||||
*/
|
||||
|
||||
cupsCancelJob2(http, name, job_id, 0);
|
||||
return (0);
|
||||
_cupsSetError(IPP_DOCUMENT_ACCESS_ERROR, NULL, 0);
|
||||
goto cancel_job;
|
||||
}
|
||||
|
||||
status = cupsStartDocument(http, name, job_id, docname, format,
|
||||
i == (num_files - 1));
|
||||
do
|
||||
{
|
||||
cupsFileRewind(fp);
|
||||
|
||||
while (status == HTTP_CONTINUE &&
|
||||
(bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
|
||||
status = cupsWriteRequestData(http, buffer, bytes);
|
||||
status = cupsStartDocument(http, name, job_id, docname, format,
|
||||
i == (num_files - 1));
|
||||
|
||||
while (status == HTTP_CONTINUE &&
|
||||
(bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
|
||||
status = cupsWriteRequestData(http, buffer, bytes);
|
||||
|
||||
if (status == HTTP_UNAUTHORIZED)
|
||||
{
|
||||
char resource[1024]; /* Printer resource */
|
||||
|
||||
snprintf(resource, sizeof(resource), "/printers/%s", name);
|
||||
|
||||
if (!cupsDoAuthentication(http, "POST", resource))
|
||||
{
|
||||
if (httpReconnect(http))
|
||||
{
|
||||
_cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0);
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
else
|
||||
status = HTTP_AUTHORIZATION_CANCELED;
|
||||
}
|
||||
}
|
||||
while (status == HTTP_UNAUTHORIZED);
|
||||
|
||||
cupsFileClose(fp);
|
||||
|
||||
@@ -1523,12 +1553,30 @@ cupsPrintFiles2(
|
||||
* Unable to queue, cancel the job and return...
|
||||
*/
|
||||
|
||||
cupsCancelJob2(http, name, job_id, 0);
|
||||
return (0);
|
||||
goto cancel_job;
|
||||
}
|
||||
}
|
||||
|
||||
return (job_id);
|
||||
|
||||
/*
|
||||
* If we get here, something happened while sending the print job so we need
|
||||
* to cancel the job without setting the last error (since we need to preserve
|
||||
* the current error...
|
||||
*/
|
||||
|
||||
cancel_job:
|
||||
|
||||
cancel_status = cg->last_error;
|
||||
cancel_message = cg->last_status_message ?
|
||||
_cupsStrRetain(cg->last_status_message) : NULL;
|
||||
|
||||
cupsCancelJob2(http, name, job_id, 0);
|
||||
|
||||
cg->last_error = cancel_status;
|
||||
cg->last_status_message = cancel_message;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+30
-26
@@ -7,29 +7,33 @@ Terminal=false
|
||||
Type=Application
|
||||
Name=Manage Printing
|
||||
Comment=CUPS Web Interface
|
||||
Name[de.UTF-8]=Druckerverwaltung
|
||||
Comment[de.UTF-8]=CUPS Webinterface
|
||||
Name[en_US.UTF-8]=Manage Printing
|
||||
Comment[en_US.UTF-8]=CUPS Web Interface
|
||||
Name[es.UTF-8]=Administrar impresión
|
||||
Comment[es.UTF-8]=Interfaz Web de CUPS
|
||||
Name[et.UTF-8]=Trükkimise haldur
|
||||
Comment[et.UTF-8]=CUPS-i veebiliides
|
||||
Name[fr.UTF-8]=Gestionnaire d'impression
|
||||
Comment[fr.UTF-8]=Interface Web de CUPS
|
||||
Name[he.UTF-8]=נהל הדפסות
|
||||
Comment[he.UTF-8]=ממשק דפדפן של CUPS
|
||||
Name[id.UTF-8]=Manajemen Pencetakan
|
||||
Comment[id.UTF-8]=Antarmuka Web CUPS
|
||||
Name[it.UTF-8]=Gestione stampa
|
||||
Comment[it.UTF-8]=Interfaccia web di CUPS
|
||||
Name[ja.UTF-8]=印刷の管理
|
||||
Comment[ja.UTF-8]=CUPS Web インタフェース
|
||||
Name[pl.UTF-8]=Zarządzanie drukowaniem
|
||||
Comment[pl.UTF-8]=Interfejs WWW CUPS
|
||||
Name[ru.UTF-8]=Настройка печати
|
||||
Comment[ru.UTF-8]=Настройка CUPS
|
||||
Name[zh.UTF-8]=打印机管理
|
||||
Comment[zh.UTF-8]=CUPS网页界面
|
||||
Name[zh_TW.UTF-8]=印表管理
|
||||
Comment[zh_TW.UTF-8]=CUPS 網頁介面
|
||||
Name[de]=Druckerverwaltung
|
||||
Comment[de]=CUPS Webinterface
|
||||
Name[en_US]=Manage Printing
|
||||
Comment[en_US]=CUPS Web Interface
|
||||
Name[es]=Administrar impresión
|
||||
Comment[es]=Interfaz Web de CUPS
|
||||
Name[et]=Trükkimise haldur
|
||||
Comment[et]=CUPS-i veebiliides
|
||||
Name[eu]=Kudeatu inprimaketak
|
||||
Comment[eu]=CUPSen web interfazea
|
||||
Name[fr]=Gestionnaire d'impression
|
||||
Comment[fr]=Interface Web de CUPS
|
||||
Name[he]=נהל הדפסות
|
||||
Comment[he]=ממשק דפדפן של CUPS
|
||||
Name[id]=Manajemen Pencetakan
|
||||
Comment[id]=Antarmuka Web CUPS
|
||||
Name[it]=Gestione stampa
|
||||
Comment[it]=Interfaccia web di CUPS
|
||||
Name[ja]=印刷の管理
|
||||
Comment[ja]=CUPS Web インタフェース
|
||||
Name[pl]=Zarządzanie drukowaniem
|
||||
Comment[pl]=Interfejs WWW CUPS
|
||||
Name[ru]=Настройка печати
|
||||
Comment[ru]=Настройка CUPS
|
||||
Name[sv]=Hantera skrivare
|
||||
Comment[sv]=CUPS webb-gränssnitt
|
||||
Name[zh]=打印机管理
|
||||
Comment[zh]=CUPS网页界面
|
||||
Name[zh_TW]=印表管理
|
||||
Comment[zh_TW]=CUPS 網頁介面
|
||||
|
||||
+2
-2
@@ -190,8 +190,8 @@ install-languages:
|
||||
for lang in $(LANGUAGES); do \
|
||||
if test -d $$lang; then \
|
||||
$(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang; \
|
||||
$(INSTALL_MAN) $$lang/index.html $(DOCDIR)/$$lang; \
|
||||
test -f $$lang/cups.css && $(INSTALL_MAN) $$lang/cups.css $(DOCDIR)/$$lang; \
|
||||
$(INSTALL_DATA) $$lang/index.html $(DOCDIR)/$$lang; \
|
||||
$(INSTALL_DATA) $$lang/cups.css $(DOCDIR)/$$lang >/dev/null 2>&1 || true; \
|
||||
fi; \
|
||||
done
|
||||
|
||||
|
||||
+5
-1
@@ -27,7 +27,7 @@ P.example {
|
||||
font-style: italic;
|
||||
margin-left: 36pt;
|
||||
}
|
||||
|
||||
|
||||
PRE.example {
|
||||
background: white;
|
||||
border: dotted thin #999999;
|
||||
@@ -238,6 +238,10 @@ H2 SPAN.info, H3 SPAN.info, H4 SPAN.info {
|
||||
color: white;
|
||||
}
|
||||
|
||||
TH.conflict {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
H1.title {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@ SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
|
||||
<TD CLASS="sel"><A HREF="/"> Startseite </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/admin"> Verwaltung </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/classes/"> Klassen </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/help/"> On-Line Hilfe </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/jobs/"> Auftrüge </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/help/"> Online Hilfe </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/jobs/"> Aufträge </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/printers/"> Drucker </A></TD>
|
||||
<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
|
||||
TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
|
||||
@@ -31,7 +31,7 @@ AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
|
||||
|
||||
<H1>Common UNIX Printing System @CUPS_VERSION@</H1>
|
||||
|
||||
<P>CUPS ist das auf Standards basierte, Open-Source Drucker System, welches von
|
||||
<P>CUPS ist das auf Standards basierte, Open-Source Drucker System, welches von
|
||||
<A HREF="http://www.apple.com/">Apple Inc.</A> für Mac OS<SUP>®</SUP> X und
|
||||
andere UNIX<SUP>®</SUP>-ähnliche Betriebssysteme entwickelt wird.</P>
|
||||
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
|
||||
<TITLE>Hasiera - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
|
||||
<LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
|
||||
<LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<TABLE CLASS="page" SUMMARY="{title}">
|
||||
<TR><TD CLASS="body">
|
||||
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
|
||||
<TR HEIGHT="36">
|
||||
<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
|
||||
SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
|
||||
<TD CLASS="sel"><A HREF="/"> Hasiera </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/admin"> Administrazioa </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/classes/"> Klaseak </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/help/"> Lineako laguntza </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/jobs/"> Lanak </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/printers/"> Inprimagailuak </A></TD>
|
||||
<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
|
||||
TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Bilatu laguntzan"
|
||||
AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
|
||||
<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<TABLE CLASS="indent" SUMMARY="">
|
||||
<TR><TD STYLE="padding-right: 20px;">
|
||||
|
||||
<H1>CUPS @CUPS_VERSION@</H1>
|
||||
|
||||
<P><A HREF="http://www.apple.com/">Apple Inc.</A>-ek Mac OS<SUP>®</SUP> X eta
|
||||
beste UNIX<SUP>®</SUP> bezalako sistema eragileentzako iturburu irekiko
|
||||
inprimatzeko sisteman oinarrituta dago.</P>
|
||||
|
||||
</TD>
|
||||
<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
|
||||
HEIGHT="128" ALT="CUPS"></A></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<TABLE CLASS="indent" SUMMARY="">
|
||||
<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
|
||||
|
||||
<H2>CUPS erabiltzaileentzako</H2>
|
||||
|
||||
<P><A HREF="help/overview.html">CUPSen gainbegiraketa</A></P>
|
||||
|
||||
<P><A HREF="help/options.html">Komando-lerroaren bidez inprimatzea eta aukerak</A></P>
|
||||
|
||||
<P><A HREF="help/whatsnew.html">CUPS 1.4 bertsioak dakartzan berrikuntza.</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Erabiltzaileen foroa</A></P>
|
||||
|
||||
</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
|
||||
|
||||
<H2>CUPS administratzaileentzako</H2>
|
||||
|
||||
<P><A HREF="admin">Inprimagailuak eta klaseak gehitzea</A></P>
|
||||
|
||||
<P><A HREF="help/policies.html">Kudeaketako eragiketen politikak</A></P>
|
||||
|
||||
<P><A HREF="help/accounting.html">Inprimagailuaren oinarrizko kontabilitatea</A></P>
|
||||
|
||||
<P><A HREF="help/security.html">Zerbitzariaren segurtasuna</A></P>
|
||||
|
||||
<P><A HREF="help/kerberos.html">Kerberos autentifikazioa erabiltzea</A></P>
|
||||
|
||||
<P><A HREF="help/network.html">Sareko inprimagailuak erabiltzea</A></P>
|
||||
|
||||
<P><A HREF="help/ref-cupsd-conf.html">cupsd.conf erreferentzia</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/ppd.php">Bilatu inprimagailuaren kontrolatzaileak</A></P>
|
||||
|
||||
</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
|
||||
|
||||
<H2>CUPS garatzaileentzako</H2>
|
||||
|
||||
<P><A HREF="help/api-overview.html">Sarrera CUPSen programaziora</A></P>
|
||||
|
||||
<P><A HREF="help/api-cups.html">CUPSen APIa</A></P>
|
||||
|
||||
<P><A HREF="help/api-filter.html">Iragazkien eta atzeko planoan programatzeea</A></P>
|
||||
|
||||
<P><A HREF="help/api-httpipp.html">HTTP eta IPP APIak</A></P>
|
||||
|
||||
<P><A HREF="help/api-ppd.html">PPD APIa</A></P>
|
||||
|
||||
<P><A HREF="help/api-raster.html">Bilbearen APIa</A></P>
|
||||
|
||||
<P><A HREF="help/ref-ppdcfile.html">PPD kontrolatzaileen konpilatzailearen informazioaren fitxategiaren erreferentzia</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Garatzaileen forua</A></P>
|
||||
|
||||
</TD></TR>
|
||||
</TABLE>
|
||||
|
||||
</TD></TR>
|
||||
<TR><TD> </TD></TR>
|
||||
<TR><TD CLASS="trailer">CUPS eta CUPSen logotipoa <A HREF="http://www.apple.com">Apple Inc.</A>en marka erregistratuaj dira.
|
||||
CUPSen copyright-a 2007-2009 Apple Inc. Eskubide guztiak gordeta.</TD></TR>
|
||||
</TABLE>
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
|
||||
<body>
|
||||
<div class='body'>
|
||||
<!--
|
||||
"$Id: api-cups.html 8653 2009-05-16 23:53:28Z mike $"
|
||||
"$Id: api-cups.html 8726 2009-06-22 20:46:13Z mike $"
|
||||
|
||||
CUPS API header for the Common UNIX Printing System (CUPS).
|
||||
|
||||
@@ -475,7 +475,7 @@ specified server.">cupsPrintFiles2</a></li>
|
||||
<li><a href="#cups_ptype_e" title="Printer type/capability bit constants">cups_ptype_e</a></li>
|
||||
</ul></li>
|
||||
<!--
|
||||
"$Id: api-cups.html 8653 2009-05-16 23:53:28Z mike $"
|
||||
"$Id: api-cups.html 8726 2009-06-22 20:46:13Z mike $"
|
||||
|
||||
CUPS API introduction for the Common UNIX Printing System (CUPS).
|
||||
|
||||
@@ -1491,7 +1491,8 @@ const char *cupsGetPPD (<br>
|
||||
in the class.<br>
|
||||
<br>
|
||||
The returned filename is stored in a static buffer and is overwritten with
|
||||
each call to <code>cupsGetPPD</code> or <a href="#cupsGetPPD2"><code>cupsGetPPD2</code></a>.</p>
|
||||
each call to <code>cupsGetPPD</code> or <a href="#cupsGetPPD2"><code>cupsGetPPD2</code></a>. The caller "owns" the
|
||||
file that is created and must <code>unlink</code> the returned filename.</p>
|
||||
<h3 class="function"><span class="info"> CUPS 1.1.21/Mac OS X 10.4 </span><a name="cupsGetPPD2">cupsGetPPD2</a></h3>
|
||||
<p class="description">Get the PPD file for a printer from the specified server.</p>
|
||||
<p class="code">
|
||||
@@ -1513,7 +1514,8 @@ const char *cupsGetPPD2 (<br>
|
||||
in the class.<br>
|
||||
<br>
|
||||
The returned filename is stored in a static buffer and is overwritten with
|
||||
each call to <a href="#cupsGetPPD"><code>cupsGetPPD</code></a> or <code>cupsGetPPD2</code>.
|
||||
each call to <a href="#cupsGetPPD"><code>cupsGetPPD</code></a> or <code>cupsGetPPD2</code>. The caller "owns" the
|
||||
file that is created and must <code>unlink</code> the returned filename.
|
||||
|
||||
</p>
|
||||
<h3 class="function"><span class="info"> CUPS 1.4/Mac OS X 10.6 </span><a name="cupsGetPPD3">cupsGetPPD3</a></h3>
|
||||
@@ -1549,7 +1551,8 @@ the server.<br>
|
||||
<br>
|
||||
The "buffer" parameter contains the local PPD filename. If it contains
|
||||
the empty string, a new temporary file is created, otherwise the existing
|
||||
file will be overwritten as needed.<br>
|
||||
file will be overwritten as needed. The caller "owns" the file that is
|
||||
created and must <code>unlink</code> the returned filename.<br>
|
||||
<br>
|
||||
On success, <code>HTTP_OK</code> is returned for a new PPD file and
|
||||
<code>HTTP_NOT_MODIFIED</code> if the existing PPD file is up-to-date. Any other
|
||||
|
||||
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
|
||||
<body>
|
||||
<div class='body'>
|
||||
<!--
|
||||
"$Id: api-filter.html 8673 2009-05-22 17:34:15Z mike $"
|
||||
"$Id: api-filter.html 8718 2009-06-18 17:41:03Z mike $"
|
||||
|
||||
Filter and backend programming header for the Common UNIX Printing System
|
||||
(CUPS).
|
||||
@@ -421,7 +421,7 @@ div.contents ul.subcontents li {
|
||||
<li><a href="#cups_sc_status_e" title="Response status codes">cups_sc_status_e</a></li>
|
||||
</ul></li>
|
||||
<!--
|
||||
"$Id: api-filter.html 8673 2009-05-22 17:34:15Z mike $"
|
||||
"$Id: api-filter.html 8718 2009-06-18 17:41:03Z mike $"
|
||||
|
||||
Filter and backend programming introduction for the Common UNIX Printing
|
||||
System (CUPS).
|
||||
@@ -549,7 +549,7 @@ when running print filters and backends:</p>
|
||||
|
||||
<dl class="code">
|
||||
|
||||
<dt>APPLE_LANGUAGES</dt>
|
||||
<dt>APPLE_LANGUAGE</dt>
|
||||
<dd>The Apple language identifier associated with the job
|
||||
(Mac OS X only).</dd>
|
||||
|
||||
@@ -686,7 +686,16 @@ prefix strings:</p>
|
||||
current queue. Typically this is used to indicate persistent media,
|
||||
ink, toner, and configuration conditions or errors on a printer.
|
||||
<a href='#TABLE2'>Table 2</a> lists the standard state keywords -
|
||||
use vendor-prefixed ("com.acme.foo") keywords for custom states.</dd>
|
||||
use vendor-prefixed ("com.acme.foo") keywords for custom states.
|
||||
|
||||
<blockquote><b>Note:</b>
|
||||
|
||||
<p>"STATE:" messages often provide visible alerts to the user. For example, on
|
||||
Mac OS X setting a printer-state-reason value with an "-error" or "-warning"
|
||||
suffix will cause the printer's dock item to bounce if the corresponding reason
|
||||
is localized with a cupsIPPReason keyword in the printer's PPD file.</p>
|
||||
|
||||
</blockquote></dd>
|
||||
|
||||
<dt>WARNING: message</dt>
|
||||
<dd>Sets the printer-state-message attribute and adds the specified
|
||||
@@ -698,7 +707,6 @@ prefix strings:</p>
|
||||
<p>Messages without one of these prefixes are treated as if they began with
|
||||
the "DEBUG:" prefix string.</p>
|
||||
|
||||
|
||||
<div class='table'><table width='80%' summary='Table 1: Standard marker-types Values'>
|
||||
<caption>Table 1: <a name='TABLE1'>Standard marker-types Values</a></caption>
|
||||
<thead>
|
||||
|
||||
@@ -338,7 +338,7 @@ div.contents ul.subcontents li {
|
||||
<body>
|
||||
<div class='body'>
|
||||
<!--
|
||||
"$Id: api-ppdc.html 8653 2009-05-16 23:53:28Z mike $"
|
||||
"$Id: api-ppdc.html 8704 2009-06-10 15:51:21Z mike $"
|
||||
|
||||
PPD Compiler API header for CUPS.
|
||||
|
||||
@@ -411,7 +411,7 @@ div.contents ul.subcontents li {
|
||||
<li><a href="#ppdcOptType" title="// Option type">ppdcOptType</a></li>
|
||||
</ul></li>
|
||||
<!--
|
||||
"$Id: api-ppdc.html 8653 2009-05-16 23:53:28Z mike $"
|
||||
"$Id: api-ppdc.html 8704 2009-06-10 15:51:21Z mike $"
|
||||
|
||||
PPD Compiler API introduction for CUPS.
|
||||
|
||||
@@ -865,6 +865,22 @@ void add_size (<br>
|
||||
</dl>
|
||||
<h5 class="returnvalue">Return Value</h5>
|
||||
<p class="description">Matching option or NULL</p>
|
||||
<h4 class="method"><a name="find_option_group">find_option_group</a></h4>
|
||||
<p class="description"></p>
|
||||
<p class="code">
|
||||
<a href="#ppdcOption">ppdcOption</a> *find_option_group (<br>
|
||||
const char *n,<br>
|
||||
<a href="#ppdcGroup">ppdcGroup</a> **mg<br>
|
||||
);</p>
|
||||
<h5 class="parameters">Parameters</h5>
|
||||
<dl>
|
||||
<dt>n</dt>
|
||||
<dd class="description">Option name</dd>
|
||||
<dt>mg</dt>
|
||||
<dd class="description">Matching group or NULL</dd>
|
||||
</dl>
|
||||
<h5 class="returnvalue">Return Value</h5>
|
||||
<p class="description">Matching option or NULL</p>
|
||||
<h4 class="method"><a name="ppdcDriver">ppdcDriver</a></h4>
|
||||
<p class="description"></p>
|
||||
<p class="code">
|
||||
|
||||
@@ -21,8 +21,8 @@ can be modified using your favorite text editor, you should
|
||||
normally use the <A HREF="man-lpadmin.html">lpadmin(8)</A>
|
||||
command, web interface, or any of the available GUIs to manage
|
||||
your classes instead. If you do choose to edit this file
|
||||
manually, you will need to restart the scheduler to make them
|
||||
active.</P>
|
||||
manually, you will need to stop the scheduler first, make your
|
||||
changes, and then start the scheduler to make them active.</P>
|
||||
|
||||
|
||||
<H2 CLASS="title"><A NAME="Accepting">Accepting</A></H2>
|
||||
|
||||
@@ -123,7 +123,8 @@ to the access log file. The following levels are defined:</P>
|
||||
Allow from nnn.nnn.nnn.nnn
|
||||
Allow from nnn.nnn.nnn.nnn/mm
|
||||
Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
Allow from xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
|
||||
Allow from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
|
||||
Allow from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]/mmm
|
||||
Allow from @LOCAL
|
||||
Allow from @IF(name)
|
||||
</Location>
|
||||
@@ -135,8 +136,14 @@ to the access log file. The following levels are defined:</P>
|
||||
address, or network that is allowed access to the server.
|
||||
<CODE>Allow</CODE> directives are cummulative, so multiple
|
||||
<CODE>Allow</CODE> directives can be used to allow access for
|
||||
multiple hosts or networks. The <CODE>/mm</CODE> notation
|
||||
specifies a CIDR netmask, as shown in Table 1.</P>
|
||||
multiple hosts or networks.</P>
|
||||
|
||||
<P>Host and domain name matching require that you enable the <A
|
||||
HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
|
||||
directive.</P>
|
||||
|
||||
<P>The <CODE>/mm</CODE> notation specifies a CIDR netmask, as shown in
|
||||
<A HREF="#TABLE1">Table 1</A>.</P>
|
||||
|
||||
<DIV CLASS="table"><TABLE SUMMARY="CIDR Netmasks">
|
||||
<CAPTION>Table 1: <A NAME="TABLE1">CIDR Netmasks</A></CAPTION>
|
||||
@@ -388,10 +395,10 @@ browse packets from all hosts.</P>
|
||||
HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
|
||||
directive.</P>
|
||||
|
||||
<P>IP address matching supports exact matches, partial addresses
|
||||
that match networks using netmasks of 255.0.0.0, 255.255.0.0, and
|
||||
255.255.255.0, or network addresses using the specified netmask
|
||||
or bit count.</P>
|
||||
<P>IP address matching supports exact matches, partial addresses that match
|
||||
networks using netmasks of 255.0.0.0, 255.255.0.0, and 255.255.255.0, or network
|
||||
addresses using the specified netmask or bit count. The <CODE>/mm</CODE>
|
||||
notation specifies a CIDR netmask, a shown in <A HREF="TABLE1">Table 1</A>.</P>
|
||||
|
||||
<P>The <CODE>@LOCAL</CODE> name will allow browse data from all
|
||||
local interfaces. The <CODE>@IF(name)</CODE> name will allow
|
||||
@@ -426,10 +433,10 @@ browse packets from any hosts.</P>
|
||||
HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
|
||||
directive.</P>
|
||||
|
||||
<P>IP address matching supports exact matches, partial addresses
|
||||
that match networks using netmasks of 255.0.0.0, 255.255.0.0, and
|
||||
255.255.255.0, or network addresses using the specified netmask
|
||||
or bit count.</P>
|
||||
<P>IP address matching supports exact matches, partial addresses that match
|
||||
networks using netmasks of 255.0.0.0, 255.255.0.0, and 255.255.255.0, or network
|
||||
addresses using the specified netmask or bit count. The <CODE>/mm</CODE>
|
||||
notation specifies a CIDR netmask, a shown in <A HREF="TABLE1">Table 1</A>.</P>
|
||||
|
||||
<P>The <CODE>@LOCAL</CODE> name will block browse data from all
|
||||
local interfaces. The <CODE>@IF(name)</CODE> name will block
|
||||
@@ -1065,7 +1072,8 @@ printers are shared (published) by default. The default is
|
||||
Deny from nnn.nnn.nnn.nnn
|
||||
Deny from nnn.nnn.nnn.nnn/mm
|
||||
Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
|
||||
Deny from xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
|
||||
Deny from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
|
||||
Deny from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]/mmm
|
||||
Deny from @LOCAL
|
||||
Deny from @IF(name)
|
||||
</Location>
|
||||
@@ -1077,9 +1085,14 @@ printers are shared (published) by default. The default is
|
||||
address, or network that is denied access to the server.
|
||||
<CODE>Deny</CODE> directives are cummulative, so multiple
|
||||
<CODE>Deny</CODE> directives can be used to allow access for
|
||||
multiple hosts or networks. The <CODE>/mm</CODE> notation
|
||||
specifies a CIDR netmask, a shown in <A HREF="TABLE1">Table
|
||||
1</A>.</P>
|
||||
multiple hosts or networks.</P>
|
||||
|
||||
<P>Host and domain name matching require that you enable the <A
|
||||
HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
|
||||
directive.</P>
|
||||
|
||||
<P>The <CODE>/mm</CODE> notation specifies a CIDR netmask, a shown in
|
||||
<A HREF="TABLE1">Table 1</A>.</P>
|
||||
|
||||
<P>The <CODE>@LOCAL</CODE> name will deny access from all local
|
||||
interfaces. The <CODE>@IF(name)</CODE> name will deny access from
|
||||
@@ -1093,7 +1106,7 @@ HREF="#Location"><CODE>Location</CODE></A> or <A
|
||||
HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
|
||||
|
||||
|
||||
<H2 CLASS="title"><A NAME="DirtyCleanInterval">DirtyCleanInterval</A></H2>
|
||||
<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/Mac OS X 10.6</SPAN><A NAME="DirtyCleanInterval">DirtyCleanInterval</A></H2>
|
||||
|
||||
<H3>Examples</H3>
|
||||
|
||||
@@ -1106,7 +1119,9 @@ DirtyCleanInterval 0
|
||||
|
||||
<P>The <CODE>DirtyCleanInterval</CODE> directive specifies the number of
|
||||
seconds to wait before updating configuration and state files for printers,
|
||||
classes, subscriptions, and jobs. The default is 30 seconds.</P>
|
||||
classes, subscriptions, and jobs. The default is 30 seconds. A value of 0
|
||||
causes the update to occur as soon as possible, typically within a few
|
||||
milliseconds.</P>
|
||||
|
||||
|
||||
<H2 CLASS="title"><A NAME="DocumentRoot">DocumentRoot</A></H2>
|
||||
|
||||
@@ -45,10 +45,10 @@ the page started printing. The format of this field is identical
|
||||
to the <I>data-time</I> field in the <VAR>access_log</VAR>
|
||||
file.</P>
|
||||
|
||||
<P>The <I>page-number</I> and <I>num-pages</I> fields contain the
|
||||
<P>The <I>page-number</I> and <I>num-copies</I> fields contain the
|
||||
page number and number of copies being printed of that page. For
|
||||
printers that cannot produce copies on their own, the
|
||||
<I>num-pages</I> field will always be 1.</P>
|
||||
<I>num-copies</I> field will always be 1.</P>
|
||||
|
||||
<P>The <I>job-billing</I> field contains a copy of the
|
||||
<CODE>job-billing</CODE> attribute provided with the IPP
|
||||
|
||||
@@ -380,10 +380,10 @@ least 100 files.</p>
|
||||
inclusion in a driver. The name with optional user text defines
|
||||
the name for the media size and is used with the <a
|
||||
href='#MediaSize'><code>MediaSize</code></a> directive to associate
|
||||
the media size with the driver. The name may only contain
|
||||
letters, numbers, and the underscore and may not exceed 40
|
||||
characters in length. The user text, if supplied, may not exceed
|
||||
80 characters in length.</p>
|
||||
the media size with the driver. The name may contain up to 40 ASCII
|
||||
characters within the range of decimal 33 to decimal 126 inclusive,
|
||||
except for the characters comma (44), slash (47) and colon (58).
|
||||
The user text, if supplied, may not exceed 80 bytes in length.</p>
|
||||
|
||||
<p>The width and length define the dimensions of the media. Each
|
||||
number is optionally followed by one of the following unit
|
||||
@@ -459,17 +459,15 @@ Attribute fooProfile "Photo/Photographic Profile" "photopro.icc"
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The <code>Attribute</code> directive creates a PPD attribute. The
|
||||
name is any combination of letters, numbers, and the underscore
|
||||
and can be up to 40 characters in length.</p>
|
||||
name may contain up to 40 ASCII characters within the range of decimal
|
||||
33 to decimal 126 inclusive, except for the characters comma (44),
|
||||
slash (47) and colon (58).</p>
|
||||
|
||||
<p>The selector can be the empty string (<code>""</code>), a keyword
|
||||
consisting of up to 40 letters, numbers, and the underscore, or
|
||||
a string composed of a keyword and user text of up to 80
|
||||
characters.</p>
|
||||
<p>The selector can be the empty string (<code>""</code>) or text of up
|
||||
to 80 bytes.</p>
|
||||
|
||||
<p>The value is any string or number; the string may contain
|
||||
multiple lines, however no one line may exceed 255
|
||||
characters.</p>
|
||||
<p>The value is any string or number; the string may contain multiple
|
||||
lines, however no one line may exceed 255 bytes.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -495,14 +493,15 @@ Choice "False/No" "<</cupsCompression 0>>setpagedevice"
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The <code>Choice</code> directive adds a single choice to the
|
||||
current option. The name is any combination of letters, numbers,
|
||||
and the underscore and can be up to 40 characters in length.</p>
|
||||
current option. The name may contain up to 40 ASCII characters within
|
||||
the range of decimal 33 to decimal 126 inclusive, except for the
|
||||
characters comma (44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
<p>If provided, the text can be any string up to 80 bytes
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
|
||||
<p>The code is any string and may contain multiple lines,
|
||||
however no one line may exceed 255 characters.</p>
|
||||
however no one line may exceed 255 bytes.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -568,11 +567,12 @@ ColorModel CMYK cmyk chunky 0
|
||||
|
||||
<p>The <code>ColorModel</code> directive is a convenience directive
|
||||
which creates a ColorModel option and choice for the current
|
||||
printer driver. The name is any combination of letters, numbers,
|
||||
and the underscore and can be up to 40 characters in length.</p>
|
||||
printer driver. The name may contain up to 40 ASCII characters within
|
||||
the range of decimal 33 to decimal 126 inclusive, except for the
|
||||
characters comma (44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<p>The colorspace argument is one of the standard colorspace
|
||||
keywords defined later in this appendix in the section titled,
|
||||
@@ -698,7 +698,7 @@ MA 02111 USA"
|
||||
<p>The <code>Copyright</code> directive adds text comments to the
|
||||
top of a PPD file, typically for use in copyright notices. The
|
||||
text argument can contain multiple lines of text, but no line
|
||||
may exceed 255 characters.</p>
|
||||
may exceed 255 bytes.</p>
|
||||
|
||||
|
||||
<h2 class="title"><a name='CustomMedia'>CustomMedia</a></h2>
|
||||
@@ -730,11 +730,12 @@ CustomMedia "A4/A4 - 210x297mm" 210mm 297mm 12 12 12 12
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The <code>CustomMedia</code> directive adds a custom media size to
|
||||
the driver. The name is any combination of letters, numbers,
|
||||
and the underscore and can be up to 40 characters in length.</p>
|
||||
the driver. The name may contain up to 40 ASCII characters within the
|
||||
range of decimal 33 to decimal 126 inclusive, except for the characters
|
||||
comma (44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<p>The width and length arguments specify the dimensions of the
|
||||
media as defined for the <a href="#_media"><code>#media</code></a>
|
||||
@@ -747,7 +748,7 @@ printable margins of the media.</p>
|
||||
PostScript commands to run for the <code>PageSize</code> and
|
||||
<code>PageRegion</code> options, respectively. The commands can
|
||||
contain multiple lines, however no line may be more than 255
|
||||
characters in length.</p>
|
||||
bytes in length.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -823,11 +824,12 @@ therefore the darkness of the print.</p>
|
||||
the Dymo driver from 0 (lowest) to 3 (highest), with 2
|
||||
representing the normal setting.</p>
|
||||
|
||||
<p>The name is any combination of letters, numbers, and the
|
||||
underscore and can be up to 40 characters in length.</p>
|
||||
<p>The name may contain up to 40 ASCII characters within the range of
|
||||
decimal 33 to decimal 126 inclusive, except for the characters comma
|
||||
(44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -1044,14 +1046,15 @@ Finishing "Glossy/Photo Overcoat"
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The <code>Finishing</code> directive adds a choice to the
|
||||
<code>cupsFinishing</code> option. The name is any combination of
|
||||
letters, numbers, and the underscore and can be up to 40
|
||||
characters in length. The name is stored in the
|
||||
<code>OutputType</code> attribute in the PostScript page device
|
||||
dictionary.</p>
|
||||
<code>cupsFinishing</code> option. The name may contain up to 40 ASCII
|
||||
characters within the range of decimal 33 to decimal 126 inclusive,
|
||||
except for the characters comma (44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<p>The name is stored in the <code>OutputType</code> attribute in the
|
||||
PostScript page device dictionary.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -1091,8 +1094,7 @@ Font Unicode-Foo Expert "(2.0)" Adobe-Identity ROM
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The <code>Font</code> directive defines a "device font" for the
|
||||
current printer driver. The name is the PostScript font
|
||||
name.</p>
|
||||
current printer driver. The name is the PostScript font name.</p>
|
||||
|
||||
<p>The encoding is the default encoding of the font, usually
|
||||
<code>Standard</code>, <code>Expert</code>, or <code>Special</code>, as
|
||||
@@ -1139,14 +1141,16 @@ Group "Special/Vendor Options"
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The <code>Group</code> directive specifies the group for new
|
||||
<code>Option</code> directives. The name is any combination of
|
||||
letters, numbers, and the underscore and can be up to 40
|
||||
characters in length. The names <code>General</code> and
|
||||
<code>InstallableOptions</code> are predefined for the standard
|
||||
Adobe UI keywords and for installable options, respectively.</p>
|
||||
<code>Option</code> directives. The name may contain up to 40 ASCII
|
||||
characters within the range of decimal 33 to decimal 126 inclusive,
|
||||
except for the characters comma (44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 40 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 40 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<p>The names <code>General</code> and <code>InstallableOptions</code>
|
||||
are predefined for the standard Adobe UI keywords and for installable
|
||||
options, respectively.</p>
|
||||
|
||||
<center><table width='80%' border='1' bgcolor='#cccccc' cellpadding='5' cellspacing='0'>
|
||||
<tr>
|
||||
@@ -1154,8 +1158,8 @@ in length. If no text is provided, the name is used.</p>
|
||||
|
||||
<p>Because of certain API binary compatibility issues,
|
||||
CUPS limits the length of PPD group translation strings
|
||||
(text) to 40 characters, while the PPD specification
|
||||
allows for up to 80 characters.</p>
|
||||
(text) to 40 bytes, while the PPD specification
|
||||
allows for up to 80 bytes.</p>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1229,11 +1233,12 @@ from 0 to 2<sup>32</sup>-1 specifying the value that is placed
|
||||
in the <code>MediaPosition</code> attribute in the PostScript page
|
||||
device dictionary.</p>
|
||||
|
||||
<p>The name is any combination of letters, numbers, and the
|
||||
underscore and can be up to 40 characters in length.</p>
|
||||
<p>The name may contain up to 40 ASCII characters within the range of
|
||||
decimal 33 to decimal 126 inclusive, except for the characters comma
|
||||
(44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -1271,11 +1276,12 @@ Installable "Option1/Duplexer Installed"
|
||||
|
||||
<p>The <code>Installable</code> directive adds a new boolean option
|
||||
to the <code>InstallableOptions</code> group with a default value of
|
||||
<code>False</code>. The name is any combination of letters, numbers,
|
||||
and the underscore and can be up to 40 characters in length.</p>
|
||||
<code>False</code>. The name may contain up to 40 ASCII characters
|
||||
within the range of decimal 33 to decimal 126 inclusive, except for
|
||||
the characters comma (44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
|
||||
<h2 class="title"><a name='LocAttribute'>LocAttribute</a></h2>
|
||||
@@ -1295,17 +1301,15 @@ LocAttribute fooProfile "Photo/Photographic Profile" "photopro.icc"
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The <code>LocAttribute</code> directive creates a localized PPD
|
||||
attribute. The name is any combination of letters, numbers, and the
|
||||
underscore and can be up to 40 characters in length.</p>
|
||||
attribute. The name may contain up to 40 ASCII characters within the
|
||||
range of decimal 33 to decimal 126 inclusive, except for the characters
|
||||
comma (44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>The selector can be the empty string (<code>""</code>), a keyword
|
||||
consisting of up to 40 letters, numbers, and the underscore, or
|
||||
a string composed of a keyword and user text of up to 80
|
||||
characters.</p>
|
||||
<p>The selector can be the empty string (<code>""</code>) or text of up
|
||||
to 80 bytes.</p>
|
||||
|
||||
<p>The value is any string or number; the string may contain
|
||||
multiple lines, however no one line may exceed 255
|
||||
characters.</p>
|
||||
<p>The value is any string or number; the string may contain multiple
|
||||
lines, however no one line may exceed 255 bytes.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -1458,13 +1462,15 @@ from 0 to 2<sup>32</sup>-1 specifying the value that is placed
|
||||
in the <code>cupsMediaType</code> attribute in the PostScript page
|
||||
device dictionary.</p>
|
||||
|
||||
<p>The name is any combination of letters, numbers, and the
|
||||
underscore and can be up to 40 characters in length. The name is
|
||||
placed in the <code>MediaType</code> attribute in the PostScript
|
||||
page device dictionary.</p>
|
||||
<p>The name may contain up to 40 ASCII characters within the range of
|
||||
decimal 33 to decimal 126 inclusive, except for the characters comma
|
||||
(44), slash (47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<p>The name is placed in the <code>MediaType</code> attribute in the
|
||||
PostScript page device dictionary.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -1532,7 +1538,7 @@ name is any string of letters, numbers, spaces, and the
|
||||
characters ".", "/", "-", and "+" and should not begin with the
|
||||
manufacturer name since the PPD compiler will add this
|
||||
automatically for you. The maximum length of the name string is
|
||||
31 characters to conform to the Adobe limits on the length of
|
||||
31 bytes to conform to the Adobe limits on the length of
|
||||
<code>ShortNickName</code>.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
@@ -1598,11 +1604,12 @@ Option "fooFinish/Finishing Option" PickOne DocumentSetup 10
|
||||
|
||||
<p>The <code>Option</code> directive creates a new option in the
|
||||
current group, by default the <code>General</code> group. The name
|
||||
is any combination of letters, numbers, and the underscore and
|
||||
can be up to 40 characters in length.</p>
|
||||
may contain up to 40 ASCII characters within the range of decimal 33
|
||||
to decimal 126 inclusive, except for the characters comma (44), slash
|
||||
(47) and colon (58).</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<p>The type argument is one of the following keywords:</p>
|
||||
|
||||
@@ -1749,8 +1756,8 @@ for asymmetric resolutions. The <code>HHH</code> and <code>VVV</code> in
|
||||
the examples represent the horizontal and vertical resolutions
|
||||
which must be positive integer values.</p>
|
||||
|
||||
<p>If provided, the text can be any string up to 80 characters
|
||||
in length. If no text is provided, the name is used.</p>
|
||||
<p>If provided, the text can be any string up to 80 bytes in length.
|
||||
If no text is provided, the name is used.</p>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
|
||||
@@ -21,8 +21,8 @@ and can be modified using your favorite text editor, you should
|
||||
normally use the <A HREF="man-lpadmin.html">lpadmin(8)</A>
|
||||
command, web interface, or any of the available GUIs to manage
|
||||
your printers instead. If you do choose to edit this file
|
||||
manually, you will need to restart the scheduler to make them
|
||||
active.</P>
|
||||
manually, you will need to stop the scheduler first, make your
|
||||
changes, and then start the scheduler to make them active.</P>
|
||||
|
||||
|
||||
<H2 CLASS="title"><A NAME="Accepting">Accepting</A></H2>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<!--
|
||||
"$Id: spec-ipp.html 8680 2009-05-22 23:53:11Z mike $"
|
||||
"$Id: spec-ipp.html 8816 2009-09-14 21:41:50Z mike $"
|
||||
|
||||
CUPS IPP specification for the Common UNIX Printing System (CUPS).
|
||||
|
||||
@@ -558,7 +558,7 @@ job as well.
|
||||
<h4>Cancel-Job Request</h4>
|
||||
|
||||
<p>The following groups of attributes are supplied as part of the
|
||||
Set-Job-Attributes request:
|
||||
Cancel-Job request:
|
||||
|
||||
<p>Group 1: Operation Attributes
|
||||
|
||||
@@ -632,6 +632,17 @@ Purge-Jobs request:
|
||||
<dd>The client MUST supply a URI for the specified printer or
|
||||
"ipp://.../printers" for all printers and classes.
|
||||
|
||||
<dt><span class="info">CUPS 1.2/Mac OS X 10.5</span>"requesting-user-name" (name(MAX)):
|
||||
|
||||
<dd>The client OPTIONALLY supplies this attribute to specify whose jobs
|
||||
jobs are purged or canceled.
|
||||
|
||||
<dt><span class="info">CUPS 1.2/Mac OS X 10.5</span>"my-jobs" (boolean):
|
||||
|
||||
<dd>The client OPTIONALLY supplies this attribute to specify that only
|
||||
the jobs owned by the requesting user are purged or canceled. The
|
||||
default is false.
|
||||
|
||||
<dt><span class="info">CUPS 1.2/Mac OS X 10.5</span>"purge-jobs" (boolean):
|
||||
|
||||
<dd>The client OPTIONALLY supplies this attribute to specify
|
||||
@@ -1603,8 +1614,8 @@ CUPS-Get-Devices request:
|
||||
|
||||
<dt>"timeout" (integer (1:MAX)) :<span class='info'>CUPS 1.4/Mac OS X 10.6</span>
|
||||
|
||||
<dd>The client OPTIONALLY supplies this attribute limiting the number of
|
||||
devices that are returned.
|
||||
<dd>The client OPTIONALLY supplies this attribute to limit the duration
|
||||
of the lookup. The default timeout is 15 seconds.
|
||||
|
||||
</dl>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<!--
|
||||
"$Id: spec-ppd.html 8673 2009-05-22 17:34:15Z mike $"
|
||||
"$Id: spec-ppd.html 8933 2009-12-16 00:08:31Z mike $"
|
||||
|
||||
CUPS PPD extensions specification for the Common UNIX Printing System (CUPS).
|
||||
|
||||
@@ -161,9 +161,8 @@ based on well-known colorspaces such as sRGB and Adobe RGB.</p>
|
||||
|
||||
<blockquote><b>Note:</b>
|
||||
|
||||
<p>At this time, none of the CUPS raster
|
||||
filters support ICC profiles. This will be addressed as time
|
||||
and resources permit.</p>
|
||||
<p>At this time, none of the CUPS raster filters support ICC profiles. This
|
||||
will be addressed as time and resources permit.</p>
|
||||
|
||||
</blockquote>
|
||||
|
||||
@@ -174,7 +173,7 @@ gamma m00 m01 m02 m10 m11 m12 m20 m21 m22"</p>
|
||||
|
||||
<p>This string attribute specifies an sRGB-based color profile
|
||||
consisting of gamma and density controls and a 3x3 CMY color
|
||||
transform matrix.</p>
|
||||
transform matrix. <em>This attribute is not supported on Mac OS X.</em></p>
|
||||
|
||||
<p>The <i>Resolution</i> and <i>MediaType</i> values may be "-"
|
||||
to act as a wildcard. Otherwise they must match one of the
|
||||
@@ -277,6 +276,15 @@ data as requested by the driver. The <tt>APCustomColorMatchingProfile</tt>
|
||||
and <tt>APDefaultColorMatchingProfile</tt> attributes specify alternate
|
||||
color profiles (sRGB or AdobeRGB) to use for 3-color (RGB) raster data.</p>
|
||||
|
||||
<blockquote><b>Note:</b>
|
||||
|
||||
<p>Prior to Mac OS X 10.6, the default RGB color space was Apple's "GenericRGB".
|
||||
The new default in Mac OS X 10.6 and later is "sRGB". For more information, see
|
||||
<a href="http://support.apple.com/kb/HT3712">"Mac OS X v10.6: About gamma
|
||||
2.2"</a> on Apple's support site.</p>
|
||||
|
||||
</blockquote>
|
||||
|
||||
<h4><span class='info'>Mac OS X 10.5</span><a name='APCustomColorMatchingName'>APCustomColorMatchingName</a></h4>
|
||||
|
||||
<p class='summary'>*APCustomColorMatchingName name/text: ""</p>
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
|
||||
<TITLE>Beranda - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
|
||||
<LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
|
||||
<LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<TABLE CLASS="page" SUMMARY="{title}">
|
||||
<TR><TD CLASS="body">
|
||||
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
|
||||
<TR HEIGHT="36">
|
||||
<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
|
||||
SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
|
||||
<TD CLASS="sel"><A HREF="/"> Beranda </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/admin"> Administrasi </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/classes/"> Kelas </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/help/"> Bantuan Langsung </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/jobs/"> Tugas </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/printers/"> Pencetak </A></TD>
|
||||
<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
|
||||
TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
|
||||
AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
|
||||
<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<TABLE CLASS="indent" SUMMARY="">
|
||||
<TR><TD STYLE="padding-right: 20px;">
|
||||
|
||||
<H1>CUPS @CUPS_VERSION@</H1>
|
||||
|
||||
<P>CUPS adalah sistem pencetakan berstandar dan berkode sumber terbuka, dikembangkan oleh
|
||||
<A HREF="http://www.apple.com/">Apple Inc.</A> untuk Mac OS<SUP>®</SUP> X dan sistem
|
||||
operasi serupa UNIX<SUP>®</SUP> lainnya.</P>
|
||||
|
||||
</TD>
|
||||
<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
|
||||
HEIGHT="128" ALT="CUPS"></A></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<TABLE CLASS="indent" SUMMARY="">
|
||||
<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
|
||||
|
||||
<H2>CUPS bagi Pengguna</H2>
|
||||
|
||||
<P><A HREF="help/overview.html">Ikhtisar CUPS</A></P>
|
||||
|
||||
<P><A HREF="help/options.html">Opsi dan Pencetakan dari Baris Perintah</A></P>
|
||||
|
||||
<P><A HREF="help/whatsnew.html">Apa yang Baru di CUPS 1.4</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Forum Pengguna</A></P>
|
||||
|
||||
</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
|
||||
|
||||
<H2>CUPS bagi Administrator</H2>
|
||||
|
||||
<P><A HREF="admin">Menambah Pencetak dan Kelas</A></P>
|
||||
|
||||
<P><A HREF="help/policies.html">Mengatur Kebijakan Operasi</A></P>
|
||||
|
||||
<P><A HREF="help/accounting.html">Dasar Akunting Pencetak</A></P>
|
||||
|
||||
<P><A HREF="help/security.html">Keamanan Server</A></P>
|
||||
|
||||
<P><A HREF="help/kerberos.html">Menggunakan Otentikasi Kerberos</A></P>
|
||||
|
||||
<P><A HREF="help/network.html">Menggunakan Pencetak di Jaringan</A></P>
|
||||
|
||||
<P><A HREF="help/ref-cupsd-conf.html">Referensi cupsd.conf</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/ppd.php">Mencari Penggerak Pencetak</A></P>
|
||||
|
||||
</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
|
||||
|
||||
<H2>CUPS bagi Pengembang</H2>
|
||||
|
||||
<P><A HREF="help/api-overview.html">Pengenalan untuk Pemrograman CUPS</A></P>
|
||||
|
||||
<P><A HREF="help/api-cups.html">API di CUPS</A></P>
|
||||
|
||||
<P><A HREF="help/api-filter.html">Penyaring dan Pemrograman Balik (<I>Backend Programming</I>)</A></P>
|
||||
|
||||
<P><A HREF="help/api-httpipp.html">API di HTTP dan IPP</A></P>
|
||||
|
||||
<P><A HREF="help/api-ppd.html">API di PPD</A></P>
|
||||
|
||||
<P><A HREF="help/api-raster.html">API di Raster</A></P>
|
||||
|
||||
<P><A HREF="help/ref-ppdcfile.html">Referensi Kompiler Berkas Penggerak PPD</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Forum Pengembang</A></P>
|
||||
|
||||
</TD></TR>
|
||||
</TABLE>
|
||||
|
||||
</TD></TR>
|
||||
<TR><TD> </TD></TR>
|
||||
<TR><TD CLASS="trailer">CUPS dan logo CUPS logo adalah merek dagang dari
|
||||
<A HREF="http://www.apple.com">Apple Inc.</A> Hak cipta CUPS pada 2007-2009 Apple
|
||||
Inc. Semua hak terpelihara.</TD></TR>
|
||||
</TABLE>
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,107 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
|
||||
<TITLE>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
|
||||
<LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
|
||||
<LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<TABLE CLASS="page" SUMMARY="{title}">
|
||||
<TR><TD CLASS="body">
|
||||
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
|
||||
<TR HEIGHT="36">
|
||||
<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
|
||||
SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
|
||||
<TD CLASS="sel"><A HREF="/"> Home </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/admin"> Amministrazione </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/classes/"> Classi </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/help/"> Guida </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/jobs/"> Stampe </A></TD>
|
||||
<TD CLASS="unsel"><A HREF="/printers/"> Stampanti </A></TD>
|
||||
<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
|
||||
TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Aiuto alla ricerca"
|
||||
AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
|
||||
<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<TABLE CLASS="indent" SUMMARY="">
|
||||
<TR><TD STYLE="padding-right: 20px;">
|
||||
|
||||
<H1>CUPS @CUPS_VERSION@</H1>
|
||||
|
||||
<P>CUPS è un sistema di stampa basato su standard, open source sviluppato da
|
||||
<A HREF="http://www.apple.com/">Apple Inc.</A> per Mac OS<SUP>®</SUP> X e
|
||||
altri sistemi UNIX<SUP>®</SUP> e derivati.</P>
|
||||
|
||||
</TD>
|
||||
<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
|
||||
HEIGHT="128" ALT="CUPS"></A></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<TABLE CLASS="indent" SUMMARY="">
|
||||
<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
|
||||
|
||||
<H2>CUPS per utenti</H2>
|
||||
|
||||
<P><A HREF="help/overview.html">Panoramica di CUPS</A></P>
|
||||
|
||||
<P><A HREF="help/options.html">Stampa e opzioni da riga di comando</A></P>
|
||||
|
||||
<P><A HREF="help/whatsnew.html">Cosa c'è di nuovo in CUPS 1.4</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Forum degli utenti</A></P>
|
||||
|
||||
</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
|
||||
|
||||
<H2>CUPS per amministratori</H2>
|
||||
|
||||
<P><A HREF="admin">Aggiungere stampanti e classi</A></P>
|
||||
|
||||
<P><A HREF="help/policies.html">Gestire i criteri di funzionamento</A></P>
|
||||
|
||||
<P><A HREF="help/accounting.html">Basi di controllo di accesso alle stampanti</A></P>
|
||||
|
||||
<P><A HREF="help/security.html">Sicurezza del server</A></P>
|
||||
|
||||
<P><A HREF="help/kerberos.html">Utilizzare l'autenticazione Kerberos</A></P>
|
||||
|
||||
<P><A HREF="help/network.html">Utilizzare stampanti di rete</A></P>
|
||||
|
||||
<P><A HREF="help/ref-cupsd-conf.html">Riferimenti al cupsd.conf</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/ppd.php">Trovare driver per le stampanti</A></P>
|
||||
|
||||
</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
|
||||
|
||||
<H2>CUPS per sviluppatori</H2>
|
||||
|
||||
<P><A HREF="help/api-overview.html">Introduzione alla programmazione di CUPS</A></P>
|
||||
|
||||
<P><A HREF="help/api-cups.html">API di CUPS</A></P>
|
||||
|
||||
<P><A HREF="help/api-filter.html">Programmazione di filtri e motori</A></P>
|
||||
|
||||
<P><A HREF="help/api-httpipp.html">API HTTP e IPP</A></P>
|
||||
|
||||
<P><A HREF="help/api-ppd.html">API PPD</A></P>
|
||||
|
||||
<P><A HREF="help/api-raster.html">API Raster</A></P>
|
||||
|
||||
<P><A HREF="help/ref-ppdcfile.html">Riferimenti al file del compilatore di driver PPD</A></P>
|
||||
|
||||
<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Forum degli sviluppatori</A></P>
|
||||
|
||||
</TD></TR>
|
||||
</TABLE>
|
||||
|
||||
</TD></TR>
|
||||
<TR><TD> </TD></TR>
|
||||
<TR><TD CLASS="trailer">CUPS e il logo CUPS sono marchi di
|
||||
<A HREF="http://www.apple.com">Apple Inc.</A> CUPS è un copyright 2007-2009 di Apple
|
||||
Inc. Tutti i diritti sono riservati.</TD></TR>
|
||||
</TABLE>
|
||||
</BODY>
|
||||
</HTML>
|
||||
+5
-19
@@ -24,21 +24,7 @@
|
||||
*/
|
||||
|
||||
#include "driver.h"
|
||||
|
||||
|
||||
/*
|
||||
* Random number function to use, in order of preference...
|
||||
*/
|
||||
|
||||
#ifdef HAVE_RANDOM
|
||||
# define RANDOM_FUNCTION random
|
||||
#elif defined(HAVE_MRAND48)
|
||||
# define RANDOM_FUNCTION mrand48
|
||||
#elif defined(HAVE_LRAND48)
|
||||
# define RANDOM_FUNCTION lrand48
|
||||
#else
|
||||
# define RANDOM_FUNCTION rand
|
||||
#endif /* HAVE_RANDOM */
|
||||
#include <config.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -169,8 +155,8 @@ cupsDitherLine(cups_dither_t *d, /* I - Dither data */
|
||||
|
||||
if (errrange > 1)
|
||||
{
|
||||
errbase0 = errbase + (RANDOM_FUNCTION() % errrange);
|
||||
errbase1 = errbase + (RANDOM_FUNCTION() % errrange);
|
||||
errbase0 = errbase + (CUPS_RAND() % errrange);
|
||||
errbase1 = errbase + (CUPS_RAND() % errrange);
|
||||
}
|
||||
else
|
||||
errbase0 = errbase1 = errbase;
|
||||
@@ -263,8 +249,8 @@ cupsDitherLine(cups_dither_t *d, /* I - Dither data */
|
||||
|
||||
if (errrange > 1)
|
||||
{
|
||||
errbase0 = errbase + (RANDOM_FUNCTION() % errrange);
|
||||
errbase1 = errbase + (RANDOM_FUNCTION() % errrange);
|
||||
errbase0 = errbase + (CUPS_RAND() % errrange);
|
||||
errbase1 = errbase + (CUPS_RAND() % errrange);
|
||||
}
|
||||
else
|
||||
errbase0 = errbase1 = errbase;
|
||||
|
||||
@@ -593,7 +593,7 @@ write_banner(banner_file_t *banner, /* I - Banner file */
|
||||
printf("%.1f %.1f translate\n", PageLeft, PageBottom);
|
||||
else
|
||||
printf("%.1f %.1f translate\n", PageWidth - PageRight,
|
||||
PageLength - PageRight);
|
||||
PageLength - PageTop);
|
||||
puts("0 setgray");
|
||||
|
||||
y = info_top;
|
||||
|
||||
@@ -144,7 +144,7 @@ ParseCommand(FILE *fp, /* I - File to read from */
|
||||
if (!strcasecmp(name, "LB"))
|
||||
{
|
||||
bufptr = buf;
|
||||
while ((ch = getc(fp)) != StringTerminator)
|
||||
while ((ch = getc(fp)) != StringTerminator && ch != EOF)
|
||||
if (bufptr < (buf + sizeof(buf) - 1))
|
||||
*bufptr++ = ch;
|
||||
*bufptr = '\0';
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* BMP image routines for the Common UNIX Printing System (CUPS).
|
||||
*
|
||||
* Copyright 2007-2008 by Apple Inc.
|
||||
* Copyright 2007-2009 by Apple Inc.
|
||||
* Copyright 1993-2007 by Easy Software Products.
|
||||
*
|
||||
* These coded instructions, statements, and computer programs are the
|
||||
@@ -170,6 +170,8 @@ _cupsImageReadBMP(
|
||||
|
||||
if (colors_used > 0)
|
||||
fread(colormap, colors_used, 4, fp);
|
||||
else
|
||||
memset(colormap, 0, sizeof(colormap));
|
||||
|
||||
/*
|
||||
* Setup image and buffers...
|
||||
|
||||
@@ -29,7 +29,11 @@
|
||||
# include <cups/string.h>
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
# include <unistd.h>
|
||||
# ifdef WIN32
|
||||
# include <io.h>
|
||||
# else
|
||||
# include <unistd.h>
|
||||
# endif /* WIN32 */
|
||||
# include <errno.h>
|
||||
# include <math.h>
|
||||
|
||||
|
||||
@@ -204,6 +204,15 @@ cupsRasterInterpretPPD(
|
||||
|
||||
strcpy(h->cupsPageSizeName, "Letter");
|
||||
|
||||
#ifdef __APPLE__
|
||||
/*
|
||||
* cupsInteger0 is also used for the total page count on Mac OS X; set an
|
||||
* uncommon default value so we can tell if the driver is using cupsInteger0.
|
||||
*/
|
||||
|
||||
h->cupsInteger[0] = 0x80000000;
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
/*
|
||||
* Apply patches and options to the page header...
|
||||
*/
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <cups/raster.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
@@ -275,26 +276,26 @@ write_test(int fd, /* I - File descriptor to write to */
|
||||
* text with some whitespace.
|
||||
*/
|
||||
|
||||
srand(time(NULL));
|
||||
CUPS_SRAND(time(NULL));
|
||||
|
||||
memset(data, 0, sizeof(data));
|
||||
|
||||
for (y = 0; y < 28; y ++)
|
||||
{
|
||||
for (x = rand() & 127, count = (rand() & 15) + 1;
|
||||
for (x = CUPS_RAND() & 127, count = (CUPS_RAND() & 15) + 1;
|
||||
x < sizeof(data[0]);
|
||||
x ++, count --)
|
||||
{
|
||||
if (count <= 0)
|
||||
{
|
||||
x += (rand() & 15) + 1;
|
||||
count = (rand() & 15) + 1;
|
||||
x += (CUPS_RAND() & 15) + 1;
|
||||
count = (CUPS_RAND() & 15) + 1;
|
||||
|
||||
if (x >= sizeof(data[0]))
|
||||
break;
|
||||
}
|
||||
|
||||
data[y][x] = rand();
|
||||
data[y][x] = CUPS_RAND();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+280
-280
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+11
-8
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: CUPS 1.4\n"
|
||||
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
|
||||
"POT-Creation-Date: 2009-06-05 14:00-0700\n"
|
||||
"POT-Creation-Date: 2009-06-18 15:43-0700\n"
|
||||
"PO-Revision-Date: 2009-02-16 12:00-0800\n"
|
||||
"Last-Translator: Apple Inc.\n"
|
||||
"Language-Team: Apple Inc.\n"
|
||||
@@ -2446,13 +2446,6 @@ msgstr "ERROR: Manglende %%EndProlog!\n"
|
||||
msgid "ERROR: Missing %%EndSetup!\n"
|
||||
msgstr "ERROR: Manglende %%EndSetup!\n"
|
||||
|
||||
msgid ""
|
||||
"ERROR: Missing device URI on command-line and no DEVICE_URI environment "
|
||||
"variable!\n"
|
||||
msgstr ""
|
||||
"ERROR: Manglende enheds-URI på kommandolinjen og ingen DEVICE_URI-"
|
||||
"miljøvariabel!\n"
|
||||
|
||||
#, c-format
|
||||
msgid "ERROR: Missing value on line %d of banner file!\n"
|
||||
msgstr "ERROR: Manglende værdi på linje %d i bannerarkiv!\n"
|
||||
@@ -3440,6 +3433,9 @@ msgstr "NULL PPD-arkivmarkør"
|
||||
msgid "Name OID uses indefinite length"
|
||||
msgstr "Navn-oid bruger uendelig længde"
|
||||
|
||||
msgid "Nested classes are not allowed!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Never"
|
||||
msgstr "Aldrig"
|
||||
|
||||
@@ -5542,6 +5538,13 @@ msgstr "variable-bindings bruger uendelig længde"
|
||||
#~ msgid "600 DPI Grayscale"
|
||||
#~ msgstr "600 dpi gråtoner"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment "
|
||||
#~ "variable!\n"
|
||||
#~ msgstr ""
|
||||
#~ "ERROR: Manglende enheds-URI på kommandolinjen og ingen DEVICE_URI-"
|
||||
#~ "miljøvariabel!\n"
|
||||
|
||||
#~ msgid "ERROR: Unable to create temporary file - %s.\n"
|
||||
#~ msgstr "ERROR: Kan ikke oprette midlertidigt arkiv - %s.\n"
|
||||
|
||||
|
||||
+11
-8
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: CUPS 1.4\n"
|
||||
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
|
||||
"POT-Creation-Date: 2009-06-05 14:00-0700\n"
|
||||
"POT-Creation-Date: 2009-06-18 15:43-0700\n"
|
||||
"PO-Revision-Date: 2009-02-16 12:00-0800\n"
|
||||
"Last-Translator: Apple Inc.\n"
|
||||
"Language-Team: Apple Inc.\n"
|
||||
@@ -2456,13 +2456,6 @@ msgstr "ERROR: Fehlender %%EndProlog!\n"
|
||||
msgid "ERROR: Missing %%EndSetup!\n"
|
||||
msgstr "ERROR: Fehlendes %%EndSetup!\n"
|
||||
|
||||
msgid ""
|
||||
"ERROR: Missing device URI on command-line and no DEVICE_URI environment "
|
||||
"variable!\n"
|
||||
msgstr ""
|
||||
"ERROR: Geräte-URI fehlt in der Befehlszeile und keine DEVICE_URI "
|
||||
"Umgebungsvariable vorhanden!\n"
|
||||
|
||||
#, c-format
|
||||
msgid "ERROR: Missing value on line %d of banner file!\n"
|
||||
msgstr "ERROR: Wert fehlt in Zeile %d der Bannerdatei!\n"
|
||||
@@ -3472,6 +3465,9 @@ msgstr "NULL PPD File Pointer"
|
||||
msgid "Name OID uses indefinite length"
|
||||
msgstr "Name-OID hat unbestimmte Länge"
|
||||
|
||||
msgid "Nested classes are not allowed!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Never"
|
||||
msgstr "Niemals"
|
||||
|
||||
@@ -5587,6 +5583,13 @@ msgstr "variable-bindings hat unbestimmte Länge"
|
||||
#~ msgid "600 DPI Grayscale"
|
||||
#~ msgstr "600 DPI Graustufen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment "
|
||||
#~ "variable!\n"
|
||||
#~ msgstr ""
|
||||
#~ "ERROR: Geräte-URI fehlt in der Befehlszeile und keine DEVICE_URI "
|
||||
#~ "Umgebungsvariable vorhanden!\n"
|
||||
|
||||
#~ msgid "ERROR: Unable to create temporary file - %s.\n"
|
||||
#~ msgstr "ERROR: Temporäre Datei konnte nicht erstellt werden – %s.\n"
|
||||
|
||||
|
||||
+9
-23
@@ -16,8 +16,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: CUPS 1.4\n"
|
||||
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
|
||||
"POT-Creation-Date: 2009-06-05 14:00-0700\n"
|
||||
"PO-Revision-Date: 2009-05-23 13:15+0100\n"
|
||||
"POT-Creation-Date: 2009-06-18 15:43-0700\n"
|
||||
"PO-Revision-Date: 2009-07-02 20:00+0100\n"
|
||||
"Last-Translator: Juan Pablo González Riopedre <riopedre13@yahoo.es>\n"
|
||||
"Language-Team: Spanish\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -2490,13 +2490,6 @@ msgstr "ERROR: Falta %%EndProlog.\n"
|
||||
msgid "ERROR: Missing %%EndSetup!\n"
|
||||
msgstr "ERROR: Falta %%EndSetup.\n"
|
||||
|
||||
msgid ""
|
||||
"ERROR: Missing device URI on command-line and no DEVICE_URI environment "
|
||||
"variable!\n"
|
||||
msgstr ""
|
||||
"ERROR: Falta URI del dispositivo en la línea de comandos y no hay variable "
|
||||
"de entorno DEVICE_URI.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "ERROR: Missing value on line %d of banner file!\n"
|
||||
msgstr "ERROR: Falta el valor en la línea %d del archivo de rótulo.\n"
|
||||
@@ -2574,7 +2567,7 @@ msgid "ERROR: Unable to copy PDF file"
|
||||
msgstr "ERROR: No se ha podido copiar el archivo PDF"
|
||||
|
||||
msgid "ERROR: Unable to create pipe"
|
||||
msgstr ""
|
||||
msgstr "ERROR: No se ha podido crear el canal (pipe)"
|
||||
|
||||
msgid "ERROR: Unable to create socket"
|
||||
msgstr "ERROR: No se ha podido crear socket"
|
||||
@@ -2599,7 +2592,7 @@ msgid "ERROR: Unable to execute pdftops program"
|
||||
msgstr "ERROR: No se ha podido ejecutar el programa pdftops"
|
||||
|
||||
msgid "ERROR: Unable to execute pstops program"
|
||||
msgstr ""
|
||||
msgstr "ERROR: No se ha podido ejecutar el programa pstops"
|
||||
|
||||
#, c-format
|
||||
msgid "ERROR: Unable to fork pictwpstops: %s\n"
|
||||
@@ -3503,6 +3496,9 @@ msgstr "Puntero de archivo PPD NULO"
|
||||
msgid "Name OID uses indefinite length"
|
||||
msgstr "Nombre OID usa una longitud indefinida"
|
||||
|
||||
msgid "Nested classes are not allowed!"
|
||||
msgstr "No se permiten clases anidadas."
|
||||
|
||||
msgid "Never"
|
||||
msgstr "Nunca"
|
||||
|
||||
@@ -5523,11 +5519,12 @@ msgstr "ppdc: No se ha proporcionado catálogo de mensajes para el idioma %s.\n"
|
||||
#, c-format
|
||||
msgid "ppdc: Option %s defined in two different groups on line %d of %s!\n"
|
||||
msgstr ""
|
||||
"ppdc: Opción %s definida en dos diferentes grupos en la línea %d de %s.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n"
|
||||
msgstr ""
|
||||
"ppdc: La opción %s redefinida con un tipo diferente en la línea %d de %s.\n"
|
||||
"ppdc: Opción %s redefinida con un tipo diferente en la línea %d de %s.\n"
|
||||
|
||||
#, c-format
|
||||
msgid "ppdc: Option constraint must *name on line %d of %s!\n"
|
||||
@@ -5690,14 +5687,3 @@ msgstr "sin título"
|
||||
msgid "variable-bindings uses indefinite length"
|
||||
msgstr "variable-bindings usa una longitud indefinida"
|
||||
|
||||
#~ msgid "600 DPI Grayscale"
|
||||
#~ msgstr "600 PPP escala de grises"
|
||||
|
||||
#~ msgid "ERROR: pdftops filter crashed on signal %d!\n"
|
||||
#~ msgstr "ERROR: filtro pdftops se ha colgado con la señal %d.\n"
|
||||
|
||||
#~ msgid "ERROR: pdftops filter exited with status %d!\n"
|
||||
#~ msgstr "ERROR: filtro pdftops se ha cerrado con el estado %d.\n"
|
||||
|
||||
#~ msgid "Unknown printer error (%s)!"
|
||||
#~ msgstr "Error de impresión desconocido (%s)."
|
||||
|
||||
Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais
Referência em uma Nova Issue
Bloquear um usuário