version update

This commit is contained in:
weiwei_150212 2020-07-27 18:06:26 +08:00
parent b87aae1663
commit 5838f01f51
26 changed files with 1427 additions and 432 deletions

Binary file not shown.

BIN
cups-2.3.3-source.tar.gz Normal file

Binary file not shown.

View File

@ -0,0 +1,10 @@
diff --git a/scheduler/org.cups.cupsd.service.in b/scheduler/org.cups.cupsd.service.in
index bf308a5..add238b 100644
--- a/scheduler/org.cups.cupsd.service.in
+++ b/scheduler/org.cups.cupsd.service.in
@@ -10,4 +10,4 @@ Restart=on-failure
[Install]
Also=cups.socket cups.path
-WantedBy=printer.target
+WantedBy=printer.target multi-user.target

View File

@ -0,0 +1,21 @@
diff -up cups-1.7b1/scheduler/ipp.c.driverd-timeout cups-1.7b1/scheduler/ipp.c
--- cups-1.7b1/scheduler/ipp.c.driverd-timeout 2013-04-19 12:24:43.003841810 +0200
+++ cups-1.7b1/scheduler/ipp.c 2013-04-19 12:24:43.204839107 +0200
@@ -4556,7 +4556,7 @@ copy_model(cupsd_client_t *con, /* I -
close(temppipe[1]);
/*
- * Wait up to 30 seconds for the PPD file to be copied...
+ * Wait up to 70 seconds for the PPD file to be copied...
*/
total = 0;
@@ -4576,7 +4576,7 @@ copy_model(cupsd_client_t *con, /* I -
FD_SET(temppipe[0], &input);
FD_SET(CGIPipes[0], &input);
- timeout.tv_sec = 30;
+ timeout.tv_sec = 70;
timeout.tv_usec = 0;
if ((i = select(maxfd, &input, NULL, NULL, &timeout)) < 0)

View File

@ -1,11 +1,11 @@
diff -up cups-1.6.2/ppdc/sample.drv.dymo-deviceid cups-1.6.2/ppdc/sample.drv diff -up cups-2.3.1/ppdc/sample.drv.dymo-deviceid cups-2.3.1/ppdc/sample.drv
--- cups-1.6.2/ppdc/sample.drv.dymo-deviceid 2013-06-18 16:57:02.110662953 +0100 --- cups-2.3.1/ppdc/sample.drv.dymo-deviceid 2019-12-16 09:22:34.476492212 +0100
+++ cups-1.6.2/ppdc/sample.drv 2013-06-18 16:58:56.513989117 +0100 +++ cups-2.3.1/ppdc/sample.drv 2019-12-16 09:23:44.665003895 +0100
@@ -125,6 +125,7 @@ Version "1.5" @@ -129,6 +129,7 @@ Version "2.3"
{ {
Manufacturer "Dymo" Manufacturer "DYMO"
ModelName "Label Printer" ModelName "Label Printer"
+ Attribute "1284DeviceID" "" "MFG:DYMO;MDL:LabelWriter 400;" + Attribute "1284DeviceID" "" "MFG:DYMO;MDL:LabelWriter 400;"
Attribute NickName "" "Dymo Label Printer" Attribute NickName "" "DYMO Label Printer"
PCFileName "dymo.ppd" PCFileName "dymo.ppd"
DriverType label DriverType label

View File

@ -1,21 +1,7 @@
diff --git a/backend/Makefile b/backend/Makefile diff -up cups-2.3.0/backend/ipp.c.eggcups cups-2.3.0/backend/ipp.c
index 48a1c66..342604f 100644 --- cups-2.3.0/backend/ipp.c.eggcups 2019-08-23 17:19:38.000000000 +0200
--- a/backend/Makefile +++ cups-2.3.0/backend/ipp.c 2019-10-07 12:14:25.385111933 +0200
+++ b/backend/Makefile @@ -143,6 +143,70 @@ static char tmpfilename[1024] = "";
@@ -263,7 +263,7 @@ dnssd: dnssd.o ../cups/$(LIBCUPS) libbackend.a
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)
$(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@
$(RM) http
$(LN) ipp http
diff --git a/backend/ipp.c b/backend/ipp.c
index 482d6f7..f37caee 100644
--- a/backend/ipp.c
+++ b/backend/ipp.c
@@ -152,6 +152,70 @@ static char tmpfilename[1024] = "";
static char mandatory_attrs[1024] = ""; static char mandatory_attrs[1024] = "";
/* cupsMandatory value */ /* cupsMandatory value */
@ -86,7 +72,7 @@ index 482d6f7..f37caee 100644
/* /*
* Local functions... * Local functions...
@@ -1755,6 +1819,15 @@ main(int argc, /* I - Number of command-line args */ @@ -1768,6 +1832,15 @@ main(int argc, /* I - Number of comm
fprintf(stderr, "DEBUG: Print job accepted - job ID %d.\n", job_id); fprintf(stderr, "DEBUG: Print job accepted - job ID %d.\n", job_id);
} }
@ -102,11 +88,22 @@ index 482d6f7..f37caee 100644
ippDelete(response); ippDelete(response);
if (job_canceled) if (job_canceled)
diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c diff -up cups-2.3.0/backend/Makefile.eggcups cups-2.3.0/backend/Makefile
index d2c6361..d42f855 100644 --- cups-2.3.0/backend/Makefile.eggcups 2019-10-07 12:14:25.385111933 +0200
--- a/scheduler/subscriptions.c +++ cups-2.3.0/backend/Makefile 2019-10-07 12:16:00.457569406 +0200
+++ b/scheduler/subscriptions.c @@ -257,7 +257,7 @@ dnssd: dnssd.o ../cups/$(LIBCUPS) libbac
@@ -1294,13 +1294,13 @@ cupsd_send_dbus(cupsd_eventmask_t event,/* I - Event to send */
ipp: ipp.o ../cups/$(LIBCUPS) libbackend.a
echo Linking $@...
- $(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 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"; what = "PrinterAdded";
else if (event & CUPSD_EVENT_PRINTER_DELETED) else if (event & CUPSD_EVENT_PRINTER_DELETED)
what = "PrinterRemoved"; what = "PrinterRemoved";
@ -122,7 +119,7 @@ index d2c6361..d42f855 100644
else else
return; return;
@@ -1336,7 +1336,7 @@ cupsd_send_dbus(cupsd_eventmask_t event,/* I - Event to send */ @@ -1299,7 +1299,7 @@ cupsd_send_dbus(cupsd_eventmask_t event,
dbus_message_append_iter_init(message, &iter); dbus_message_append_iter_init(message, &iter);
if (dest) if (dest)
dbus_message_iter_append_string(&iter, dest->name); dbus_message_iter_append_string(&iter, dest->name);
@ -131,6 +128,3 @@ index d2c6361..d42f855 100644
{ {
dbus_message_iter_append_uint32(&iter, job->id); dbus_message_iter_append_uint32(&iter, job->id);
dbus_message_iter_append_string(&iter, job->username); dbus_message_iter_append_string(&iter, job->username);
--
2.23.0

25
cups-etimedout.patch Normal file
View File

@ -0,0 +1,25 @@
diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c
index e4ffc3d..a989055 100644
--- a/cups/http-addrlist.c
+++ b/cups/http-addrlist.c
@@ -240,7 +240,10 @@ httpAddrConnect2(
}
if (!addrlist && nfds == 0)
+ {
+ errno = EHOSTDOWN;
break;
+ }
/*
* See if we can connect to any of the addresses so far...
@@ -371,6 +374,9 @@ httpAddrConnect2(
remaining -= 250;
}
+ if (remaining <= 0)
+ errno = ETIMEDOUT;
+
while (nfds > 0)
{
nfds --;

876
cups-failover-backend.patch Normal file
View File

@ -0,0 +1,876 @@
diff -up cups-2.3.3/backend/failover.c.failover cups-2.3.3/backend/failover.c
--- cups-2.3.3/backend/failover.c.failover 2020-06-11 08:49:20.515264358 +0200
+++ cups-2.3.3/backend/failover.c 2020-06-11 08:49:20.515264358 +0200
@@ -0,0 +1,837 @@
+/*
+ * Failover Backend for the Common UNIX Printing System (CUPS).
+ *
+ * Copyright (c) 2014, Red Hat, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Red Hat, Inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT,
+ * INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Original version by Clark Hale, Red Hat, Inc.
+ *
+ * This backend presents a fake printer that will choose the first
+ * available printer from a list of IPP URIs.
+ *
+ * Option failover contains a comma separated list of IPP URIs. The
+ * URIs are attempted in-order.
+ *
+ * Option failover-retries contains an integer that indicates how many
+ * times to iterate through the failover list before completely
+ * failing.
+ *
+ * Contents:
+ * main() - Checks each printer in a failover list, and
+ * sends job data to the first available printer
+ * move_job() - Sends and IPP Move-Job request
+ * check_printer() - Checks a printer's attributes to see
+ * if it's enabled and accepting jobs
+ * read_config() - Read the backends configuration from
+ * options
+ * get_printer_attributes() - Sends an IPP Get-Attributes request to
+ * a URI
+ * sigterm_handler() - Handle SIGTERM that cancels the job
+ * password_cb() - Password call back used to disable password
+ * prompt
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <cups/http-private.h>
+#include <cups/http.h>
+#include "backend-private.h"
+
+/*
+ * Return Values
+ */
+typedef enum fo_state_e
+{
+ FO_PRINTER_GOOD = 0,
+ FO_PRINTER_BAD,
+ FO_PRINTER_BUSY,
+ FO_AUTH_REQUIRED
+} fo_state_t;
+
+/*
+ * Constants
+ */
+#define FAILOVER_DEFAULT_RETRIES (3)
+#define FAILOVER_PASSWORD_RETRIES_MAX (3)
+
+/*
+ * Local Functions
+ */
+static int check_printer(const char *device_uri);
+static int read_config(cups_array_t *printer_array, int *retries,
+ const char *options);
+static int get_printer_attributes(const char *device_uri,
+ ipp_t **attributes);
+static int move_job(int jobid, const char *dest);
+static void sigterm_handler(int sig);
+static const char *password_cb(const char *);
+
+/*
+ * Global Variables
+ */
+static int job_canceled = 0; /* Job canceled */
+static char *password = NULL; /* password for device */
+static int password_retries = 0;
+static const char *auth_info_required = "none";
+
+/*
+ * 'main()' - Checks each printer in a failover list, and
+ * sends job data to the first available printer
+ * Usage:
+ * printer-uri job-id user title copies options [file]
+ *
+ * The printer-uri option is not used, but it still required to fit
+ * to the backend(7) standards.
+ */
+int
+main(int argc, char *argv[])
+{
+ const char *selected_uri = NULL; /* URI of selected printer */
+ const char *tmp_device_uri; /* Device URI to check */
+ cups_array_t *printer_array; /* Array of available printers */
+ int printer_count = 0; /* current printer array index */
+ int retry_max = 1; /* maximum retries before exit */
+ int retry_count = 0; /* current retry number */
+ int auth_failed_count = 0; /* auth failures per loop */
+ int rc = CUPS_BACKEND_OK;
+#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+ struct sigaction action; /* Actions for POSIX signals */
+#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+
+ /*
+ * Check args
+ */
+ if (argc == 1)
+ {
+ /*
+ * print out discovery data
+ */
+ char *backendName;
+
+ if ((backendName = strrchr(argv[0], '/')) != NULL)
+ backendName++;
+ else
+ backendName = argv[0];
+
+ _cupsLangPrintf(stderr,"network %s \"Unknown\" \"%s (%s)\"\n",
+ backendName,
+ _cupsLangString(cupsLangDefault(), _("Failover Printer")),
+ backendName);
+
+ return (CUPS_BACKEND_OK);
+ }
+ else if (argc < 6)
+ {
+ _cupsLangPrintf(stderr,
+ _("Usage: %s job-id user title copies options [file]"),
+ argv[0]);
+ return (CUPS_BACKEND_STOP);
+ }
+
+ fprintf(stderr, "DEBUG: Failover backend starting up.\n");
+
+ /*
+ * Don't buffer status messages
+ */
+ 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 */
+
+ printer_array = cupsArrayNew(NULL, NULL);
+
+ /*
+ * Read Configuration
+ */
+ if ((rc = read_config(printer_array, &retry_max,
+ argv[5])) != CUPS_BACKEND_OK)
+ {
+ fprintf(stderr, "ERROR: Failed to read configuration options!\n");
+ goto cleanup;
+ }
+
+ /*
+ * Main Retry Loop
+ */
+ for (retry_count = 0; retry_count < retry_max; retry_count++)
+ {
+ fprintf(stderr, "DEBUG: Retry loop #%d\n", retry_count + 1);
+
+ /*
+ * Reset Counters
+ */
+ printer_count = 0;
+ auth_failed_count = 0;
+
+ tmp_device_uri = (char *)cupsArrayFirst(printer_array);
+
+ do
+ {
+ if (job_canceled)
+ {
+ fprintf(stderr, "DEBUG: Job Canceled\n");
+ goto cleanup;
+ }
+
+ fprintf(stderr,"DEBUG: Checking printer #%d: %s\n",
+ printer_count+1, tmp_device_uri);
+
+ rc = check_printer(tmp_device_uri);
+
+ // Printer is available and not busy.
+ if ( rc == FO_PRINTER_GOOD )
+ {
+ selected_uri = tmp_device_uri;
+ break;
+ }
+ // Printer is busy
+ else if (rc == FO_PRINTER_BUSY)
+ {
+ fprintf(stderr, "DEBUG: Waiting for job to complete.\n");
+ sleep(2);
+ continue;
+ }
+ // Authorization is required to access the printer.
+ else if (rc == FO_AUTH_REQUIRED)
+ {
+ auth_failed_count++;
+ fprintf(stderr, "DEBUG: auth_failed_count = %d\n", auth_failed_count);
+ }
+ // Printer is stopped or not accepting jobs
+ else
+ {
+ if (!printer_count)
+ fprintf(stderr, "INFO: Primary Printer, %s, not available. "
+ "Attempting Failovers...\n",
+ tmp_device_uri);
+ else
+ fprintf(stderr, "INFO: Failover Printer, %s, not available. "
+ "Attempting Failovers..\n",
+ tmp_device_uri);
+ printer_count++;
+ tmp_device_uri = (char *)cupsArrayNext(printer_array);
+ }
+ } while (tmp_device_uri != NULL);
+
+ if (selected_uri && !printer_count)
+ fprintf(stderr, "STATE: -primary-printer-failed\n");
+ else
+ fprintf(stderr, "STATE: +primary-printer-failed\n");
+
+ if (job_canceled)
+ {
+ fprintf(stderr, "DEBUG: Job Canceled\n");
+ goto cleanup;
+ }
+
+ if (!selected_uri && auth_failed_count == printer_count)
+ {
+ fprintf(stderr, "ERROR: All failover printers failed with "
+ "authorization issues.\n");
+ rc = CUPS_BACKEND_AUTH_REQUIRED;
+ fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required);
+ goto cleanup;
+ }
+ else if (!selected_uri && retry_count + 1 < retry_max)
+ {
+ fprintf(stderr, "INFO: No suitable printer found...retrying...\n");
+ sleep(2);
+ continue;
+ }
+ else if (selected_uri)
+ {
+ fprintf(stderr, "DEBUG: Using printer, %s.\n", selected_uri);
+ break;
+ }
+ }
+
+ if (!selected_uri)
+ {
+ fprintf(stderr, "ERROR: No suitable printer found. Aborting print\n");
+ rc = CUPS_BACKEND_FAILED;
+ goto cleanup;
+ }
+
+ rc = move_job(atoi(argv[1]), selected_uri);
+
+ if (job_canceled)
+ rc = CUPS_BACKEND_OK;
+
+cleanup :
+ if (job_canceled)
+ rc = CUPS_BACKEND_OK;
+
+ tmp_device_uri = (char *)cupsArrayFirst(printer_array);
+ do
+ {
+ free((void *)tmp_device_uri);
+ } while ((tmp_device_uri = (char *)cupsArrayNext(printer_array)) != NULL);
+
+ cupsArrayDelete(printer_array);
+ sleep(2);
+ return (rc);
+}
+
+/*
+ * 'check_printer()' - Checks the status of a remote printer and returns
+ * back a good/bad/busy status.
+ */
+int
+check_printer(const char *device_uri)
+{
+ ipp_t *attributes = NULL; /* attributes for device_uri */
+ ipp_attribute_t *tmp_attribute; /* for examining attribs */
+ int rc = FO_PRINTER_GOOD; /* return code */
+ char *reason; /* printer state reason */
+ int i;
+
+ fprintf(stderr, "DEBUG: Checking printer %s\n",device_uri);
+
+ rc = get_printer_attributes(device_uri, &attributes);
+ if ( rc != CUPS_BACKEND_OK )
+ {
+ fprintf(stderr, "DEBUG: Failed to get attributes from printer: %s\n",
+ device_uri);
+ if ( rc == CUPS_BACKEND_AUTH_REQUIRED )
+ return (FO_AUTH_REQUIRED);
+ else
+ return (FO_PRINTER_BAD);
+ }
+
+ /*
+ * Check if printer is accepting jobs
+ */
+ if ((tmp_attribute = ippFindAttribute(attributes,
+ "printer-is-accepting-jobs",
+ IPP_TAG_BOOLEAN)) != NULL &&
+ !tmp_attribute->values[0].boolean)
+ {
+ fprintf(stderr,
+ "DEBUG: Printer, %s, is not accepting jobs.\n",
+ device_uri);
+
+ rc = FO_PRINTER_BAD;
+ }
+
+ /*
+ * Check if printer is stopped or busy processing
+ */
+ if ((tmp_attribute = ippFindAttribute(attributes,
+ "printer-state",
+ IPP_TAG_ENUM)) != NULL)
+ {
+ // Printer Stopped
+ if ( tmp_attribute->values[0].integer == IPP_PRINTER_STOPPED )
+ {
+ fprintf(stderr, "DEBUG: Printer, %s, stopped.\n", device_uri);
+ rc = FO_PRINTER_BAD;
+ }
+ // Printer Busy
+ else if ( tmp_attribute->values[0].integer == IPP_PRINTER_PROCESSING )
+ {
+ fprintf(stderr, "DEBUG: Printer %s is busy.\n", device_uri);
+ rc = FO_PRINTER_BUSY;
+ }
+ }
+
+ /*
+ * Parse through the printer-state-reasons
+ */
+ if ((tmp_attribute = ippFindAttribute(attributes, "printer-state-reasons",
+ IPP_TAG_KEYWORD)) != NULL)
+ {
+ for (i = 0; i < tmp_attribute->num_values; i++)
+ {
+ reason = tmp_attribute->values[i].string.text;
+ int len = strlen(reason);
+
+ if (len > 8 && !strcmp(reason + len - 8, "-warning"))
+ {
+ fprintf(stderr, "DEBUG: Printer Supply Warning, %s\n", reason);
+ rc = FO_PRINTER_BAD;
+ }
+ else if (len > 6 && !strcmp(reason + len - 6, "-error"))
+ {
+ fprintf(stderr, "DEBUG: Printer Supply Error, %s\n", reason);
+ rc = FO_PRINTER_BAD;
+ }
+ }
+ }
+
+ return (rc);
+}
+
+/*
+ * 'read_config()' - Parses the failover and failover-retries options
+ *
+ */
+static int
+read_config(cups_array_t *printer_array, int *retries, const char *options)
+{
+
+ const char *tmp; /* temporary ptr */
+ char *tok_tmp; /* temporary ptr for option parsing */
+ int jobopts_count = 0; /* number of options */
+ cups_option_t *jobopts = NULL; /* job options */
+
+
+ fprintf(stderr, "DEBUG: Reading Configuration.\n");
+ jobopts_count = cupsParseOptions(options, 0, &jobopts);
+
+ if (!jobopts_count)
+ {
+ fprintf(stderr,
+ "ERROR: No job options! Cannot find failover options!\n");
+ return (CUPS_BACKEND_STOP);
+ }
+
+ /*
+ * Get attributes from the primary printer
+ */
+ fprintf(stderr, "DEBUG: Searching for failover option.\n");
+
+ if ((tmp = cupsGetOption("failover", jobopts_count, jobopts)) != NULL)
+ {
+ fprintf(stderr, "DEBUG: Failover option contents: %s.\n", tmp);
+
+ tok_tmp = strdup(tmp);
+
+ tmp = strtok(tok_tmp, ",");
+ do
+ {
+ cupsArrayAdd(printer_array, strdup(tmp));
+ } while ((tmp = strtok(NULL,",")) != NULL);
+
+ free(tok_tmp);
+ }
+ else
+ {
+ /*
+ * The queue is misconfigured, so return back CUPS_BACKEND_STOP
+ */
+ fprintf(stderr, "ERROR: failover option not specified!\n");
+ return (CUPS_BACKEND_STOP);
+ }
+
+ /*
+ * Get the failover-retries value, if it exists.
+ */
+ fprintf(stderr, "DEBUG: Searching for failover-retries option.\n");
+
+ if ((tmp = cupsGetOption("failover-retries",
+ jobopts_count, jobopts)) != NULL)
+ {
+ fprintf(stderr, "DEBUG: failover-retries option contents: %s.\n", tmp);
+ *retries = atoi(tmp);
+ }
+ else
+ {
+ *retries = FAILOVER_DEFAULT_RETRIES;
+ fprintf(stderr, "DEBUG: Failed to get failover-retries option\n");
+ fprintf(stderr, "DEBUG: Defaulted to %d retries\n", *retries);
+ }
+
+ return (CUPS_BACKEND_OK);
+}
+
+/*
+ * 'get_printer_attributes()' - Sends an IPP Get-Attributes request to
+ * a URI
+ */
+int
+get_printer_attributes(const char *device_uri, ipp_t **attributes)
+{
+ char uri[HTTP_MAX_URI]; /* Updated URI without login */
+ int version; /* IPP version */
+ char scheme[256]; /* Scheme in URI */
+ ipp_status_t ipp_status; /* Status of IPP request */
+ char hostname[1024]; /* Hostname */
+ char resource[1024]; /* Resource infoo */
+ char addrname[256]; /* Address name */
+ int port; /* IPP Port number */
+ char portname[255]; /* Port as string */
+ http_t *http; /* HTTP connection */
+ ipp_t *request; /* IPP request */
+ int rc = CUPS_BACKEND_OK; /* Return Code */
+ char username[256]; /* Username for device URI */
+ char *option_ptr; /* for parsing resource opts */
+ const char * const pattrs[] = /* Printer attributes wanted */
+ {
+ "printer-is-accepting-jobs",
+ "printer-state",
+ "printer-state-reasons"
+ };
+
+ if (job_canceled)
+ return (CUPS_BACKEND_OK);
+
+ fprintf(stderr, "DEBUG: Getting Printer Attributes.\n");
+ fprintf(stderr, "DEBUG: Device URL %s.\n", device_uri);
+
+ /*
+ * Parse device_uri
+ */
+ if (httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme),
+ username, sizeof(username), hostname, sizeof(hostname),
+ &port, resource, sizeof(resource)) != HTTP_URI_OK)
+ {
+ fprintf(stderr, "ERROR: Problem parsing device_uri, %s\n", device_uri);
+ return (CUPS_BACKEND_STOP);
+ }
+
+ if (!port)
+ port = IPP_PORT;
+
+ sprintf(portname, "%d", port);
+
+ fprintf(stderr, "DEBUG: Getting Printer Attributes.\n");
+
+ /*
+ * Configure password
+ */
+ cupsSetPasswordCB(password_cb);
+
+ /*
+ * reset, in case a previous attempt for
+ * another printer left residue
+ */
+ cupsSetUser(NULL);
+ password = NULL;
+ password_retries = 0;
+
+ if (*username)
+ {
+ if ((password = strchr(username, ':')) != NULL)
+ {
+ *password = '\0';
+ password++;
+ }
+
+ cupsSetUser(username);
+ }
+ else if (!getuid())
+ {
+ const char *username_env;
+
+ if ((username_env = getenv("AUTH_USERNAME")) != NULL)
+ {
+ cupsSetUser(username_env);
+ password = getenv("AUTH_PASSWORD");
+ }
+ }
+
+ /*
+ * Try connecting to the remote server...
+ */
+ fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port);
+ _cupsLangPuts(stderr, _("INFO: Connecting to printer...\n"));
+
+ http = httpConnectEncrypt(hostname, port, cupsEncryption());
+
+ /*
+ * Deal the socket not being open.
+ */
+ if (!http)
+ {
+ int error = errno; /* Connection error */
+
+ switch (error)
+ {
+ case EHOSTDOWN :
+ _cupsLangPuts(stderr, _("WARNING: "
+ "The printer may not exist or "
+ "is unavailable at this time.\n"));
+ break;
+ case EHOSTUNREACH :
+ _cupsLangPuts(stderr, _("WARNING: "
+ "The printer is unreachable at this "
+ "time.\n"));
+ break;
+ case ECONNREFUSED :
+ _cupsLangPuts(stderr, _("WARNING: "
+ "Connection Refused.\n"));
+ break;
+ default :
+ fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
+ break;
+ }
+
+ rc = CUPS_BACKEND_FAILED;
+ sleep(5);
+ goto prt_available_cleanup;
+ }
+
+
+#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));
+
+ /*
+ * Search the resource string for options.
+ * We only care about version, for the moment.
+ */
+ version = 11;
+
+ if ((option_ptr = strchr(resource, '?')) != NULL)
+ {
+ *option_ptr++ = '\0';
+
+ if ((option_ptr = strstr(option_ptr, "version="))!=NULL)
+ {
+ int minor; /* minor version from URI */
+ int major; /* major version from URI */
+ char *version_str; /* ipp version */
+
+ option_ptr += 8;
+ version_str = option_ptr;
+
+ while (*option_ptr && *option_ptr != '&' && *option_ptr != '+')
+ option_ptr++;
+
+ if (*option_ptr)
+ *option_ptr = '\0';
+
+ sscanf(version_str, "%d.%d", &major, &minor);
+
+ version = (major * 10) + minor;
+
+ switch(version)
+ {
+ case 10 :
+ case 11 :
+ case 20 :
+ case 21 :
+ fprintf(stderr,
+ "DEBUG: Set version to %d from URI\n",
+ version);
+ break;
+ default :
+ _cupsLangPrintf(stderr,
+ _("DEBUG: Invalid version, %d, from URI. "
+ "Using default of 1.1 \n"),
+ version);
+ version = 11;
+ }
+ }
+ }
+
+
+ /*
+ * Build a URI for the printer. We can't use the URI in argv[0]
+ * because it might contain username:password information...
+ */
+ if (httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL,
+ hostname, port, resource) != HTTP_URI_OK)
+ {
+ fprintf(stderr, "ERROR: Problem assembling printer URI from host %s, "
+ "port %d, resource %s\n", hostname, port, resource);
+ return (CUPS_BACKEND_STOP);
+ }
+
+ /*
+ * 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);
+
+ fprintf(stderr, "DEBUG: IPP Request Structure Built.\n");
+
+ *attributes = cupsDoRequest(http, request, resource);
+ ipp_status = cupsLastError();
+
+ fprintf(stderr, "DEBUG: Get-Printer-Attributes: %s (%s)\n",
+ ippErrorString(ipp_status), cupsLastErrorString());
+
+ if (ipp_status > IPP_OK_CONFLICT)
+ {
+ fprintf(stderr, "DEBUG: Get-Printer-Attributes returned %s.\n",
+ ippErrorString(ipp_status));
+ switch(ipp_status)
+ {
+ case IPP_FORBIDDEN :
+ case IPP_NOT_AUTHORIZED :
+ _cupsLangPuts(stderr, _("ERROR: Not Authorized.\n"));
+ rc = CUPS_BACKEND_AUTH_REQUIRED;
+ break;
+ case IPP_PRINTER_BUSY :
+ case IPP_SERVICE_UNAVAILABLE :
+ _cupsLangPuts(stderr, _("ERROR: "
+ "The printer is not responding.\n"));
+ rc = CUPS_BACKEND_FAILED;
+ break;
+ case IPP_BAD_REQUEST :
+ case IPP_VERSION_NOT_SUPPORTED :
+ fprintf(stderr, "ERROR: Destination does not support IPP version %d\n",
+ version);
+ case IPP_NOT_FOUND :
+ _cupsLangPuts(stderr, _("ERROR: "
+ "The printer configuration is incorrect or the "
+ "printer no longer exists.\n"));
+ rc = CUPS_BACKEND_STOP;
+ break;
+ default :
+ rc = CUPS_BACKEND_FAILED;
+ }
+ goto prt_available_cleanup;
+ }
+
+prt_available_cleanup :
+ httpClose(http);
+ return (rc);
+}
+
+static int
+move_job(int jobid, /* Job ID */
+ const char *dest) /* Destination ipp address */
+{
+ ipp_t *request; /* IPP Request */
+ char job_uri[HTTP_MAX_URI]; /* job-uri */
+
+ http_t* http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
+
+ if (!http)
+ {
+ _cupsLangPrintf(stderr,
+ _("failover: Unable to connect to server: %s\n"),
+ strerror(errno));
+ return (CUPS_BACKEND_FAILED);
+ }
+
+ /*
+ * Build a CUPS_MOVE_JOB request, which requires the following
+ * attributes:
+ *
+ * job-uri/printer-uri
+ * job-printer-uri
+ * requesting-user-name
+ */
+
+ request = ippNewRequest(CUPS_MOVE_JOB);
+
+ snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", jobid);
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
+ job_uri);
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+ "requesting-user-name",
+ NULL, cupsUser());
+
+ ippAddString(request, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri",
+ NULL, dest);
+
+ /*
+ * Do the request and get back a response...
+ */
+
+ ippDelete(cupsDoRequest(http, request, "/jobs"));
+
+ httpClose(http);
+
+ if (cupsLastError() > IPP_OK_CONFLICT)
+ {
+ _cupsLangPrintf(stderr, "failover: %s\n", cupsLastErrorString());
+ return (CUPS_BACKEND_FAILED);
+ }
+ else
+ return (CUPS_BACKEND_OK);
+}
+
+/*
+ * 'sigterm_handler()' - handles a sigterm, i.e. job canceled
+ */
+static void
+sigterm_handler(int sig)
+{
+ if (!job_canceled)
+ {
+ write(2, "DEBUG: Got SIGTERM.\n", 20);
+ job_canceled = 1;
+ }
+ else
+ {
+ /*
+ * Job has already been canceled, so just exit
+ */
+ exit(1);
+ }
+}
+
+/*
+ * 'password_cb()' - Disable the password prompt for cupsDoFileRequest().
+ */
+static const char * /* O - Password */
+password_cb(const char *prompt) /* I - Prompt (not used) */
+{
+ auth_info_required = "username,password";
+ password_retries++;
+
+ if(password_retries < FAILOVER_PASSWORD_RETRIES_MAX)
+ return (password);
+ else
+ return (NULL);
+}
diff -up cups-2.3.3/backend/Makefile.failover cups-2.3.3/backend/Makefile
--- cups-2.3.3/backend/Makefile.failover 2020-04-27 20:04:29.000000000 +0200
+++ cups-2.3.3/backend/Makefile 2020-06-11 08:52:31.212642019 +0200
@@ -22,6 +22,7 @@ include ../Makedefs
RBACKENDS = \
ipp \
lpd \
+ failover \
$(DNSSD_BACKEND)
UBACKENDS = \
snmp \
@@ -45,6 +46,7 @@ LIBOBJS = \
OBJS = \
ipp.o \
lpd.o \
+ failover.o \
dnssd.o \
snmp.o \
socket.o \
@@ -276,6 +278,15 @@ lpd: lpd.o ../cups/$(LIBCUPS) libbackend
#
+# failover
+#
+
+failover: failover.o ../cups/$(LIBCUPS) libbackend.a
+ echo Linking $@...
+ $(LD_CC) $(ALL_LDFLAGS) -o failover failover.o libbackend.a $(LINKCUPS)
+
+
+#
# snmp
#

View File

@ -0,0 +1,43 @@
diff --git a/cups/ipp-vars.c b/cups/ipp-vars.c
index 395b0eb..60aa991 100644
--- a/cups/ipp-vars.c
+++ b/cups/ipp-vars.c
@@ -13,6 +13,7 @@
*/
#include <cups/cups.h>
+#include <cups/cups-private.h>
#include "ipp-private.h"
#include "string-private.h"
#include "debug-internal.h"
@@ -221,9 +222,29 @@ _ippVarsSet(_ipp_vars_t *v, /* I - IPP variables */
if (!strcmp(name, "uri"))
{
char uri[1024]; /* New printer URI */
+ char resolved[1024]; /* Resolved mDNS URI */
+ char value_uri[1024]; /* URI from value */
http_uri_status_t uri_status; /* URI status */
- if ((uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource))) < HTTP_URI_STATUS_OK)
+ snprintf(value_uri, sizeof(value_uri), "%s", value);
+ value_uri[1023] = '\0';
+
+ if (strstr(value_uri, "._tcp"))
+ {
+ /*
+ * Resolve URI...
+ */
+
+ if (!_httpResolveURI(value_uri, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
+ {
+ return (0);
+ }
+
+ snprintf(value_uri, sizeof(value_uri), "%s", resolved);
+ value_uri[1023] = '\0';
+ }
+
+ if ((uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, value_uri, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource))) < HTTP_URI_STATUS_OK)
return (0);
if (v->username[0])

63
cups-logrotate.patch Normal file
View File

@ -0,0 +1,63 @@
diff -up cups-2.1b1/scheduler/log.c.logrotate cups-2.1b1/scheduler/log.c
--- cups-2.1b1/scheduler/log.c.logrotate 2015-06-04 20:00:31.000000000 +0200
+++ cups-2.1b1/scheduler/log.c 2015-06-29 13:25:09.623350218 +0200
@@ -26,6 +26,9 @@
# include <systemd/sd-journal.h>
#endif /* HAVE_ASL_H */
#include <syslog.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
/*
@@ -135,12 +138,10 @@ cupsdCheckLogFile(cups_file_t **lf, /* I
}
/*
- * Format the filename as needed...
+ * Format the filename...
*/
- if (!*lf ||
- (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize &&
- MaxLogSize > 0))
+ if (strncmp(logname, "/dev/", 5))
{
/*
* Handle format strings...
@@ -254,6 +255,34 @@ cupsdCheckLogFile(cups_file_t **lf, /* I
/*
* Change ownership and permissions of non-device logs...
*/
+
+ fchown(cupsFileNumber(*lf), RunUser, Group);
+ fchmod(cupsFileNumber(*lf), LogFilePerm);
+ }
+ }
+
+ /*
+ * Has someone else (i.e. logrotate) already rotated the log for us?
+ */
+ else if (strncmp(filename, "/dev/", 5))
+ {
+ struct stat st;
+ if (stat(filename, &st) || st.st_size == 0)
+ {
+ /* File is either missing or has zero size. */
+
+ cupsFileClose(*lf);
+ if ((*lf = cupsFileOpen(filename, "a")) == NULL)
+ {
+ syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
+ strerror(errno));
+
+ return (0);
+ }
+
+ /*
+ * Change ownership and permissions of non-device logs...
+ */
fchown(cupsFileNumber(*lf), RunUser, Group);
fchmod(cupsFileNumber(*lf), LogFilePerm);

View File

@ -1,48 +0,0 @@
diff -up cups-2.2b2/berkeley/lpr.c.lpr-help cups-2.2b2/berkeley/lpr.c
--- cups-2.2b2/berkeley/lpr.c.lpr-help 2016-06-24 17:43:35.000000000 +0200
+++ cups-2.2b2/berkeley/lpr.c 2016-06-27 15:11:30.646348752 +0200
@@ -18,6 +18,31 @@
#include <cups/cups-private.h>
+static void
+usage (const char *name)
+{
+ _cupsLangPrintf(stdout,
+"Usage: %s [OPTION] [ file(s) ]\n"
+"Print files.\n\n"
+" -E force encryption\n"
+" -H server[:port] specify alternate server\n"
+" -C title, -J title, -T title\n"
+" set the job name\n\n"
+" -P destination/instance print to named printer\n"
+" -U username specify alternate username\n"
+" -# num-copies set number of copies\n"
+" -h disable banner printing\n"
+" -l print without filtering\n"
+" -m send email on completion\n"
+" -o option[=value] set a job option\n"
+" -p format text file with header\n"
+" -q hold job for printing\n"
+" -r delete files after printing\n"
+"\nWith no file given, read standard input.\n"
+, name);
+}
+
+
/*
* 'main()' - Parse options and send files for printing.
*/
@@ -281,6 +306,12 @@ main(int argc, /* I - Number of comm
break;
default :
+ if (!strcmp (argv[i], "--help"))
+ {
+ usage (argv[0]);
+ return (0);
+ }
+
_cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], *opt);
return (1);
}

View File

@ -1,21 +1,21 @@
diff --git a/Makedefs.in b/Makedefs.in diff -up cups-2.3.0/config.h.in.lspp cups-2.3.0/config.h.in
index 8541b49..a467ed5 100644 --- cups-2.3.0/config.h.in.lspp 2019-08-23 17:19:38.000000000 +0200
--- a/Makedefs.in +++ cups-2.3.0/config.h.in 2019-10-07 12:24:43.058597468 +0200
+++ b/Makedefs.in @@ -684,4 +684,11 @@ static __inline int _cups_abs(int i) { r
@@ -165,7 +165,7 @@ LDFLAGS = -L../cgi-bin -L../cups -L../filter -L../ppdc \ # endif /* __GNUC__ || __STDC_VERSION__ */
@LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM) #endif /* !HAVE_ABS && !abs */
LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(DNSSDLIBS) $(SSLLIBS) $(LIBZ)
LINKCUPSIMAGE = @LINKCUPSIMAGE@ +/*
-LIBS = $(LINKCUPS) $(COMMONLIBS) + * Are we trying to meet LSPP requirements?
+LIBS = $(LINKCUPS) $(COMMONLIBS) @LIBAUDIT@ @LIBSELINUX@ + */
ONDEMANDFLAGS = @ONDEMANDFLAGS@ +
ONDEMANDLIBS = @ONDEMANDLIBS@ +#undef WITH_LSPP
OPTIM = @OPTIM@ +
diff --git a/config-scripts/cups-lspp.m4 b/config-scripts/cups-lspp.m4 +
new file mode 100644 #endif /* !_CUPS_CONFIG_H_ */
index 0000000..9c59fab diff -up cups-2.3.0/config-scripts/cups-lspp.m4.lspp cups-2.3.0/config-scripts/cups-lspp.m4
--- /dev/null --- cups-2.3.0/config-scripts/cups-lspp.m4.lspp 2019-10-07 12:24:43.058597468 +0200
+++ b/config-scripts/cups-lspp.m4 +++ cups-2.3.0/config-scripts/cups-lspp.m4 2019-10-07 12:24:43.058597468 +0200
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
+dnl +dnl
+dnl LSPP code for the Common UNIX Printing System (CUPS). +dnl LSPP code for the Common UNIX Printing System (CUPS).
@ -53,40 +53,22 @@ index 0000000..9c59fab
+ ;; + ;;
+ esac + esac
+fi +fi
diff --git a/config.h.in b/config.h.in diff -up cups-2.3.0/configure.ac.lspp cups-2.3.0/configure.ac
index d81c59e..79da02c 100644 --- cups-2.3.0/configure.ac.lspp 2019-10-07 12:24:43.058597468 +0200
--- a/config.h.in +++ cups-2.3.0/configure.ac 2019-10-07 12:39:20.122546282 +0200
+++ b/config.h.in @@ -34,6 +34,8 @@ sinclude(config-scripts/cups-dnssd.m4)
@@ -737,4 +737,11 @@ static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); } sinclude(config-scripts/cups-startup.m4)
# endif /* __GNUC__ || __STDC_VERSION__ */
#endif /* !HAVE_ABS && !abs */
+/*
+ * Are we trying to meet LSPP requirements?
+ */
+
+#undef WITH_LSPP
+
+
#endif /* !_CUPS_CONFIG_H_ */
diff --git a/configure.ac b/configure.ac
index 38db5f5..725130f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -38,6 +38,8 @@ sinclude(config-scripts/cups-startup.m4)
sinclude(config-scripts/cups-defaults.m4) sinclude(config-scripts/cups-defaults.m4)
sinclude(config-scripts/cups-scripting.m4)
+sinclude(config-scripts/cups-lspp.m4) +sinclude(config-scripts/cups-lspp.m4)
+ +
INSTALL_LANGUAGES="" INSTALL_LANGUAGES=""
UNINSTALL_LANGUAGES="" UNINSTALL_LANGUAGES=""
LANGFILES="" LANGFILES=""
diff --git a/filter/common.c b/filter/common.c diff -up cups-2.3.0/filter/common.c.lspp cups-2.3.0/filter/common.c
index 86b5f8e..fd88bdc 100644 --- cups-2.3.0/filter/common.c.lspp 2019-08-23 17:19:38.000000000 +0200
--- a/filter/common.c +++ cups-2.3.0/filter/common.c 2019-10-07 12:24:43.059597461 +0200
+++ b/filter/common.c @@ -11,6 +11,12 @@
@@ -17,6 +17,12 @@
* Include necessary headers... * Include necessary headers...
*/ */
@ -99,7 +81,7 @@ index 86b5f8e..fd88bdc 100644
#include "common.h" #include "common.h"
#include <locale.h> #include <locale.h>
@@ -299,6 +305,18 @@ WriteLabelProlog(const char *label, /* I - Page label */ @@ -293,6 +299,18 @@ WriteLabelProlog(const char *label, /* I
{ {
const char *classification; /* CLASSIFICATION environment variable */ const char *classification; /* CLASSIFICATION environment variable */
const char *ptr; /* Temporary string pointer */ const char *ptr; /* Temporary string pointer */
@ -118,7 +100,7 @@ index 86b5f8e..fd88bdc 100644
/* /*
@@ -321,6 +339,124 @@ WriteLabelProlog(const char *label, /* I - Page label */ @@ -315,6 +333,124 @@ WriteLabelProlog(const char *label, /* I
return; return;
} }
@ -243,7 +225,7 @@ index 86b5f8e..fd88bdc 100644
/* /*
* Set the classification + page label string... * Set the classification + page label string...
*/ */
@@ -401,7 +537,10 @@ WriteLabelProlog(const char *label, /* I - Page label */ @@ -395,7 +531,10 @@ WriteLabelProlog(const char *label, /* I
printf(" %.0f moveto ESPpl show\n", top - 14.0); printf(" %.0f moveto ESPpl show\n", top - 14.0);
puts("pop"); puts("pop");
puts("}bind put"); puts("}bind put");
@ -254,14 +236,13 @@ index 86b5f8e..fd88bdc 100644
/* /*
diff --git a/filter/pstops.c b/filter/pstops.c diff -up cups-2.3.0/filter/pstops.c.lspp cups-2.3.0/filter/pstops.c
index fab60d9..0722163 100644 --- cups-2.3.0/filter/pstops.c.lspp 2019-08-23 17:19:38.000000000 +0200
--- a/filter/pstops.c +++ cups-2.3.0/filter/pstops.c 2019-10-07 12:24:43.059597461 +0200
+++ b/filter/pstops.c @@ -3170,6 +3170,18 @@ write_label_prolog(pstops_doc_t *doc, /*
@@ -3176,6 +3176,19 @@ write_label_prolog(pstops_doc_t *doc, /* I - Document info */ {
const char *classification; /* CLASSIFICATION environment variable */ const char *classification; /* CLASSIFICATION environment variable */
const char *ptr; /* Temporary string pointer */ const char *ptr; /* Temporary string pointer */
+#ifdef WITH_LSPP +#ifdef WITH_LSPP
+ int i, /* counter */ + int i, /* counter */
+ n, /* counter */ + n, /* counter */
@ -274,11 +255,10 @@ index fab60d9..0722163 100644
+ max_width; /* maximum width in characters */ + max_width; /* maximum width in characters */
+ char **wrapped_label; /* label with line breaks */ + char **wrapped_label; /* label with line breaks */
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
+
/* /*
* First get the current classification... @@ -3192,6 +3204,124 @@ write_label_prolog(pstops_doc_t *doc, /*
@@ -3197,6 +3210,124 @@ write_label_prolog(pstops_doc_t *doc, /* I - Document info */
return; return;
} }
@ -403,7 +383,7 @@ index fab60d9..0722163 100644
/* /*
* Set the classification + page label string... * Set the classification + page label string...
*/ */
@@ -3275,7 +3406,10 @@ write_label_prolog(pstops_doc_t *doc, /* I - Document info */ @@ -3270,7 +3400,10 @@ write_label_prolog(pstops_doc_t *doc, /*
doc_printf(doc, " %.0f moveto ESPpl show\n", top - 14.0); doc_printf(doc, " %.0f moveto ESPpl show\n", top - 14.0);
doc_puts(doc, "pop\n"); doc_puts(doc, "pop\n");
doc_puts(doc, "}bind put\n"); doc_puts(doc, "}bind put\n");
@ -414,11 +394,22 @@ index fab60d9..0722163 100644
/* /*
diff --git a/scheduler/client.c b/scheduler/client.c diff -up cups-2.3.0/Makedefs.in.lspp cups-2.3.0/Makedefs.in
index 6805080..236355a 100644 --- cups-2.3.0/Makedefs.in.lspp 2019-10-07 12:24:43.059597461 +0200
--- a/scheduler/client.c +++ cups-2.3.0/Makedefs.in 2019-10-07 12:37:19.200565805 +0200
+++ b/scheduler/client.c @@ -174,7 +174,7 @@ IPPFIND_MAN = @IPPFIND_MAN@
@@ -22,12 +22,20 @@ 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.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 #define _HTTP_NO_PRIVATE
#include "cupsd.h" #include "cupsd.h"
@ -439,7 +430,7 @@ index 6805080..236355a 100644
/* /*
@@ -268,6 +276,59 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ @@ -265,6 +273,59 @@ cupsdAcceptClient(cupsd_listener_t *lis)
} }
#endif /* HAVE_TCPD_H */ #endif /* HAVE_TCPD_H */
@ -499,9 +490,9 @@ index 6805080..236355a 100644
#ifdef AF_LOCAL #ifdef AF_LOCAL
if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL) if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL)
{ {
@@ -562,6 +623,13 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ @@ -558,6 +619,13 @@ cupsdReadClient(cupsd_client_t *con) /*
struct stat filestats; /* File information */
mime_type_t *type; /* MIME type of file */ mime_type_t *type; /* MIME type of file */
cupsd_printer_t *p; /* Printer */
static unsigned request_id = 0; /* Request ID for temp files */ static unsigned request_id = 0; /* Request ID for temp files */
+#ifdef WITH_LSPP +#ifdef WITH_LSPP
+ security_context_t spoolcon; /* context of the job file */ + security_context_t spoolcon; /* context of the job file */
@ -513,10 +504,10 @@ index 6805080..236355a 100644
status = HTTP_STATUS_CONTINUE; status = HTTP_STATUS_CONTINUE;
@@ -1937,6 +2005,72 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ @@ -1679,6 +1747,73 @@ cupsdReadClient(cupsd_client_t *con) /*
fchown(con->file, RunUser, Group);
fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
} }
+#ifdef WITH_LSPP +#ifdef WITH_LSPP
+ if (strncmp(con->scon, UNKNOWN_SL, strlen(UNKNOWN_SL)) != 0) + if (strncmp(con->scon, UNKNOWN_SL, strlen(UNKNOWN_SL)) != 0)
+ { + {
@ -583,10 +574,11 @@ index 6805080..236355a 100644
+ context_free(clicon); + context_free(clicon);
+ } + }
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
+
if (httpGetState(con->http) != HTTP_STATE_POST_SEND) if (httpGetState(con->http) != HTTP_STATE_POST_SEND)
{ {
@@ -3485,6 +3619,49 @@ is_path_absolute(const char *path) /* I - Input path */ if (!httpWait(con->http, 0))
@@ -3174,6 +3309,49 @@ is_path_absolute(const char *path) /* I
return (1); return (1);
} }
@ -636,11 +628,10 @@ index 6805080..236355a 100644
/* /*
* 'pipe_command()' - Pipe the output of a command to the remote client. * 'pipe_command()' - Pipe the output of a command to the remote client.
diff --git a/scheduler/client.h b/scheduler/client.h diff -up cups-2.3.0/scheduler/client.h.lspp cups-2.3.0/scheduler/client.h
index beddab0..7f4e8d4 100644 --- cups-2.3.0/scheduler/client.h.lspp 2019-08-23 17:19:38.000000000 +0200
--- a/scheduler/client.h +++ cups-2.3.0/scheduler/client.h 2019-10-07 12:24:43.113597079 +0200
+++ b/scheduler/client.h @@ -13,6 +13,13 @@
@@ -16,6 +16,13 @@
#endif /* HAVE_AUTHORIZATION_H */ #endif /* HAVE_AUTHORIZATION_H */
@ -654,7 +645,7 @@ index beddab0..7f4e8d4 100644
/* /*
* HTTP client structure... * HTTP client structure...
*/ */
@@ -66,6 +73,10 @@ struct cupsd_client_s @@ -63,6 +70,10 @@ struct cupsd_client_s
#ifdef HAVE_AUTHORIZATION_H #ifdef HAVE_AUTHORIZATION_H
AuthorizationRef authref; /* Authorization ref */ AuthorizationRef authref; /* Authorization ref */
#endif /* HAVE_AUTHORIZATION_H */ #endif /* HAVE_AUTHORIZATION_H */
@ -665,7 +656,7 @@ index beddab0..7f4e8d4 100644
}; };
#define HTTP(con) ((con)->http) #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 cupsdStopListening(void);
extern void cupsdUpdateCGI(void); extern void cupsdUpdateCGI(void);
extern void cupsdWriteClient(cupsd_client_t *con); extern void cupsdWriteClient(cupsd_client_t *con);
@ -675,22 +666,20 @@ index beddab0..7f4e8d4 100644
#ifdef HAVE_SSL #ifdef HAVE_SSL
extern int cupsdEndTLS(cupsd_client_t *con); extern int cupsdEndTLS(cupsd_client_t *con);
diff --git a/scheduler/conf.c b/scheduler/conf.c diff -up cups-2.3.0/scheduler/conf.c.lspp cups-2.3.0/scheduler/conf.c
index 96993c7..4200b57 100644 --- cups-2.3.0/scheduler/conf.c.lspp 2019-10-07 12:24:43.049597531 +0200
--- a/scheduler/conf.c +++ cups-2.3.0/scheduler/conf.c 2019-10-07 12:24:43.113597079 +0200
+++ b/scheduler/conf.c @@ -37,6 +37,9 @@
@@ -40,6 +40,10 @@
# define INADDR_NONE 0xffffffff # define INADDR_NONE 0xffffffff
#endif /* !INADDR_NONE */ #endif /* !INADDR_NONE */
+#ifdef WITH_LSPP +#ifdef WITH_LSPP
+# include <libaudit.h> +# include <libaudit.h>
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
+
/* /*
* Configuration variable structure... * Configuration variable structure...
@@ -131,6 +135,10 @@ static const cupsd_var_t cupsd_vars[] = @@ -131,6 +134,10 @@ static const cupsd_var_t cupsd_vars[] =
{ "ServerName", &ServerName, CUPSD_VARTYPE_STRING }, { "ServerName", &ServerName, CUPSD_VARTYPE_STRING },
{ "StrictConformance", &StrictConformance, CUPSD_VARTYPE_BOOLEAN }, { "StrictConformance", &StrictConformance, CUPSD_VARTYPE_BOOLEAN },
{ "Timeout", &Timeout, CUPSD_VARTYPE_TIME }, { "Timeout", &Timeout, CUPSD_VARTYPE_TIME },
@ -701,7 +690,7 @@ index 96993c7..4200b57 100644
{ "WebInterface", &WebInterface, CUPSD_VARTYPE_BOOLEAN } { "WebInterface", &WebInterface, CUPSD_VARTYPE_BOOLEAN }
}; };
static const cupsd_var_t cupsfiles_vars[] = static const cupsd_var_t cupsfiles_vars[] =
@@ -544,6 +552,9 @@ cupsdReadConfiguration(void) @@ -544,6 +551,9 @@ cupsdReadConfiguration(void)
const char *tmpdir; /* TMPDIR environment variable */ const char *tmpdir; /* TMPDIR environment variable */
struct stat tmpinfo; /* Temporary directory info */ struct stat tmpinfo; /* Temporary directory info */
cupsd_policy_t *p; /* Policy */ cupsd_policy_t *p; /* Policy */
@ -711,7 +700,7 @@ index 96993c7..4200b57 100644
/* /*
@@ -863,6 +874,25 @@ cupsdReadConfiguration(void) @@ -864,6 +874,25 @@ cupsdReadConfiguration(void)
RunUser = getuid(); RunUser = getuid();
@ -737,7 +726,7 @@ index 96993c7..4200b57 100644
cupsdLogMessage(CUPSD_LOG_INFO, "Remote access is %s.", cupsdLogMessage(CUPSD_LOG_INFO, "Remote access is %s.",
RemotePort ? "enabled" : "disabled"); RemotePort ? "enabled" : "disabled");
@@ -1274,7 +1304,19 @@ cupsdReadConfiguration(void) @@ -1275,7 +1304,19 @@ cupsdReadConfiguration(void)
cupsdClearString(&Classification); cupsdClearString(&Classification);
if (Classification) if (Classification)
@ -757,7 +746,7 @@ index 96993c7..4200b57 100644
/* /*
* Check the MaxClients setting, and then allocate memory for it... * Check the MaxClients setting, and then allocate memory for it...
@@ -3832,6 +3874,18 @@ read_location(cups_file_t *fp, /* I - Configuration file */ @@ -3830,6 +3871,18 @@ read_location(cups_file_t *fp, /* I - C
return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum); return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum);
} }
@ -776,11 +765,10 @@ index 96993c7..4200b57 100644
/* /*
* 'read_policy()' - Read a <Policy name> definition. * 'read_policy()' - Read a <Policy name> definition.
diff --git a/scheduler/conf.h b/scheduler/conf.h diff -up cups-2.3.0/scheduler/conf.h.lspp cups-2.3.0/scheduler/conf.h
index b608367..cc07a8a 100644 --- cups-2.3.0/scheduler/conf.h.lspp 2019-08-23 17:19:38.000000000 +0200
--- a/scheduler/conf.h +++ cups-2.3.0/scheduler/conf.h 2019-10-07 12:24:43.113597079 +0200
+++ b/scheduler/conf.h @@ -243,6 +243,13 @@ VAR char *ServerKeychain VALUE(NULL);
@@ -246,6 +246,13 @@ VAR char *ServerKeychain VALUE(NULL);
/* Keychain holding cert + key */ /* Keychain holding cert + key */
#endif /* HAVE_SSL */ #endif /* HAVE_SSL */
@ -794,7 +782,7 @@ index b608367..cc07a8a 100644
#ifdef HAVE_ONDEMAND #ifdef HAVE_ONDEMAND
VAR int IdleExitTimeout VALUE(60); VAR int IdleExitTimeout VALUE(60);
/* Time after which an idle cupsd will exit */ /* 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 */ VAR gss_cred_id_t ServerCreds; /* Server's GSS credentials */
#endif /* HAVE_GSSAPI */ #endif /* HAVE_GSSAPI */
@ -804,12 +792,11 @@ index b608367..cc07a8a 100644
/* /*
* Prototypes... * Prototypes...
diff --git a/scheduler/cupsd.h b/scheduler/cupsd.h diff -up cups-2.3.0/scheduler/cupsd.h.lspp cups-2.3.0/scheduler/cupsd.h
index 54d2a4f..8129586 100644 --- cups-2.3.0/scheduler/cupsd.h.lspp 2019-08-23 17:19:38.000000000 +0200
--- a/scheduler/cupsd.h +++ cups-2.3.0/scheduler/cupsd.h 2019-10-07 12:31:38.458480578 +0200
+++ b/scheduler/cupsd.h @@ -8,6 +8,8 @@
@@ -11,6 +11,8 @@ * information.
* file is missing or damaged, see the license at "http://www.cups.org/".
*/ */
+/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */ +/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */
@ -817,7 +804,7 @@ index 54d2a4f..8129586 100644
/* /*
* Include necessary headers. * Include necessary headers.
@@ -36,6 +38,14 @@ @@ -33,6 +35,14 @@
# include <unistd.h> # include <unistd.h>
#endif /* _WIN32 */ #endif /* _WIN32 */
@ -832,12 +819,11 @@ index 54d2a4f..8129586 100644
#include "mime.h" #include "mime.h"
#if defined(HAVE_CDSASSL) #if defined(HAVE_CDSASSL)
diff --git a/scheduler/ipp.c b/scheduler/ipp.c diff -up cups-2.3.0/scheduler/ipp.c.lspp cups-2.3.0/scheduler/ipp.c
index 07765a1..2ce61b4 100644 --- cups-2.3.0/scheduler/ipp.c.lspp 2019-10-07 12:24:43.016597764 +0200
--- a/scheduler/ipp.c +++ cups-2.3.0/scheduler/ipp.c 2019-10-07 12:31:01.243798920 +0200
+++ b/scheduler/ipp.c @@ -11,6 +11,9 @@
@@ -14,6 +14,9 @@ * information.
* missing or damaged, see the license at "http://www.cups.org/".
*/ */
+/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */ +/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */
@ -846,8 +832,8 @@ index 07765a1..2ce61b4 100644
/* /*
* Include necessary headers... * Include necessary headers...
*/ */
@@ -37,6 +40,15 @@ extern int mbr_check_membership_by_id(uuid_t user, gid_t group, int* ismember); @@ -27,6 +30,14 @@ extern int mbr_group_name_to_uuid(const
# endif /* HAVE_MEMBERSHIPPRIV_H */ extern int mbr_check_membership_by_id(uuid_t user, gid_t group, int* ismember);
#endif /* __APPLE__ */ #endif /* __APPLE__ */
+#ifdef WITH_LSPP +#ifdef WITH_LSPP
@ -858,11 +844,10 @@ index 07765a1..2ce61b4 100644
+#include <selinux/flask.h> +#include <selinux/flask.h>
+#include <selinux/av_permissions.h> +#include <selinux/av_permissions.h>
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
+
/* /*
* Local functions... * Local functions...
@@ -61,6 +73,9 @@ static void cancel_all_jobs(cupsd_client_t *con, ipp_attribute_t *uri); @@ -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_job(cupsd_client_t *con, ipp_attribute_t *uri);
static void cancel_subscription(cupsd_client_t *con, int id); static void cancel_subscription(cupsd_client_t *con, int id);
static int check_rss_recipient(const char *recipient); static int check_rss_recipient(const char *recipient);
@ -872,11 +857,10 @@ index 07765a1..2ce61b4 100644
static int check_quotas(cupsd_client_t *con, cupsd_printer_t *p); 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 close_job(cupsd_client_t *con, ipp_attribute_t *uri);
static void copy_attrs(ipp_t *to, ipp_t *from, cups_array_t *ra, static void copy_attrs(ipp_t *to, ipp_t *from, cups_array_t *ra,
@@ -1248,7 +1263,21 @@ add_job(cupsd_client_t *con, /* I - Client connection */ @@ -1240,6 +1254,21 @@ add_job(cupsd_client_t *con, /* I - Cl
"time-at-creation", "time-at-creation",
"time-at-processing" "time-at-processing"
}; };
-
+#ifdef WITH_LSPP +#ifdef WITH_LSPP
+ char *audit_message; /* Audit message string */ + char *audit_message; /* Audit message string */
+ char *printerfile; /* device file pointed to by the printer */ + char *printerfile; /* device file pointed to by the printer */
@ -893,9 +877,9 @@ index 07765a1..2ce61b4 100644
+ access_vector_t avr; /* Access method being requested */ + access_vector_t avr; /* Access method being requested */
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))", cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))",
con, con->number, printer, printer->name, @@ -1568,6 +1597,106 @@ add_job(cupsd_client_t *con, /* I - Cl
@@ -1576,6 +1605,106 @@ add_job(cupsd_client_t *con, /* I - Client connection */
attr = ippFindAttribute(con->request, "requesting-user-name", IPP_TAG_NAME); attr = ippFindAttribute(con->request, "requesting-user-name", IPP_TAG_NAME);
@ -1002,7 +986,7 @@ index 07765a1..2ce61b4 100644
if ((job = cupsdAddJob(priority, printer->name)) == NULL) if ((job = cupsdAddJob(priority, printer->name)) == NULL)
{ {
send_ipp_status(con, IPP_INTERNAL_ERROR, send_ipp_status(con, IPP_INTERNAL_ERROR,
@@ -1584,6 +1713,32 @@ add_job(cupsd_client_t *con, /* I - Client connection */ @@ -1576,6 +1705,32 @@ add_job(cupsd_client_t *con, /* I - Cl
return (NULL); return (NULL);
} }
@ -1035,7 +1019,7 @@ index 07765a1..2ce61b4 100644
job->dtype = printer->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE); job->dtype = printer->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE);
job->attrs = con->request; job->attrs = con->request;
job->dirty = 1; job->dirty = 1;
@@ -1771,6 +1926,29 @@ add_job(cupsd_client_t *con, /* I - Client connection */ @@ -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, 0, printer->job_sheets[0]);
ippSetString(job->attrs, &attr, 1, printer->job_sheets[1]); ippSetString(job->attrs, &attr, 1, printer->job_sheets[1]);
} }
@ -1065,7 +1049,7 @@ index 07765a1..2ce61b4 100644
job->job_sheets = attr; job->job_sheets = attr;
@@ -1801,6 +1979,9 @@ add_job(cupsd_client_t *con, /* I - Client connection */ @@ -1793,6 +1971,9 @@ add_job(cupsd_client_t *con, /* I - Cl
"job-sheets=\"%s,none\", " "job-sheets=\"%s,none\", "
"job-originating-user-name=\"%s\"", "job-originating-user-name=\"%s\"",
Classification, job->username); Classification, job->username);
@ -1075,7 +1059,7 @@ index 07765a1..2ce61b4 100644
} }
else if (attr->num_values == 2 && else if (attr->num_values == 2 &&
strcmp(attr->values[0].string.text, strcmp(attr->values[0].string.text,
@@ -1819,6 +2000,9 @@ add_job(cupsd_client_t *con, /* I - Client connection */ @@ -1811,6 +1992,9 @@ add_job(cupsd_client_t *con, /* I - Cl
"job-originating-user-name=\"%s\"", "job-originating-user-name=\"%s\"",
attr->values[0].string.text, attr->values[0].string.text,
attr->values[1].string.text, job->username); attr->values[1].string.text, job->username);
@ -1085,7 +1069,7 @@ index 07765a1..2ce61b4 100644
} }
else if (strcmp(attr->values[0].string.text, Classification) && else if (strcmp(attr->values[0].string.text, Classification) &&
strcmp(attr->values[0].string.text, "none") && strcmp(attr->values[0].string.text, "none") &&
@@ -1839,6 +2023,9 @@ add_job(cupsd_client_t *con, /* I - Client connection */ @@ -1831,6 +2015,9 @@ add_job(cupsd_client_t *con, /* I - Cl
"job-originating-user-name=\"%s\"", "job-originating-user-name=\"%s\"",
attr->values[0].string.text, attr->values[0].string.text,
attr->values[1].string.text, job->username); attr->values[1].string.text, job->username);
@ -1095,7 +1079,7 @@ index 07765a1..2ce61b4 100644
} }
} }
else if (strcmp(attr->values[0].string.text, Classification) && else if (strcmp(attr->values[0].string.text, Classification) &&
@@ -1879,7 +2066,49 @@ add_job(cupsd_client_t *con, /* I - Client connection */ @@ -1871,8 +2058,52 @@ add_job(cupsd_client_t *con, /* I - Cl
"job-sheets=\"%s\", " "job-sheets=\"%s\", "
"job-originating-user-name=\"%s\"", "job-originating-user-name=\"%s\"",
Classification, job->username); Classification, job->username);
@ -1137,15 +1121,18 @@ index 07765a1..2ce61b4 100644
+ cupsdClearString(&audit_message); + cupsdClearString(&audit_message);
+ } + }
} }
+
+ if (userheader) + if (userheader)
+ free(userheader); + free(userheader);
+ if (userfooter) + if (userfooter)
+ free(userfooter); + free(userfooter);
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
} }
+
/* /*
@@ -3653,6 +3882,128 @@ check_rss_recipient( * See if we need to add the starting sheet...
@@ -3648,6 +3879,128 @@ check_rss_recipient(
} }
@ -1274,7 +1261,7 @@ index 07765a1..2ce61b4 100644
/* /*
* 'check_quotas()' - Check quotas for a printer and user. * 'check_quotas()' - Check quotas for a printer and user.
*/ */
@@ -4109,6 +4460,14 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */ @@ -4103,6 +4456,15 @@ copy_banner(cupsd_client_t *con, /* I -
char attrname[255], /* Name of attribute */ char attrname[255], /* Name of attribute */
*s; /* Pointer into name */ *s; /* Pointer into name */
ipp_attribute_t *attr; /* Attribute */ ipp_attribute_t *attr; /* Attribute */
@ -1286,10 +1273,11 @@ index 07765a1..2ce61b4 100644
+ context_t tmpcon; /* Temp context to set the level */ + context_t tmpcon; /* Temp context to set the level */
+ security_context_t spoolcon; /* Context of the file in the spool */ + security_context_t spoolcon; /* Context of the file in the spool */
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
+
cupsdLogMessage(CUPSD_LOG_DEBUG2, cupsdLogMessage(CUPSD_LOG_DEBUG2,
@@ -4144,6 +4503,85 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */ @@ -4138,6 +4500,85 @@ copy_banner(cupsd_client_t *con, /* I -
fchmod(cupsFileNumber(out), 0640); fchmod(cupsFileNumber(out), 0640);
fchown(cupsFileNumber(out), RunUser, Group); fchown(cupsFileNumber(out), RunUser, Group);
@ -1375,7 +1363,7 @@ index 07765a1..2ce61b4 100644
/* /*
* Try the localized banner file under the subdirectory... * Try the localized banner file under the subdirectory...
@@ -4238,6 +4676,24 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */ @@ -4232,6 +4673,24 @@ copy_banner(cupsd_client_t *con, /* I -
else else
s = attrname; s = attrname;
@ -1400,10 +1388,11 @@ index 07765a1..2ce61b4 100644
if (!strcmp(s, "printer-name")) if (!strcmp(s, "printer-name"))
{ {
cupsFilePuts(out, job->dest); cupsFilePuts(out, job->dest);
@@ -6475,6 +6931,20 @@ get_job_attrs(cupsd_client_t *con, /* I - Client connection */ @@ -6439,6 +6898,22 @@ get_job_attrs(cupsd_client_t *con, /* I
exclude = cupsdGetPrivateAttrs(policy, con, printer, job->username); exclude = cupsdGetPrivateAttrs(policy, con, printer, job->username);
+
+#ifdef WITH_LSPP +#ifdef WITH_LSPP
+ /* + /*
+ * Check SELinux... + * Check SELinux...
@ -1417,11 +1406,12 @@ index 07765a1..2ce61b4 100644
+ return; + return;
+ } + }
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
+
+ +
/* /*
* Copy attributes... * Copy attributes...
*/ */
@@ -6872,6 +7342,11 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ @@ -6836,6 +7311,11 @@ get_jobs(cupsd_client_t *con, /* I - C
if (username[0] && _cups_strcasecmp(username, job->username)) if (username[0] && _cups_strcasecmp(username, job->username))
continue; continue;
@ -1433,7 +1423,7 @@ index 07765a1..2ce61b4 100644
if (count > 0) if (count > 0)
ippAddSeparator(con->response); ippAddSeparator(con->response);
@@ -11470,6 +11945,11 @@ validate_user(cupsd_job_t *job, /* I - Job */ @@ -11445,6 +11925,11 @@ validate_user(cupsd_job_t *job, /* I
strlcpy(username, get_username(con), userlen); strlcpy(username, get_username(con), userlen);
@ -1445,12 +1435,11 @@ index 07765a1..2ce61b4 100644
/* /*
* Check the username against the owner... * Check the username against the owner...
*/ */
diff --git a/scheduler/job.c b/scheduler/job.c diff -up cups-2.3.0/scheduler/job.c.lspp cups-2.3.0/scheduler/job.c
index a8373f5..4c94860 100644 --- cups-2.3.0/scheduler/job.c.lspp 2019-10-07 12:24:43.024597707 +0200
--- a/scheduler/job.c +++ cups-2.3.0/scheduler/job.c 2019-10-07 12:30:13.092210820 +0200
+++ b/scheduler/job.c @@ -8,6 +8,9 @@
@@ -11,6 +11,9 @@ * information.
* missing or damaged, see the license at "http://www.cups.org/".
*/ */
+/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */ +/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */
@ -1459,7 +1448,7 @@ index a8373f5..4c94860 100644
/* /*
* Include necessary headers... * Include necessary headers...
*/ */
@@ -26,6 +29,14 @@ @@ -23,6 +26,14 @@
# endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */ # endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */
#endif /* __APPLE__ */ #endif /* __APPLE__ */
@ -1474,7 +1463,7 @@ index a8373f5..4c94860 100644
/* /*
* Design Notes for Job Management * Design Notes for Job Management
@@ -547,6 +558,14 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ @@ -544,6 +555,14 @@ cupsdContinueJob(cupsd_job_t *job) /* I
/* PRINTER_STATE_REASONS env var */ /* PRINTER_STATE_REASONS env var */
rip_max_cache[255]; rip_max_cache[255];
/* RIP_MAX_CACHE env variable */ /* RIP_MAX_CACHE env variable */
@ -1489,7 +1478,7 @@ index a8373f5..4c94860 100644
cupsdLogMessage(CUPSD_LOG_DEBUG2, cupsdLogMessage(CUPSD_LOG_DEBUG2,
@@ -1065,6 +1084,67 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ @@ -1080,6 +1099,67 @@ cupsdContinueJob(cupsd_job_t *job) /* I
if (final_content_type[0]) if (final_content_type[0])
envp[envc ++] = final_content_type; envp[envc ++] = final_content_type;
@ -1557,7 +1546,7 @@ index a8373f5..4c94860 100644
if (Classification && !banner_page) if (Classification && !banner_page)
{ {
if ((attr = ippFindAttribute(job->attrs, "job-sheets", if ((attr = ippFindAttribute(job->attrs, "job-sheets",
@@ -1844,6 +1924,22 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ @@ -1858,6 +1938,22 @@ cupsdLoadJob(cupsd_job_t *job) /* I - J
ippSetString(job->attrs, &job->reasons, 0, "none"); ippSetString(job->attrs, &job->reasons, 0, "none");
} }
@ -1580,7 +1569,7 @@ index a8373f5..4c94860 100644
job->impressions = ippFindAttribute(job->attrs, "job-impressions-completed", IPP_TAG_INTEGER); job->impressions = ippFindAttribute(job->attrs, "job-impressions-completed", IPP_TAG_INTEGER);
job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-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); job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
@@ -2259,6 +2355,14 @@ cupsdSaveJob(cupsd_job_t *job) /* I - Job */ @@ -2273,6 +2369,14 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J
{ {
char filename[1024]; /* Job control filename */ char filename[1024]; /* Job control filename */
cups_file_t *fp; /* Job file */ cups_file_t *fp; /* Job file */
@ -1595,7 +1584,7 @@ index a8373f5..4c94860 100644
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p", cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p",
@@ -2281,6 +2385,78 @@ cupsdSaveJob(cupsd_job_t *job) /* I - Job */ @@ -2295,6 +2399,78 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J
fchown(cupsFileNumber(fp), RunUser, Group); fchown(cupsFileNumber(fp), RunUser, Group);
@ -1674,7 +1663,7 @@ index a8373f5..4c94860 100644
job->attrs->state = IPP_IDLE; job->attrs->state = IPP_IDLE;
if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL,
@@ -3969,6 +4145,19 @@ get_options(cupsd_job_t *job, /* I - Job */ @@ -3995,6 +4171,19 @@ get_options(cupsd_job_t *job, /* I - Jo
banner_page) banner_page)
continue; continue;
@ -1694,7 +1683,7 @@ index a8373f5..4c94860 100644
/* /*
* Otherwise add them to the list... * Otherwise add them to the list...
*/ */
@@ -4779,6 +4968,18 @@ start_job(cupsd_job_t *job, /* I - Job ID */ @@ -4805,6 +4994,18 @@ start_job(cupsd_job_t *job, /* I -
cupsd_printer_t *printer) /* I - Printer to print job */ cupsd_printer_t *printer) /* I - Printer to print job */
{ {
const char *filename; /* Support filename */ const char *filename; /* Support filename */
@ -1713,7 +1702,7 @@ index a8373f5..4c94860 100644
ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs, ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs,
"job-cancel-after", "job-cancel-after",
IPP_TAG_INTEGER); IPP_TAG_INTEGER);
@@ -4967,6 +5168,113 @@ start_job(cupsd_job_t *job, /* I - Job ID */ @@ -4993,6 +5194,113 @@ start_job(cupsd_job_t *job, /* I -
fcntl(job->side_pipes[1], F_SETFD, fcntl(job->side_pipes[1], F_SETFD,
fcntl(job->side_pipes[1], F_GETFD) | FD_CLOEXEC); fcntl(job->side_pipes[1], F_GETFD) | FD_CLOEXEC);
@ -1827,12 +1816,11 @@ index a8373f5..4c94860 100644
/* /*
* Now start the first file in the job... * Now start the first file in the job...
*/ */
diff --git a/scheduler/job.h b/scheduler/job.h diff -up cups-2.3.0/scheduler/job.h.lspp cups-2.3.0/scheduler/job.h
index eb59029..9e8b967 100644 --- cups-2.3.0/scheduler/job.h.lspp 2019-08-23 17:19:38.000000000 +0200
--- a/scheduler/job.h +++ cups-2.3.0/scheduler/job.h 2019-10-07 12:29:54.364371023 +0200
+++ b/scheduler/job.h @@ -7,6 +7,13 @@
@@ -11,6 +11,13 @@ * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
* missing or damaged, see the license at "http://www.cups.org/".
*/ */
+/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */ +/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */
@ -1845,7 +1833,7 @@ index eb59029..9e8b967 100644
/* /*
* Constants... * 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 progress; /* Printing progress */
int num_keywords; /* Number of PPD keywords */ int num_keywords; /* Number of PPD keywords */
cups_option_t *keywords; /* PPD keywords */ cups_option_t *keywords; /* PPD keywords */
@ -1856,22 +1844,20 @@ index eb59029..9e8b967 100644
}; };
typedef struct cupsd_joblog_s /**** Job log message ****/ typedef struct cupsd_joblog_s /**** Job log message ****/
diff --git a/scheduler/main.c b/scheduler/main.c diff -up cups-2.3.0/scheduler/main.c.lspp cups-2.3.0/scheduler/main.c
index 2764e6a..8984e37 100644 --- cups-2.3.0/scheduler/main.c.lspp 2019-10-07 12:24:43.037597616 +0200
--- a/scheduler/main.c +++ cups-2.3.0/scheduler/main.c 2019-10-07 12:24:43.119597037 +0200
+++ b/scheduler/main.c @@ -57,6 +57,9 @@
@@ -59,6 +59,10 @@
# include <sys/param.h> # include <sys/param.h>
#endif /* HAVE_SYS_PARAM_H */ #endif /* HAVE_SYS_PARAM_H */
+#ifdef WITH_LSPP +#ifdef WITH_LSPP
+# include <libaudit.h> +# include <libaudit.h>
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
+
/* /*
* Local functions... * Local functions...
@@ -125,6 +129,9 @@ main(int argc, /* I - Number of command-line args */ @@ -123,6 +126,9 @@ main(int argc, /* I - Number of comm
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */ struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
@ -1881,7 +1867,7 @@ index 2764e6a..8984e37 100644
#ifdef __APPLE__ #ifdef __APPLE__
int use_sysman = 1; /* Use system management functions? */ int use_sysman = 1; /* Use system management functions? */
#else #else
@@ -488,6 +495,25 @@ main(int argc, /* I - Number of command-line args */ @@ -495,6 +501,25 @@ main(int argc, /* I - Number of comm
exit(errno); exit(errno);
} }
@ -1907,7 +1893,7 @@ index 2764e6a..8984e37 100644
/* /*
* Let the system know we are busy while we bring up cupsd... * Let the system know we are busy while we bring up cupsd...
*/ */
@@ -1196,6 +1222,11 @@ main(int argc, /* I - Number of command-line args */ @@ -1201,6 +1226,11 @@ main(int argc, /* I - Number of comm
cupsdStopSelect(); cupsdStopSelect();
@ -1919,12 +1905,11 @@ index 2764e6a..8984e37 100644
return (!stop_scheduler); return (!stop_scheduler);
} }
diff --git a/scheduler/printers.c b/scheduler/printers.c diff -up cups-2.3.0/scheduler/printers.c.lspp cups-2.3.0/scheduler/printers.c
index 22f5ad2..1f16db3 100644 --- cups-2.3.0/scheduler/printers.c.lspp 2019-08-23 17:19:38.000000000 +0200
--- a/scheduler/printers.c +++ cups-2.3.0/scheduler/printers.c 2019-10-07 12:29:17.956658129 +0200
+++ b/scheduler/printers.c @@ -8,6 +8,8 @@
@@ -11,6 +11,8 @@ * information.
* missing or damaged, see the license at "http://www.cups.org/".
*/ */
+/* (c) Copyright 2005-2006 Hewlett-Packard Development Company, L.P. */ +/* (c) Copyright 2005-2006 Hewlett-Packard Development Company, L.P. */
@ -1932,7 +1917,7 @@ index 22f5ad2..1f16db3 100644
/* /*
* Include necessary headers... * Include necessary headers...
*/ */
@@ -35,6 +37,10 @@ @@ -32,6 +34,10 @@
# include <asl.h> # include <asl.h>
#endif /* __APPLE__ */ #endif /* __APPLE__ */
@ -1943,7 +1928,7 @@ index 22f5ad2..1f16db3 100644
/* /*
* Local functions... * Local functions...
@@ -2196,6 +2202,13 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ @@ -2252,6 +2258,13 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
ipp_attribute_t *attr; /* Attribute data */ ipp_attribute_t *attr; /* Attribute data */
char *name, /* Current user/group name */ char *name, /* Current user/group name */
*filter; /* Current filter */ *filter; /* Current filter */
@ -1956,8 +1941,8 @@ index 22f5ad2..1f16db3 100644
+#endif /* WITH_LSPP */ +#endif /* WITH_LSPP */
DEBUG_printf(("cupsdSetPrinterAttrs: entering name = %s, type = %x\n", p->name, /*
@@ -2323,6 +2336,45 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ @@ -2378,6 +2391,45 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
attr->values[1].string.text = _cupsStrAlloc(Classification ? attr->values[1].string.text = _cupsStrAlloc(Classification ?
Classification : p->job_sheets[1]); Classification : p->job_sheets[1]);
} }
@ -2003,6 +1988,3 @@ index 22f5ad2..1f16db3 100644
} }
p->raw = 0; p->raw = 0;
--
2.23.0

13
cups-manual-copies.patch Normal file
View File

@ -0,0 +1,13 @@
diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c
index 94a125a..79aab32 100644
--- a/cups/ppd-cache.c
+++ b/cups/ppd-cache.c
@@ -3228,7 +3228,7 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-pdf application/pdf 10 -\"\n");
}
else
- cupsFilePuts(fp, "*cupsManualCopies: true\n");
+ cupsFilePuts(fp, "*cupsManualCopies: True\n");
if (is_apple)
cupsFilePuts(fp, "*cupsFilter2: \"image/urf image/urf 100 -\"\n");
if (is_pwg)

View File

@ -1,16 +1,14 @@
diff -up cups-1.5b1/cups-config.in.multilib cups-1.5b1/cups-config.in diff -up cups-2.3.0/cups-config.in.multilib cups-2.3.0/cups-config.in
--- cups-1.5b1/cups-config.in.multilib 2010-06-16 02:48:25.000000000 +0200 --- cups-2.3.0/cups-config.in.multilib 2019-10-07 12:10:09.508859587 +0200
+++ cups-1.5b1/cups-config.in 2011-05-23 17:33:31.000000000 +0200 +++ cups-2.3.0/cups-config.in 2019-10-07 12:11:56.614025934 +0200
@@ -22,8 +22,10 @@ prefix=@prefix@ @@ -17,7 +17,9 @@ prefix=@prefix@
exec_prefix=@exec_prefix@ exec_prefix=@exec_prefix@
bindir=@bindir@ bindir=@bindir@
includedir=@includedir@ includedir=@includedir@
-libdir=@libdir@ -libdir=@libdir@
-imagelibdir=@libdir@
+# Fetch libdir from gnutls's pkg-config script. This is a bit +# Fetch libdir from gnutls's pkg-config script. This is a bit
+# of a cheat, but the cups-devel package requires gnutls-devel anyway. +# of a cheat, but the cups-devel package requires gnutls-devel anyway.
+libdir=`pkg-config --variable=libdir gnutls` +libdir=`pkg-config --variable=libdir gnutls`
+imagelibdir=`pkg-config --variable=libdir gnutls`
datarootdir=@datadir@ datarootdir=@datadir@
datadir=@datadir@ datadir=@datadir@
sysconfdir=@sysconfdir@ sysconfdir=@sysconfdir@

View File

@ -1,18 +0,0 @@
diff -up cups-2.2.4/config-scripts/cups-manpages.m4.no-gzip-man cups-2.2.4/config-scripts/cups-manpages.m4
--- cups-2.2.4/config-scripts/cups-manpages.m4.no-gzip-man 2017-06-30 20:37:09.470034273 +0200
+++ cups-2.2.4/config-scripts/cups-manpages.m4 2017-06-30 20:39:15.982884832 +0200
@@ -53,10 +53,10 @@ case "$host_os_name" in
;;
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
;;
*)

22
cups-ppdleak.patch Normal file
View File

@ -0,0 +1,22 @@
diff --git a/ppdc/ppdc-import.cxx b/ppdc/ppdc-import.cxx
index 04b587d..60d8834 100644
--- a/ppdc/ppdc-import.cxx
+++ b/ppdc/ppdc-import.cxx
@@ -27,7 +27,7 @@ ppdcSource::import_ppd(const char *f) // I - Filename
char line[256], // Comment line
*ptr; // Pointer into line
int cost; // Cost for filter
- ppd_file_t *ppd; // PPD file data
+ ppd_file_t *ppd = NULL; // PPD file data
ppd_group_t *group; // PPD group
ppd_option_t *option; // PPD option
ppd_choice_t *choice; // PPD choice
@@ -323,5 +323,8 @@ ppdcSource::import_ppd(const char *f) // I - Filename
}
}
+ if (ppd)
+ ppdClose(ppd);
+
return (1);
}

View File

@ -0,0 +1,15 @@
diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c
index 5965e38..94a125a 100644
--- a/cups/ppd-cache.c
+++ b/cups/ppd-cache.c
@@ -3735,8 +3735,8 @@ _ppdCreateFromIPP(char *buffer, /* I - Filename buffer */
*/
if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) == NULL)
- if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL)
- if ((attr = ippFindAttribute(response, "print-color-mode-supported", IPP_TAG_KEYWORD)) == NULL)
+ if ((attr = ippFindAttribute(response, "print-color-mode-supported", IPP_TAG_KEYWORD)) == NULL)
+ if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL)
attr = ippFindAttribute(response, "output-mode-supported", IPP_TAG_KEYWORD);
if (attr)

View File

@ -0,0 +1,14 @@
diff --git a/filter/rastertopwg.c b/filter/rastertopwg.c
index 1e63e4e..b3a2e87 100644
--- a/filter/rastertopwg.c
+++ b/filter/rastertopwg.c
@@ -260,7 +260,8 @@ main(int argc, /* I - Number of command-line args */
}
if (inheader.cupsPageSizeName[0] &&
- (pwg_size = _ppdCacheGetSize(cache, inheader.cupsPageSizeName)) != NULL)
+ (pwg_size = _ppdCacheGetSize(cache, inheader.cupsPageSizeName)) != NULL &&
+ pwg_size->map.pwg)
{
strlcpy(outheader.cupsPageSizeName, pwg_size->map.pwg,
sizeof(outheader.cupsPageSizeName));

View File

@ -1,7 +1,6 @@
diff --git a/conf/cups-files.conf.in b/conf/cups-files.conf.in diff -up cups-2.2.12/conf/cups-files.conf.in.synconclose cups-2.2.12/conf/cups-files.conf.in
index f4230c9..6609831 100644 --- cups-2.2.12/conf/cups-files.conf.in.synconclose 2019-08-16 00:35:30.000000000 +0200
--- a/conf/cups-files.conf.in +++ cups-2.2.12/conf/cups-files.conf.in 2019-08-19 09:58:14.646567949 +0200
+++ b/conf/cups-files.conf.in
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
#FatalErrors @CUPS_FATAL_ERRORS@ #FatalErrors @CUPS_FATAL_ERRORS@
@ -11,11 +10,10 @@ index f4230c9..6609831 100644
# Default user and group for filters/backends/helper programs; this cannot be # Default user and group for filters/backends/helper programs; this cannot be
# any user or group that resolves to ID 0 for security reasons... # any user or group that resolves to ID 0 for security reasons...
diff --git a/doc/help/man-cups-files.conf.html b/doc/help/man-cups-files.conf.html diff -up cups-2.2.12/doc/help/man-cups-files.conf.html.synconclose cups-2.2.12/doc/help/man-cups-files.conf.html
index 6144a16..b82117c 100644 --- cups-2.2.12/doc/help/man-cups-files.conf.html.synconclose 2019-08-16 00:35:30.000000000 +0200
--- a/doc/help/man-cups-files.conf.html +++ cups-2.2.12/doc/help/man-cups-files.conf.html 2019-08-19 09:58:14.646567949 +0200
+++ b/doc/help/man-cups-files.conf.html @@ -150,7 +150,7 @@ The default is "/var/run/cups" or "/etc/
@@ -150,7 +150,7 @@ The default is "/var/run/cups" or "/etc/cups" depending on the platform.
<dd style="margin-left: 5.0em">Specifies whether the scheduler calls <dd style="margin-left: 5.0em">Specifies whether the scheduler calls
<b>fsync</b>(2) <b>fsync</b>(2)
after writing configuration or state files. after writing configuration or state files.
@ -24,11 +22,10 @@ index 6144a16..b82117c 100644
<dt><a name="SystemGroup"></a><b>SystemGroup </b><i>group-name </i>[ ... <i>group-name</i> ] <dt><a name="SystemGroup"></a><b>SystemGroup </b><i>group-name </i>[ ... <i>group-name</i> ]
<dd style="margin-left: 5.0em">Specifies the group(s) to use for <i>@SYSTEM</i> group authentication. <dd style="margin-left: 5.0em">Specifies the group(s) to use for <i>@SYSTEM</i> group authentication.
The default contains "admin", "lpadmin", "root", "sys", and/or "system". The default contains "admin", "lpadmin", "root", "sys", and/or "system".
diff --git a/man/cups-files.conf.man.in b/man/cups-files.conf.man.in diff -up cups-2.2.12/man/cups-files.conf.man.in.synconclose cups-2.2.12/man/cups-files.conf.man.in
index f5e6a9f..c3d8eeb 100644 --- cups-2.2.12/man/cups-files.conf.5.synconclose 2019-08-16 00:35:30.000000000 +0200
--- a/man/cups-files.conf.man.in +++ cups-2.2.12/man/cups-files.conf.5 2019-08-19 09:58:14.646567949 +0200
+++ b/man/cups-files.conf.man.in @@ -214,7 +214,7 @@ The default is "/var/run/cups" or "/etc/
@@ -214,7 +214,7 @@ The default is "/var/run/cups" or "/etc/cups" depending on the platform.
Specifies whether the scheduler calls Specifies whether the scheduler calls
.BR fsync (2) .BR fsync (2)
after writing configuration or state files. after writing configuration or state files.
@ -37,10 +34,9 @@ index f5e6a9f..c3d8eeb 100644
.\"#SystemGroup .\"#SystemGroup
.TP 5 .TP 5
\fBSystemGroup \fIgroup-name \fR[ ... \fIgroup-name\fR ] \fBSystemGroup \fIgroup-name \fR[ ... \fIgroup-name\fR ]
diff --git a/scheduler/conf.c b/scheduler/conf.c diff -up cups-2.2.12/scheduler/conf.c.synconclose cups-2.2.12/scheduler/conf.c
index 11c94d2..96993c7 100644 --- cups-2.2.12/scheduler/conf.c.synconclose 2019-08-19 09:58:14.647567941 +0200
--- a/scheduler/conf.c +++ cups-2.2.12/scheduler/conf.c 2019-08-19 09:59:36.066927455 +0200
+++ b/scheduler/conf.c
@@ -735,7 +735,7 @@ cupsdReadConfiguration(void) @@ -735,7 +735,7 @@ cupsdReadConfiguration(void)
RootCertDuration = 300; RootCertDuration = 300;
Sandboxing = CUPSD_SANDBOXING_STRICT; Sandboxing = CUPSD_SANDBOXING_STRICT;
@ -50,6 +46,3 @@ index 11c94d2..96993c7 100644
Timeout = 900; Timeout = 900;
WebInterface = CUPS_DEFAULT_WEBIF; WebInterface = CUPS_DEFAULT_WEBIF;
--
2.23.0

View File

@ -1,8 +1,7 @@
diff --git a/scheduler/main.c b/scheduler/main.c diff -up cups-2.2.12/scheduler/main.c.systemd-socket cups-2.2.12/scheduler/main.c
index e65060e..2764e6a 100644 --- cups-2.2.12/scheduler/main.c.systemd-socket 2019-08-16 00:35:30.000000000 +0200
--- a/scheduler/main.c +++ cups-2.2.12/scheduler/main.c 2019-08-19 09:31:09.703370325 +0200
+++ b/scheduler/main.c @@ -674,8 +674,16 @@ main(int argc, /* I - Number of comm
@@ -674,8 +674,16 @@ main(int argc, /* I - Number of command-line args */
#ifdef HAVE_ONDEMAND #ifdef HAVE_ONDEMAND
if (OnDemand) if (OnDemand)
@ -20,22 +19,9 @@ index e65060e..2764e6a 100644
#endif /* HAVE_ONDEMAND */ #endif /* HAVE_ONDEMAND */
if (fg) if (fg)
cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started in foreground."); cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started in foreground.");
diff --git a/scheduler/org.cups.cups-lpd.socket b/scheduler/org.cups.cups-lpd.socket diff -up cups-2.2.12/scheduler/org.cups.cupsd.path.in.systemd-socket cups-2.2.12/scheduler/org.cups.cupsd.path.in
index ed23f9d..eb84459 100644 --- cups-2.2.12/scheduler/org.cups.cupsd.path.in.systemd-socket 2019-08-16 00:35:30.000000000 +0200
--- a/scheduler/org.cups.cups-lpd.socket +++ cups-2.2.12/scheduler/org.cups.cupsd.path.in 2019-08-19 09:31:09.703370325 +0200
+++ b/scheduler/org.cups.cups-lpd.socket
@@ -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/scheduler/org.cups.cupsd.path.in b/scheduler/org.cups.cupsd.path.in
index 0f1cc46..7c8509f 100644
--- a/scheduler/org.cups.cupsd.path.in
+++ b/scheduler/org.cups.cupsd.path.in
@@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
[Unit] [Unit]
Description=CUPS Scheduler Description=CUPS Scheduler
@ -44,16 +30,15 @@ index 0f1cc46..7c8509f 100644
[Path] [Path]
PathExists=@CUPS_CACHEDIR@/org.cups.cupsd PathExists=@CUPS_CACHEDIR@/org.cups.cupsd
diff --git a/scheduler/org.cups.cupsd.service.in b/scheduler/org.cups.cupsd.service.in diff -up cups-2.2.12/scheduler/org.cups.cupsd.service.in.systemd-socket cups-2.2.12/scheduler/org.cups.cupsd.service.in
index 5273762..c4b2c4f 100644 --- cups-2.2.12/scheduler/org.cups.cupsd.service.in.systemd-socket 2019-08-19 09:31:09.703370325 +0200
--- a/scheduler/org.cups.cupsd.service.in +++ cups-2.2.12/scheduler/org.cups.cupsd.service.in 2019-08-19 09:54:58.890036404 +0200
+++ b/scheduler/org.cups.cupsd.service.in @@ -1,13 +1,13 @@
@@ -1,13 +1,14 @@
[Unit] [Unit]
Description=CUPS Scheduler Description=CUPS Scheduler
Documentation=man:cupsd(8) Documentation=man:cupsd(8)
+After=network.target -After=sssd.service
After=sssd.service +After=sssd.service network.target
[Service] [Service]
ExecStart=@sbindir@/cupsd -l ExecStart=@sbindir@/cupsd -l
@ -65,10 +50,9 @@ index 5273762..c4b2c4f 100644
-Also=org.cups.cupsd.socket org.cups.cupsd.path -Also=org.cups.cupsd.socket org.cups.cupsd.path
+Also=cups.socket cups.path +Also=cups.socket cups.path
WantedBy=printer.target WantedBy=printer.target
diff --git a/scheduler/org.cups.cupsd.socket.in b/scheduler/org.cups.cupsd.socket.in diff -up cups-2.2.12/scheduler/org.cups.cupsd.socket.in.systemd-socket cups-2.2.12/scheduler/org.cups.cupsd.socket.in
index 613b977..3c37d72 100644 --- cups-2.2.12/scheduler/org.cups.cupsd.socket.in.systemd-socket 2019-08-16 00:35:30.000000000 +0200
--- a/scheduler/org.cups.cupsd.socket.in +++ cups-2.2.12/scheduler/org.cups.cupsd.socket.in 2019-08-19 09:31:09.703370325 +0200
+++ b/scheduler/org.cups.cupsd.socket.in
@@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
[Unit] [Unit]
Description=CUPS Scheduler Description=CUPS Scheduler
@ -77,6 +61,14 @@ index 613b977..3c37d72 100644
[Socket] [Socket]
ListenStream=@CUPS_DEFAULT_DOMAINSOCKET@ 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
2.23.0 --- 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

View File

@ -26,8 +26,8 @@ diff -up cups-1.5b1/backend/usb-unix.c.uri-compat cups-1.5b1/backend/usb-unix.c
+ { + {
+ char *x = e + mfrlen; + char *x = e + mfrlen;
+ if (!strncmp (x, "%20", 3)) + if (!strncmp (x, "%20", 3))
+ /* Take mfr name out of mdl name for compatibility + /* Take mfr name out of mdl name for compatibility with
+ * before bug #507244 was fixed. */ + * Fedora 11 before bug #507244 was fixed. */
+ strcpy (e, x + 3); puts(fixed_uri); + strcpy (e, x + 3); puts(fixed_uri);
+ } + }
+ } + }

View File

@ -0,0 +1,19 @@
diff -up cups-1.7rc1/cgi-bin/admin.c.web-devices-timeout cups-1.7rc1/cgi-bin/admin.c
--- cups-1.7rc1/cgi-bin/admin.c.web-devices-timeout 2013-05-29 12:51:34.000000000 +0100
+++ cups-1.7rc1/cgi-bin/admin.c 2013-08-16 16:01:17.308264287 +0100
@@ -1019,13 +1019,13 @@ do_am_printer(http_t *http, /* I - HTTP
}
/*
- * Scan for devices for up to 30 seconds...
+ * Scan for devices for up to 10 seconds...
*/
fputs("DEBUG: Getting list of devices...\n", stderr);
current_device = 0;
- if (cupsGetDevices(http, 5, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE,
+ if (cupsGetDevices(http, 10, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE,
(cups_device_cb_t)choose_device_cb,
(void *)title) == IPP_OK)
{

13
cups-webui-uri.patch Normal file
View File

@ -0,0 +1,13 @@
diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c
index a87e6be..4600d33 100644
--- a/cgi-bin/admin.c
+++ b/cgi-bin/admin.c
@@ -974,6 +974,8 @@ do_am_printer(http_t *http, /* I - HTTP connection */
cgiSetVariable("TEMPLATE_NAME", template);
}
+
+ cgiSetVariable("DEVICE_URI", var);
}
}

View File

@ -1,16 +1,12 @@
diff --git a/scheduler/org.cups.cupsd.service.in b/scheduler/org.cups.cupsd.service.in diff -up cups-2.2.12/scheduler/org.cups.cupsd.service.in.ypbind cups-2.2.12/scheduler/org.cups.cupsd.service.in
index c4b2c4f..baa82b7 100644 --- cups-2.2.12/scheduler/org.cups.cupsd.service.in.ypbind 2019-08-19 10:00:47.586326493 +0200
--- a/scheduler/org.cups.cupsd.service.in +++ cups-2.2.12/scheduler/org.cups.cupsd.service.in 2019-08-19 10:01:39.295890076 +0200
+++ b/scheduler/org.cups.cupsd.service.in
@@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
[Unit] [Unit]
Description=CUPS Scheduler Description=CUPS Scheduler
Documentation=man:cupsd(8) Documentation=man:cupsd(8)
-After=network.target -After=sssd.service network.target
+After=network.target ypbind.service +After=sssd.service network.target ypbind.service
After=sssd.service
[Service] [Service]
-- ExecStart=@sbindir@/cupsd -l
2.23.0

View File

@ -1,6 +1,7 @@
%global cups_serverbin %{_exec_prefix}/lib/cups
Name: cups Name: cups
Epoch: 1 Epoch: 1
Version: 2.2.13 Version: 2.3.3
Release: 1 Release: 1
Summary: CUPS is the standards-based, open source printing system for linux operating systems. Summary: CUPS is the standards-based, open source printing system for linux operating systems.
License: GPLv2+ and LGPLv2+ with exceptions and AML License: GPLv2+ and LGPLv2+ with exceptions and AML
@ -12,32 +13,44 @@ Source3: cups.logrotate
Source4: ncp.backend Source4: ncp.backend
Source5: macros.cups Source5: macros.cups
Patch1: cups-no-gzip-man.patch Patch1: cups-system-auth.patch
Patch2: cups-system-auth.patch Patch2: cups-multilib.patch
Patch3: cups-multilib.patch Patch3: cups-banners.patch
Patch4: cups-banners.patch Patch4: cups-no-export-ssllibs.patch
Patch5: cups-no-export-ssllibs.patch Patch5: cups-direct-usb.patch
Patch6: cups-direct-usb.patch Patch6: cups-eggcups.patch
Patch7: cups-eggcups.patch Patch7: cups-driverd-timeout.patch
Patch8: cups-usb-paperout.patch Patch8: cups-logrotate.patch
Patch9: cups-uri-compat.patch Patch9: cups-usb-paperout.patch
Patch10: cups-hp-deviceid-oid.patch Patch10: cups-uri-compat.patch
Patch11: cups-ricoh-deviceid-oid.patch Patch11: cups-hp-deviceid-oid.patch
Patch12: cups-systemd-socket.patch Patch12: cups-ricoh-deviceid-oid.patch
Patch13: cups-freebind.patch Patch13: cups-systemd-socket.patch
Patch14: cups-ipp-multifile.patch Patch14: cups-freebind.patch
Patch15: cups-synconclose.patch Patch15: cups-ipp-multifile.patch
Patch16: cups-ypbind.patch Patch16: cups-web-devices-timeout.patch
Patch17: cups-lspp.patch Patch17: cups-synconclose.patch
Patch18: cups-lpr-help.patch Patch18: cups-ypbind.patch
Patch19: cups-filter-debug.patch Patch19: cups-lspp.patch
Patch20: cups-dymo-deviceid.patch Patch20: cups-failover-backend.patch
Patch21: custom-option-keywords-did-not.patch Patch21: cups-filter-debug.patch
Patch22: cups-dymo-deviceid.patch
Patch23: cups-autostart-when-enabled.patch
Patch24: cups-prioritize-print-color-mode.patch
Patch25: cups-ppdleak.patch
Patch26: cups-rastertopwg-crash.patch
Patch27: cups-etimedout.patch
Patch28: cups-webui-uri.patch
Patch29: cups-ipptool-mdns-uri.patch
Patch30: cups-manual-copies.patch
Provides: cupsddk cupsddk-drivers cups-filesystem cups-client cups-ipptool cups-lpd Provides: cupsddk cupsddk-drivers cups-filesystem cups-client cups-ipptool cups-lpd
Provides: lpd lpr /usr/bin/lpq /usr/bin/lpr /usr/bin/lp /usr/bin/cancel /usr/bin/lprm /usr/bin/lpstat Provides: lpd lpr /usr/bin/lpq /usr/bin/lpr /usr/bin/lp /usr/bin/cancel /usr/bin/lprm /usr/bin/lpstat
Obsoletes: cups-client cups-filesystem cups-lpd cups-ipptool Obsoletes: cups-client cups-filesystem cups-lpd cups-ipptool
Provides: cups-printerapp = %{version}-%{release}
Obsoletes: cups-printerapp < %{version}-%{release}
BuildRequires: pam-devel pkgconf-pkg-config pkgconfig(gnutls) libacl-devel openldap-devel pkgconfig(libusb-1.0) BuildRequires: pam-devel pkgconf-pkg-config pkgconfig(gnutls) libacl-devel openldap-devel pkgconfig(libusb-1.0)
BuildRequires: krb5-devel pkgconfig(avahi-client) systemd pkgconfig(libsystemd) pkgconfig(dbus-1) python3-cups BuildRequires: krb5-devel pkgconfig(avahi-client) systemd pkgconfig(libsystemd) pkgconfig(dbus-1) python3-cups
BuildRequires: automake zlib-devel gcc gcc-c++ libselinux-devel audit-libs-devel BuildRequires: automake zlib-devel gcc gcc-c++ libselinux-devel audit-libs-devel
@ -246,14 +259,18 @@ rm -f %{_exec_prefix}/lib/cups/backend/smb
%{_unitdir}/cups-lpd.socket %{_unitdir}/cups-lpd.socket
%{_unitdir}/cups-lpd@.service %{_unitdir}/cups-lpd@.service
%{_bindir}/cupstestppd %{_bindir}/cupstestppd
%{_bindir}/cupstestdsc %{_bindir}/ippeveprinter
#%%{_bindir}/cupstestdsc
%{_bindir}/ppd* %{_bindir}/ppd*
%{_bindir}/cancel* %{_bindir}/cancel*
%{_bindir}/lp* %{_bindir}/lp*
%{_bindir}/ipptool %{_bindir}/ipptool
%{_bindir}/ippfind %{_bindir}/ippfind
%{_bindir}/ippeveprinter
%{_sbindir}/* %{_sbindir}/*
%{_sbindir}/lpc.cups %dir %{cups_serverbin}/command
%{cups_serverbin}/command/ippevepcl
%{cups_serverbin}/command/ippeveps
%{_exec_prefix}/lib/cups/backend/* %{_exec_prefix}/lib/cups/backend/*
%{_exec_prefix}/lib/cups/cgi-bin %{_exec_prefix}/lib/cups/cgi-bin
@ -294,7 +311,7 @@ rm -f %{_exec_prefix}/lib/cups/backend/smb
%{_datadir}/cups/ipptool/* %{_datadir}/cups/ipptool/*
%files libs %files libs
%{license} LICENSE.txt %{license} LICENSE NOTICE
%{_libdir}/lib*.so.* %{_libdir}/lib*.so.*
%files devel %files devel
@ -305,13 +322,6 @@ rm -f %{_exec_prefix}/lib/cups/backend/smb
%files help %files help
%{_mandir}/man[1578]/* %{_mandir}/man[1578]/*
%{_mandir}/man1/cancel-cups.1.gz
%{_mandir}/man1/cups-config.1.gz
%{_mandir}/man1/ipptool.1.gz
%{_mandir}/man1/lp*.1.gz
%{_mandir}/man5/ipptoolfile.5.gz
%{_mandir}/man8/cups-lpd.8.gz
%{_mandir}/man8/lpc-cups.8.gz
%doc README.md CREDITS.md CHANGES.md %doc README.md CREDITS.md CHANGES.md
%doc %{_datadir}/%{name}/www/index.html %doc %{_datadir}/%{name}/www/index.html
@ -325,6 +335,12 @@ rm -f %{_exec_prefix}/lib/cups/backend/smb
%doc %{_datadir}/%{name}/www/apple-touch-icon.png %doc %{_datadir}/%{name}/www/apple-touch-icon.png
%changelog %changelog
* Mon Jul 20 2020 wangye <wang70@huawei.com> - 2.3.3-1
- Type:enhancement
- ID:NA
- SUG:NA
- DESC:upgrade to 2.3.3
* Fri Jun 12 2020 hanhui <hanhui15@huawei.com> - 2.2.13-1 * Fri Jun 12 2020 hanhui <hanhui15@huawei.com> - 2.2.13-1
- Type:enhancement - Type:enhancement
- ID:NA - ID:NA

View File

@ -1,44 +0,0 @@
diff --git a/cups/ppd.c b/cups/ppd.c
index fae19c42e..ff52df2e1 100644
--- a/cups/ppd.c
+++ b/cups/ppd.c
@@ -1874,9 +1874,9 @@ _ppdOpen(
{
if (!_cups_strcasecmp(name, "custom") || !_cups_strncasecmp(name, "custom.", 7))
{
- pg->ppd_status = PPD_ILLEGAL_OPTION_KEYWORD;
-
- goto error;
+ char cname[PPD_MAX_NAME]; /* Rewrite with a leading underscore */
+ snprintf(cname, sizeof(cname), "_%s", name);
+ strlcpy(name, cname, sizeof(name));
}
if ((size = ppdPageSize(ppd, name)) == NULL)
@@ -1903,9 +1903,9 @@ _ppdOpen(
{
if (!_cups_strcasecmp(name, "custom") || !_cups_strncasecmp(name, "custom.", 7))
{
- pg->ppd_status = PPD_ILLEGAL_OPTION_KEYWORD;
-
- goto error;
+ char cname[PPD_MAX_NAME]; /* Rewrite with a leading underscore */
+ snprintf(cname, sizeof(cname), "_%s", name);
+ strlcpy(name, cname, sizeof(name));
}
if ((size = ppdPageSize(ppd, name)) == NULL)
@@ -1939,9 +1939,9 @@ _ppdOpen(
if (!_cups_strcasecmp(name, "custom") || !_cups_strncasecmp(name, "custom.", 7))
{
- pg->ppd_status = PPD_ILLEGAL_OPTION_KEYWORD;
-
- goto error;
+ char cname[PPD_MAX_NAME]; /* Rewrite with a leading underscore */
+ snprintf(cname, sizeof(cname), "_%s", name);
+ strlcpy(name, cname, sizeof(name));
}
if (!strcmp(keyword, "PageSize"))