Comparar commits
1 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| 5324bb809f |
@@ -1,47 +1,6 @@
|
||||
CHANGES.txt - 2006-11-16
|
||||
CHANGES.txt - 2006-10-20
|
||||
------------------------
|
||||
|
||||
CHANGES IN CUPS V1.2.7
|
||||
|
||||
- Documentation updates (STR #2089)
|
||||
- Added an Italian translation (STR #2105)
|
||||
- The PostScript filter now rotates the bounding box
|
||||
values as needed (STR #2079)
|
||||
- The scheduler no longer loads the remote printer cache
|
||||
when browsing is disabled (STR #2084)
|
||||
- The scheduler no longer writes a new launchd
|
||||
configuration file if it doesn't have to (STR #2083)
|
||||
- Updated the USB and PAP backends for Mac OS X (STR
|
||||
#2086)
|
||||
- The scheduler now picks up on changes to IPv6 and DNS
|
||||
configuration on Mac OS X (STR #2085)
|
||||
- The lpstat program could still hang (STR #2098)
|
||||
- Fixed an inefficiency in the SNMP IPP detection code
|
||||
(STR #2100)
|
||||
- The SSL negotiation code did not implement short
|
||||
timeouts (STR #2091)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.2.6
|
||||
|
||||
- The web interface was not localized on Mac OS X (STR
|
||||
#2075)
|
||||
- "lpc status" did not show the number of queued jobs for
|
||||
disabled queues (STR #2069)
|
||||
- The lpstat program could hang (STR #2073)
|
||||
- The serial backend did not support the new USB serial
|
||||
filenames on Linux (STR #2061)
|
||||
- The parallel backend did not support bidirectional I/O
|
||||
properly (STR #2056)
|
||||
- The network backends now log the numeric address that
|
||||
is being used (STR #2046)
|
||||
- Fixed a compile error when using libpaper.
|
||||
- Fixed a compile error when compiling on Solaris with
|
||||
threading enabled (STR #2049, STR #2050)
|
||||
- Missing printer-state-changed event for
|
||||
printer-state-message updates (STR #2047)
|
||||
|
||||
|
||||
CHANGES IN CUPS V1.2.5
|
||||
|
||||
- Documentation updates (STR #2038)
|
||||
|
||||
@@ -29,9 +29,8 @@ like to thank the following individuals for their contributions:
|
||||
Giulio Orsero - Bug fixes and testing.
|
||||
Michal Osowiecki - Polish localization.
|
||||
Kurt Pfeifle - Bug fixes, beta testing, evangelism.
|
||||
Vincenzo Reale - Italian localization.
|
||||
Petter Reinholdtsen - HP-UX compiler stuff.
|
||||
Juan Pablo González Riopedre - Spanish localization.
|
||||
Juan Pablo González Riopedre - Spanish localization
|
||||
Stuart Stevens - HP JetDirect IPP information.
|
||||
Andrea Suatoni - IRIX desktop integration and testing.
|
||||
Tomohiro Kato - Japanese localization.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
INSTALL - CUPS v1.2.7 - 2006-11-16
|
||||
INSTALL - CUPS v1.2.5 - 2006-10-20
|
||||
----------------------------------
|
||||
|
||||
This file describes how to compile and install CUPS from source
|
||||
|
||||
@@ -17,12 +17,12 @@ General Public License ("LGPL"), Version 2, with exceptions for
|
||||
Apple operating systems and the OpenSSL toolkit. A copy of the
|
||||
exceptions and licenses follow this introduction.
|
||||
|
||||
The GNU LGPL applies to the CUPS and CUPS Imaging libraries
|
||||
located in the "cups" and "filter" subdirectories of the CUPS
|
||||
source distribution and in the "cups" include directory and
|
||||
library files in the binary distributions. The GNU GPL applies to
|
||||
the remainder of the CUPS distribution, including the "pdftops"
|
||||
filter which is based upon Xpdf.
|
||||
The GNU LGPL applies to the CUPS API library, located in the
|
||||
"cups" subdirectory of the CUPS source distribution and in the
|
||||
"cups" include directory and library files in the binary
|
||||
distributions. The GNU GPL applies to the remainder of the CUPS
|
||||
distribution, including the "pdftops" filter which is based upon
|
||||
Xpdf and the CUPS imaging library.
|
||||
|
||||
For those not familiar with the GNU GPL, the license basically
|
||||
allows you to:
|
||||
@@ -32,19 +32,22 @@ allows you to:
|
||||
binary form.
|
||||
- Sell verbatim copies of the software for a media fee, or
|
||||
sell support for the software.
|
||||
- Distribute or sell printer drivers and filters that use
|
||||
CUPS so long as source code is made available under the
|
||||
GPL.
|
||||
|
||||
What this license *does not* allow you to do is make changes or
|
||||
add features to CUPS and then sell a binary distribution without
|
||||
source code. You must provide source for any changes or additions
|
||||
to the software, and all code must be provided under the GPL or
|
||||
LGPL as appropriate. The only exceptions to this are the portions
|
||||
of the CUPS software covered by the Apple operating system
|
||||
license exceptions outlined later in this license agreement.
|
||||
source code. You must provide source for any new drivers,
|
||||
changes, or additions to the software, and all code must be
|
||||
provided under the GPL or LGPL as appropriate. The only
|
||||
exceptions to this are the portions of the CUPS software covered
|
||||
by the Apple operating system license exceptions outlined later
|
||||
in this license agreement.
|
||||
|
||||
The GNU LGPL relaxes the "link-to" restriction, allowing you to
|
||||
develop applications that use the CUPS and CUPS Imaging libraries
|
||||
under other licenses and/or conditions as appropriate for your
|
||||
application, driver, or filter.
|
||||
develop applications that use the CUPS API library under other
|
||||
licenses and/or conditions as appropriate for your application.
|
||||
|
||||
|
||||
LICENSE EXCEPTIONS
|
||||
@@ -116,9 +119,9 @@ BINARY DISTRIBUTION RIGHTS
|
||||
|
||||
Easy Software Products also sells rights to the CUPS source code
|
||||
under a binary distribution license for vendors that are unable
|
||||
to release source code for their additions and modifications to
|
||||
CUPS under the GNU GPL and LGPL. For information please contact
|
||||
us at the address shown above.
|
||||
to release source code for their drivers, additions, and
|
||||
modifications to CUPS under the GNU GPL and LGPL. For
|
||||
information please contact us at the address shown above.
|
||||
|
||||
The Common UNIX Printing System provides a "pdftops" filter that
|
||||
is based on the Xpdf software. For binary distribution licensing
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
README - CUPS v1.2.7 - 2006-11-16
|
||||
README - CUPS v1.2.5 - 2006-10-20
|
||||
---------------------------------
|
||||
|
||||
Looking for compile instructions? Read the file "INSTALL.txt"
|
||||
|
||||
@@ -46,7 +46,7 @@ all: $(TARGETS)
|
||||
#
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS) $(TARGETS) $(LIBOBJS) http
|
||||
$(RM) $(OBJS) $(TARGETS) http
|
||||
|
||||
|
||||
#
|
||||
|
||||
@@ -107,7 +107,6 @@ main(int argc, /* I - Number of command-line args */
|
||||
hostname[1024], /* Hostname */
|
||||
username[255], /* Username info */
|
||||
resource[1024], /* Resource info (printer name) */
|
||||
addrname[256], /* Address name */
|
||||
*optptr, /* Pointer to URI options */
|
||||
name[255], /* Name of option */
|
||||
value[255], /* Value of option */
|
||||
@@ -575,18 +574,6 @@ main(int argc, /* I - Number of command-line args */
|
||||
fputs("STATE: -connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "INFO: Connected to %s...\n", hostname);
|
||||
|
||||
#ifdef AF_INET6
|
||||
if (http->hostaddr->addr.sa_family == AF_INET6)
|
||||
fprintf(stderr, "DEBUG: Connected to [%s]:%d (IPv6)...\n",
|
||||
httpAddrString(http->hostaddr, addrname, sizeof(addrname)),
|
||||
ntohs(http->hostaddr->ipv6.sin6_port));
|
||||
else
|
||||
#endif /* AF_INET6 */
|
||||
if (http->hostaddr->addr.sa_family == AF_INET)
|
||||
fprintf(stderr, "DEBUG: Connected to %s:%d (IPv4)...\n",
|
||||
httpAddrString(http->hostaddr, addrname, sizeof(addrname)),
|
||||
ntohs(http->hostaddr->ipv4.sin_port));
|
||||
|
||||
/*
|
||||
* Build a URI for the printer and fill the standard IPP attributes for
|
||||
* an IPP_PRINT_FILE request. We can't use the URI in argv[0] because it
|
||||
|
||||
@@ -582,7 +582,6 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
*cptr; /* Pointer into control file string */
|
||||
char status; /* Status byte from command */
|
||||
char portname[255]; /* Port name */
|
||||
char addrname[256]; /* Address name */
|
||||
http_addrlist_t *addrlist, /* Address list */
|
||||
*addr; /* Socket address */
|
||||
int copy; /* Copies written */
|
||||
@@ -821,18 +820,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
|
||||
|
||||
fputs("STATE: -connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "INFO: Connected to %s...\n", hostname);
|
||||
|
||||
#ifdef AF_INET6
|
||||
if (addr->addr.addr.sa_family == AF_INET6)
|
||||
fprintf(stderr, "DEBUG: Connected to [%s]:%d (IPv6) (local port %d)...\n",
|
||||
httpAddrString(&addr->addr, addrname, sizeof(addrname)),
|
||||
ntohs(addr->addr.ipv6.sin6_port), lport);
|
||||
else
|
||||
#endif /* AF_INET6 */
|
||||
if (addr->addr.addr.sa_family == AF_INET)
|
||||
fprintf(stderr, "DEBUG: Connected to %s:%d (IPv4) (local port %d)...\n",
|
||||
httpAddrString(&addr->addr, addrname, sizeof(addrname)),
|
||||
ntohs(addr->addr.ipv4.sin_port), lport);
|
||||
fprintf(stderr, "DEBUG: Connected on ports %d (local %d)...\n", port,
|
||||
lport);
|
||||
|
||||
/*
|
||||
* Next, open the print file and figure out its size...
|
||||
|
||||
@@ -42,35 +42,31 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*
|
||||
* This program implements the Printer Access Protocol (PAP) on top of AppleTalk
|
||||
* Transaction Protocol (ATP). If it were to use the blocking pap functions of
|
||||
* the AppleTalk library it would need seperate threads for reading, writing
|
||||
* and status.
|
||||
* This program implements the Printer Access Protocol (PAP) on top of AppleTalk Transaction
|
||||
* Protocol (ATP). If it were to use the blocking pap functions of the AppleTalk library it
|
||||
* would need seperate threads for reading, writing and status.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* main() - Send a file to the specified Appletalk printer.
|
||||
* listDevices() - List all LaserWriter printers in the local zone.
|
||||
* printFile() - Print file.
|
||||
* printFile() - Print from a file descriptor to an NBP specified printer.
|
||||
* papOpen() - Open a pap session to a printer.
|
||||
* papClose() - Close a pap session.
|
||||
* papClose() - Close a pap session after cleaning up pending transactions.
|
||||
* papWrite() - Write bytes to a printer.
|
||||
* papCloseResp() - Send a pap close response.
|
||||
* papCloseResp() - Send a pap close response in the rare case we receive a close connection request.
|
||||
* papSendRequest() - Fomrat and send a pap packet.
|
||||
* papCancelRequest() - Cancel a pending pap request.
|
||||
* statusUpdate() - Print printer status to stderr.
|
||||
* parseUri() - Extract the print name and zone from a uri.
|
||||
* addPercentEscapes() - Encode a string with percent escapes.
|
||||
* removePercentEscapes - Remove percent escape sequences from a string.
|
||||
* removePercentEscapes - Returns a string with any percent escape sequences replaced with their equivalent.
|
||||
* nbptuple_compare() - Compare routine for qsort.
|
||||
* okayToUseAppleTalk() - Returns true if AppleTalk is available and enabled.
|
||||
* packet_name() - Returns packet name string.
|
||||
* connectTimeout() - Returns the connect timeout preference value.
|
||||
* signalHandler() - handle SIGINT to close the session before quiting.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
@@ -90,8 +86,7 @@
|
||||
#include <netat/nbp.h>
|
||||
#include <netat/pap.h>
|
||||
|
||||
#include <cups/cups.h>
|
||||
#include <cups/backend.h>
|
||||
#include <cups/http.h>
|
||||
|
||||
#include <libkern/OSByteOrder.h>
|
||||
|
||||
@@ -100,25 +95,19 @@
|
||||
#else
|
||||
/* These definitions come from at_proto.h... */
|
||||
# define ZIP_DEF_INTERFACE NULL
|
||||
enum { RUNNING, NOTLOADED, LOADED, OTHERERROR };
|
||||
enum { RUNNING, NOTLOADED, LOADED, OTHERERROR }; /* Appletalk Stack status Function. */
|
||||
|
||||
extern int atp_abort(int fd, at_inet_t *dest, u_short tid);
|
||||
extern int atp_close(int fd);
|
||||
extern int atp_getreq(int fd, at_inet_t *src, char *buf, int *len, int *userdata,
|
||||
int *xo, u_short *tid, u_char *bitmap, int nowait);
|
||||
extern int atp_getreq(int fd, at_inet_t *src, char *buf, int *len, int *userdata, int *xo, u_short *tid, u_char *bitmap, int nowait);
|
||||
extern int atp_getresp(int fd, u_short *tid, at_resp_t *resp);
|
||||
extern int atp_look(int fd);
|
||||
extern int atp_open(at_socket *sock);
|
||||
extern int atp_sendreq(int fd, at_inet_t *dest, char *buf, int len,
|
||||
int userdata, int xo, int xo_relt, u_short *tid,
|
||||
at_resp_t *resp, at_retry_t *retry, int nowait);
|
||||
extern int atp_sendrsp(int fd, at_inet_t *dest, int xo, u_short tid,
|
||||
at_resp_t *resp);
|
||||
extern int atp_sendreq(int fd, at_inet_t *dest, char *buf, int len, int userdata, int xo, int xo_relt, u_short *tid, at_resp_t *resp, at_retry_t *retry, int nowait);
|
||||
extern int atp_sendrsp(int fd, at_inet_t *dest, int xo, u_short tid, at_resp_t *resp);
|
||||
extern int checkATStack();
|
||||
extern int nbp_lookup(at_entity_t *entity, at_nbptuple_t *buf, int max,
|
||||
at_retry_t *retry);
|
||||
extern int nbp_make_entity(at_entity_t *entity, char *obj, char *type,
|
||||
char *zone);
|
||||
extern int nbp_lookup(at_entity_t *entity, at_nbptuple_t *buf, int max, at_retry_t *retry);
|
||||
extern int nbp_make_entity(at_entity_t *entity, char *obj, char *type, char *zone);
|
||||
extern int zip_getmyzone(char *ifName, at_nvestr_t *zone);
|
||||
#endif /* HAVE_APPLETALK_AT_PROTO_H */
|
||||
|
||||
@@ -127,7 +116,7 @@ extern int zip_getmyzone(char *ifName, at_nvestr_t *zone);
|
||||
#include <CoreFoundation/CFPreferences.h>
|
||||
|
||||
/* Defines */
|
||||
#define MAX_PRINTERS 500 /* Max number of printers we can lookup */
|
||||
#define MAX_PRINTERS 500 /* Max number of printers we can lookup in listDevices */
|
||||
#define PAP_CONNID 0
|
||||
#define PAP_TYPE 1
|
||||
#define PAP_EOF 2
|
||||
@@ -137,35 +126,43 @@ extern int zip_getmyzone(char *ifName, at_nvestr_t *zone);
|
||||
#define SEQUENCE_NUM(p) (((u_char *)&p)[2])
|
||||
#define IS_PAP_EOF(p) (((u_char *)&p)[2])
|
||||
|
||||
#define PAPPacketStr(x) \
|
||||
((x) == AT_PAP_TYPE_OPEN_CONN) ? "PAP_OPEN_CONN" : \
|
||||
((x) == AT_PAP_TYPE_OPEN_CONN_REPLY) ? "PAP_OPEN_CONN_REPLY" : \
|
||||
((x) == AT_PAP_TYPE_SEND_DATA) ? "PAP_SEND_DATA" : \
|
||||
((x) == AT_PAP_TYPE_DATA) ? "PAP_DATA" : \
|
||||
((x) == AT_PAP_TYPE_TICKLE) ? "PAP_TICKLE" : \
|
||||
((x) == AT_PAP_TYPE_CLOSE_CONN) ? "PAP_CLOSE_CONN" : \
|
||||
((x) == AT_PAP_TYPE_CLOSE_CONN_REPLY) ? "PAP_CLOSE_CONN_REPLY" : \
|
||||
((x) == AT_PAP_TYPE_SEND_STATUS) ? "PAP_SEND_STATUS" : \
|
||||
((x) == AT_PAP_TYPE_SEND_STS_REPLY) ? "PAP_SEND_STS_REPLY" : \
|
||||
((x) == AT_PAP_TYPE_READ_LW) ? "PAP_READ_LW" : \
|
||||
"<Unknown>"
|
||||
|
||||
#ifndef true
|
||||
#define true 1
|
||||
#define false 0
|
||||
#endif
|
||||
|
||||
/* Globals */
|
||||
int gSockfd = 0; /* Socket descriptor */
|
||||
at_inet_t gSessionAddr = { 0 }; /* Address of the session responding socket */
|
||||
u_char gConnID = 0; /* PAP session connection id */
|
||||
u_short gSendDataID = 0; /* Transaction id of pending send-data request */
|
||||
u_short gTickleID = 0; /* Transaction id of outstanding tickle request*/
|
||||
int gWaitEOF = false; /* Option: wait for a remote's EOF */
|
||||
int gSockfd = 0; /* Socket descriptor */
|
||||
at_inet_t gSessionAddr = { 0 }; /* Address of the session responding socket */
|
||||
u_char gConnID = 0; /* PAP session connection id */
|
||||
u_short gSendDataID = 0; /* Transaction id of our pending send-data request */
|
||||
u_short gTickleID = 0; /* Transaction id of our outstanding tickle request*/
|
||||
int gWaitEOF = false; /* Option: causes us to wait for a remote's EOF */
|
||||
int gStatusInterval= 5; /* Option: 0=off else seconds between status requests*/
|
||||
int gErrorlogged = false; /* If an error was logged don't send any more INFO messages */
|
||||
int gDebug = 0; /* Option: emit debugging info */
|
||||
int gDebug = 0; /* Option: causes us to emit debugging info */
|
||||
|
||||
/* Local functions */
|
||||
static int listDevices(void);
|
||||
static int printFile(char* name, char* type, char* zone, int fdin, int fdout,
|
||||
int fderr, int copies, int argc);
|
||||
static int papOpen(at_nbptuple_t* tuple, u_char* connID, int* fd,
|
||||
at_inet_t* pap_to, u_char* flowQuantum);
|
||||
static int papClose();
|
||||
static int papWrite(int sockfd, at_inet_t* dest, u_short tid, u_char connID,
|
||||
u_char flowQuantum, char* data, int len, int eof);
|
||||
static int papCloseResp(int sockfd, at_inet_t* dest, int xo, u_short tid,
|
||||
u_char connID);
|
||||
static int papSendRequest(int sockfd, at_inet_t* dest, u_char connID,
|
||||
int function, u_char bitmap, int xo, int seqno);
|
||||
static int printFile(char* name, char* type, char* zone, int fdin, int fdout, int fderr, int copies, int argc);
|
||||
static int papOpen(at_nbptuple_t* tuple, u_char* connID, int* fd, at_inet_t* pap_to, u_char* flowQuantum);
|
||||
static int papClose(int abortflag);
|
||||
static int papWrite(int sockfd, at_inet_t* dest, u_short tid, u_char connID, u_char flowQuantum, char* data, int len, int eof);
|
||||
static int papCloseResp(int sockfd, at_inet_t* dest, int xo, u_short tid, u_char connID);
|
||||
static int papSendRequest(int sockfd, at_inet_t* dest, u_char connID, int function, u_char bitmap, int xo, int seqno);
|
||||
static int papCancelRequest(int sockfd, u_short tid);
|
||||
static void statusUpdate(char* status, u_char statusLen);
|
||||
static int parseUri(const char* argv0, char* name, char* type, char* zone);
|
||||
@@ -173,7 +170,6 @@ static int addPercentEscapes(const char* src, char* dst, int dstMax);
|
||||
static int removePercentEscapes(const char* src, char* dst, int dstMax);
|
||||
static int nbptuple_compare(const void *p1, const void *p2);
|
||||
static int okayToUseAppleTalk(void);
|
||||
static const char *packet_name(u_char x);
|
||||
static int connectTimeout(void);
|
||||
static void signalHandler(int sigraised);
|
||||
|
||||
@@ -203,13 +199,10 @@ int main (int argc, const char * argv[])
|
||||
|
||||
if (argc == 1 || (argc == 2 && strcmp(argv[1], "-discover") == 0))
|
||||
{
|
||||
/* If listDevices() didn't find any devices or returns an error output a
|
||||
* legacy style announcement.
|
||||
*
|
||||
/* Ignore errors returned by listDevices - they may be transitory
|
||||
* and we don't want cupsd to think that pap is forever unusable.
|
||||
*/
|
||||
if (listDevices() <= 0)
|
||||
puts("network pap \"Unknown\" \"AppleTalk Printer Access Protocol (pap)\"");
|
||||
|
||||
listDevices();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -246,9 +239,9 @@ int main (int argc, const char * argv[])
|
||||
}
|
||||
|
||||
/* Extract the device name and options from the URI... */
|
||||
parseUri(cupsBackendDeviceURI((char **)argv), name, type, zone);
|
||||
parseUri(argv[0], name, type, zone);
|
||||
|
||||
err = printFile(name, type, zone, fileno(fp), STDOUT_FILENO, STDERR_FILENO, copies, argc);
|
||||
err = printFile(name, type, zone, fileno(fp), 3, STDERR_FILENO, copies, argc);
|
||||
|
||||
if (fp != stdin)
|
||||
fclose(fp);
|
||||
@@ -270,7 +263,7 @@ int main (int argc, const char * argv[])
|
||||
static int listDevices(void)
|
||||
{
|
||||
int err = noErr;
|
||||
int i;
|
||||
int ind;
|
||||
int numberFound;
|
||||
|
||||
at_nvestr_t at_zone;
|
||||
@@ -294,13 +287,10 @@ static int listDevices(void)
|
||||
perror("ERROR: Unable to get default AppleTalk zone");
|
||||
return -2;
|
||||
}
|
||||
|
||||
memcpy(zone, at_zone.str, MIN(at_zone.len, sizeof(zone)-1));
|
||||
zone[MIN(at_zone.len, sizeof(zone)-1)] = '\0';
|
||||
|
||||
fprintf(stderr, "INFO: Using default AppleTalk zone \"%s\"\n", zone);
|
||||
|
||||
addPercentEscapes(zone, encodedZone, sizeof(encodedZone));
|
||||
err = addPercentEscapes(zone, encodedZone, sizeof(encodedZone));
|
||||
|
||||
/* Look up all the printers in our zone */
|
||||
nbp_make_entity(&entity, "=", "LaserWriter", zone);
|
||||
@@ -320,10 +310,10 @@ static int listDevices(void)
|
||||
/* Not required but sort them so they look nice */
|
||||
qsort(buf, numberFound, sizeof(at_nbptuple_t), nbptuple_compare);
|
||||
|
||||
for (i = 0; i < numberFound; i++)
|
||||
for (ind = 0; ind < numberFound; ind++)
|
||||
{
|
||||
memcpy(name, buf[i].enu_entity.object.str, MIN(buf[i].enu_entity.object.len, sizeof(name)-1));
|
||||
name[MIN(buf[i].enu_entity.object.len, sizeof(name)-1)] = '\0';
|
||||
memcpy(name, buf[ind].enu_entity.object.str, MIN(buf[ind].enu_entity.object.len, sizeof(name)-1));
|
||||
name[MIN(buf[ind].enu_entity.object.len, sizeof(name)-1)] = '\0';
|
||||
|
||||
if (addPercentEscapes(name, encodedName, sizeof(encodedName)) == 0)
|
||||
{
|
||||
@@ -381,7 +371,7 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
int err;
|
||||
int rc;
|
||||
int val;
|
||||
int len, i;
|
||||
int len, ind;
|
||||
|
||||
char fileBuffer[4096]; /* File buffer */
|
||||
int fileBufferNbytes;
|
||||
@@ -400,19 +390,20 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
int userdata, xo, reqlen;
|
||||
u_short tid;
|
||||
u_char bitmap;
|
||||
int maxfdp1,
|
||||
nbp_failures = 0;
|
||||
int maxfdp1;
|
||||
struct timeval timeout, *timeoutPtr;
|
||||
u_char flowQuantum = 1;
|
||||
u_short recvSequence = 0;
|
||||
time_t now,
|
||||
start_time,
|
||||
connect_time,
|
||||
elasped_time,
|
||||
sleep_time,
|
||||
connect_timeout = -1,
|
||||
nextStatusTime = 0;
|
||||
at_entity_t entity;
|
||||
at_retry_t retry;
|
||||
Boolean recoverableErrShown = false;
|
||||
|
||||
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
struct sigaction action; /* Actions for POSIX signals */
|
||||
@@ -429,60 +420,51 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
* Remember when we started looking for the printer.
|
||||
*/
|
||||
|
||||
start_time = time(NULL);
|
||||
connect_time = time(NULL);
|
||||
|
||||
retry.interval = 1;
|
||||
retry.retries = 5;
|
||||
retry.backoff = 0;
|
||||
|
||||
fprintf(stderr, "STATE: +connecting-to-device\n");
|
||||
|
||||
/* Loop forever trying to get an open session with the printer. */
|
||||
for (;;)
|
||||
{
|
||||
/* Make sure it's okay to use appletalk */
|
||||
if (okayToUseAppleTalk())
|
||||
{
|
||||
/* Clear this printer-state-reason in case we've set it */
|
||||
fprintf(stderr, "STATE: -apple-appletalk-disabled-warning\n");
|
||||
|
||||
/* Resolve the name into an address. Returns the number found or an error */
|
||||
if ((err = nbp_lookup(&entity, &tuple, 1, &retry)) > 0)
|
||||
{
|
||||
if (err > 1)
|
||||
fprintf(stderr, "DEBUG: Found more than one printer with the name \"%s\"\n", name);
|
||||
|
||||
if (nbp_failures)
|
||||
{
|
||||
fprintf(stderr, "STATE: -apple-nbp-lookup-warning\n");
|
||||
nbp_failures = 0;
|
||||
if (recoverableErrShown)
|
||||
{
|
||||
fprintf(stderr, "INFO: recovered: \n");
|
||||
sleep(5);
|
||||
recoverableErrShown = false;
|
||||
}
|
||||
|
||||
/* Open a connection to the device */
|
||||
if ((err = papOpen(&tuple, &gConnID, &gSockfd, &gSessionAddr, &flowQuantum)) == 0)
|
||||
break;
|
||||
|
||||
fprintf(stderr, "WARNING: Unable to open \"%s:%s\": %s\n", name, zone, strerror(err));
|
||||
fprintf(stderr, "WARNING: Unable to open \"%s:%s\": %s\n", name, zone, strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* It's not unusual to have to call nbp_lookup() twice before it's sucessful... */
|
||||
if (++nbp_failures > 2)
|
||||
{
|
||||
retry.interval = 2;
|
||||
retry.retries = 3;
|
||||
fprintf(stderr, "STATE: +apple-nbp-lookup-warning\n");
|
||||
fprintf(stderr, "WARNING: Printer not responding\n");
|
||||
}
|
||||
fprintf(stderr, "WARNING: recoverable: Printer not responding\n");
|
||||
recoverableErrShown = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "STATE: +apple-appletalk-disabled-warning\n");
|
||||
fprintf(stderr, "INFO: AppleTalk disabled in System Preferences.\n");
|
||||
fprintf(stderr, "WARNING: recoverable: AppleTalk disabled in System Preferences.\n");
|
||||
recoverableErrShown = true;
|
||||
}
|
||||
|
||||
elasped_time = time(NULL) - start_time;
|
||||
retry.retries = 3;
|
||||
elasped_time = time(NULL) - connect_time;
|
||||
|
||||
if (connect_timeout == -1)
|
||||
connect_timeout = connectTimeout();
|
||||
@@ -493,9 +475,9 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
err = ETIMEDOUT;
|
||||
goto Exit; /* Waiting too long... */
|
||||
}
|
||||
else if (elasped_time < (30 * 60))
|
||||
else if (elasped_time < 30 /*(30 * 60)*/)
|
||||
sleep_time = 10; /* Waiting < 30 minutes */
|
||||
else if (elasped_time < (24 * 60 * 60))
|
||||
else if (elasped_time < 60 /*(24 * 60 * 60)*/)
|
||||
sleep_time = 30; /* Waiting < 24 hours */
|
||||
else
|
||||
sleep_time = 60; /* Waiting > 24 hours */
|
||||
@@ -504,8 +486,6 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
sleep(sleep_time);
|
||||
}
|
||||
|
||||
fprintf(stderr, "STATE: -connecting-to-device\n");
|
||||
|
||||
/*
|
||||
* Now that we are connected to the printer ignore SIGTERM so that we
|
||||
* can finish out any page data the driver sends (e.g. to eject the
|
||||
@@ -556,6 +536,21 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
val = fcntl(fdin, F_GETFL, 0);
|
||||
fcntl(fdin, F_SETFL, val | O_NONBLOCK);
|
||||
|
||||
/* Set non-blocking mode on our data destination descriptor */
|
||||
val = fcntl(fdout, F_GETFL, 0);
|
||||
if (val < 0)
|
||||
{
|
||||
/*
|
||||
* Map output to stdout if we don't have the backchannel pipe
|
||||
* available on file descriptor 3...
|
||||
*/
|
||||
|
||||
if (fdout == 3 && errno == EBADF)
|
||||
fdout = 1;
|
||||
}
|
||||
else
|
||||
fcntl(fdout, F_SETFL, val | O_NONBLOCK);
|
||||
|
||||
fileBufferNbytes = 0;
|
||||
fileTbytes = 0;
|
||||
fileEOFRead = fileEOFSent = false;
|
||||
@@ -671,7 +666,7 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "DEBUG: <- %s\n", packet_name(TYPE_OF(userdata)));
|
||||
fprintf(stderr, "DEBUG: <- %s\n", PAPPacketStr(TYPE_OF(userdata)));
|
||||
|
||||
switch (TYPE_OF(userdata))
|
||||
{
|
||||
@@ -712,10 +707,10 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
break;
|
||||
|
||||
case AT_PAP_TYPE_DATA: /* Data packet */
|
||||
for (len=0, i=0; i < ATP_TRESP_MAX; i++)
|
||||
for (len=0, ind=0; ind < ATP_TRESP_MAX; ind++)
|
||||
{
|
||||
if (resp.bitmap & (1 << i))
|
||||
len += resp.resp[i].iov_len;
|
||||
if (resp.bitmap & (1 << ind))
|
||||
len += resp.resp[ind].iov_len;
|
||||
}
|
||||
|
||||
fprintf(stderr, "DEBUG: <- PAP_DATA %d bytes %s\n", len, IS_PAP_EOF(userdata) ? "with EOF" : "");
|
||||
@@ -727,7 +722,7 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
|
||||
char logstr[512];
|
||||
int logstrlen;
|
||||
|
||||
cupsBackChannelWrite(sockBuffer, len, 1.0);
|
||||
write(fdout, sockBuffer, len);
|
||||
|
||||
sockBuffer[len] = '\0'; /* We always reserve room for the nul so we can use strstr() below*/
|
||||
pLineBegin = sockBuffer;
|
||||
@@ -840,7 +835,7 @@ Exit:
|
||||
/*
|
||||
* Close the socket and return...
|
||||
*/
|
||||
papClose();
|
||||
papClose(false);
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -859,35 +854,37 @@ Exit:
|
||||
*
|
||||
* @result A non-zero return value for errors
|
||||
*/
|
||||
static int papOpen(at_nbptuple_t* tuple, u_char* connID, int* fd,
|
||||
at_inet_t* sessionAddr, u_char* flowQuantum)
|
||||
static int papOpen(at_nbptuple_t* tuple, u_char* connID, int* fd, at_inet_t* sessionAddr, u_char* flowQuantum)
|
||||
{
|
||||
int result,
|
||||
open_result,
|
||||
userdata,
|
||||
atp_err;
|
||||
time_t tm,
|
||||
waitTime;
|
||||
char data[10],
|
||||
rdata[ATP_DATA_SIZE];
|
||||
u_char *puserdata;
|
||||
at_socket socketfd;
|
||||
openResult;
|
||||
long tm;
|
||||
char data[10], rdata[ATP_DATA_SIZE];
|
||||
int userdata;
|
||||
u_char *puserdata = (u_char *)&userdata;
|
||||
at_socket sock = 0;
|
||||
u_short waitTime;
|
||||
int status;
|
||||
at_resp_t resp;
|
||||
at_retry_t retry;
|
||||
|
||||
result = 0;
|
||||
socketfd = 0;
|
||||
puserdata = (u_char *)&userdata;
|
||||
if (tuple == NULL)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
fprintf(stderr, "INFO: Opening connection\n");
|
||||
|
||||
if ((*fd = atp_open(&socketfd)) < 0)
|
||||
errno = 0;
|
||||
result = 0;
|
||||
|
||||
*fd = atp_open(&sock);
|
||||
if (*fd < 0)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* Build the open connection request packet.
|
||||
/* Build the open connection request packet.
|
||||
*/
|
||||
|
||||
tm = time(NULL);
|
||||
srand(tm);
|
||||
|
||||
@@ -904,67 +901,64 @@ static int papOpen(at_nbptuple_t* tuple, u_char* connID, int* fd,
|
||||
resp.resp[0].iov_base = rdata;
|
||||
resp.resp[0].iov_len = sizeof(rdata);
|
||||
|
||||
data[0] = socketfd;
|
||||
data[0] = sock;
|
||||
data[1] = 8;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
waitTime = time(NULL) - tm;
|
||||
OSWriteBigInt16(&data[2], 0, (u_short)waitTime);
|
||||
waitTime = (u_short)(time(NULL) - tm);
|
||||
OSWriteBigInt16(&data[2], 0, waitTime);
|
||||
|
||||
fprintf(stderr, "DEBUG: -> %s\n", packet_name(AT_PAP_TYPE_OPEN_CONN));
|
||||
fprintf(stderr, "DEBUG: -> %s\n", PAPPacketStr(AT_PAP_TYPE_OPEN_CONN));
|
||||
|
||||
if ((atp_err = atp_sendreq(*fd, &tuple->enu_addr, data, 4, userdata, 1, 0,
|
||||
0, &resp, &retry, 0)) < 0)
|
||||
status = atp_sendreq(*fd, &tuple->enu_addr, data, 4, userdata, 1, 0, 0, &resp, &retry, 0);
|
||||
|
||||
if (status < 0)
|
||||
{
|
||||
statusUpdate("Destination unreachable", 23);
|
||||
result = EHOSTUNREACH;
|
||||
break;
|
||||
errno = EHOSTUNREACH;
|
||||
sleep(1);
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
puserdata = (u_char *)&resp.userdata[0];
|
||||
open_result = OSReadBigInt16(&rdata[2], 0);
|
||||
|
||||
fprintf(stderr, "DEBUG: <- %s, status %d\n", packet_name(puserdata[1]),
|
||||
open_result);
|
||||
|
||||
/*
|
||||
* Just for the sake of our sanity check the other fields in the packet
|
||||
*/
|
||||
|
||||
if (puserdata[1] != AT_PAP_TYPE_OPEN_CONN_REPLY ||
|
||||
(open_result == 0 && (puserdata[0] & 0xff) != *connID))
|
||||
else
|
||||
{
|
||||
result = EINVAL;
|
||||
break;
|
||||
puserdata = (u_char *)&resp.userdata[0];
|
||||
openResult = OSReadBigInt16(&rdata[2], 0);
|
||||
|
||||
fprintf(stderr, "DEBUG: <- %s, status %d\n", PAPPacketStr(puserdata[1]), openResult);
|
||||
|
||||
/* Just for the sake of our sanity check the other fields in the packet
|
||||
*/
|
||||
if (puserdata[1] != AT_PAP_TYPE_OPEN_CONN_REPLY ||
|
||||
(openResult == 0 && (puserdata[0] & 0xff) != *connID))
|
||||
{
|
||||
result = EINVAL;
|
||||
errno = EINVAL;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
statusUpdate(&rdata[5], rdata[4] & 0xff);
|
||||
|
||||
if (openResult == 0)
|
||||
break; /* Connection established okay, exit from the loop */
|
||||
}
|
||||
|
||||
statusUpdate(&rdata[5], rdata[4] & 0xff);
|
||||
|
||||
/*
|
||||
* if the connection established okay exit from the loop
|
||||
*/
|
||||
|
||||
if (open_result == 0)
|
||||
break;
|
||||
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
if (result == 0)
|
||||
{
|
||||
/* Update the session address
|
||||
*/
|
||||
sessionAddr->net = tuple->enu_addr.net;
|
||||
sessionAddr->node = tuple->enu_addr.node;
|
||||
sessionAddr->socket = rdata[0];
|
||||
*flowQuantum = rdata[1];
|
||||
}
|
||||
else
|
||||
/* Update the session address
|
||||
*/
|
||||
sessionAddr->net = tuple->enu_addr.net;
|
||||
sessionAddr->node = tuple->enu_addr.node;
|
||||
sessionAddr->socket = rdata[0];
|
||||
*flowQuantum = rdata[1];
|
||||
|
||||
Exit:
|
||||
if (result != 0)
|
||||
{
|
||||
atp_close(*fd);
|
||||
*fd = 0;
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -976,9 +970,12 @@ static int papOpen(at_nbptuple_t* tuple, u_char* connID, int* fd,
|
||||
* @abstract End a PAP session by canceling outstanding send-data & tickle
|
||||
* transactions and sending a PAP close request.
|
||||
*
|
||||
* @param abort If we're aborting then send the close request
|
||||
* with 0 retries (not yet implemented)
|
||||
*
|
||||
* @result A non-zero return value for errors
|
||||
*/
|
||||
static int papClose()
|
||||
static int papClose(int abortflag)
|
||||
{
|
||||
int fd;
|
||||
u_short tmpID;
|
||||
@@ -1021,7 +1018,7 @@ static int papClose()
|
||||
if (gWaitEOF == false)
|
||||
sleep(2);
|
||||
|
||||
fprintf(stderr, "DEBUG: -> %s\n", packet_name(AT_PAP_TYPE_CLOSE_CONN));
|
||||
fprintf(stderr, "DEBUG: -> %s\n", PAPPacketStr(AT_PAP_TYPE_CLOSE_CONN));
|
||||
|
||||
puserdata[0] = gConnID;
|
||||
puserdata[1] = AT_PAP_TYPE_CLOSE_CONN;
|
||||
@@ -1061,7 +1058,7 @@ static int papClose()
|
||||
static int papWrite(int sockfd, at_inet_t* dest, u_short tid, u_char connID, u_char flowQuantum, char* data, int len, int eof)
|
||||
{
|
||||
int result;
|
||||
int i;
|
||||
int ind;
|
||||
u_char* puserdata;
|
||||
at_resp_t resp;
|
||||
|
||||
@@ -1079,26 +1076,26 @@ static int papWrite(int sockfd, at_inet_t* dest, u_short tid, u_char connID, u_c
|
||||
* response packets to reply to an incoming
|
||||
* PAP 'SENDDATA' request
|
||||
*/
|
||||
for (i = 0; i < flowQuantum; i++)
|
||||
for (ind = 0; ind < flowQuantum; ind++)
|
||||
{
|
||||
resp.userdata[i] = 0;
|
||||
puserdata = (u_char *)&resp.userdata[i];
|
||||
resp.userdata[ind] = 0;
|
||||
puserdata = (u_char *)&resp.userdata[ind];
|
||||
|
||||
puserdata[PAP_CONNID] = connID;
|
||||
puserdata[PAP_TYPE] = AT_PAP_TYPE_DATA;
|
||||
puserdata[PAP_EOF] = eof ? 1 : 0;
|
||||
|
||||
resp.resp[i].iov_base = (caddr_t)data;
|
||||
resp.resp[ind].iov_base = (caddr_t)data;
|
||||
|
||||
if (data)
|
||||
data += AT_PAP_DATA_SIZE;
|
||||
|
||||
resp.resp[i].iov_len = MIN((int)len, (int)AT_PAP_DATA_SIZE);
|
||||
len -= resp.resp[i].iov_len;
|
||||
resp.resp[ind].iov_len = MIN((int)len, (int)AT_PAP_DATA_SIZE);
|
||||
len -= resp.resp[ind].iov_len;
|
||||
if (len == 0)
|
||||
break;
|
||||
}
|
||||
resp.bitmap = (1 << (i + 1)) - 1;
|
||||
resp.bitmap = (1 << (ind + 1)) - 1;
|
||||
|
||||
/*
|
||||
* Write out the data as a PAP 'DATA' response
|
||||
@@ -1171,7 +1168,7 @@ static int papSendRequest(int sockfd, at_inet_t* dest, u_char connID, int functi
|
||||
at_resp_t resp;
|
||||
static u_short pap_send_count = 0;
|
||||
|
||||
fprintf(stderr, "DEBUG: -> %s\n", packet_name(function));
|
||||
fprintf(stderr, "DEBUG: -> %s\n", PAPPacketStr(function));
|
||||
|
||||
puserdata[0] = connID;
|
||||
puserdata[1] = function;
|
||||
@@ -1277,7 +1274,7 @@ void statusUpdate(char* status, u_char statusLen)
|
||||
*/
|
||||
static int parseUri(const char* argv0, char* name, char* type, char* zone)
|
||||
{
|
||||
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 (device and options) */
|
||||
@@ -1293,10 +1290,8 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
|
||||
/*
|
||||
* Extract the device name and options from the URI...
|
||||
*/
|
||||
method[0] = username[0] = hostname[0] = resource[0] = '\0';
|
||||
port = 0;
|
||||
|
||||
httpSeparateURI(HTTP_URI_CODING_NONE, argv0, method, sizeof(method),
|
||||
httpSeparateURI(HTTP_URI_CODING_NONE, argv0, scheme, sizeof(scheme),
|
||||
username, sizeof(username),
|
||||
hostname, sizeof(hostname), &port,
|
||||
resource, sizeof(resource));
|
||||
@@ -1532,31 +1527,6 @@ static int okayToUseAppleTalk()
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* @function packet_name
|
||||
* @abstract Returns packet name string.
|
||||
*
|
||||
* @result A string
|
||||
*/
|
||||
static const char *packet_name(u_char x)
|
||||
{
|
||||
switch (x)
|
||||
{
|
||||
case AT_PAP_TYPE_OPEN_CONN: return "PAP_OPEN_CONN";
|
||||
case AT_PAP_TYPE_OPEN_CONN_REPLY: return "PAP_OPEN_CONN_REPLY";
|
||||
case AT_PAP_TYPE_SEND_DATA: return "PAP_SEND_DATA";
|
||||
case AT_PAP_TYPE_DATA: return "PAP_DATA";
|
||||
case AT_PAP_TYPE_TICKLE: return "PAP_TICKLE";
|
||||
case AT_PAP_TYPE_CLOSE_CONN: return "PAP_CLOSE_CONN";
|
||||
case AT_PAP_TYPE_CLOSE_CONN_REPLY: return "PAP_CLOSE_CONN_REPLY";
|
||||
case AT_PAP_TYPE_SEND_STATUS: return "PAP_SEND_STATUS";
|
||||
case AT_PAP_TYPE_SEND_STS_REPLY: return "PAP_SEND_STS_REPLY";
|
||||
case AT_PAP_TYPE_READ_LW: return "PAP_READ_LW";
|
||||
}
|
||||
return "<Unknown>";
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* @function connectTimeout
|
||||
* @abstract Returns the connect timeout preference value.
|
||||
@@ -1592,7 +1562,7 @@ static void signalHandler(int sigraised)
|
||||
{
|
||||
fprintf(stderr, "ERROR: There was a timeout error while sending data to the printer\n");
|
||||
|
||||
papClose();
|
||||
papClose(true);
|
||||
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
@@ -88,8 +88,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
*options; /* Pointer to options */
|
||||
int port; /* Port number (not used) */
|
||||
int print_fd, /* Print file */
|
||||
device_fd, /* Parallel device */
|
||||
use_bc; /* Read back-channel data? */
|
||||
device_fd; /* Parallel device */
|
||||
int copies; /* Number of copies to print */
|
||||
size_t tbytes; /* Total number of bytes written */
|
||||
struct termios opts; /* Parallel port options */
|
||||
@@ -189,26 +188,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
do
|
||||
{
|
||||
#ifdef __linux
|
||||
/*
|
||||
* The Linux parallel port driver currently is broken WRT select()
|
||||
* and bidirection I/O...
|
||||
*/
|
||||
|
||||
device_fd = open(resource, O_WRONLY | O_EXCL);
|
||||
use_bc = 0;
|
||||
|
||||
#else
|
||||
if ((device_fd = open(resource, O_RDWR | O_EXCL)) < 0)
|
||||
{
|
||||
device_fd = open(resource, O_WRONLY | O_EXCL);
|
||||
use_bc = 0;
|
||||
}
|
||||
else
|
||||
use_bc = 1;
|
||||
#endif /* __linux */
|
||||
|
||||
if (device_fd == -1)
|
||||
if ((device_fd = open(resource, O_WRONLY | O_EXCL)) == -1)
|
||||
{
|
||||
if (getenv("CLASS") != NULL)
|
||||
{
|
||||
@@ -284,7 +264,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, use_bc);
|
||||
tbytes = backendRunLoop(print_fd, device_fd, 1);
|
||||
|
||||
if (print_fd != 0 && tbytes >= 0)
|
||||
fprintf(stderr, "INFO: Sent print file, " CUPS_LLFMT " bytes...\n",
|
||||
|
||||
@@ -778,14 +778,6 @@ list_devices(void)
|
||||
printf("serial serial:%s?baud=230400 \"Unknown\" \"USB Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
|
||||
sprintf(device, "/dev/ttyUSB%d", i);
|
||||
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
|
||||
{
|
||||
close(fd);
|
||||
printf("serial serial:%s?baud=230400 \"Unknown\" \"USB Serial Port #%d\"\n",
|
||||
device, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 64; i ++)
|
||||
|
||||
@@ -1126,7 +1126,7 @@ asn1_set_packed(unsigned char **buffer, /* IO - Pointer in buffer */
|
||||
{
|
||||
if (integer > 0xfffffff)
|
||||
{
|
||||
**buffer = (integer >> 28) & 0x7f;
|
||||
**buffer = (integer >> 14) & 0x7f;
|
||||
(*buffer) ++;
|
||||
}
|
||||
|
||||
@@ -1752,7 +1752,7 @@ probe_device(snmp_cache_t *device) /* I - Device */
|
||||
alarm(0);
|
||||
}
|
||||
|
||||
if (http)
|
||||
if (http);
|
||||
{
|
||||
/*
|
||||
* IPP is supported...
|
||||
|
||||
@@ -78,9 +78,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
int delay; /* Delay for retries... */
|
||||
int device_fd; /* AppSocket */
|
||||
int error; /* Error code (if any) */
|
||||
http_addrlist_t *addrlist, /* Address list */
|
||||
*addr; /* Connected address */
|
||||
char addrname[256]; /* Address name */
|
||||
http_addrlist_t *addrlist; /* Address list */
|
||||
ssize_t tbytes; /* Total number of bytes written */
|
||||
struct timeval timeout; /* Timeout for select() */
|
||||
fd_set input; /* Input set for select() */
|
||||
@@ -247,7 +245,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
|
||||
for (delay = 5;;)
|
||||
{
|
||||
if ((addr = httpAddrConnect(addrlist, &device_fd)) == NULL)
|
||||
if (!httpAddrConnect(addrlist, &device_fd))
|
||||
{
|
||||
error = errno;
|
||||
device_fd = -1;
|
||||
@@ -295,19 +293,6 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
}
|
||||
|
||||
fputs("STATE: -connecting-to-device\n", stderr);
|
||||
fprintf(stderr, "INFO: Connected to %s...\n", hostname);
|
||||
|
||||
#ifdef AF_INET6
|
||||
if (addr->addr.addr.sa_family == AF_INET6)
|
||||
fprintf(stderr, "DEBUG: Connected to [%s]:%d (IPv6)...\n",
|
||||
httpAddrString(&addr->addr, addrname, sizeof(addrname)),
|
||||
ntohs(addr->addr.ipv6.sin6_port));
|
||||
else
|
||||
#endif /* AF_INET6 */
|
||||
if (addr->addr.addr.sa_family == AF_INET)
|
||||
fprintf(stderr, "DEBUG: Connected to %s:%d (IPv4)...\n",
|
||||
httpAddrString(&addr->addr, addrname, sizeof(addrname)),
|
||||
ntohs(addr->addr.ipv4.sin_port));
|
||||
|
||||
/*
|
||||
* Print everything...
|
||||
|
||||
@@ -198,13 +198,12 @@ static void copy_deviceinfo(CFStringRef deviceIDString, CFStringRef *make, CFStr
|
||||
static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial);
|
||||
static kern_return_t load_classdriver(CFStringRef driverPath, printer_interface_t intf, classdriver_context_t ***driver);
|
||||
static kern_return_t unload_classdriver(classdriver_context_t ***classDriver);
|
||||
static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *driverBundlePath);
|
||||
static kern_return_t registry_open(printer_data_t *printer, CFStringRef *driverBundlePath);
|
||||
static kern_return_t load_printerdriver(printer_data_t *printer);
|
||||
static kern_return_t registry_open(printer_data_t *printer);
|
||||
static kern_return_t registry_close(printer_data_t *printer);
|
||||
static OSStatus copy_deviceid(classdriver_context_t **printer, CFStringRef *deviceID);
|
||||
static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID, UInt32 *deviceLocation);
|
||||
static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys);
|
||||
static CFStringRef cfstr_create_and_trim(const char *cstr);
|
||||
static void parse_options(const char *options, char *serial, UInt32 *location, Boolean *waitEOF);
|
||||
static void setup_cfLanguage(void);
|
||||
static void *read_thread(void *reference);
|
||||
@@ -256,7 +255,6 @@ print_device(const char *uri, /* I - Device URI */
|
||||
int countdown = INITIAL_LOG_INTERVAL; /* Logging interval */
|
||||
pthread_cond_t *readCompleteConditionPtr = NULL; /* Read complete condition */
|
||||
pthread_mutex_t *readMutexPtr = NULL; /* Read mutex */
|
||||
CFStringRef driverBundlePath; /* Class driver path */
|
||||
|
||||
setup_cfLanguage();
|
||||
parse_options(options, serial, &printer_data.location, &printer_data.waitEOF);
|
||||
@@ -265,10 +263,9 @@ print_device(const char *uri, /* I - Device URI */
|
||||
resource++;
|
||||
|
||||
printer_data.uri = uri;
|
||||
|
||||
printer_data.make = cfstr_create_and_trim(hostname);
|
||||
printer_data.model = cfstr_create_and_trim(resource);
|
||||
printer_data.serial = cfstr_create_and_trim(serial);
|
||||
printer_data.make = CFStringCreateWithCString(NULL, hostname, kCFStringEncodingUTF8);
|
||||
printer_data.model = CFStringCreateWithCString(NULL, resource, kCFStringEncodingUTF8);
|
||||
printer_data.serial = CFStringCreateWithCString(NULL, serial, kCFStringEncodingUTF8);
|
||||
|
||||
fputs("STATE: +connecting-to-device\n", stderr);
|
||||
|
||||
@@ -284,9 +281,7 @@ print_device(const char *uri, /* I - Device URI */
|
||||
iterate_printers(find_device_callback, &printer_data);
|
||||
|
||||
fprintf(stderr, "INFO: Opening Connection\n");
|
||||
|
||||
driverBundlePath = NULL;
|
||||
status = registry_open(&printer_data, &driverBundlePath);
|
||||
status = registry_open(&printer_data);
|
||||
#if defined(__i386__)
|
||||
/*
|
||||
* If we were unable to load the class drivers for this printer it's probably because they're ppc-only.
|
||||
@@ -297,26 +292,6 @@ print_device(const char *uri, /* I - Device URI */
|
||||
/* Never returns here */
|
||||
}
|
||||
#endif /* __i386__ */
|
||||
if (status == -2) {
|
||||
/*
|
||||
* If we still were unable to load the class drivers for this printer log
|
||||
* the error and stop the queue...
|
||||
*/
|
||||
|
||||
if (driverBundlePath == NULL || !CFStringGetCString(driverBundlePath, buffer, sizeof(buffer), kCFStringEncodingUTF8))
|
||||
strlcpy(buffer, "USB class driver", sizeof(buffer));
|
||||
|
||||
fprintf(stderr, "STATE: +apple-missing-usbclassdriver-error\n" \
|
||||
"FATAL: Could not load %s\n", buffer);
|
||||
|
||||
if (driverBundlePath)
|
||||
CFRelease(driverBundlePath);
|
||||
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
|
||||
if (driverBundlePath)
|
||||
CFRelease(driverBundlePath);
|
||||
|
||||
if (status != noErr) {
|
||||
sleep( PRINTER_POLLING_INTERVAL );
|
||||
@@ -533,7 +508,7 @@ static Boolean find_device_callback(void *refcon, io_service_t obj)
|
||||
if (CFStringCompare(make, userData->make, kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
if (CFStringCompare(model, userData->model, kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
if (userData->serial != NULL) {
|
||||
if (serial != NULL && CFStringCompare(serial, userData->serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
if (serial != NULL && CFStringCompare(model, userData->model, kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
IOObjectRetain(obj);
|
||||
userData->printerObj = obj;
|
||||
keepLooking = false;
|
||||
@@ -753,11 +728,9 @@ static kern_return_t unload_classdriver(classdriver_context_t ***classDriver)
|
||||
|
||||
/*
|
||||
* 'load_printerdriver()' - Load a vendor's (or generic) classdriver.
|
||||
*
|
||||
* If driverBundlePath is not NULL on return it is the callers responsbility to release it!
|
||||
*/
|
||||
|
||||
static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *driverBundlePath)
|
||||
static kern_return_t load_printerdriver(printer_data_t *printer)
|
||||
{
|
||||
IOCFPlugInInterface **iodev = NULL;
|
||||
SInt32 score;
|
||||
@@ -771,10 +744,11 @@ static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *dr
|
||||
|
||||
kr = IORegistryEntryCreateCFProperties(printer->printerObj, &properties, NULL, kNilOptions);
|
||||
if (kr == kIOReturnSuccess) {
|
||||
CFStringRef driverBundlePath = NULL;
|
||||
if (properties != NULL) {
|
||||
*driverBundlePath = (CFStringRef) CFDictionaryGetValue(properties, kUSBClassDriverProperty);
|
||||
driverBundlePath = (CFStringRef) CFDictionaryGetValue(properties, kUSBClassDriverProperty);
|
||||
}
|
||||
kr = load_classdriver(*driverBundlePath, intf, &printer->printerDriver);
|
||||
kr = load_classdriver(driverBundlePath, intf, &printer->printerDriver);
|
||||
}
|
||||
|
||||
if (kr != kIOReturnSuccess)
|
||||
@@ -790,9 +764,9 @@ static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *dr
|
||||
* 'registry_open()' - Open a connection to the printer.
|
||||
*/
|
||||
|
||||
static kern_return_t registry_open(printer_data_t *printer, CFStringRef *driverBundlePath)
|
||||
static kern_return_t registry_open(printer_data_t *printer)
|
||||
{
|
||||
kern_return_t kr = load_printerdriver(printer, driverBundlePath);
|
||||
kern_return_t kr = load_printerdriver(printer);
|
||||
if (kr != kIOReturnSuccess) {
|
||||
kr = -2;
|
||||
}
|
||||
@@ -1001,27 +975,6 @@ static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'cfstr_create_and_trim()' - Create a CFString from a c-string and
|
||||
* trim it's whitespace characters.
|
||||
*/
|
||||
|
||||
CFStringRef cfstr_create_and_trim(const char *cstr)
|
||||
{
|
||||
CFStringRef cfstr;
|
||||
CFMutableStringRef cfmutablestr = NULL;
|
||||
|
||||
if ((cfstr = CFStringCreateWithCString(NULL, cstr, kCFStringEncodingUTF8)) != NULL)
|
||||
{
|
||||
if ((cfmutablestr = CFStringCreateMutableCopy(NULL, 1024, cfstr)) != NULL)
|
||||
CFStringTrimWhitespace(cfmutablestr);
|
||||
|
||||
CFRelease(cfstr);
|
||||
}
|
||||
return (CFStringRef) cfmutablestr;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
/*
|
||||
* 'parse_options()' - Parse uri options.
|
||||
@@ -1391,6 +1344,7 @@ static void *read_thread(void *reference)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
||||
|
||||
@@ -84,7 +84,8 @@ print_device(const char *uri, /* I - Device URI */
|
||||
* device ID over and over and over when they get a read request...
|
||||
*/
|
||||
|
||||
use_bc = strcasecmp(hostname, "Canon") && !strstr(hostname, "Minolta");
|
||||
use_bc = strcasecmp(hostname, "Canon") != 0 ||
|
||||
strstr(hostname, "Minolta") != NULL;
|
||||
|
||||
if ((device_fd = open_device(uri, &use_bc)) == -1)
|
||||
{
|
||||
|
||||
@@ -237,8 +237,10 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
const char *dests) /* I - Destinations */
|
||||
{
|
||||
ipp_t *request, /* IPP Request */
|
||||
*response; /* IPP Response */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
*response, /* IPP Response */
|
||||
*jobs; /* IPP Get Jobs response */
|
||||
ipp_attribute_t *attr, /* Current attribute */
|
||||
*jattr; /* Current job attribute */
|
||||
cups_lang_t *language; /* Default language */
|
||||
char *printer, /* Printer name */
|
||||
*device, /* Device URI */
|
||||
@@ -249,13 +251,14 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
const char *dptr, /* Pointer into destination list */
|
||||
*ptr; /* Pointer into printer name */
|
||||
int match; /* Non-zero if this job matches */
|
||||
char printer_uri[HTTP_MAX_URI];
|
||||
/* Printer URI */
|
||||
static const char *requested[] = /* Requested attributes */
|
||||
{
|
||||
"device-uri",
|
||||
"printer-is-accepting-jobs",
|
||||
"printer-name",
|
||||
"device-uri",
|
||||
"printer-state",
|
||||
"queued-job-count"
|
||||
"printer-is-accepting-jobs"
|
||||
};
|
||||
|
||||
|
||||
@@ -326,21 +329,21 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
|
||||
{
|
||||
if (!strcmp(attr->name, "printer-name") &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
printer = attr->values[0].string.text;
|
||||
|
||||
if (!strcmp(attr->name, "device-uri") &&
|
||||
attr->value_tag == IPP_TAG_URI)
|
||||
device = attr->values[0].string.text;
|
||||
else if (!strcmp(attr->name, "printer-is-accepting-jobs") &&
|
||||
attr->value_tag == IPP_TAG_BOOLEAN)
|
||||
accepting = attr->values[0].boolean;
|
||||
else if (!strcmp(attr->name, "printer-name") &&
|
||||
attr->value_tag == IPP_TAG_NAME)
|
||||
printer = attr->values[0].string.text;
|
||||
else if (!strcmp(attr->name, "printer-state") &&
|
||||
attr->value_tag == IPP_TAG_ENUM)
|
||||
|
||||
if (!strcmp(attr->name, "printer-state") &&
|
||||
attr->value_tag == IPP_TAG_ENUM)
|
||||
pstate = (ipp_pstate_t)attr->values[0].integer;
|
||||
else if (!strcmp(attr->name, "queued-job-count") &&
|
||||
attr->value_tag == IPP_TAG_INTEGER)
|
||||
jobcount = attr->values[0].integer;
|
||||
|
||||
if (!strcmp(attr->name, "printer-is-accepting-jobs") &&
|
||||
attr->value_tag == IPP_TAG_BOOLEAN)
|
||||
accepting = attr->values[0].boolean;
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
@@ -392,8 +395,7 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
*ptr != '\0' && *dptr != '\0' && *ptr == *dptr;
|
||||
ptr ++, dptr ++);
|
||||
|
||||
if (*ptr == '\0' && (*dptr == '\0' || *dptr == ',' ||
|
||||
isspace(*dptr & 255)))
|
||||
if (*ptr == '\0' && (*dptr == '\0' || *dptr == ',' || isspace(*dptr & 255)))
|
||||
{
|
||||
match = 1;
|
||||
break;
|
||||
@@ -419,6 +421,53 @@ show_status(http_t *http, /* I - HTTP connection to server */
|
||||
|
||||
if (match)
|
||||
{
|
||||
/*
|
||||
* Build an IPP_GET_JOBS request, which requires the following
|
||||
* attributes:
|
||||
*
|
||||
* attributes-charset
|
||||
* attributes-natural-language
|
||||
* printer-uri
|
||||
* limit
|
||||
*/
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_JOBS;
|
||||
request->request.op.request_id = 1;
|
||||
|
||||
language = cupsLangDefault();
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
|
||||
"attributes-charset", NULL,
|
||||
cupsLangEncoding(language));
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
|
||||
"attributes-natural-language", NULL,
|
||||
language->language);
|
||||
|
||||
httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
|
||||
"ipp", NULL, "localhost", 631, "/printers/%s",
|
||||
printer);
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, printer_uri);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
"requested-attributes", NULL, "job-id");
|
||||
|
||||
if ((jobs = cupsDoRequest(http, request, "/")) != NULL)
|
||||
{
|
||||
/*
|
||||
* Grab the number of jobs for the printer.
|
||||
*/
|
||||
|
||||
for (jattr = jobs->attrs; jattr != NULL; jattr = jattr->next)
|
||||
if (jattr->name && !strcmp(jattr->name, "job-id"))
|
||||
jobcount ++;
|
||||
|
||||
ippDelete(jobs);
|
||||
}
|
||||
|
||||
/*
|
||||
* Display it...
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-common.m4 6092 2006-11-14 16:36:36Z mike $"
|
||||
dnl "$Id: cups-common.m4 6032 2006-10-12 19:19:47Z mike $"
|
||||
dnl
|
||||
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -28,9 +28,12 @@ AC_PREREQ(2.50)
|
||||
dnl Set the name of the config header file...
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Version number information...
|
||||
CUPS_VERSION="1.2.7"
|
||||
dnl Versio number information...
|
||||
CUPS_VERSION="1.2.5"
|
||||
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'`"
|
||||
fi
|
||||
|
||||
AC_SUBST(CUPS_VERSION)
|
||||
AC_SUBST(CUPS_REVISION)
|
||||
@@ -264,5 +267,5 @@ AC_SUBST(DEFAULT_IPP_PORT)
|
||||
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-common.m4 6092 2006-11-14 16:36:36Z mike $".
|
||||
dnl End of "$Id: cups-common.m4 6032 2006-10-12 19:19:47Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-defaults.m4 6118 2006-11-16 13:34:44Z mike $"
|
||||
dnl "$Id: cups-defaults.m4 6003 2006-10-02 16:26:04Z mike $"
|
||||
dnl
|
||||
dnl Default cupsd configuration settings for the Common UNIX Printing System
|
||||
dnl (CUPS).
|
||||
@@ -28,7 +28,7 @@ AC_ARG_WITH(languages, [ --with-languages set installed languages, defau
|
||||
if test "x$withval" != xno; then
|
||||
LANGUAGES="$withval"
|
||||
fi,
|
||||
LANGUAGES="de es et it ja pl sv")
|
||||
LANGUAGES="de es et ja pl sv")
|
||||
AC_SUBST(LANGUAGES)
|
||||
|
||||
dnl Default ConfigFilePerm
|
||||
@@ -252,5 +252,5 @@ fi
|
||||
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTCAP, "$CUPS_DEFAULT_PRINTCAP")
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-defaults.m4 6118 2006-11-16 13:34:44Z mike $".
|
||||
dnl End of "$Id: cups-defaults.m4 6003 2006-10-02 16:26:04Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
dnl
|
||||
dnl "$Id: cups-threads.m4 6061 2006-10-23 00:26:52Z mike $"
|
||||
dnl "$Id: cups-threads.m4 6012 2006-10-03 22:35:12Z mike $"
|
||||
dnl
|
||||
dnl Threading stuff for the Common UNIX Printing System (CUPS).
|
||||
dnl
|
||||
@@ -45,10 +45,10 @@ if test "x$enable_threads" != xno; then
|
||||
if test $have_pthread = yes; then
|
||||
PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT"
|
||||
|
||||
# Solaris requires -D_POSIX_PTHREAD_SEMANTICS to
|
||||
# Solaris requires _POSIX_PTHREAD_SEMANTICS to
|
||||
# be POSIX-compliant... :(
|
||||
if test $uname = SunOS; then
|
||||
PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS"
|
||||
PTHREAD_FLAGS="$PTHREAD_FLAGS _POSIX_PTHREAD_SEMANTICS"
|
||||
fi
|
||||
break
|
||||
fi
|
||||
@@ -59,5 +59,5 @@ fi
|
||||
AC_SUBST(PTHREAD_FLAGS)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id: cups-threads.m4 6061 2006-10-23 00:26:52Z mike $".
|
||||
dnl End of "$Id: cups-threads.m4 6012 2006-10-03 22:35:12Z mike $".
|
||||
dnl
|
||||
|
||||
@@ -420,13 +420,6 @@
|
||||
#undef HAVE_CFBUNDLEPRIV_H
|
||||
|
||||
|
||||
/*
|
||||
* Do we have CFLocaleCreateCanonicalLocaleIdentifierFromString()?
|
||||
*/
|
||||
|
||||
#undef HAVE_CF_LOCALE_ID
|
||||
|
||||
|
||||
/*
|
||||
* Do we have MacOSX 10.4's mbr_XXX functions()?
|
||||
*/
|
||||
|
||||
@@ -61,10 +61,10 @@ extern "C" {
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define CUPS_VERSION 1.0207
|
||||
# define CUPS_VERSION 1.0205
|
||||
# define CUPS_VERSION_MAJOR 1
|
||||
# define CUPS_VERSION_MINOR 2
|
||||
# define CUPS_VERSION_PATCH 7
|
||||
# define CUPS_VERSION_PATCH 5
|
||||
# define CUPS_DATE_ANY -1
|
||||
|
||||
|
||||
|
||||
@@ -98,7 +98,11 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
|
||||
/* language.c */
|
||||
cups_lang_t *lang_default; /* Default language */
|
||||
# ifdef __APPLE__
|
||||
# ifdef HAVE_CF_LOCALE_ID
|
||||
char language[32]; /* Cached language */
|
||||
# else
|
||||
const char *language; /* Cached language */
|
||||
# endif /* HAVE_CF_LOCALE_ID */
|
||||
# endif /* __APPLE__ */
|
||||
|
||||
/* ppd.c */
|
||||
|
||||
@@ -70,8 +70,7 @@ typedef int socklen_t;
|
||||
# if defined HAVE_LIBSSL
|
||||
/*
|
||||
* The OpenSSL library provides its own SSL/TLS context structure for its
|
||||
* IO and protocol management. However, we need to provide our own BIO
|
||||
* (basic IO) implementation to do timeouts...
|
||||
* IO and protocol management...
|
||||
*/
|
||||
|
||||
# include <openssl/err.h>
|
||||
@@ -80,8 +79,6 @@ typedef int socklen_t;
|
||||
|
||||
typedef SSL http_tls_t;
|
||||
|
||||
extern BIO_METHOD *_httpBIOMethods(void);
|
||||
|
||||
# elif defined HAVE_GNUTLS
|
||||
/*
|
||||
* The GNU TLS library is more of a "bare metal" SSL/TLS library...
|
||||
@@ -94,11 +91,6 @@ typedef struct
|
||||
void *credentials; /* GNU TLS credentials object */
|
||||
} http_tls_t;
|
||||
|
||||
extern ssize_t _httpReadGNUTLS(gnutls_transport_ptr ptr, void *data,
|
||||
size_t length);
|
||||
extern ssize_t _httpWriteGNUTLS(gnutls_transport_ptr ptr, const void *data,
|
||||
size_t length);
|
||||
|
||||
# elif defined(HAVE_CDSASSL)
|
||||
/*
|
||||
* Darwin's Security framework provides its own SSL/TLS context structure
|
||||
@@ -113,6 +105,15 @@ typedef struct /**** CDSA connection information ****/
|
||||
CFArrayRef certsArray; /* Certificates array */
|
||||
} http_tls_t;
|
||||
|
||||
typedef union _cdsa_conn_ref_u /**** CDSA Connection reference union
|
||||
**** used to resolve 64-bit casting
|
||||
**** warnings.
|
||||
****/
|
||||
{
|
||||
SSLConnectionRef connection; /* SSL connection pointer */
|
||||
int sock; /* Socket */
|
||||
} cdsa_conn_ref_t;
|
||||
|
||||
extern OSStatus _httpReadCDSA(SSLConnectionRef connection, void *data,
|
||||
size_t *dataLength);
|
||||
extern OSStatus _httpWriteCDSA(SSLConnectionRef connection, const void *data,
|
||||
|
||||
@@ -595,14 +595,8 @@ httpEncode64_2(char *out, /* I - String to write to */
|
||||
|
||||
if (outptr < outend)
|
||||
*outptr ++ = base64[(in[0] & 255) >> 2];
|
||||
|
||||
if (outptr < outend)
|
||||
{
|
||||
if (inlen > 1)
|
||||
*outptr ++ = base64[(((in[0] & 255) << 4) | ((in[1] & 255) >> 4)) & 63];
|
||||
else
|
||||
*outptr ++ = base64[((in[0] & 255) << 4) & 63];
|
||||
}
|
||||
*outptr ++ = base64[(((in[0] & 255) << 4) | ((in[1] & 255) >> 4)) & 63];
|
||||
|
||||
in ++;
|
||||
inlen --;
|
||||
@@ -616,12 +610,7 @@ httpEncode64_2(char *out, /* I - String to write to */
|
||||
}
|
||||
|
||||
if (outptr < outend)
|
||||
{
|
||||
if (inlen > 1)
|
||||
*outptr ++ = base64[(((in[0] & 255) << 2) | ((in[1] & 255) >> 6)) & 63];
|
||||
else
|
||||
*outptr ++ = base64[((in[0] & 255) << 2) & 63];
|
||||
}
|
||||
*outptr ++ = base64[(((in[0] & 255) << 2) | ((in[1] & 255) >> 6)) & 63];
|
||||
|
||||
in ++;
|
||||
inlen --;
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* _httpBIOMethods() - Get the OpenSSL BIO methods for HTTP connections.
|
||||
* httpBlocking() - Set blocking/non-blocking behavior on a connection.
|
||||
* httpCheck() - Check to see if there is a pending response from
|
||||
* the server.
|
||||
@@ -61,8 +60,7 @@
|
||||
* httpPut() - Send a PUT request to the server.
|
||||
* httpRead() - Read data from a HTTP connection.
|
||||
* httpRead2() - Read data from a HTTP connection.
|
||||
* _httpReadCDSA() - Read function for the CDSA library.
|
||||
* _httpReadGNUTLS() - Read function for the GNU TLS library.
|
||||
* _httpReadCDSA() - Read function for CDSA decryption code.
|
||||
* httpReconnect() - Reconnect to a HTTP server...
|
||||
* httpSetCookie() - Set the cookie value(s)...
|
||||
* httpSetExpect() - Set the Expect: header in a request.
|
||||
@@ -73,14 +71,7 @@
|
||||
* httpWait() - Wait for data available on a connection.
|
||||
* httpWrite() - Write data to a HTTP connection.
|
||||
* httpWrite2() - Write data to a HTTP connection.
|
||||
* _httpWriteCDSA() - Write function for the CDSA library.
|
||||
* _httpWriteGNUTLS() - Write function for the GNU TLS library.
|
||||
* http_bio_ctrl() - Control the HTTP connection.
|
||||
* http_bio_free() - Free OpenSSL data.
|
||||
* http_bio_new() - Initialize an OpenSSL BIO structure.
|
||||
* http_bio_puts() - Send a string for OpenSSL.
|
||||
* http_bio_read() - Read data for OpenSSL.
|
||||
* http_bio_write() - Write data for OpenSSL.
|
||||
* _httpWriteCDSA() - Write function for CDSA encryption code.
|
||||
* http_field() - Return the field index for a field name.
|
||||
* http_read_ssl() - Read from a SSL/TLS connection.
|
||||
* http_send() - Send a request with all fields and the trailing
|
||||
@@ -127,7 +118,7 @@
|
||||
static http_field_t http_field(const char *name);
|
||||
static int http_send(http_t *http, http_state_t request,
|
||||
const char *uri);
|
||||
static int http_wait(http_t *http, int msec, int usessl);
|
||||
static int http_wait(http_t *http, int msec);
|
||||
static int http_write(http_t *http, const char *buffer,
|
||||
int length);
|
||||
static int http_write_chunk(http_t *http, const char *buffer,
|
||||
@@ -177,45 +168,6 @@ static const char * const http_fields[] =
|
||||
};
|
||||
|
||||
|
||||
#if defined(HAVE_SSL) && defined(HAVE_LIBSSL)
|
||||
/*
|
||||
* BIO methods for OpenSSL...
|
||||
*/
|
||||
|
||||
static int http_bio_write(BIO *h, const char *buf, int num);
|
||||
static int http_bio_read(BIO *h, char *buf, int size);
|
||||
static int http_bio_puts(BIO *h, const char *str);
|
||||
static long http_bio_ctrl(BIO *h, int cmd, long arg1, void *arg2);
|
||||
static int http_bio_new(BIO *h);
|
||||
static int http_bio_free(BIO *data);
|
||||
|
||||
static BIO_METHOD http_bio_methods =
|
||||
{
|
||||
BIO_TYPE_SOCKET,
|
||||
"http",
|
||||
http_bio_write,
|
||||
http_bio_read,
|
||||
http_bio_puts,
|
||||
NULL, /* http_bio_gets, */
|
||||
http_bio_ctrl,
|
||||
http_bio_new,
|
||||
http_bio_free,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* '_httpBIOMethods()' - Get the OpenSSL BIO methods for HTTP connections.
|
||||
*/
|
||||
|
||||
BIO_METHOD * /* O - BIO methods for OpenSSL */
|
||||
_httpBIOMethods(void)
|
||||
{
|
||||
return (&http_bio_methods);
|
||||
}
|
||||
#endif /* HAVE_SSL && HAVE_LIBSSL */
|
||||
|
||||
|
||||
/*
|
||||
* 'httpBlocking()' - Set blocking/non-blocking behavior on a connection.
|
||||
*/
|
||||
@@ -917,7 +869,7 @@ httpGets(char *line, /* I - Line to read into */
|
||||
* No newline; see if there is more data to be read...
|
||||
*/
|
||||
|
||||
if (!http->blocking && !http_wait(http, 10000, 1))
|
||||
if (!http->blocking && !http_wait(http, 10000))
|
||||
{
|
||||
DEBUG_puts("httpGets: Timed out!");
|
||||
http->error = ETIMEDOUT;
|
||||
@@ -1439,7 +1391,7 @@ httpRead2(http_t *http, /* I - HTTP connection */
|
||||
|
||||
#if defined(HAVE_SSL) && defined(HAVE_CDSASSL)
|
||||
/*
|
||||
* '_httpReadCDSA()' - Read function for the CDSA library.
|
||||
* '_httpReadCDSA()' - Read function for CDSA decryption code.
|
||||
*/
|
||||
|
||||
OSStatus /* O - -1 on error, 0 on success */
|
||||
@@ -1448,36 +1400,19 @@ _httpReadCDSA(
|
||||
void *data, /* I - Data buffer */
|
||||
size_t *dataLength) /* IO - Number of bytes */
|
||||
{
|
||||
OSStatus result; /* Return value */
|
||||
ssize_t bytes; /* Number of bytes read */
|
||||
http_t *http; /* HTTP connection */
|
||||
OSStatus result; /* Return value */
|
||||
ssize_t bytes; /* Number of bytes read */
|
||||
cdsa_conn_ref_t u; /* Connection reference union */
|
||||
|
||||
|
||||
http = (http_t *)connection;
|
||||
|
||||
if (!http->blocking)
|
||||
{
|
||||
/*
|
||||
* Make sure we have data before we read...
|
||||
*/
|
||||
|
||||
if (!http_wait(http, 10000, 0))
|
||||
{
|
||||
http->error = ETIMEDOUT;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
u.connection = connection;
|
||||
|
||||
do
|
||||
{
|
||||
bytes = recv(http->fd, data, *dataLength, 0);
|
||||
}
|
||||
bytes = recv(u.sock, data, *dataLength, 0);
|
||||
while (bytes == -1 && errno == EINTR);
|
||||
|
||||
if (bytes == *dataLength)
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else if (bytes > 0)
|
||||
{
|
||||
*dataLength = bytes;
|
||||
@@ -1495,45 +1430,11 @@ _httpReadCDSA(
|
||||
result = errSSLClosedAbort;
|
||||
}
|
||||
|
||||
return (result);
|
||||
return result;
|
||||
}
|
||||
#endif /* HAVE_SSL && HAVE_CDSASSL */
|
||||
|
||||
|
||||
#if defined(HAVE_SSL) && defined(HAVE_GNUTLS)
|
||||
/*
|
||||
* '_httpReadGNUTLS()' - Read function for the GNU TLS library.
|
||||
*/
|
||||
|
||||
ssize_t /* O - Number of bytes read or -1 on error */
|
||||
_httpReadGNUTLS(
|
||||
gnutls_transport_ptr ptr, /* I - HTTP connection */
|
||||
void *data, /* I - Buffer */
|
||||
size_t length) /* I - Number of bytes to read */
|
||||
{
|
||||
http_t *http; /* HTTP connection */
|
||||
|
||||
|
||||
http = (http_t *)ptr;
|
||||
|
||||
if (!http->blocking)
|
||||
{
|
||||
/*
|
||||
* Make sure we have data before we read...
|
||||
*/
|
||||
|
||||
if (!http_wait(http, 10000, 0))
|
||||
{
|
||||
http->error = ETIMEDOUT;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
return (recv(http->fd, data, length, 0));
|
||||
}
|
||||
#endif /* HAVE_SSL && HAVE_GNUTLS */
|
||||
|
||||
|
||||
/*
|
||||
* 'httpReconnect()' - Reconnect to a HTTP server.
|
||||
*/
|
||||
@@ -1929,7 +1830,7 @@ httpWait(http_t *http, /* I - HTTP connection */
|
||||
* If not, check the SSL/TLS buffers and do a select() on the connection...
|
||||
*/
|
||||
|
||||
return (http_wait(http, msec, 1));
|
||||
return (http_wait(http, msec));
|
||||
}
|
||||
|
||||
|
||||
@@ -2076,7 +1977,7 @@ httpWrite2(http_t *http, /* I - HTTP connection */
|
||||
|
||||
#if defined(HAVE_SSL) && defined(HAVE_CDSASSL)
|
||||
/*
|
||||
* '_httpWriteCDSA()' - Write function for the CDSA library.
|
||||
* '_httpWriteCDSA()' - Write function for CDSA encryption code.
|
||||
*/
|
||||
|
||||
OSStatus /* O - -1 on error, 0 on success */
|
||||
@@ -2085,23 +1986,19 @@ _httpWriteCDSA(
|
||||
const void *data, /* I - Data buffer */
|
||||
size_t *dataLength) /* IO - Number of bytes */
|
||||
{
|
||||
OSStatus result; /* Return value */
|
||||
ssize_t bytes; /* Number of bytes read */
|
||||
http_t *http; /* HTTP connection */
|
||||
OSStatus result; /* Return value */
|
||||
ssize_t bytes; /* Number of bytes read */
|
||||
cdsa_conn_ref_t u; /* Connection reference union */
|
||||
|
||||
|
||||
http = (http_t *)connection;
|
||||
u.connection = connection;
|
||||
|
||||
do
|
||||
{
|
||||
bytes = write(http->fd, data, *dataLength);
|
||||
}
|
||||
bytes = write(u.sock, data, *dataLength);
|
||||
while (bytes == -1 && errno == EINTR);
|
||||
|
||||
if (bytes == *dataLength)
|
||||
{
|
||||
result = 0;
|
||||
}
|
||||
else if (bytes >= 0)
|
||||
{
|
||||
*dataLength = bytes;
|
||||
@@ -2117,164 +2014,11 @@ _httpWriteCDSA(
|
||||
result = errSSLClosedAbort;
|
||||
}
|
||||
|
||||
return (result);
|
||||
return result;
|
||||
}
|
||||
#endif /* HAVE_SSL && HAVE_CDSASSL */
|
||||
|
||||
|
||||
#if defined(HAVE_SSL) && defined(HAVE_GNUTLS)
|
||||
/*
|
||||
* '_httpWriteGNUTLS()' - Write function for the GNU TLS library.
|
||||
*/
|
||||
|
||||
ssize_t /* O - Number of bytes written or -1 on error */
|
||||
_httpWriteGNUTLS(
|
||||
gnutls_transport_ptr ptr, /* I - HTTP connection */
|
||||
const void *data, /* I - Data buffer */
|
||||
size_t length) /* I - Number of bytes to write */
|
||||
{
|
||||
return (send(((http_t *)ptr)->fd, data, length, 0));
|
||||
}
|
||||
#endif /* HAVE_SSL && HAVE_GNUTLS */
|
||||
|
||||
|
||||
#if defined(HAVE_SSL) && defined(HAVE_LIBSSL)
|
||||
/*
|
||||
* 'http_bio_ctrl()' - Control the HTTP connection.
|
||||
*/
|
||||
|
||||
static long /* O - Result/data */
|
||||
http_bio_ctrl(BIO *h, /* I - BIO data */
|
||||
int cmd, /* I - Control command */
|
||||
long arg1, /* I - First argument */
|
||||
void *arg2) /* I - Second argument */
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
default :
|
||||
return (0);
|
||||
|
||||
case BIO_CTRL_RESET :
|
||||
h->ptr = NULL;
|
||||
return (0);
|
||||
|
||||
case BIO_C_SET_FILE_PTR :
|
||||
h->ptr = arg2;
|
||||
h->init = 1;
|
||||
return (1);
|
||||
|
||||
case BIO_C_GET_FILE_PTR :
|
||||
if (arg2)
|
||||
{
|
||||
*((void **)arg2) = h->ptr;
|
||||
return (1);
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
|
||||
case BIO_CTRL_DUP :
|
||||
case BIO_CTRL_FLUSH :
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'http_bio_free()' - Free OpenSSL data.
|
||||
*/
|
||||
|
||||
static int /* O - 1 on success, 0 on failure */
|
||||
http_bio_free(BIO *h) /* I - BIO data */
|
||||
{
|
||||
if (!h)
|
||||
return (0);
|
||||
|
||||
if (h->shutdown)
|
||||
{
|
||||
h->init = 0;
|
||||
h->flags = 0;
|
||||
}
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'http_bio_new()' - Initialize an OpenSSL BIO structure.
|
||||
*/
|
||||
|
||||
static int /* O - 1 on success, 0 on failure */
|
||||
http_bio_new(BIO *h) /* I - BIO data */
|
||||
{
|
||||
if (!h)
|
||||
return (0);
|
||||
|
||||
h->init = 0;
|
||||
h->num = 0;
|
||||
h->ptr = NULL;
|
||||
h->flags = 0;
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'http_bio_puts()' - Send a string for OpenSSL.
|
||||
*/
|
||||
|
||||
static int /* O - Bytes written */
|
||||
http_bio_puts(BIO *h, /* I - BIO data */
|
||||
const char *str) /* I - String to write */
|
||||
{
|
||||
return (send(((http_t *)h->ptr)->fd, str, strlen(str), 0));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'http_bio_read()' - Read data for OpenSSL.
|
||||
*/
|
||||
|
||||
static int /* O - Bytes read */
|
||||
http_bio_read(BIO *h, /* I - BIO data */
|
||||
char *buf, /* I - Buffer */
|
||||
int size) /* I - Number of bytes to read */
|
||||
{
|
||||
http_t *http; /* HTTP connection */
|
||||
|
||||
|
||||
http = (http_t *)h->ptr;
|
||||
|
||||
if (!http->blocking)
|
||||
{
|
||||
/*
|
||||
* Make sure we have data before we read...
|
||||
*/
|
||||
|
||||
if (!http_wait(http, 10000, 0))
|
||||
{
|
||||
http->error = ETIMEDOUT;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
return (recv(http->fd, buf, size, 0));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'http_bio_write()' - Write data for OpenSSL.
|
||||
*/
|
||||
|
||||
static int /* O - Bytes written */
|
||||
http_bio_write(BIO *h, /* I - BIO data */
|
||||
const char *buf, /* I - Buffer to write */
|
||||
int num) /* I - Number of bytes to write */
|
||||
{
|
||||
return (send(((http_t *)h->ptr)->fd, buf, num, 0));
|
||||
}
|
||||
#endif /* HAVE_SSL && HAVE_LIBSSL */
|
||||
|
||||
|
||||
/*
|
||||
* 'http_field()' - Return the field index for a field name.
|
||||
*/
|
||||
@@ -2503,7 +2247,6 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */
|
||||
# ifdef HAVE_LIBSSL
|
||||
SSL_CTX *context; /* Context for encryption */
|
||||
SSL *conn; /* Connection for encryption */
|
||||
BIO *bio; /* BIO data */
|
||||
# elif defined(HAVE_GNUTLS)
|
||||
http_tls_t *conn; /* TLS session object */
|
||||
gnutls_certificate_client_credentials *credentials;
|
||||
@@ -2511,6 +2254,7 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */
|
||||
# elif defined(HAVE_CDSASSL)
|
||||
OSStatus error; /* Error code */
|
||||
http_tls_t *conn; /* CDSA connection information */
|
||||
cdsa_conn_ref_t u; /* Connection reference union */
|
||||
# endif /* HAVE_LIBSSL */
|
||||
|
||||
|
||||
@@ -2521,12 +2265,9 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */
|
||||
|
||||
SSL_CTX_set_options(context, SSL_OP_NO_SSLv2); /* Only use SSLv3 or TLS */
|
||||
|
||||
bio = BIO_new(_httpBIOMethods());
|
||||
BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)http);
|
||||
|
||||
conn = SSL_new(context);
|
||||
SSL_set_bio(conn, bio, bio);
|
||||
|
||||
SSL_set_fd(conn, http->fd);
|
||||
if (SSL_connect(conn) != 1)
|
||||
{
|
||||
# ifdef DEBUG
|
||||
@@ -2575,9 +2316,8 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */
|
||||
gnutls_init(&(conn->session), GNUTLS_CLIENT);
|
||||
gnutls_set_default_priority(conn->session);
|
||||
gnutls_credentials_set(conn->session, GNUTLS_CRD_CERTIFICATE, *credentials);
|
||||
gnutls_transport_set_ptr(conn->session, (gnutls_transport_ptr)http);
|
||||
gnutls_transport_set_pull_function(conn->session, _httpReadGNUTLS);
|
||||
gnutls_transport_set_push_function(conn->session, _httpWriteGNUTLS);
|
||||
gnutls_transport_set_ptr(conn->session,
|
||||
(gnutls_transport_ptr)((long)http->fd));
|
||||
|
||||
if ((gnutls_handshake(conn->session)) != GNUTLS_E_SUCCESS)
|
||||
{
|
||||
@@ -2608,7 +2348,9 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */
|
||||
* Use a union to resolve warnings about int/pointer size mismatches...
|
||||
*/
|
||||
|
||||
error = SSLSetConnection(conn->session, http);
|
||||
u.connection = NULL;
|
||||
u.sock = http->fd;
|
||||
error = SSLSetConnection(conn->session, u.connection);
|
||||
|
||||
if (!error)
|
||||
error = SSLSetIOFuncs(conn->session, _httpReadCDSA, _httpWriteCDSA);
|
||||
@@ -2802,8 +2544,7 @@ http_upgrade(http_t *http) /* I - HTTP connection */
|
||||
|
||||
static int /* O - 1 if data is available, 0 otherwise */
|
||||
http_wait(http_t *http, /* I - HTTP connection */
|
||||
int msec, /* I - Milliseconds to wait */
|
||||
int usessl) /* I - Use SSL context? */
|
||||
int msec) /* I - Milliseconds to wait */
|
||||
{
|
||||
#ifndef WIN32
|
||||
struct rlimit limit; /* Runtime limit */
|
||||
@@ -2823,7 +2564,7 @@ http_wait(http_t *http, /* I - HTTP connection */
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SSL
|
||||
if (http->tls && usessl)
|
||||
if (http->tls)
|
||||
{
|
||||
# ifdef HAVE_LIBSSL
|
||||
if (SSL_pending((SSL *)(http->tls)))
|
||||
|
||||
@@ -995,7 +995,6 @@ appleLangDefault(void)
|
||||
/* List of localization data */
|
||||
CFStringRef languageName; /* Current name */
|
||||
CFStringRef localeName; /* Canonical from of name */
|
||||
char *lang; /* LANG environment variable */
|
||||
_cups_globals_t *cg = _cupsGlobals();
|
||||
/* Pointer to library globals */
|
||||
|
||||
@@ -1006,43 +1005,38 @@ appleLangDefault(void)
|
||||
|
||||
if (!cg->language[0])
|
||||
{
|
||||
if ((lang = getenv("LANG")))
|
||||
strlcpy(cg->language, lang, sizeof(cg->language));
|
||||
else
|
||||
localizationList =
|
||||
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
|
||||
kCFPreferencesCurrentApplication);
|
||||
|
||||
if (localizationList != NULL)
|
||||
{
|
||||
localizationList =
|
||||
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
|
||||
kCFPreferencesCurrentApplication);
|
||||
|
||||
if (localizationList != NULL)
|
||||
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
|
||||
CFArrayGetCount(localizationList) > 0)
|
||||
{
|
||||
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
|
||||
CFArrayGetCount(localizationList) > 0)
|
||||
{
|
||||
languageName = CFArrayGetValueAtIndex(localizationList, 0);
|
||||
languageName = CFArrayGetValueAtIndex(localizationList, 0);
|
||||
|
||||
if (languageName != NULL &&
|
||||
CFGetTypeID(languageName) == CFStringGetTypeID())
|
||||
{
|
||||
localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(
|
||||
kCFAllocatorDefault, languageName);
|
||||
if (languageName != NULL &&
|
||||
CFGetTypeID(languageName) == CFStringGetTypeID())
|
||||
{
|
||||
localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(
|
||||
kCFAllocatorDefault, languageName);
|
||||
|
||||
if (localeName != NULL)
|
||||
{
|
||||
CFStringGetCString(localeName, cg->language, sizeof(cg->language),
|
||||
kCFStringEncodingASCII);
|
||||
CFRelease(localeName);
|
||||
if (localeName != NULL)
|
||||
{
|
||||
CFStringGetCString(localeName, cg->language, sizeof(cg->language),
|
||||
kCFStringEncodingASCII);
|
||||
CFRelease(localeName);
|
||||
|
||||
if (!strcmp(cg->language, "en"))
|
||||
strlcpy(cg->language, "en_US.UTF-8", sizeof(cg->language));
|
||||
else if (strchr(cg->language, '.') == NULL)
|
||||
strlcat(cg->language, ".UTF-8", sizeof(cg->language));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(localizationList);
|
||||
if (!strcmp(cg->language, "en"))
|
||||
strlcpy(cg->language, "en_US.UTF-8", sizeof(cg->language));
|
||||
else if (strchr(cg->language, '.') == NULL)
|
||||
strlcat(cg->language, ".UTF-8", sizeof(cg->language));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(localizationList);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1150,66 +1144,59 @@ appleLangDefault(void)
|
||||
char buff[256]; /* Temporary buffer */
|
||||
_cups_globals_t *cg = _cupsGlobals();
|
||||
/* Pointer to library globals */
|
||||
char *lang; /* LANG environment variable */
|
||||
|
||||
|
||||
/*
|
||||
* Only do the lookup and translation the first time.
|
||||
*/
|
||||
|
||||
if (!cg->language[0])
|
||||
if (cg->language == NULL)
|
||||
{
|
||||
if ((lang = getenv("LANG")))
|
||||
strlcpy(cg->language, lang, sizeof(cg->language));
|
||||
else
|
||||
localizationList =
|
||||
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
|
||||
kCFPreferencesCurrentApplication);
|
||||
|
||||
if (localizationList != NULL)
|
||||
{
|
||||
localizationList =
|
||||
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
|
||||
kCFPreferencesCurrentApplication);
|
||||
|
||||
if (localizationList != NULL)
|
||||
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
|
||||
CFArrayGetCount(localizationList) > 0)
|
||||
{
|
||||
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
|
||||
CFArrayGetCount(localizationList) > 0)
|
||||
localizationName = CFArrayGetValueAtIndex(localizationList, 0);
|
||||
|
||||
if (localizationName != NULL &&
|
||||
CFGetTypeID(localizationName) == CFStringGetTypeID())
|
||||
{
|
||||
localizationName = CFArrayGetValueAtIndex(localizationList, 0);
|
||||
CFIndex length = CFStringGetLength(localizationName);
|
||||
|
||||
if (localizationName != NULL &&
|
||||
CFGetTypeID(localizationName) == CFStringGetTypeID())
|
||||
if (length <= sizeof(buff) &&
|
||||
CFStringGetCString(localizationName, buff, sizeof(buff),
|
||||
kCFStringEncodingASCII))
|
||||
{
|
||||
CFIndex length = CFStringGetLength(localizationName);
|
||||
buff[sizeof(buff) - 1] = '\0';
|
||||
|
||||
if (length <= sizeof(buff) &&
|
||||
CFStringGetCString(localizationName, buff, sizeof(buff),
|
||||
kCFStringEncodingASCII))
|
||||
for (i = 0;
|
||||
i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
|
||||
i++)
|
||||
{
|
||||
buff[sizeof(buff) - 1] = '\0';
|
||||
|
||||
for (i = 0;
|
||||
i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
|
||||
i++)
|
||||
if (!strcasecmp(buff, apple_name_locale[i].name))
|
||||
{
|
||||
if (!strcasecmp(buff, apple_name_locale[i].name))
|
||||
{
|
||||
strlcpy(cg->language, apple_name_locale[i].locale,
|
||||
sizeof(cg->language));
|
||||
break;
|
||||
}
|
||||
cg->language = apple_name_locale[i].locale;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(localizationList);
|
||||
}
|
||||
|
||||
CFRelease(localizationList);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we didn't find the language, default to en_US...
|
||||
*/
|
||||
|
||||
if (!cg->language[0])
|
||||
strlcpy(cg->language, apple_name_locale[0].locale, sizeof(cg->language));
|
||||
if (cg->language == NULL)
|
||||
cg->language = apple_name_locale[0].locale;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -28,7 +28,6 @@ _cups_freeifaddrs
|
||||
_cups_strcpy
|
||||
_cups_strlcat
|
||||
_cups_strlcpy
|
||||
_httpBIOMethods
|
||||
_ippAddAttr
|
||||
_ippFreeAttr
|
||||
_ppdGetEncoding
|
||||
|
||||
@@ -295,38 +295,6 @@ cupsCharsetToUTF8(
|
||||
return (strlen((char *)dest));
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle ISO-8859-1 to UTF-8 directly...
|
||||
*/
|
||||
|
||||
if (encoding == CUPS_ISO8859_1)
|
||||
{
|
||||
int ch; /* Character from string */
|
||||
cups_utf8_t *destptr, /* Pointer into UTF-8 buffer */
|
||||
*destend; /* End of UTF-8 buffer */
|
||||
|
||||
|
||||
destptr = dest;
|
||||
destend = dest + maxout - 2;
|
||||
|
||||
while (*src && destptr < destend)
|
||||
{
|
||||
ch = *src++ & 255;
|
||||
|
||||
if (ch & 128)
|
||||
{
|
||||
*destptr++ = 0xc0 | (ch >> 6);
|
||||
*destptr++ = 0x80 | (ch & 0x3f);
|
||||
}
|
||||
else
|
||||
*destptr++ = ch;
|
||||
}
|
||||
|
||||
*destptr = '\0';
|
||||
|
||||
return (destptr - dest);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert input legacy charset to UTF-8...
|
||||
*/
|
||||
@@ -395,45 +363,6 @@ cupsUTF8ToCharset(
|
||||
return (strlen(dest));
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle UTF-8 to ISO-8859-1 directly...
|
||||
*/
|
||||
|
||||
if (encoding == CUPS_ISO8859_1)
|
||||
{
|
||||
int ch; /* Character from string */
|
||||
char *destptr, /* Pointer into ISO-8859-1 buffer */
|
||||
*destend; /* End of ISO-8859-1 buffer */
|
||||
|
||||
|
||||
destptr = dest;
|
||||
destend = dest + maxout - 1;
|
||||
|
||||
while (*src && destptr < destend)
|
||||
{
|
||||
ch = *src++;
|
||||
|
||||
if ((ch & 0xe0) == 0xc0)
|
||||
{
|
||||
ch = ((ch & 0x1f) << 6) | (*src++ & 0x3f);
|
||||
|
||||
if (ch < 256)
|
||||
*destptr++ = ch;
|
||||
else
|
||||
*destptr++ = '?';
|
||||
}
|
||||
else if ((ch & 0xf0) == 0xe0 ||
|
||||
(ch & 0xf8) == 0xf0)
|
||||
*destptr++ = '?';
|
||||
else if (!(ch & 0x80))
|
||||
*destptr++ = ch;
|
||||
}
|
||||
|
||||
*destptr = '\0';
|
||||
|
||||
return (destptr - dest);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert input UTF-8 to legacy charset...
|
||||
*/
|
||||
|
||||
@@ -23,5 +23,3 @@ Name[et]=Trükkimise haldur
|
||||
Comment[et]=CUPS-i veebiliides
|
||||
Name[pl]=Zarządzanie drukowaniem
|
||||
Comment[pl]=Interfejs WWW CUPS
|
||||
Name[it]=Gestione stampa
|
||||
Comment[it]=Interfaccia web di CUPS
|
||||
@@ -72,7 +72,7 @@ CUPS 1.1 or higher.</p>
|
||||
<h2 class='title'>Licensing</h2>
|
||||
|
||||
<p>The CUPS raster API is provided under the terms of the GNU
|
||||
Library General Public License, with exceptions for MacOS X-based
|
||||
General Public License, with exceptions for MacOS X-based
|
||||
programs. Please see the CUPS license agreement for more
|
||||
information.</p>
|
||||
<h2 class='title'>Contents</h2>
|
||||
@@ -85,31 +85,10 @@ information.</p>
|
||||
<!-- NEW PAGE -->
|
||||
<h2 class='title'><a name='ENUMERATIONS'>Enumerations</a></h2>
|
||||
<ul>
|
||||
<li><a href='#cups_adv_e'><tt>cups_adv_e</tt></a> </li>
|
||||
<li><a href='#cups_bool_e'><tt>cups_bool_e</tt></a> </li>
|
||||
<li><a href='#cups_cspace_e'><tt>cups_cspace_e</tt></a> </li>
|
||||
<li><a href='#cups_cut_e'><tt>cups_cut_e</tt></a> </li>
|
||||
<li><a href='#cups_edge_e'><tt>cups_edge_e</tt></a> </li>
|
||||
<li><a href='#cups_jog_e'><tt>cups_jog_e</tt></a> </li>
|
||||
<li><a href='#cups_mode_e'><tt>cups_mode_e</tt></a> </li>
|
||||
<li><a href='#cups_order_e'><tt>cups_order_e</tt></a> </li>
|
||||
<li><a href='#cups_orient_e'><tt>cups_orient_e</tt></a> </li>
|
||||
</ul>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_adv_e'>cups_adv_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p></p>
|
||||
<h4>Values</h4>
|
||||
<div class='table'><table align='center' border='1' width='80%'>
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>CUPS_ADVANCE_FILE</tt> </td><td>Advance the roll after this file</td></tr>
|
||||
<tr><td><tt>CUPS_ADVANCE_JOB</tt> </td><td>Advance the roll after this job</td></tr>
|
||||
<tr><td><tt>CUPS_ADVANCE_NONE</tt> </td><td>Never advance the roll</td></tr>
|
||||
<tr><td><tt>CUPS_ADVANCE_PAGE</tt> </td><td>Advance the roll after this page</td></tr>
|
||||
<tr><td><tt>CUPS_ADVANCE_SET</tt> </td><td>Advance the roll after this set</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_bool_e'>cups_bool_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p>Types...</p>
|
||||
@@ -121,89 +100,6 @@ information.</p>
|
||||
<tr><td><tt>CUPS_TRUE</tt> </td><td>Logical true</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_cspace_e'>cups_cspace_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p></p>
|
||||
<h4>Values</h4>
|
||||
<div class='table'><table align='center' border='1' width='80%'>
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>CUPS_CSPACE_CIELab</tt> <span class='info'> CUPS 1.1.19 </span></td><td>CIE Lab </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_CIEXYZ</tt> <span class='info'> CUPS 1.1.19 </span></td><td>CIE XYZ </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_CMY</tt> </td><td>Cyan, magenta, yellow</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_CMYK</tt> </td><td>Cyan, magenta, yellow, black</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_GMCK</tt> </td><td>Gold, magenta, yellow, black</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_GMCS</tt> </td><td>Gold, magenta, yellow, silver</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_GOLD</tt> </td><td>Gold foil</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC1</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 1 color </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC2</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 2 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC3</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 3 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC4</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 4 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC5</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 5 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC6</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 6 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC7</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 7 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC8</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 8 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICC9</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 9 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICCA</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 10 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICCB</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 11 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICCC</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 12 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICCD</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 13 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICCE</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 14 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_ICCF</tt> <span class='info'> CUPS 1.1.19 </span></td><td>ICC-based, 15 colors </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_K</tt> </td><td>Black</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_KCMY</tt> </td><td>Black, cyan, magenta, yellow</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_KCMYcm</tt> </td><td>Black, cyan, magenta, yellow, *
|
||||
light-cyan, light-magenta</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_RGB</tt> </td><td>Red, green, blue</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_RGBA</tt> </td><td>Red, green, blue, alpha</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_RGBW</tt> <span class='info'> CUPS 1.2 </span></td><td>Red, green, blue, white </td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_SILVER</tt> </td><td>Silver foil</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_W</tt> </td><td>Luminance</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_WHITE</tt> </td><td>White ink (as black)</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_YMC</tt> </td><td>Yellow, magenta, cyan</td></tr>
|
||||
<tr><td><tt>CUPS_CSPACE_YMCK</tt> </td><td>Yellow, magenta, cyan, black</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_cut_e'>cups_cut_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p></p>
|
||||
<h4>Values</h4>
|
||||
<div class='table'><table align='center' border='1' width='80%'>
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>CUPS_CUT_FILE</tt> </td><td>Cut the roll after this file</td></tr>
|
||||
<tr><td><tt>CUPS_CUT_JOB</tt> </td><td>Cut the roll after this job</td></tr>
|
||||
<tr><td><tt>CUPS_CUT_NONE</tt> </td><td>Never cut the roll</td></tr>
|
||||
<tr><td><tt>CUPS_CUT_PAGE</tt> </td><td>Cut the roll after this page</td></tr>
|
||||
<tr><td><tt>CUPS_CUT_SET</tt> </td><td>Cut the roll after this set</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_edge_e'>cups_edge_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p></p>
|
||||
<h4>Values</h4>
|
||||
<div class='table'><table align='center' border='1' width='80%'>
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>CUPS_EDGE_BOTTOM</tt> </td><td>Leading edge is the bottom of the page</td></tr>
|
||||
<tr><td><tt>CUPS_EDGE_LEFT</tt> </td><td>Leading edge is the left of the page</td></tr>
|
||||
<tr><td><tt>CUPS_EDGE_RIGHT</tt> </td><td>Leading edge is the right of the page</td></tr>
|
||||
<tr><td><tt>CUPS_EDGE_TOP</tt> </td><td>Leading edge is the top of the page</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_jog_e'>cups_jog_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p></p>
|
||||
<h4>Values</h4>
|
||||
<div class='table'><table align='center' border='1' width='80%'>
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>CUPS_JOG_FILE</tt> </td><td>Move pages after this file</td></tr>
|
||||
<tr><td><tt>CUPS_JOG_JOB</tt> </td><td>Move pages after this job</td></tr>
|
||||
<tr><td><tt>CUPS_JOG_NONE</tt> </td><td>Never move pages</td></tr>
|
||||
<tr><td><tt>CUPS_JOG_SET</tt> </td><td>Move pages after this set</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_mode_e'>cups_mode_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p>Raster modes</p>
|
||||
@@ -215,31 +111,6 @@ light-cyan, light-magenta</td></tr>
|
||||
<tr><td><tt>CUPS_RASTER_WRITE</tt> </td><td>Open stream for writing</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_order_e'>cups_order_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p></p>
|
||||
<h4>Values</h4>
|
||||
<div class='table'><table align='center' border='1' width='80%'>
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>CUPS_ORDER_BANDED</tt> </td><td>CCC MMM YYY KKK ...</td></tr>
|
||||
<tr><td><tt>CUPS_ORDER_CHUNKED</tt> </td><td>CMYK CMYK CMYK ...</td></tr>
|
||||
<tr><td><tt>CUPS_ORDER_PLANAR</tt> </td><td>CCC ... MMM ... YYY ... KKK ...</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_orient_e'>cups_orient_e</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p></p>
|
||||
<h4>Values</h4>
|
||||
<div class='table'><table align='center' border='1' width='80%'>
|
||||
<thead><tr><th>Name</th><th>Description</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td><tt>CUPS_ORIENT_0</tt> </td><td>Don't rotate the page</td></tr>
|
||||
<tr><td><tt>CUPS_ORIENT_180</tt> </td><td>Turn the page upside down</td></tr>
|
||||
<tr><td><tt>CUPS_ORIENT_270</tt> </td><td>Rotate the page clockwise</td></tr>
|
||||
<tr><td><tt>CUPS_ORIENT_90</tt> </td><td>Rotate the page counter-clockwise</td></tr>
|
||||
</tbody></table></div>
|
||||
<!-- NEW PAGE -->
|
||||
<h2 class='title'><a name='FUNCTIONS'>Functions</a></h2>
|
||||
<ul>
|
||||
<li><a href='#cupsRasterClose'><tt>cupsRasterClose()</tt></a> </li>
|
||||
@@ -280,12 +151,6 @@ and "options" arguments. Instead, mark the options prior to calling
|
||||
cupsRasterInterpretPPD() - this allows you to do per-page options
|
||||
without manipulating the options array.
|
||||
|
||||
The "func" argument specifies an optional callback function that is
|
||||
called prior to the computation of the final raster data. The function
|
||||
can make changes to the cups_page_header2_t data as needed to use a
|
||||
supported raster format and then returns 0 on success and -1 if the
|
||||
requested attributes cannot be supported.
|
||||
|
||||
</p>
|
||||
<h4>Syntax</h4>
|
||||
<pre>
|
||||
@@ -294,8 +159,7 @@ cupsRasterInterpretPPD(
|
||||
<a href='#cups_page_header2_t'>cups_page_header2_t</a> * h,
|
||||
ppd_file_t * ppd,
|
||||
int num_options,
|
||||
cups_option_t * options,
|
||||
<a href='#cups_interpret_cb_t'>cups_interpret_cb_t</a> func);
|
||||
cups_option_t * options);
|
||||
</pre>
|
||||
<h4>Arguments</h4>
|
||||
<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
|
||||
@@ -305,7 +169,6 @@ cupsRasterInterpretPPD(
|
||||
<tr><td><tt>ppd</tt></td><td>PPD file</td></tr>
|
||||
<tr><td><tt>num_options</tt></td><td>Number of options</td></tr>
|
||||
<tr><td><tt>options</tt></td><td>Options</td></tr>
|
||||
<tr><td><tt>func</tt></td><td>Optional page header callback</td></tr>
|
||||
</tbody></table></div>
|
||||
<h4>Returns</h4>
|
||||
<p>0 on success, -1 on failure</p>
|
||||
@@ -585,7 +448,7 @@ factor not applied) </td></tr>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_page_header_s'>cups_page_header_s</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p></p>
|
||||
<p>Version 1 Page Header</p>
|
||||
<h4>Definition</h4>
|
||||
<pre>
|
||||
struct cups_page_header_s
|
||||
@@ -678,19 +541,11 @@ struct cups_page_header_s
|
||||
<!-- NEW PAGE -->
|
||||
<h2 class='title'><a name='TYPES'>Types</a></h2>
|
||||
<ul>
|
||||
<li><a href='#cups_interpret_cb_t'><tt>cups_interpret_cb_t</tt></a> </li>
|
||||
<li><a href='#cups_page_header2_t'><tt>cups_page_header2_t</tt></a> <span class='info'> CUPS 1.2 </span></li>
|
||||
<li><a href='#cups_page_header_t'><tt>cups_page_header_t</tt></a> </li>
|
||||
<li><a href='#cups_raster_t'><tt>cups_raster_t</tt></a> </li>
|
||||
</ul>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_interpret_cb_t'>cups_interpret_cb_t</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p>Prototypes...</p>
|
||||
<h4>Definition</h4>
|
||||
<pre>
|
||||
typedef int (*cups_interpret_cb_t)(<a href='#cups_page_header2_t'>cups_page_header2_t</a> *header, int preferred_bits);
|
||||
</pre>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><span class='info'> CUPS 1.2 </span><a name='cups_page_header2_t'>cups_page_header2_t</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p>Version 2 Page Header </p>
|
||||
@@ -699,6 +554,14 @@ typedef int (*cups_interpret_cb_t)(<a href='#cups_page_header2_t'>cups_page_head
|
||||
typedef struct <a href='#cups_page_header2_s'>cups_page_header2_s</a> cups_page_header2_t;
|
||||
</pre>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_page_header_t'>cups_page_header_t</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p>Version 1 Page Header</p>
|
||||
<h4>Definition</h4>
|
||||
<pre>
|
||||
typedef struct <a href='#cups_page_header_s'>cups_page_header_s</a> cups_page_header_t;
|
||||
</pre>
|
||||
<!-- NEW PAGE -->
|
||||
<h3 class='title'><a name='cups_raster_t'>cups_raster_t</a></h3>
|
||||
<h4>Description</h4>
|
||||
<p>Raster stream data</p>
|
||||
|
||||
@@ -22,12 +22,12 @@ Version 2, with exceptions for Apple operating systems and the
|
||||
OpenSSL toolkit. A copy of the exceptions and licenses follow
|
||||
this introduction.</P>
|
||||
|
||||
<P>The GNU LGPL applies to the CUPS and CUPS Imaging libraries
|
||||
located in the "cups" and "filter" subdirectories of the CUPS
|
||||
source distribution and in the "cups" include directory and
|
||||
library files in the binary distributions. The GNU GPL applies to
|
||||
the remainder of the CUPS distribution, including the "pdftops"
|
||||
filter which is based upon Xpdf.</P>
|
||||
<P>The GNU LGPL applies to the CUPS API library, located in the
|
||||
"cups" subdirectory of the CUPS source distribution and in the
|
||||
"cups" include directory and library files in the binary
|
||||
distributions. The GNU GPL applies to the remainder of the CUPS
|
||||
distribution, including the "pdftops" filter which is based upon
|
||||
Xpdf and the CUPS imaging library.</P>
|
||||
|
||||
<P>For those not familiar with the GNU GPL, the license basically
|
||||
allows you to:</P>
|
||||
@@ -42,21 +42,25 @@ allows you to:</P>
|
||||
<LI>Sell verbatim copies of the software for a media
|
||||
fee, or sell support for the software.</LI>
|
||||
|
||||
<LI>Distribute or sell printer drivers and filters that
|
||||
use CUPS so long as source code is made available under
|
||||
the GPL.</LI>
|
||||
|
||||
</UL>
|
||||
|
||||
<P>What this license <EM>does not</EM> allow you to do is make
|
||||
changes or add features to CUPS and then sell a binary
|
||||
distribution without source code. You must provide source for any
|
||||
changes or additions to the software, and all code must be
|
||||
provided under the GPL or LGPL as appropriate. The only
|
||||
new drivers, changes, or additions to the software, and all code
|
||||
must be provided under the GPL or LGPL as appropriate. The only
|
||||
exceptions to this are the portions of the CUPS software covered
|
||||
by the Apple operating system license exceptions outlined later
|
||||
in this license agreement.</P>
|
||||
|
||||
<P>The GNU LGPL relaxes the "link-to" restriction, allowing you
|
||||
to develop applications that use the CUPS and CUPS Imaging
|
||||
libraries under other licenses and/or conditions as appropriate
|
||||
for your application, driver, or filter.</P>
|
||||
to develop applications that use the CUPS API library under other
|
||||
licenses and/or conditions as appropriate for your
|
||||
application.</P>
|
||||
|
||||
|
||||
<H2 CLASS="title"><A NAME="EXCEPTIONS">License Exceptions</A></H2>
|
||||
@@ -146,7 +150,7 @@ same high-quality standards as the original.</P>
|
||||
|
||||
<P>Easy Software Products also sells rights to the CUPS source
|
||||
code under a binary distribution license for vendors that are
|
||||
unable to release source code for their additions and
|
||||
unable to release source code for their drivers, additions, and
|
||||
modifications to CUPS under the GNU GPL and LGPL. For information
|
||||
please contact us at the address shown above.</P>
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<!--
|
||||
"$Id: spec-ppd.html 6096 2006-11-14 17:06:28Z mike $"
|
||||
"$Id: spec-ppd.html 6025 2006-10-11 14:59:20Z mike $"
|
||||
|
||||
CUPS PPD extensions specification for the Common UNIX Printing System (CUPS).
|
||||
|
||||
@@ -95,14 +95,11 @@ for this printer driver.</p>
|
||||
<p>This boolean attribute notifies the RIP filters that the
|
||||
destination printer does not require the top and bottom margins
|
||||
of the <tt>ImageableArea</tt> swapped for the back page. The
|
||||
default is <tt>true</tt> when <tt>cupsFlipDuplex</tt> is <tt>true</tt> and <tt>false</tt> otherwise.</p>
|
||||
default value is <code>true</code>.</p>
|
||||
|
||||
<p>Example:</p>
|
||||
|
||||
<pre class='command'>
|
||||
<em>*% Flip the back side images</em>
|
||||
*cupsFlipDuplex: true
|
||||
|
||||
<em>*% Don't swap the top and bottom margins for the back side</em>
|
||||
*APDuplexRequiresFlippedMargin: false
|
||||
</pre>
|
||||
|
||||
|
Antes Largura: | Altura: | Tamanho: 667 B |
|
Antes Largura: | Altura: | Tamanho: 626 B |
|
Antes Largura: | Altura: | Tamanho: 699 B |
|
Antes Largura: | Altura: | Tamanho: 854 B |
|
Antes Largura: | Altura: | Tamanho: 682 B |
|
Antes Largura: | Altura: | Tamanho: 588 B |
|
Antes Largura: | Altura: | Tamanho: 658 B |
|
Antes Largura: | Altura: | Tamanho: 496 B |
|
Antes Largura: | Altura: | Tamanho: 346 B |
|
Antes Largura: | Altura: | Tamanho: 406 B |
|
Antes Largura: | Altura: | Tamanho: 520 B |
|
Antes Largura: | Altura: | Tamanho: 547 B |
|
Antes Largura: | Altura: | Tamanho: 778 B |
|
Antes Largura: | Altura: | Tamanho: 766 B |
|
Antes Largura: | Altura: | Tamanho: 354 B |
|
Antes Largura: | Altura: | Tamanho: 646 B |
|
Antes Largura: | Altura: | Tamanho: 558 B |
|
Antes Largura: | Altura: | Tamanho: 628 B |
|
Antes Largura: | Altura: | Tamanho: 624 B |
|
Antes Largura: | Altura: | Tamanho: 558 B |
|
Antes Largura: | Altura: | Tamanho: 558 B |
|
Antes Largura: | Altura: | Tamanho: 630 B |
|
Antes Largura: | Altura: | Tamanho: 623 B |
|
Antes Largura: | Altura: | Tamanho: 733 B |
|
Antes Largura: | Altura: | Tamanho: 826 B |
|
Antes Largura: | Altura: | Tamanho: 711 B |
|
Antes Largura: | Altura: | Tamanho: 628 B |
|
Antes Largura: | Altura: | Tamanho: 579 B |
|
Antes Largura: | Altura: | Tamanho: 613 B |
|
Antes Largura: | Altura: | Tamanho: 579 B |
|
Antes Largura: | Altura: | Tamanho: 583 B |
|
Antes Largura: | Altura: | Tamanho: 356 B |
|
Antes Largura: | Altura: | Tamanho: 697 B |
|
Antes Largura: | Altura: | Tamanho: 723 B |
|
Antes Largura: | Altura: | Tamanho: 734 B |
|
Antes Largura: | Altura: | Tamanho: 709 B |
|
Antes Largura: | Altura: | Tamanho: 714 B |
|
Antes Largura: | Altura: | Tamanho: 804 B |
|
Antes Largura: | Altura: | Tamanho: 613 B |
|
Antes Largura: | Altura: | Tamanho: 625 B |
|
Antes Largura: | Altura: | Tamanho: 564 B |
|
Antes Largura: | Altura: | Tamanho: 618 B |
|
Antes Largura: | Altura: | Tamanho: 515 B |
|
Antes Largura: | Altura: | Tamanho: 589 B |
|
Antes Largura: | Altura: | Tamanho: 490 B |
|
Antes Largura: | Altura: | Tamanho: 547 B |
|
Antes Largura: | Altura: | Tamanho: 729 B |
|
Antes Largura: | Altura: | Tamanho: 909 B |
|
Antes Largura: | Altura: | Tamanho: 697 B |
|
Antes Largura: | Altura: | Tamanho: 631 B |
|
Antes Largura: | Altura: | Tamanho: 694 B |
|
Antes Largura: | Altura: | Tamanho: 778 B |
@@ -1,138 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/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="/favicon.ico" TYPE="image/x-icon">
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="Common UNIX Printing System @CUPS_VERSION@">
|
||||
<TR CLASS="header">
|
||||
<TD VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG SRC="/images/top-left.gif" WIDTH="15" HEIGHT="80" ALT=""></TD>
|
||||
<TD VALIGN="TOP" WIDTH="55" ROWSPAN="2"><IMG SRC="/images/top-middle.gif" WIDTH="55" HEIGHT="80" ALT=""></TD>
|
||||
<TD WIDTH="100%" HEIGHT="60"><H1>Common UNIX Printing System @CUPS_VERSION@@CUPS_REVISION@</H1></TD>
|
||||
<TD ALIGN="RIGHT" VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG
|
||||
SRC="/images/top-right.gif" WIDTH="15" HEIGHT="15" ALT=""></TD>
|
||||
</TR>
|
||||
<TR CLASS="header"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
|
||||
|
||||
<A CLASS="sel" HREF="/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
|
||||
HEIGHT="4" ALIGN="TOP" BORDER="0"
|
||||
ALT=""> Principale <IMG
|
||||
SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
|
||||
BORDER="0" ALT=""></A>
|
||||
|
||||
<A CLASS="unsel" HREF="/admin/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
|
||||
HEIGHT="4" ALIGN="TOP" BORDER="0"
|
||||
ALT=""> Amministrazione <IMG
|
||||
SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
|
||||
BORDER="0" ALT=""></A>
|
||||
|
||||
<A CLASS="unsel" HREF="/classes/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
|
||||
HEIGHT="4" ALIGN="TOP" BORDER="0"
|
||||
ALT=""> Classi <IMG
|
||||
SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
|
||||
BORDER="0" ALT=""></A>
|
||||
|
||||
<A CLASS="unsel" HREF="/help/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
|
||||
HEIGHT="4" ALIGN="TOP" BORDER="0"
|
||||
ALT=""> Documentazione/Guida <IMG
|
||||
SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
|
||||
BORDER="0" ALT=""></A>
|
||||
|
||||
<A CLASS="unsel" HREF="/jobs/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
|
||||
HEIGHT="4" ALIGN="TOP" BORDER="0"
|
||||
ALT=""> Operazioni <IMG
|
||||
SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
|
||||
BORDER="0" ALT=""></A>
|
||||
|
||||
<A CLASS="unsel" HREF="/printers/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
|
||||
HEIGHT="4" ALIGN="TOP" BORDER="0"
|
||||
ALT=""> Stampanti <IMG
|
||||
SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
|
||||
BORDER="0" ALT=""></A>
|
||||
|
||||
</TD></TR>
|
||||
<TR CLASS="page">
|
||||
<TD WIDTH="15"> </TD>
|
||||
<TD COLSPAN="2" WIDTH="100%" VALIGN="TOP" CLASS="page">
|
||||
|
||||
<H2 CLASS="title">Benvenuto!</H2>
|
||||
|
||||
<P>Queste pagine web ti consentono di controllare le stampanti e le operazioni di stampa nonché eseguire operazioni di amministrazione del sistema. Fai clic su ognuna delle schede in alto o sui pulsanti seguenti per effettuare un'operazione.</P>
|
||||
|
||||
<P>
|
||||
<A HREF="/help/"><IMG SRC="/images/button-help.gif" CLASS="button" ALT="Guida"></A>
|
||||
<A HREF="/admin?OP=add-class"><IMG SRC="/images/button-add-class.gif" CLASS="button" ALT="Aggiungi classe"></A>
|
||||
<A HREF="/admin?OP=add-printer"><IMG SRC="/images/button-add-printer.gif" CLASS="button" ALT="Aggiungi stampante"></A>
|
||||
<A HREF="/classes"><IMG SRC="/images/button-manage-classes.gif" CLASS="button" ALT="Gestione classi"></A>
|
||||
<A HREF="/jobs"><IMG SRC="/images/button-manage-jobs.gif" CLASS="button" ALT="Gestione operazioni"></A>
|
||||
<A HREF="/printers"><IMG SRC="/images/button-manage-printers.gif" CLASS="button" ALT="Gestione stampanti"></A>
|
||||
<A HREF="/admin"><IMG SRC="/images/button-manage-server.gif" CLASS="button" ALT="Gestione server"></A>
|
||||
</P>
|
||||
|
||||
<P><I>Se ti viene richiesto un nome utente o una password, inserisci il nome utente
|
||||
e la password di accesso o il nome utente e la password dell'utente "root".</I></P>
|
||||
|
||||
<H2 CLASS="title">Informazioni su CUPS</H2>
|
||||
|
||||
<P>
|
||||
<IMG SRC="/images/happy.gif" ALIGN="LEFT" WIDTH="196" HEIGHT="144"
|
||||
STYLE="padding-right: 10px;" ALT="Computer felice e stampante">
|
||||
|
||||
<A HREF="http://www.easysw.com/"><IMG SRC="/images/esp-logo.gif"
|
||||
ALIGN="RIGHT" WIDTH="110" HEIGHT="68" BORDER="0"
|
||||
STYLE="padding-left: 10px; padding-bottom: 10px;"
|
||||
ALT="Easy Software Products"></A>
|
||||
|
||||
CUPS fornisce un sottosistema di stampa portabile per
|
||||
i sistemi operativi basati su UNIX<SUP>®</SUP>. Sviluppato e
|
||||
gestito da <A HREF="http://www.easysw.com">Easy Software
|
||||
Products</a> per promuovere una soluzione di stampa standard. CUPS è il
|
||||
sistema di stampa standard utilizzato su MacOS<SUP>®</SUP> X e sulla
|
||||
maggior parte delle distribuzioni Linux<SUP>®</SUP>.</P>
|
||||
|
||||
<P>CUPS utilizza l'<A HREF="http://www.pwg.org/ipp/"
|
||||
TARGET="_blank">Internet Printing Protocol ("IPP")</A> come base per la
|
||||
gestione delle operazioni di stampa e delle code e aggiunge la navigazione delle
|
||||
stampanti di rete e opzioni di stampa basate su PostScript Printer
|
||||
Description ("PPD") per supportare tutte le necessità di stampa.<BR CLEAR="ALL"></P>
|
||||
|
||||
<H2 CLASS="title">Driver di stampa e assistenza</H2>
|
||||
|
||||
<P>Visita il sito ufficiale di CUPS per i driver di stampa e assistenza:</P>
|
||||
|
||||
<PRE>
|
||||
<A HREF="http://www.cups.org/" TARGET="_blank">www.cups.org</A>
|
||||
</PRE>
|
||||
|
||||
<P>Supporto commerciale e una versione migliorata di CUPS chiamata <A
|
||||
HREF="http://www.easysw.com/printpro/">ESP Print Pro</A>
|
||||
disponibili presso:</P>
|
||||
|
||||
<PRE>
|
||||
<A HREF="http://www.easysw.com/" TARGET="_blank">www.easysw.com</A>
|
||||
</PRE>
|
||||
|
||||
</TD>
|
||||
<TD WIDTH="15"> </TD>
|
||||
</TR>
|
||||
<TR CLASS="header">
|
||||
<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
|
||||
WIDTH="15" HEIGHT="15" ALT=""></TD>
|
||||
<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
|
||||
|
||||
<P><SMALL>Common UNIX Printing System, CUPS, e il logo CUPS sono
|
||||
marchi registrati da <A HREF="http://www.easysw.com">Easy Software
|
||||
Products</A>. CUPS è un copyright 1997-2006 di Easy Software Products,
|
||||
Tutti i diritti sono riservati.</SMALL></P>
|
||||
|
||||
</TD>
|
||||
|
||||
<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
|
||||
WIDTH="15" HEIGHT="15" ALT=""></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -55,6 +55,6 @@ CUPS 1.1 or higher.</p>
|
||||
<h2 class='title'>Licensing</h2>
|
||||
|
||||
<p>The CUPS raster API is provided under the terms of the GNU
|
||||
Library General Public License, with exceptions for MacOS X-based
|
||||
General Public License, with exceptions for MacOS X-based
|
||||
programs. Please see the CUPS license agreement for more
|
||||
information.</p>
|
||||
|
||||
@@ -949,7 +949,7 @@ copy_dsc(cups_file_t *fp, /* I - File to read from */
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("%%%%Page: %s %d\n", pageinfo->label, number);
|
||||
printf("%%%%Page: %s %d\n", pageinfo->label, number);
|
||||
printf("%%%%PageBoundingBox: %d %d %d %d\n",
|
||||
pageinfo->bounding_box[0], pageinfo->bounding_box[1],
|
||||
pageinfo->bounding_box[2], pageinfo->bounding_box[3]);
|
||||
@@ -1263,44 +1263,6 @@ copy_page(cups_file_t *fp, /* I - File to read from */
|
||||
memcpy(bounding_box, doc->bounding_box,
|
||||
sizeof(bounding_box));
|
||||
}
|
||||
else if (doc->number_up == 1 && !doc->fitplot)
|
||||
{
|
||||
int temp_bbox[4]; /* Temporary bounding box */
|
||||
|
||||
|
||||
switch (Orientation)
|
||||
{
|
||||
case 0 : /* Portrait */
|
||||
break;
|
||||
|
||||
case 1 : /* Landscape */
|
||||
temp_bbox[0] = PageWidth - bounding_box[3];
|
||||
temp_bbox[1] = bounding_box[0];
|
||||
temp_bbox[2] = PageWidth - bounding_box[1];
|
||||
temp_bbox[3] = bounding_box[2];
|
||||
|
||||
memcpy(bounding_box, temp_bbox, sizeof(bounding_box));
|
||||
break;
|
||||
|
||||
case 2 : /* Reverse Portrait */
|
||||
temp_bbox[0] = PageWidth - bounding_box[0];
|
||||
temp_bbox[1] = PageLength - bounding_box[1];
|
||||
temp_bbox[2] = PageWidth - bounding_box[2];
|
||||
temp_bbox[3] = PageLength - bounding_box[3];
|
||||
|
||||
memcpy(bounding_box, temp_bbox, sizeof(bounding_box));
|
||||
break;
|
||||
|
||||
case 3 : /* Reverse Landscape */
|
||||
temp_bbox[0] = bounding_box[1];
|
||||
temp_bbox[1] = PageLength - bounding_box[2];
|
||||
temp_bbox[2] = bounding_box[3];
|
||||
temp_bbox[3] = PageLength - bounding_box[0];
|
||||
|
||||
memcpy(bounding_box, temp_bbox, sizeof(bounding_box));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
else if (!strncmp(line, "%%PageCustomColors:", 19) ||
|
||||
|
||||
@@ -23,6 +23,13 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This code and any derivative of it may be used and distributed
|
||||
* freely under the terms of the GNU General Public License when
|
||||
* used with GNU/GPL Ghostscript or its derivatives. Use of the
|
||||
* code (or any derivative of it) with software other than GNU/GPL
|
||||
* GhostScript (or its derivatives) is governed by the CUPS license
|
||||
* agreement.
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*
|
||||
* Contents:
|
||||
|
||||
@@ -23,6 +23,13 @@
|
||||
* EMail: cups-info@cups.org
|
||||
* WWW: http://www.cups.org
|
||||
*
|
||||
* This code and any derivative of it may be used and distributed
|
||||
* freely under the terms of the GNU General Public License when
|
||||
* used with GNU/GPL Ghostscript or its derivatives. Use of the
|
||||
* code (or any derivative of it) with software other than GNU/GPL
|
||||
* GhostScript (or its derivatives) is governed by the CUPS license
|
||||
* agreement.
|
||||
*
|
||||
* This file is subject to the Apple OS-Developed Software exception.
|
||||
*/
|
||||
|
||||
|
||||
@@ -113,9 +113,6 @@
|
||||
%subpackage et
|
||||
%description Estonian support
|
||||
|
||||
%subpackage it
|
||||
%description Italian support
|
||||
|
||||
%subpackage ja
|
||||
%description Japanese support
|
||||
|
||||
@@ -361,8 +358,6 @@ f 0644 root sys $LOCALEDIR/de/cups_de.po locale/cups_de.po
|
||||
f 0644 root sys $LOCALEDIR/es/cups_es.po locale/cups_es.po
|
||||
%subpackage et
|
||||
f 0644 root sys $LOCALEDIR/et/cups_et.po locale/cups_et.po
|
||||
%subpackage it
|
||||
f 0644 root sys $LOCALEDIR/it/cups_it.po locale/cups_it.po
|
||||
%subpackage ja
|
||||
f 0644 root sys $LOCALEDIR/ja/cups_ja.po locale/cups_ja.po
|
||||
%subpackage pl
|
||||
@@ -435,9 +430,6 @@ f 0644 root sys $DATADIR/templates/es templates/es/*.tmpl
|
||||
%subpackage et
|
||||
d 0755 root sys $DATADIR/templates/et
|
||||
f 0644 root sys $DATADIR/templates/et templates/et/*.tmpl
|
||||
%subpackage it
|
||||
d 0755 root sys $DATADIR/templates/it
|
||||
f 0644 root sys $DATADIR/templates/it templates/it/*.tmpl
|
||||
%subpackage ja
|
||||
d 0755 root sys $DATADIR/templates/ja
|
||||
f 0644 root sys $DATADIR/templates/ja templates/ja/*.tmpl
|
||||
@@ -533,11 +525,6 @@ d 0755 root sys $DOCDIR/et
|
||||
f 0644 root sys $DOCDIR/et doc/et/*.html
|
||||
d 0755 root sys $DOCDIR/et/images -
|
||||
f 0644 root sys $DOCDIR/et/images doc/et/images/*.gif
|
||||
%subpackage it
|
||||
d 0755 root sys $DOCDIR/it
|
||||
f 0644 root sys $DOCDIR/it doc/it/*.html
|
||||
d 0755 root sys $DOCDIR/it/images -
|
||||
f 0644 root sys $DOCDIR/it/images doc/it/images/*.gif
|
||||
%subpackage ja
|
||||
d 0755 root sys $DOCDIR/ja
|
||||
f 0644 root sys $DOCDIR/ja doc/ja/*.html
|
||||
|
||||
@@ -91,11 +91,6 @@ Summary: Common UNIX Printing System - Estonian support
|
||||
Group: System Environment/Daemons
|
||||
Requires: %{name} = %{epoch}:%{version}
|
||||
|
||||
%package it
|
||||
Summary: Common UNIX Printing System - Italian support
|
||||
Group: System Environment/Daemons
|
||||
Requires: %{name} = %{epoch}:%{version}
|
||||
|
||||
%package ja
|
||||
Summary: Common UNIX Printing System - Japanese support
|
||||
Group: System Environment/Daemons
|
||||
@@ -149,10 +144,6 @@ UNIX
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. This package provides Estonian support.
|
||||
|
||||
%description it
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. This package provides Italian support.
|
||||
|
||||
%description ja
|
||||
The Common UNIX Printing System provides a portable printing layer for
|
||||
UNIX® operating systems. This package provides Japanese support.
|
||||
@@ -430,16 +421,6 @@ rm -rf $RPM_BUILD_ROOT
|
||||
/usr/share/cups/templates/et/*
|
||||
/usr/share/locale/et/cups_et.po
|
||||
|
||||
%files it
|
||||
%defattr(-,root,root)
|
||||
%dir /usr/share/doc/cups/it
|
||||
/usr/share/doc/cups/it/index.html
|
||||
%dir /usr/share/doc/cups/it/images
|
||||
/usr/share/doc/cups/it/images/*
|
||||
%dir /usr/share/cups/templates/it
|
||||
/usr/share/cups/templates/it/*
|
||||
/usr/share/locale/it/cups_it.po
|
||||
|
||||
%files ja
|
||||
%defattr(-,root,root)
|
||||
%dir /usr/share/doc/cups/ja
|
||||
|
||||
@@ -1160,7 +1160,7 @@ void PSOutputDev::writeHeader(int firstPage, int lastPage,
|
||||
|
||||
writePSFmt("%%Producer: xpdf/pdftops %s\n", xpdfVersion);
|
||||
xref->getDocInfo(&info);
|
||||
if (info.isDict() && info.dictLookup("Creator", &obj1)->isString()) {
|
||||
if (info.dictLookup("Creator", &obj1)->isString()) {
|
||||
writePS("%%Creator: ");
|
||||
s = obj1.getString();
|
||||
if ((s->getChar(0) & 0xff) == 0xfe &&
|
||||
@@ -1226,7 +1226,7 @@ void PSOutputDev::writeHeader(int firstPage, int lastPage,
|
||||
writePS("\n");
|
||||
}
|
||||
obj1.free();
|
||||
if (info.isDict() && info.dictLookup("Title", &obj1)->isString()) {
|
||||
if (info.dictLookup("Title", &obj1)->isString()) {
|
||||
writePS("%%Title: ");
|
||||
s = obj1.getString();
|
||||
if ((s->getChar(0) & 0xff) == 0xfe &&
|
||||
|
||||
@@ -426,8 +426,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
|
||||
|
||||
con->http.encryption = HTTP_ENCRYPT_ALWAYS;
|
||||
|
||||
if (!encrypt_client(con))
|
||||
cupsdCloseClient(con);
|
||||
encrypt_client(con);
|
||||
}
|
||||
else
|
||||
con->auto_ssl = 1;
|
||||
@@ -746,9 +745,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
|
||||
"cupsdReadClient: Saw first byte %02X, auto-negotiating SSL/TLS session...",
|
||||
buf[0] & 255);
|
||||
|
||||
if (!encrypt_client(con))
|
||||
return (cupsdCloseClient(con));
|
||||
|
||||
encrypt_client(con);
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
@@ -1059,8 +1056,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
|
||||
if (cupsdFlushHeader(con) < 0)
|
||||
return (cupsdCloseClient(con));
|
||||
|
||||
if (!encrypt_client(con))
|
||||
return (cupsdCloseClient(con));
|
||||
encrypt_client(con);
|
||||
#else
|
||||
if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED))
|
||||
return (cupsdCloseClient(con));
|
||||
@@ -1107,8 +1103,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
|
||||
if (cupsdFlushHeader(con) < 0)
|
||||
return (cupsdCloseClient(con));
|
||||
|
||||
if (!encrypt_client(con))
|
||||
return (cupsdCloseClient(con));
|
||||
encrypt_client(con);
|
||||
#else
|
||||
if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED))
|
||||
return (cupsdCloseClient(con));
|
||||
@@ -2592,7 +2587,6 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */
|
||||
# ifdef HAVE_LIBSSL
|
||||
SSL_CTX *context; /* Context for encryption */
|
||||
SSL *conn; /* Connection for encryption */
|
||||
BIO *bio; /* BIO data */
|
||||
unsigned long error; /* Error code */
|
||||
|
||||
|
||||
@@ -2620,12 +2614,9 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */
|
||||
SSL_CTX_use_PrivateKey_file(context, ServerKey, SSL_FILETYPE_PEM);
|
||||
SSL_CTX_use_certificate_file(context, ServerCertificate, SSL_FILETYPE_PEM);
|
||||
|
||||
bio = BIO_new(_httpBIOMethods());
|
||||
BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)HTTP(con));
|
||||
|
||||
conn = SSL_new(context);
|
||||
SSL_set_bio(conn, bio, bio);
|
||||
|
||||
SSL_set_fd(conn, con->http.fd);
|
||||
if (SSL_accept(conn) != 1)
|
||||
{
|
||||
cupsdLogMessage(CUPSD_LOG_ERROR,
|
||||
@@ -2698,9 +2689,8 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */
|
||||
gnutls_init(&(conn->session), GNUTLS_SERVER);
|
||||
gnutls_set_default_priority(conn->session);
|
||||
gnutls_credentials_set(conn->session, GNUTLS_CRD_CERTIFICATE, *credentials);
|
||||
gnutls_transport_set_ptr(conn->session, (gnutls_transport_ptr)HTTP(con));
|
||||
gnutls_transport_set_pull_function(conn->session, _httpReadGNUTLS);
|
||||
gnutls_transport_set_push_function(conn->session, _httpWriteGNUTLS);
|
||||
gnutls_transport_set_ptr(conn->session,
|
||||
(gnutls_transport_ptr)((long)con->http.fd));
|
||||
|
||||
error = gnutls_handshake(conn->session);
|
||||
|
||||
@@ -2730,6 +2720,7 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */
|
||||
# elif defined(HAVE_CDSASSL)
|
||||
OSStatus error; /* Error code */
|
||||
http_tls_t *conn; /* CDSA connection information */
|
||||
cdsa_conn_ref_t u; /* Connection reference union */
|
||||
|
||||
|
||||
if ((conn = (http_tls_t *)malloc(sizeof(http_tls_t))) == NULL)
|
||||
@@ -2752,7 +2743,7 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */
|
||||
if (!conn->certsArray)
|
||||
{
|
||||
cupsdLogMessage(CUPSD_LOG_ERROR,
|
||||
"encrypt_client: Could not find signing key in keychain "
|
||||
"EncryptClient: Could not find signing key in keychain "
|
||||
"\"%s\"", ServerCertificate);
|
||||
error = errSSLBadCert; /* errSSLBadConfiguration is a better choice, but not available on 10.2.x */
|
||||
}
|
||||
@@ -2767,7 +2758,15 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */
|
||||
error = SSLSetProtocolVersionEnabled(conn->session, kSSLProtocol2, false);
|
||||
|
||||
if (!error)
|
||||
error = SSLSetConnection(conn->session, HTTP(con));
|
||||
{
|
||||
/*
|
||||
* Use a union to resolve warnings about int/pointer size mismatches...
|
||||
*/
|
||||
|
||||
u.connection = NULL;
|
||||
u.sock = con->http.fd;
|
||||
error = SSLSetConnection(conn->session, u.connection);
|
||||
}
|
||||
|
||||
if (!error)
|
||||
error = SSLSetAllowsExpiredCerts(conn->session, true);
|
||||
|
||||
@@ -159,17 +159,6 @@ cupsdLoadRemoteCache(void)
|
||||
time_t now; /* Current time */
|
||||
|
||||
|
||||
/*
|
||||
* Don't load the cache if the CUPS remote protocol is disabled...
|
||||
*/
|
||||
|
||||
if (!(BrowseRemoteProtocols & BROWSE_CUPS))
|
||||
{
|
||||
cupsdLogMessage(CUPSD_LOG_DEBUG,
|
||||
"cupsdLoadRemoteCache: Not loading remote cache.");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Open the remote.cache file...
|
||||
*/
|
||||
|
||||
@@ -4020,14 +4020,14 @@ copy_model(cupsd_client_t *con, /* I - Client connection */
|
||||
if ((!strcmp(system_paper, "Letter") && have_letter) ||
|
||||
(!strcmp(system_paper, "A4") && have_a4))
|
||||
{
|
||||
num_defaults = cupsAddOption("PageSize", system_paper,
|
||||
num_defaults, &defaults);
|
||||
num_defaults = cupsAddOption("PageRegion", system_paper,
|
||||
num_defaults, &defaults);
|
||||
num_defaults = cupsAddOption("PaperDimension", system_paper,
|
||||
num_defaults, &defaults);
|
||||
num_defaults = cupsAddOption("ImageableArea", system_paper,
|
||||
num_defaults, &defaults);
|
||||
num_defaults = ppd_add_default("PageSize", system_paper,
|
||||
num_defaults, &defaults);
|
||||
num_defaults = ppd_add_default("PageRegion", system_paper,
|
||||
num_defaults, &defaults);
|
||||
num_defaults = ppd_add_default("PaperDimension", system_paper,
|
||||
num_defaults, &defaults);
|
||||
num_defaults = ppd_add_default("ImageableArea", system_paper,
|
||||
num_defaults, &defaults);
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_LIBPAPER */
|
||||
|
||||
@@ -1775,7 +1775,6 @@ cupsdUpdateJob(cupsd_job_t *job) /* I - Job to check */
|
||||
strlcpy(job->printer->state_message, message,
|
||||
sizeof(job->printer->state_message));
|
||||
cupsdAddPrinterHistory(job->printer);
|
||||
event |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
|
||||
}
|
||||
|
||||
if (!strchr(job->status_buffer->buffer, '\n'))
|
||||
|
||||
@@ -32,11 +32,9 @@
|
||||
* cupsdSetStringf() - Set a formatted string value.
|
||||
* launchd_checkin() - Check-in with launchd and collect the
|
||||
* listening fds.
|
||||
* launchd_create_dict() - Create a dictionary representing the launchd
|
||||
* config file org.cups.cupsd.plist.
|
||||
* launchd_reload() - Tell launchd to reload the configuration
|
||||
* file to pick up the new listening directives.
|
||||
* launchd_sync_conf() - Re-write the launchd config file
|
||||
* launchd_sync_conf() - Re-write the launchd(8) config file
|
||||
* org.cups.cupsd.plist based on cupsd.conf.
|
||||
* parent_handler() - Catch USR1/CHLD signals...
|
||||
* process_children() - Process all dead children...
|
||||
@@ -77,41 +75,31 @@
|
||||
*/
|
||||
|
||||
#ifdef HAVE_LAUNCHD
|
||||
static void launchd_checkin(void);
|
||||
static CFDictionaryRef launchd_create_dict(void);
|
||||
static void launchd_reload(void);
|
||||
static int launchd_sync_conf(void);
|
||||
static void launchd_checkin(void);
|
||||
static void launchd_reload(void);
|
||||
static int launchd_sync_conf(void);
|
||||
#endif /* HAVE_LAUNCHD */
|
||||
static void parent_handler(int sig);
|
||||
static void process_children(void);
|
||||
static void sigchld_handler(int sig);
|
||||
static void sighup_handler(int sig);
|
||||
static void sigterm_handler(int sig);
|
||||
static long select_timeout(int fds);
|
||||
static void usage(int status);
|
||||
|
||||
static void parent_handler(int sig);
|
||||
static void process_children(void);
|
||||
static void sigchld_handler(int sig);
|
||||
static void sighup_handler(int sig);
|
||||
static void sigterm_handler(int sig);
|
||||
static long select_timeout(int fds);
|
||||
static void usage(int status);
|
||||
|
||||
|
||||
/*
|
||||
* Local globals...
|
||||
*/
|
||||
|
||||
static int parent_signal = 0;
|
||||
/* Set to signal number from child */
|
||||
static int holdcount = 0; /* Number of times "hold" was called */
|
||||
static int parent_signal = 0; /* Set to signal number from child */
|
||||
static int holdcount = 0; /* Number of times "hold" was called */
|
||||
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
|
||||
static sigset_t holdmask; /* Old POSIX signal mask */
|
||||
static sigset_t holdmask; /* Old POSIX signal mask */
|
||||
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
|
||||
static int dead_children = 0;
|
||||
/* Dead children? */
|
||||
static int stop_scheduler = 0;
|
||||
/* Should the scheduler stop? */
|
||||
|
||||
#ifdef HAVE_LAUNCHD
|
||||
static CFURLRef launchd_conf_url = NULL;
|
||||
/* org.cups.cupsd.plist url */
|
||||
static CFDictionaryRef launchd_conf_dict = NULL;
|
||||
/* org.cups.cupsd.plist dict */
|
||||
#endif /* HAVE_LAUNCHD */
|
||||
static int dead_children = 0; /* Dead children? */
|
||||
static int stop_scheduler = 0; /* Should the scheduler stop? */
|
||||
|
||||
|
||||
/*
|
||||
@@ -135,11 +123,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
activity, /* Client activity timer */
|
||||
browse_time, /* Next browse send time */
|
||||
senddoc_time, /* Send-Document time */
|
||||
expire_time, /* Subscription expire time */
|
||||
#ifndef __APPLE__
|
||||
netif_time, /* Network interface poll time */
|
||||
#endif /* !__APPLE__ */
|
||||
mallinfo_time; /* Malloc information time */
|
||||
expire_time; /* Subscription expire time */
|
||||
time_t mallinfo_time; /* Malloc information time */
|
||||
size_t string_count, /* String count */
|
||||
alloc_bytes, /* Allocated string bytes */
|
||||
total_bytes; /* Total string bytes */
|
||||
@@ -551,9 +536,6 @@ main(int argc, /* I - Number of command-line args */
|
||||
senddoc_time = time(NULL);
|
||||
expire_time = time(NULL);
|
||||
fds = 1;
|
||||
#ifndef __APPLE__
|
||||
netif_time = 0;
|
||||
#endif /* !__APPLE__ */
|
||||
|
||||
while (!stop_scheduler)
|
||||
{
|
||||
@@ -674,7 +656,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
#if HAVE_LAUNCHD
|
||||
/*
|
||||
* If no other work is scheduled and we're being controlled by
|
||||
* launchd then timeout after 'LaunchdTimeout' seconds of
|
||||
* launchd(8) then timeout after 'LaunchdTimeout' seconds of
|
||||
* inactivity...
|
||||
*/
|
||||
|
||||
@@ -779,7 +761,7 @@ main(int argc, /* I - Number of command-line args */
|
||||
|
||||
#if HAVE_LAUNCHD
|
||||
/*
|
||||
* If no other work was scheduled and we're being controlled by launchd
|
||||
* If no other work was scheduled and we're being controlled by launchd(8)
|
||||
* then timeout after 'LaunchdTimeout' seconds of inactivity...
|
||||
*/
|
||||
|
||||
@@ -828,23 +810,8 @@ main(int argc, /* I - Number of command-line args */
|
||||
*/
|
||||
|
||||
#ifdef __APPLE__
|
||||
/*
|
||||
* Mac OS X provides the SystemConfiguration framework for system
|
||||
* configuration change events...
|
||||
*/
|
||||
|
||||
if (SysEventPipes[0] >= 0 && FD_ISSET(SysEventPipes[0], input))
|
||||
cupsdUpdateSystemMonitor();
|
||||
#else
|
||||
/*
|
||||
* All other operating systems need to poll for changes...
|
||||
*/
|
||||
|
||||
if ((current_time - netif_time) >= 60)
|
||||
{
|
||||
NetIFUpdate = 1;
|
||||
netif_time = current_time;
|
||||
}
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
/*
|
||||
@@ -1115,12 +1082,6 @@ main(int argc, /* I - Number of command-line args */
|
||||
*/
|
||||
|
||||
launchd_sync_conf();
|
||||
|
||||
if (launchd_conf_url)
|
||||
CFRelease(launchd_conf_url);
|
||||
|
||||
if (launchd_conf_dict)
|
||||
CFRelease(launchd_conf_dict);
|
||||
#endif /* HAVE_LAUNCHD */
|
||||
|
||||
#ifdef __sgi
|
||||
@@ -1488,7 +1449,7 @@ launchd_checkin(void)
|
||||
{
|
||||
if (BrowseSocket != -1)
|
||||
close(BrowseSocket);
|
||||
|
||||
|
||||
BrowseSocket = launch_data_get_fd(tmp);
|
||||
}
|
||||
else
|
||||
@@ -1511,222 +1472,6 @@ launchd_checkin(void)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'launchd_create_dict()' - Create a dictionary representing the launchd
|
||||
* config file org.cups.cupsd.plist.
|
||||
*/
|
||||
|
||||
static CFDictionaryRef /* O - CFDictionary */
|
||||
launchd_create_dict(void)
|
||||
{
|
||||
int portnum; /* Port number */
|
||||
bool runatload; /* Run at load? */
|
||||
CFMutableDictionaryRef cupsd_dict, /* org.cups.cupsd.plist dictionary */
|
||||
sockets, /* Sockets dictionary */
|
||||
listener; /* Listener dictionary */
|
||||
CFMutableArrayRef array; /* Array */
|
||||
CFNumberRef socket_mode; /* Domain socket mode bits */
|
||||
CFStringRef socket_path; /* Domain socket path */
|
||||
CFTypeRef value; /* CF values */
|
||||
cupsd_listener_t *lis; /* Current listening socket */
|
||||
struct servent *service; /* Services data base entry */
|
||||
char temp[1024]; /* Temporary buffer for value */
|
||||
|
||||
|
||||
if ((cupsd_dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks)) == NULL)
|
||||
return NULL;
|
||||
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_LABEL),
|
||||
CFSTR("org.cups.cupsd"));
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_ONDEMAND),
|
||||
kCFBooleanTrue);
|
||||
|
||||
/*
|
||||
* Run-at-load if there are active jobs, polling or shared printers
|
||||
* to advertise...
|
||||
*/
|
||||
|
||||
runatload = (cupsArrayCount(ActiveJobs) || NumPolled ||
|
||||
(Browsing && BrowseLocalProtocols &&
|
||||
NumBrowsers && cupsArrayCount(Printers))) ? true : false;
|
||||
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_RUNATLOAD),
|
||||
runatload ? kCFBooleanTrue : kCFBooleanFalse);
|
||||
# ifdef LAUNCH_JOBKEY_SERVICEIPC
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_SERVICEIPC),
|
||||
kCFBooleanTrue);
|
||||
# endif /* LAUNCH_JOBKEY_SERVICEIPC */
|
||||
|
||||
if ((array = CFArrayCreateMutable(kCFAllocatorDefault, 2,
|
||||
&kCFTypeArrayCallBacks)) != NULL)
|
||||
{
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_PROGRAMARGUMENTS),
|
||||
array);
|
||||
CFArrayAppendValue(array, CFSTR("/usr/sbin/cupsd"));
|
||||
CFArrayAppendValue(array, CFSTR("-l"));
|
||||
CFRelease(array);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add a sockets dictionary...
|
||||
*/
|
||||
|
||||
if ((sockets = (CFMutableDictionaryRef)CFDictionaryCreateMutable(
|
||||
kCFAllocatorDefault, 0,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks)) != NULL)
|
||||
{
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_SOCKETS), sockets);
|
||||
|
||||
/*
|
||||
* Add a Listeners array to the sockets dictionary...
|
||||
*/
|
||||
|
||||
if ((array = CFArrayCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeArrayCallBacks)) != NULL)
|
||||
{
|
||||
CFDictionaryAddValue(sockets, CFSTR("Listeners"), array);
|
||||
|
||||
/*
|
||||
* For each listener add a dictionary to the listeners array...
|
||||
*/
|
||||
|
||||
for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
|
||||
lis;
|
||||
lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
|
||||
{
|
||||
if ((listener = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks)) != NULL)
|
||||
{
|
||||
CFArrayAppendValue(array, listener);
|
||||
|
||||
# ifdef AF_LOCAL
|
||||
if (lis->address.addr.sa_family == AF_LOCAL)
|
||||
{
|
||||
if ((socket_path = CFStringCreateWithCString(kCFAllocatorDefault,
|
||||
lis->address.un.sun_path,
|
||||
kCFStringEncodingUTF8)))
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_PATHNAME),
|
||||
socket_path);
|
||||
CFRelease(socket_path);
|
||||
}
|
||||
portnum = 0140777; /* (S_IFSOCK|S_IRWXU|S_IRWXG|S_IRWXO) or *
|
||||
* 49663d decimal */
|
||||
if ((socket_mode = CFNumberCreate(kCFAllocatorDefault,
|
||||
kCFNumberIntType, &portnum)))
|
||||
{
|
||||
CFDictionaryAddValue(listener, CFSTR("SockPathMode"),
|
||||
socket_mode);
|
||||
CFRelease(socket_mode);
|
||||
}
|
||||
}
|
||||
else
|
||||
# endif /* AF_LOCAL */
|
||||
{
|
||||
# ifdef AF_INET6
|
||||
if (lis->address.addr.sa_family == AF_INET6)
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_FAMILY),
|
||||
CFSTR("IPv6"));
|
||||
portnum = lis->address.ipv6.sin6_port;
|
||||
}
|
||||
else
|
||||
# endif /* AF_INET6 */
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_FAMILY),
|
||||
CFSTR("IPv4"));
|
||||
portnum = lis->address.ipv4.sin_port;
|
||||
}
|
||||
|
||||
if ((service = getservbyport(portnum, NULL)))
|
||||
value = CFStringCreateWithCString(kCFAllocatorDefault,
|
||||
service->s_name,
|
||||
kCFStringEncodingUTF8);
|
||||
else
|
||||
value = CFNumberCreate(kCFAllocatorDefault,
|
||||
kCFNumberIntType, &portnum);
|
||||
|
||||
if (value)
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_SERVICENAME),
|
||||
value);
|
||||
CFRelease(value);
|
||||
}
|
||||
|
||||
httpAddrString(&lis->address, temp, sizeof(temp));
|
||||
if ((value = CFStringCreateWithCString(kCFAllocatorDefault, temp,
|
||||
kCFStringEncodingUTF8)))
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_NODENAME),
|
||||
value);
|
||||
CFRelease(value);
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(listener);
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(array);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the BrowseSocket to the sockets dictionary...
|
||||
*/
|
||||
|
||||
if (Browsing && (BrowseRemoteProtocols & BROWSE_CUPS))
|
||||
{
|
||||
if ((array = CFArrayCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeArrayCallBacks)) != NULL)
|
||||
{
|
||||
CFDictionaryAddValue(sockets, CFSTR("BrowseSockets"), array);
|
||||
|
||||
if ((listener = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks)) != NULL)
|
||||
{
|
||||
CFArrayAppendValue(array, listener);
|
||||
|
||||
CFDictionaryAddValue(listener, CFSTR(LAUNCH_JOBSOCKETKEY_FAMILY),
|
||||
CFSTR("IPv4"));
|
||||
CFDictionaryAddValue(listener, CFSTR(LAUNCH_JOBSOCKETKEY_TYPE),
|
||||
CFSTR("dgram"));
|
||||
|
||||
if ((service = getservbyport(BrowsePort, NULL)))
|
||||
value = CFStringCreateWithCString(kCFAllocatorDefault,
|
||||
service->s_name,
|
||||
kCFStringEncodingUTF8);
|
||||
else
|
||||
value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType,
|
||||
&BrowsePort);
|
||||
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_SERVICENAME), value);
|
||||
CFRelease(value);
|
||||
|
||||
CFRelease(listener);
|
||||
}
|
||||
|
||||
CFRelease(array);
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(sockets);
|
||||
}
|
||||
|
||||
return (cupsd_dict);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'launchd_reload()' - Tell launchd to reload the configuration file to pick
|
||||
* up the new listening directives.
|
||||
@@ -1828,104 +1573,272 @@ launchd_reload(void)
|
||||
|
||||
|
||||
/*
|
||||
* 'launchd_sync_conf()' - Rewrite the launchd config file
|
||||
* 'launchd_sync_conf()' - Re-write the launchd(8) config file
|
||||
* org.cups.cupsd.plist based on cupsd.conf.
|
||||
*/
|
||||
|
||||
static int /* O - 1 if the file was updated */
|
||||
launchd_sync_conf(void)
|
||||
{
|
||||
SInt32 errorCode; /* Error code */
|
||||
CFDataRef resourceData; /* XML property list */
|
||||
CFDictionaryRef cupsd_dict; /* New org.cups.cupsd.plist dict */
|
||||
int portnum; /* Port number */
|
||||
CFMutableDictionaryRef cupsd_dict, /* org.cups.cupsd.plist dictionary */
|
||||
sockets, /* Sockets dictionary */
|
||||
listener; /* Listener dictionary */
|
||||
CFDataRef resourceData; /* XML property list */
|
||||
CFMutableArrayRef array; /* Array */
|
||||
CFNumberRef socket_mode; /* Domain socket mode bits */
|
||||
CFStringRef socket_path; /* Domain socket path */
|
||||
CFTypeRef value; /* CF value */
|
||||
CFURLRef fileURL; /* File URL */
|
||||
SInt32 errorCode; /* Error code */
|
||||
cupsd_listener_t *lis; /* Current listening socket */
|
||||
struct servent *service; /* Services data base entry */
|
||||
char temp[1024]; /* Temporary buffer for value */
|
||||
struct stat cupsd_sb, /* File info for cupsd.conf */
|
||||
launchd_sb; /* File info for org.cups.cupsd.plist */
|
||||
|
||||
|
||||
/*
|
||||
* If needed reconstitute the existing org.cups.cupsd.plist...
|
||||
* If the launchd conf file modification time is newer than the cupsd.conf
|
||||
* time then there's nothing to do...
|
||||
*/
|
||||
|
||||
if (!launchd_conf_url &&
|
||||
!(launchd_conf_url = CFURLCreateFromFileSystemRepresentation(
|
||||
kCFAllocatorDefault,
|
||||
(const unsigned char *)LaunchdConf,
|
||||
strlen(LaunchdConf), false)))
|
||||
if (!stat(ConfigurationFile, &cupsd_sb) &&
|
||||
!stat(LaunchdConf, &launchd_sb) &&
|
||||
launchd_sb.st_mtimespec.tv_sec >= cupsd_sb.st_mtimespec.tv_sec)
|
||||
{
|
||||
cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_sync_conf: "
|
||||
"Unable to create file URL for \"%s\"\n", LaunchdConf);
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (!launchd_conf_dict)
|
||||
{
|
||||
if (CFURLCreateDataAndPropertiesFromResource(NULL, launchd_conf_url,
|
||||
&resourceData, NULL, NULL, &errorCode))
|
||||
{
|
||||
launchd_conf_dict = CFPropertyListCreateFromXMLData(NULL, resourceData,
|
||||
kCFPropertyListImmutable, NULL);
|
||||
CFRelease(resourceData);
|
||||
}
|
||||
|
||||
if (!launchd_conf_dict)
|
||||
{
|
||||
cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_sync_conf: "
|
||||
"Unable to create dictionary for \"%s\"\n", LaunchdConf);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a new org.cups.cupsd.plist dictionary...
|
||||
*/
|
||||
|
||||
if ((cupsd_dict = launchd_create_dict()) == NULL)
|
||||
{
|
||||
cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_sync_conf: "
|
||||
"Unable to create file URL for \"%s\"\n", LaunchdConf);
|
||||
cupsdLogMessage(CUPSD_LOG_DEBUG,
|
||||
"launchd_sync_conf: Nothing to do, pid=%d.",
|
||||
(int)getpid());
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the dictionaries are different write a new org.cups.cupsd.plist...
|
||||
* Time to write a new 'org.cups.cupsd.plist' file.
|
||||
* Create the new dictionary and populate it with values...
|
||||
*/
|
||||
|
||||
if (!CFEqual(cupsd_dict, launchd_conf_dict))
|
||||
if ((cupsd_dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks)) != NULL)
|
||||
{
|
||||
if ((resourceData = CFPropertyListCreateXMLData(kCFAllocatorDefault,
|
||||
cupsd_dict)))
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_LABEL),
|
||||
CFSTR("org.cups.cupsd"));
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_ONDEMAND),
|
||||
kCFBooleanTrue);
|
||||
|
||||
if ((Browsing && BrowseLocalProtocols && cupsArrayCount(Printers)) ||
|
||||
cupsArrayCount(ActiveJobs) || NumPolled)
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_RUNATLOAD),
|
||||
kCFBooleanTrue);
|
||||
else
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_RUNATLOAD),
|
||||
kCFBooleanFalse);
|
||||
|
||||
#ifdef LAUNCH_JOBKEY_SERVICEIPC
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_SERVICEIPC),
|
||||
kCFBooleanTrue);
|
||||
#endif /* LAUNCH_JOBKEY_SERVICEIPC */
|
||||
|
||||
if ((array = CFArrayCreateMutable(kCFAllocatorDefault, 2,
|
||||
&kCFTypeArrayCallBacks)) != NULL)
|
||||
{
|
||||
if (CFURLWriteDataAndPropertiesToResource(launchd_conf_url, resourceData,
|
||||
NULL, &errorCode))
|
||||
{
|
||||
/*
|
||||
* The new cupsd dictionary becomes the on-disk launchd dictionary...
|
||||
*/
|
||||
|
||||
if (launchd_conf_dict)
|
||||
CFRelease(launchd_conf_dict);
|
||||
|
||||
launchd_conf_dict = cupsd_dict;
|
||||
}
|
||||
else
|
||||
{
|
||||
cupsdLogMessage(CUPSD_LOG_WARN,
|
||||
"launchd_sync_conf: "
|
||||
"CFURLWriteDataAndPropertiesToResource(\"%s\") "
|
||||
"failed: %d\n",
|
||||
LaunchdConf, (int)errorCode);
|
||||
|
||||
CFRelease(cupsd_dict);
|
||||
}
|
||||
|
||||
CFRelease(resourceData);
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_PROGRAMARGUMENTS),
|
||||
array);
|
||||
CFArrayAppendValue(array, CFSTR("/usr/sbin/cupsd"));
|
||||
CFArrayAppendValue(array, CFSTR("-l"));
|
||||
CFRelease(array);
|
||||
}
|
||||
|
||||
/*
|
||||
* Let the caller know we updated the file...
|
||||
* Add a sockets dictionary...
|
||||
*/
|
||||
|
||||
return (1);
|
||||
if ((sockets = (CFMutableDictionaryRef)CFDictionaryCreateMutable(
|
||||
kCFAllocatorDefault, 0,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks)) != NULL)
|
||||
{
|
||||
CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_SOCKETS), sockets);
|
||||
|
||||
/*
|
||||
* Add a Listeners array to the sockets dictionary...
|
||||
*/
|
||||
|
||||
if ((array = CFArrayCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeArrayCallBacks)) != NULL)
|
||||
{
|
||||
CFDictionaryAddValue(sockets, CFSTR("Listeners"), array);
|
||||
|
||||
/*
|
||||
* For each listener add a dictionary to the listeners array...
|
||||
*/
|
||||
|
||||
for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
|
||||
lis;
|
||||
lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
|
||||
{
|
||||
if ((listener = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks)) != NULL)
|
||||
{
|
||||
CFArrayAppendValue(array, listener);
|
||||
|
||||
# ifdef AF_LOCAL
|
||||
if (lis->address.addr.sa_family == AF_LOCAL)
|
||||
{
|
||||
if ((socket_path = CFStringCreateWithCString(kCFAllocatorDefault,
|
||||
lis->address.un.sun_path,
|
||||
kCFStringEncodingUTF8)))
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_PATHNAME),
|
||||
socket_path);
|
||||
CFRelease(socket_path);
|
||||
}
|
||||
portnum = 0140777; /* (S_IFSOCK|S_IRWXU|S_IRWXG|S_IRWXO) or *
|
||||
* 49663d decimal */
|
||||
if ((socket_mode = CFNumberCreate(kCFAllocatorDefault,
|
||||
kCFNumberIntType, &portnum)))
|
||||
{
|
||||
CFDictionaryAddValue(listener, CFSTR("SockPathMode"),
|
||||
socket_mode);
|
||||
CFRelease(socket_mode);
|
||||
}
|
||||
}
|
||||
else
|
||||
# endif /* AF_LOCAL */
|
||||
{
|
||||
# ifdef AF_INET6
|
||||
if (lis->address.addr.sa_family == AF_INET6)
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_FAMILY),
|
||||
CFSTR("IPv6"));
|
||||
portnum = lis->address.ipv6.sin6_port;
|
||||
}
|
||||
else
|
||||
# endif /* AF_INET6 */
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_FAMILY),
|
||||
CFSTR("IPv4"));
|
||||
portnum = lis->address.ipv4.sin_port;
|
||||
}
|
||||
|
||||
if ((service = getservbyport(portnum, NULL)))
|
||||
value = CFStringCreateWithCString(kCFAllocatorDefault,
|
||||
service->s_name,
|
||||
kCFStringEncodingUTF8);
|
||||
else
|
||||
value = CFNumberCreate(kCFAllocatorDefault,
|
||||
kCFNumberIntType, &portnum);
|
||||
|
||||
if (value)
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_SERVICENAME),
|
||||
value);
|
||||
CFRelease(value);
|
||||
}
|
||||
|
||||
httpAddrString(&lis->address, temp, sizeof(temp));
|
||||
if ((value = CFStringCreateWithCString(kCFAllocatorDefault, temp,
|
||||
kCFStringEncodingUTF8)))
|
||||
{
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_NODENAME),
|
||||
value);
|
||||
CFRelease(value);
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(listener);
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(array);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the BrowseSocket to the sockets dictionary...
|
||||
*/
|
||||
|
||||
if (Browsing && (BrowseRemoteProtocols & BROWSE_CUPS))
|
||||
{
|
||||
if ((array = CFArrayCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeArrayCallBacks)) != NULL)
|
||||
{
|
||||
CFDictionaryAddValue(sockets, CFSTR("BrowseSockets"), array);
|
||||
|
||||
if ((listener = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks)) != NULL)
|
||||
{
|
||||
CFArrayAppendValue(array, listener);
|
||||
|
||||
CFDictionaryAddValue(listener, CFSTR(LAUNCH_JOBSOCKETKEY_FAMILY),
|
||||
CFSTR("IPv4"));
|
||||
CFDictionaryAddValue(listener, CFSTR(LAUNCH_JOBSOCKETKEY_TYPE),
|
||||
CFSTR("dgram"));
|
||||
|
||||
if ((service = getservbyport(BrowsePort, NULL)))
|
||||
value = CFStringCreateWithCString(kCFAllocatorDefault,
|
||||
service->s_name,
|
||||
kCFStringEncodingUTF8);
|
||||
else
|
||||
value = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType,
|
||||
&BrowsePort);
|
||||
|
||||
CFDictionaryAddValue(listener,
|
||||
CFSTR(LAUNCH_JOBSOCKETKEY_SERVICENAME), value);
|
||||
CFRelease(value);
|
||||
|
||||
CFRelease(listener);
|
||||
}
|
||||
|
||||
CFRelease(array);
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(sockets);
|
||||
}
|
||||
|
||||
cupsdLogMessage(CUPSD_LOG_DEBUG,
|
||||
"launchd_sync_conf: Updating \"%s\", pid=%d\n",
|
||||
LaunchdConf, (int)getpid());
|
||||
|
||||
if ((fileURL = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
|
||||
(const unsigned char *)LaunchdConf,
|
||||
strlen(LaunchdConf), false)))
|
||||
{
|
||||
if ((resourceData = CFPropertyListCreateXMLData(kCFAllocatorDefault,
|
||||
cupsd_dict)))
|
||||
{
|
||||
if (!CFURLWriteDataAndPropertiesToResource(fileURL, resourceData,
|
||||
NULL, &errorCode))
|
||||
{
|
||||
cupsdLogMessage(CUPSD_LOG_WARN,
|
||||
"launchd_sync_conf: "
|
||||
"CFURLWriteDataAndPropertiesToResource(\"%s\") "
|
||||
"failed: %d\n",
|
||||
LaunchdConf, (int)errorCode);
|
||||
}
|
||||
|
||||
CFRelease(resourceData);
|
||||
}
|
||||
|
||||
CFRelease(fileURL);
|
||||
}
|
||||
|
||||
CFRelease(cupsd_dict);
|
||||
}
|
||||
|
||||
return (0);
|
||||
/*
|
||||
* Let the caller know we updated the file...
|
||||
*/
|
||||
|
||||
return (1);
|
||||
}
|
||||
#endif /* HAVE_LAUNCHD */
|
||||
|
||||
|
||||
@@ -60,8 +60,7 @@ cupsdNetIFFind(const char *name) /* I - Name of interface */
|
||||
* Update the interface list as needed...
|
||||
*/
|
||||
|
||||
if (NetIFUpdate)
|
||||
cupsdNetIFUpdate();
|
||||
cupsdNetIFUpdate();
|
||||
|
||||
/*
|
||||
* Search for the named interface...
|
||||
@@ -114,13 +113,14 @@ cupsdNetIFUpdate(void)
|
||||
|
||||
|
||||
/*
|
||||
* Only update the list if we need to...
|
||||
* Update the network interface list no more often than once a
|
||||
* minute...
|
||||
*/
|
||||
|
||||
if (!NetIFUpdate)
|
||||
if ((time(NULL) - NetIFTime) < 60)
|
||||
return;
|
||||
|
||||
NetIFUpdate = 0;
|
||||
NetIFTime = time(NULL);
|
||||
|
||||
/*
|
||||
* Free the old interfaces...
|
||||
|
||||
@@ -43,8 +43,8 @@ typedef struct cupsd_netif_s /**** Network interface data ****/
|
||||
* Globals...
|
||||
*/
|
||||
|
||||
VAR int NetIFUpdate VALUE(1);
|
||||
/* Network interface list needs updating */
|
||||
VAR time_t NetIFTime VALUE(0);
|
||||
/* Network interface list time */
|
||||
VAR cups_array_t *NetIFList VALUE(NULL);
|
||||
/* Array of network interfaces */
|
||||
|
||||
|
||||