summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt23
-rw-r--r--CREDITS.txt3
-rw-r--r--INSTALL.txt2
-rw-r--r--README.txt2
-rw-r--r--backend/pap.c364
-rw-r--r--backend/snmp.c8
-rw-r--r--backend/usb-darwin.c78
-rw-r--r--backend/usb-unix.c7
-rw-r--r--config-scripts/cups-common.m411
-rw-r--r--config-scripts/cups-defaults.m46
-rw-r--r--cups/cups.h8
-rw-r--r--cups/http-private.h23
-rw-r--r--cups/http.c319
-rw-r--r--cups/libcups_s.exp1
-rw-r--r--cups/transcode.c75
-rw-r--r--desktop/cups.desktop2
-rw-r--r--doc/help/spec-ppd.html7
-rw-r--r--doc/it/images/button-accept-jobs.gifbin0 -> 667 bytes
-rw-r--r--doc/it/images/button-add-class.gifbin0 -> 626 bytes
-rw-r--r--doc/it/images/button-add-printer.gifbin0 -> 699 bytes
-rw-r--r--doc/it/images/button-add-this-printer.gifbin0 -> 854 bytes
-rw-r--r--doc/it/images/button-cancel-all-jobs.gifbin0 -> 682 bytes
-rw-r--r--doc/it/images/button-cancel-job.gifbin0 -> 588 bytes
-rw-r--r--doc/it/images/button-change-settings.gifbin0 -> 658 bytes
-rw-r--r--doc/it/images/button-clean-print-heads.gifbin0 -> 496 bytes
-rw-r--r--doc/it/images/button-clear.gifbin0 -> 346 bytes
-rw-r--r--doc/it/images/button-continue.gifbin0 -> 406 bytes
-rw-r--r--doc/it/images/button-delete-class.gifbin0 -> 520 bytes
-rw-r--r--doc/it/images/button-delete-printer.gifbin0 -> 547 bytes
-rw-r--r--doc/it/images/button-edit-configuration-file.gifbin0 -> 778 bytes
-rw-r--r--doc/it/images/button-export-samba.gifbin0 -> 766 bytes
-rw-r--r--doc/it/images/button-help.gifbin0 -> 354 bytes
-rw-r--r--doc/it/images/button-hold-job.gifbin0 -> 646 bytes
-rw-r--r--doc/it/images/button-manage-classes.gifbin0 -> 558 bytes
-rw-r--r--doc/it/images/button-manage-jobs.gifbin0 -> 628 bytes
-rw-r--r--doc/it/images/button-manage-printers.gifbin0 -> 624 bytes
-rw-r--r--doc/it/images/button-manage-server.gifbin0 -> 558 bytes
-rw-r--r--doc/it/images/button-modify-class.gifbin0 -> 558 bytes
-rw-r--r--doc/it/images/button-modify-printer.gifbin0 -> 630 bytes
-rw-r--r--doc/it/images/button-move-job.gifbin0 -> 623 bytes
-rw-r--r--doc/it/images/button-move-jobs.gifbin0 -> 733 bytes
-rw-r--r--doc/it/images/button-print-self-test-page.gifbin0 -> 826 bytes
-rw-r--r--doc/it/images/button-print-test-page.gifbin0 -> 711 bytes
-rw-r--r--doc/it/images/button-publish-printer.gifbin0 -> 628 bytes
-rw-r--r--doc/it/images/button-reject-jobs.gifbin0 -> 579 bytes
-rw-r--r--doc/it/images/button-release-job.gifbin0 -> 613 bytes
-rw-r--r--doc/it/images/button-restart-job.gifbin0 -> 579 bytes
-rw-r--r--doc/it/images/button-save-changes.gifbin0 -> 583 bytes
-rw-r--r--doc/it/images/button-search.gifbin0 -> 356 bytes
-rw-r--r--doc/it/images/button-set-allowed-users.gifbin0 -> 697 bytes
-rw-r--r--doc/it/images/button-set-as-default.gifbin0 -> 723 bytes
-rw-r--r--doc/it/images/button-set-printer-options.gifbin0 -> 734 bytes
-rw-r--r--doc/it/images/button-show-active.gifbin0 -> 709 bytes
-rw-r--r--doc/it/images/button-show-all.gifbin0 -> 714 bytes
-rw-r--r--doc/it/images/button-show-completed.gifbin0 -> 804 bytes
-rw-r--r--doc/it/images/button-show-next.gifbin0 -> 613 bytes
-rw-r--r--doc/it/images/button-show-previous.gifbin0 -> 625 bytes
-rw-r--r--doc/it/images/button-sort-ascending.gifbin0 -> 564 bytes
-rw-r--r--doc/it/images/button-sort-descending.gifbin0 -> 618 bytes
-rw-r--r--doc/it/images/button-start-class.gifbin0 -> 515 bytes
-rw-r--r--doc/it/images/button-start-printer.gifbin0 -> 589 bytes
-rw-r--r--doc/it/images/button-stop-class.gifbin0 -> 490 bytes
-rw-r--r--doc/it/images/button-stop-printer.gifbin0 -> 547 bytes
-rw-r--r--doc/it/images/button-unpublish-printer.gifbin0 -> 729 bytes
-rw-r--r--doc/it/images/button-use-default-config.gifbin0 -> 909 bytes
-rw-r--r--doc/it/images/button-view-access-log.gifbin0 -> 697 bytes
-rw-r--r--doc/it/images/button-view-error-log.gifbin0 -> 631 bytes
-rw-r--r--doc/it/images/button-view-page-log.gifbin0 -> 694 bytes
-rw-r--r--doc/it/images/button-view-printable-version.gifbin0 -> 778 bytes
-rw-r--r--doc/it/index.html.in138
-rw-r--r--filter/pstops.c44
-rw-r--r--locale/cups_it.po2819
-rw-r--r--packaging/cups.list.in17
-rw-r--r--packaging/cups.spec.in23
-rw-r--r--scheduler/client.c41
-rw-r--r--scheduler/dirsvc.c15
-rw-r--r--scheduler/main.c595
-rw-r--r--scheduler/network.c14
-rw-r--r--scheduler/network.h8
-rw-r--r--scheduler/sysman.c85
-rw-r--r--systemv/lpstat.c6
-rw-r--r--templates/it/add-class.tmpl33
-rw-r--r--templates/it/add-printer.tmpl28
-rw-r--r--templates/it/admin.tmpl77
-rw-r--r--templates/it/choose-device.tmpl26
-rw-r--r--templates/it/choose-make.tmpl42
-rw-r--r--templates/it/choose-model.tmpl34
-rw-r--r--templates/it/choose-serial.tmpl47
-rw-r--r--templates/it/choose-uri.tmpl42
-rw-r--r--templates/it/class-added.tmpl2
-rw-r--r--templates/it/class-confirm.tmpl7
-rw-r--r--templates/it/class-deleted.tmpl1
-rw-r--r--templates/it/class-jobs-header.tmpl1
-rw-r--r--templates/it/class-modified.tmpl2
-rw-r--r--templates/it/classes-header.tmpl1
-rw-r--r--templates/it/classes.tmpl54
-rw-r--r--templates/it/edit-config.tmpl.in91
-rw-r--r--templates/it/error-op.tmpl3
-rw-r--r--templates/it/error.tmpl3
-rw-r--r--templates/it/header.tmpl.in63
-rw-r--r--templates/it/help-header.tmpl47
-rw-r--r--templates/it/help-printable.tmpl11
-rw-r--r--templates/it/job-cancel.tmpl1
-rw-r--r--templates/it/job-hold.tmpl1
-rw-r--r--templates/it/job-move.tmpl22
-rw-r--r--templates/it/job-moved.tmpl2
-rw-r--r--templates/it/job-release.tmpl1
-rw-r--r--templates/it/job-restart.tmpl1
-rw-r--r--templates/it/jobs-header.tmpl15
-rw-r--r--templates/it/jobs.tmpl42
-rw-r--r--templates/it/maintenance.tmpl2
-rw-r--r--templates/it/modify-class.tmpl34
-rw-r--r--templates/it/modify-printer.tmpl29
-rw-r--r--templates/it/norestart.tmpl2
-rw-r--r--templates/it/option-boolean.tmpl6
-rw-r--r--templates/it/option-conflict.tmpl7
-rw-r--r--templates/it/option-header.tmpl3
-rw-r--r--templates/it/option-pickmany.tmpl6
-rw-r--r--templates/it/option-pickone.tmpl6
-rw-r--r--templates/it/option-trailer.tmpl5
-rw-r--r--templates/it/pager.tmpl7
-rw-r--r--templates/it/printer-accept.tmpl3
-rw-r--r--templates/it/printer-added.tmpl2
-rw-r--r--templates/it/printer-configured.tmpl2
-rw-r--r--templates/it/printer-confirm.tmpl7
-rw-r--r--templates/it/printer-default.tmpl7
-rw-r--r--templates/it/printer-deleted.tmpl1
-rw-r--r--templates/it/printer-jobs-header.tmpl1
-rw-r--r--templates/it/printer-modified.tmpl2
-rw-r--r--templates/it/printer-purge.tmpl3
-rw-r--r--templates/it/printer-reject.tmpl3
-rw-r--r--templates/it/printer-start.tmpl3
-rw-r--r--templates/it/printer-stop.tmpl3
-rw-r--r--templates/it/printers-header.tmpl1
-rw-r--r--templates/it/printers.tmpl64
-rw-r--r--templates/it/restart.tmpl1
-rw-r--r--templates/it/samba-export.tmpl54
-rw-r--r--templates/it/samba-exported.tmpl1
-rw-r--r--templates/it/search.tmpl13
-rw-r--r--templates/it/set-printer-options-header.tmpl3
-rw-r--r--templates/it/set-printer-options-trailer.tmpl1
-rw-r--r--templates/it/test-page.tmpl2
-rw-r--r--templates/it/trailer.tmpl21
-rw-r--r--templates/it/users.tmpl26
-rwxr-xr-xtest/run-stp-tests.sh31
145 files changed, 5205 insertions, 601 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 9fa60c3d9..49fe7d702 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,27 @@
-CHANGES.txt - 2006-11-02
+CHANGES.txt - 2006-11-16
------------------------
+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
diff --git a/CREDITS.txt b/CREDITS.txt
index 09db1ccb7..cfd4fcd33 100644
--- a/CREDITS.txt
+++ b/CREDITS.txt
@@ -29,8 +29,9 @@ 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.
diff --git a/INSTALL.txt b/INSTALL.txt
index 7a3694081..d6f9a0179 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -1,4 +1,4 @@
-INSTALL - CUPS v1.2.6 - 2006-11-06
+INSTALL - CUPS v1.2.7 - 2006-11-16
----------------------------------
This file describes how to compile and install CUPS from source
diff --git a/README.txt b/README.txt
index 0d312bca9..d8b6b0fb0 100644
--- a/README.txt
+++ b/README.txt
@@ -1,4 +1,4 @@
-README - CUPS v1.2.6 - 2006-11-06
+README - CUPS v1.2.7 - 2006-11-16
---------------------------------
Looking for compile instructions? Read the file "INSTALL.txt"
diff --git a/backend/pap.c b/backend/pap.c
index f5eadae33..dd599f83f 100644
--- a/backend/pap.c
+++ b/backend/pap.c
@@ -1,5 +1,5 @@
/*
-* "$Id: pap.c 5480 2006-05-02 15:17:04Z mike $"
+* "$Id: pap.c 6090 2006-11-14 16:35:27Z mike $"
*
* © Copyright 2004 Apple Computer, Inc. All rights reserved.
*
@@ -42,31 +42,35 @@
* 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 from a file descriptor to an NBP specified printer.
+* printFile() - Print file.
* papOpen() - Open a pap session to a printer.
-* papClose() - Close a pap session after cleaning up pending transactions.
+* papClose() - Close a pap session.
* papWrite() - Write bytes to a printer.
-* papCloseResp() - Send a pap close response in the rare case we receive a close connection request.
+* papCloseResp() - Send a pap close response.
* 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 - Returns a string with any percent escape sequences replaced with their equivalent.
+* removePercentEscapes - Remove percent escape sequences from a string.
* 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>
@@ -86,7 +90,8 @@
#include <netat/nbp.h>
#include <netat/pap.h>
-#include <cups/http.h>
+#include <cups/cups.h>
+#include <cups/backend.h>
#include <libkern/OSByteOrder.h>
@@ -95,19 +100,25 @@
#else
/* These definitions come from at_proto.h... */
# define ZIP_DEF_INTERFACE NULL
-enum { RUNNING, NOTLOADED, LOADED, OTHERERROR }; /* Appletalk Stack status Function. */
+enum { RUNNING, NOTLOADED, LOADED, OTHERERROR };
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 */
@@ -116,7 +127,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 in listDevices */
+#define MAX_PRINTERS 500 /* Max number of printers we can lookup */
#define PAP_CONNID 0
#define PAP_TYPE 1
#define PAP_EOF 2
@@ -126,43 +137,35 @@ 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 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 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 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: causes us to emit debugging info */
+int gDebug = 0; /* Option: 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(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 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 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);
@@ -170,6 +173,7 @@ 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);
@@ -199,10 +203,13 @@ int main (int argc, const char * argv[])
if (argc == 1 || (argc == 2 && strcmp(argv[1], "-discover") == 0))
{
- /* Ignore errors returned by listDevices - they may be transitory
- * and we don't want cupsd to think that pap is forever unusable.
+ /* If listDevices() didn't find any devices or returns an error output a
+ * legacy style announcement.
+ *
*/
- listDevices();
+ if (listDevices() <= 0)
+ puts("network pap \"Unknown\" \"AppleTalk Printer Access Protocol (pap)\"");
+
return 0;
}
@@ -239,9 +246,9 @@ int main (int argc, const char * argv[])
}
/* Extract the device name and options from the URI... */
- parseUri(argv[0], name, type, zone);
+ parseUri(cupsBackendDeviceURI((char **)argv), name, type, zone);
- err = printFile(name, type, zone, fileno(fp), 3, STDERR_FILENO, copies, argc);
+ err = printFile(name, type, zone, fileno(fp), STDOUT_FILENO, STDERR_FILENO, copies, argc);
if (fp != stdin)
fclose(fp);
@@ -263,7 +270,7 @@ int main (int argc, const char * argv[])
static int listDevices(void)
{
int err = noErr;
- int ind;
+ int i;
int numberFound;
at_nvestr_t at_zone;
@@ -287,10 +294,13 @@ 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';
- err = addPercentEscapes(zone, encodedZone, sizeof(encodedZone));
+ fprintf(stderr, "INFO: Using default AppleTalk zone \"%s\"\n", zone);
+
+ addPercentEscapes(zone, encodedZone, sizeof(encodedZone));
/* Look up all the printers in our zone */
nbp_make_entity(&entity, "=", "LaserWriter", zone);
@@ -310,10 +320,10 @@ static int listDevices(void)
/* Not required but sort them so they look nice */
qsort(buf, numberFound, sizeof(at_nbptuple_t), nbptuple_compare);
- for (ind = 0; ind < numberFound; ind++)
+ for (i = 0; i < numberFound; i++)
{
- 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';
+ 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';
if (addPercentEscapes(name, encodedName, sizeof(encodedName)) == 0)
{
@@ -371,7 +381,7 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
int err;
int rc;
int val;
- int len, ind;
+ int len, i;
char fileBuffer[4096]; /* File buffer */
int fileBufferNbytes;
@@ -390,20 +400,19 @@ 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;
+ int maxfdp1,
+ nbp_failures = 0;
struct timeval timeout, *timeoutPtr;
u_char flowQuantum = 1;
u_short recvSequence = 0;
time_t now,
- connect_time,
+ start_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 */
@@ -420,51 +429,60 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
* Remember when we started looking for the printer.
*/
- connect_time = time(NULL);
+ start_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 (recoverableErrShown)
- {
- fprintf(stderr, "INFO: recovered: \n");
- sleep(5);
- recoverableErrShown = false;
+ if (nbp_failures)
+ {
+ fprintf(stderr, "STATE: -apple-nbp-lookup-warning\n");
+ nbp_failures = 0;
}
/* 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(errno));
+ fprintf(stderr, "WARNING: Unable to open \"%s:%s\": %s\n", name, zone, strerror(err));
}
else
{
- fprintf(stderr, "WARNING: recoverable: Printer not responding\n");
- recoverableErrShown = true;
+ /* 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");
+ }
}
}
else
{
- fprintf(stderr, "WARNING: recoverable: AppleTalk disabled in System Preferences.\n");
- recoverableErrShown = true;
+ fprintf(stderr, "STATE: +apple-appletalk-disabled-warning\n");
+ fprintf(stderr, "INFO: AppleTalk disabled in System Preferences.\n");
}
- retry.retries = 3;
- elasped_time = time(NULL) - connect_time;
+ elasped_time = time(NULL) - start_time;
if (connect_timeout == -1)
connect_timeout = connectTimeout();
@@ -475,9 +493,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 /*(30 * 60)*/)
+ else if (elasped_time < (30 * 60))
sleep_time = 10; /* Waiting < 30 minutes */
- else if (elasped_time < 60 /*(24 * 60 * 60)*/)
+ else if (elasped_time < (24 * 60 * 60))
sleep_time = 30; /* Waiting < 24 hours */
else
sleep_time = 60; /* Waiting > 24 hours */
@@ -486,6 +504,8 @@ 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
@@ -536,21 +556,6 @@ 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;
@@ -666,7 +671,7 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
}
}
- fprintf(stderr, "DEBUG: <- %s\n", PAPPacketStr(TYPE_OF(userdata)));
+ fprintf(stderr, "DEBUG: <- %s\n", packet_name(TYPE_OF(userdata)));
switch (TYPE_OF(userdata))
{
@@ -707,10 +712,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, ind=0; ind < ATP_TRESP_MAX; ind++)
+ for (len=0, i=0; i < ATP_TRESP_MAX; i++)
{
- if (resp.bitmap & (1 << ind))
- len += resp.resp[ind].iov_len;
+ if (resp.bitmap & (1 << i))
+ len += resp.resp[i].iov_len;
}
fprintf(stderr, "DEBUG: <- PAP_DATA %d bytes %s\n", len, IS_PAP_EOF(userdata) ? "with EOF" : "");
@@ -722,7 +727,7 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in
char logstr[512];
int logstrlen;
- write(fdout, sockBuffer, len);
+ cupsBackChannelWrite(sockBuffer, len, 1.0);
sockBuffer[len] = '\0'; /* We always reserve room for the nul so we can use strstr() below*/
pLineBegin = sockBuffer;
@@ -835,7 +840,7 @@ Exit:
/*
* Close the socket and return...
*/
- papClose(false);
+ papClose();
return err;
}
@@ -854,37 +859,35 @@ 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,
- 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;
+ open_result,
+ userdata,
+ atp_err;
+ time_t tm,
+ waitTime;
+ char data[10],
+ rdata[ATP_DATA_SIZE];
+ u_char *puserdata;
+ at_socket socketfd;
at_resp_t resp;
at_retry_t retry;
- if (tuple == NULL)
- {
- errno = EINVAL;
- return -1;
- }
+ result = 0;
+ socketfd = 0;
+ puserdata = (u_char *)&userdata;
fprintf(stderr, "INFO: Opening connection\n");
- errno = 0;
- result = 0;
-
- *fd = atp_open(&sock);
- if (*fd < 0)
+ if ((*fd = atp_open(&socketfd)) < 0)
return -1;
- /* Build the open connection request packet.
+ /*
+ * Build the open connection request packet.
*/
+
tm = time(NULL);
srand(tm);
@@ -901,64 +904,67 @@ static int papOpen(at_nbptuple_t* tuple, u_char* connID, int* fd, at_inet_t* ses
resp.resp[0].iov_base = rdata;
resp.resp[0].iov_len = sizeof(rdata);
- data[0] = sock;
+ data[0] = socketfd;
data[1] = 8;
for (;;)
{
- waitTime = (u_short)(time(NULL) - tm);
- OSWriteBigInt16(&data[2], 0, waitTime);
-
- fprintf(stderr, "DEBUG: -> %s\n", PAPPacketStr(AT_PAP_TYPE_OPEN_CONN));
+ waitTime = time(NULL) - tm;
+ OSWriteBigInt16(&data[2], 0, (u_short)waitTime);
- status = atp_sendreq(*fd, &tuple->enu_addr, data, 4, userdata, 1, 0, 0, &resp, &retry, 0);
+ fprintf(stderr, "DEBUG: -> %s\n", packet_name(AT_PAP_TYPE_OPEN_CONN));
- if (status < 0)
+ if ((atp_err = atp_sendreq(*fd, &tuple->enu_addr, data, 4, userdata, 1, 0,
+ 0, &resp, &retry, 0)) < 0)
{
statusUpdate("Destination unreachable", 23);
result = EHOSTUNREACH;
- errno = EHOSTUNREACH;
- sleep(1);
- goto Exit;
+ break;
}
- else
- {
- puserdata = (u_char *)&resp.userdata[0];
- openResult = OSReadBigInt16(&rdata[2], 0);
- fprintf(stderr, "DEBUG: <- %s, status %d\n", PAPPacketStr(puserdata[1]), openResult);
+ puserdata = (u_char *)&resp.userdata[0];
+ open_result = OSReadBigInt16(&rdata[2], 0);
- /* 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);
+ 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 (openResult == 0)
- break; /* Connection established okay, exit from the loop */
+ if (puserdata[1] != AT_PAP_TYPE_OPEN_CONN_REPLY ||
+ (open_result == 0 && (puserdata[0] & 0xff) != *connID))
+ {
+ result = EINVAL;
+ break;
}
+ statusUpdate(&rdata[5], rdata[4] & 0xff);
+
+ /*
+ * if the connection established okay exit from the loop
+ */
+
+ if (open_result == 0)
+ break;
+
sleep(1);
}
- /* 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)
+ 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
{
atp_close(*fd);
*fd = 0;
+ sleep(1);
}
return result;
@@ -970,12 +976,9 @@ Exit:
* @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(int abortflag)
+static int papClose()
{
int fd;
u_short tmpID;
@@ -1018,7 +1021,7 @@ static int papClose(int abortflag)
if (gWaitEOF == false)
sleep(2);
- fprintf(stderr, "DEBUG: -> %s\n", PAPPacketStr(AT_PAP_TYPE_CLOSE_CONN));
+ fprintf(stderr, "DEBUG: -> %s\n", packet_name(AT_PAP_TYPE_CLOSE_CONN));
puserdata[0] = gConnID;
puserdata[1] = AT_PAP_TYPE_CLOSE_CONN;
@@ -1058,7 +1061,7 @@ 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)
{
int result;
- int ind;
+ int i;
u_char* puserdata;
at_resp_t resp;
@@ -1076,26 +1079,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 (ind = 0; ind < flowQuantum; ind++)
+ for (i = 0; i < flowQuantum; i++)
{
- resp.userdata[ind] = 0;
- puserdata = (u_char *)&resp.userdata[ind];
+ resp.userdata[i] = 0;
+ puserdata = (u_char *)&resp.userdata[i];
puserdata[PAP_CONNID] = connID;
puserdata[PAP_TYPE] = AT_PAP_TYPE_DATA;
puserdata[PAP_EOF] = eof ? 1 : 0;
- resp.resp[ind].iov_base = (caddr_t)data;
+ resp.resp[i].iov_base = (caddr_t)data;
if (data)
data += AT_PAP_DATA_SIZE;
- resp.resp[ind].iov_len = MIN((int)len, (int)AT_PAP_DATA_SIZE);
- len -= resp.resp[ind].iov_len;
+ resp.resp[i].iov_len = MIN((int)len, (int)AT_PAP_DATA_SIZE);
+ len -= resp.resp[i].iov_len;
if (len == 0)
break;
}
- resp.bitmap = (1 << (ind + 1)) - 1;
+ resp.bitmap = (1 << (i + 1)) - 1;
/*
* Write out the data as a PAP 'DATA' response
@@ -1168,7 +1171,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", PAPPacketStr(function));
+ fprintf(stderr, "DEBUG: -> %s\n", packet_name(function));
puserdata[0] = connID;
puserdata[1] = function;
@@ -1274,7 +1277,7 @@ void statusUpdate(char* status, u_char statusLen)
*/
static int parseUri(const char* argv0, char* name, char* type, char* zone)
{
- char scheme[255], /* Scheme in URI */
+ char method[255], /* Method in URI */
hostname[1024], /* Hostname */
username[255], /* Username info (not used) */
resource[1024], /* Resource info (device and options) */
@@ -1290,8 +1293,10 @@ 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, scheme, sizeof(scheme),
+ httpSeparateURI(HTTP_URI_CODING_NONE, argv0, method, sizeof(method),
username, sizeof(username),
hostname, sizeof(hostname), &port,
resource, sizeof(resource));
@@ -1528,6 +1533,31 @@ 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.
*/
@@ -1562,7 +1592,7 @@ static void signalHandler(int sigraised)
{
fprintf(stderr, "ERROR: There was a timeout error while sending data to the printer\n");
- papClose(true);
+ papClose();
_exit(1);
}
diff --git a/backend/snmp.c b/backend/snmp.c
index f2a2b893f..b76283aa2 100644
--- a/backend/snmp.c
+++ b/backend/snmp.c
@@ -1,5 +1,5 @@
/*
- * "$Id: snmp.c 6049 2006-10-20 15:07:21Z mike $"
+ * "$Id: snmp.c 6090 2006-11-14 16:35:27Z mike $"
*
* SNMP discovery backend for the Common UNIX Printing System (CUPS).
*
@@ -1126,7 +1126,7 @@ asn1_set_packed(unsigned char **buffer, /* IO - Pointer in buffer */
{
if (integer > 0xfffffff)
{
- **buffer = (integer >> 14) & 0x7f;
+ **buffer = (integer >> 28) & 0x7f;
(*buffer) ++;
}
@@ -1752,7 +1752,7 @@ probe_device(snmp_cache_t *device) /* I - Device */
alarm(0);
}
- if (http);
+ if (http)
{
/*
* IPP is supported...
@@ -2455,5 +2455,5 @@ update_cache(snmp_cache_t *device, /* I - Device */
/*
- * End of "$Id: snmp.c 6049 2006-10-20 15:07:21Z mike $".
+ * End of "$Id: snmp.c 6090 2006-11-14 16:35:27Z mike $".
*/
diff --git a/backend/usb-darwin.c b/backend/usb-darwin.c
index 03e0373ff..d1da59b9b 100644
--- a/backend/usb-darwin.c
+++ b/backend/usb-darwin.c
@@ -1,5 +1,5 @@
/*
- * "$Id: usb-darwin.c 5630 2006-06-05 18:42:53Z mike $"
+ * "$Id: usb-darwin.c 6090 2006-11-14 16:35:27Z mike $"
*
* © Copyright 2005-2006 Apple Computer, Inc. All rights reserved.
*
@@ -198,12 +198,13 @@ 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);
-static kern_return_t registry_open(printer_data_t *printer);
+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 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);
@@ -255,6 +256,7 @@ 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);
@@ -263,9 +265,10 @@ print_device(const char *uri, /* I - Device URI */
resource++;
printer_data.uri = uri;
- printer_data.make = CFStringCreateWithCString(NULL, hostname, kCFStringEncodingUTF8);
- printer_data.model = CFStringCreateWithCString(NULL, resource, kCFStringEncodingUTF8);
- printer_data.serial = CFStringCreateWithCString(NULL, serial, kCFStringEncodingUTF8);
+
+ printer_data.make = cfstr_create_and_trim(hostname);
+ printer_data.model = cfstr_create_and_trim(resource);
+ printer_data.serial = cfstr_create_and_trim(serial);
fputs("STATE: +connecting-to-device\n", stderr);
@@ -281,7 +284,9 @@ print_device(const char *uri, /* I - Device URI */
iterate_printers(find_device_callback, &printer_data);
fprintf(stderr, "INFO: Opening Connection\n");
- status = registry_open(&printer_data);
+
+ driverBundlePath = NULL;
+ status = registry_open(&printer_data, &driverBundlePath);
#if defined(__i386__)
/*
* If we were unable to load the class drivers for this printer it's probably because they're ppc-only.
@@ -292,6 +297,26 @@ 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 );
@@ -508,7 +533,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(model, userData->model, kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
+ if (serial != NULL && CFStringCompare(serial, userData->serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
IOObjectRetain(obj);
userData->printerObj = obj;
keepLooking = false;
@@ -728,9 +753,11 @@ 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)
+static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *driverBundlePath)
{
IOCFPlugInInterface **iodev = NULL;
SInt32 score;
@@ -744,11 +771,10 @@ static kern_return_t load_printerdriver(printer_data_t *printer)
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)
@@ -764,9 +790,9 @@ static kern_return_t load_printerdriver(printer_data_t *printer)
* 'registry_open()' - Open a connection to the printer.
*/
-static kern_return_t registry_open(printer_data_t *printer)
+static kern_return_t registry_open(printer_data_t *printer, CFStringRef *driverBundlePath)
{
- kern_return_t kr = load_printerdriver(printer);
+ kern_return_t kr = load_printerdriver(printer, driverBundlePath);
if (kr != kIOReturnSuccess) {
kr = -2;
}
@@ -975,6 +1001,27 @@ 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.
@@ -1344,7 +1391,6 @@ static void *read_thread(void *reference)
return NULL;
}
-
/*
- * End of "$Id: usb-darwin.c 5630 2006-06-05 18:42:53Z mike $".
+ * End of "$Id: usb-darwin.c 6090 2006-11-14 16:35:27Z mike $".
*/
diff --git a/backend/usb-unix.c b/backend/usb-unix.c
index 47b2cf1f0..4a4cbe259 100644
--- a/backend/usb-unix.c
+++ b/backend/usb-unix.c
@@ -1,5 +1,5 @@
/*
- * "$Id: usb-unix.c 6032 2006-10-12 19:19:47Z mike $"
+ * "$Id: usb-unix.c 6111 2006-11-15 20:28:39Z mike $"
*
* USB port backend for the Common UNIX Printing System (CUPS).
*
@@ -84,8 +84,7 @@ 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") != 0 ||
- strstr(hostname, "Minolta") != NULL;
+ use_bc = strcasecmp(hostname, "Canon") && !strstr(hostname, "Minolta");
if ((device_fd = open_device(uri, &use_bc)) == -1)
{
@@ -525,5 +524,5 @@ open_device(const char *uri, /* I - Device URI */
/*
- * End of "$Id: usb-unix.c 6032 2006-10-12 19:19:47Z mike $".
+ * End of "$Id: usb-unix.c 6111 2006-11-15 20:28:39Z mike $".
*/
diff --git a/config-scripts/cups-common.m4 b/config-scripts/cups-common.m4
index 257f70933..7e54767fe 100644
--- a/config-scripts/cups-common.m4
+++ b/config-scripts/cups-common.m4
@@ -1,5 +1,5 @@
dnl
-dnl "$Id: cups-common.m4 6052 2006-10-20 20:35:41Z mike $"
+dnl "$Id: cups-common.m4 6092 2006-11-14 16:36:36Z mike $"
dnl
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
dnl
@@ -28,12 +28,9 @@ AC_PREREQ(2.50)
dnl Set the name of the config header file...
AC_CONFIG_HEADER(config.h)
-dnl Versio number information...
-CUPS_VERSION="1.2.6"
+dnl Version number information...
+CUPS_VERSION="1.2.7"
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)
@@ -267,5 +264,5 @@ AC_SUBST(DEFAULT_IPP_PORT)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT)
dnl
-dnl End of "$Id: cups-common.m4 6052 2006-10-20 20:35:41Z mike $".
+dnl End of "$Id: cups-common.m4 6092 2006-11-14 16:36:36Z mike $".
dnl
diff --git a/config-scripts/cups-defaults.m4 b/config-scripts/cups-defaults.m4
index 786411680..66810f9e5 100644
--- a/config-scripts/cups-defaults.m4
+++ b/config-scripts/cups-defaults.m4
@@ -1,5 +1,5 @@
dnl
-dnl "$Id: cups-defaults.m4 6003 2006-10-02 16:26:04Z mike $"
+dnl "$Id: cups-defaults.m4 6118 2006-11-16 13:34:44Z 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 ja pl sv")
+ LANGUAGES="de es et it 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 6003 2006-10-02 16:26:04Z mike $".
+dnl End of "$Id: cups-defaults.m4 6118 2006-11-16 13:34:44Z mike $".
dnl
diff --git a/cups/cups.h b/cups/cups.h
index bca22de82..9ae366298 100644
--- a/cups/cups.h
+++ b/cups/cups.h
@@ -1,5 +1,5 @@
/*
- * "$Id: cups.h 6052 2006-10-20 20:35:41Z mike $"
+ * "$Id: cups.h 6092 2006-11-14 16:36:36Z mike $"
*
* API definitions for the Common UNIX Printing System (CUPS).
*
@@ -61,10 +61,10 @@ extern "C" {
* Constants...
*/
-# define CUPS_VERSION 1.0206
+# define CUPS_VERSION 1.0207
# define CUPS_VERSION_MAJOR 1
# define CUPS_VERSION_MINOR 2
-# define CUPS_VERSION_PATCH 6
+# define CUPS_VERSION_PATCH 7
# define CUPS_DATE_ANY -1
@@ -244,5 +244,5 @@ extern cups_file_t *cupsTempFile2(char *filename, int len);
#endif /* !_CUPS_CUPS_H_ */
/*
- * End of "$Id: cups.h 6052 2006-10-20 20:35:41Z mike $".
+ * End of "$Id: cups.h 6092 2006-11-14 16:36:36Z mike $".
*/
diff --git a/cups/http-private.h b/cups/http-private.h
index bef934ed9..d5b030d28 100644
--- a/cups/http-private.h
+++ b/cups/http-private.h
@@ -1,5 +1,5 @@
/*
- * "$Id: http-private.h 5504 2006-05-10 18:57:46Z mike $"
+ * "$Id: http-private.h 6111 2006-11-15 20:28:39Z mike $"
*
* Private HTTP definitions for the Common UNIX Printing System (CUPS).
*
@@ -70,7 +70,8 @@ typedef int socklen_t;
# if defined HAVE_LIBSSL
/*
* The OpenSSL library provides its own SSL/TLS context structure for its
- * IO and protocol management...
+ * IO and protocol management. However, we need to provide our own BIO
+ * (basic IO) implementation to do timeouts...
*/
# include <openssl/err.h>
@@ -79,6 +80,8 @@ 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...
@@ -91,6 +94,11 @@ 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
@@ -105,15 +113,6 @@ 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,
@@ -187,5 +186,5 @@ extern void _cups_freeifaddrs(struct ifaddrs *addrs);
#endif /* !_CUPS_HTTP_PRIVATE_H_ */
/*
- * End of "$Id: http-private.h 5504 2006-05-10 18:57:46Z mike $".
+ * End of "$Id: http-private.h 6111 2006-11-15 20:28:39Z mike $".
*/
diff --git a/cups/http.c b/cups/http.c
index 169aece66..3e0fef0ed 100644
--- a/cups/http.c
+++ b/cups/http.c
@@ -1,5 +1,5 @@
/*
- * "$Id: http.c 5961 2006-09-16 19:08:36Z mike $"
+ * "$Id: http.c 6111 2006-11-15 20:28:39Z mike $"
*
* HTTP routines for the Common UNIX Printing System (CUPS).
*
@@ -25,6 +25,7 @@
*
* 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.
@@ -60,7 +61,8 @@
* 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 CDSA decryption code.
+ * _httpReadCDSA() - Read function for the CDSA library.
+ * _httpReadGNUTLS() - Read function for the GNU TLS library.
* httpReconnect() - Reconnect to a HTTP server...
* httpSetCookie() - Set the cookie value(s)...
* httpSetExpect() - Set the Expect: header in a request.
@@ -71,7 +73,14 @@
* 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 CDSA encryption code.
+ * _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.
* 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
@@ -118,7 +127,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);
+static int http_wait(http_t *http, int msec, int usessl);
static int http_write(http_t *http, const char *buffer,
int length);
static int http_write_chunk(http_t *http, const char *buffer,
@@ -168,6 +177,45 @@ 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.
*/
@@ -869,7 +917,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))
+ if (!http->blocking && !http_wait(http, 10000, 1))
{
DEBUG_puts("httpGets: Timed out!");
http->error = ETIMEDOUT;
@@ -1391,7 +1439,7 @@ httpRead2(http_t *http, /* I - HTTP connection */
#if defined(HAVE_SSL) && defined(HAVE_CDSASSL)
/*
- * '_httpReadCDSA()' - Read function for CDSA decryption code.
+ * '_httpReadCDSA()' - Read function for the CDSA library.
*/
OSStatus /* O - -1 on error, 0 on success */
@@ -1400,19 +1448,36 @@ _httpReadCDSA(
void *data, /* I - Data buffer */
size_t *dataLength) /* IO - Number of bytes */
{
- OSStatus result; /* Return value */
- ssize_t bytes; /* Number of bytes read */
- cdsa_conn_ref_t u; /* Connection reference union */
+ OSStatus result; /* Return value */
+ ssize_t bytes; /* Number of bytes read */
+ http_t *http; /* HTTP connection */
+
+
+ http = (http_t *)connection;
+ if (!http->blocking)
+ {
+ /*
+ * Make sure we have data before we read...
+ */
- u.connection = connection;
+ if (!http_wait(http, 10000, 0))
+ {
+ http->error = ETIMEDOUT;
+ return (-1);
+ }
+ }
do
- bytes = recv(u.sock, data, *dataLength, 0);
+ {
+ bytes = recv(http->fd, data, *dataLength, 0);
+ }
while (bytes == -1 && errno == EINTR);
if (bytes == *dataLength)
+ {
result = 0;
+ }
else if (bytes > 0)
{
*dataLength = bytes;
@@ -1430,11 +1495,45 @@ _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.
*/
@@ -1830,7 +1929,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));
+ return (http_wait(http, msec, 1));
}
@@ -1977,7 +2076,7 @@ httpWrite2(http_t *http, /* I - HTTP connection */
#if defined(HAVE_SSL) && defined(HAVE_CDSASSL)
/*
- * '_httpWriteCDSA()' - Write function for CDSA encryption code.
+ * '_httpWriteCDSA()' - Write function for the CDSA library.
*/
OSStatus /* O - -1 on error, 0 on success */
@@ -1986,19 +2085,23 @@ _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 */
- cdsa_conn_ref_t u; /* Connection reference union */
+ OSStatus result; /* Return value */
+ ssize_t bytes; /* Number of bytes read */
+ http_t *http; /* HTTP connection */
- u.connection = connection;
+ http = (http_t *)connection;
do
- bytes = write(u.sock, data, *dataLength);
+ {
+ bytes = write(http->fd, data, *dataLength);
+ }
while (bytes == -1 && errno == EINTR);
if (bytes == *dataLength)
+ {
result = 0;
+ }
else if (bytes >= 0)
{
*dataLength = bytes;
@@ -2014,11 +2117,164 @@ _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.
*/
@@ -2247,6 +2503,7 @@ 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;
@@ -2254,7 +2511,6 @@ 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 */
@@ -2265,9 +2521,12 @@ 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
@@ -2316,8 +2575,9 @@ 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)((long)http->fd));
+ 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);
if ((gnutls_handshake(conn->session)) != GNUTLS_E_SUCCESS)
{
@@ -2348,9 +2608,7 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */
* Use a union to resolve warnings about int/pointer size mismatches...
*/
- u.connection = NULL;
- u.sock = http->fd;
- error = SSLSetConnection(conn->session, u.connection);
+ error = SSLSetConnection(conn->session, http);
if (!error)
error = SSLSetIOFuncs(conn->session, _httpReadCDSA, _httpWriteCDSA);
@@ -2544,7 +2802,8 @@ 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 msec, /* I - Milliseconds to wait */
+ int usessl) /* I - Use SSL context? */
{
#ifndef WIN32
struct rlimit limit; /* Runtime limit */
@@ -2564,7 +2823,7 @@ http_wait(http_t *http, /* I - HTTP connection */
*/
#ifdef HAVE_SSL
- if (http->tls)
+ if (http->tls && usessl)
{
# ifdef HAVE_LIBSSL
if (SSL_pending((SSL *)(http->tls)))
@@ -2829,5 +3088,5 @@ http_write_ssl(http_t *http, /* I - HTTP connection */
/*
- * End of "$Id: http.c 5961 2006-09-16 19:08:36Z mike $".
+ * End of "$Id: http.c 6111 2006-11-15 20:28:39Z mike $".
*/
diff --git a/cups/libcups_s.exp b/cups/libcups_s.exp
index cad2f10af..71f9c7e69 100644
--- a/cups/libcups_s.exp
+++ b/cups/libcups_s.exp
@@ -28,6 +28,7 @@ _cups_freeifaddrs
_cups_strcpy
_cups_strlcat
_cups_strlcpy
+_httpBIOMethods
_ippAddAttr
_ippFreeAttr
_ppdGetEncoding
diff --git a/cups/transcode.c b/cups/transcode.c
index b0b5166fc..dc9d4dcb1 100644
--- a/cups/transcode.c
+++ b/cups/transcode.c
@@ -1,5 +1,5 @@
/*
- * "$Id: transcode.c 6038 2006-10-14 15:53:10Z mike $"
+ * "$Id: transcode.c 6115 2006-11-15 22:21:18Z mike $"
*
* Transcoding support for the Common UNIX Printing System (CUPS).
*
@@ -296,6 +296,38 @@ cupsCharsetToUTF8(
}
/*
+ * 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...
*/
@@ -364,6 +396,45 @@ cupsUTF8ToCharset(
}
/*
+ * 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...
*/
@@ -1584,5 +1655,5 @@ get_vbcs_charmap(
/*
- * End of "$Id: transcode.c 6038 2006-10-14 15:53:10Z mike $"
+ * End of "$Id: transcode.c 6115 2006-11-15 22:21:18Z mike $"
*/
diff --git a/desktop/cups.desktop b/desktop/cups.desktop
index 48ac645bb..0bb1c4620 100644
--- a/desktop/cups.desktop
+++ b/desktop/cups.desktop
@@ -23,3 +23,5 @@ 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 \ No newline at end of file
diff --git a/doc/help/spec-ppd.html b/doc/help/spec-ppd.html
index 621fbcc1a..089aef83d 100644
--- a/doc/help/spec-ppd.html
+++ b/doc/help/spec-ppd.html
@@ -8,7 +8,7 @@
</head>
<body>
<!--
- "$Id: spec-ppd.html 6025 2006-10-11 14:59:20Z mike $"
+ "$Id: spec-ppd.html 6096 2006-11-14 17:06:28Z mike $"
CUPS PPD extensions specification for the Common UNIX Printing System (CUPS).
@@ -95,11 +95,14 @@ 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 value is <code>true</code>.</p>
+default is <tt>true</tt> when <tt>cupsFlipDuplex</tt> is <tt>true</tt> and <tt>false</tt> otherwise.</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>
diff --git a/doc/it/images/button-accept-jobs.gif b/doc/it/images/button-accept-jobs.gif
new file mode 100644
index 000000000..394ae9362
--- /dev/null
+++ b/doc/it/images/button-accept-jobs.gif
Binary files differ
diff --git a/doc/it/images/button-add-class.gif b/doc/it/images/button-add-class.gif
new file mode 100644
index 000000000..46de12b99
--- /dev/null
+++ b/doc/it/images/button-add-class.gif
Binary files differ
diff --git a/doc/it/images/button-add-printer.gif b/doc/it/images/button-add-printer.gif
new file mode 100644
index 000000000..ad5349124
--- /dev/null
+++ b/doc/it/images/button-add-printer.gif
Binary files differ
diff --git a/doc/it/images/button-add-this-printer.gif b/doc/it/images/button-add-this-printer.gif
new file mode 100644
index 000000000..6a526bb66
--- /dev/null
+++ b/doc/it/images/button-add-this-printer.gif
Binary files differ
diff --git a/doc/it/images/button-cancel-all-jobs.gif b/doc/it/images/button-cancel-all-jobs.gif
new file mode 100644
index 000000000..3bad563cf
--- /dev/null
+++ b/doc/it/images/button-cancel-all-jobs.gif
Binary files differ
diff --git a/doc/it/images/button-cancel-job.gif b/doc/it/images/button-cancel-job.gif
new file mode 100644
index 000000000..cb12f3a8a
--- /dev/null
+++ b/doc/it/images/button-cancel-job.gif
Binary files differ
diff --git a/doc/it/images/button-change-settings.gif b/doc/it/images/button-change-settings.gif
new file mode 100644
index 000000000..4aefa0024
--- /dev/null
+++ b/doc/it/images/button-change-settings.gif
Binary files differ
diff --git a/doc/it/images/button-clean-print-heads.gif b/doc/it/images/button-clean-print-heads.gif
new file mode 100644
index 000000000..0ee6b674c
--- /dev/null
+++ b/doc/it/images/button-clean-print-heads.gif
Binary files differ
diff --git a/doc/it/images/button-clear.gif b/doc/it/images/button-clear.gif
new file mode 100644
index 000000000..c5e0c76b8
--- /dev/null
+++ b/doc/it/images/button-clear.gif
Binary files differ
diff --git a/doc/it/images/button-continue.gif b/doc/it/images/button-continue.gif
new file mode 100644
index 000000000..5287aa69b
--- /dev/null
+++ b/doc/it/images/button-continue.gif
Binary files differ
diff --git a/doc/it/images/button-delete-class.gif b/doc/it/images/button-delete-class.gif
new file mode 100644
index 000000000..d5c5a9ac9
--- /dev/null
+++ b/doc/it/images/button-delete-class.gif
Binary files differ
diff --git a/doc/it/images/button-delete-printer.gif b/doc/it/images/button-delete-printer.gif
new file mode 100644
index 000000000..a6f3d635d
--- /dev/null
+++ b/doc/it/images/button-delete-printer.gif
Binary files differ
diff --git a/doc/it/images/button-edit-configuration-file.gif b/doc/it/images/button-edit-configuration-file.gif
new file mode 100644
index 000000000..27dd66813
--- /dev/null
+++ b/doc/it/images/button-edit-configuration-file.gif
Binary files differ
diff --git a/doc/it/images/button-export-samba.gif b/doc/it/images/button-export-samba.gif
new file mode 100644
index 000000000..28011fe0e
--- /dev/null
+++ b/doc/it/images/button-export-samba.gif
Binary files differ
diff --git a/doc/it/images/button-help.gif b/doc/it/images/button-help.gif
new file mode 100644
index 000000000..729e4690b
--- /dev/null
+++ b/doc/it/images/button-help.gif
Binary files differ
diff --git a/doc/it/images/button-hold-job.gif b/doc/it/images/button-hold-job.gif
new file mode 100644
index 000000000..4f39dd9d2
--- /dev/null
+++ b/doc/it/images/button-hold-job.gif
Binary files differ
diff --git a/doc/it/images/button-manage-classes.gif b/doc/it/images/button-manage-classes.gif
new file mode 100644
index 000000000..5ced7e0d1
--- /dev/null
+++ b/doc/it/images/button-manage-classes.gif
Binary files differ
diff --git a/doc/it/images/button-manage-jobs.gif b/doc/it/images/button-manage-jobs.gif
new file mode 100644
index 000000000..0746c1a89
--- /dev/null
+++ b/doc/it/images/button-manage-jobs.gif
Binary files differ
diff --git a/doc/it/images/button-manage-printers.gif b/doc/it/images/button-manage-printers.gif
new file mode 100644
index 000000000..f9fc252b1
--- /dev/null
+++ b/doc/it/images/button-manage-printers.gif
Binary files differ
diff --git a/doc/it/images/button-manage-server.gif b/doc/it/images/button-manage-server.gif
new file mode 100644
index 000000000..e3bd6123b
--- /dev/null
+++ b/doc/it/images/button-manage-server.gif
Binary files differ
diff --git a/doc/it/images/button-modify-class.gif b/doc/it/images/button-modify-class.gif
new file mode 100644
index 000000000..162387158
--- /dev/null
+++ b/doc/it/images/button-modify-class.gif
Binary files differ
diff --git a/doc/it/images/button-modify-printer.gif b/doc/it/images/button-modify-printer.gif
new file mode 100644
index 000000000..0d1faace5
--- /dev/null
+++ b/doc/it/images/button-modify-printer.gif
Binary files differ
diff --git a/doc/it/images/button-move-job.gif b/doc/it/images/button-move-job.gif
new file mode 100644
index 000000000..cfd1a7a1f
--- /dev/null
+++ b/doc/it/images/button-move-job.gif
Binary files differ
diff --git a/doc/it/images/button-move-jobs.gif b/doc/it/images/button-move-jobs.gif
new file mode 100644
index 000000000..962919037
--- /dev/null
+++ b/doc/it/images/button-move-jobs.gif
Binary files differ
diff --git a/doc/it/images/button-print-self-test-page.gif b/doc/it/images/button-print-self-test-page.gif
new file mode 100644
index 000000000..fac427dea
--- /dev/null
+++ b/doc/it/images/button-print-self-test-page.gif
Binary files differ
diff --git a/doc/it/images/button-print-test-page.gif b/doc/it/images/button-print-test-page.gif
new file mode 100644
index 000000000..f443cc63b
--- /dev/null
+++ b/doc/it/images/button-print-test-page.gif
Binary files differ
diff --git a/doc/it/images/button-publish-printer.gif b/doc/it/images/button-publish-printer.gif
new file mode 100644
index 000000000..a4c17ba86
--- /dev/null
+++ b/doc/it/images/button-publish-printer.gif
Binary files differ
diff --git a/doc/it/images/button-reject-jobs.gif b/doc/it/images/button-reject-jobs.gif
new file mode 100644
index 000000000..4d624de03
--- /dev/null
+++ b/doc/it/images/button-reject-jobs.gif
Binary files differ
diff --git a/doc/it/images/button-release-job.gif b/doc/it/images/button-release-job.gif
new file mode 100644
index 000000000..eba16c715
--- /dev/null
+++ b/doc/it/images/button-release-job.gif
Binary files differ
diff --git a/doc/it/images/button-restart-job.gif b/doc/it/images/button-restart-job.gif
new file mode 100644
index 000000000..f0966978e
--- /dev/null
+++ b/doc/it/images/button-restart-job.gif
Binary files differ
diff --git a/doc/it/images/button-save-changes.gif b/doc/it/images/button-save-changes.gif
new file mode 100644
index 000000000..825393326
--- /dev/null
+++ b/doc/it/images/button-save-changes.gif
Binary files differ
diff --git a/doc/it/images/button-search.gif b/doc/it/images/button-search.gif
new file mode 100644
index 000000000..2e71d39cc
--- /dev/null
+++ b/doc/it/images/button-search.gif
Binary files differ
diff --git a/doc/it/images/button-set-allowed-users.gif b/doc/it/images/button-set-allowed-users.gif
new file mode 100644
index 000000000..2a436c066
--- /dev/null
+++ b/doc/it/images/button-set-allowed-users.gif
Binary files differ
diff --git a/doc/it/images/button-set-as-default.gif b/doc/it/images/button-set-as-default.gif
new file mode 100644
index 000000000..96365a12e
--- /dev/null
+++ b/doc/it/images/button-set-as-default.gif
Binary files differ
diff --git a/doc/it/images/button-set-printer-options.gif b/doc/it/images/button-set-printer-options.gif
new file mode 100644
index 000000000..b7246a6ea
--- /dev/null
+++ b/doc/it/images/button-set-printer-options.gif
Binary files differ
diff --git a/doc/it/images/button-show-active.gif b/doc/it/images/button-show-active.gif
new file mode 100644
index 000000000..27f1b1b42
--- /dev/null
+++ b/doc/it/images/button-show-active.gif
Binary files differ
diff --git a/doc/it/images/button-show-all.gif b/doc/it/images/button-show-all.gif
new file mode 100644
index 000000000..a3062db8f
--- /dev/null
+++ b/doc/it/images/button-show-all.gif
Binary files differ
diff --git a/doc/it/images/button-show-completed.gif b/doc/it/images/button-show-completed.gif
new file mode 100644
index 000000000..19c8b75f3
--- /dev/null
+++ b/doc/it/images/button-show-completed.gif
Binary files differ
diff --git a/doc/it/images/button-show-next.gif b/doc/it/images/button-show-next.gif
new file mode 100644
index 000000000..0acf7644e
--- /dev/null
+++ b/doc/it/images/button-show-next.gif
Binary files differ
diff --git a/doc/it/images/button-show-previous.gif b/doc/it/images/button-show-previous.gif
new file mode 100644
index 000000000..c07ccecc5
--- /dev/null
+++ b/doc/it/images/button-show-previous.gif
Binary files differ
diff --git a/doc/it/images/button-sort-ascending.gif b/doc/it/images/button-sort-ascending.gif
new file mode 100644
index 000000000..5999f5726
--- /dev/null
+++ b/doc/it/images/button-sort-ascending.gif
Binary files differ
diff --git a/doc/it/images/button-sort-descending.gif b/doc/it/images/button-sort-descending.gif
new file mode 100644
index 000000000..87379e11c
--- /dev/null
+++ b/doc/it/images/button-sort-descending.gif
Binary files differ
diff --git a/doc/it/images/button-start-class.gif b/doc/it/images/button-start-class.gif
new file mode 100644
index 000000000..1c6d28a86
--- /dev/null
+++ b/doc/it/images/button-start-class.gif
Binary files differ
diff --git a/doc/it/images/button-start-printer.gif b/doc/it/images/button-start-printer.gif
new file mode 100644
index 000000000..8e48a07bd
--- /dev/null
+++ b/doc/it/images/button-start-printer.gif
Binary files differ
diff --git a/doc/it/images/button-stop-class.gif b/doc/it/images/button-stop-class.gif
new file mode 100644
index 000000000..94577a157
--- /dev/null
+++ b/doc/it/images/button-stop-class.gif
Binary files differ
diff --git a/doc/it/images/button-stop-printer.gif b/doc/it/images/button-stop-printer.gif
new file mode 100644
index 000000000..ae1d08858
--- /dev/null
+++ b/doc/it/images/button-stop-printer.gif
Binary files differ
diff --git a/doc/it/images/button-unpublish-printer.gif b/doc/it/images/button-unpublish-printer.gif
new file mode 100644
index 000000000..797f22794
--- /dev/null
+++ b/doc/it/images/button-unpublish-printer.gif
Binary files differ
diff --git a/doc/it/images/button-use-default-config.gif b/doc/it/images/button-use-default-config.gif
new file mode 100644
index 000000000..fd8622226
--- /dev/null
+++ b/doc/it/images/button-use-default-config.gif
Binary files differ
diff --git a/doc/it/images/button-view-access-log.gif b/doc/it/images/button-view-access-log.gif
new file mode 100644
index 000000000..1d67c85fb
--- /dev/null
+++ b/doc/it/images/button-view-access-log.gif
Binary files differ
diff --git a/doc/it/images/button-view-error-log.gif b/doc/it/images/button-view-error-log.gif
new file mode 100644
index 000000000..edcc05b08
--- /dev/null
+++ b/doc/it/images/button-view-error-log.gif
Binary files differ
diff --git a/doc/it/images/button-view-page-log.gif b/doc/it/images/button-view-page-log.gif
new file mode 100644
index 000000000..d48d7721e
--- /dev/null
+++ b/doc/it/images/button-view-page-log.gif
Binary files differ
diff --git a/doc/it/images/button-view-printable-version.gif b/doc/it/images/button-view-printable-version.gif
new file mode 100644
index 000000000..f01d634bf
--- /dev/null
+++ b/doc/it/images/button-view-printable-version.gif
Binary files differ
diff --git a/doc/it/index.html.in b/doc/it/index.html.in
new file mode 100644
index 000000000..a501ee4d1
--- /dev/null
+++ b/doc/it/index.html.in
@@ -0,0 +1,138 @@
+<!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="">&nbsp;&nbsp;Principale&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/admin/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Amministrazione&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/classes/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Classi&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/help/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Documentazione/Guida&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/jobs/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Operazioni&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/printers/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Stampanti&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15">&nbsp;</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&eacute; 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>&reg;</SUP>. Sviluppato e
+gestito da <A HREF="http://www.easysw.com">Easy Software
+Products</a> per promuovere una soluzione di stampa standard. CUPS &egrave; il
+sistema di stampa standard utilizzato su MacOS<SUP>&reg;</SUP> X e sulla
+maggior parte delle distribuzioni Linux<SUP>&reg;</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&agrave; 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">&nbsp;</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 &egrave; 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>
diff --git a/filter/pstops.c b/filter/pstops.c
index 7126c5e0e..69dce4f54 100644
--- a/filter/pstops.c
+++ b/filter/pstops.c
@@ -1,5 +1,5 @@
/*
- * "$Id: pstops.c 6025 2006-10-11 14:59:20Z mike $"
+ * "$Id: pstops.c 6094 2006-11-14 16:54:50Z mike $"
*
* PostScript filter for the Common UNIX Printing System (CUPS).
*
@@ -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,6 +1263,44 @@ 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) ||
@@ -3068,5 +3106,5 @@ write_labels(pstops_doc_t *doc, /* I - Document information */
/*
- * End of "$Id: pstops.c 6025 2006-10-11 14:59:20Z mike $".
+ * End of "$Id: pstops.c 6094 2006-11-14 16:54:50Z mike $".
*/
diff --git a/locale/cups_it.po b/locale/cups_it.po
new file mode 100644
index 000000000..4ea69f070
--- /dev/null
+++ b/locale/cups_it.po
@@ -0,0 +1,2819 @@
+# translation of cups_it.po to Italian
+#
+# "$Id$"
+# Message catalog template for the Common UNIX Printing System (CUPS).#
+# Copyright 2005-2006 by Easy Software Products.#
+# These coded instructions, statements, and computer programs are the
+# property of Easy Software Products and are protected by Federal
+# copyright law. Distribution and use rights are outlined in the file
+# "LICENSE.txt" which should have been included with this file. If this
+# file is missing or damaged please contact Easy Software Products
+# at:#
+# Attn: CUPS Licensing Information
+# Easy Software Products
+# 44141 Airport View Drive, Suite 204
+# Hollywood, Maryland 20636 USA#
+# Voice: (301) 373-9600
+# EMail: cups-info@cups.org
+# WWW: http://www.cups.org
+#
+# Vincenzo Reale <smart2128@baslug.org>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: cups_it\n"
+"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
+"POT-Creation-Date: 2006-05-21 10:08-0400\n"
+"PO-Revision-Date: 2006-11-16 00:34+0100\n"
+"Last-Translator: Vincenzo Reale <smart2128@baslug.org>\n"
+"Language-Team: Italian <kde-i18n-it@mail.kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+msgid "Options Installed"
+msgstr "Opzioni installate"
+
+msgid "Class"
+msgstr "Classe"
+
+msgid "Printer"
+msgstr "Stampante"
+
+msgid "Extra"
+msgstr "Extra"
+
+msgid "General"
+msgstr "Generale"
+
+msgid "Media Size"
+msgstr "Dimensione supporto"
+
+msgid "Media Type"
+msgstr "Tipo supporto"
+
+msgid "Media Source"
+msgstr "Sorgente supporto"
+
+msgid "Output Mode"
+msgstr "Modalità di uscita"
+
+msgid "Resolution"
+msgstr "Risoluzione"
+
+msgid "Variable"
+msgstr "Variabile"
+
+msgid "Yes"
+msgstr "Sì"
+
+msgid "No"
+msgstr "No"
+
+msgid "Auto"
+msgstr "Auto"
+
+msgid "Enter your username and password or the root username and password to access this page."
+msgstr "Inserisci il tuo nome utente e la tua password o il nome utente e la password di root per accedere a questa pagina."
+
+msgid "You must use a https: URL to access this page."
+msgstr "Devi usare un URL https: per accedere a questa pagina."
+
+#, c-format
+msgid "Bad request version number %d.%d!"
+msgstr "Richiesta errata del numero di versione %d.%d!"
+
+msgid "No attributes in request!"
+msgstr "Nessun attributo nella richiesta!"
+
+#, c-format
+msgid "Attribute groups are out of order (%x < %x)!"
+msgstr "I gruppi di attributi non sono ordinati (%x < %x)!"
+
+msgid "Missing required attributes!"
+msgstr "Attributi richiesti mancanti!"
+
+#, c-format
+msgid "%s not supported!"
+msgstr "%s non supportato!"
+
+msgid "The printer or class was not found."
+msgstr "La stampante o la classe non è stata trovata."
+
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+msgstr "printer-uri deve essere nella forma \"ipp://NOMEHOST/classes/NOMECLASSE\"."
+
+#, c-format
+msgid "The printer-uri \"%s\" contains invalid characters."
+msgstr "printer-uri \"%s\" contiene caratteri non validi."
+
+#, c-format
+msgid "A printer named \"%s\" already exists!"
+msgstr "Una stampante con nome \"%s\" già esiste!"
+
+#, c-format
+msgid "Attempt to set %s printer-state to bad value %d!"
+msgstr "Tentativo di impostare printer-state %s a un valore errato %d!"
+
+#, c-format
+msgid "add_class: Unknown printer-op-policy \"%s\"."
+msgstr "add_class: printer-op-policy \"%s\" sconosciuto."
+
+#, c-format
+msgid "add_class: Unknown printer-error-policy \"%s\"."
+msgstr "add_class: printer-error-policy \"%s\" sconosciuto."
+
+msgid "Unable to allocate memory for file types!"
+msgstr "Impossibile allocare memoria per questo i tipi di file!"
+
+#, c-format
+msgid "Character set \"%s\" not supported!"
+msgstr "Set di caratteri \"%s\" non supportato!"
+
+#, c-format
+msgid "Language \"%s\" not supported!"
+msgstr "Lingua \"%s\" non supportata!"
+
+#, c-format
+msgid "The notify-user-data value is too large (%d > 63 octets)!"
+msgstr "Il valore notify-user-data è troppo grande (%d > 63 ottetti)!"
+
+msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
+msgstr "L'attributo notify-lease-duration non può essere usato con le sottoscrizioni delle operazioni."
+
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr "printer-uri deve essere nella forma \"ipp://NOMEHOST/printers/NOMESTAMPANTE\"."
+
+#, c-format
+msgid "A class named \"%s\" already exists!"
+msgstr "Una classe con nome \"%s\" già esiste!"
+
+#, c-format
+msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
+msgstr "Gli URI del file di dispositivo sono stati disabilitati! Per abilitarli, vedere la direttiva FileDevice in \"%s/cupsd.conf\"."
+
+#, c-format
+msgid "Bad device-uri \"%s\"!"
+msgstr "device-uri \"%s\" errato!"
+
+#, c-format
+msgid "Bad port-monitor \"%s\"!"
+msgstr "port-monitor \"%s\" errato!"
+
+#, c-format
+msgid "Bad printer-state value %d!"
+msgstr "Valore printer-state %d errato!"
+
+#, c-format
+msgid "Unknown printer-op-policy \"%s\"."
+msgstr "printer-op-policy \"%s\" sconosciuto."
+
+#, c-format
+msgid "Unknown printer-error-policy \"%s\"."
+msgstr "printer-error-policy \"%s\" sconosciuto."
+
+#, c-format
+msgid "Unable to copy interface script - %s!"
+msgstr "Impossibile copiare lo script di interfaccia - %s!"
+
+#, c-format
+msgid "Unable to copy PPD file - %s!"
+msgstr "Impossibile copiare il file PPD - %s!"
+
+msgid "Unable to copy PPD file!"
+msgstr "Impossibile copiare il file PPD!"
+
+msgid "Got a printer-uri attribute but no job-id!"
+msgstr "Ottenuto un attributo printer-uri, ma nessun job-id!"
+
+#, c-format
+msgid "Bad job-uri attribute \"%s\"!"
+msgstr "Attributo job-uri \"%s\" errato!"
+
+#, c-format
+msgid "Job #%d doesn't exist!"
+msgstr "L'operazione #%d non esiste!"
+
+#, c-format
+msgid "Job #%d is not held for authentication!"
+msgstr "L'operazione #%d non è bloccata per l'autenticazione!"
+
+#, c-format
+msgid "You are not authorized to authenticate job #%d owned by \"%s\"!"
+msgstr "Non sei autorizzato ad autenticare l'operazione #%d di proprietà di \"%s\"!"
+
+msgid "The printer-uri attribute is required!"
+msgstr "L'attributo printer-uri è richiesto!"
+
+msgid "Missing requesting-user-name attribute!"
+msgstr "Attributo requesting-user-name mancante!"
+
+#, c-format
+msgid "The printer-uri \"%s\" is not valid."
+msgstr "printer-uri \"%s\" non valido."
+
+#, c-format
+msgid "No active jobs on %s!"
+msgstr "Nessuna operazione attiva su %s!"
+
+#, c-format
+msgid "You are not authorized to delete job #%d owned by \"%s\"!"
+msgstr "Non sei autorizzato ad eliminare l'operazione #%d di proprietà di \"%s\"!"
+
+#, c-format
+msgid "Job #%d is already %s - can't cancel."
+msgstr "L'operazione #%d è già %s - impossibile annullare."
+
+msgid "The printer or class is not shared!"
+msgstr "La stampante o la classe non è condivisa!"
+
+#, c-format
+msgid "Destination \"%s\" is not accepting jobs."
+msgstr "La destinazione \"%s\" non accetta operazioni."
+
+#, c-format
+msgid "Bad copies value %d."
+msgstr "Numero di copie %d errato."
+
+#, c-format
+msgid "Bad page-ranges values %d-%d."
+msgstr "Valori page-ranges %d-%d errati."
+
+msgid "Too many active jobs."
+msgstr "Troppe operazioni attive."
+
+msgid "Quota limit reached."
+msgstr "Limite di quota raggiunto."
+
+#, c-format
+msgid "Unable to add job for destination \"%s\"!"
+msgstr "Impossibile aggiungere operazioni per la destinazione \"%s\"!"
+
+msgid "No subscription attributes in request!"
+msgstr "Nessun attributo di sottoscrizione nella richiesta!"
+
+msgid "notify-events not specified!"
+msgstr "notify-events non specificato!"
+
+#, c-format
+msgid "Job %d not found!"
+msgstr "Operazione %d non trovata!"
+
+msgid "No default printer"
+msgstr "Nessuna stampante predefinita"
+
+msgid "cups-deviced failed to execute."
+msgstr "esecuzione di cups-deviced fallita."
+
+msgid "cups-driverd failed to execute."
+msgstr "esecuzione di cups-driverd fallita."
+
+msgid "No destinations added."
+msgstr "Nessuna destinazione aggiunta."
+
+#, c-format
+msgid "notify-subscription-id %d no good!"
+msgstr "notify-subscription-id %d non corretto!"
+
+#, c-format
+msgid "Job #%s does not exist!"
+msgstr "L'operazione #%s non esiste!"
+
+#, c-format
+msgid "Job #%d does not exist!"
+msgstr "L'operazione #%d non esiste!"
+
+msgid "No subscriptions found."
+msgstr "Nessuna sottoscrizione trovata."
+
+#, c-format
+msgid "Not authorized to hold job #%d owned by \"%s\"!"
+msgstr "Non autorizzato a bloccare l'operazione #%d di proprietà di \"%s\"!"
+
+#, c-format
+msgid "Job #%d is finished and cannot be altered!"
+msgstr "L'operazione #%d è terminata e non può essere modificata!"
+
+#, c-format
+msgid "You are not authorized to move job #%d owned by \"%s\"!"
+msgstr "Non sei autorizzato a spostare l'operazione #%d di proprietà di \"%s\"!"
+
+msgid "job-printer-uri attribute missing!"
+msgstr "attributo job-printer-uri mancante!"
+
+#, c-format
+msgid "Unsupported compression \"%s\"!"
+msgstr "Compressione \"%s\" non supportata!"
+
+msgid "No file!?!"
+msgstr "Nessun file!?!"
+
+#, c-format
+msgid "Could not scan type \"%s\"!"
+msgstr "Impossibile analizzare il tipo \"%s\"!"
+
+#, c-format
+msgid "Unsupported format '%s/%s'!"
+msgstr "Formato '%s/%s' non supportato!"
+
+msgid "Printer not shared!"
+msgstr "Stampante non condivisa!"
+
+#, c-format
+msgid "Too many jobs - %d jobs, max jobs is %d."
+msgstr "Troppe operazioni - %d operazioni, il massimo è %d."
+
+#, c-format
+msgid "Job #%d is not held!"
+msgstr "L'operazione #%d non è bloccata!"
+
+#, c-format
+msgid "You are not authorized to release job id %d owned by \"%s\"!"
+msgstr "Non sei autorizzata a rilasciare l'operazione con id %d di proprietà di \"%s\"!"
+
+#, c-format
+msgid "Job #%d is not complete!"
+msgstr "L'operazione %d non è completa!"
+
+#, c-format
+msgid "Job #%d cannot be restarted - no files!"
+msgstr "L'operazione #%d non può essere riavviata - nessun file!"
+
+#, c-format
+msgid "You are not authorized to restart job id %d owned by \"%s\"!"
+msgstr "Non sei autorizzato a riavviare l'operazione con id %d di proprietà di \"%s\"!"
+
+#, c-format
+msgid "You are not authorized to send document for job #%d owned by \"%s\"!"
+msgstr "Non sei autorizzato a inviare il documento per l'operazione #%d di proprietà di \"%s\"!"
+
+#, c-format
+msgid "Bad document-format \"%s\"!"
+msgstr "document-format \"%s\" errato!"
+
+#, c-format
+msgid "You are not authorized to alter job id %d owned by \"%s\"!"
+msgstr "Non sei autorizzato a modificare l'operazione con id %d di proprietà di \"%s\"!"
+
+#, c-format
+msgid "%s cannot be changed."
+msgstr "%s non può essere cambiato."
+
+msgid "Bad job-priority value!"
+msgstr "Valore job-priority errato!"
+
+msgid "Job is completed and cannot be changed."
+msgstr "L'operazione è completata e non può essere cambiata."
+
+msgid "Bad job-state value!"
+msgstr "Valore job-state errato!"
+
+msgid "Job state cannot be changed."
+msgstr "Lo stato dell'operazione non può essere cambiato."
+
+#, c-format
+msgid "Unsupported compression attribute %s!"
+msgstr "Attributo di compressione %s non supportato!"
+
+#, c-format
+msgid "Unsupported format \"%s\"!"
+msgstr "Formato \"%s\" non supportato!"
+
+#, c-format
+msgid "%s is not implemented by the CUPS version of lpc.\n"
+msgstr "%s non è implementato dalla versione CUPS di lpc.\n"
+
+msgid ""
+"Commands may be abbreviated. Commands are:\n"
+"\n"
+"exit help quit status ?\n"
+msgstr ""
+"I comandi possono essere abbreviati. I comandi sono:\n"
+"\n"
+"exit help quit status ?\n"
+
+msgid "help\t\tget help on commands\n"
+msgstr "help\t\tguida dei comandi\n"
+
+msgid "status\t\tshow status of daemon and queue\n"
+msgstr "status\t\tmostra lo stato del demone e della coda\n"
+
+msgid "?Invalid help command unknown\n"
+msgstr "Comando sconosciuto - guida non disponibile\n"
+
+#, c-format
+msgid "\tprinter is on device '%s' speed -1\n"
+msgstr "\tla stampante è sul dispositivo '%s' velocità -1\n"
+
+msgid "\tqueuing is enabled\n"
+msgstr "\tla coda è abilitata\n"
+
+msgid "\tqueuing is disabled\n"
+msgstr "\tla coda è disabilitata\n"
+
+msgid "\tprinting is enabled\n"
+msgstr "\tla stampa è abilitata\n"
+
+msgid "\tprinting is disabled\n"
+msgstr "\tla stampa è disabilitata\n"
+
+msgid "\tno entries\n"
+msgstr "\tnessuna voce\n"
+
+#, c-format
+msgid "\t%d entries\n"
+msgstr "\t%d voci\n"
+
+msgid "\tdaemon present\n"
+msgstr "\tdemone presente\n"
+
+msgid "lpq: Unable to contact server!\n"
+msgstr "lpq: Impossibile contattare il server!\n"
+
+#, c-format
+msgid "%s: Sorry, no encryption support compiled in!\n"
+msgstr "%s: Spiacente, nessun supporto di cifratura compilato!\n"
+
+#, c-format
+msgid "lpq: Unknown destination \"%s/%s\"!\n"
+msgstr "lpq: Destinazione \"%s/%s\" sconosciuta!\n"
+
+#, c-format
+msgid "lpq: Unknown destination \"%s\"!\n"
+msgstr "lpq: Destinazione \"%s\" sconosciuta!\n"
+
+#, c-format
+msgid "lp: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lp: errore - i nomi della variabile d'ambiente %s non esistono nella destinazione \"%s\"!\n"
+
+msgid "lpq: error - no default destination available.\n"
+msgstr "lpq: errore - nessuna destinazione predefinita disponibile.\n"
+
+#, c-format
+msgid "lpq: get-jobs failed: %s\n"
+msgstr "lpq: get-jobs fallito: %s\n"
+
+msgid "Rank Owner Pri Job Files Total Size\n"
+msgstr "Posiz. Proprietario Stamp. Operaz. File Dim. totali\n"
+
+msgid "Rank Owner Job File(s) Total Size\n"
+msgstr "Posiz. Proprietario Operaz. File Dim. totali\n"
+
+#, c-format
+msgid "%s: %-33.33s [job %d localhost]\n"
+msgstr "%s: %-33.33s [operazione %d localhost]\n"
+
+#, c-format
+msgid " %-39.39s %.0f bytes\n"
+msgstr " %-39.39s %.0f byte\n"
+
+#, c-format
+msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"
+msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n"
+
+#, c-format
+msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"
+msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n"
+
+msgid "no entries\n"
+msgstr "nessuna voce\n"
+
+#, c-format
+msgid "lpq: get-printer-attributes failed: %s\n"
+msgstr "lpq: get-printer-attributes fallito: %s\n"
+
+#, c-format
+msgid "%s is ready\n"
+msgstr "%s è pronta\n"
+
+#, c-format
+msgid "%s is ready and printing\n"
+msgstr "%s è pronta e stampa\n"
+
+#, c-format
+msgid "%s is not ready\n"
+msgstr "%s non è pronta\n"
+
+msgid "Usage: lpq [-P dest] [-l] [+interval]\n"
+msgstr "Uso: lpq [-P dest] [-l] [+intervallo]\n"
+
+#, c-format
+msgid "lpr: error - expected value after -%c option!\n"
+msgstr "lpr: errore - valore atteso dopo l'opzione -%c!\n"
+
+#, c-format
+msgid "lpr: warning - '%c' format modifier not supported - output may not be correct!\n"
+msgstr "lpr: attenzione - il modificatore di formato '%c' non è supportato - il risultato potrebbe non essere corretto!\n"
+
+msgid "lpr: error - expected option=value after -o option!\n"
+msgstr "lpr: errore - attesa opzione=valore dopo l'opzione -o !\n"
+
+msgid "lpr: warning - email notification is not currently supported!\n"
+msgstr "lpr: attenzione - le notifiche via email non sono al momento supportate!\n"
+
+msgid "lpr: error - expected destination after -P option!\n"
+msgstr "lpr: errore - destinazione attesa dopo l'opzione -P!\n"
+
+msgid "lpr: error - expected copy count after -# option!\n"
+msgstr "lpr: errore - numero di copie atteso dopo l'opzione -#!\n"
+
+#, c-format
+msgid "lpr: error - expected name after -%c option!\n"
+msgstr "lpr: errore - nome atteso dopo l'opzione -%c!\n"
+
+msgid "lpr: error - expected username after -U option!\n"
+msgstr "lpr: errore - nome utente atteso dopo l'opzione -U!\n"
+
+#, c-format
+msgid "lpr: error - unknown option '%c'!\n"
+msgstr "lpr: errore - opzione'%c' sconosciuta!\n"
+
+#, c-format
+msgid "lpr: error - unable to access \"%s\" - %s\n"
+msgstr "lpr: errore - impossibile accedere a \"%s\" - %s\n"
+
+#, c-format
+msgid "lpr: error - too many files - \"%s\"\n"
+msgstr "lpr: errore - troppi file - \"%s\"\n"
+
+#, c-format
+msgid "lpr: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lpr: errore - i nomi della variabile d'ambiente %s non esistono nella destinazione \"%s\"!\n"
+
+msgid "lpr: error - no default destination available.\n"
+msgstr "lpr: errore - nessuna destinazione predefinita disponibile.\n"
+
+msgid "lpr: error - scheduler not responding!\n"
+msgstr "lpr: errore - il pianificatore di operazioni non risponde!\n"
+
+#, c-format
+msgid "lpr: error - unable to create temporary file \"%s\" - %s\n"
+msgstr "lpr: errore - impossible creare il file temporaneo \"%s\" - %s\n"
+
+#, c-format
+msgid "lpr: error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "lpr: errore - impossible scrivere il file temporaneo \"%s\" - %s\n"
+
+msgid "lpr: error - stdin is empty, so no job has been sent.\n"
+msgstr "lpr: errore - stdin è vuoto, nessuna operazione può essere inviata.\n"
+
+#, c-format
+msgid "lpr: error - unable to print file: %s\n"
+msgstr "lpr: errore - impossibile stampare il file: %s\n"
+
+msgid "lprm: Unable to contact server!\n"
+msgstr "lprm: Impossibile contattare il server!\n"
+
+#, c-format
+msgid "lprm: Unknown destination \"%s\"!\n"
+msgstr "lprm: Destinazione \"%s\" sconosciuta!\n"
+
+#, c-format
+msgid "lprm: Unknown option '%c'!\n"
+msgstr "lprm: Opzione '%c' sconosciuta!\n"
+
+msgid "lprm: Job or printer not found!\n"
+msgstr "lprm: Operazione o stampante non trovata!\n"
+
+msgid "lprm: Not authorized to lprm job(s)!\n"
+msgstr "lprm: Non autorizzato a operazioni lprm!\n"
+
+#, c-format
+msgid "lprm: You don't own job ID %d!\n"
+msgstr "lprm: Non sei il proprietario dell'operazione con ID %d!\n"
+
+msgid "lprm: Unable to lprm job(s)!\n"
+msgstr "lprm: Impossibile eseguire operazioni lprm!\n"
+
+msgid "lprm: Unable to cancel job(s)!\n"
+msgstr "lprm: Impossibile annullare operazioni!\n"
+
+#, c-format
+msgid "%s: Don't know what to do!\n"
+msgstr "%s: Non so cosa fare!\n"
+
+#, c-format
+msgid "%s: Expected server name after -h!\n"
+msgstr "%s: Nome server atteso dopo -h!\n"
+
+#, c-format
+msgid "%s: Expected reason text after -r!\n"
+msgstr "%s: Atteso testo di motivazione dopo -r!\n"
+
+#, c-format
+msgid "%s: Unknown option '%c'!\n"
+msgstr "%s: Opzione '%c' sconosciuta!\n"
+
+#, c-format
+msgid "%s: Unable to connect to server: %s\n"
+msgstr "%s: Impossibile connettersi al server: %s\n"
+
+#, c-format
+msgid "%s: Operation failed: %s\n"
+msgstr "%s: Operazione fallita: %s\n"
+
+msgid "cancel: Error - expected hostname after '-h' option!\n"
+msgstr "cancel: Errore - nome host atteso dopo l'opzione '-h'!\n"
+
+msgid "cancel: Error - expected username after '-u' option!\n"
+msgstr "cancel: Errore - nome utente atteso dopo l'opzione '-u'!\n"
+
+#, c-format
+msgid "cancel: Unknown option '%c'!\n"
+msgstr "cancel: Opzione '%c' sconosciuta!\n"
+
+#, c-format
+msgid "cancel: Unknown destination \"%s\"!\n"
+msgstr "cancel: Destinazione \"%s\" sconosciuta!\n"
+
+msgid "cancel: Unable to contact server!\n"
+msgstr "cancel: Impossibile contattare il server!\n"
+
+#, c-format
+msgid "cancel: %s failed: %s\n"
+msgstr "cancel: %s fallito: %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Missing value on line %d!\n"
+msgstr "cupsaddsmb: Valore mancante alla riga %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Missing double quote on line %d!\n"
+msgstr "cupsaddsmb: Doppi apici mancanti alla riga %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Bad option + choice on line %d!\n"
+msgstr "cupsaddsmb: Opzione + scelta errata alla riga %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to connect to server \"%s\" for %s - %s\n"
+msgstr "cupsaddsmb: Impossibile connettersi al server \"%s\" per %s - %s\n"
+
+#, c-format
+msgid "cupsaddsmb: No PPD file for printer \"%s\" - skipping!\n"
+msgstr "cupsaddsmb: Nessun file PPD per la stampante \"%s\" - omesso!\n"
+
+#, c-format
+msgid "cupsaddsmb: get-printer-attributes failed for \"%s\": %s\n"
+msgstr "cupsaddsmb: get-printer-attributes fallito per \"%s\": %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to convert PPD file for %s - %s\n"
+msgstr "cupsaddsmb: Impossibile convertire il file PPD per %s - %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy Windows 2000 printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Impossibile copiare i file del driver di stampa di Windows 2000 (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy CUPS printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Impossibile copiare i file del driver di stampa di CUPS (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to install Windows 2000 printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Impossibile installare i file del driver di stampa di Windows 2000 (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy Windows 9x printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Impossibile copiare i file del driver di stampa di Windows 9x (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to install Windows 9x printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Impossibile installare i file del driver di stampa di Windows 9x (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to set Windows printer driver (%d)!\n"
+msgstr "cupsaddsmb: Impossibile configurare i file del driver di stampa di Windows (%d)!\n"
+
+msgid ""
+"Usage: cupsaddsmb [options] printer1 ... printerN\n"
+" cupsaddsmb [options] -a\n"
+"\n"
+"Options:\n"
+" -H samba-server Use the named SAMBA server\n"
+" -U samba-user Authenticate using the named SAMBA user\n"
+" -a Export all printers\n"
+" -h cups-server Use the named CUPS server\n"
+" -v Be verbose (show commands)\n"
+msgstr ""
+"Uso: cupsaddsmb [opzioni] stampante1 ... stampanteN\n"
+" cupsaddsmb [opzioni] -a\n"
+"\n"
+"Opzioni:\n"
+" -H samba-server Usa il server SAMBA specificato\n"
+" -U samba-user Autenticazione usando l'utente SAMBA specificato\n"
+" -a Esporta tutte le stampanti\n"
+" -h cups-server Usa il server CUPS specificato\n"
+" -v Prolisso (mostra i comandi)\n"
+
+msgid "cupstestppd: The -q option is incompatible with the -v option.\n"
+msgstr "cupstestppd: L'opzione -q è incompatibile con l'opzione -v.\n"
+
+msgid "cupstestppd: The -v option is incompatible with the -q option.\n"
+msgstr "cupstestppd: L'opzione -v è incompatibile con l'opzione -q.\n"
+
+#, c-format
+msgid ""
+" FAIL\n"
+" **FAIL** Unable to open PPD file - %s\n"
+msgstr ""
+" FAIL\n"
+" **FAIL** Impossibile aprire il file PPD - %s\n"
+
+#, c-format
+msgid ""
+" FAIL\n"
+" **FAIL** Unable to open PPD file - %s on line %d.\n"
+msgstr ""
+" FAIL\n"
+" **FAIL** Impossibile aprire il file PPD - %s alla riga %d.\n"
+
+msgid " REF: Page 42, section 5.2.\n"
+msgstr " RIF: Pagina 42, sezione 5.2.\n"
+
+msgid " REF: Page 20, section 3.4.\n"
+msgstr " RIF: Pagina 20, sezione 3.4.\n"
+
+msgid " REF: Pages 45-46, section 5.2.\n"
+msgstr " RIF: Pagine 45-46, sezione 5.2.\n"
+
+msgid " REF: Pages 42-45, section 5.2.\n"
+msgstr " RIF: Pagine 42-45, sezione 5.2.\n"
+
+msgid " REF: Pages 48-49, section 5.2.\n"
+msgstr " RIF: Pagine 48-49, sezione 5.2.\n"
+
+msgid " REF: Pages 52-54, section 5.2.\n"
+msgstr " RIF: Pagine 52-54, sezione 5.2.\n"
+
+msgid " REF: Page 15, section 3.2.\n"
+msgstr " RIF: Pagina 15, sezione 3.2.\n"
+
+msgid " REF: Page 15, section 3.1.\n"
+msgstr " RIF: Pagina 15, sezione 3.1.\n"
+
+msgid " REF: Pages 16-17, section 3.2.\n"
+msgstr " RIF: Pagine 16-17, sezione 3.2.\n"
+
+msgid " REF: Page 19, section 3.3.\n"
+msgstr " RIF: Pagina 19, sezione 3.3.\n"
+
+msgid " REF: Page 27, section 3.5.\n"
+msgstr " RIF: Pagina 27, sezione 3.5.\n"
+
+msgid ""
+"\n"
+" DETAILED CONFORMANCE TEST RESULTS\n"
+msgstr ""
+"\n"
+" RISULTATI DETTAGLIATI DEL TEST DI CONFORMITÀ\n"
+
+#, c-format
+msgid " WARN %s has no corresponding options!\n"
+msgstr " WARN %s non ha opzioni corrispondenti!\n"
+
+msgid " FAIL\n"
+msgstr " FAIL\n"
+
+msgid ""
+" **FAIL** REQUIRED DefaultImageableArea\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **FAIL** DefaultImageableArea RICHIESTO\n"
+" RIF: Pagina 102, sezione 5.15.\n"
+
+#, c-format
+msgid ""
+" **FAIL** BAD DefaultImageableArea %s!\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **FAIL** DefaultImageableArea %s ERRATO!\n"
+" RIF: Pagina 102, sezione 5.15.\n"
+
+msgid " PASS DefaultImageableArea\n"
+msgstr " PASS DefaultImageableArea\n"
+
+msgid ""
+" **FAIL** REQUIRED DefaultPaperDimension\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **FAIL** DefaultPaperDimension RICHIESTO\n"
+" RIF: Pagina 103, sezione 5.15.\n"
+
+#, c-format
+msgid ""
+" **FAIL** BAD DefaultPaperDimension %s!\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **FAIL** DefaultPaperDimension %s ERRATO!\n"
+" RIF: Pagina 103, sezione 5.15.\n"
+
+msgid " PASS DefaultPaperDimension\n"
+msgstr " PASS DefaultPaperDimension\n"
+
+#, c-format
+msgid ""
+" **FAIL** BAD Default%s %s\n"
+" REF: Page 40, section 4.5.\n"
+msgstr ""
+" **FAIL** Default%s %s ERRATO\n"
+" RIF: Pagina 40, sezione 4.5.\n"
+
+#, c-format
+msgid " PASS Default%s\n"
+msgstr " PASS Default%s\n"
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED Default%s\n"
+" REF: Page 40, section 4.5.\n"
+msgstr ""
+" **FAIL** Default%s RICHIESTO\n"
+" RIF: Pagina 40, sezione 4.5.\n"
+
+msgid " PASS FileVersion\n"
+msgstr " PASS FileVersion\n"
+
+msgid ""
+" **FAIL** REQUIRED FileVersion\n"
+" REF: Page 56, section 5.3.\n"
+msgstr ""
+" **FAIL** FileVersion RICHIESTO\n"
+" RIF: Pagina 56, sezione 5.3.\n"
+
+msgid " PASS FormatVersion\n"
+msgstr " PASS FormatVersion\n"
+
+msgid ""
+" **FAIL** REQUIRED FormatVersion\n"
+" REF: Page 56, section 5.3.\n"
+msgstr ""
+" **FAIL** FormatVersion RICHIESTO\n"
+" RIF: Pagina 56, sezione 5.3.\n"
+
+msgid " PASS LanguageEncoding\n"
+msgstr " PASS LanguageEncoding\n"
+
+msgid ""
+" **FAIL** REQUIRED LanguageEncoding\n"
+" REF: Pages 56-57, section 5.3.\n"
+msgstr ""
+" **FAIL** LanguageEncoding RICHIESTO\n"
+" RIF: Pagine 56-57, sezione 5.3.\n"
+
+msgid " PASS LanguageVersion\n"
+msgstr " PASS LanguageVersion\n"
+
+msgid ""
+" **FAIL** REQUIRED LanguageVersion\n"
+" REF: Pages 57-58, section 5.3.\n"
+msgstr ""
+" **FAIL** LanguageVersion RICHIESTO\n"
+" RIF: Pagine 57-58, sezione 5.3.\n"
+
+msgid ""
+" **FAIL** BAD Manufacturer (should be \"HP\")\n"
+" REF: Page 211, table D.1.\n"
+msgstr ""
+" **FAIL** Manufacturer ERRATO (dovrebbe essere \"HP\")\n"
+" RIF: Pagina 211, tabella D.1.\n"
+
+msgid " PASS Manufacturer\n"
+msgstr " PASS Manufacturer\n"
+
+msgid ""
+" **FAIL** REQUIRED Manufacturer\n"
+" REF: Pages 58-59, section 5.3.\n"
+msgstr ""
+" **FAIL** Manufacturer RICHIESTO\n"
+" RIF: Pagine 58-59, sezione 5.3.\n"
+
+#, c-format
+msgid ""
+" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n"
+" REF: Pages 59-60, section 5.3.\n"
+msgstr ""
+" **FAIL** ModelName ERRATO - \"%c\" non consentito nella stringa.\n"
+" RIF: Pagine 59-60, sezione 5.3.\n"
+
+msgid " PASS ModelName\n"
+msgstr " PASS ModelName\n"
+
+msgid ""
+" **FAIL** REQUIRED ModelName\n"
+" REF: Pages 59-60, section 5.3.\n"
+msgstr ""
+" **FAIL** ModelName RICHIESTO\n"
+" RIF: Pagine 59-60, sezione 5.3.\n"
+
+msgid " PASS NickName\n"
+msgstr " PASS NickName\n"
+
+msgid ""
+" **FAIL** REQUIRED NickName\n"
+" REF: Page 60, section 5.3.\n"
+msgstr ""
+" **FAIL** NickName RICHIESTO\n"
+" RIF: Pagina 60, sezione 5.3.\n"
+
+msgid " PASS PageSize\n"
+msgstr " PASS PageSize\n"
+
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Pages 99-100, section 5.14.\n"
+msgstr ""
+" **FAIL** PageSize RICHIESTO\n"
+" RIF: Pagine 99-100, sezione 5.14.\n"
+
+msgid " PASS PageRegion\n"
+msgstr " PASS PageRegion\n"
+
+msgid ""
+" **FAIL** REQUIRED PageRegion\n"
+" REF: Page 100, section 5.14.\n"
+msgstr ""
+" **FAIL** PageRegion RICHIESTO\n"
+" RIF: Pagina 100, sezione 5.14.\n"
+
+msgid " PASS PCFileName\n"
+msgstr " PASS PCFileName\n"
+
+msgid ""
+" **FAIL** REQUIRED PCFileName\n"
+" REF: Pages 61-62, section 5.3.\n"
+msgstr ""
+" **FAIL** PCFileName RICHIESTO\n"
+" RIF: Pagine 61-62, sezione 5.3.\n"
+
+msgid ""
+" **FAIL** BAD Product - not \"(string)\".\n"
+" REF: Page 62, section 5.3.\n"
+msgstr ""
+" **FAIL** Product ERRATO - non è \"(string)\".\n"
+" RIF: Pagina 62, sezione 5.3.\n"
+
+msgid " PASS Product\n"
+msgstr " PASS Product\n"
+
+msgid ""
+" **FAIL** REQUIRED Product\n"
+" REF: Page 62, section 5.3.\n"
+msgstr ""
+" **FAIL** Product RICHIESTO\n"
+" RIF: Pagina 62, sezione 5.3.\n"
+
+msgid ""
+" **FAIL** BAD PSVersion - not \"(string) int\".\n"
+" REF: Pages 62-64, section 5.3.\n"
+msgstr ""
+" **FAIL** PSVersion ERRATO - non è \"(string) int\".\n"
+" RIF: Pagine 62-64, sezione 5.3.\n"
+
+msgid " PASS PSVersion\n"
+msgstr " PASS PSVersion\n"
+
+msgid ""
+" **FAIL** REQUIRED PSVersion\n"
+" REF: Pages 62-64, section 5.3.\n"
+msgstr ""
+" **FAIL** PSVersion RICHIESTO\n"
+" RIF: Pagine 62-64, sezione 5.3.\n"
+
+msgid ""
+" **FAIL** BAD ShortNickName - longer than 31 chars.\n"
+" REF: Pages 64-65, section 5.3.\n"
+msgstr ""
+" **FAIL** ShortNickName ERRATO - maggiore di 31 caratteri.\n"
+" RIF: Pagine 64-65, sezione 5.3.\n"
+
+msgid " PASS ShortNickName\n"
+msgstr " PASS ShortNickName\n"
+
+msgid ""
+" **FAIL** REQUIRED ShortNickName\n"
+" REF: Page 64-65, section 5.3.\n"
+msgstr ""
+" **FAIL** ShortNickName RICHIESTO\n"
+" RIF: Pagine 64-65, sezione 5.3.\n"
+
+msgid ""
+" **FAIL** BAD JobPatchFile attribute in file\n"
+" REF: Page 24, section 3.4.\n"
+msgstr ""
+" **FAIL** Attributo JobPatchFile ERRATO nel file\n"
+" RIF: Pagina 24, sezione 3.4.\n"
+
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 99, section 5.14.\n"
+msgstr ""
+" **FAIL** PageSize RICHIESTO\n"
+" RIF: Pagina 41, sezione 5.\n"
+" RIF: Pagina 99, sezione 5.14.\n"
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED ImageableArea for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **FAIL** ImageableArea RICHIESTO per PageSize %s\n"
+" RIF: Pagina 41, sezione 5.\n"
+" RIF: Pagina 102, sezione 5.15.\n"
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED PaperDimension for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **FAIL** PaperDimension RICHIESTO per PageSize %s\n"
+" RIF: Pagina 41, sezione 5.\n"
+" RIF: Pagina 103, sezione 5.15.\n"
+
+#, c-format
+msgid ""
+" **FAIL** Bad %s choice %s!\n"
+" REF: Page 84, section 5.9\n"
+msgstr ""
+" **FAIL** Scelta %s errata %s!\n"
+" RIF: Pagina 84, sezione 5.9\n"
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED %s does not define choice None!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" **FAIL** %s RICHIESTO non definisce la scelta Nessuno!\n"
+" RIF: Pagina 122, sezione 5.17\n"
+
+#, c-format
+msgid ""
+" **FAIL** Bad %s choice %s!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" **FAIL** Scelta %s errata %s!\n"
+" RIF: Pagina 122, sezione 5.17\n"
+
+msgid " PASS\n"
+msgstr " PASS\n"
+
+#, c-format
+msgid ""
+" WARN Duplex option keyword %s should be named Duplex or JCLDuplex!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" WARN La parola chiave Duplex %s dovrebbe essere Duplex o JCLDuplex!\n"
+" RIF: Pagina 122, sezione 5.17\n"
+
+msgid " WARN Default choices conflicting!\n"
+msgstr " WARN Conflitto tra le scelte predefinite!\n"
+
+#, c-format
+msgid ""
+" WARN Obsolete PPD version %.1f!\n"
+" REF: Page 42, section 5.2.\n"
+msgstr ""
+" WARN Versione PPD %.1f obsoleta!\n"
+" RIF: Pagina 42, sezione 5.2.\n"
+
+msgid ""
+" WARN LanguageEncoding required by PPD 4.3 spec.\n"
+" REF: Pages 56-57, section 5.3.\n"
+msgstr ""
+" WARN LanguageEncoding richiesto dalla specifica PPD 4.3.\n"
+" RIF: Pagine 56-57, sezione 5.3.\n"
+
+msgid ""
+" WARN Manufacturer required by PPD 4.3 spec.\n"
+" REF: Pages 58-59, section 5.3.\n"
+msgstr ""
+" WARN Manufacturer richiesto dalla specifica PPD 4.3.\n"
+" RIF: Pagine 58-59, sezione 5.3.\n"
+
+msgid ""
+" WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
+" REF: Pages 61-62, section 5.3.\n"
+msgstr ""
+" WARN PCFileName maggiore di 8.3 in violazione della specifica PPD.\n"
+" RIF: Pagine 61-62, sezione 5.3.\n"
+
+msgid ""
+" WARN ShortNickName required by PPD 4.3 spec.\n"
+" REF: Pages 64-65, section 5.3.\n"
+msgstr ""
+" WARN ShortNickName richiesto dalla specifica PPD 4.3.\n"
+" RIF: Pagine 64-65, sezione 5.3.\n"
+
+msgid ""
+" WARN Protocols contains both PJL and BCP; expected TBCP.\n"
+" REF: Pages 78-79, section 5.7.\n"
+msgstr ""
+" WARN Protocols contiene sia PJL che BCP; atteso TBCP.\n"
+" RIF: Pagine 78-79, sezione 5.7.\n"
+
+msgid ""
+" WARN Protocols contains PJL but JCL attributes are not set.\n"
+" REF: Pages 78-79, section 5.7.\n"
+msgstr ""
+" WARN Protocols contiene PJL, ma gli attributi JCL non sono impostati.\n"
+" RIF: Pagine 78-79, sezione 5.7.\n"
+
+#, c-format
+msgid ""
+" WARN %s shares a common prefix with %s\n"
+" REF: Page 15, section 3.2.\n"
+msgstr ""
+" WARN %s condivide un prefisso comune con %s\n"
+" RIF: Pagina 15, sezione 3.2.\n"
+
+#, c-format
+#, fuzzy
+msgid " %d ERROR%s FOUND\n"
+msgstr " %d ERROR%s TROVATI\n"
+
+msgid " NO ERRORS FOUND\n"
+msgstr " NESSUN ERRORE TROVATO\n"
+
+#, c-format
+msgid ""
+" WARN \"%s %s\" conflicts with \"%s %s\"\n"
+" (constraint=\"%s %s %s %s\")\n"
+msgstr ""
+" WARN \"%s %s\" è in conflitto con \"%s %s\"\n"
+" (restrizione=\"%s %s %s %s\")\n"
+
+msgid ""
+"Usage: cupstestppd [-q] [-r] [-v[v]] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
+" program | cupstestppd [-q] [-r] [-v[v]] -\n"
+msgstr ""
+"Uso: cupstestppd [-q] [-r] [-v[v]] nomefile1.ppd[.gz] [... nomefileN.ppd[.gz]]\n"
+" programma | cupstestppd [-q] [-r] [-v[v]] -\n"
+
+msgid "lpstat: Need \"completed\" or \"not-completed\" after -W!\n"
+msgstr "lpstat: Usare \"completed\" o \"not-completed\" dopo -W!\n"
+
+msgid "lpstat: The -b option requires a destination argument.\n"
+msgstr "lpstat: L'opzione -b richiede un argomento di destinazione.\n"
+
+msgid "Error: need hostname after '-h' option!\n"
+msgstr "Errore: è necessario un nome host dopo l'opzione '-h'!\n"
+
+#, c-format
+msgid "lpstat: Unknown option '%c'!\n"
+msgstr "lpstat: Opzione '%c' sconosciuta!\n"
+
+#, c-format
+msgid "lpstat: Invalid destination name in list \"%s\"!\n"
+msgstr "lpstat: Nome di destinazione non valido nell'elenco \"%s\"!\n"
+
+#, c-format
+msgid "lpstat: Unknown destination \"%s\"!\n"
+msgstr "lpstat: Destinazione \"%s\" sconosciuta!\n"
+
+#, c-format
+msgid "lpstat: Unable to connect to server %s on port %d: %s\n"
+msgstr "lpstat: Impossibile connettersi al server %s alla porta %d: %s\n"
+
+#, c-format
+msgid "lpstat: get-printers failed: %s\n"
+msgstr "lpstat: get-printers fallita: %s\n"
+
+#, c-format
+msgid "%s accepting requests since Jan 01 00:00\n"
+msgstr "%s accetta richieste da Gen 01 00:00\n"
+
+#, c-format
+msgid ""
+"%s not accepting requests since Jan 01 00:00 -\n"
+"\t%s\n"
+msgstr ""
+"%s non accetta richieste da Gen 01 00:00 -\n"
+"\t%s\n"
+
+#, c-format
+msgid "%s/%s accepting requests since Jan 01 00:00\n"
+msgstr "%s/%s accetta richieste da Gen 01 00:00\n"
+
+#, c-format
+msgid ""
+"%s/%s not accepting requests since Jan 01 00:00 -\n"
+"\t%s\n"
+msgstr ""
+"%s/%s non accetta richieste da Gen 01 00:00 -\n"
+"\t%s\n"
+
+#, c-format
+msgid "lpstat: get-classes failed: %s\n"
+msgstr "lpstat: get-classes fallita: %s\n"
+
+#, c-format
+msgid "members of class %s:\n"
+msgstr "membri della classe %s:\n"
+
+#, c-format
+msgid "system default destination: %s/%s\n"
+msgstr "destinazione predefinita di sistema: %s/%s\n"
+
+#, c-format
+msgid "system default destination: %s\n"
+msgstr "destinazione predefinita di sistema: %s\n"
+
+#, c-format
+msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lpstat: errore - i nomi della variabile d'ambiente %s non esistono nella destinazione \"%s\"!\n"
+
+msgid "no system default destination\n"
+msgstr "nessuna destinazione predefinita di sistema\n"
+
+#, c-format
+msgid "Output for printer %s is sent to remote printer %s on %s\n"
+msgstr "L'uscita per la stampante %s è inviata alla stampante remota %s su %s\n"
+
+#, c-format
+msgid "Output for printer %s is sent to %s\n"
+msgstr "L'uscita per la stampante %s è inviata a %s\n"
+
+#, c-format
+msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
+msgstr "L'uscita per la stampante %s/%s è inviata alla stampante remota %s su %s\n"
+
+#, c-format
+msgid "Output for printer %s/%s is sent to %s\n"
+msgstr "L'uscita per la stampante %s/%s è inviata a %s\n"
+
+#, c-format
+msgid "device for %s: %s\n"
+msgstr "dispositivo per %s: %s\n"
+
+#, c-format
+msgid "device for %s/%s: %s\n"
+msgstr "dispositivo per %s/%s: %s\n"
+
+#, c-format
+msgid "lpstat: get-jobs failed: %s\n"
+msgstr "lpstat: get-jobs fallita: %s\n"
+
+#, c-format
+msgid "\tqueued for %s\n"
+msgstr "\tin coda per %s\n"
+
+#, c-format
+msgid "printer %s is idle. enabled since %s\n"
+msgstr "la stampante %s è in attesa. abilitata da %s\n"
+
+#, c-format
+msgid "printer %s now printing %s-%d. enabled since %s\n"
+msgstr "la stampante %s sta stampando %s-%d. abilitata da %s\n"
+
+#, c-format
+msgid "printer %s disabled since %s -\n"
+msgstr "la stampante %s è disabilitata da %s -\n"
+
+msgid "\treason unknown\n"
+msgstr "\tmotivo sconosciuto\n"
+
+msgid ""
+"\tForm mounted:\n"
+"\tContent types: any\n"
+"\tPrinter types: unknown\n"
+msgstr ""
+"\tModulo montato:\n"
+"\tTipi di contenuto: qualsiasi\n"
+"\tTipi di stampante: sconosciuti\n"
+
+#, c-format
+msgid "\tDescription: %s\n"
+msgstr "\tDescrizione: %s\n"
+
+msgid "\tAlerts:"
+msgstr "\tAvvisi:"
+
+#, c-format
+msgid "\tLocation: %s\n"
+msgstr "\tPosizione: %s\n"
+
+msgid "\tConnection: remote\n"
+msgstr "\tConnessione: remota\n"
+
+#, c-format
+msgid "\tInterface: %s.ppd\n"
+msgstr "\tInterfaccia: %s.ppd\n"
+
+msgid "\tConnection: direct\n"
+msgstr "\tConnessione: diretta\n"
+
+#, c-format
+msgid "\tInterface: %s/interfaces/%s\n"
+msgstr "\tInterfaccia: %s/interfacce/%s\n"
+
+#, c-format
+msgid "\tInterface: %s/ppd/%s.ppd\n"
+msgstr "\tInterfaccia: %s/ppd/%s.ppd\n"
+
+msgid "\tOn fault: no alert\n"
+msgstr "\tIn caso di fallimento: nessun segnale\n"
+
+msgid "\tAfter fault: continue\n"
+msgstr "\tDopo il fallimento: continua\n"
+
+msgid "\tUsers allowed:\n"
+msgstr "\tUtenti autorizzati:\n"
+
+msgid "\tUsers denied:\n"
+msgstr "\tUtenti non autorizzati:\n"
+
+msgid "\t\t(all)\n"
+msgstr "\t\t(tutti)\n"
+
+msgid "\tForms allowed:\n"
+msgstr "\tModuli consentiti:\n"
+
+msgid "\t\t(none)\n"
+msgstr "\t\t(nessuno)\n"
+
+msgid "\tBanner required\n"
+msgstr "\tBanner richiesto\n"
+
+msgid "\tCharset sets:\n"
+msgstr "\tSet di caratteri:\n"
+
+msgid "\tDefault pitch:\n"
+msgstr "\tPasso predefinito:\n"
+
+msgid "\tDefault page size:\n"
+msgstr "\tDimensiona predefinita pagina:\n"
+
+msgid "\tDefault port settings:\n"
+msgstr "\tImpostazioni predefinite porta:\n"
+
+#, c-format
+msgid "printer %s/%s is idle. enabled since %s\n"
+msgstr "la stampante %s/%s è in attesa. abilitata da %s\n"
+
+#, c-format
+msgid "printer %s/%s now printing %s-%d. enabled since %s\n"
+msgstr "la stampante %s/%s sta stampando %s-%d. abilitata da %s\n"
+
+#, c-format
+msgid "printer %s/%s disabled since %s -\n"
+msgstr "la stampante %s/%s è disabilitata da %s -\n"
+
+msgid "scheduler is running\n"
+msgstr "il pianificatore è in esecuzione\n"
+
+msgid "scheduler is not running\n"
+msgstr "il pianificatore non è in esecuzione\n"
+
+#, c-format
+msgid "lpadmin: Unable to connect to server: %s\n"
+msgstr "lpadmin: Impossibile connettersi al server: %s\n"
+
+msgid ""
+"lpadmin: Unable to add a printer to the class:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile aggiungere una stampante alla classe:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid "lpadmin: Expected class name after '-c' option!\n"
+msgstr "lpadmin: Atteso nome classe dopo l'opzione '-c'!\n"
+
+msgid "lpadmin: Class name can only contain printable characters!\n"
+msgstr "lpadmin: Il nome della classe può contenere solo caratteri stampabili!\n"
+
+msgid "lpadmin: Expected printer name after '-d' option!\n"
+msgstr "lpadmin: Atteso nome stampante dopo l'opzione '-d'!\n"
+
+msgid "lpadmin: Printer name can only contain printable characters!\n"
+msgstr "lpadmin: Il nome della stampante può contenere solo caratteri stampabili!\n"
+
+msgid "lpadmin: Expected hostname after '-h' option!\n"
+msgstr "lpadmin: Atteso nome host dopo l'opzione '-h'!\n"
+
+msgid ""
+"lpadmin: Unable to set the interface script:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile impostare lo script di interfaccia:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid "lpadmin: Expected interface after '-i' option!\n"
+msgstr "lpadmin: Attesa interfaccia dopo l'opzione '-i'!\n"
+
+msgid ""
+"lpadmin: Unable to set the interface script or PPD file:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile impostare lo script di interfaccia o il file PPD:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid "lpadmin: Expected model after '-m' option!\n"
+msgstr "lpadmin: Atteso modello dopo l'opzione '-m'!\n"
+
+msgid "lpadmin: Expected name=value after '-o' option!\n"
+msgstr "lpadmin: Atteso nome=valore dopo l'opzione '-o'!\n"
+
+msgid "lpadmin: Expected printer after '-p' option!\n"
+msgstr "lpadmin: Attesa stampante dopo l'opzione '-p'!\n"
+
+msgid ""
+"lpadmin: Unable to remove a printer from the class:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile rimuovere una stampante dalla classe:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid "lpadmin: Expected class after '-r' option!\n"
+msgstr "lpadmin: Attesa classe dopo l'opzione '-r'!\n"
+
+msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n"
+msgstr "lpadmin: Atteso allow/deny:userlist dopo l'opzione '-u'!\n"
+
+#, c-format
+msgid "lpadmin: Unknown allow/deny option \"%s\"!\n"
+msgstr "lpadmin: Opzione allow/deny \"%s\" sconosciuta!\n"
+
+msgid ""
+"lpadmin: Unable to set the device URI:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile impostare l'URI di dispositivo:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid "lpadmin: Expected device URI after '-v' option!\n"
+msgstr "lpadmin: Atteso URI di dispositivo dopo l'opzione '-v'!\n"
+
+msgid "lpadmin: Expected printer or class after '-x' option!\n"
+msgstr "lpadmin: Attesa stampante o classe dopo l'opzione '-x'!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer description:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile impostare la descrizione della stampante:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid "lpadmin: Expected description after '-D' option!\n"
+msgstr "lpadmin: Attesa descrizione dopo l'opzione '-D'!\n"
+
+msgid "lpadmin: Expected file type(s) after '-I' option!\n"
+msgstr "lpadmin: Attesi tipi di file dopo l'opzione '-I'!\n"
+
+msgid "lpadmin: Warning - content type list ignored!\n"
+msgstr "lpadmin: Attenzione - elenco dei tipi di contenuto ignorato!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer location:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile impostare la posizione della stampante:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid "lpadmin: Expected location after '-L' option!\n"
+msgstr "lpadmin: Attesa posizione dopo l'opzione '-L'!\n"
+
+msgid ""
+"lpadmin: Unable to set the PPD file:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile impostare il file PPD:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid "lpadmin: Expected PPD after '-P' option!\n"
+msgstr "lpadmin: Atteso PPD dopo l'opzione '-P'!\n"
+
+#, c-format
+msgid "lpadmin: Unknown option '%c'!\n"
+msgstr "lpadmin: Opzione '%c' sconosciuta!\n"
+
+#, c-format
+msgid "lpadmin: Unknown argument '%s'!\n"
+msgstr "lpadmin: Argomento '%s' sconosciuto!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer options:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Impossibile impostare le opzioni della stampante:\n"
+" Devi specificare prima un nome di stampante!\n"
+
+msgid ""
+"Usage:\n"
+"\n"
+" lpadmin [-h server] -d destination\n"
+" lpadmin [-h server] -x destination\n"
+" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n"
+" [-r remove-class] [-v device] [-D description]\n"
+" [-P ppd-file] [-o name=value]\n"
+" [-u allow:user,user] [-u deny:user,user]\n"
+"\n"
+msgstr ""
+"Uso:\n"
+"\n"
+" lpadmin [-h server] -d destinazione\n"
+" lpadmin [-h server] -x destinazione\n"
+" lpadmin [-h server] -p stampante [-c aggiungi-classe] [-i interfaccia] [-m modello]\n"
+" [-r rimuovi-classe] [-v dispositivo] [-D descrizione]\n"
+" [-P file-ppd] [-o nome=valore]\n"
+" [-u allow:user,user] [-u deny:user,user]\n"
+"\n"
+
+#, c-format
+msgid "lpadmin: Unable to create temporary file: %s\n"
+msgstr "lpadmin: Impossibile creare il file temporaneo: %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to open file \"%s\": %s\n"
+msgstr "lpadmin: Impossibile aprire il file \"%s\": %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set model) failed: %s\n"
+msgstr "lpadmin: add-printer (impostazione modello) fallito: %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set description) failed: %s\n"
+msgstr "lpadmin: add-printer (impostazione descrizione) fallito: %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set location) failed: %s\n"
+msgstr "lpadmin: add-printer (impostazione posizione) fallito: %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to create temporary file - %s\n"
+msgstr "lpadmin: Impossibile creare il file temporaneo - %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n"
+msgstr "lpadmin: Impossibile aprire il file PPD \"%s\" - %s\n"
+
+#, c-format
+msgid "lpadmin: %s failed: %s\n"
+msgstr "lpadmin: %s fallito: %s\n"
+
+msgid "lp: Expected destination after -d option!\n"
+msgstr "lp: Attesa destinazione dopo l'opzione -d\n"
+
+msgid "lp: Expected form after -f option!\n"
+msgstr "lp: Atteso modulo dopo l'opzione -f!\n"
+
+msgid "lp: Expected hostname after -h option!\n"
+msgstr "lp: Atteso nome host dopo l'opzione -h!\n"
+
+msgid "lp: Expected job ID after -i option!\n"
+msgstr "lp: Atteso ID dell'operazione dopo l'opzione -i!\n"
+
+msgid "lp: Error - cannot print files and alter jobs simultaneously!\n"
+msgstr "lp: Errore- impossibile stampare file e modificare operazioni simultaneamente!\n"
+
+msgid "lp: Error - bad job ID!\n"
+msgstr "lp: Errore - ID dell'operazione errato!\n"
+
+msgid "lp: Expected copies after -n option!\n"
+msgstr "lp: Attese copie dopo l'opzione -n!\n"
+
+msgid "lp: Expected option string after -o option!\n"
+msgstr "lp: Attesa stringa di opzione dopo l'opzione -o!\n"
+
+#, c-format
+msgid "lp: Expected priority after -%c option!\n"
+msgstr "lp: Attesa priorità dopo l'opzione -%c!\n"
+
+msgid "lp: Priority must be between 1 and 100.\n"
+msgstr "lp: La priorità deve essere tra 1 e 100.\n"
+
+msgid "lp: Expected title after -t option!\n"
+msgstr "lp: Atteso titolo dopo l'opzione -t!\n"
+
+msgid "lp: Expected mode list after -y option!\n"
+msgstr "lp: Atteso elenco modalità dopo l'opzione -y!\n"
+
+msgid "lp: Warning - mode option ignored!\n"
+msgstr "lp: Attenzione - opzione della modalità ignorata!\n"
+
+msgid "lp: Expected hold name after -H option!\n"
+msgstr "lp: Atteso nome di blocco dopo l'opzione -H!\n"
+
+msgid "lp: Need job ID (-i) before \"-H restart\"!\n"
+msgstr "lp: Usare l'ID dell'operazione (-i) prima di \"-H restart\"!\n"
+
+msgid "lp: Expected page list after -P option!\n"
+msgstr "lp: Atteso elenco pagine dopo l'opzione -P!\n"
+
+msgid "lp: Expected character set after -S option!\n"
+msgstr "lp: Atteso set di caratteri dopo l'opzione -S!\n"
+
+msgid "lp: Warning - character set option ignored!\n"
+msgstr "lp: Attenzione - opzione del set di caratteri ignorata!\n"
+
+msgid "lp: Expected content type after -T option!\n"
+msgstr "lp: Atteso tipo di contenuto dopo l'opzione -T!\n"
+
+msgid "lp: Warning - content type option ignored!\n"
+msgstr "lp: Attenzione - opzione del tipo di contenuto ignorata!\n"
+
+#, c-format
+msgid "lp: Unknown option '%c'!\n"
+msgstr "lp: Opzione '%c' sconosciuta!\n"
+
+msgid "lp: Error - cannot print from stdin if files or a job ID are provided!\n"
+msgstr "lp: Errore - impossibile stampare da stdin senza file o ID dell'operazione!\n"
+
+#, c-format
+msgid "lp: Unable to access \"%s\" - %s\n"
+msgstr "lp: Impossibile accedere a \"%s\" - %s\n"
+
+#, c-format
+msgid "lp: Too many files - \"%s\"\n"
+msgstr "lp: Troppi file - \"%s\"\n"
+
+msgid "lp: error - no default destination available.\n"
+msgstr "lp: errore - nessuna destinazione predefinita disponibile.\n"
+
+msgid "lp: error - scheduler not responding!\n"
+msgstr "lp: errore - il pianificatore di operazioni non risponde!\n"
+
+#, c-format
+msgid "lp: unable to create temporary file \"%s\" - %s\n"
+msgstr "lp: impossibile creare il file temporaneo \"%s\" - %s\n"
+
+#, c-format
+msgid "lp: error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "lp: errore - impossibile scrivere il file temporaneo \"%s\" - %s\n"
+
+msgid "lp: stdin is empty, so no job has been sent.\n"
+msgstr "lp: stdin è vuoto, nessuna operazione è stata inviata.\n"
+
+#, c-format
+msgid "lp: unable to print file: %s\n"
+msgstr "lp: impossibile stampare il file: %s\n"
+
+#, c-format
+msgid "request id is %s-%d (%d file(s))\n"
+msgstr "l'id richiesto è %s-%d (%d file)\n"
+
+#, c-format
+msgid "lp: restart-job failed: %s\n"
+msgstr "lp: restart-job fallito: %s\n"
+
+#, c-format
+msgid "lp: set-job-attributes failed: %s\n"
+msgstr "lp: set-job-attributes fallito: %s\n"
+
+#, c-format
+msgid "lpinfo: Unable to connect to server: %s\n"
+msgstr "lpinfo: Impossibile connettersi al server: %s\n"
+
+#, c-format
+msgid "lpinfo: Unknown option '%c'!\n"
+msgstr "lpinfo: Opzione '%c' sconosciuta!\n"
+
+#, c-format
+msgid "lpinfo: Unknown argument '%s'!\n"
+msgstr "lpinfo: Argomento '%s' sconosciuto!\n"
+
+#, c-format
+msgid "lpinfo: cups-get-devices failed: %s\n"
+msgstr "lpinfo: cups-get-devices fallito: %s\n"
+
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+msgstr ""
+"Dispositivo: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+
+#, c-format
+msgid "lpinfo: cups-get-ppds failed: %s\n"
+msgstr "lpinfo: cups-get-ppds fallito: %s\n"
+
+#, c-format
+msgid ""
+"Model: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+msgstr ""
+"Modello: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+
+#, c-format
+msgid "lpmove: Unknown option '%c'!\n"
+msgstr "lpmove: Opzione '%c' sconosciuta!\n"
+
+#, c-format
+msgid "lpmove: Unknown argument '%s'!\n"
+msgstr "lpmove: Argomento '%s' sconosciuto!\n"
+
+msgid "Usage: lpmove job dest\n"
+msgstr "Uso: lpmove operazione destinazione\n"
+
+#, c-format
+msgid "lpmove: Unable to connect to server: %s\n"
+msgstr "lpmove: Impossibile connettersi al server: %s\n"
+
+#, c-format
+msgid "lpmove: move-job failed: %s\n"
+msgstr "lpmove: move-job fallito: %s\n"
+
+msgid "lpoptions: Unknown printer or class!\n"
+msgstr "lpoptions: Stampante o classe sconosciuta!\n"
+
+msgid "lpoptions: No printers!?!\n"
+msgstr "lpoptions: Nessuna stampante!?!\n"
+
+#, c-format
+msgid "lpoptions: Unable to add printer or instance: %s\n"
+msgstr "lpoptions: Impossibile aggiungere una stampante o un'istanza: %s\n"
+
+#, c-format
+msgid "lpoptions: Destination %s has no PPD file!\n"
+msgstr "lpoptions: La destinazione %s non ha file PPD!\n"
+
+#, c-format
+msgid "lpoptions: Unable to open PPD file for %s!\n"
+msgstr "lpoptions: Impossibile aprire il file PPD per %s!\n"
+
+msgid ""
+"Usage: lpoptions [-h server] [-E] -d printer\n"
+" lpoptions [-h server] [-E] [-p printer] -l\n"
+" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
+" lpoptions [-h server] [-E] -x printer\n"
+msgstr ""
+"Uso: lpoptions [-h server] [-E] -d stampante\n"
+" lpoptions [-h server] [-E] [-p stampante] -l\n"
+" lpoptions [-h server] [-E] -p stampante -o opzione[=valore] ...\n"
+" lpoptions [-h server] [-E] -x stampante\n"
+
+msgid "lppasswd: Only root can add or delete passwords!\n"
+msgstr "lppasswd: Solo root può aggiungere o eliminare le password!\n"
+
+msgid "Enter old password:"
+msgstr "Inserisci la vecchia password:"
+
+#, c-format
+msgid "lppasswd: Unable to copy password string: %s\n"
+msgstr "lppasswd: Impossibile copiare la stringa della password: %s\n"
+
+msgid "Enter password:"
+msgstr "Inserisci la password:"
+
+msgid "Enter password again:"
+msgstr "Inserisci ancora la password:"
+
+msgid "lppasswd: Sorry, passwords don't match!\n"
+msgstr "lppasswd: Spiacente, le password non corrispondono!\n"
+
+msgid ""
+"lppasswd: Sorry, password rejected.\n"
+"Your password must be at least 6 characters long, cannot contain\n"
+"your username, and must contain at least one letter and number.\n"
+msgstr ""
+"lppasswd: Spiacente, password rifiutata.\n"
+"La password deve essere lunga almeno 6 caratteri, non può contenere\n"
+"il nome utente, e deve contenere almeno una lettera e un numero.\n"
+
+msgid "lppasswd: Password file busy!\n"
+msgstr "lppasswd: Il file delle password è occupato!\n"
+
+#, c-format
+msgid "lppasswd: Unable to open password file: %s\n"
+msgstr "lppasswd: Impossibile aprire il file delle password: %s\n"
+
+#, c-format
+msgid "lppasswd: Unable to write to password file: %s\n"
+msgstr "lppasswd: Impossibile scrivere il file delle password: %s\n"
+
+#, c-format
+msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n"
+msgstr "lppasswd: l'utente \"%s\" e il gruppo \"%s\" non esistono.\n"
+
+msgid "lppasswd: Sorry, password doesn't match!\n"
+msgstr "lppasswd: Spiacente, la password non corrisponde!\n"
+
+msgid "lppasswd: Password file not updated!\n"
+msgstr "lppasswd: File delle password non aggiornato!\n"
+
+#, c-format
+msgid "lppasswd: failed to backup old password file: %s\n"
+msgstr "lppasswd: copia di sicurezza del vecchio file delle password fallita: %s\n"
+
+#, c-format
+msgid "lppasswd: failed to rename password file: %s\n"
+msgstr "lppasswd: rinomina del file delle password fallita: %s\n"
+
+msgid "Usage: lppasswd [-g groupname]\n"
+msgstr "Uso: lppasswd [-g nomegruppo]\n"
+
+msgid ""
+"Usage: lppasswd [-g groupname] [username]\n"
+" lppasswd [-g groupname] -a [username]\n"
+" lppasswd [-g groupname] -x [username]\n"
+msgstr ""
+"Uso: lppasswd [-g nomegruppo] [nomeutente]\n"
+" lppasswd [-g nomegruppo] -a [nomeutente]\n"
+" lppasswd [-g nomegruppo] -x [nomeutente]\n"
+
+msgid "Start Printer"
+msgstr "Avvia stampante"
+
+msgid "Stop Printer"
+msgstr "Ferma stampante"
+
+msgid "Start Class"
+msgstr "Avvia classe"
+
+msgid "Stop Class"
+msgstr "Ferma classe"
+
+msgid "Accept Jobs"
+msgstr "Accetta operazioni"
+
+msgid "Reject Jobs"
+msgstr "Scarta operazioni"
+
+msgid "Purge Jobs"
+msgstr "Elimina operazioni"
+
+msgid "Set As Default"
+msgstr "Imposta come predefinita"
+
+msgid "Administration"
+msgstr "Amministrazione"
+
+msgid "Modify Class"
+msgstr "Modifica classe"
+
+msgid "Add Class"
+msgstr "Aggiungi classe"
+
+msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "Il nome della classe può contenere fino a 127 caratteri stampabili e non può contenere spazi, barre (/), o cancelletti (#)."
+
+msgid "Unable to modify class:"
+msgstr "Impossibile modificare la classe:"
+
+msgid "Unable to add class:"
+msgstr "Impossibile aggiungere la classe:"
+
+msgid "Modify Printer"
+msgstr "Modifica stampante"
+
+msgid "Add Printer"
+msgstr "Aggiungi stampante"
+
+msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "Il nome della stampante può contenere fino a 127 caratteri stampabili e non può contenere spazi, barre (/), o cancelletti (#)."
+
+msgid "Unable to get list of printer drivers:"
+msgstr "Impossibile ottenere l'elenco dei driver della stampante:"
+
+msgid "Unable to modify printer:"
+msgstr "Impossibile modificare la stampante:"
+
+msgid "Unable to add printer:"
+msgstr "Impossibile aggiungere la stampante:"
+
+msgid "Set Printer Options"
+msgstr "Imposta opzioni stampante"
+
+msgid "Missing form variable!"
+msgstr "Variabile modulo mancante"
+
+msgid "Unable to get PPD file!"
+msgstr "Impossibile ottenete il file PPD!"
+
+msgid "Unable to open PPD file:"
+msgstr "Impossibile aprire il file PPD:"
+
+msgid "Banners"
+msgstr "Banner"
+
+msgid "Starting Banner"
+msgstr "Banner iniziale"
+
+msgid "Ending Banner"
+msgstr "Banner finale"
+
+msgid "Policies"
+msgstr "Regole"
+
+msgid "Error Policy"
+msgstr "Regola di errore"
+
+msgid "Operation Policy"
+msgstr "Regola operativa"
+
+msgid "PS Binary Protocol"
+msgstr "Protocollo binario PS"
+
+msgid "None"
+msgstr "Nessuno"
+
+msgid "Unable to set options:"
+msgstr "Impossibile impostare le opzioni:"
+
+msgid "Change Settings"
+msgstr "Modifica impostazioni"
+
+msgid "Unable to change server settings:"
+msgstr "Impossibile modificare le impostazioni del server:"
+
+msgid "Unable to upload cupsd.conf file:"
+msgstr "Impossibile caricare il file cupsd.conf:"
+
+msgid "Edit Configuration File"
+msgstr "Modifica file di configurazione"
+
+msgid "Unable to create temporary file:"
+msgstr "Impossibile creare il file temporaneo:"
+
+msgid "Unable to access cupsd.conf file:"
+msgstr "Impossibile accedere al file cupsd.conf:"
+
+msgid "Unable to edit cupsd.conf files larger than 1MB!"
+msgstr "Impossibile modificare file cupsd.conf più grandi di 1MB!"
+
+msgid "Delete Class"
+msgstr "Elimina classe"
+
+msgid "Unable to delete class:"
+msgstr "Impossibile eliminare la classe:"
+
+msgid "Delete Printer"
+msgstr "Elimina stampante"
+
+msgid "Unable to delete printer:"
+msgstr "Impossibile eliminare la stampante:"
+
+msgid "Export Printers to Samba"
+msgstr "Esporta stampanti a Samba"
+
+msgid "Unable to fork process!"
+msgstr "Impossibile biforcare il processo!"
+
+msgid "Unable to connect to server!"
+msgstr "Impossibile connettersi al server!"
+
+msgid "Unable to get printer attributes!"
+msgstr "Impossibile ottenere gli attributi della stampante!"
+
+msgid "Unable to convert PPD file!"
+msgstr "Impossibile convertire il file PPD!"
+
+msgid "Unable to copy Windows 2000 printer driver files!"
+msgstr "Impossibile copiare i file dei driver di stampa di Windows 2000!"
+
+msgid "Unable to install Windows 2000 printer driver files!"
+msgstr "Impossibile installare i file dei driver di stampa di Windows 2000!"
+
+msgid "Unable to copy Windows 9x printer driver files!"
+msgstr "Impossibile copiare i file dei driver di stampa di Windows 9x!"
+
+msgid "Unable to install Windows 9x printer driver files!"
+msgstr "Impossibile installare i file dei driver di stampa di Windows 9x!"
+
+msgid "Unable to set Windows printer driver!"
+msgstr "Impossibile configurare il driver di stampa di Windows!"
+
+msgid "No printer drivers found!"
+msgstr "Nessun driver di stampa trovato!"
+
+msgid "Unable to execute cupsaddsmb command!"
+msgstr "Impossibile eseguire il comando cupsaddsmb!"
+
+#, c-format
+msgid "cupsaddsmb failed with status %d"
+msgstr "cupsaddsmb fallito con stato %d"
+
+#, c-format
+msgid "cupsaddsmb crashed on signal %d"
+msgstr "cupsaddsmb è andato in crash con segnale %d"
+
+msgid "A Samba username is required to export printer drivers!"
+msgstr "È richiesto un nome utente Samba per esportare i driver di stampa!"
+
+msgid "A Samba password is required to export printer drivers!"
+msgstr "È richiesta una password Samba per esportare i driver di stampa!"
+
+msgid "Unable to open cupsd.conf file:"
+msgstr "Impossibile aprire il file cupsd.conf:"
+
+msgid "Unable to change printer:"
+msgstr "Impossibile cambiare la stampante:"
+
+msgid "Set Allowed Users"
+msgstr "Imposta utenti autorizzati"
+
+msgid "Unable to get printer attributes:"
+msgstr "Impossibile ottenere gli attributi della stampante:"
+
+msgid "Set Publishing"
+msgstr "Imposta pubblicazione"
+
+msgid "Unable to change printer-is-shared attribute:"
+msgstr "Impossibile cambiare l'attributo printer-is-shared:"
+
+msgid "Classes"
+msgstr "Classi"
+
+msgid "Unable to get class list:"
+msgstr "Impossibile ottenere l'elenco delle classi:"
+
+msgid "Unable to get class status:"
+msgstr "Impossibile ottenere lo stato della classe:"
+
+msgid "Move Job"
+msgstr "Sposta operazione"
+
+msgid "Unable to find destination for job!"
+msgstr "Impossibile trovare una destinazione per l'operazione!"
+
+msgid "Move All Jobs"
+msgstr "Sposta tutte le operazioni"
+
+msgid "Unable to move job"
+msgstr "Impossibile spostare l'operazione"
+
+msgid "Unable to move jobs"
+msgstr "Impossibile spostare le operazioni"
+
+msgid "Print Test Page"
+msgstr "Stampa pagina di prova"
+
+msgid "Unable to print test page:"
+msgstr "Impossibile stampare la pagina di prova:"
+
+msgid "Jobs"
+msgstr "Operazioni"
+
+msgid "Job operation failed:"
+msgstr "Operazione fallita:"
+
+msgid "Printers"
+msgstr "Stampanti"
+
+msgid "Unable to get printer list:"
+msgstr "Impossibile ottenere l'elenco delle stampanti:"
+
+msgid "Unable to get printer status:"
+msgstr "Impossibile ottenere lo stato della stampante:"
+
+msgid "OK"
+msgstr "OK"
+
+msgid "Unable to open PPD file"
+msgstr "Impossibile aprire il file PPD"
+
+msgid "NULL PPD file pointer"
+msgstr "Puntatore NULL al file PPD"
+
+msgid "Memory allocation error"
+msgstr "Errore di allocazione della memoria"
+
+msgid "Missing PPD-Adobe-4.x header"
+msgstr "Intestazione PPD-Adobe-4.x mancante"
+
+msgid "Missing value string"
+msgstr "Stringa di valore mancante"
+
+msgid "Internal error"
+msgstr "Errore interno"
+
+msgid "Bad OpenGroup"
+msgstr "OpenGroup errato"
+
+msgid "OpenGroup without a CloseGroup first"
+msgstr "OpenGroup senza un precedente CloseGroup"
+
+msgid "Bad OpenUI/JCLOpenUI"
+msgstr "OpenUI/JCLOpenUI errato"
+
+msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
+msgstr "OpenUI/JCLOpenUI senza un precedente CloseUI/JCLCloseUI"
+
+msgid "Bad OrderDependency"
+msgstr "OrderDependency errato"
+
+msgid "Bad UIConstraints"
+msgstr "UIConstraints errato"
+
+msgid "Missing asterisk in column 1"
+msgstr "Asterisco mancante nella colonna 1"
+
+msgid "Line longer than the maximum allowed (255 characters)"
+msgstr "La riga eccede il massimo consentito (255 caratteri)"
+
+msgid "Illegal control character"
+msgstr "Carattere di controllo non consentito"
+
+msgid "Illegal main keyword string"
+msgstr "Stringa di parola chiave principale non consentita"
+
+msgid "Illegal option keyword string"
+msgstr "Stringa di parola chiave opzionale non consentita"
+
+msgid "Illegal translation string"
+msgstr "Stringa di traduzione non consentita"
+
+msgid "Illegal whitespace character"
+msgstr "Caratteri di spazio non consentito"
+
+msgid "Bad custom parameter"
+msgstr "Parametro personalizzato errato"
+
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+msgid "Custom"
+msgstr "Personalizzato "
+
+msgid "JCL"
+msgstr "JCL"
+
+msgid "No authentication information provided!"
+msgstr "Nessuna informazione di autenticazione fornita!"
+
+#, c-format
+msgid "Password for %s required to access %s via SAMBA: "
+msgstr "Password per %s richiesta per accedere a %s via SAMBA: "
+
+#, c-format
+msgid "Running command: %s %s -N -U '%s%%%s' -c '%s'\n"
+msgstr "Esecuzione comando: %s %s -N -U '%s%%%s' -c '%s'\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to run \"%s\": %s\n"
+msgstr "cupsaddsmb: Impossibile eseguire \"%s\": %s\n"
+
+msgid "cupsaddsmb: No Windows printer drivers are installed!\n"
+msgstr "cupsaddsmb: Nessun driver di stampa di Windows è installato!\n"
+
+msgid "cupsaddsmb: Warning, no Windows 2000 printer drivers are installed!\n"
+msgstr "cupsaddsmb: Attenzione, nessun driver di stampa di Windows 2000 è installato!\n"
+
+#, c-format
+msgid "lpadmin: Printer %s is already a member of class %s.\n"
+msgstr "lpadmin: La stampante %s è già un membro della classe %s.\n"
+
+msgid "lpadmin: No member names were seen!\n"
+msgstr "lpadmin: Nessun nome di membri trovato!\n"
+
+#, c-format
+msgid "lpadmin: Printer %s is not a member of class %s.\n"
+msgstr "lpadmin: La stampante %s non è un membro della classe %s.\n"
+
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+msgstr ""
+"Dispositivo: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+
+#, c-format
+msgid ""
+"Model: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+msgstr ""
+"Modello: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+
+msgid "Usage: lpmove job/src dest\n"
+msgstr "Usage: lpmove operazione/fonte destinazione\n"
+
+msgid "lpstat: Need \"completed\", \"not-completed\", or \"all\" after -W!\n"
+msgstr "lpstat: Usare \"completed\", \"not-completed\", o \"all\" dopo -W!\n"
+
+#, c-format
+msgid "%s accepting requests since %s\n"
+msgstr "%s accetta richieste da %s\n"
+
+#, c-format
+msgid ""
+"%s not accepting requests since %s -\n"
+"\t%s\n"
+msgstr ""
+"%s non accetta richieste da %s -\n"
+"\t%s\n"
+
+#, c-format
+msgid "%s/%s accepting requests since %s\n"
+msgstr "%s/%s accetta richieste da %s\n"
+
+#, c-format
+msgid ""
+"%s/%s not accepting requests since %s -\n"
+"\t%s\n"
+msgstr ""
+"%s/%s non accetta richieste da %s -\n"
+"\t%s\n"
+
+msgid "lpc> "
+msgstr "lpc> "
+
+#, c-format
+msgid "%s: Unable to contact server!\n"
+msgstr "%s: Impossibile contattare il server!\n"
+
+#, c-format
+msgid "%s: Error - expected username after '-U' option!\n"
+msgstr "%s: Errore - atteso nome utente dopo l'opzione '-U'!\n"
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s/%s\"!\n"
+msgstr "%s: Errore - destinazione \"%s/%s\" sconosciuta!\n"
+
+#, c-format
+msgid "%s: Unknown destination \"%s\"!\n"
+msgstr "%s: Destinazione \"%s\" sconosciuta!\n"
+
+#, c-format
+msgid "%s: Error - expected hostname after '-h' option!\n"
+msgstr "%s: Errore - atteso nome host dopo l'opzione '-h'!\n"
+
+#, c-format
+msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: errore - i nomi della variabile d'ambiente %s non esistono nella destinazione \"%s\"!\n"
+
+#, c-format
+msgid "%s: error - no default destination available.\n"
+msgstr "%s: errore - nessuna destinazione predefinita disponibile.\n"
+
+msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
+msgstr "Uso: lpq [-P dest] [-U nomeutente] [-h nomehost[:porta]] [-l] [+intervallo]\n"
+
+#, c-format
+msgid "%s: Error - expected hostname after '-H' option!\n"
+msgstr "%s: Errore - atteso nome host dopo l'opzione '-H'!\n"
+
+#, c-format
+msgid "%s: Error - expected value after '-%c' option!\n"
+msgstr "%s: Errore - atteso valore dopo l'opzione '-%c'!\n"
+
+#, c-format
+msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n"
+msgstr "%s: Attenzione - Modificatore di formato '%c' non supportato - il risultato potrebbe non essere corretto!\n"
+
+#, c-format
+msgid "%s: error - expected option=value after '-o' option!\n"
+msgstr "%s: errore - attesa opzione=valore dopo l'opzione '-o'!\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-P' option!\n"
+msgstr "%s: Errore - attesa destinazione dopo l'opzione '-P'!\n"
+
+#, c-format
+msgid "%s: Error - expected copy count after '-#' option!\n"
+msgstr "%s: Errore - atteso numero di copie dopo l'opzione '-#'!\n"
+
+#, c-format
+msgid "%s: Error - expected name after '-%c' option!\n"
+msgstr "%s: Errore - atteso nome dopo l'opzione '-%c'!\n"
+
+#, c-format
+msgid "%s: Error - unknown option '%c'!\n"
+msgstr "%s: Errore - opzione '%c' sconosciuta!\n"
+
+#, c-format
+msgid "%s: Error - unable to access \"%s\" - %s\n"
+msgstr "%s: Errore - impossibile accedere a \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - too many files - \"%s\"\n"
+msgstr "%s: Errore - troppi file - \"%s\"\n"
+
+#, c-format
+msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: Errore - i nomi della variabile d'ambiente %s non esistono nella destinazione \"%s\"!\n"
+
+#, c-format
+msgid "%s: Error - no default destination available.\n"
+msgstr "%s: Errore - nessuna destinazione predefinita disponibile.\n"
+
+#, c-format
+msgid "%s: Error - scheduler not responding!\n"
+msgstr "%s: Errore - il pianificatore di operazioni non risponde!\n"
+
+#, c-format
+msgid "%s: Error - unable to create temporary file \"%s\" - %s\n"
+msgstr "%s: Errore - impossibile creare il file temporaneo \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "%s: Errore - impossibile scrivere il file temporaneo \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - stdin is empty, so no job has been sent.\n"
+msgstr "%s: Errore - stdin è vuoto, nessuna operazione può essere inviata.\n"
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s\"!\n"
+msgstr "%s: Errore - destinazione \"%s\" sconosciuta!\n"
+
+#, c-format
+msgid "%s: Error - expected reason text after '-r' option!\n"
+msgstr "%s: Errore - atteso testo di motivazione dopo l'opzione '-r'!\n"
+
+#, c-format
+msgid "%s: Error - expected username after '-u' option!\n"
+msgstr "%s: Errore - atteso nome utente dopo l'opzione '-u'!\n"
+
+#, c-format
+msgid "%s: %s failed: %s\n"
+msgstr "%s: %s fallito: %s\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-d' option!\n"
+msgstr "%s: Errore - attesa destinazione dopo l'opzione '-d'!\n"
+
+#, c-format
+msgid "%s: Error - expected form after '-f' option!\n"
+msgstr "%s: Errore - atteso modulo dopo l'opzione '-f'!\n"
+
+#, c-format
+msgid "%s: Warning - form option ignored!\n"
+msgstr "%s: Attenzione - opzione del modulo ignorata!\n"
+
+#, c-format
+msgid "%s: Expected job ID after '-i' option!\n"
+msgstr "%s: Atteso ID dell'operazione dopo l'opzione '-i'!\n"
+
+#, c-format
+msgid "%s: Error - cannot print files and alter jobs simultaneously!\n"
+msgstr "%s: Errore - impossibile stampare file e modificare operazioni contemporaneamente!\n"
+
+#, c-format
+msgid "%s: Error - bad job ID!\n"
+msgstr "%s: Errore - ID dell'operazione errato!\n"
+
+#, c-format
+msgid "%s: Error - expected copies after '-n' option!\n"
+msgstr "%s: Errore - attese copie dopo l'opzione '-n'!\n"
+
+#, c-format
+msgid "%s: Error - expected option string after '-o' option!\n"
+msgstr "%s: Errore - attesa stringa di opzione dopo l'opzione '-o'!\n"
+
+#, c-format
+msgid "%s: Error - expected priority after '-%c' option!\n"
+msgstr "%s: Errore - attesa priorità dopo l'opzione '-%c'!\n"
+
+#, c-format
+msgid "%s: Error - priority must be between 1 and 100.\n"
+msgstr "%s: Errore - la priorità deve essere tra 1 e 100.\n"
+
+#, c-format
+msgid "%s: Error - expected title after '-t' option!\n"
+msgstr "%s: Errore - atteso titolo dopo l'opzione '-t'!\n"
+
+#, c-format
+msgid "%s: Error - expected mode list after '-y' option!\n"
+msgstr "%s: Error - atteso elenco modalità dopo l'opzione '-y'!\n"
+
+#, c-format
+msgid "%s: Warning - mode option ignored!\n"
+msgstr "%s: Attenzione - opzione della modalità ignorata!\n"
+
+#, c-format
+msgid "%s: Error - expected hold name after '-H' option!\n"
+msgstr "%s: Errore - atteso nome di blocco dopo l'opzione '-H'!\n"
+
+#, c-format
+msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n"
+msgstr "%s: Usare l'ID dell'operazione ('-i idoperazione') prima di '-H restart'!\n"
+
+#, c-format
+msgid "%s: Error - expected page list after '-P' option!\n"
+msgstr "%s: Errore - atteso elenco delle pagine dopo l'opzione '-P'!\n"
+
+#, c-format
+msgid "%s: Error - expected character set after '-S' option!\n"
+msgstr "%s: Errore - atteso set di caratteri dopo l'opzione '-S'!\n"
+
+#, c-format
+msgid "%s: Warning - character set option ignored!\n"
+msgstr "%s: Attenzione - opzione del set di caratteri ignorata!\n"
+
+#, c-format
+msgid "%s: Error - expected content type after '-T' option!\n"
+msgstr "%s: Errore - atteso tipo di contenuto dopo l'opzione '-T'!\n"
+
+#, c-format
+msgid "%s: Warning - content type option ignored!\n"
+msgstr "%s: Attenzione - opzione del tipo di contenuto ignorata!\n"
+
+#, c-format
+msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n"
+msgstr "%s: Errore - impossibile stampare da stdin senza file o ID dell'operazione!\n"
+
+#, c-format
+msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n"
+msgstr "%s: Errore - usare \"completed\", \"not-completed\", o \"all\" dopo l'opzione '-W'!\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-b' option!\n"
+msgstr "%s: Errore - attesa destinazione dopo l'opzione '-b'!\n"
+
+#, c-format
+msgid "%s: Invalid destination name in list \"%s\"!\n"
+msgstr "%s: Nome di destinazione non valido nell'elenco \"%s\"!\n"
+
+#, c-format
+msgid "%s: Unable to connect to server\n"
+msgstr "%s: Impossibile connettersi al server\n"
+
+msgid "Print Job:"
+msgstr "Stampa operazione:"
+
+msgid "pending"
+msgstr "in sospeso"
+
+msgid "held"
+msgstr "bloccato"
+
+msgid "processing"
+msgstr "elaborazione in corso"
+
+msgid "stopped"
+msgstr "fermato"
+
+msgid "canceled"
+msgstr "annullato"
+
+msgid "aborted"
+msgstr "interrotto"
+
+msgid "completed"
+msgstr "completato"
+
+msgid "unknown"
+msgstr "sconosciuto"
+
+msgid "untitled"
+msgstr "senza titolo"
+
+msgid "Printer:"
+msgstr "Stampante:"
+
+msgid "idle"
+msgstr "in attesa"
+
+msgid "Missing notify-subscription-ids attribute!"
+msgstr "Attributo notify-subscription-ids mancante!"
+
+msgid "Job subscriptions cannot be renewed!"
+msgstr "Le sottoscrizioni delle operazioni non possono essere rinnovate!"
+
+msgid "cupsd: Expected config filename after \"-c\" option!\n"
+msgstr "cupsd: Atteso nome file di configurazione dopo l'opzione \"-c\"!\n"
+
+msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
+msgstr "cupsd: supporto launchd(8) non compilato, esecuzione in modalità normale.\n"
+
+#, c-format
+msgid "cupsd: Unknown option \"%c\" - aborting!\n"
+msgstr "cupsd: Opzione \"%c\" sconosciuta - interruzione!\n"
+
+#, c-format
+msgid "cupsd: Unknown argument \"%s\" - aborting!\n"
+msgstr "cupsd: Argomento \"%s\" sconosciuto - interruzione!\n"
+
+msgid ""
+"Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
+"\n"
+"-c config-file Load alternate configuration file\n"
+"-f Run in the foreground\n"
+"-F Run in the foreground but detach\n"
+"-h Show this usage message\n"
+"-l Run cupsd from launchd(8)\n"
+msgstr ""
+"Uso: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
+"\n"
+"-c config-file Carica file di configurazione alternativo\n"
+"-f Esegui in primo piano\n"
+"-F Esegui in primo piano, ma sganciato\n"
+"-h Mostra questo messaggio di aiuto\n"
+"-l Esegui cupsd da launchd(8)\n"
+
+#, c-format
+msgid " WARN Line %d only contains whitespace!\n"
+msgstr " WARN La riga %d contiene solamente spazi bianchi!\n"
+
+msgid " WARN File contains a mix of CR, LF, and CR LF line endings!\n"
+msgstr " WARN Il file contiene un misto di interruzioni di riga CR, LF, e CR LF!\n"
+
+msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF!\n"
+msgstr " WARN I file PPD per sistemi diversi da Windows dovrebbero usare solo interruzioni di riga LF, non CR LF!\n"
+
+msgid "Printer Maintenance"
+msgstr "Manutenzione stampanti"
+
+msgid "Unable to send maintenance job:"
+msgstr "Impossibile inviare il comando di manutenzione:"
+
+#, c-format
+msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n"
+msgstr "cupsaddsmb: Nessun file PPD per la stampante \"%s\" - %s\n"
+
+#, c-format
+msgid " **FAIL** %s %s does not exist!\n"
+msgstr " **FAIL** %s %s non esiste!\n"
+
+#, c-format
+msgid " **FAIL** Bad language \"%s\"!\n"
+msgstr " **FAIL** Lingua \"%s\" errata!\n"
+
+#, c-format
+msgid " **FAIL** Missing \"%s\" translation string for option %s!\n"
+msgstr " **FAIL** Stringa di traduzione \"%s\" mancante per l'opzione %s!\n"
+
+#, c-format
+msgid " **FAIL** Default translation string for option %s contains 8-bit characters!\n"
+msgstr " **FAIL** La stringa di traduzione predefinita per l'opzione %s contiene caratteri di 8-bit!\n"
+
+#, c-format
+msgid " **FAIL** Missing \"%s\" translation string for option %s, choice %s!\n"
+msgstr " **FAIL** Stringa di traduzione \"%s\" mancante per l'opzione %s, scelta %s!\n"
+
+#, c-format
+msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters!\n"
+msgstr " **FAIL** La stringa di traduzione predefinita per l'opzione %s scelta %s contiene caratteri di 8-bit!\n"
+
+#, c-format
+msgid " **FAIL** Bad cupsFilter value \"%s\"!\n"
+msgstr " **FAIL** Valore cupsFilter \"%s\" errato!\n"
+
+msgid "Help"
+msgstr "Guida"
+
+#, c-format
+msgid "Missing value on line %d!\n"
+msgstr "Valore mancante alla riga %d!\n"
+
+#, c-format
+msgid "Missing double quote on line %d!\n"
+msgstr "Doppi apici mancanti alla riga %d!\n"
+
+#, c-format
+msgid "Bad option + choice on line %d!\n"
+msgstr "Opzione + scelta errata alla riga %d!\n"
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)!\n"
+msgstr "Impossibile copiare i file dei driver di stampa di Windows 2000 (%d)!\n"
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)!\n"
+msgstr "Impossibile copiare i file dei driver di stampa di CUPS (%d)!\n"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)!\n"
+msgstr "Impossibile installare i file dei driver di stampa di Windows 2000 (%d)!\n"
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)!\n"
+msgstr "Impossibile copiare i file dei driver di stampa di Windows 9x (%d)!\n"
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)!\n"
+msgstr "Impossibile installare i file dei driver di stampa di Windows 9x (%d)!\n"
+
+msgid "No Windows printer drivers are installed!\n"
+msgstr "Nessun driver di stampa di Windows è installato!\n"
+
+msgid "Warning, no Windows 2000 printer drivers are installed!\n"
+msgstr "Attenzione, nessun driver di stampa di Windows 2000 è installato!\n"
+
+#, c-format
+msgid "Unable to set Windows printer driver (%d)!\n"
+msgstr "Impossibile configurare il driver di stampa di Windows (%d)!\n"
+
+msgid ""
+"Usage: cupsaddsmb [options] printer1 ... printerN\n"
+" cupsaddsmb [options] -a\n"
+"\n"
+"Options:\n"
+" -E Encrypt the connection to the server\n"
+" -H samba-server Use the named SAMBA server\n"
+" -U samba-user Authenticate using the named SAMBA user\n"
+" -a Export all printers\n"
+" -h cups-server Use the named CUPS server\n"
+" -v Be verbose (show commands)\n"
+msgstr ""
+"Uso: cupsaddsmb [opzioni] stampante1 ... stampanteN\n"
+" cupsaddsmb [opzioni] -a\n"
+"\n"
+"Opzioni:\n"
+" -E Cifra la connessione al server\n"
+" -H samba-server Usa il server SAMBA specificato\n"
+" -U samba-user Autenticazione usando l'utente SAMBA specificato\n"
+" -a Esporta tutte le stampanti\n"
+" -h cups-server Usa il server CUPS specificato\n"
+" -v Prolisso (mostra comandi)\n"
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)!"
+msgstr "Impossibile copiare i file dei driver di stampa di Windows 2000 (%d)!"
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)!"
+msgstr "Impossibile copiare i file dei driver di stampa di CUPS (%d)!"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)!"
+msgstr "Impossibile installare i file dei driver di stampa di Windows 2000 (%d)!"
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)!"
+msgstr "Impossibile copiare i file dei driver di stampa di Windows 9x (%d)!"
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)!"
+msgstr "Impossibile installare i file dei driver di stampa di Windows 9x (%d)!"
+
+msgid "No Windows printer drivers are installed!"
+msgstr "Nessun driver di stampa Windows è installato!"
+
+msgid "Warning, no Windows 2000 printer drivers are installed!"
+msgstr "Attenzione, nessun driver di stampa Windows 2000 è installato!"
+
+#, c-format
+msgid "open of %s failed: %s"
+msgstr "apertura di %s fallita: %s"
+
+#, c-format
+msgid "Running command: %s %s -N -A %s -c '%s'\n"
+msgstr "Esecuzione del comando: %s %s -N -A %s -c '%s'\n"
+
+#, c-format
+msgid "stat of %s failed: %s"
+msgstr "verifica di %s fallita: %s"
+
+#, c-format
+msgid "Job #%d is already cancelled - can't cancel."
+msgstr "L'operazione #%d è già annullata - impossibile annullare."
+
+#, c-format
+msgid "Job #%d is already aborted - can't cancel."
+msgstr "L'operazione #%d è già interrotta - impossibile annullare."
+
+#, c-format
+msgid "Job #%d is already completed - can't cancel."
+msgstr "L'operazione #%d è già completata - impossibile annullare."
+
+#, c-format
+msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+msgstr "Devi accedere a questa pagina usando l'URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+
+#, c-format
+msgid "Unsupported format '%s'!"
+msgstr "Formato '%s' non supportato!"
+
+msgid "FAIL\n"
+msgstr "FAIL\n"
+
+#, c-format
+msgid ""
+" Line %d is longer than 255 characters (%d)!\n"
+" REF: Page 25, Line Length\n"
+msgstr ""
+" La riga %d eccede i 255 caratteri (%d)!\n"
+" RIF: Pagina 25, Lunghezza della riga\n"
+
+msgid ""
+" Missing %!PS-Adobe-3.0 on first line!\n"
+" REF: Page 17, 3.1 Conforming Documents\n"
+msgstr ""
+" %!PS-Adobe-3.0 mancante alla prima riga!\n"
+" RIF: Pagina 17, 3.1 Uniformare documenti\n"
+
+#, c-format
+msgid ""
+" Bad %%%%Pages: on line %d!\n"
+" REF: Page 43, %%%%Pages:\n"
+msgstr ""
+" %%%%Pages: errato alla riga %d!\n"
+" RIF: Pagina 43, %%%%Pages:\n"
+
+#, c-format
+msgid ""
+" Bad %%%%BoundingBox: on line %d!\n"
+" REF: Page 39, %%%%BoundingBox:\n"
+msgstr ""
+" %%%%BoundingBox: errato alla riga %d!\n"
+" RIF: Pagina 39, %%%%BoundingBox:\n"
+
+#, c-format
+msgid ""
+" Bad %%%%Page: on line %d!\n"
+" REF: Page 53, %%%%Page:\n"
+msgstr ""
+" %%%%Page: errato alla riga %d!\n"
+" RIF: Pagina 53, %%%%Page:\n"
+
+#, c-format
+msgid ""
+" Missing or bad %%BoundingBox: comment!\n"
+" REF: Page 39, %%BoundingBox:\n"
+msgstr ""
+" Commento %%BoundingBox: mancante o errato!\n"
+" RIF: Pagina 39, %%BoundingBox:\n"
+
+#, c-format
+msgid ""
+" Missing or bad %%Pages: comment!\n"
+" REF: Page 43, %%Pages:\n"
+msgstr ""
+" Commento %%Pages: mancante o errato!\n"
+" RIF: Pagina 43, %%Pages:\n"
+
+#, c-format
+msgid ""
+" Missing %%EndComments comment!\n"
+" REF: Page 41, %%EndComments\n"
+msgstr ""
+" Commento %%EndComments mancante!\n"
+" RIF: Pagina 41, %%EndComments\n"
+
+#, c-format
+msgid ""
+" Missing or bad %%Page: comments!\n"
+" REF: Page 53, %%Page:\n"
+msgstr ""
+" Commento %%Page: mancante o errato!\n"
+" RIF: Pagina 53, %%Page:\n"
+
+#, c-format
+msgid " Too many %%EndDocument comments!\n"
+msgstr " Troppi commenti %%EndDocument!\n"
+
+#, c-format
+msgid " Too many %%BeginDocument comments!\n"
+msgstr " Troppi commenti %%BeginDocument!\n"
+
+#, c-format
+msgid " Saw %d lines that exceeded 255 characters!\n"
+msgstr " Trovate %d righe che eccedono i 255 caratteri!\n"
+
+msgid "PASS\n"
+msgstr "PASS\n"
+
+msgid " Warning: file contains binary data!\n"
+msgstr " Attenzione: il file contiene dati binari!\n"
+
+#, c-format
+msgid " Warning: obsolete DSC version %.1f in file!\n"
+msgstr " Attenzione: versione DSC %.1f obsoleta nel file!\n"
+
+#, c-format
+msgid " Warning: no %%EndComments comment in file!\n"
+msgstr " Attenzione: nessun commento %%EndComments nel file!\n"
+
+msgid ""
+"Usage: cupstestdsc [options] filename.ps [... filename.ps]\n"
+" cupstestdsc [options] -\n"
+"\n"
+"Options:\n"
+"\n"
+" -h Show program usage\n"
+"\n"
+" Note: this program only validates the DSC comments, not the PostScript itself.\n"
+msgstr ""
+"Uso: cupstestdsc [opzioni] nomefile.ps [... nomefile.ps]\n"
+" cupstestdsc [opzioni] -\n"
+"\n"
+"Opzioni:\n"
+"\n"
+" -h Mostra l'utilizzo del programma\n"
+"\n"
+" Nota: questo programma valida solo i commenti DSC, non il PostScript stesso.\n"
+
+#, c-format
+msgid "Password for %s on %s? "
+msgstr "Password per %s su %s? "
+
+msgid ""
+" **FAIL** 1284DeviceId must be 1284DeviceID!\n"
+" REF: Page 72, section 5.5\n"
+msgstr ""
+" **FAIL** 1284DeviceId deve essere 1284DeviceID!\n"
+" RIF: Pagina 72, sezione 5.5\n"
+
diff --git a/packaging/cups.list.in b/packaging/cups.list.in
index a57f56484..51d315863 100644
--- a/packaging/cups.list.in
+++ b/packaging/cups.list.in
@@ -1,5 +1,5 @@
#
-# "$Id: cups.list.in 6003 2006-10-02 16:26:04Z mike $"
+# "$Id: cups.list.in 6118 2006-11-16 13:34:44Z mike $"
#
# ESP Package Manager (EPM) file list for the Common UNIX Printing
# System (CUPS).
@@ -113,6 +113,9 @@
%subpackage et
%description Estonian support
+%subpackage it
+%description Italian support
+
%subpackage ja
%description Japanese support
@@ -358,6 +361,8 @@ 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
@@ -430,6 +435,9 @@ 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
@@ -525,6 +533,11 @@ 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
@@ -617,5 +630,5 @@ f 0644 root sys $XINETD/cups-lpd init/cups-lpd
%subpackage
#
-# End of "$Id: cups.list.in 6003 2006-10-02 16:26:04Z mike $".
+# End of "$Id: cups.list.in 6118 2006-11-16 13:34:44Z mike $".
#
diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in
index 35efdd458..db75b6bc5 100644
--- a/packaging/cups.spec.in
+++ b/packaging/cups.spec.in
@@ -1,5 +1,5 @@
#
-# "$Id: cups.spec.in 6006 2006-10-02 17:56:40Z mike $"
+# "$Id: cups.spec.in 6118 2006-11-16 13:34:44Z mike $"
#
# RPM "spec" file for the Common UNIX Printing System (CUPS).
#
@@ -91,6 +91,11 @@ 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
@@ -144,6 +149,10 @@ UNIX® operating systems. This package provides Spanish support.
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.
@@ -421,6 +430,16 @@ 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
@@ -459,5 +478,5 @@ rm -rf $RPM_BUILD_ROOT
#
-# End of "$Id: cups.spec.in 6006 2006-10-02 17:56:40Z mike $".
+# End of "$Id: cups.spec.in 6118 2006-11-16 13:34:44Z mike $".
#
diff --git a/scheduler/client.c b/scheduler/client.c
index 85e2ac205..8a338d412 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -1,5 +1,5 @@
/*
- * "$Id: client.c 6027 2006-10-11 21:04:58Z mike $"
+ * "$Id: client.c 6111 2006-11-15 20:28:39Z mike $"
*
* Client routines for the Common UNIX Printing System (CUPS) scheduler.
*
@@ -426,7 +426,8 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
con->http.encryption = HTTP_ENCRYPT_ALWAYS;
- encrypt_client(con);
+ if (!encrypt_client(con))
+ cupsdCloseClient(con);
}
else
con->auto_ssl = 1;
@@ -745,7 +746,9 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
"cupsdReadClient: Saw first byte %02X, auto-negotiating SSL/TLS session...",
buf[0] & 255);
- encrypt_client(con);
+ if (!encrypt_client(con))
+ return (cupsdCloseClient(con));
+
return (1);
}
}
@@ -1056,7 +1059,8 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (cupsdFlushHeader(con) < 0)
return (cupsdCloseClient(con));
- encrypt_client(con);
+ if (!encrypt_client(con))
+ return (cupsdCloseClient(con));
#else
if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED))
return (cupsdCloseClient(con));
@@ -1103,7 +1107,8 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */
if (cupsdFlushHeader(con) < 0)
return (cupsdCloseClient(con));
- encrypt_client(con);
+ if (!encrypt_client(con))
+ return (cupsdCloseClient(con));
#else
if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED))
return (cupsdCloseClient(con));
@@ -2587,6 +2592,7 @@ 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 */
@@ -2614,9 +2620,12 @@ 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,
@@ -2689,8 +2698,9 @@ 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)((long)con->http.fd));
+ 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);
error = gnutls_handshake(conn->session);
@@ -2720,7 +2730,6 @@ 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)
@@ -2743,7 +2752,7 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */
if (!conn->certsArray)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "EncryptClient: Could not find signing key in keychain "
+ "encrypt_client: Could not find signing key in keychain "
"\"%s\"", ServerCertificate);
error = errSSLBadCert; /* errSSLBadConfiguration is a better choice, but not available on 10.2.x */
}
@@ -2758,15 +2767,7 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */
error = SSLSetProtocolVersionEnabled(conn->session, kSSLProtocol2, false);
if (!error)
- {
- /*
- * 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);
- }
+ error = SSLSetConnection(conn->session, HTTP(con));
if (!error)
error = SSLSetAllowsExpiredCerts(conn->session, true);
@@ -4200,5 +4201,5 @@ write_file(cupsd_client_t *con, /* I - Client connection */
/*
- * End of "$Id: client.c 6027 2006-10-11 21:04:58Z mike $".
+ * End of "$Id: client.c 6111 2006-11-15 20:28:39Z mike $".
*/
diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c
index 75b44a7eb..4dff6f634 100644
--- a/scheduler/dirsvc.c
+++ b/scheduler/dirsvc.c
@@ -1,5 +1,5 @@
/*
- * "$Id: dirsvc.c 6003 2006-10-02 16:26:04Z mike $"
+ * "$Id: dirsvc.c 6090 2006-11-14 16:35:27Z mike $"
*
* Directory services routines for the Common UNIX Printing System (CUPS).
*
@@ -160,6 +160,17 @@ cupsdLoadRemoteCache(void)
/*
+ * 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...
*/
@@ -3181,5 +3192,5 @@ slp_url_callback(
/*
- * End of "$Id: dirsvc.c 6003 2006-10-02 16:26:04Z mike $".
+ * End of "$Id: dirsvc.c 6090 2006-11-14 16:35:27Z mike $".
*/
diff --git a/scheduler/main.c b/scheduler/main.c
index 101f178de..434cacf89 100644
--- a/scheduler/main.c
+++ b/scheduler/main.c
@@ -1,5 +1,5 @@
/*
- * "$Id: main.c 5878 2006-08-24 15:55:42Z mike $"
+ * "$Id: main.c 6090 2006-11-14 16:35:27Z mike $"
*
* Scheduler main loop for the Common UNIX Printing System (CUPS).
*
@@ -32,9 +32,11 @@
* 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(8) config file
+ * launchd_sync_conf() - Re-write the launchd config file
* org.cups.cupsd.plist based on cupsd.conf.
* parent_handler() - Catch USR1/CHLD signals...
* process_children() - Process all dead children...
@@ -75,31 +77,41 @@
*/
#ifdef HAVE_LAUNCHD
-static void launchd_checkin(void);
-static void launchd_reload(void);
-static int launchd_sync_conf(void);
+static void launchd_checkin(void);
+static CFDictionaryRef launchd_create_dict(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? */
+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 */
/*
@@ -123,8 +135,11 @@ 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 */
- time_t mallinfo_time; /* Malloc information time */
+ expire_time, /* Subscription expire time */
+#ifndef __APPLE__
+ netif_time, /* Network interface poll time */
+#endif /* !__APPLE__ */
+ mallinfo_time; /* Malloc information time */
size_t string_count, /* String count */
alloc_bytes, /* Allocated string bytes */
total_bytes; /* Total string bytes */
@@ -536,6 +551,9 @@ 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)
{
@@ -656,7 +674,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(8) then timeout after 'LaunchdTimeout' seconds of
+ * launchd then timeout after 'LaunchdTimeout' seconds of
* inactivity...
*/
@@ -761,7 +779,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(8)
+ * If no other work was scheduled and we're being controlled by launchd
* then timeout after 'LaunchdTimeout' seconds of inactivity...
*/
@@ -810,8 +828,23 @@ 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__ */
/*
@@ -1082,6 +1115,12 @@ 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
@@ -1449,7 +1488,7 @@ launchd_checkin(void)
{
if (BrowseSocket != -1)
close(BrowseSocket);
-
+
BrowseSocket = launch_data_get_fd(tmp);
}
else
@@ -1473,6 +1512,222 @@ 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.
*/
@@ -1573,272 +1828,104 @@ launchd_reload(void)
/*
- * 'launchd_sync_conf()' - Re-write the launchd(8) config file
+ * 'launchd_sync_conf()' - Rewrite the launchd config file
* org.cups.cupsd.plist based on cupsd.conf.
*/
static int /* O - 1 if the file was updated */
launchd_sync_conf(void)
{
- 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 */
+ SInt32 errorCode; /* Error code */
+ CFDataRef resourceData; /* XML property list */
+ CFDictionaryRef cupsd_dict; /* New org.cups.cupsd.plist dict */
/*
- * If the launchd conf file modification time is newer than the cupsd.conf
- * time then there's nothing to do...
+ * If needed reconstitute the existing org.cups.cupsd.plist...
*/
- if (!stat(ConfigurationFile, &cupsd_sb) &&
- !stat(LaunchdConf, &launchd_sb) &&
- launchd_sb.st_mtimespec.tv_sec >= cupsd_sb.st_mtimespec.tv_sec)
+ if (!launchd_conf_url &&
+ !(launchd_conf_url = CFURLCreateFromFileSystemRepresentation(
+ kCFAllocatorDefault,
+ (const unsigned char *)LaunchdConf,
+ strlen(LaunchdConf), false)))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "launchd_sync_conf: Nothing to do, pid=%d.",
- (int)getpid());
+ cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_sync_conf: "
+ "Unable to create file URL for \"%s\"\n", LaunchdConf);
return (0);
}
- /*
- * Time to write a new 'org.cups.cupsd.plist' file.
- * Create the new dictionary and populate it with values...
- */
-
- if ((cupsd_dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
- &kCFTypeDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks)) != NULL)
+ if (!launchd_conf_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 (CFURLCreateDataAndPropertiesFromResource(NULL, launchd_conf_url,
+ &resourceData, NULL, NULL, &errorCode))
+ {
+ launchd_conf_dict = CFPropertyListCreateFromXMLData(NULL, resourceData,
+ kCFPropertyListImmutable, NULL);
+ CFRelease(resourceData);
+ }
- if ((array = CFArrayCreateMutable(kCFAllocatorDefault, 2,
- &kCFTypeArrayCallBacks)) != NULL)
+ if (!launchd_conf_dict)
{
- CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_PROGRAMARGUMENTS),
- array);
- CFArrayAppendValue(array, CFSTR("/usr/sbin/cupsd"));
- CFArrayAppendValue(array, CFSTR("-l"));
- CFRelease(array);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_sync_conf: "
+ "Unable to create dictionary for \"%s\"\n", LaunchdConf);
}
+ }
- /*
- * Add a sockets dictionary...
- */
+ /*
+ * Create a new org.cups.cupsd.plist dictionary...
+ */
- if ((sockets = (CFMutableDictionaryRef)CFDictionaryCreateMutable(
- kCFAllocatorDefault, 0,
- &kCFTypeDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks)) != NULL)
- {
- CFDictionaryAddValue(cupsd_dict, CFSTR(LAUNCH_JOBKEY_SOCKETS), sockets);
+ if ((cupsd_dict = launchd_create_dict()) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_sync_conf: "
+ "Unable to create file URL for \"%s\"\n", LaunchdConf);
+ return (0);
+ }
- /*
- * Add a Listeners array to the sockets dictionary...
- */
+ /*
+ * If the dictionaries are different write a new org.cups.cupsd.plist...
+ */
- if ((array = CFArrayCreateMutable(kCFAllocatorDefault, 0,
- &kCFTypeArrayCallBacks)) != NULL)
+ if (!CFEqual(cupsd_dict, launchd_conf_dict))
+ {
+ if ((resourceData = CFPropertyListCreateXMLData(kCFAllocatorDefault,
+ cupsd_dict)))
+ {
+ if (CFURLWriteDataAndPropertiesToResource(launchd_conf_url, resourceData,
+ NULL, &errorCode))
{
- 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);
- }
- }
+ * The new cupsd dictionary becomes the on-disk launchd dictionary...
+ */
- CFRelease(listener);
- }
- }
+ if (launchd_conf_dict)
+ CFRelease(launchd_conf_dict);
- CFRelease(array);
+ launchd_conf_dict = cupsd_dict;
}
-
- /*
- * Add the BrowseSocket to the sockets dictionary...
- */
-
- if (Browsing && (BrowseRemoteProtocols & BROWSE_CUPS))
+ else
{
- 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"));
+ cupsdLogMessage(CUPSD_LOG_WARN,
+ "launchd_sync_conf: "
+ "CFURLWriteDataAndPropertiesToResource(\"%s\") "
+ "failed: %d\n",
+ LaunchdConf, (int)errorCode);
- 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(cupsd_dict);
}
-
- CFRelease(sockets);
+
+ CFRelease(resourceData);
}
- 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);
- }
+ /*
+ * Let the caller know we updated the file...
+ */
- CFRelease(cupsd_dict);
+ return (1);
}
- /*
- * Let the caller know we updated the file...
- */
-
- return (1);
+ return (0);
}
#endif /* HAVE_LAUNCHD */
@@ -2253,5 +2340,5 @@ usage(int status) /* O - Exit status */
/*
- * End of "$Id: main.c 5878 2006-08-24 15:55:42Z mike $".
+ * End of "$Id: main.c 6090 2006-11-14 16:35:27Z mike $".
*/
diff --git a/scheduler/network.c b/scheduler/network.c
index eb89b1217..e63d4f44e 100644
--- a/scheduler/network.c
+++ b/scheduler/network.c
@@ -1,5 +1,5 @@
/*
- * "$Id: network.c 5428 2006-04-18 20:45:30Z mike $"
+ * "$Id: network.c 6090 2006-11-14 16:35:27Z mike $"
*
* Network interface functions for the Common UNIX Printing System
* (CUPS) scheduler.
@@ -60,7 +60,8 @@ cupsdNetIFFind(const char *name) /* I - Name of interface */
* Update the interface list as needed...
*/
- cupsdNetIFUpdate();
+ if (NetIFUpdate)
+ cupsdNetIFUpdate();
/*
* Search for the named interface...
@@ -113,14 +114,13 @@ cupsdNetIFUpdate(void)
/*
- * Update the network interface list no more often than once a
- * minute...
+ * Only update the list if we need to...
*/
- if ((time(NULL) - NetIFTime) < 60)
+ if (!NetIFUpdate)
return;
- NetIFTime = time(NULL);
+ NetIFUpdate = 0;
/*
* Free the old interfaces...
@@ -314,5 +314,5 @@ compare_netif(cupsd_netif_t *a, /* I - First network interface */
/*
- * End of "$Id: network.c 5428 2006-04-18 20:45:30Z mike $".
+ * End of "$Id: network.c 6090 2006-11-14 16:35:27Z mike $".
*/
diff --git a/scheduler/network.h b/scheduler/network.h
index 21e810c3c..5d8c83f8a 100644
--- a/scheduler/network.h
+++ b/scheduler/network.h
@@ -1,5 +1,5 @@
/*
- * "$Id: network.h 5043 2006-02-01 18:55:16Z mike $"
+ * "$Id: network.h 6090 2006-11-14 16:35:27Z mike $"
*
* Network interface definitions for the Common UNIX Printing System
* (CUPS) scheduler.
@@ -43,8 +43,8 @@ typedef struct cupsd_netif_s /**** Network interface data ****/
* Globals...
*/
-VAR time_t NetIFTime VALUE(0);
- /* Network interface list time */
+VAR int NetIFUpdate VALUE(1);
+ /* Network interface list needs updating */
VAR cups_array_t *NetIFList VALUE(NULL);
/* Array of network interfaces */
@@ -57,5 +57,5 @@ extern void cupsdNetIFUpdate(void);
/*
- * End of "$Id: network.h 5043 2006-02-01 18:55:16Z mike $".
+ * End of "$Id: network.h 6090 2006-11-14 16:35:27Z mike $".
*/
diff --git a/scheduler/sysman.c b/scheduler/sysman.c
index 853ff86c8..61f342dcb 100644
--- a/scheduler/sysman.c
+++ b/scheduler/sysman.c
@@ -1,5 +1,5 @@
/*
- * "$Id: sysman.c 5833 2006-08-16 20:05:58Z mike $"
+ * "$Id: sysman.c 6090 2006-11-14 16:35:27Z mike $"
*
* System management definitions for the Common UNIX Printing System (CUPS).
*
@@ -115,11 +115,17 @@ static CFRunLoopRef SysEventRunloop = NULL;
/* The runloop. Access must be protected! */
static CFStringRef ComputerNameKey = NULL,
/* Computer name key */
- NetworkGlobalKey = NULL,
- /* Network global key */
+ NetworkGlobalKeyIPv4 = NULL,
+ /* Network global IPv4 key */
+ NetworkGlobalKeyIPv6 = NULL,
+ /* Network global IPv6 key */
+ NetworkGlobalKeyDNS = NULL,
+ /* Network global DNS key */
HostNamesKey = NULL,
/* Host name key */
- NetworkInterfaceKey = NULL;
+ NetworkInterfaceKeyIPv4 = NULL,
+ /* Netowrk interface key */
+ NetworkInterfaceKeyIPv6 = NULL;
/* Netowrk interface key */
@@ -306,7 +312,6 @@ cupsdUpdateSystemMonitor(void)
}
else
{
- /* TODO: Possibly update when MDNS support is added? */
cupsdLogMessage(CUPSD_LOG_DEBUG,
"Deregistering local printer \"%s\"", p->name);
cupsdSendBrowseDelete(p);
@@ -334,12 +339,6 @@ cupsdUpdateSystemMonitor(void)
"System network configuration changed");
/*
- * Force an update of the list of network interfaces in 2 seconds.
- */
-
- NetIFTime = time(NULL) - 58;
-
- /*
* Resetting browse_time before calling cupsdSendBrowseList causes
* browse packets to be sent for local shared printers.
*/
@@ -407,8 +406,8 @@ sysEventThreadEntry(void)
SCDynamicStoreRef store = NULL;/* System Config dynamic store */
CFRunLoopSourceRef powerRLS = NULL,/* Power runloop source */
storeRLS = NULL;/* System Config runloop source */
- CFStringRef key[3], /* System Config keys */
- pattern[1]; /* System Config patterns */
+ CFStringRef key[5], /* System Config keys */
+ pattern[2]; /* System Config patterns */
CFArrayRef keys = NULL, /* System Config key array*/
patterns = NULL;/* System Config pattern array */
SCDynamicStoreContext storeContext; /* Dynamic store context */
@@ -449,33 +448,58 @@ sysEventThreadEntry(void)
if (!ComputerNameKey)
ComputerNameKey = SCDynamicStoreKeyCreateComputerName(NULL);
- if (!NetworkGlobalKey)
- NetworkGlobalKey =
+ if (!NetworkGlobalKeyIPv4)
+ NetworkGlobalKeyIPv4 =
SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
kSCDynamicStoreDomainState,
kSCEntNetIPv4);
+ if (!NetworkGlobalKeyIPv6)
+ NetworkGlobalKeyIPv6 =
+ SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
+ kSCDynamicStoreDomainState,
+ kSCEntNetIPv6);
+
+ if (!NetworkGlobalKeyDNS)
+ NetworkGlobalKeyDNS =
+ SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL,
+ kSCDynamicStoreDomainState,
+ kSCEntNetDNS);
+
if (!HostNamesKey)
HostNamesKey = SCDynamicStoreKeyCreateHostNames(NULL);
- if (!NetworkInterfaceKey)
- NetworkInterfaceKey =
+ if (!NetworkInterfaceKeyIPv4)
+ NetworkInterfaceKeyIPv4 =
SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
kSCDynamicStoreDomainState,
kSCCompAnyRegex,
kSCEntNetIPv4);
- if (store && ComputerNameKey && NetworkGlobalKey && HostNamesKey &&
- NetworkInterfaceKey)
+ if (!NetworkInterfaceKeyIPv6)
+ NetworkInterfaceKeyIPv6 =
+ SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
+ kSCDynamicStoreDomainState,
+ kSCCompAnyRegex,
+ kSCEntNetIPv6);
+
+ if (store && ComputerNameKey && HostNamesKey &&
+ NetworkGlobalKeyIPv4 && NetworkGlobalKeyIPv6 && NetworkGlobalKeyDNS &&
+ NetworkInterfaceKeyIPv4 && NetworkInterfaceKeyIPv6)
{
key[0] = ComputerNameKey;
- key[1] = NetworkGlobalKey;
- key[2] = HostNamesKey;
- pattern[0] = NetworkInterfaceKey;
+ key[1] = NetworkGlobalKeyIPv4;
+ key[2] = NetworkGlobalKeyIPv6;
+ key[3] = NetworkGlobalKeyDNS;
+ key[4] = HostNamesKey;
+
+ pattern[0] = NetworkInterfaceKeyIPv4;
+ pattern[1] = NetworkInterfaceKeyIPv6;
keys = CFArrayCreate(NULL, (const void **)key,
sizeof(key) / sizeof(key[0]),
&kCFTypeArrayCallBacks);
+
patterns = CFArrayCreate(NULL, (const void **)pattern,
sizeof(pattern) / sizeof(pattern[0]),
&kCFTypeArrayCallBacks);
@@ -682,12 +706,17 @@ sysEventConfigurationNotifier(
if (CFArrayContainsValue(changedKeys, range, ComputerNameKey))
threadData->sysevent.event |= SYSEVENT_NAMECHANGED;
-
- if (CFArrayContainsValue(changedKeys, range, NetworkGlobalKey) ||
- CFArrayContainsValue(changedKeys, range, HostNamesKey) ||
- CFArrayContainsValue(changedKeys, range, NetworkInterfaceKey))
+ else
+ {
threadData->sysevent.event |= SYSEVENT_NETCHANGED;
+ /*
+ * Indicate the network interface list needs updating...
+ */
+
+ NetIFUpdate = 1;
+ }
+
/*
* Because we registered for several different kinds of change notifications
* this callback usually gets called several times in a row. We use a timer to
@@ -695,7 +724,7 @@ sysEventConfigurationNotifier(
*/
CFRunLoopTimerSetNextFireDate(threadData->timerRef,
- CFAbsoluteTimeGetCurrent() + 2);
+ CFAbsoluteTimeGetCurrent() + 5);
}
@@ -728,5 +757,5 @@ sysEventTimerNotifier(
/*
- * End of "$Id: sysman.c 5833 2006-08-16 20:05:58Z mike $".
+ * End of "$Id: sysman.c 6090 2006-11-14 16:35:27Z mike $".
*/
diff --git a/systemv/lpstat.c b/systemv/lpstat.c
index 46d74c56f..27f0926e8 100644
--- a/systemv/lpstat.c
+++ b/systemv/lpstat.c
@@ -1,5 +1,5 @@
/*
- * "$Id: lpstat.c 6073 2006-11-02 20:01:54Z mike $"
+ * "$Id: lpstat.c 6090 2006-11-14 16:35:27Z mike $"
*
* "lpstat" command for the Common UNIX Printing System (CUPS).
*
@@ -2038,7 +2038,7 @@ show_printers(http_t *http, /* I - HTTP connection to server */
if (reasons)
{
_cupsLangPuts(stdout, _("\tAlerts:"));
- for (j = 0; j < reasons->num_values; i ++)
+ for (j = 0; j < reasons->num_values; j ++)
_cupsLangPrintf(stdout, " %s",
reasons->values[j].string.text);
_cupsLangPuts(stdout, "\n");
@@ -2248,5 +2248,5 @@ show_scheduler(http_t *http) /* I - HTTP connection to server */
/*
- * End of "$Id: lpstat.c 6073 2006-11-02 20:01:54Z mike $".
+ * End of "$Id: lpstat.c 6090 2006-11-14 16:35:27Z mike $".
*/
diff --git a/templates/it/add-class.tmpl b/templates/it/add-class.tmpl
new file mode 100644
index 000000000..92d5e77bc
--- /dev/null
+++ b/templates/it/add-class.tmpl
@@ -0,0 +1,33 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Aggiungi classe</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nome:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Posizione:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Descrizione:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Membri:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-add-class.gif" ALT="Aggiungi classe"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/add-printer.tmpl b/templates/it/add-printer.tmpl
new file mode 100644
index 000000000..cff93eb29
--- /dev/null
+++ b/templates/it/add-printer.tmpl
@@ -0,0 +1,28 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Add New Printer</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Name:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(May contain any printable characters except "/", "#", and space)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Location:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Human-readable location such as "Lab 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Description:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Human-readable description such as "HP LaserJet with Duplexer")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continue"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/admin.tmpl b/templates/it/admin.tmpl
new file mode 100644
index 000000000..ee1019025
--- /dev/null
+++ b/templates/it/admin.tmpl
@@ -0,0 +1,77 @@
+<TABLE CELLPADDING="0" CELLSPACING="0" WIDTH="100%" SUMMARY="Administration Tasks">
+<TR><TD VALIGN="TOP" NOWRAP>
+
+<H2 CLASS="title">Stampanti</H2>
+
+<P>
+<A HREF="/admin?op=add-printer"><IMG
+SRC="/images/button-add-printer.gif" ALT="Aggiungi stampante" CLASS="button"></A>
+<A HREF="/printers/"><IMG SRC="/images/button-manage-printers.gif"
+ALT="Gestione stampanti" CLASS="button"></A>
+{have_samba?<A HREF="/admin/?op=export-samba"><IMG
+SRC="/images/button-export-samba.gif" ALT="Esporta stampanti su Samba"
+CLASS="button"></A>:}
+</P>
+
+{#device_uri=0?:<P><B>Nuove stampanti trovate:</B></P><UL>{[device_uri]
+<LI><A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="Aggiungi questa stampante" CLASS="button"
+ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
+}</UL>}
+
+<H2 CLASS="title">Classi</H2>
+
+<P>
+<A HREF="/admin?op=add-class"><IMG SRC="/images/button-add-class.gif"
+ALT="Aggiungi classe" CLASS="button"></A>
+<A HREF="/classes/"><IMG SRC="/images/button-manage-classes.gif"
+ALT="Gestione classi" CLASS="button"></A>
+</P>
+
+<H2 CLASS="title">Operazioni</H2>
+
+<P>
+<A HREF="/jobs/"><IMG SRC="/images/button-manage-jobs.gif" ALT="Gestione
+operazioni" CLASS="button"></A>
+</P>
+
+</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
+
+<H2 CLASS="title">Server</H2>
+
+<P>
+<A HREF="/admin?op=config-server"><IMG
+SRC="/images/button-edit-configuration-file.gif" ALT="Modifica file di configurazione"
+CLASS="button"></A>
+<A HREF="/admin/log/access_log" TARGET="_blank"><IMG
+SRC="/images/button-view-access-log.gif" ALT="Mostra registro degli accessi"
+CLASS="button"></A>
+<A HREF="/admin/log/error_log" TARGET="_blank"><IMG
+SRC="/images/button-view-error-log.gif" ALT="Mostra registro degli errori"
+CLASS="button"></A>
+<A HREF="/admin/log/page_log" TARGET="_blank"><IMG
+SRC="/images/button-view-page-log.gif" ALT="Mostra registro delle pagine"
+CLASS="button"></A>
+</P>
+
+{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+<FORM METHOD="POST" ACTION="/admin">
+
+<P><B>Impostazioni di base del server:</B></P>
+
+<P><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_PRINTERS" {?remote_printers}> Mostra stampanti condivise da altri sistemi<BR>
+<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Condividi le stampanti pubblicate connesse a questo sistema<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Consenti amministrazione remota<BR>
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Consenti agli utenti di annullare qualunque operazione (non solo le proprie)<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Salva le informazioni di debug per la risoluzione di problemi</P>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-change-settings.gif" ALT="Modifica impostazioni"></P>
+
+</FORM>}
+
+</TD></TR>
+</TABLE>
diff --git a/templates/it/choose-device.tmpl b/templates/it/choose-device.tmpl
new file mode 100644
index 000000000..767c0212f
--- /dev/null
+++ b/templates/it/choose-device.tmpl
@@ -0,0 +1,26 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">Dispositivo per {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Dispositivo:</TH>
+<TD>
+<SELECT NAME="DEVICE_URI">
+{[device_uri]<OPTION VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}" {?current_device_uri={device_uri}?SELECTED:{current_device_scheme={device_uri}?SELECTED:}}>
+{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}</OPTION>
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continua"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/choose-make.tmpl b/templates/it/choose-make.tmpl
new file mode 100644
index 000000000..7240ac59a
--- /dev/null
+++ b/templates/it/choose-make.tmpl
@@ -0,0 +1,42 @@
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Marca/Produttore per {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Marca:</TH>
+<TD>
+<SELECT NAME="PPD_MAKE" SIZE="10">
+{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continua"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>&nbsp;</TD>
+</TR>
+<TR>
+<TH CLASS="label">O fornisci un file PPD:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Aggiungi stampante:Modifica stampante}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/choose-model.tmpl b/templates/it/choose-model.tmpl
new file mode 100644
index 000000000..3ab1dec4a
--- /dev/null
+++ b/templates/it/choose-model.tmpl
@@ -0,0 +1,34 @@
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Modello/Driver per {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Modello:</TH>
+<TD>
+<SELECT NAME="PPD_NAME" SIZE="10">
+{[ppd_name]<OPTION VALUE="{ppd_name}" {?current_make_and_model={ppd_make_and_model}?SELECTED:}>{ppd_make_and_model} ({ppd_natural_language})
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">O fornisci un file PPD:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Aggiungi stampante:Modifica stampante}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/choose-serial.tmpl b/templates/it/choose-serial.tmpl
new file mode 100644
index 000000000..dbcc12dd7
--- /dev/null
+++ b/templates/it/choose-serial.tmpl
@@ -0,0 +1,47 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+
+<H2 CLASS="title">Impostazioni porta seriale per {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Velocit&agrave; di trasmissione:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Parit&agrave;:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>Nessuna
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Pari
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Dispary
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Bit dati:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Controllo di flusso:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>Nessuno
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Software)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Hardware)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Hardware)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continua"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/choose-uri.tmpl b/templates/it/choose-uri.tmpl
new file mode 100644
index 000000000..3837b2b9e
--- /dev/null
+++ b/templates/it/choose-uri.tmpl
@@ -0,0 +1,42 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">URI del dispositivo per {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">URI del dispositivo:</TH>
+<TD><INPUT TYPE="TEXT" SIZE="60" MAXLENGTH="1024" NAME="DEVICE_URI" VALUE="{device_uri}"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>Esempi:
+<PRE>
+ http://hostname:631/ipp/
+ http://hostname:631/ipp/port1
+
+ ipp://hostname/ipp/
+ ipp://hostname/ipp/port1
+
+ lpd://hostname/queue
+
+ socket://hostname
+ socket://hostname:9100
+</PRE>
+
+<P>Vedi <A HREF="/help/network.html" TARGET="_blank">"Stampanti di
+rete"</A> per il corretto URI da utilizzare con la tua stampante.</P>
+
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continua"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/class-added.tmpl b/templates/it/class-added.tmpl
new file mode 100644
index 000000000..ef4fe496e
--- /dev/null
+++ b/templates/it/class-added.tmpl
@@ -0,0 +1,2 @@
+<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> &egrave; stata aggiunta
+con successo.
diff --git a/templates/it/class-confirm.tmpl b/templates/it/class-confirm.tmpl
new file mode 100644
index 000000000..0a248336c
--- /dev/null
+++ b/templates/it/class-confirm.tmpl
@@ -0,0 +1,7 @@
+<P><B>Attenzione:</B> Sei sicuro di voler eliminare la classe
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-class&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-class.gif" ALT="Elimina classe"
+CLASS="button"></A></P>
diff --git a/templates/it/class-deleted.tmpl b/templates/it/class-deleted.tmpl
new file mode 100644
index 000000000..3fc2ffa1e
--- /dev/null
+++ b/templates/it/class-deleted.tmpl
@@ -0,0 +1 @@
+<P>La classe {printer_name} &egrave; stata eliminata con successo.
diff --git a/templates/it/class-jobs-header.tmpl b/templates/it/class-jobs-header.tmpl
new file mode 100644
index 000000000..2a0cadc33
--- /dev/null
+++ b/templates/it/class-jobs-header.tmpl
@@ -0,0 +1 @@
+<H3 CLASS="title">Operazioni</H3>
diff --git a/templates/it/class-modified.tmpl b/templates/it/class-modified.tmpl
new file mode 100644
index 000000000..27ebcd7ea
--- /dev/null
+++ b/templates/it/class-modified.tmpl
@@ -0,0 +1,2 @@
+<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> &egrave; stata
+modificata con successo.
diff --git a/templates/it/classes-header.tmpl b/templates/it/classes-header.tmpl
new file mode 100644
index 000000000..1fe0f4fa0
--- /dev/null
+++ b/templates/it/classes-header.tmpl
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Nessuna classe:Mostrat{total=1?a:e} {#printer_name} di {total} class{total=1?e:i}}.</P>
diff --git a/templates/it/classes.tmpl b/templates/it/classes.tmpl
new file mode 100644
index 000000000..288270642
--- /dev/null
+++ b/templates/it/classes.tmpl
@@ -0,0 +1,54 @@
+{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Stampante predefinita):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN=TOP><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/classes.gif" CLASS="button" ALT=""></A></TD>
+<TD VALIGN=TOP><B>Descrizione:</B> {printer_info}<BR>
+<B>Posizione:</B> {printer_location}<BR>
+<B>Stato della classe:</B> {printer_state=3?in attesa:{printer_state=4?elaborazione in corso:fermata}},
+{printer_is_accepting_jobs=0?scarta operazioni:accetta operazioni}, {printer_is_shared=0?non:} pubblicata.
+{?member_uris=?:<BR>Membri: {member_uris}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Stampa pagina di prova" CLASS="button"></A>
+{printer_state=5?
+<A HREF="{admin_uri}?op=start-class&amp;printer_name={%printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-start-class.gif" ALT="Avvia classe" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-class&amp;printer_name={%printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-stop-class.gif" ALT="Ferma classe" CLASS="button"></A>
+}
+{printer_is_accepting_jobs=0?
+<A HREF="{admin_uri}?op=accept-jobs&amp;printer_name={%printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Accetta operazioni" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={%printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Scarta operazioni" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={%printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Annulla tutte le operazioni" CLASS="button"></A>
+{printer_is_shared=0?
+<A HREF="{admin_uri}?op=set-sharing&amp;printer_name={%printer_name}&amp;shared=1&amp;is_class=Y">
+<IMG SRC="/images/button-publish-printer.gif" ALT="Pubblica la stampante" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=set-sharing&amp;printer_name={%printer_name}&amp;shared=0&amp;is_class=Y">
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Non pubblicare la stampante" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-class&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-modify-class.gif" ALT="Modifica classe" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-class&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-delete-class.gif" ALT="Elimina classe" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&amp;printer_name={%printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Imposta come predefinita" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={%printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Imposta utenti autorizzati" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
diff --git a/templates/it/edit-config.tmpl.in b/templates/it/edit-config.tmpl.in
new file mode 100644
index 000000000..be2ed2ba4
--- /dev/null
+++ b/templates/it/edit-config.tmpl.in
@@ -0,0 +1,91 @@
+<SCRIPT TYPE="text/javascript">
+function reset_config()
+{
+ document.cups.CUPSDCONF.value =
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
+"LogLevel info\\n" +
+"\\n" +
+"\\n" +
+"# Administrator user group...\\n" +
+"SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
+"\\n" +
+"\\n" +
+"# Only listen for connections from the local machine.\\n" +
+"Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
+"@CUPS_LISTEN_DOMAINSOCKET@\\n" +
+"\\n" +
+"\\n" +
+"# Show shared printers on the local network.\\n" +
+"Browsing On\\n" +
+"BrowseOrder allow,deny\\n" +
+"BrowseAllow @LOCAL\\n" +
+"\\n" +
+"\\n" +
+"# Authenticate against system accounts by default...\\n" +
+"DefaultAuthType Basic\\n" +
+"\\n" +
+"# Restrict access to the server...\\n" +
+"<Location />\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to the admin pages...\\n" +
+"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED@\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to configuration files...\\n" +
+"<Location /admin/conf>\\n" +
+" AuthType Basic\\n" +
+" Require user @SYSTEM\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Set the default printer/job policies...\\n" +
+"<Policy default>\\n" +
+" # Job-related operations must be done by the owner or an adminstrator...\\n" +
+" <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
+" Require user @OWNER @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" # All administration operations require an adminstrator to authenticate...\\n" +
+" <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
+" AuthType Basic\\n" +
+" Require user @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" # Only the owner or an administrator can cancel or authenticate a job...\\n" +
+" <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
+" Require user @OWNER @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" <Limit All>\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"</Policy>\\n";
+}
+</SCRIPT>
+
+<H2 CLASS="title">File di configurazione del server</H2>
+
+<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
+
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+
+<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-save-changes.gif"
+ALT="Salva le modifiche"> <A
+HREF="javascript:reset_config();"><IMG
+SRC="/images/button-use-default-config.gif" CLASS="button"
+ALT="Usa il file di configurazione predefinito"></A></P>
+
+</FORM>
diff --git a/templates/it/error-op.tmpl b/templates/it/error-op.tmpl
new file mode 100644
index 000000000..5e56a6c77
--- /dev/null
+++ b/templates/it/error-op.tmpl
@@ -0,0 +1,3 @@
+<P>Errore:</P>
+
+<BLOCKQUOTE>Operazione "{op}" sconosciuta!</BLOCKQUOTE>
diff --git a/templates/it/error.tmpl b/templates/it/error.tmpl
new file mode 100644
index 000000000..ad9f643e9
--- /dev/null
+++ b/templates/it/error.tmpl
@@ -0,0 +1,3 @@
+<P>{?message?{message}:Errore:}</P>
+
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
diff --git a/templates/it/header.tmpl.in b/templates/it/header.tmpl.in
new file mode 100644
index 000000000..9256e8130
--- /dev/null
+++ b/templates/it/header.tmpl.in
@@ -0,0 +1,63 @@
+<!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>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+ <!-- Prevent caching of CGI content -->
+ <META HTTP-EQUIV="Expires" CONTENT="now">
+ <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+ {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
+ <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="{title}">
+<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>{title}</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="unsel" HREF="/"><IMG SRC="/images/tab-left.gif"
+WIDTH="4" HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Home&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=admin?:un}sel" HREF="/admin"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Amministrazione&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=classes?:un}sel" HREF="/classes/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Classi&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=help?:un}sel" HREF="/help/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Documentazione/Aiuto&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=jobs?:un}sel" HREF="/jobs/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Operazioni&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=printers?:un}sel" HREF="/printers/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Stampanti&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15">&nbsp;</TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="height: 100%;" VALIGN="TOP" CLASS="page">
diff --git a/templates/it/help-header.tmpl b/templates/it/help-header.tmpl
new file mode 100644
index 000000000..2caf5d2c7
--- /dev/null
+++ b/templates/it/help-header.tmpl
@@ -0,0 +1,47 @@
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
+{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
+
+<P ALIGN="CENTER"><B>Cerca in
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Tutti i documenti}}:</B> <INPUT
+TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Cerca">
+<A HREF="/help/{?HELPFILE}{QUERY?{TOPIC??TOPIC={TOPIC}:}:}"><IMG
+SRC="/images/button-clear.gif" ALT="Pulisci" CLASS="button"></A></P>
+
+</FORM>
+
+<!-- Bookmarks -->
+<DIV CLASS="sidebar">
+<H3 CLASS="title">Guida in linea</H3>
+
+<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Tutti i documenti</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</DIV>
+
+{QUERY?<P>Cerca risultati in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Tutti i documenti}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Nessuna corrispondenza trovata.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<H1>{HELPTITLE}
+<A HREF="/help/{HELPFILE}?PRINTABLE=YES" TARGET="_blank"><IMG
+SRC="/images/button-view-printable-version.gif" ALT="Mostra versione stampabile"
+CLASS="button"></A></H1>:<H1>Pagine della guida di CUPS</H1>
+
+<P>Questa &egrave; l'interfaccia di guida in linea di CUPS. Inserisci sopra i termini di
+ricerca o fai clic su ognuno dei collegamenti alla documentazione per visualizzare
+le informazioni.</P>
+
+<P>Se sei nuovo di CUPS, leggi la pagina "<a
+href="overview.html">Sommario di CUPS</a>". Gli utenti di vecchia data
+dovrebbero leggere la pagina "<a href="whatsnew.html">Cosa c'&egrave; di nuovo in CUPS
+1.2</a>".</P>
+
+<P>La <A HREF="http://www.cups.org/">pagina principale di CUPS</A> fornisce
+inoltre molte risorse tra cui forum di discussione per utenti, risposte
+alla domande frequenti, e un modulo per la segnalazione di bug
+e richieste di nuove funzionalit&agrave;.</P>}
diff --git a/templates/it/help-printable.tmpl b/templates/it/help-printable.tmpl
new file mode 100644
index 000000000..305112a33
--- /dev/null
+++ b/templates/it/help-printable.tmpl
@@ -0,0 +1,11 @@
+<!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>{HELPTITLE}</TITLE>
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups-printable.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+
+<H1>{HELPTITLE}</H1>
diff --git a/templates/it/job-cancel.tmpl b/templates/it/job-cancel.tmpl
new file mode 100644
index 000000000..24054cff4
--- /dev/null
+++ b/templates/it/job-cancel.tmpl
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">L'operazione {job_id}</A> &egrave; stata annullata.
diff --git a/templates/it/job-hold.tmpl b/templates/it/job-hold.tmpl
new file mode 100644
index 000000000..97df9d34a
--- /dev/null
+++ b/templates/it/job-hold.tmpl
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">L'operazione {job_id}</A> &egrave; stata bloccata.
diff --git a/templates/it/job-move.tmpl b/templates/it/job-move.tmpl
new file mode 100644
index 000000000..cc4a8a07d
--- /dev/null
+++ b/templates/it/job-move.tmpl
@@ -0,0 +1,22 @@
+<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
+
+<H2 CLASS="title">{job_id?Sposta l'operazione {job_id}:Sposta tutte le operazioni}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nuova destinazione:</TH>
+<TD>
+<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
+{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-move-job{job_id?:s}.gif" ALT="Sposta operazion{job_id?e:i}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/job-moved.tmpl b/templates/it/job-moved.tmpl
new file mode 100644
index 000000000..d14cc58e9
--- /dev/null
+++ b/templates/it/job-moved.tmpl
@@ -0,0 +1,2 @@
+<P>{job_id?<A HREF="/jobs/{job_id}">Operazione {job_id}</A>:Tutte le operazioni} spostat{job_id?a:e} su
+<A HREF="{job_printer_uri}">{job_printer_name}</A>.</P>
diff --git a/templates/it/job-release.tmpl b/templates/it/job-release.tmpl
new file mode 100644
index 000000000..fc82ff0bf
--- /dev/null
+++ b/templates/it/job-release.tmpl
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">L'operazione {job_id}</A> &egrave; stata rilasciata per la stampa.
diff --git a/templates/it/job-restart.tmpl b/templates/it/job-restart.tmpl
new file mode 100644
index 000000000..9f1b74061
--- /dev/null
+++ b/templates/it/job-restart.tmpl
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">L'operazione {job_id}</A> &egrave; stata riavviata.
diff --git a/templates/it/jobs-header.tmpl b/templates/it/jobs-header.tmpl
new file mode 100644
index 000000000..385534fa2
--- /dev/null
+++ b/templates/it/jobs-header.tmpl
@@ -0,0 +1,15 @@
+<P>{?which_jobs=?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Mostra operazioni completate"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Mostra tutte le operazioni">:{which_jobs=all?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Mostra operazioni completate"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Mostra operazioni attive">:<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Mostra operazioni attive"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Mostra tutte le operazioni">}}</A></P>
+
+<P ALIGN="CENTER">{total=0?Nessuna operazione:Mostrat{total=1?a:e} {#job_id} di {total} operazion{total=1?e:i} {?which_jobs=?attiva:{which_jobs=all?:completata}} }.</P>
diff --git a/templates/it/jobs.tmpl b/templates/it/jobs.tmpl
new file mode 100644
index 000000000..6f8f555ec
--- /dev/null
+++ b/templates/it/jobs.tmpl
@@ -0,0 +1,42 @@
+{#job_id=0?:
+<TABLE CELLPADDING="0" CELLSPACING="0" CLASS="button" WIDTH="100%" SUMMARY="Job List">
+<TR CLASS="data">
+<TH>ID&nbsp;</TH>
+<TH>Nome&nbsp;</TH>
+<TH>Utente&nbsp;</TH>
+<TH>Dimensione&nbsp;</TH>
+<TH>Pagine&nbsp;</TH>
+<TH>Stato&nbsp;</TH>
+<TH>Controllo&nbsp;</TH>
+</TR>
+
+{[job_id]
+<TR CLASS="data" VALIGN="TOP">
+<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}&nbsp;</TD>
+<TD>{?job_name=?Sconosciuto:{job_name}}&nbsp;</TD>
+<TD>{job_originating_user_name}&nbsp;</TD>
+<TD>{job_k_octets}k&nbsp;</TD>
+<TD>{job_media_sheets_completed=0?Sconosciuto:{?job_media_sheets_completed}}</TD>
+<TD>{job_state=3?in sospeso da<BR>{time_at_creation}:{job_state=4?bloccata da<BR>{time_at_creation}:
+{job_state=5?elaborazione in corso da<BR>{time_at_processing}:{job_state=6?fermata:
+{job_state=7?annullata a<BR>{time_at_completed}:{job_state=8?interrotta:completata a<BR>{time_at_completed}}}}}}}&nbsp;</TD>
+<TD>
+{job_preserved>0?
+<A HREF="/jobs/?op=restart-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-restart-job.gif" ALT="Ristampa operazione" CLASS="button"></A>:}
+{job_state=4?
+<A HREF="/jobs/?op=release-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-release-job.gif" ALT="Rilascia operazione" CLASS="button"></A>:}
+{job_state=3?
+<A HREF="/jobs/?op=hold-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-hold-job.gif" ALT="Blocca operazione" CLASS="button"></A>:}
+{job_state<7?
+<A HREF="/jobs/?op=cancel-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-cancel-job.gif" ALT="Annulla operazione" CLASS="button"></A>
+<A HREF="/jobs/?op=move-job&amp;job_id={job_id}"><IMG
+SRC="/images/button-move-job.gif" ALT="Sposta operazione" CLASS="button"></A>:}
+&nbsp;</TD>
+</TR>
+}
+</TABLE>
+}
diff --git a/templates/it/maintenance.tmpl b/templates/it/maintenance.tmpl
new file mode 100644
index 000000000..1b88d6c78
--- /dev/null
+++ b/templates/it/maintenance.tmpl
@@ -0,0 +1,2 @@
+<P>comandi di manutenzione inviati; l'ID dell'operazione &egrave; <A HREF="/printers/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
diff --git a/templates/it/modify-class.tmpl b/templates/it/modify-class.tmpl
new file mode 100644
index 000000000..25d158a2d
--- /dev/null
+++ b/templates/it/modify-class.tmpl
@@ -0,0 +1,34 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Modifica classe {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nome:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Posizione:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Descrizione:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Membri:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-modify-class.gif" ALT="Modifica classe"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/modify-printer.tmpl b/templates/it/modify-printer.tmpl
new file mode 100644
index 000000000..a9eafb130
--- /dev/null
+++ b/templates/it/modify-printer.tmpl
@@ -0,0 +1,29 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{?device_uri=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_DEVICE_URI" VALUE="{device_uri}">}
+{?printer_make_and_model=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{printer_make_and_model}">}
+
+<H2 CLASS="title">Modifica stampante {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nome:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Posizione:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Posizione comprensibile del tipo "Laboratorio 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Descrizione:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Descrizione comprensibile del tipo "HP LaserJet con Duplexer")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continua"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/norestart.tmpl b/templates/it/norestart.tmpl
new file mode 100644
index 000000000..780f7661c
--- /dev/null
+++ b/templates/it/norestart.tmpl
@@ -0,0 +1,2 @@
+<p>Il server non &egrave; riavviato poich&eacute; non ci sono state modifiche
+della configurazione...</p>
diff --git a/templates/it/option-boolean.tmpl b/templates/it/option-boolean.tmpl
new file mode 100644
index 000000000..72c85189a
--- /dev/null
+++ b/templates/it/option-boolean.tmpl
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD>
+{[choices]<INPUT TYPE="RADIO" NAME="{keyword}" {choices={defchoice}?CHECKED:} VALUE="{choices}">{text}}
+</TD>
+</TR>
diff --git a/templates/it/option-conflict.tmpl b/templates/it/option-conflict.tmpl
new file mode 100644
index 000000000..c0e20317d
--- /dev/null
+++ b/templates/it/option-conflict.tmpl
@@ -0,0 +1,7 @@
+<P><B>Errore:</B> Le seguenti opzioni sono in conflitto:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A></LI>
+}</UL>
+
+<P>Modifica una o pi&ugrave; opzioni per risolvere il problema.</P>
diff --git a/templates/it/option-header.tmpl b/templates/it/option-header.tmpl
new file mode 100644
index 000000000..cafc9f9fe
--- /dev/null
+++ b/templates/it/option-header.tmpl
@@ -0,0 +1,3 @@
+<H2 CLASS="title">{printer_name}: {group}</H2>
+
+<TABLE>
diff --git a/templates/it/option-pickmany.tmpl b/templates/it/option-pickmany.tmpl
new file mode 100644
index 000000000..d2534af75
--- /dev/null
+++ b/templates/it/option-pickmany.tmpl
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
diff --git a/templates/it/option-pickone.tmpl b/templates/it/option-pickone.tmpl
new file mode 100644
index 000000000..08342d06e
--- /dev/null
+++ b/templates/it/option-pickone.tmpl
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
diff --git a/templates/it/option-trailer.tmpl b/templates/it/option-trailer.tmpl
new file mode 100644
index 000000000..25af37874
--- /dev/null
+++ b/templates/it/option-trailer.tmpl
@@ -0,0 +1,5 @@
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="Imposta opzioni stampante"></TD>
+</TR>
+</TABLE>
diff --git a/templates/it/pager.tmpl b/templates/it/pager.tmpl
new file mode 100644
index 000000000..e3dbd099a
--- /dev/null
+++ b/templates/it/pager.tmpl
@@ -0,0 +1,7 @@
+<TABLE WIDTH="100%" CLASS="pager" SUMMARY="Paging Bar">
+<TR>
+ <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/button-show-previous.gif" ALT="Mostra precedente" CLASS="button"></A>:&nbsp;}</TD>
+ <TD WIDTH="34%" ALIGN="CENTER">{ORDER=dec?<A HREF="{THISURL}&amp;ORDER=asc"><IMG SRC="/images/button-sort-ascending.gif" ALT="Ordine crescente" CLASS="button"></A>:<A HREF="{THISURL}&amp;ORDER=dec"><IMG SRC="/images/button-sort-descending.gif" ALT="Ordine decrescente" CLASS="button"></A>}</TD>
+ <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/button-show-next.gif" ALT="Mostra successivo" CLASS="button"></A>:&nbsp;}</TD>
+</TR>
+</TABLE>
diff --git a/templates/it/printer-accept.tmpl b/templates/it/printer-accept.tmpl
new file mode 100644
index 000000000..19de4a1d4
--- /dev/null
+++ b/templates/it/printer-accept.tmpl
@@ -0,0 +1,3 @@
+<P>{is_class?La classe:La stampante} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+adesso accetta operazioni.</P>
diff --git a/templates/it/printer-added.tmpl b/templates/it/printer-added.tmpl
new file mode 100644
index 000000000..e45fb7fd6
--- /dev/null
+++ b/templates/it/printer-added.tmpl
@@ -0,0 +1,2 @@
+<P>La stampante <A HREF="/printers/{printer_name}">{printer_name}</A> &egrave; stata aggiunta
+con successo.
diff --git a/templates/it/printer-configured.tmpl b/templates/it/printer-configured.tmpl
new file mode 100644
index 000000000..c28b9d09d
--- /dev/null
+++ b/templates/it/printer-configured.tmpl
@@ -0,0 +1,2 @@
+<P>La stampante <A HREF="/printers/{printer_name}">{printer_name}</A> &egrave;
+stata configurata con successo.
diff --git a/templates/it/printer-confirm.tmpl b/templates/it/printer-confirm.tmpl
new file mode 100644
index 000000000..1f3e891a2
--- /dev/null
+++ b/templates/it/printer-confirm.tmpl
@@ -0,0 +1,7 @@
+<P><B>Attenzione:</B> Sei sicuro di voler eliminare la stampante
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-printer&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-printer.gif" ALT="Elimina stampante"
+CLASS="button"></A></P>
diff --git a/templates/it/printer-default.tmpl b/templates/it/printer-default.tmpl
new file mode 100644
index 000000000..cab22c3b6
--- /dev/null
+++ b/templates/it/printer-default.tmpl
@@ -0,0 +1,7 @@
+<P>{is_class?La classe:La stampante} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+&egrave; stata impostata come predefinita sul server.</P>
+
+<BLOCKQUOTE><B>Nota:</B> Qualunque valore inserito dall'utente impostato con
+il comando <TT>lpoptions</TT> sarà scavalcato da questa impostazione
+predefinita.</BLOCKQUOTE>
diff --git a/templates/it/printer-deleted.tmpl b/templates/it/printer-deleted.tmpl
new file mode 100644
index 000000000..fe498a50c
--- /dev/null
+++ b/templates/it/printer-deleted.tmpl
@@ -0,0 +1 @@
+<P>La stampante {printer_name} &egrave; stata eliminata con successo.
diff --git a/templates/it/printer-jobs-header.tmpl b/templates/it/printer-jobs-header.tmpl
new file mode 100644
index 000000000..2a0cadc33
--- /dev/null
+++ b/templates/it/printer-jobs-header.tmpl
@@ -0,0 +1 @@
+<H3 CLASS="title">Operazioni</H3>
diff --git a/templates/it/printer-modified.tmpl b/templates/it/printer-modified.tmpl
new file mode 100644
index 000000000..a36b81d85
--- /dev/null
+++ b/templates/it/printer-modified.tmpl
@@ -0,0 +1,2 @@
+<P>La stampante <A HREF="/printers/{printer_name}">{printer_name}</A> &egrave; stata
+modificata con successo.
diff --git a/templates/it/printer-purge.tmpl b/templates/it/printer-purge.tmpl
new file mode 100644
index 000000000..b196be041
--- /dev/null
+++ b/templates/it/printer-purge.tmpl
@@ -0,0 +1,3 @@
+<P>{is_class?La classe:La stampante} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+&egrave; stata svuotata di tutte le operazioni.</P>
diff --git a/templates/it/printer-reject.tmpl b/templates/it/printer-reject.tmpl
new file mode 100644
index 000000000..225783f9e
--- /dev/null
+++ b/templates/it/printer-reject.tmpl
@@ -0,0 +1,3 @@
+<P>{is_class?La classe:La stampante} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+non accetta altre operazioni.</P>
diff --git a/templates/it/printer-start.tmpl b/templates/it/printer-start.tmpl
new file mode 100644
index 000000000..b5abdc97a
--- /dev/null
+++ b/templates/it/printer-start.tmpl
@@ -0,0 +1,3 @@
+<P>{is_class?La classe:La stampante} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+&egrave; stata avviata.</P>
diff --git a/templates/it/printer-stop.tmpl b/templates/it/printer-stop.tmpl
new file mode 100644
index 000000000..5af7bffb4
--- /dev/null
+++ b/templates/it/printer-stop.tmpl
@@ -0,0 +1,3 @@
+<P>{is_class?La classe:La stampante} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+&egrave; stata fermata.</P>
diff --git a/templates/it/printers-header.tmpl b/templates/it/printers-header.tmpl
new file mode 100644
index 000000000..e10112df7
--- /dev/null
+++ b/templates/it/printers-header.tmpl
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Nessuna stampante:Mostrat{total=1?a:e} {#printer_name} di {total} stampant{total=1?e:i}}.</P>
diff --git a/templates/it/printers.tmpl b/templates/it/printers.tmpl
new file mode 100644
index 000000000..106974498
--- /dev/null
+++ b/templates/it/printers.tmpl
@@ -0,0 +1,64 @@
+{printer_type?:}{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Default Printer):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN="TOP"><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/printer-{printer_state=3?idle:{printer_state=4?processing:stopped}}.gif" CLASS="button" ALT=""></A>
+</TD>
+<TD VALIGN="TOP"><B>Descrizione:</B> {printer_info}<BR>
+<B>Posizione:</B> {printer_location}<BR>
+<B>Marca e modello:</B> {printer_make_and_model}<BR>
+<B>Stato della stampante:</B> {printer_state=3?in attesa:{printer_state=4?elaborazione in corso:fermata}},
+{printer_is_accepting_jobs=0?scarta operazioni:accetta operazioni}, {printer_is_shared=0?non:} pubblicata.
+{?device_uri=?:<BR><B>URI del dispositivo:</B> {device_uri}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Stampa pagina di prova" CLASS="button"></A>
+{?cupscommand=1?<A HREF="{printer_uri_supported}?op=clean-print-heads">
+<IMG SRC="/images/button-clean-print-heads.gif" ALT="Pulizia delle testine" CLASS="button"></A>
+<A HREF="{printer_uri_supported}?op=print-self-test-page">
+<IMG SRC="/images/button-print-self-test-page.gif" ALT="Stampa pagina di prova predefinita" CLASS="button"></A>:}
+{printer_state=5?
+<A HREF="{admin_uri}?op=start-printer&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-start-printer.gif" ALT="Avvia stampante" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-printer&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-stop-printer.gif" ALT="Ferma stampante" CLASS="button"></A>
+}
+{printer_is_accepting_jobs=0?
+<A HREF="{admin_uri}?op=accept-jobs&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Accetta operazioni" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Scarta operazioni" CLASS="button"></A>
+}
+<A HREF="{printer_uri_supported}?op=move-jobs&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-move-jobs.gif" ALT="Sposta tutte le operazioni" CLASS="button"></A>
+<A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Annulla tutte le operazioni" CLASS="button"></A>
+{printer_is_shared=0?
+<A HREF="{admin_uri}?op=set-sharing&amp;printer_name={%printer_name}&amp;shared=1">
+<IMG SRC="/images/button-publish-printer.gif" ALT="Pubblica stampante" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=set-sharing&amp;printer_name={%printer_name}&amp;shared=0">
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Non pubblicare stampante" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-printer&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-modify-printer.gif" ALT="Modifica stampante" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-printer-options&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-set-printer-options.gif" ALT="Imposta opzioni stampante" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-printer&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-delete-printer.gif" ALT="Elimina stampante" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Imposta come predefinita" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={%printer_name}">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Imposta utenti autorizzati" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
diff --git a/templates/it/restart.tmpl b/templates/it/restart.tmpl
new file mode 100644
index 000000000..7ba2a5817
--- /dev/null
+++ b/templates/it/restart.tmpl
@@ -0,0 +1 @@
+<p>Attendere il riavvio del server...</p>
diff --git a/templates/it/samba-export.tmpl b/templates/it/samba-export.tmpl
new file mode 100644
index 000000000..9339e8db9
--- /dev/null
+++ b/templates/it/samba-export.tmpl
@@ -0,0 +1,54 @@
+<SCRIPT TYPE="text/javascript"><!--
+function select_printers() {
+ var list = document.export_samba.EXPORT_NAME;
+ var sel = document.export_samba.EXPORT_ALL.checked;
+
+ for (i = 0; i < list.length; i ++) {
+ list.options[i].selected = sel;
+ }
+}
+--></SCRIPT>
+
+<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
+
+<H2 CLASS="title">Esporta stampanti su Samba</H2>
+
+{error?<P>Impossibile esportare stampanti su Samba\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Consulta il file <A HREF="/admin/log/error_log"
+TARGET="_blank">error_log</A> per ulteriori informazioni.</P>:
+<P>Questa pagina ti consente di esportare stampanti su Samba in modo tale
+che i client Windows possano accedere ad esse dall'icona <VAR>Risorse di
+rete</VAR> sui rispettivi desktop. Occorre installare previamente il driver
+di stampa Windows PostScript come descritto nella pagina di manuale <A
+HREF="/help/man-cupsaddsmb.html"
+TARGET="_blank">cupsaddsmb(8)</A>.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Stampanti:</TH>
+<TD>
+<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
+{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
+</SELECT><BR>
+<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
+onChange="select_printers()"> Esporta tutte le stampanti
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Nome utente Samba:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (richiesto)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Password Samba:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (richiesto)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-export-samba.gif"
+ALT="Esporta stampanti su Samba"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/it/samba-exported.tmpl b/templates/it/samba-exported.tmpl
new file mode 100644
index 000000000..78ee85e39
--- /dev/null
+++ b/templates/it/samba-exported.tmpl
@@ -0,0 +1 @@
+<P>Stampanti esportate su Samba con successo.</P>
diff --git a/templates/it/search.tmpl b/templates/it/search.tmpl
new file mode 100644
index 000000000..d69e9345d
--- /dev/null
+++ b/templates/it/search.tmpl
@@ -0,0 +1,13 @@
+<FORM ACTION="/{SECTION}/{?SEARCH_DEST}" METHOD="GET">
+{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
+{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
+
+<P ALIGN="CENTER"><B>Cerca in
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Classi:{SECTION=jobs?Operazioni:Stampanti}}}:</B>
+<INPUT TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Cerca">
+<A
+HREF="/{SECTION}/{?SEARCH_DEST}{WHICH_JOBS??WHICH_JOBS={WHICH_JOBS}{ORDER?&amp;ORDER={ORDER}:}:{ORDER??ORDER={ORDER}:}}"><IMG
+SRC="/images/button-clear.gif" ALT="Pulisci" CLASS="button"></A></P>
+
+</FORM>
diff --git a/templates/it/set-printer-options-header.tmpl b/templates/it/set-printer-options-header.tmpl
new file mode 100644
index 000000000..864f9f0ce
--- /dev/null
+++ b/templates/it/set-printer-options-header.tmpl
@@ -0,0 +1,3 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
diff --git a/templates/it/set-printer-options-trailer.tmpl b/templates/it/set-printer-options-trailer.tmpl
new file mode 100644
index 000000000..a3d1e1ffa
--- /dev/null
+++ b/templates/it/set-printer-options-trailer.tmpl
@@ -0,0 +1 @@
+</FORM>
diff --git a/templates/it/test-page.tmpl b/templates/it/test-page.tmpl
new file mode 100644
index 000000000..a2718c8d2
--- /dev/null
+++ b/templates/it/test-page.tmpl
@@ -0,0 +1,2 @@
+<P>Pagina di prova inviata; l'ID dell'operazione &egrave; <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
diff --git a/templates/it/trailer.tmpl b/templates/it/trailer.tmpl
new file mode 100644
index 000000000..b598b6fd2
--- /dev/null
+++ b/templates/it/trailer.tmpl
@@ -0,0 +1,21 @@
+</TD>
+<TD WIDTH="15">&nbsp;</TD>
+</TR>
+<TR CLASS="trailer">
+<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 &egrave; 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>
diff --git a/templates/it/users.tmpl b/templates/it/users.tmpl
new file mode 100644
index 000000000..3d5222f00
--- /dev/null
+++ b/templates/it/users.tmpl
@@ -0,0 +1,26 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
+
+<H2 CLASS="title">Utenti autorizzati per {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Utenti:</TH>
+<TD>
+<INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
+<BR>
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Consenti a questi utenti a stampare
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Impedisci a questi utenti di stampare
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>
+<INPUT TYPE="IMAGE" SRC="/images/button-set-allowed-users.gif" ALT="Imposta utenti autorizzati">
+</TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh
index fe169ecda..ae38459e9 100755
--- a/test/run-stp-tests.sh
+++ b/test/run-stp-tests.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# "$Id: run-stp-tests.sh 5493 2006-05-05 16:33:57Z mike $"
+# "$Id: run-stp-tests.sh 6113 2006-11-15 20:37:45Z mike $"
#
# Perform the complete set of IPP compliance tests specified in the
# CUPS Software Test Plan.
@@ -120,8 +120,8 @@ echo "certificate for testing; these tests currently require the OpenSSL"
echo "tools:"
echo ""
echo "0 - Do not do SSL/TLS encryption tests"
-echo "1 - Create a SSL/TLS certificate and key, but do not require encryption"
-echo "2 - Create a SSL/TLS certificate and key and require encryption"
+echo "1 - Test but do not require encryption"
+echo "2 - Test and require encryption"
echo ""
echo $ac_n "Enter the number of the SSL/TLS tests to perform: [0] $ac_c"
@@ -134,25 +134,14 @@ fi
echo ""
case "$ssltype" in
- 1 | 2)
- if test -f server.key; then
- echo "Using existing SSL/TLS certificate and key..."
- else
- echo "Generating SSL/TLS certificate and key..."
- openssl req -new -x509 -keyout server.key -out server.crt -days 3650 -nodes >/dev/null <<EOF
-ZZ
-Testland
-Testville
-Test Company
-
-`hostname`
-test@domain.com
-EOF
- fi
+ 1)
+ echo "Will test but not require encryption (1)"
+ ;;
+ 2)
+ echo "Will test and require encryption (2)"
;;
-
*)
- echo "Not using SSL/TLS..."
+ echo "Not using SSL/TLS (0)"
ssltype=0
;;
esac
@@ -595,5 +584,5 @@ echo "A HTML report was created in test/$strfile."
echo ""
#
-# End of "$Id: run-stp-tests.sh 5493 2006-05-05 16:33:57Z mike $"
+# End of "$Id: run-stp-tests.sh 6113 2006-11-15 20:37:45Z mike $"
#