From 5565574e7c309eacaaae60489cad4f42867f34e1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Sat, 8 Feb 2020 14:52:40 +0100 Subject: [PATCH] - up to 2.3.1 --- add-ipp-backend-of-cups-1.4.patch | 1992 ----------------------------- cups-dymo-deviceid.patch | 12 +- cups-eggcups.patch | 38 +- cups-lspp.patch | 259 ++-- cups-man_pages_linking.patch | 53 +- cups-systemd-socket.patch | 63 +- cups-verbose-compilation.patch | 10 +- cups.spec | 30 +- 8 files changed, 234 insertions(+), 2223 deletions(-) delete mode 100644 add-ipp-backend-of-cups-1.4.patch diff --git a/add-ipp-backend-of-cups-1.4.patch b/add-ipp-backend-of-cups-1.4.patch deleted file mode 100644 index 455a2c9..0000000 --- a/add-ipp-backend-of-cups-1.4.patch +++ /dev/null @@ -1,1992 +0,0 @@ ---- a/backend/Makefile -+++ b/backend/Makefile -@@ -21,6 +21,7 @@ - # See http://www.cups.org/documentation.php/api-filter.html for more info... - RBACKENDS = \ - ipp \ -+ ipp14 \ - lpd \ - $(DNSSD_BACKEND) - UBACKENDS = \ -@@ -51,6 +51,7 @@ - snmp-supplies.o - OBJS = \ - ipp.o \ -+ ipp14.o \ - lpd.o \ - dnssd.o \ - snmp.o \ -@@ -218,6 +218,17 @@ - - - # -+# ipp14 -+# -+ -+ipp14: ipp14.o ../cups/$(LIBCUPS) libbackend.a -+ echo Linking $@... -+ $(CC) $(LDFLAGS) -o ipp14 ipp14.o libbackend.a $(LIBS) -+ #$(RM) http -+ #$(LN) ipp14 http -+ -+ -+# - # lpd - # - ---- /dev/null -+++ b/backend/ipp14.c -@@ -0,0 +1,1953 @@ -+/* -+ * "$Id: ipp.c 8950 2010-01-14 22:40:19Z mike $" -+ * -+ * IPP backend for the Common UNIX Printing System (CUPS). -+ * -+ * Copyright 2007-2010 by Apple Inc. -+ * Copyright 1997-2007 by Easy Software Products, all rights reserved. -+ * -+ * These coded instructions, statements, and computer programs are the -+ * property of Apple Inc. and are protected by Federal copyright -+ * law. Distribution and use rights are outlined in the file "LICENSE.txt" -+ * "LICENSE" which should have been included with this file. If this -+ * file is missing or damaged, see the license at "http://www.cups.org/". -+ * -+ * This file is subject to the Apple OS-Developed Software exception. -+ * -+ * Contents: -+ * -+ * main() - Send a file to the printer or server. -+ * cancel_job() - Cancel a print job. -+ * check_printer_state() - Check the printer state... -+ * compress_files() - Compress print files... -+ * password_cb() - Disable the password prompt for -+ * cupsDoFileRequest(). -+ * report_attr() - Report an IPP attribute value. -+ * report_printer_state() - Report the printer state. -+ * run_pictwps_filter() - Convert PICT files to PostScript when printing -+ * remotely. -+ * sigterm_handler() - Handle 'terminate' signals that stop the backend. -+ */ -+ -+/* -+ * Include necessary headers. -+ */ -+ -+#include -+#include "backend-private.h" -+#include -+#include -+#include -+ -+/* -+ * Globals... -+ */ -+ -+static char *password = NULL; /* Password for device URI */ -+static int password_tries = 0; /* Password tries */ -+static const char *auth_info_required = "none"; -+ /* New auth-info-required value */ -+#ifdef __APPLE__ -+static char pstmpname[1024] = ""; /* Temporary PostScript file name */ -+#endif /* __APPLE__ */ -+static char tmpfilename[1024] = ""; /* Temporary spool file name */ -+static int job_cancelled = 0; /* Job cancelled? */ -+ -+ -+/* -+ * Local functions... -+ */ -+ -+static void cancel_job(http_t *http, const char *uri, int id, -+ const char *resource, const char *user, int version); -+static void check_printer_state(http_t *http, const char *uri, -+ const char *resource, const char *user, -+ int version, int job_id); -+#ifdef HAVE_LIBZ -+static void compress_files(int num_files, char **files); -+#endif /* HAVE_LIBZ */ -+static const char *password_cb(const char *); -+static void report_attr(ipp_attribute_t *attr); -+static int report_printer_state(ipp_t *ipp, int job_id); -+ -+#ifdef __APPLE__ -+static int run_pictwps_filter(char **argv, const char *filename); -+#endif /* __APPLE__ */ -+static void sigterm_handler(int sig); -+ -+ -+/* -+ * 'main()' - Send a file to the printer or server. -+ * -+ * Usage: -+ * -+ * printer-uri job-id user title copies options [file] -+ */ -+ -+int /* O - Exit status */ -+main(int argc, /* I - Number of command-line args */ -+ char *argv[]) /* I - Command-line arguments */ -+{ -+ int i; /* Looping var */ -+ int send_options; /* Send job options? */ -+ int num_options; /* Number of printer options */ -+ cups_option_t *options; /* Printer options */ -+ const char *device_uri; /* Device URI */ -+ char scheme[255], /* Scheme in URI */ -+ hostname[1024], /* Hostname */ -+ username[255], /* Username info */ -+ resource[1024], /* Resource info (printer name) */ -+ addrname[256], /* Address name */ -+ *optptr, /* Pointer to URI options */ -+ *name, /* Name of option */ -+ *value, /* Value of option */ -+ sep; /* Separator character */ -+ int snmp_fd, /* SNMP socket */ -+ start_count, /* Page count via SNMP at start */ -+ page_count, /* Page count via SNMP */ -+ have_supplies; /* Printer supports supply levels? */ -+ int num_files; /* Number of files to print */ -+ char **files, /* Files to print */ -+ *filename; /* Pointer to single filename */ -+ int port; /* Port number (not used) */ -+ char uri[HTTP_MAX_URI]; /* Updated URI without user/pass */ -+ ipp_status_t ipp_status; /* Status of IPP request */ -+ http_t *http; /* HTTP connection */ -+ ipp_t *request, /* IPP request */ -+ *response, /* IPP response */ -+ *supported; /* get-printer-attributes response */ -+ time_t start_time; /* Time of first connect */ -+ int recoverable; /* Recoverable error shown? */ -+ int contimeout; /* Connection timeout */ -+ int delay; /* Delay for retries... */ -+ int compression, /* Do compression of the job data? */ -+ waitjob, /* Wait for job complete? */ -+ waitprinter; /* Wait for printer ready? */ -+ ipp_attribute_t *job_id_attr; /* job-id attribute */ -+ int job_id; /* job-id value */ -+ ipp_attribute_t *job_sheets; /* job-media-sheets-completed */ -+ ipp_attribute_t *job_state; /* job-state */ -+ ipp_attribute_t *copies_sup; /* copies-supported */ -+ ipp_attribute_t *format_sup; /* document-format-supported */ -+ ipp_attribute_t *printer_state; /* printer-state attribute */ -+ ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */ -+ int copies, /* Number of copies for job */ -+ copies_remaining; /* Number of copies remaining */ -+ const char *content_type, /* CONTENT_TYPE environment variable */ -+ *final_content_type; /* FINAL_CONTENT_TYPE environment var */ -+#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) -+ struct sigaction action; /* Actions for POSIX signals */ -+#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ -+ int version; /* IPP version */ -+ static const char * const pattrs[] = -+ { /* Printer attributes we want */ -+ "com.apple.print.recoverable-message", -+ "copies-supported", -+ "document-format-supported", -+ "marker-colors", -+ "marker-high-levels", -+ "marker-levels", -+ "marker-low-levels", -+ "marker-message", -+ "marker-names", -+ "marker-types", -+ "printer-is-accepting-jobs", -+ "printer-state", -+ "printer-state-message", -+ "printer-state-reasons", -+ }; -+ static const char * const jattrs[] = -+ { /* Job attributes we want */ -+ "job-media-sheets-completed", -+ "job-state" -+ }; -+ -+ -+ /* -+ * Make sure status messages are not buffered... -+ */ -+ -+ setbuf(stderr, NULL); -+ -+ /* -+ * Ignore SIGPIPE and catch SIGTERM signals... -+ */ -+ -+#ifdef HAVE_SIGSET -+ sigset(SIGPIPE, SIG_IGN); -+ sigset(SIGTERM, sigterm_handler); -+#elif defined(HAVE_SIGACTION) -+ memset(&action, 0, sizeof(action)); -+ action.sa_handler = SIG_IGN; -+ sigaction(SIGPIPE, &action, NULL); -+ -+ sigemptyset(&action.sa_mask); -+ sigaddset(&action.sa_mask, SIGTERM); -+ action.sa_handler = sigterm_handler; -+ sigaction(SIGTERM, &action, NULL); -+#else -+ signal(SIGPIPE, SIG_IGN); -+ signal(SIGTERM, sigterm_handler); -+#endif /* HAVE_SIGSET */ -+ -+ /* -+ * Check command-line... -+ */ -+ -+ if (argc == 1) -+ { -+ char *s; -+ -+ if ((s = strrchr(argv[0], '/')) != NULL) -+ s ++; -+ else -+ s = argv[0]; -+ -+ printf("network %s \"Unknown\" \"%s (%s)\"\n", -+ s, _cupsLangString(cupsLangDefault(), -+ _("Internet Printing Protocol")), s); -+ return (CUPS_BACKEND_OK); -+ } -+ else if (argc < 6) -+ { -+ _cupsLangPrintf(stderr, -+ _("Usage: %s job-id user title copies options [file]\n"), -+ argv[0]); -+ return (CUPS_BACKEND_STOP); -+ } -+ -+ /* -+ * Get the (final) content type... -+ */ -+ -+ if ((content_type = getenv("CONTENT_TYPE")) == NULL) -+ content_type = "application/octet-stream"; -+ -+ if ((final_content_type = getenv("FINAL_CONTENT_TYPE")) == NULL) -+ { -+ final_content_type = content_type; -+ -+ if (!strncmp(final_content_type, "printer/", 8)) -+ final_content_type = "application/vnd.cups-raw"; -+ } -+ -+ /* -+ * Extract the hostname and printer name from the URI... -+ */ -+ -+ if ((device_uri = cupsBackendDeviceURI(argv)) == NULL) -+ return (CUPS_BACKEND_FAILED); -+ -+ httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme), -+ username, sizeof(username), hostname, sizeof(hostname), &port, -+ resource, sizeof(resource)); -+ -+ if (!port) -+ port = IPP_PORT; /* Default to port 631 */ -+ -+ if (!strcmp(scheme, "https")) -+ cupsSetEncryption(HTTP_ENCRYPT_ALWAYS); -+ else -+ cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED); -+ -+ /* -+ * See if there are any options... -+ */ -+ -+ compression = 0; -+ version = 11; -+ waitjob = 1; -+ waitprinter = 1; -+ contimeout = 7 * 24 * 60 * 60; -+ -+ if ((optptr = strchr(resource, '?')) != NULL) -+ { -+ /* -+ * Yup, terminate the device name string and move to the first -+ * character of the optptr... -+ */ -+ -+ *optptr++ = '\0'; -+ -+ /* -+ * Then parse the optptr... -+ */ -+ -+ while (*optptr) -+ { -+ /* -+ * Get the name... -+ */ -+ -+ name = optptr; -+ -+ while (*optptr && *optptr != '=' && *optptr != '+' && *optptr != '&') -+ optptr ++; -+ -+ if ((sep = *optptr) != '\0') -+ *optptr++ = '\0'; -+ -+ if (sep == '=') -+ { -+ /* -+ * Get the value... -+ */ -+ -+ value = optptr; -+ -+ while (*optptr && *optptr != '+' && *optptr != '&') -+ optptr ++; -+ -+ if (*optptr) -+ *optptr++ = '\0'; -+ } -+ else -+ value = (char *)""; -+ -+ /* -+ * Process the option... -+ */ -+ -+ if (!strcasecmp(name, "waitjob")) -+ { -+ /* -+ * Wait for job completion? -+ */ -+ -+ waitjob = !strcasecmp(value, "on") || -+ !strcasecmp(value, "yes") || -+ !strcasecmp(value, "true"); -+ } -+ else if (!strcasecmp(name, "waitprinter")) -+ { -+ /* -+ * Wait for printer idle? -+ */ -+ -+ waitprinter = !strcasecmp(value, "on") || -+ !strcasecmp(value, "yes") || -+ !strcasecmp(value, "true"); -+ } -+ else if (!strcasecmp(name, "encryption")) -+ { -+ /* -+ * Enable/disable encryption? -+ */ -+ -+ if (!strcasecmp(value, "always")) -+ cupsSetEncryption(HTTP_ENCRYPT_ALWAYS); -+ else if (!strcasecmp(value, "required")) -+ cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); -+ else if (!strcasecmp(value, "never")) -+ cupsSetEncryption(HTTP_ENCRYPT_NEVER); -+ else if (!strcasecmp(value, "ifrequested")) -+ cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED); -+ else -+ { -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unknown encryption option value \"%s\"!\n"), -+ value); -+ } -+ } -+ else if (!strcasecmp(name, "version")) -+ { -+ if (!strcmp(value, "1.0")) -+ version = 10; -+ else if (!strcmp(value, "1.1")) -+ version = 11; -+ else if (!strcmp(value, "2.0")) -+ version = 20; -+ else if (!strcmp(value, "2.1")) -+ version = 21; -+ else -+ { -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unknown version option value \"%s\"!\n"), -+ value); -+ } -+ } -+#ifdef HAVE_LIBZ -+ else if (!strcasecmp(name, "compression")) -+ { -+ compression = !strcasecmp(value, "true") || -+ !strcasecmp(value, "yes") || -+ !strcasecmp(value, "on") || -+ !strcasecmp(value, "gzip"); -+ } -+#endif /* HAVE_LIBZ */ -+ else if (!strcasecmp(name, "contimeout")) -+ { -+ /* -+ * Set the connection timeout... -+ */ -+ -+ if (atoi(value) > 0) -+ contimeout = atoi(value); -+ } -+ else -+ { -+ /* -+ * Unknown option... -+ */ -+ -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unknown option \"%s\" with value \"%s\"!\n"), -+ name, value); -+ } -+ } -+ } -+ -+ /* -+ * If we have 7 arguments, print the file named on the command-line. -+ * Otherwise, copy stdin to a temporary file and print the temporary -+ * file. -+ */ -+ -+ if (argc == 6) -+ { -+ /* -+ * Copy stdin to a temporary file... -+ */ -+ -+ int fd; /* File descriptor */ -+ http_addrlist_t *addrlist; /* Address list */ -+ off_t tbytes; /* Total bytes copied */ -+ -+ -+ fputs("STATE: +connecting-to-device\n", stderr); -+ fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname); -+ -+ if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, "1")) == NULL) -+ { -+ _cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), -+ hostname); -+ return (CUPS_BACKEND_STOP); -+ } -+ -+ snmp_fd = _cupsSNMPOpen(addrlist->addr.addr.sa_family); -+ -+ if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0) -+ { -+ _cupsLangPrintError("ERROR", _("Unable to create temporary file")); -+ return (CUPS_BACKEND_FAILED); -+ } -+ -+ _cupsLangPuts(stderr, _("INFO: Copying print data...\n")); -+ -+ tbytes = backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0, -+ backendNetworkSideCB); -+ -+ if (snmp_fd >= 0) -+ _cupsSNMPClose(snmp_fd); -+ -+ httpAddrFreeList(addrlist); -+ -+ close(fd); -+ -+ /* -+ * Don't try printing files less than 2 bytes... -+ */ -+ -+ if (tbytes <= 1) -+ { -+ _cupsLangPuts(stderr, _("ERROR: Empty print file!\n")); -+ unlink(tmpfilename); -+ return (CUPS_BACKEND_FAILED); -+ } -+ -+ /* -+ * Point to the single file from stdin... -+ */ -+ -+ filename = tmpfilename; -+ num_files = 1; -+ files = &filename; -+ send_options = 0; -+ } -+ else -+ { -+ /* -+ * Point to the files on the command-line... -+ */ -+ -+ num_files = argc - 6; -+ files = argv + 6; -+ send_options = 1; -+ -+#ifdef HAVE_LIBZ -+ if (compression) -+ compress_files(num_files, files); -+#endif /* HAVE_LIBZ */ -+ } -+ -+ fprintf(stderr, "DEBUG: %d files to send in job...\n", num_files); -+ -+ /* -+ * Set the authentication info, if any... -+ */ -+ -+ cupsSetPasswordCB(password_cb); -+ -+ if (username[0]) -+ { -+ /* -+ * Use authenticaion information in the device URI... -+ */ -+ -+ if ((password = strchr(username, ':')) != NULL) -+ *password++ = '\0'; -+ -+ cupsSetUser(username); -+ } -+ else if (!getuid()) -+ { -+ /* -+ * Try loading authentication information from the environment. -+ */ -+ -+ const char *ptr = getenv("AUTH_USERNAME"); -+ -+ if (ptr) -+ cupsSetUser(ptr); -+ -+ password = getenv("AUTH_PASSWORD"); -+ } -+ -+ /* -+ * Try connecting to the remote server... -+ */ -+ -+ delay = 5; -+ recoverable = 0; -+ start_time = time(NULL); -+ -+ fputs("STATE: +connecting-to-device\n", stderr); -+ -+ do -+ { -+ fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port); -+ _cupsLangPuts(stderr, _("INFO: Connecting to printer...\n")); -+ -+ if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL) -+ { -+ if (job_cancelled) -+ break; -+ -+ if (getenv("CLASS") != NULL) -+ { -+ /* -+ * If the CLASS environment variable is set, the job was submitted -+ * to a class and not to a specific queue. In this case, we want -+ * to abort immediately so that the job can be requeued on the next -+ * available printer in the class. -+ */ -+ -+ _cupsLangPuts(stderr, -+ _("INFO: Unable to contact printer, queuing on next " -+ "printer in class...\n")); -+ -+ if (tmpfilename[0]) -+ unlink(tmpfilename); -+ -+ /* -+ * Sleep 5 seconds to keep the job from requeuing too rapidly... -+ */ -+ -+ sleep(5); -+ -+ return (CUPS_BACKEND_FAILED); -+ } -+ -+ if (errno == ECONNREFUSED || errno == EHOSTDOWN || -+ errno == EHOSTUNREACH) -+ { -+ if (contimeout && (time(NULL) - start_time) > contimeout) -+ { -+ _cupsLangPuts(stderr, _("ERROR: Printer not responding!\n")); -+ return (CUPS_BACKEND_FAILED); -+ } -+ -+ recoverable = 1; -+ -+ _cupsLangPrintf(stderr, -+ _("WARNING: recoverable: Network host \'%s\' is busy; " -+ "will retry in %d seconds...\n"), -+ hostname, delay); -+ -+ sleep(delay); -+ -+ if (delay < 30) -+ delay += 5; -+ } -+ else if (h_errno) -+ { -+ _cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), -+ hostname); -+ return (CUPS_BACKEND_STOP); -+ } -+ else -+ { -+ recoverable = 1; -+ -+ fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno)); -+ _cupsLangPuts(stderr, -+ _("ERROR: recoverable: Unable to connect to printer; will " -+ "retry in 30 seconds...\n")); -+ sleep(30); -+ } -+ -+ if (job_cancelled) -+ break; -+ } -+ } -+ while (http == NULL); -+ -+ if (job_cancelled || !http) -+ { -+ if (tmpfilename[0]) -+ unlink(tmpfilename); -+ -+ return (CUPS_BACKEND_FAILED); -+ } -+ -+ fputs("STATE: -connecting-to-device\n", stderr); -+ _cupsLangPuts(stderr, _("INFO: Connected to printer...\n")); -+ -+#ifdef AF_INET6 -+ if (http->hostaddr->addr.sa_family == AF_INET6) -+ fprintf(stderr, "DEBUG: Connected to [%s]:%d (IPv6)...\n", -+ httpAddrString(http->hostaddr, addrname, sizeof(addrname)), -+ ntohs(http->hostaddr->ipv6.sin6_port)); -+ else -+#endif /* AF_INET6 */ -+ if (http->hostaddr->addr.sa_family == AF_INET) -+ fprintf(stderr, "DEBUG: Connected to %s:%d (IPv4)...\n", -+ httpAddrString(http->hostaddr, addrname, sizeof(addrname)), -+ ntohs(http->hostaddr->ipv4.sin_port)); -+ -+ /* -+ * See if the printer supports SNMP... -+ */ -+ -+ if ((snmp_fd = _cupsSNMPOpen(http->hostaddr->addr.sa_family)) >= 0) -+ have_supplies = !backendSNMPSupplies(snmp_fd, http->hostaddr, &start_count, -+ NULL); -+ else -+ have_supplies = start_count = 0; -+ -+ /* -+ * Build a URI for the printer and fill the standard IPP attributes for -+ * an IPP_PRINT_FILE request. We can't use the URI in argv[0] because it -+ * might contain username:password information... -+ */ -+ -+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL, hostname, -+ port, resource); -+ -+ /* -+ * First validate the destination and see if the device supports multiple -+ * copies. We have to do this because some IPP servers (e.g. HP JetDirect) -+ * don't support the copies attribute... -+ */ -+ -+ copies_sup = NULL; -+ format_sup = NULL; -+ supported = NULL; -+ -+ do -+ { -+ /* -+ * Check for side-channel requests... -+ */ -+ -+ backendCheckSideChannel(snmp_fd, http->hostaddr); -+ -+ /* -+ * Build the IPP request... -+ */ -+ -+ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); -+ request->request.op.version[0] = version / 10; -+ request->request.op.version[1] = version % 10; -+ -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", -+ NULL, uri); -+ -+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, -+ "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), -+ NULL, pattrs); -+ -+ /* -+ * Do the request... -+ */ -+ -+ fputs("DEBUG: Getting supported attributes...\n", stderr); -+ -+ if (http->version < HTTP_1_1) -+ httpReconnect(http); -+ -+ if ((supported = cupsDoRequest(http, request, resource)) == NULL) -+ ipp_status = cupsLastError(); -+ else -+ ipp_status = supported->request.status.status_code; -+ -+ if (ipp_status > IPP_OK_CONFLICT) -+ { -+ if (ipp_status == IPP_PRINTER_BUSY || -+ ipp_status == IPP_SERVICE_UNAVAILABLE) -+ { -+ if (contimeout && (time(NULL) - start_time) > contimeout) -+ { -+ _cupsLangPuts(stderr, _("ERROR: Printer not responding!\n")); -+ return (CUPS_BACKEND_FAILED); -+ } -+ -+ recoverable = 1; -+ -+ _cupsLangPrintf(stderr, -+ _("WARNING: recoverable: Network host \'%s\' is busy; " -+ "will retry in %d seconds...\n"), -+ hostname, delay); -+ -+ report_printer_state(supported, 0); -+ -+ sleep(delay); -+ -+ if (delay < 30) -+ delay += 5; -+ } -+ else if ((ipp_status == IPP_BAD_REQUEST || -+ ipp_status == IPP_VERSION_NOT_SUPPORTED) && version > 10) -+ { -+ /* -+ * Switch to IPP/1.0... -+ */ -+ -+ _cupsLangPrintf(stderr, -+ _("INFO: Printer does not support IPP/%d.%d, trying " -+ "IPP/1.0...\n"), version / 10, version % 10); -+ version = 10; -+ httpReconnect(http); -+ } -+ else if (ipp_status == IPP_NOT_FOUND) -+ { -+ _cupsLangPuts(stderr, _("ERROR: Destination printer does not exist!\n")); -+ -+ if (supported) -+ ippDelete(supported); -+ -+ return (CUPS_BACKEND_STOP); -+ } -+ else if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) -+ { -+ if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE), -+ "Negotiate", 9)) -+ auth_info_required = "negotiate"; -+ -+ fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required); -+ return (CUPS_BACKEND_AUTH_REQUIRED); -+ } -+ else -+ { -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unable to get printer status (%s)!\n"), -+ cupsLastErrorString()); -+ sleep(10); -+ } -+ -+ if (supported) -+ ippDelete(supported); -+ -+ continue; -+ } -+ else if ((copies_sup = ippFindAttribute(supported, "copies-supported", -+ IPP_TAG_RANGE)) != NULL) -+ { -+ /* -+ * Has the "copies-supported" attribute - does it have an upper -+ * bound > 1? -+ */ -+ -+ if (copies_sup->values[0].range.upper <= 1) -+ copies_sup = NULL; /* No */ -+ } -+ -+ format_sup = ippFindAttribute(supported, "document-format-supported", -+ IPP_TAG_MIMETYPE); -+ -+ if (format_sup) -+ { -+ fprintf(stderr, "DEBUG: document-format-supported (%d values)\n", -+ format_sup->num_values); -+ for (i = 0; i < format_sup->num_values; i ++) -+ fprintf(stderr, "DEBUG: [%d] = \"%s\"\n", i, -+ format_sup->values[i].string.text); -+ } -+ -+ report_printer_state(supported, 0); -+ } -+ while (ipp_status > IPP_OK_CONFLICT); -+ -+ /* -+ * See if the printer is accepting jobs and is not stopped; if either -+ * condition is true and we are printing to a class, requeue the job... -+ */ -+ -+ if (getenv("CLASS") != NULL) -+ { -+ printer_state = ippFindAttribute(supported, "printer-state", -+ IPP_TAG_ENUM); -+ printer_accepting = ippFindAttribute(supported, "printer-is-accepting-jobs", -+ IPP_TAG_BOOLEAN); -+ -+ if (printer_state == NULL || -+ (printer_state->values[0].integer > IPP_PRINTER_PROCESSING && -+ waitprinter) || -+ printer_accepting == NULL || -+ !printer_accepting->values[0].boolean) -+ { -+ /* -+ * If the CLASS environment variable is set, the job was submitted -+ * to a class and not to a specific queue. In this case, we want -+ * to abort immediately so that the job can be requeued on the next -+ * available printer in the class. -+ */ -+ -+ _cupsLangPuts(stderr, -+ _("INFO: Unable to contact printer, queuing on next " -+ "printer in class...\n")); -+ -+ ippDelete(supported); -+ httpClose(http); -+ -+ if (tmpfilename[0]) -+ unlink(tmpfilename); -+ -+ /* -+ * Sleep 5 seconds to keep the job from requeuing too rapidly... -+ */ -+ -+ sleep(5); -+ -+ return (CUPS_BACKEND_FAILED); -+ } -+ } -+ -+ if (recoverable) -+ { -+ /* -+ * If we've shown a recoverable error make sure the printer proxies -+ * have a chance to see the recovered message. Not pretty but -+ * necessary for now... -+ */ -+ -+ fputs("INFO: recovered: \n", stderr); -+ sleep(5); -+ } -+ -+ /* -+ * See if the printer supports multiple copies... -+ */ -+ -+ copies = atoi(argv[4]); -+ -+ if (copies_sup || argc < 7) -+ { -+ copies_remaining = 1; -+ -+ if (argc < 7) -+ copies = 1; -+ } -+ else -+ copies_remaining = copies; -+ -+ /* -+ * Then issue the print-job request... -+ */ -+ -+ job_id = 0; -+ -+ while (copies_remaining > 0) -+ { -+ /* -+ * Check for side-channel requests... -+ */ -+ -+ backendCheckSideChannel(snmp_fd, http->hostaddr); -+ -+ /* -+ * Build the IPP request... -+ */ -+ -+ if (job_cancelled) -+ break; -+ -+ if (num_files > 1) -+ request = ippNewRequest(IPP_CREATE_JOB); -+ else -+ request = ippNewRequest(IPP_PRINT_JOB); -+ -+ request->request.op.version[0] = version / 10; -+ request->request.op.version[1] = version % 10; -+ -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", -+ NULL, uri); -+ -+ fprintf(stderr, "DEBUG: printer-uri = \"%s\"\n", uri); -+ -+ if (argv[2][0]) -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, -+ "requesting-user-name", NULL, argv[2]); -+ -+ fprintf(stderr, "DEBUG: requesting-user-name = \"%s\"\n", argv[2]); -+ -+ /* -+ * Only add a "job-name" attribute if the remote server supports -+ * copy generation - some IPP implementations like HP's don't seem -+ * to like UTF-8 job names (STR #1837)... -+ */ -+ -+ if (argv[3][0] && copies_sup) -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, -+ argv[3]); -+ -+ fprintf(stderr, "DEBUG: job-name = \"%s\"\n", argv[3]); -+ -+#ifdef HAVE_LIBZ -+ if (compression) -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, -+ "compression", NULL, "gzip"); -+#endif /* HAVE_LIBZ */ -+ -+ /* -+ * Handle options on the command-line... -+ */ -+ -+ options = NULL; -+ num_options = cupsParseOptions(argv[5], 0, &options); -+ -+#ifdef __APPLE__ -+ if (!strcasecmp(final_content_type, "application/pictwps") && -+ num_files == 1) -+ { -+ if (format_sup != NULL) -+ { -+ for (i = 0; i < format_sup->num_values; i ++) -+ if (!strcasecmp(final_content_type, format_sup->values[i].string.text)) -+ break; -+ } -+ -+ if (format_sup == NULL || i >= format_sup->num_values) -+ { -+ /* -+ * Remote doesn't support "application/pictwps" (i.e. it's not MacOS X) -+ * so convert the document to PostScript... -+ */ -+ -+ if (run_pictwps_filter(argv, files[0])) -+ { -+ if (pstmpname[0]) -+ unlink(pstmpname); -+ -+ if (tmpfilename[0]) -+ unlink(tmpfilename); -+ -+ return (CUPS_BACKEND_FAILED); -+ } -+ -+ files[0] = pstmpname; -+ -+ /* -+ * Change the MIME type to application/postscript and change the -+ * number of copies to 1... -+ */ -+ -+ final_content_type = "application/postscript"; -+ copies = 1; -+ copies_remaining = 1; -+ send_options = 0; -+ } -+ } -+#endif /* __APPLE__ */ -+ -+ if (format_sup != NULL) -+ { -+ for (i = 0; i < format_sup->num_values; i ++) -+ if (!strcasecmp(final_content_type, format_sup->values[i].string.text)) -+ break; -+ -+ if (i < format_sup->num_values) -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, -+ "document-format", NULL, final_content_type); -+ } -+ -+ if (copies_sup && version > 10 && send_options) -+ { -+ /* -+ * Only send options if the destination printer supports the copies -+ * attribute and IPP/1.1. This is a hack for the HP and Lexmark -+ * implementations of IPP, which do not accept extension attributes -+ * and incorrectly report a client-error-bad-request error instead of -+ * the successful-ok-unsupported-attributes status. In short, at least -+ * some HP and Lexmark implementations of IPP are non-compliant. -+ */ -+ -+ cupsEncodeOptions(request, num_options, options); -+ -+ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", -+ copies); -+ } -+ -+ cupsFreeOptions(num_options, options); -+ -+ /* -+ * If copies aren't supported, then we are likely dealing with an HP -+ * JetDirect. The HP IPP implementation seems to close the connection -+ * after every request - that is, it does *not* implement HTTP Keep- -+ * Alive, which is REQUIRED by HTTP/1.1... -+ */ -+ -+ if (!copies_sup) -+ httpReconnect(http); -+ -+ /* -+ * Do the request... -+ */ -+ -+ if (http->version < HTTP_1_1) -+ httpReconnect(http); -+ -+ if (num_files > 1) -+ response = cupsDoRequest(http, request, resource); -+ else -+ response = cupsDoFileRequest(http, request, resource, files[0]); -+ -+ ipp_status = cupsLastError(); -+ -+ if (ipp_status > IPP_OK_CONFLICT) -+ { -+ job_id = 0; -+ -+ if (job_cancelled) -+ break; -+ -+ if (ipp_status == IPP_SERVICE_UNAVAILABLE || -+ ipp_status == IPP_PRINTER_BUSY) -+ { -+ _cupsLangPuts(stderr, -+ _("INFO: Printer busy; will retry in 10 seconds...\n")); -+ sleep(10); -+ } -+ else if ((ipp_status == IPP_BAD_REQUEST || -+ ipp_status == IPP_VERSION_NOT_SUPPORTED) && version > 10) -+ { -+ /* -+ * Switch to IPP/1.0... -+ */ -+ -+ _cupsLangPrintf(stderr, -+ _("INFO: Printer does not support IPP/%d.%d, trying " -+ "IPP/1.0...\n"), version / 10, version % 10); -+ version = 10; -+ httpReconnect(http); -+ } -+ else -+ { -+ /* -+ * Update auth-info-required as needed... -+ */ -+ -+ _cupsLangPrintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"), -+ cupsLastErrorString()); -+ -+ if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) -+ { -+ fprintf(stderr, "DEBUG: WWW-Authenticate=\"%s\"\n", -+ httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE)); -+ -+ /* -+ * Normal authentication goes through the password callback, which sets -+ * auth_info_required to "username,password". Kerberos goes directly -+ * through GSSAPI, so look for Negotiate in the WWW-Authenticate header -+ * here and set auth_info_required as needed... -+ */ -+ -+ if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE), -+ "Negotiate", 9)) -+ auth_info_required = "negotiate"; -+ } -+ } -+ } -+ else if ((job_id_attr = ippFindAttribute(response, "job-id", -+ IPP_TAG_INTEGER)) == NULL) -+ { -+ _cupsLangPuts(stderr, -+ _("NOTICE: Print file accepted - job ID unknown.\n")); -+ job_id = 0; -+ } -+ else -+ { -+ job_id = job_id_attr->values[0].integer; -+ _cupsLangPrintf(stderr, _("NOTICE: Print file accepted - job ID %d.\n"), -+ job_id); -+ } -+ -+ ippDelete(response); -+ -+ if (job_cancelled) -+ break; -+ -+ if (job_id && num_files > 1) -+ { -+ for (i = 0; i < num_files; i ++) -+ { -+ /* -+ * Check for side-channel requests... -+ */ -+ -+ backendCheckSideChannel(snmp_fd, http->hostaddr); -+ -+ /* -+ * Send the next file in the job... -+ */ -+ -+ request = ippNewRequest(IPP_SEND_DOCUMENT); -+ request->request.op.version[0] = version / 10; -+ request->request.op.version[1] = version % 10; -+ -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", -+ NULL, uri); -+ -+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", -+ job_id); -+ -+ if (argv[2][0]) -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, -+ "requesting-user-name", NULL, argv[2]); -+ -+ if ((i + 1) == num_files) -+ ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1); -+ -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, -+ "document-format", NULL, content_type); -+ -+ if (http->version < HTTP_1_1) -+ httpReconnect(http); -+ -+ ippDelete(cupsDoFileRequest(http, request, resource, files[i])); -+ -+ if (cupsLastError() > IPP_OK_CONFLICT) -+ { -+ ipp_status = cupsLastError(); -+ -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unable to add file %d to job: %s\n"), -+ job_id, cupsLastErrorString()); -+ break; -+ } -+ } -+ } -+ -+ if (ipp_status <= IPP_OK_CONFLICT && argc > 6) -+ { -+ fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1); -+ copies_remaining --; -+ } -+ else if (ipp_status == IPP_SERVICE_UNAVAILABLE || -+ ipp_status == IPP_PRINTER_BUSY) -+ continue; -+ else -+ copies_remaining --; -+ -+ /* -+ * Wait for the job to complete... -+ */ -+ -+ if (!job_id || !waitjob) -+ continue; -+ -+ _cupsLangPuts(stderr, _("INFO: Waiting for job to complete...\n")); -+ -+ for (delay = 1; !job_cancelled;) -+ { -+ /* -+ * Check for side-channel requests... -+ */ -+ -+ backendCheckSideChannel(snmp_fd, http->hostaddr); -+ -+ /* -+ * Build an IPP_GET_JOB_ATTRIBUTES request... -+ */ -+ -+ request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); -+ request->request.op.version[0] = version / 10; -+ request->request.op.version[1] = version % 10; -+ -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", -+ NULL, uri); -+ -+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", -+ job_id); -+ -+ if (argv[2][0]) -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, -+ "requesting-user-name", NULL, argv[2]); -+ -+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, -+ "requested-attributes", sizeof(jattrs) / sizeof(jattrs[0]), -+ NULL, jattrs); -+ -+ /* -+ * Do the request... -+ */ -+ -+ if (!copies_sup || http->version < HTTP_1_1) -+ httpReconnect(http); -+ -+ response = cupsDoRequest(http, request, resource); -+ ipp_status = cupsLastError(); -+ -+ if (ipp_status == IPP_NOT_FOUND) -+ { -+ /* -+ * Job has gone away and/or the server has no job history... -+ */ -+ -+ ippDelete(response); -+ -+ ipp_status = IPP_OK; -+ break; -+ } -+ -+ if (ipp_status > IPP_OK_CONFLICT) -+ { -+ if (ipp_status != IPP_SERVICE_UNAVAILABLE && -+ ipp_status != IPP_PRINTER_BUSY) -+ { -+ ippDelete(response); -+ -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unable to get job %d attributes (%s)!\n"), -+ job_id, cupsLastErrorString()); -+ break; -+ } -+ } -+ -+ if (response) -+ { -+ if ((job_state = ippFindAttribute(response, "job-state", -+ IPP_TAG_ENUM)) != NULL) -+ { -+ /* -+ * Stop polling if the job is finished or pending-held... -+ */ -+ -+ if (job_state->values[0].integer > IPP_JOB_STOPPED) -+ { -+ if ((job_sheets = ippFindAttribute(response, -+ "job-media-sheets-completed", -+ IPP_TAG_INTEGER)) != NULL) -+ fprintf(stderr, "PAGE: total %d\n", -+ job_sheets->values[0].integer); -+ -+ ippDelete(response); -+ break; -+ } -+ } -+ else -+ { -+ /* -+ * If the printer does not return a job-state attribute, it does not -+ * conform to the IPP specification - break out immediately and fail -+ * the job... -+ */ -+ -+ fputs("DEBUG: No job-state available from printer - stopping queue.\n", -+ stderr); -+ ipp_status = IPP_INTERNAL_ERROR; -+ break; -+ } -+ } -+ -+ ippDelete(response); -+ -+ /* -+ * Check the printer state and report it if necessary... -+ */ -+ -+ check_printer_state(http, uri, resource, argv[2], version, job_id); -+ -+ /* -+ * Wait 1-10 seconds before polling again... -+ */ -+ -+ sleep(delay); -+ -+ delay ++; -+ if (delay > 10) -+ delay = 1; -+ } -+ } -+ -+ /* -+ * Cancel the job as needed... -+ */ -+ -+ if (job_cancelled && job_id) -+ cancel_job(http, uri, job_id, resource, argv[2], version); -+ -+ /* -+ * Check the printer state and report it if necessary... -+ */ -+ -+ check_printer_state(http, uri, resource, argv[2], version, job_id); -+ -+ /* -+ * Collect the final page count as needed... -+ */ -+ -+ if (have_supplies && -+ !backendSNMPSupplies(snmp_fd, http->hostaddr, &page_count, NULL) && -+ page_count > start_count) -+ fprintf(stderr, "PAGE: total %d\n", page_count - start_count); -+ -+#ifdef HAVE_GSSAPI -+ /* -+ * See if we used Kerberos at all... -+ */ -+ -+ if (http->gssctx) -+ auth_info_required = "negotiate"; -+#endif /* HAVE_GSSAPI */ -+ -+ /* -+ * Free memory... -+ */ -+ -+ httpClose(http); -+ -+ ippDelete(supported); -+ -+ /* -+ * Remove the temporary file(s) if necessary... -+ */ -+ -+ if (tmpfilename[0]) -+ unlink(tmpfilename); -+ -+#ifdef HAVE_LIBZ -+ if (compression) -+ { -+ for (i = 0; i < num_files; i ++) -+ unlink(files[i]); -+ } -+#endif /* HAVE_LIBZ */ -+ -+#ifdef __APPLE__ -+ if (pstmpname[0]) -+ unlink(pstmpname); -+#endif /* __APPLE__ */ -+ -+ /* -+ * Return the queue status... -+ */ -+ -+ fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required); -+ -+ if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) -+ return (CUPS_BACKEND_AUTH_REQUIRED); -+ else if (ipp_status == IPP_INTERNAL_ERROR) -+ return (CUPS_BACKEND_STOP); -+ else if (ipp_status > IPP_OK_CONFLICT) -+ return (CUPS_BACKEND_FAILED); -+ else -+ { -+ _cupsLangPuts(stderr, _("INFO: Ready to print.\n")); -+ return (CUPS_BACKEND_OK); -+ } -+} -+ -+ -+/* -+ * 'cancel_job()' - Cancel a print job. -+ */ -+ -+static void -+cancel_job(http_t *http, /* I - HTTP connection */ -+ const char *uri, /* I - printer-uri */ -+ int id, /* I - job-id */ -+ const char *resource, /* I - Resource path */ -+ const char *user, /* I - requesting-user-name */ -+ int version) /* I - IPP version */ -+{ -+ ipp_t *request; /* Cancel-Job request */ -+ -+ -+ _cupsLangPuts(stderr, _("INFO: Canceling print job...\n")); -+ -+ request = ippNewRequest(IPP_CANCEL_JOB); -+ request->request.op.version[0] = version / 10; -+ request->request.op.version[1] = version % 10; -+ -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", -+ NULL, uri); -+ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", id); -+ -+ if (user && user[0]) -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, -+ "requesting-user-name", NULL, user); -+ -+ /* -+ * Do the request... -+ */ -+ -+ if (http->version < HTTP_1_1) -+ httpReconnect(http); -+ -+ ippDelete(cupsDoRequest(http, request, resource)); -+ -+ if (cupsLastError() > IPP_OK_CONFLICT) -+ _cupsLangPrintf(stderr, _("ERROR: Unable to cancel job %d: %s\n"), id, -+ cupsLastErrorString()); -+} -+ -+ -+/* -+ * 'check_printer_state()' - Check the printer state... -+ */ -+ -+static void -+check_printer_state( -+ http_t *http, /* I - HTTP connection */ -+ const char *uri, /* I - Printer URI */ -+ const char *resource, /* I - Resource path */ -+ const char *user, /* I - Username, if any */ -+ int version, /* I - IPP version */ -+ int job_id) /* I - Current job ID */ -+{ -+ ipp_t *request, /* IPP request */ -+ *response; /* IPP response */ -+ static const char * const attrs[] = /* Attributes we want */ -+ { -+ "com.apple.print.recoverable-message", -+ "marker-colors", -+ "marker-levels", -+ "marker-message", -+ "marker-names", -+ "marker-types", -+ "printer-state-message", -+ "printer-state-reasons" -+ }; -+ -+ -+ /* -+ * Check on the printer state... -+ */ -+ -+ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); -+ request->request.op.version[0] = version / 10; -+ request->request.op.version[1] = version % 10; -+ -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", -+ NULL, uri); -+ -+ if (user && user[0]) -+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, -+ "requesting-user-name", NULL, user); -+ -+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, -+ "requested-attributes", -+ (int)(sizeof(attrs) / sizeof(attrs[0])), NULL, attrs); -+ -+ /* -+ * Do the request... -+ */ -+ -+ if (http->version < HTTP_1_1) -+ httpReconnect(http); -+ -+ if ((response = cupsDoRequest(http, request, resource)) != NULL) -+ { -+ report_printer_state(response, job_id); -+ ippDelete(response); -+ } -+} -+ -+ -+#ifdef HAVE_LIBZ -+/* -+ * 'compress_files()' - Compress print files... -+ */ -+ -+static void -+compress_files(int num_files, /* I - Number of files */ -+ char **files) /* I - Files */ -+{ -+ int i, /* Looping var */ -+ fd; /* Temporary file descriptor */ -+ ssize_t bytes; /* Bytes read/written */ -+ size_t total; /* Total bytes read */ -+ cups_file_t *in, /* Input file */ -+ *out; /* Output file */ -+ struct stat outinfo; /* Output file information */ -+ char filename[1024], /* Temporary filename */ -+ buffer[32768]; /* Copy buffer */ -+ -+ -+ fprintf(stderr, "DEBUG: Compressing %d job files...\n", num_files); -+ for (i = 0; i < num_files; i ++) -+ { -+ if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) -+ { -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unable to create temporary compressed print " -+ "file: %s\n"), strerror(errno)); -+ exit(CUPS_BACKEND_FAILED); -+ } -+ -+ if ((out = cupsFileOpenFd(fd, "w9")) == NULL) -+ { -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unable to open temporary compressed print " -+ "file: %s\n"), strerror(errno)); -+ exit(CUPS_BACKEND_FAILED); -+ } -+ -+ if ((in = cupsFileOpen(files[i], "r")) == NULL) -+ { -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unable to open print file \"%s\": %s\n"), -+ files[i], strerror(errno)); -+ cupsFileClose(out); -+ exit(CUPS_BACKEND_FAILED); -+ } -+ -+ total = 0; -+ while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0) -+ if (cupsFileWrite(out, buffer, bytes) < bytes) -+ { -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unable to write %d bytes to \"%s\": %s\n"), -+ (int)bytes, filename, strerror(errno)); -+ cupsFileClose(in); -+ cupsFileClose(out); -+ exit(CUPS_BACKEND_FAILED); -+ } -+ else -+ total += bytes; -+ -+ cupsFileClose(out); -+ cupsFileClose(in); -+ -+ files[i] = strdup(filename); -+ -+ if (!stat(filename, &outinfo)) -+ fprintf(stderr, -+ "DEBUG: File %d compressed to %.1f%% of original size, " -+ CUPS_LLFMT " bytes...\n", -+ i + 1, 100.0 * outinfo.st_size / total, -+ CUPS_LLCAST outinfo.st_size); -+ } -+} -+#endif /* HAVE_LIBZ */ -+ -+ -+/* -+ * 'password_cb()' - Disable the password prompt for cupsDoFileRequest(). -+ */ -+ -+static const char * /* O - Password */ -+password_cb(const char *prompt) /* I - Prompt (not used) */ -+{ -+ (void)prompt; -+ -+ /* -+ * Remember that we need to authenticate... -+ */ -+ -+ auth_info_required = "username,password"; -+ -+ if (password && *password && password_tries < 3) -+ { -+ password_tries ++; -+ -+ return (password); -+ } -+ else -+ { -+ /* -+ * Give up after 3 tries or if we don't have a password to begin with... -+ */ -+ -+ return (NULL); -+ } -+} -+ -+ -+/* -+ * 'report_attr()' - Report an IPP attribute value. -+ */ -+ -+static void -+report_attr(ipp_attribute_t *attr) /* I - Attribute */ -+{ -+ int i; /* Looping var */ -+ char value[1024], /* Value string */ -+ *valptr, /* Pointer into value string */ -+ *attrptr; /* Pointer into attribute value */ -+ -+ -+ /* -+ * Convert the attribute values into quoted strings... -+ */ -+ -+ for (i = 0, valptr = value; -+ i < attr->num_values && valptr < (value + sizeof(value) - 10); -+ i ++) -+ { -+ if (i > 0) -+ *valptr++ = ','; -+ -+ switch (attr->value_tag) -+ { -+ case IPP_TAG_INTEGER : -+ case IPP_TAG_ENUM : -+ snprintf(valptr, sizeof(value) - (valptr - value), "%d", -+ attr->values[i].integer); -+ valptr += strlen(valptr); -+ break; -+ -+ case IPP_TAG_TEXT : -+ case IPP_TAG_NAME : -+ case IPP_TAG_KEYWORD : -+ *valptr++ = '\"'; -+ for (attrptr = attr->values[i].string.text; -+ *attrptr && valptr < (value + sizeof(value) - 10); -+ attrptr ++) -+ { -+ if (*attrptr == '\\' || *attrptr == '\"') -+ *valptr++ = '\\'; -+ -+ *valptr++ = *attrptr; -+ } -+ *valptr++ = '\"'; -+ break; -+ -+ default : -+ /* -+ * Unsupported value type... -+ */ -+ -+ return; -+ } -+ } -+ -+ *valptr = '\0'; -+ -+ /* -+ * Tell the scheduler about the new values... -+ */ -+ -+ fprintf(stderr, "ATTR: %s=%s\n", attr->name, value); -+} -+ -+ -+/* -+ * 'report_printer_state()' - Report the printer state. -+ */ -+ -+static int /* O - Number of reasons shown */ -+report_printer_state(ipp_t *ipp, /* I - IPP response */ -+ int job_id) /* I - Current job ID */ -+{ -+ int i; /* Looping var */ -+ int count; /* Count of reasons shown... */ -+ ipp_attribute_t *caprm, /* com.apple.print.recoverable-message */ -+ *psm, /* printer-state-message */ -+ *reasons, /* printer-state-reasons */ -+ *marker; /* marker-* attributes */ -+ const char *reason; /* Current reason */ -+ const char *prefix; /* Prefix for STATE: line */ -+ char state[1024]; /* State string */ -+ int saw_caprw; /* Saw com.apple.print.recoverable-warning state */ -+ -+ -+ if ((psm = ippFindAttribute(ipp, "printer-state-message", -+ IPP_TAG_TEXT)) != NULL) -+ fprintf(stderr, "INFO: %s\n", psm->values[0].string.text); -+ -+ if ((reasons = ippFindAttribute(ipp, "printer-state-reasons", -+ IPP_TAG_KEYWORD)) == NULL) -+ return (0); -+ -+ saw_caprw = 0; -+ state[0] = '\0'; -+ prefix = "STATE: "; -+ -+ for (i = 0, count = 0; i < reasons->num_values; i ++) -+ { -+ reason = reasons->values[i].string.text; -+ -+ if (!strcmp(reason, "com.apple.print.recoverable-warning")) -+ saw_caprw = 1; -+ else if (strcmp(reason, "paused")) -+ { -+ strlcat(state, prefix, sizeof(state)); -+ strlcat(state, reason, sizeof(state)); -+ -+ prefix = ","; -+ } -+ } -+ -+ if (state[0]) -+ fprintf(stderr, "%s\n", state); -+ -+ /* -+ * Relay com.apple.print.recoverable-message... -+ */ -+ -+ if ((caprm = ippFindAttribute(ipp, "com.apple.print.recoverable-message", -+ IPP_TAG_TEXT)) != NULL) -+ fprintf(stderr, "WARNING: %s: %s\n", -+ saw_caprw ? "recoverable" : "recovered", -+ caprm->values[0].string.text); -+ -+ /* -+ * Relay the current marker-* attribute values... -+ */ -+ -+ if ((marker = ippFindAttribute(ipp, "marker-colors", IPP_TAG_NAME)) != NULL) -+ report_attr(marker); -+ if ((marker = ippFindAttribute(ipp, "marker-high-levels", -+ IPP_TAG_INTEGER)) != NULL) -+ report_attr(marker); -+ if ((marker = ippFindAttribute(ipp, "marker-levels", -+ IPP_TAG_INTEGER)) != NULL) -+ report_attr(marker); -+ if ((marker = ippFindAttribute(ipp, "marker-low-levels", -+ IPP_TAG_INTEGER)) != NULL) -+ report_attr(marker); -+ if ((marker = ippFindAttribute(ipp, "marker-message", IPP_TAG_TEXT)) != NULL) -+ report_attr(marker); -+ if ((marker = ippFindAttribute(ipp, "marker-names", IPP_TAG_NAME)) != NULL) -+ report_attr(marker); -+ if ((marker = ippFindAttribute(ipp, "marker-types", IPP_TAG_KEYWORD)) != NULL) -+ report_attr(marker); -+ -+ return (count); -+} -+ -+ -+#ifdef __APPLE__ -+/* -+ * 'run_pictwps_filter()' - Convert PICT files to PostScript when printing -+ * remotely. -+ * -+ * This step is required because the PICT format is not documented and -+ * subject to change, so developing a filter for other OS's is infeasible. -+ * Also, fonts required by the PICT file need to be embedded on the -+ * client side (which has the fonts), so we run the filter to get a -+ * PostScript file for printing... -+ */ -+ -+static int /* O - Exit status of filter */ -+run_pictwps_filter(char **argv, /* I - Command-line arguments */ -+ const char *filename)/* I - Filename */ -+{ -+ struct stat fileinfo; /* Print file information */ -+ const char *ppdfile; /* PPD file for destination printer */ -+ int pid; /* Child process ID */ -+ int fd; /* Temporary file descriptor */ -+ int status; /* Exit status of filter */ -+ const char *printer; /* PRINTER env var */ -+ static char ppdenv[1024]; /* PPD environment variable */ -+ -+ -+ /* -+ * First get the PPD file for the printer... -+ */ -+ -+ printer = getenv("PRINTER"); -+ if (!printer) -+ { -+ _cupsLangPuts(stderr, -+ _("ERROR: PRINTER environment variable not defined!\n")); -+ return (-1); -+ } -+ -+ if ((ppdfile = cupsGetPPD(printer)) == NULL) -+ { -+ _cupsLangPrintf(stderr, -+ _("ERROR: Unable to get PPD file for printer \"%s\" - " -+ "%s.\n"), printer, cupsLastErrorString()); -+ } -+ else -+ { -+ snprintf(ppdenv, sizeof(ppdenv), "PPD=%s", ppdfile); -+ putenv(ppdenv); -+ } -+ -+ /* -+ * Then create a temporary file for printing... -+ */ -+ -+ if ((fd = cupsTempFd(pstmpname, sizeof(pstmpname))) < 0) -+ { -+ _cupsLangPrintError("ERROR", _("Unable to create temporary file")); -+ if (ppdfile) -+ unlink(ppdfile); -+ return (-1); -+ } -+ -+ /* -+ * Get the owner of the spool file - it is owned by the user we want to run -+ * as... -+ */ -+ -+ if (argv[6]) -+ stat(argv[6], &fileinfo); -+ else -+ { -+ /* -+ * Use the OSX defaults, as an up-stream filter created the PICT -+ * file... -+ */ -+ -+ fileinfo.st_uid = 1; -+ fileinfo.st_gid = 80; -+ } -+ -+ if (ppdfile) -+ chown(ppdfile, fileinfo.st_uid, fileinfo.st_gid); -+ -+ fchown(fd, fileinfo.st_uid, fileinfo.st_gid); -+ -+ /* -+ * Finally, run the filter to convert the file... -+ */ -+ -+ if ((pid = fork()) == 0) -+ { -+ /* -+ * Child process for pictwpstops... Redirect output of pictwpstops to a -+ * file... -+ */ -+ -+ dup2(fd, 1); -+ close(fd); -+ -+ if (!getuid()) -+ { -+ /* -+ * Change to an unpriviledged user... -+ */ -+ -+ if (setgid(fileinfo.st_gid)) -+ return (errno); -+ -+ if (setuid(fileinfo.st_uid)) -+ return (errno); -+ } -+ -+ execlp("pictwpstops", printer, argv[1], argv[2], argv[3], argv[4], argv[5], -+ filename, NULL); -+ _cupsLangPrintf(stderr, _("ERROR: Unable to exec pictwpstops: %s\n"), -+ strerror(errno)); -+ return (errno); -+ } -+ -+ close(fd); -+ -+ if (pid < 0) -+ { -+ /* -+ * Error! -+ */ -+ -+ _cupsLangPrintf(stderr, _("ERROR: Unable to fork pictwpstops: %s\n"), -+ strerror(errno)); -+ if (ppdfile) -+ unlink(ppdfile); -+ return (-1); -+ } -+ -+ /* -+ * Now wait for the filter to complete... -+ */ -+ -+ if (wait(&status) < 0) -+ { -+ _cupsLangPrintf(stderr, _("ERROR: Unable to wait for pictwpstops: %s\n"), -+ strerror(errno)); -+ close(fd); -+ if (ppdfile) -+ unlink(ppdfile); -+ return (-1); -+ } -+ -+ if (ppdfile) -+ unlink(ppdfile); -+ -+ close(fd); -+ -+ if (status) -+ { -+ if (status >= 256) -+ _cupsLangPrintf(stderr, _("ERROR: pictwpstops exited with status %d!\n"), -+ status / 256); -+ else -+ _cupsLangPrintf(stderr, _("ERROR: pictwpstops exited on signal %d!\n"), -+ status); -+ -+ return (status); -+ } -+ -+ /* -+ * Return with no errors.. -+ */ -+ -+ return (0); -+} -+#endif /* __APPLE__ */ -+ -+ -+/* -+ * 'sigterm_handler()' - Handle 'terminate' signals that stop the backend. -+ */ -+ -+static void -+sigterm_handler(int sig) /* I - Signal */ -+{ -+ (void)sig; /* remove compiler warnings... */ -+ -+ if (!job_cancelled) -+ { -+ /* -+ * Flag that the job should be cancelled... -+ */ -+ -+ job_cancelled = 1; -+ return; -+ } -+ -+ /* -+ * The scheduler already tried to cancel us once, now just terminate -+ * after removing our temp files! -+ */ -+ -+ if (tmpfilename[0]) -+ unlink(tmpfilename); -+ -+#ifdef __APPLE__ -+ if (pstmpname[0]) -+ unlink(pstmpname); -+#endif /* __APPLE__ */ -+ -+ exit(1); -+} -+ -+ -+/* -+ * End of "$Id: ipp.c 8950 2010-01-14 22:40:19Z mike $". -+ */ diff --git a/cups-dymo-deviceid.patch b/cups-dymo-deviceid.patch index cc2995d..3ff1ffd 100644 --- a/cups-dymo-deviceid.patch +++ b/cups-dymo-deviceid.patch @@ -1,11 +1,11 @@ -diff -up cups-1.6.2/ppdc/sample.drv.dymo-deviceid cups-1.6.2/ppdc/sample.drv ---- cups-1.6.2/ppdc/sample.drv.dymo-deviceid 2013-06-18 16:57:02.110662953 +0100 -+++ cups-1.6.2/ppdc/sample.drv 2013-06-18 16:58:56.513989117 +0100 -@@ -125,6 +125,7 @@ Version "1.5" +diff -up cups-2.3.1/ppdc/sample.drv.dymo-deviceid cups-2.3.1/ppdc/sample.drv +--- cups-2.3.1/ppdc/sample.drv.dymo-deviceid 2019-12-16 09:22:34.476492212 +0100 ++++ cups-2.3.1/ppdc/sample.drv 2019-12-16 09:23:44.665003895 +0100 +@@ -129,6 +129,7 @@ Version "2.3" { - Manufacturer "Dymo" + Manufacturer "DYMO" ModelName "Label Printer" + Attribute "1284DeviceID" "" "MFG:DYMO;MDL:LabelWriter 400;" - Attribute NickName "" "Dymo Label Printer" + Attribute NickName "" "DYMO Label Printer" PCFileName "dymo.ppd" DriverType label diff --git a/cups-eggcups.patch b/cups-eggcups.patch index cadf277..b49638e 100644 --- a/cups-eggcups.patch +++ b/cups-eggcups.patch @@ -1,7 +1,7 @@ -diff -up cups-2.2.5/backend/ipp.c.eggcups cups-2.2.5/backend/ipp.c ---- cups-2.2.5/backend/ipp.c.eggcups 2017-10-13 20:22:26.000000000 +0200 -+++ cups-2.2.5/backend/ipp.c 2017-10-17 18:56:42.409024451 +0200 -@@ -149,6 +149,70 @@ static char tmpfilename[1024] = ""; +diff -up cups-2.3.0/backend/ipp.c.eggcups cups-2.3.0/backend/ipp.c +--- cups-2.3.0/backend/ipp.c.eggcups 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/backend/ipp.c 2019-10-07 12:14:25.385111933 +0200 +@@ -143,6 +143,70 @@ static char tmpfilename[1024] = ""; static char mandatory_attrs[1024] = ""; /* cupsMandatory value */ @@ -72,7 +72,7 @@ diff -up cups-2.2.5/backend/ipp.c.eggcups cups-2.2.5/backend/ipp.c /* * Local functions... -@@ -1743,6 +1807,15 @@ main(int argc, /* I - Number of comm +@@ -1768,6 +1832,15 @@ main(int argc, /* I - Number of comm fprintf(stderr, "DEBUG: Print job accepted - job ID %d.\n", job_id); } @@ -88,22 +88,22 @@ diff -up cups-2.2.5/backend/ipp.c.eggcups cups-2.2.5/backend/ipp.c ippDelete(response); if (job_canceled) -diff -up cups-2.2.5/backend/Makefile.eggcups cups-2.2.5/backend/Makefile ---- cups-2.2.5/backend/Makefile.eggcups 2017-10-17 18:56:42.409024451 +0200 -+++ cups-2.2.5/backend/Makefile 2017-10-17 18:59:11.696781116 +0200 -@@ -262,7 +262,7 @@ dnssd: dnssd.o ../cups/$(LIBCUPS) libbac +diff -up cups-2.3.0/backend/Makefile.eggcups cups-2.3.0/backend/Makefile +--- cups-2.3.0/backend/Makefile.eggcups 2019-10-07 12:14:25.385111933 +0200 ++++ cups-2.3.0/backend/Makefile 2019-10-07 12:16:00.457569406 +0200 +@@ -257,7 +257,7 @@ dnssd: dnssd.o ../cups/$(LIBCUPS) libbac ipp: ipp.o ../cups/$(LIBCUPS) libbackend.a echo Linking $@... -- $(LD_CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS) -+ $(LD_CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS) $(SERVERLIBS) +- $(LD_CC) $(ALL_LDFLAGS) -o ipp ipp.o libbackend.a $(LINKCUPS) ++ $(LD_CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LINKCUPS) $(SERVERLIBS) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ - $(RM) http - $(LN) ipp http -diff -up cups-2.2.5/scheduler/subscriptions.c.eggcups cups-2.2.5/scheduler/subscriptions.c ---- cups-2.2.5/scheduler/subscriptions.c.eggcups 2017-10-13 20:22:26.000000000 +0200 -+++ cups-2.2.5/scheduler/subscriptions.c 2017-10-17 18:56:42.409024451 +0200 -@@ -1291,13 +1291,13 @@ cupsd_send_dbus(cupsd_eventmask_t event, + $(RM) http https ipps + for file in $(IPPALIASES); do \ +diff -up cups-2.3.0/scheduler/subscriptions.c.eggcups cups-2.3.0/scheduler/subscriptions.c +--- cups-2.3.0/scheduler/subscriptions.c.eggcups 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/scheduler/subscriptions.c 2019-10-07 12:18:21.736478684 +0200 +@@ -1257,13 +1257,13 @@ cupsd_send_dbus(cupsd_eventmask_t event, what = "PrinterAdded"; else if (event & CUPSD_EVENT_PRINTER_DELETED) what = "PrinterRemoved"; @@ -112,14 +112,14 @@ diff -up cups-2.2.5/scheduler/subscriptions.c.eggcups cups-2.2.5/scheduler/subsc else if (event & CUPSD_EVENT_JOB_CREATED) what = "JobQueuedLocal"; else if ((event & CUPSD_EVENT_JOB_STATE) && job && - job->state_value == IPP_JOB_PROCESSING) + job->state_value == IPP_JOB_PROCESSING) what = "JobStartedLocal"; + else if (event & (CUPSD_EVENT_PRINTER_CHANGED|CUPSD_EVENT_JOB_STATE_CHANGED|CUPSD_EVENT_PRINTER_STATE_CHANGED)) + what = "QueueChanged"; else return; -@@ -1333,7 +1333,7 @@ cupsd_send_dbus(cupsd_eventmask_t event, +@@ -1299,7 +1299,7 @@ cupsd_send_dbus(cupsd_eventmask_t event, dbus_message_append_iter_init(message, &iter); if (dest) dbus_message_iter_append_string(&iter, dest->name); diff --git a/cups-lspp.patch b/cups-lspp.patch index 667cda1..7c094d2 100644 --- a/cups-lspp.patch +++ b/cups-lspp.patch @@ -1,7 +1,7 @@ -diff -up cups-2.2.8/config.h.in.lspp cups-2.2.8/config.h.in ---- cups-2.2.8/config.h.in.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/config.h.in 2018-06-08 17:34:38.682653959 +0200 -@@ -730,4 +730,11 @@ static __inline int _cups_abs(int i) { r +diff -up cups-2.3.0/config.h.in.lspp cups-2.3.0/config.h.in +--- cups-2.3.0/config.h.in.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/config.h.in 2019-10-07 12:24:43.058597468 +0200 +@@ -684,4 +684,11 @@ static __inline int _cups_abs(int i) { r # endif /* __GNUC__ || __STDC_VERSION__ */ #endif /* !HAVE_ABS && !abs */ @@ -13,9 +13,9 @@ diff -up cups-2.2.8/config.h.in.lspp cups-2.2.8/config.h.in + + #endif /* !_CUPS_CONFIG_H_ */ -diff -up cups-2.2.8/config-scripts/cups-lspp.m4.lspp cups-2.2.8/config-scripts/cups-lspp.m4 ---- cups-2.2.8/config-scripts/cups-lspp.m4.lspp 2018-06-08 17:34:38.682653959 +0200 -+++ cups-2.2.8/config-scripts/cups-lspp.m4 2018-06-08 17:34:38.682653959 +0200 +diff -up cups-2.3.0/config-scripts/cups-lspp.m4.lspp cups-2.3.0/config-scripts/cups-lspp.m4 +--- cups-2.3.0/config-scripts/cups-lspp.m4.lspp 2019-10-07 12:24:43.058597468 +0200 ++++ cups-2.3.0/config-scripts/cups-lspp.m4 2019-10-07 12:24:43.058597468 +0200 @@ -0,0 +1,36 @@ +dnl +dnl LSPP code for the Common UNIX Printing System (CUPS). @@ -53,22 +53,22 @@ diff -up cups-2.2.8/config-scripts/cups-lspp.m4.lspp cups-2.2.8/config-scripts/c + ;; + esac +fi -diff -up cups-2.2.8/configure.ac.lspp cups-2.2.8/configure.ac ---- cups-2.2.8/configure.ac.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/configure.ac 2018-06-08 17:34:38.682653959 +0200 -@@ -38,6 +38,8 @@ sinclude(config-scripts/cups-startup.m4) +diff -up cups-2.3.0/configure.ac.lspp cups-2.3.0/configure.ac +--- cups-2.3.0/configure.ac.lspp 2019-10-07 12:24:43.058597468 +0200 ++++ cups-2.3.0/configure.ac 2019-10-07 12:39:20.122546282 +0200 +@@ -34,6 +34,8 @@ sinclude(config-scripts/cups-dnssd.m4) + sinclude(config-scripts/cups-startup.m4) sinclude(config-scripts/cups-defaults.m4) - sinclude(config-scripts/cups-scripting.m4) +sinclude(config-scripts/cups-lspp.m4) + INSTALL_LANGUAGES="" UNINSTALL_LANGUAGES="" LANGFILES="" -diff -up cups-2.2.8/filter/common.c.lspp cups-2.2.8/filter/common.c ---- cups-2.2.8/filter/common.c.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/filter/common.c 2018-06-08 17:34:38.682653959 +0200 -@@ -17,6 +17,12 @@ +diff -up cups-2.3.0/filter/common.c.lspp cups-2.3.0/filter/common.c +--- cups-2.3.0/filter/common.c.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/filter/common.c 2019-10-07 12:24:43.059597461 +0200 +@@ -11,6 +11,12 @@ * Include necessary headers... */ @@ -81,7 +81,7 @@ diff -up cups-2.2.8/filter/common.c.lspp cups-2.2.8/filter/common.c #include "common.h" #include -@@ -299,6 +305,18 @@ WriteLabelProlog(const char *label, /* I +@@ -293,6 +299,18 @@ WriteLabelProlog(const char *label, /* I { const char *classification; /* CLASSIFICATION environment variable */ const char *ptr; /* Temporary string pointer */ @@ -100,7 +100,7 @@ diff -up cups-2.2.8/filter/common.c.lspp cups-2.2.8/filter/common.c /* -@@ -321,6 +339,124 @@ WriteLabelProlog(const char *label, /* I +@@ -315,6 +333,124 @@ WriteLabelProlog(const char *label, /* I return; } @@ -225,7 +225,7 @@ diff -up cups-2.2.8/filter/common.c.lspp cups-2.2.8/filter/common.c /* * Set the classification + page label string... */ -@@ -401,7 +537,10 @@ WriteLabelProlog(const char *label, /* I +@@ -395,7 +531,10 @@ WriteLabelProlog(const char *label, /* I printf(" %.0f moveto ESPpl show\n", top - 14.0); puts("pop"); puts("}bind put"); @@ -236,10 +236,10 @@ diff -up cups-2.2.8/filter/common.c.lspp cups-2.2.8/filter/common.c /* -diff -up cups-2.2.8/filter/pstops.c.lspp cups-2.2.8/filter/pstops.c ---- cups-2.2.8/filter/pstops.c.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/filter/pstops.c 2018-06-08 17:34:38.683653951 +0200 -@@ -3176,6 +3176,18 @@ write_label_prolog(pstops_doc_t *doc, /* +diff -up cups-2.3.0/filter/pstops.c.lspp cups-2.3.0/filter/pstops.c +--- cups-2.3.0/filter/pstops.c.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/filter/pstops.c 2019-10-07 12:24:43.059597461 +0200 +@@ -3170,6 +3170,18 @@ write_label_prolog(pstops_doc_t *doc, /* { const char *classification; /* CLASSIFICATION environment variable */ const char *ptr; /* Temporary string pointer */ @@ -258,7 +258,7 @@ diff -up cups-2.2.8/filter/pstops.c.lspp cups-2.2.8/filter/pstops.c /* -@@ -3198,6 +3210,124 @@ write_label_prolog(pstops_doc_t *doc, /* +@@ -3192,6 +3204,124 @@ write_label_prolog(pstops_doc_t *doc, /* return; } @@ -383,7 +383,7 @@ diff -up cups-2.2.8/filter/pstops.c.lspp cups-2.2.8/filter/pstops.c /* * Set the classification + page label string... */ -@@ -3276,7 +3406,10 @@ write_label_prolog(pstops_doc_t *doc, /* +@@ -3270,7 +3400,10 @@ write_label_prolog(pstops_doc_t *doc, /* doc_printf(doc, " %.0f moveto ESPpl show\n", top - 14.0); doc_puts(doc, "pop\n"); doc_puts(doc, "}bind put\n"); @@ -394,22 +394,22 @@ diff -up cups-2.2.8/filter/pstops.c.lspp cups-2.2.8/filter/pstops.c /* -diff -up cups-2.2.8/Makedefs.in.lspp cups-2.2.8/Makedefs.in ---- cups-2.2.8/Makedefs.in.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/Makedefs.in 2018-06-08 17:34:38.683653951 +0200 -@@ -161,7 +161,7 @@ LDFLAGS = -L../cgi-bin -L../cups -L../f - @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM) - LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(DNSSDLIBS) $(SSLLIBS) $(LIBZ) - LINKCUPSIMAGE = @LINKCUPSIMAGE@ --LIBS = $(LINKCUPS) $(COMMONLIBS) -+LIBS = $(LINKCUPS) $(COMMONLIBS) @LIBAUDIT@ @LIBSELINUX@ +diff -up cups-2.3.0/Makedefs.in.lspp cups-2.3.0/Makedefs.in +--- cups-2.3.0/Makedefs.in.lspp 2019-10-07 12:24:43.059597461 +0200 ++++ cups-2.3.0/Makedefs.in 2019-10-07 12:37:19.200565805 +0200 +@@ -174,7 +174,7 @@ IPPFIND_MAN = @IPPFIND_MAN@ + LDFLAGS = @LDFLAGS@ + LINKCUPS = @LINKCUPS@ + LINKCUPSSTATIC = ../cups/$(LIBCUPSSTATIC) $(LIBS) +-LIBS = $(LIBGSSAPI) $(DNSSDLIBS) $(SSLLIBS) $(LIBZ) $(COMMONLIBS) ++LIBS = $(LIBGSSAPI) $(DNSSDLIBS) $(SSLLIBS) $(LIBZ) $(COMMONLIBS) @LIBAUDIT@ @LIBSELINUX@ ONDEMANDFLAGS = @ONDEMANDFLAGS@ ONDEMANDLIBS = @ONDEMANDLIBS@ OPTIM = @OPTIM@ -diff -up cups-2.2.8/scheduler/client.c.lspp cups-2.2.8/scheduler/client.c ---- cups-2.2.8/scheduler/client.c.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/scheduler/client.c 2018-06-08 17:34:38.729653586 +0200 -@@ -22,12 +22,20 @@ +diff -up cups-2.3.0/scheduler/client.c.lspp cups-2.3.0/scheduler/client.c +--- cups-2.3.0/scheduler/client.c.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/scheduler/client.c 2019-10-07 12:33:10.459693580 +0200 +@@ -19,12 +19,20 @@ #define _HTTP_NO_PRIVATE #include "cupsd.h" @@ -430,7 +430,7 @@ diff -up cups-2.2.8/scheduler/client.c.lspp cups-2.2.8/scheduler/client.c /* -@@ -268,6 +276,59 @@ cupsdAcceptClient(cupsd_listener_t *lis) +@@ -265,6 +273,59 @@ cupsdAcceptClient(cupsd_listener_t *lis) } #endif /* HAVE_TCPD_H */ @@ -490,9 +490,9 @@ diff -up cups-2.2.8/scheduler/client.c.lspp cups-2.2.8/scheduler/client.c #ifdef AF_LOCAL if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL) { -@@ -562,6 +623,13 @@ cupsdReadClient(cupsd_client_t *con) /* +@@ -558,6 +619,13 @@ cupsdReadClient(cupsd_client_t *con) /* + struct stat filestats; /* File information */ mime_type_t *type; /* MIME type of file */ - cupsd_printer_t *p; /* Printer */ static unsigned request_id = 0; /* Request ID for temp files */ +#ifdef WITH_LSPP + security_context_t spoolcon; /* context of the job file */ @@ -504,7 +504,7 @@ diff -up cups-2.2.8/scheduler/client.c.lspp cups-2.2.8/scheduler/client.c status = HTTP_STATUS_CONTINUE; -@@ -1938,6 +2006,73 @@ cupsdReadClient(cupsd_client_t *con) /* +@@ -1679,6 +1747,73 @@ cupsdReadClient(cupsd_client_t *con) /* fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); } @@ -578,7 +578,7 @@ diff -up cups-2.2.8/scheduler/client.c.lspp cups-2.2.8/scheduler/client.c if (httpGetState(con->http) != HTTP_STATE_POST_SEND) { if (!httpWait(con->http, 0)) -@@ -3485,6 +3620,49 @@ is_path_absolute(const char *path) /* I +@@ -3174,6 +3309,49 @@ is_path_absolute(const char *path) /* I return (1); } @@ -628,10 +628,10 @@ diff -up cups-2.2.8/scheduler/client.c.lspp cups-2.2.8/scheduler/client.c /* * 'pipe_command()' - Pipe the output of a command to the remote client. -diff -up cups-2.2.8/scheduler/client.h.lspp cups-2.2.8/scheduler/client.h ---- cups-2.2.8/scheduler/client.h.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/scheduler/client.h 2018-06-08 17:34:38.729653586 +0200 -@@ -16,6 +16,13 @@ +diff -up cups-2.3.0/scheduler/client.h.lspp cups-2.3.0/scheduler/client.h +--- cups-2.3.0/scheduler/client.h.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/scheduler/client.h 2019-10-07 12:24:43.113597079 +0200 +@@ -13,6 +13,13 @@ #endif /* HAVE_AUTHORIZATION_H */ @@ -645,7 +645,7 @@ diff -up cups-2.2.8/scheduler/client.h.lspp cups-2.2.8/scheduler/client.h /* * HTTP client structure... */ -@@ -66,6 +73,10 @@ struct cupsd_client_s +@@ -63,6 +70,10 @@ struct cupsd_client_s #ifdef HAVE_AUTHORIZATION_H AuthorizationRef authref; /* Authorization ref */ #endif /* HAVE_AUTHORIZATION_H */ @@ -656,7 +656,7 @@ diff -up cups-2.2.8/scheduler/client.h.lspp cups-2.2.8/scheduler/client.h }; #define HTTP(con) ((con)->http) -@@ -139,6 +150,9 @@ extern void cupsdStartListening(void); +@@ -136,6 +147,9 @@ extern void cupsdStartListening(void); extern void cupsdStopListening(void); extern void cupsdUpdateCGI(void); extern void cupsdWriteClient(cupsd_client_t *con); @@ -666,10 +666,10 @@ diff -up cups-2.2.8/scheduler/client.h.lspp cups-2.2.8/scheduler/client.h #ifdef HAVE_SSL extern int cupsdEndTLS(cupsd_client_t *con); -diff -up cups-2.2.8/scheduler/conf.c.lspp cups-2.2.8/scheduler/conf.c ---- cups-2.2.8/scheduler/conf.c.lspp 2018-06-08 17:34:38.676654007 +0200 -+++ cups-2.2.8/scheduler/conf.c 2018-06-08 17:34:38.730653578 +0200 -@@ -40,6 +40,9 @@ +diff -up cups-2.3.0/scheduler/conf.c.lspp cups-2.3.0/scheduler/conf.c +--- cups-2.3.0/scheduler/conf.c.lspp 2019-10-07 12:24:43.049597531 +0200 ++++ cups-2.3.0/scheduler/conf.c 2019-10-07 12:24:43.113597079 +0200 +@@ -37,6 +37,9 @@ # define INADDR_NONE 0xffffffff #endif /* !INADDR_NONE */ @@ -700,7 +700,7 @@ diff -up cups-2.2.8/scheduler/conf.c.lspp cups-2.2.8/scheduler/conf.c /* -@@ -863,6 +873,25 @@ cupsdReadConfiguration(void) +@@ -864,6 +874,25 @@ cupsdReadConfiguration(void) RunUser = getuid(); @@ -726,7 +726,7 @@ diff -up cups-2.2.8/scheduler/conf.c.lspp cups-2.2.8/scheduler/conf.c cupsdLogMessage(CUPSD_LOG_INFO, "Remote access is %s.", RemotePort ? "enabled" : "disabled"); -@@ -1274,7 +1303,19 @@ cupsdReadConfiguration(void) +@@ -1275,7 +1304,19 @@ cupsdReadConfiguration(void) cupsdClearString(&Classification); if (Classification) @@ -746,7 +746,7 @@ diff -up cups-2.2.8/scheduler/conf.c.lspp cups-2.2.8/scheduler/conf.c /* * Check the MaxClients setting, and then allocate memory for it... -@@ -3832,6 +3873,18 @@ read_location(cups_file_t *fp, /* I - C +@@ -3830,6 +3871,18 @@ read_location(cups_file_t *fp, /* I - C return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum); } @@ -765,10 +765,10 @@ diff -up cups-2.2.8/scheduler/conf.c.lspp cups-2.2.8/scheduler/conf.c /* * 'read_policy()' - Read a definition. -diff -up cups-2.2.8/scheduler/conf.h.lspp cups-2.2.8/scheduler/conf.h ---- cups-2.2.8/scheduler/conf.h.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/scheduler/conf.h 2018-06-08 17:34:38.730653578 +0200 -@@ -246,6 +246,13 @@ VAR char *ServerKeychain VALUE(NULL); +diff -up cups-2.3.0/scheduler/conf.h.lspp cups-2.3.0/scheduler/conf.h +--- cups-2.3.0/scheduler/conf.h.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/scheduler/conf.h 2019-10-07 12:24:43.113597079 +0200 +@@ -243,6 +243,13 @@ VAR char *ServerKeychain VALUE(NULL); /* Keychain holding cert + key */ #endif /* HAVE_SSL */ @@ -782,7 +782,7 @@ diff -up cups-2.2.8/scheduler/conf.h.lspp cups-2.2.8/scheduler/conf.h #ifdef HAVE_ONDEMAND VAR int IdleExitTimeout VALUE(60); /* Time after which an idle cupsd will exit */ -@@ -264,6 +271,9 @@ VAR int HaveServerCreds VALUE(0); +@@ -261,6 +268,9 @@ VAR int HaveServerCreds VALUE(0); VAR gss_cred_id_t ServerCreds; /* Server's GSS credentials */ #endif /* HAVE_GSSAPI */ @@ -792,11 +792,11 @@ diff -up cups-2.2.8/scheduler/conf.h.lspp cups-2.2.8/scheduler/conf.h /* * Prototypes... -diff -up cups-2.2.8/scheduler/cupsd.h.lspp cups-2.2.8/scheduler/cupsd.h ---- cups-2.2.8/scheduler/cupsd.h.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/scheduler/cupsd.h 2018-06-08 17:34:38.730653578 +0200 -@@ -11,6 +11,8 @@ - * file is missing or damaged, see the license at "http://www.cups.org/". +diff -up cups-2.3.0/scheduler/cupsd.h.lspp cups-2.3.0/scheduler/cupsd.h +--- cups-2.3.0/scheduler/cupsd.h.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/scheduler/cupsd.h 2019-10-07 12:31:38.458480578 +0200 +@@ -8,6 +8,8 @@ + * information. */ +/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */ @@ -804,9 +804,9 @@ diff -up cups-2.2.8/scheduler/cupsd.h.lspp cups-2.2.8/scheduler/cupsd.h /* * Include necessary headers. -@@ -36,13 +38,20 @@ +@@ -33,6 +35,14 @@ # include - #endif /* WIN32 */ + #endif /* _WIN32 */ +#include "config.h" +#ifdef WITH_LSPP @@ -819,18 +819,11 @@ diff -up cups-2.2.8/scheduler/cupsd.h.lspp cups-2.2.8/scheduler/cupsd.h #include "mime.h" #if defined(HAVE_CDSASSL) - # include - #endif /* HAVE_CDSASSL */ - -- - /* - * Some OS's don't have hstrerror(), most notably Solaris... - */ -diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c ---- cups-2.2.8/scheduler/ipp.c.lspp 2018-06-08 17:34:38.652654197 +0200 -+++ cups-2.2.8/scheduler/ipp.c 2018-06-08 17:37:19.166378937 +0200 -@@ -14,6 +14,9 @@ - * missing or damaged, see the license at "http://www.cups.org/". +diff -up cups-2.3.0/scheduler/ipp.c.lspp cups-2.3.0/scheduler/ipp.c +--- cups-2.3.0/scheduler/ipp.c.lspp 2019-10-07 12:24:43.016597764 +0200 ++++ cups-2.3.0/scheduler/ipp.c 2019-10-07 12:31:01.243798920 +0200 +@@ -11,6 +11,9 @@ + * information. */ +/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */ @@ -839,8 +832,8 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c /* * Include necessary headers... */ -@@ -37,6 +40,14 @@ extern int mbr_check_membership_by_id(uu - # endif /* HAVE_MEMBERSHIPPRIV_H */ +@@ -27,6 +30,14 @@ extern int mbr_group_name_to_uuid(const + extern int mbr_check_membership_by_id(uuid_t user, gid_t group, int* ismember); #endif /* __APPLE__ */ +#ifdef WITH_LSPP @@ -854,7 +847,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c /* * Local functions... -@@ -61,6 +72,9 @@ static void cancel_all_jobs(cupsd_client +@@ -51,6 +62,9 @@ static void cancel_all_jobs(cupsd_client static void cancel_job(cupsd_client_t *con, ipp_attribute_t *uri); static void cancel_subscription(cupsd_client_t *con, int id); static int check_rss_recipient(const char *recipient); @@ -864,7 +857,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c static int check_quotas(cupsd_client_t *con, cupsd_printer_t *p); static void close_job(cupsd_client_t *con, ipp_attribute_t *uri); static void copy_attrs(ipp_t *to, ipp_t *from, cups_array_t *ra, -@@ -1250,6 +1264,21 @@ add_job(cupsd_client_t *con, /* I - Cl +@@ -1240,6 +1254,21 @@ add_job(cupsd_client_t *con, /* I - Cl "time-at-creation", "time-at-processing" }; @@ -886,7 +879,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))", -@@ -1578,6 +1607,106 @@ add_job(cupsd_client_t *con, /* I - Cl +@@ -1568,6 +1597,106 @@ add_job(cupsd_client_t *con, /* I - Cl attr = ippFindAttribute(con->request, "requesting-user-name", IPP_TAG_NAME); @@ -993,7 +986,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c if ((job = cupsdAddJob(priority, printer->name)) == NULL) { send_ipp_status(con, IPP_INTERNAL_ERROR, -@@ -1586,6 +1715,32 @@ add_job(cupsd_client_t *con, /* I - Cl +@@ -1576,6 +1705,32 @@ add_job(cupsd_client_t *con, /* I - Cl return (NULL); } @@ -1026,7 +1019,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c job->dtype = printer->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE); job->attrs = con->request; job->dirty = 1; -@@ -1773,6 +1928,29 @@ add_job(cupsd_client_t *con, /* I - Cl +@@ -1763,6 +1918,29 @@ add_job(cupsd_client_t *con, /* I - Cl ippSetString(job->attrs, &attr, 0, printer->job_sheets[0]); ippSetString(job->attrs, &attr, 1, printer->job_sheets[1]); } @@ -1056,7 +1049,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c job->job_sheets = attr; -@@ -1803,6 +1981,9 @@ add_job(cupsd_client_t *con, /* I - Cl +@@ -1793,6 +1971,9 @@ add_job(cupsd_client_t *con, /* I - Cl "job-sheets=\"%s,none\", " "job-originating-user-name=\"%s\"", Classification, job->username); @@ -1066,7 +1059,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c } else if (attr->num_values == 2 && strcmp(attr->values[0].string.text, -@@ -1821,6 +2002,9 @@ add_job(cupsd_client_t *con, /* I - Cl +@@ -1811,6 +1992,9 @@ add_job(cupsd_client_t *con, /* I - Cl "job-originating-user-name=\"%s\"", attr->values[0].string.text, attr->values[1].string.text, job->username); @@ -1076,7 +1069,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c } else if (strcmp(attr->values[0].string.text, Classification) && strcmp(attr->values[0].string.text, "none") && -@@ -1841,6 +2025,9 @@ add_job(cupsd_client_t *con, /* I - Cl +@@ -1831,6 +2015,9 @@ add_job(cupsd_client_t *con, /* I - Cl "job-originating-user-name=\"%s\"", attr->values[0].string.text, attr->values[1].string.text, job->username); @@ -1086,7 +1079,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c } } else if (strcmp(attr->values[0].string.text, Classification) && -@@ -1881,8 +2068,52 @@ add_job(cupsd_client_t *con, /* I - Cl +@@ -1871,8 +2058,52 @@ add_job(cupsd_client_t *con, /* I - Cl "job-sheets=\"%s\", " "job-originating-user-name=\"%s\"", Classification, job->username); @@ -1139,7 +1132,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c /* * See if we need to add the starting sheet... -@@ -3656,6 +3887,128 @@ check_rss_recipient( +@@ -3648,6 +3879,128 @@ check_rss_recipient( } @@ -1268,7 +1261,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c /* * 'check_quotas()' - Check quotas for a printer and user. */ -@@ -4112,6 +4465,15 @@ copy_banner(cupsd_client_t *con, /* I - +@@ -4103,6 +4456,15 @@ copy_banner(cupsd_client_t *con, /* I - char attrname[255], /* Name of attribute */ *s; /* Pointer into name */ ipp_attribute_t *attr; /* Attribute */ @@ -1284,7 +1277,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c cupsdLogMessage(CUPSD_LOG_DEBUG2, -@@ -4147,6 +4509,85 @@ copy_banner(cupsd_client_t *con, /* I - +@@ -4138,6 +4500,85 @@ copy_banner(cupsd_client_t *con, /* I - fchmod(cupsFileNumber(out), 0640); fchown(cupsFileNumber(out), RunUser, Group); @@ -1370,7 +1363,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c /* * Try the localized banner file under the subdirectory... -@@ -4241,6 +4682,24 @@ copy_banner(cupsd_client_t *con, /* I - +@@ -4232,6 +4673,24 @@ copy_banner(cupsd_client_t *con, /* I - else s = attrname; @@ -1395,7 +1388,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c if (!strcmp(s, "printer-name")) { cupsFilePuts(out, job->dest); -@@ -6480,6 +6939,22 @@ get_job_attrs(cupsd_client_t *con, /* I +@@ -6439,6 +6898,22 @@ get_job_attrs(cupsd_client_t *con, /* I exclude = cupsdGetPrivateAttrs(policy, con, printer, job->username); @@ -1418,7 +1411,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c /* * Copy attributes... */ -@@ -6877,6 +7352,11 @@ get_jobs(cupsd_client_t *con, /* I - C +@@ -6836,6 +7311,11 @@ get_jobs(cupsd_client_t *con, /* I - C if (username[0] && _cups_strcasecmp(username, job->username)) continue; @@ -1430,7 +1423,7 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c if (count > 0) ippAddSeparator(con->response); -@@ -11475,6 +11955,11 @@ validate_user(cupsd_job_t *job, /* I +@@ -11445,6 +11925,11 @@ validate_user(cupsd_job_t *job, /* I strlcpy(username, get_username(con), userlen); @@ -1442,11 +1435,11 @@ diff -up cups-2.2.8/scheduler/ipp.c.lspp cups-2.2.8/scheduler/ipp.c /* * Check the username against the owner... */ -diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c ---- cups-2.2.8/scheduler/job.c.lspp 2018-06-08 17:34:38.657654158 +0200 -+++ cups-2.2.8/scheduler/job.c 2018-06-08 17:34:38.733653554 +0200 -@@ -11,6 +11,9 @@ - * missing or damaged, see the license at "http://www.cups.org/". +diff -up cups-2.3.0/scheduler/job.c.lspp cups-2.3.0/scheduler/job.c +--- cups-2.3.0/scheduler/job.c.lspp 2019-10-07 12:24:43.024597707 +0200 ++++ cups-2.3.0/scheduler/job.c 2019-10-07 12:30:13.092210820 +0200 +@@ -8,6 +8,9 @@ + * information. */ +/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */ @@ -1455,7 +1448,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c /* * Include necessary headers... */ -@@ -26,6 +29,14 @@ +@@ -23,6 +26,14 @@ # endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */ #endif /* __APPLE__ */ @@ -1470,7 +1463,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c /* * Design Notes for Job Management -@@ -547,6 +558,14 @@ cupsdContinueJob(cupsd_job_t *job) /* I +@@ -544,6 +555,14 @@ cupsdContinueJob(cupsd_job_t *job) /* I /* PRINTER_STATE_REASONS env var */ rip_max_cache[255]; /* RIP_MAX_CACHE env variable */ @@ -1485,7 +1478,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c cupsdLogMessage(CUPSD_LOG_DEBUG2, -@@ -1083,6 +1102,67 @@ cupsdContinueJob(cupsd_job_t *job) /* I +@@ -1080,6 +1099,67 @@ cupsdContinueJob(cupsd_job_t *job) /* I if (final_content_type[0]) envp[envc ++] = final_content_type; @@ -1553,7 +1546,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c if (Classification && !banner_page) { if ((attr = ippFindAttribute(job->attrs, "job-sheets", -@@ -1862,6 +1942,22 @@ cupsdLoadJob(cupsd_job_t *job) /* I - J +@@ -1858,6 +1938,22 @@ cupsdLoadJob(cupsd_job_t *job) /* I - J ippSetString(job->attrs, &job->reasons, 0, "none"); } @@ -1576,7 +1569,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c job->impressions = ippFindAttribute(job->attrs, "job-impressions-completed", IPP_TAG_INTEGER); job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed", IPP_TAG_INTEGER); job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME); -@@ -2275,6 +2371,14 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J +@@ -2273,6 +2369,14 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J { char filename[1024]; /* Job control filename */ cups_file_t *fp; /* Job file */ @@ -1591,7 +1584,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p", -@@ -2297,6 +2401,78 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J +@@ -2295,6 +2399,78 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J fchown(cupsFileNumber(fp), RunUser, Group); @@ -1670,7 +1663,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c job->attrs->state = IPP_IDLE; if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, -@@ -3943,6 +4119,19 @@ get_options(cupsd_job_t *job, /* I - Jo +@@ -3995,6 +4171,19 @@ get_options(cupsd_job_t *job, /* I - Jo banner_page) continue; @@ -1690,7 +1683,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c /* * Otherwise add them to the list... */ -@@ -4704,6 +4893,18 @@ start_job(cupsd_job_t *job, /* I - +@@ -4805,6 +4994,18 @@ start_job(cupsd_job_t *job, /* I - cupsd_printer_t *printer) /* I - Printer to print job */ { const char *filename; /* Support filename */ @@ -1709,7 +1702,7 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs, "job-cancel-after", IPP_TAG_INTEGER); -@@ -4892,6 +5093,113 @@ start_job(cupsd_job_t *job, /* I - +@@ -4993,6 +5194,113 @@ start_job(cupsd_job_t *job, /* I - fcntl(job->side_pipes[1], F_SETFD, fcntl(job->side_pipes[1], F_GETFD) | FD_CLOEXEC); @@ -1823,11 +1816,11 @@ diff -up cups-2.2.8/scheduler/job.c.lspp cups-2.2.8/scheduler/job.c /* * Now start the first file in the job... */ -diff -up cups-2.2.8/scheduler/job.h.lspp cups-2.2.8/scheduler/job.h ---- cups-2.2.8/scheduler/job.h.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/scheduler/job.h 2018-06-08 17:34:38.733653554 +0200 -@@ -11,6 +11,13 @@ - * missing or damaged, see the license at "http://www.cups.org/". +diff -up cups-2.3.0/scheduler/job.h.lspp cups-2.3.0/scheduler/job.h +--- cups-2.3.0/scheduler/job.h.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/scheduler/job.h 2019-10-07 12:29:54.364371023 +0200 +@@ -7,6 +7,13 @@ + * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ +/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */ @@ -1840,7 +1833,7 @@ diff -up cups-2.2.8/scheduler/job.h.lspp cups-2.2.8/scheduler/job.h /* * Constants... */ -@@ -88,6 +95,10 @@ struct cupsd_job_s /**** Job request * +@@ -84,6 +91,10 @@ struct cupsd_job_s /**** Job request * int progress; /* Printing progress */ int num_keywords; /* Number of PPD keywords */ cups_option_t *keywords; /* PPD keywords */ @@ -1851,10 +1844,10 @@ diff -up cups-2.2.8/scheduler/job.h.lspp cups-2.2.8/scheduler/job.h }; typedef struct cupsd_joblog_s /**** Job log message ****/ -diff -up cups-2.2.8/scheduler/main.c.lspp cups-2.2.8/scheduler/main.c ---- cups-2.2.8/scheduler/main.c.lspp 2018-06-08 17:34:38.663654110 +0200 -+++ cups-2.2.8/scheduler/main.c 2018-06-08 17:34:38.734653546 +0200 -@@ -56,6 +56,9 @@ +diff -up cups-2.3.0/scheduler/main.c.lspp cups-2.3.0/scheduler/main.c +--- cups-2.3.0/scheduler/main.c.lspp 2019-10-07 12:24:43.037597616 +0200 ++++ cups-2.3.0/scheduler/main.c 2019-10-07 12:24:43.119597037 +0200 +@@ -57,6 +57,9 @@ # include #endif /* HAVE_SYS_PARAM_H */ @@ -1864,7 +1857,7 @@ diff -up cups-2.2.8/scheduler/main.c.lspp cups-2.2.8/scheduler/main.c /* * Local functions... -@@ -122,6 +125,9 @@ main(int argc, /* I - Number of comm +@@ -123,6 +126,9 @@ main(int argc, /* I - Number of comm #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ @@ -1900,7 +1893,7 @@ diff -up cups-2.2.8/scheduler/main.c.lspp cups-2.2.8/scheduler/main.c /* * Let the system know we are busy while we bring up cupsd... */ -@@ -1188,6 +1213,11 @@ main(int argc, /* I - Number of comm +@@ -1201,6 +1226,11 @@ main(int argc, /* I - Number of comm cupsdStopSelect(); @@ -1912,11 +1905,11 @@ diff -up cups-2.2.8/scheduler/main.c.lspp cups-2.2.8/scheduler/main.c return (!stop_scheduler); } -diff -up cups-2.2.8/scheduler/printers.c.lspp cups-2.2.8/scheduler/printers.c ---- cups-2.2.8/scheduler/printers.c.lspp 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/scheduler/printers.c 2018-06-08 17:34:38.734653546 +0200 -@@ -11,6 +11,8 @@ - * missing or damaged, see the license at "http://www.cups.org/". +diff -up cups-2.3.0/scheduler/printers.c.lspp cups-2.3.0/scheduler/printers.c +--- cups-2.3.0/scheduler/printers.c.lspp 2019-08-23 17:19:38.000000000 +0200 ++++ cups-2.3.0/scheduler/printers.c 2019-10-07 12:29:17.956658129 +0200 +@@ -8,6 +8,8 @@ + * information. */ +/* (c) Copyright 2005-2006 Hewlett-Packard Development Company, L.P. */ @@ -1924,7 +1917,7 @@ diff -up cups-2.2.8/scheduler/printers.c.lspp cups-2.2.8/scheduler/printers.c /* * Include necessary headers... */ -@@ -35,6 +37,10 @@ +@@ -32,6 +34,10 @@ # include #endif /* __APPLE__ */ @@ -1935,7 +1928,7 @@ diff -up cups-2.2.8/scheduler/printers.c.lspp cups-2.2.8/scheduler/printers.c /* * Local functions... -@@ -2202,6 +2208,13 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p) +@@ -2252,6 +2258,13 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p) ipp_attribute_t *attr; /* Attribute data */ char *name, /* Current user/group name */ *filter; /* Current filter */ @@ -1948,8 +1941,8 @@ diff -up cups-2.2.8/scheduler/printers.c.lspp cups-2.2.8/scheduler/printers.c +#endif /* WITH_LSPP */ - DEBUG_printf(("cupsdSetPrinterAttrs: entering name = %s, type = %x\n", p->name, -@@ -2329,6 +2342,45 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p) + /* +@@ -2378,6 +2391,45 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p) attr->values[1].string.text = _cupsStrAlloc(Classification ? Classification : p->job_sheets[1]); } diff --git a/cups-man_pages_linking.patch b/cups-man_pages_linking.patch index 57d4973..594481b 100644 --- a/cups-man_pages_linking.patch +++ b/cups-man_pages_linking.patch @@ -1,36 +1,27 @@ ---- cups-1.2rc1/man/Makefile.wiget 2006-04-05 12:06:41.000000000 +0200 -+++ cups-1.2rc1/man/Makefile 2006-04-05 12:07:50.000000000 +0200 -@@ -140,13 +140,13 @@ install-data: all +--- cups-2.3.1/man/Makefile~ 2019-12-13 15:44:10.000000000 +0100 ++++ cups-2.3.1/man/Makefile 2020-02-08 14:28:19.482255123 +0100 +@@ -128,19 +128,19 @@ install-data: all + $(INSTALL_MAN) $$file $(MANDIR)/man7; \ done - for file in accept cupsreject reject; do \ - $(RM) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \ -- $(LN) cupsaccept.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \ -+ echo ".so cupsaccept.$(MAN8EXT)" > $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \ + $(RM) $(MANDIR)/man7/ippeveps.7 +- $(LN) ippevepcl.7 $(MANDIR)/man7/ippeveps.7 ++ echo ".so ippevepcl.7" > $(MANDIR)/man7/ippeveps.7 + echo Installing man pages in $(MANDIR)/man8... + $(INSTALL_DIR) -m 755 $(MANDIR)/man8 + for file in $(MAN8); do \ + $(INSTALL_MAN) $$file $(MANDIR)/man8; \ done - $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) -- $(LN) cupsenable.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) -+ echo ".so cupsenable.$(MAN8EXT)" > $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) - for file in cups-deviced cups-driverd cups-exec; do \ - $(RM) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \ -- $(LN) cupsd-helper.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \ -+ echo ".so cupsd-helper.$(MAN8EXT)" > $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \ + $(RM) $(MANDIR)/man8/cupsdisable.8 +- $(LN) cupsenable.8 $(MANDIR)/man8/cupsdisable.8 ++ echo ".so cupsenable.8" > $(MANDIR)/man8/cupsdisable.8 + $(RM) $(MANDIR)/man8/cupsreject.8 +- $(LN) cupsaccept.8 $(MANDIR)/man8/cupsreject.8 ++ echo ".so cupsaccept.8" > $(MANDIR)/man8/cupsreject.8 + for file in cups-deviced.8 cups-driverd.8 cups-exec.8; do \ + $(RM) $(MANDIR)/man8/$$file; \ +- $(LN) cupsd-helper.8 $(MANDIR)/man8/$$file; \ ++ echo ".so cupsd-helper.8" > $(MANDIR)/man8/$$file; \ done ---- cups-1.4.0/config-scripts/cups-manpages.m4~ 2009-01-12 20:17:09.000000000 +0100 -+++ cups-1.4.0/config-scripts/cups-manpages.m4 2009-08-29 22:32:49.346665192 +0200 -@@ -69,10 +69,10 @@ - ;; - Linux* | GNU* | Darwin*) - # Linux, GNU Hurd, and macOS -- MAN1EXT=1.gz -- MAN5EXT=5.gz -- MAN7EXT=7.gz -- MAN8EXT=8.gz -+ MAN1EXT=1 -+ MAN5EXT=5 -+ MAN7EXT=7 -+ MAN8EXT=8 - MAN8DIR=8 - ;; - *) + diff --git a/cups-systemd-socket.patch b/cups-systemd-socket.patch index 44228ee..260ac29 100644 --- a/cups-systemd-socket.patch +++ b/cups-systemd-socket.patch @@ -1,7 +1,7 @@ -diff -up cups-2.2.8/scheduler/main.c.systemd-socket cups-2.2.8/scheduler/main.c ---- cups-2.2.8/scheduler/main.c.systemd-socket 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/scheduler/main.c 2018-06-08 17:32:39.417600671 +0200 -@@ -681,8 +681,16 @@ main(int argc, /* I - Number of comm +diff -up cups-2.2.12/scheduler/main.c.systemd-socket cups-2.2.12/scheduler/main.c +--- cups-2.2.12/scheduler/main.c.systemd-socket 2019-08-16 00:35:30.000000000 +0200 ++++ cups-2.2.12/scheduler/main.c 2019-08-19 09:31:09.703370325 +0200 +@@ -674,8 +674,16 @@ main(int argc, /* I - Number of comm #ifdef HAVE_ONDEMAND if (OnDemand) @@ -19,26 +19,26 @@ diff -up cups-2.2.8/scheduler/main.c.systemd-socket cups-2.2.8/scheduler/main.c #endif /* HAVE_ONDEMAND */ if (fg) cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started in foreground."); -diff -up cups-2.2.8/scheduler/org.cups.cupsd.path.in.systemd-socket cups-2.2.8/scheduler/org.cups.cupsd.path.in ---- cups-2.2.8/scheduler/org.cups.cupsd.path.in.systemd-socket 2018-06-05 18:06:54.000000000 +0200 -+++ cups-2.2.8/scheduler/org.cups.cupsd.path.in 2018-06-08 17:32:39.417600671 +0200 -@@ -3,7 +3,7 @@ Description=CUPS Scheduler - PartOf=org.cups.cupsd.service +diff -up cups-2.2.12/scheduler/org.cups.cupsd.path.in.systemd-socket cups-2.2.12/scheduler/org.cups.cupsd.path.in +--- cups-2.2.12/scheduler/org.cups.cupsd.path.in.systemd-socket 2019-08-16 00:35:30.000000000 +0200 ++++ cups-2.2.12/scheduler/org.cups.cupsd.path.in 2019-08-19 09:31:09.703370325 +0200 +@@ -1,6 +1,6 @@ + [Unit] + Description=CUPS Scheduler +-PartOf=org.cups.cupsd.service ++PartOf=cups.service [Path] --PathExists=@CUPS_CACHEDIR@/org.cups.cupsd -+PathExistsGlob=@CUPS_REQUESTS@/d* - - [Install] - WantedBy=multi-user.target -diff -up cups-2.2.8/scheduler/org.cups.cupsd.service.in.systemd-socket cups-2.2.8/scheduler/org.cups.cupsd.service.in ---- cups-2.2.8/scheduler/org.cups.cupsd.service.in.systemd-socket 2018-06-08 17:32:39.417600671 +0200 -+++ cups-2.2.8/scheduler/org.cups.cupsd.service.in 2018-06-08 17:34:09.091888847 +0200 -@@ -1,10 +1,11 @@ + PathExists=@CUPS_CACHEDIR@/org.cups.cupsd +diff -up cups-2.2.12/scheduler/org.cups.cupsd.service.in.systemd-socket cups-2.2.12/scheduler/org.cups.cupsd.service.in +--- cups-2.2.12/scheduler/org.cups.cupsd.service.in.systemd-socket 2019-08-19 09:31:09.703370325 +0200 ++++ cups-2.2.12/scheduler/org.cups.cupsd.service.in 2019-08-19 09:54:58.890036404 +0200 +@@ -1,13 +1,13 @@ [Unit] Description=CUPS Scheduler Documentation=man:cupsd(8) -+After=network.target +-After=sssd.service ++After=sssd.service network.target [Service] ExecStart=@sbindir@/cupsd -l @@ -47,3 +47,28 @@ diff -up cups-2.2.8/scheduler/org.cups.cupsd.service.in.systemd-socket cups-2.2. Restart=on-failure [Install] +-Also=org.cups.cupsd.socket org.cups.cupsd.path ++Also=cups.socket cups.path + WantedBy=printer.target +diff -up cups-2.2.12/scheduler/org.cups.cupsd.socket.in.systemd-socket cups-2.2.12/scheduler/org.cups.cupsd.socket.in +--- cups-2.2.12/scheduler/org.cups.cupsd.socket.in.systemd-socket 2019-08-16 00:35:30.000000000 +0200 ++++ cups-2.2.12/scheduler/org.cups.cupsd.socket.in 2019-08-19 09:31:09.703370325 +0200 +@@ -1,6 +1,6 @@ + [Unit] + Description=CUPS Scheduler +-PartOf=org.cups.cupsd.service ++PartOf=cups.service + + [Socket] + ListenStream=@CUPS_DEFAULT_DOMAINSOCKET@ +diff -up cups-2.2.12/scheduler/org.cups.cups-lpd.socket.systemd-socket cups-2.2.12/scheduler/org.cups.cups-lpd.socket +--- cups-2.2.12/scheduler/org.cups.cups-lpd.socket.systemd-socket 2019-08-16 00:35:30.000000000 +0200 ++++ cups-2.2.12/scheduler/org.cups.cups-lpd.socket 2019-08-19 09:31:09.703370325 +0200 +@@ -1,6 +1,6 @@ + [Unit] + Description=CUPS LPD Server Socket +-PartOf=org.cups.cups-lpd.service ++PartOf=cups-lpd.service + + [Socket] + ListenStream=515 diff --git a/cups-verbose-compilation.patch b/cups-verbose-compilation.patch index fc68a4b..04bf66e 100644 --- a/cups-verbose-compilation.patch +++ b/cups-verbose-compilation.patch @@ -1,12 +1,10 @@ ---- cups-1.3.7/Makedefs.in~ 2008-04-11 07:59:17.000000000 +0200 -+++ cups-1.3.7/Makedefs.in 2008-04-11 07:59:50.000000000 +0200 -@@ -258,7 +258,7 @@ +--- cups-2.3.1/Makedefs.in~ 2019-12-13 15:44:10.000000000 +0100 ++++ cups-2.3.1/Makedefs.in 2020-02-08 14:30:12.856885409 +0100 +@@ -263,7 +263,6 @@ USBQUIRKS = @USBQUIRKS@ # Rules... # -.SILENT: -+#.SILENT: - .SUFFIXES: .1 .1.gz .1m .1m.gz .3 .3.gz .5 .5.gz .7 .7.gz .8 .8.gz .a .c .cxx .h .man .o .gz + .SUFFIXES: .a .c .cxx .h .o .c.o: - diff --git a/cups.spec b/cups.spec index b4962c5..eb40976 100644 --- a/cups.spec +++ b/cups.spec @@ -6,19 +6,18 @@ %bcond_without gssapi # GSSAPI support %bcond_with lspp # audit and SELinux label support (lspp patch) %bcond_with tcp_wrappers # tcp_wrappers/libwrap support -%bcond_without python # Python support in web interface %bcond_without static_libs # static library Summary(pl.UTF-8): Ogólny system druku dla Uniksa Summary(pt_BR.UTF-8): Sistema Unix de Impressão Name: cups -Version: 2.2.11 +Version: 2.3.1 Release: 1 Epoch: 1 License: LGPL v2 (libraries), GPL v2 (the rest) Group: Applications/Printing Source0: https://github.com/apple/cups/releases/download/v%{version}/%{name}-%{version}-source.tar.gz -# Source0-md5: 7afbbcd2497e7d742583c492f6de40cd +# Source0-md5: 8ad8897c97cf4d90f20dac4318f47421 Source1: %{name}.init Source2: %{name}.pamd Source3: %{name}.logrotate @@ -38,7 +37,7 @@ Patch10: %{name}-peercred.patch Patch11: %{name}-usb.patch Patch12: %{name}-desktop.patch Patch13: %{name}-systemd-socket.patch -Patch14: add-ipp-backend-of-cups-1.4.patch + Patch15: reactivate_recommended_driver.patch Patch16: read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch Patch18: %{name}-final-content-type.patch @@ -283,7 +282,7 @@ bibliotecas do CUPS. #%patch11 -p1 %patch12 -p1 %patch13 -p1 -%patch14 -p1 + %patch15 -p1 %patch16 -p1 %patch18 -p1 @@ -341,7 +340,6 @@ bibliotecas do CUPS. %{?with_dnssd:--with-dnssd-libs=x} \ %{?with_dnssd:--with-dnssd-includes=x} \ --with-optim=-Wno-format-y2k \ - %{?with_python:--with-python=%{_bindir}/python} \ --with-systemd=%{systemdunitdir} %{__make} %{?debug:OPTIONS="-DDEBUG"} @@ -452,7 +450,7 @@ fi %files %defattr(644,root,root,755) -%doc *.txt +%doc *.md %attr(640,root,root) %config %verify(not md5 mtime size) /etc/pam.d/cups %attr(754,root,root) /etc/rc.d/init.d/cups /etc/dbus-1/system.d/cups.conf @@ -473,7 +471,7 @@ fi %dir %attr(755,root,lp) %{_sysconfdir}/%{name}/ppd %attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/logrotate.d/%{name} %attr(755,root,root) %{_bindir}/cupstestppd -%attr(755,root,root) %{_bindir}/cupstestdsc +%attr(755,root,root) %{_bindir}/ippeveprinter %attr(755,root,root) %{_sbindir}/cupsctl %attr(755,root,root) %{_sbindir}/cupsd %attr(755,root,root) %{_sbindir}/cupsfilter @@ -487,7 +485,6 @@ fi %attr(755,root,root) %{_ulibdir}/cups/backend/http %attr(755,root,root) %{_ulibdir}/cups/backend/https %attr(755,root,root) %{_ulibdir}/cups/backend/ipp -%attr(755,root,root) %{_ulibdir}/cups/backend/ipp14 %attr(755,root,root) %{_ulibdir}/cups/backend/ipps %attr(755,root,root) %{_ulibdir}/cups/backend/lpd %attr(755,root,root) %{_ulibdir}/cups/backend/snmp @@ -507,6 +504,9 @@ fi %lang(pt_BR) %{_ulibdir}/cups/cgi-bin/pt_BR %lang(ru) %{_ulibdir}/cups/cgi-bin/ru +%dir %{_ulibdir}/cups/command +%attr(755,root,root) %{_ulibdir}/cups/command/ippevepcl +%attr(755,root,root) %{_ulibdir}/cups/command/ippeveps %dir %{_ulibdir}/cups/daemon %attr(755,root,root) %{_ulibdir}/cups/daemon/cups-deviced %attr(755,root,root) %{_ulibdir}/cups/daemon/cups-driverd @@ -516,7 +516,6 @@ fi %attr(755,root,root) %{_ulibdir}/cups/filter/commandtops %attr(755,root,root) %{_ulibdir}/cups/filter/gziptoany %attr(755,root,root) %{_ulibdir}/cups/filter/pstops -%attr(755,root,root) %{_ulibdir}/cups/filter/rastertodymo %attr(755,root,root) %{_ulibdir}/cups/filter/rastertoepson %attr(755,root,root) %{_ulibdir}/cups/filter/rastertohp %attr(755,root,root) %{_ulibdir}/cups/filter/rastertolabel @@ -555,7 +554,7 @@ fi %lang(ru) %{_datadir}/cups/templates/ru %{_mandir}/man1/cups.1* %{_mandir}/man1/cupstestppd.1* -%{_mandir}/man1/cupstestdsc.1* +%{_mandir}/man1/ippeveprinter.1* %{_mandir}/man5/classes.conf.5* %{_mandir}/man5/cups-files.conf.5* %{_mandir}/man5/cups-snmp.conf.5* @@ -569,6 +568,8 @@ fi %{_mandir}/man5/subscriptions.conf.5* %{_mandir}/man7/backend.7* %{_mandir}/man7/filter.7* +%{_mandir}/man7/ippevepcl.7* +%{_mandir}/man7/ippeveps.7* %{_mandir}/man7/notifier.7* %{_mandir}/man8/cups-deviced.8* %{_mandir}/man8/cups-driverd.8* @@ -638,9 +639,7 @@ fi %attr(755,root,root) %{_bindir}/lpr %attr(755,root,root) %{_bindir}/lprm %attr(755,root,root) %{_bindir}/lpstat -%attr(755,root,root) %{_sbindir}/accept %attr(755,root,root) %{_sbindir}/cupsaccept -%attr(755,root,root) %{_sbindir}/cupsaddsmb %attr(755,root,root) %{_sbindir}/cupsenable %attr(755,root,root) %{_sbindir}/cupsdisable %attr(755,root,root) %{_sbindir}/cupsreject @@ -650,7 +649,6 @@ fi %attr(755,root,root) %{_sbindir}/lpc %attr(755,root,root) %{_sbindir}/lpinfo %attr(755,root,root) %{_sbindir}/lpmove -%attr(755,root,root) %{_sbindir}/reject %{_datadir}/cups/ipptool %{_desktopdir}/cups.desktop %{_iconsdir}/hicolor/*/apps/cups.png @@ -664,9 +662,7 @@ fi %{_mandir}/man1/lprm.1* %{_mandir}/man1/lpstat.1* %{_mandir}/man5/client.conf.5* -%{_mandir}/man8/accept.8* %{_mandir}/man8/cupsaccept.8* -%{_mandir}/man8/cupsaddsmb.8* %{_mandir}/man8/cupsenable.8* %{_mandir}/man8/cupsdisable.8* %{_mandir}/man8/cupsreject.8* @@ -674,7 +670,6 @@ fi %{_mandir}/man8/lpc.8* %{_mandir}/man8/lpinfo.8* %{_mandir}/man8/lpmove.8* -%{_mandir}/man8/reject.8* %files lib %defattr(644,root,root,755) @@ -684,6 +679,7 @@ fi %lang(ca) %{_localedir}/ca/cups_ca.po %lang(cs) %{_localedir}/cs/cups_cs.po %lang(de) %{_localedir}/de/cups_de.po +%{_localedir}/en/cups_en.po %lang(es) %{_localedir}/es/cups_es.po %lang(fr) %{_localedir}/fr/cups_fr.po %lang(it) %{_localedir}/it/cups_it.po -- 2.44.0