Apply patches on new stream/2.4.7

This commit is contained in:
kreiserlee 2024-06-11 14:22:41 +08:00
parent 2e3644b643
commit b3d75f7d37
34 changed files with 1887 additions and 278 deletions

View File

@ -23,6 +23,7 @@ CUPS_VERSION = @CUPS_VERSION@
AR = @AR@
AWK = @AWK@
CC = @LIBTOOL_CC@ @CC@
CC_FOR_BUILD = @CC_FOR_BUILD@
CHMOD = @CHMOD@
CXX = @LIBTOOL_CXX@ @CXX@
DSO = @DSO@
@ -263,7 +264,6 @@ USBQUIRKS = @USBQUIRKS@
# Rules...
#
.SILENT:
.SUFFIXES: .a .c .cxx .h .o
.c.o:

View File

@ -1889,7 +1889,7 @@ main(int argc, /* I - Number of command-line args */
if (ippContainsString(reasons, "document-format-error"))
ipp_status = IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR;
else if (ippContainsString(reasons, "document-unprintable"))
else if (ippContainsString(reasons, "document-unprintable-error"))
ipp_status = IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE;
ippDelete(response);
@ -2678,7 +2678,7 @@ monitor_printer(
new_reasons |= _CUPS_JSR_JOB_RELEASE_WAIT;
else if (!strcmp(attr->values[i].string.text, "document-format-error"))
new_reasons |= _CUPS_JSR_DOCUMENT_FORMAT_ERROR;
else if (!strcmp(attr->values[i].string.text, "document-unprintable"))
else if (!strcmp(attr->values[i].string.text, "document-unprintable-error"))
new_reasons |= _CUPS_JSR_DOCUMENT_UNPRINTABLE;
if (!job_canceled && (!strncmp(attr->values[i].string.text, "job-canceled-", 13) || !strcmp(attr->values[i].string.text, "aborted-by-system")))

View File

@ -1635,6 +1635,7 @@ do_config_server(http_t *http) /* I - HTTP connection */
int ch; /* Character from file */
char filename[1024]; /* Filename */
const char *server_root; /* Location of config files */
const char *data_dir; /* Location of data files */
/*
@ -1718,7 +1719,10 @@ do_config_server(http_t *http) /* I - HTTP connection */
* well...
*/
strlcat(filename, ".default", sizeof(filename));
if ((data_dir = getenv("CUPS_DATADIR")) == NULL)
data_dir = CUPS_DATADIR;
snprintf(filename, sizeof(filename), "%s/cupsd.conf.default",data_dir);
if (!stat(filename, &info) && info.st_size < (1024 * 1024) &&
(cupsd = cupsFileOpen(filename, "r")) != NULL)

View File

@ -70,7 +70,7 @@ install-data:
else \
$(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT) ; \
fi ; \
$(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT)/$$file.default; \
$(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(DATADIR)/$$file.default; \
done
$(INSTALL_DIR) -m 755 $(DATADIR)/mime
for file in $(REPLACE); do \
@ -118,9 +118,10 @@ install-libs:
#
uninstall:
for file in $(KEEP) $(REPLACE) cupsd.conf.default; do \
for file in $(KEEP) $(REPLACE); do \
$(RM) $(SERVERROOT)/$$file; \
done
$(RM) $(DATADIR)/cupsd.conf.default
-$(RMDIR) $(SERVERROOT)
for file in $(REPLACE); do \
$(RM) $(DATADIR)/mime/$$file; \

View File

@ -29,6 +29,10 @@ SystemGroup @CUPS_SYSTEM_GROUPS@
#ConfigFilePerm 0@CUPS_CONFIG_FILE_PERM@
#LogFilePerm 0@CUPS_LOG_FILE_PERM@
# Specifies the group name or ID that will be used for log files.
# The default group in Debian is "adm".
LogFileGroup adm
# Location of the file logging all access to the scheduler; may be the name
# "syslog". If not an absolute path, the value of ServerRoot is used as the
# root directory. Also see the "AccessLogLevel" directive in cupsd.conf.

View File

@ -44,6 +44,9 @@ application/postscript application/vnd.cups-postscript 66 pstops
application/vnd.cups-raster image/pwg-raster 100 rastertopwg
application/vnd.cups-raster image/urf 100 rastertopwg
# Needed for printing from iOS (AirPrint) clients
image/urf application/pdf 100 -
########################################################################
#
# Raw filter...

View File

@ -108,6 +108,9 @@ image/x-alias pix short(8,8) short(8,24)
image/x-bitmap bmp string(0,BM) + !printable(2,14)
image/x-icon ico
# Needed for printing from iOS (AirPrint) clients
image/urf urf string(0,UNIRAST<00>)
########################################################################
#
# Text files...

View File

@ -25,6 +25,16 @@ sinclude(config-scripts/cups-opsys.m4)
sinclude(config-scripts/cups-common.m4)
sinclude(config-scripts/cups-directories.m4)
sinclude(config-scripts/cups-manpages.m4)
AC_MSG_CHECKING([for build system compiler])
if test "$cross_compiling" = yes; then
CC_FOR_BUILD=${CC_FOR_BUILD-cc}
else
CC_FOR_BUILD=${CC}
fi
AC_MSG_RESULT(${CC_FOR_BUILD})
AC_SUBST(CC_FOR_BUILD)
sinclude(config-scripts/cups-sharedlibs.m4)
sinclude(config-scripts/cups-libtool.m4)
sinclude(config-scripts/cups-compiler.m4)

View File

@ -18,7 +18,7 @@ prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
includedir=@includedir@
libdir=@libdir@
libdir=${prefix}/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)
datarootdir=@datadir@
datadir=@datadir@
sysconfdir=@sysconfdir@
@ -30,7 +30,8 @@ INSTALLSTATIC=@INSTALLSTATIC@
# flags for compiler and linker...
CFLAGS=""
LDFLAGS="@EXPORT_LDFLAGS@"
LIBS="@LIBGSSAPI@ @DNSSDLIBS@ @EXPORT_TLSLIBS@ @LIBZ@ @LIBS@"
LIBGSSAPI=`[ ! -x /usr/bin/krb5-config ] || /usr/bin/krb5-config --libs`
LIBS="$LIBGSSAPI @DNSSDLIBS@ @EXPORT_SSLLIBS@ @LIBZ@ @LIBS@"
# Check for local invocation...
selfdir=`dirname $0`
@ -44,7 +45,7 @@ else
CFLAGS="$CFLAGS -I$includedir"
fi
if test $libdir != /usr/lib -a $libdir != /usr/lib32 -a $libdir != /usr/lib64; then
if test $libdir != /usr/lib -a $libdir != /usr/lib32 -a $libdir != /usr/lib64 -a $libdir != /usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH); then
LDFLAGS="$LDFLAGS -L$libdir"
fi
fi

View File

@ -58,7 +58,7 @@
#endif /* __APPLE__ */
#ifdef HAVE_DNSSD
# define _CUPS_DNSSD_GET_DESTS 250 /* Milliseconds for cupsGetDests */
# define _CUPS_DNSSD_GET_DESTS 1000 /* Milliseconds for cupsGetDests */
# define _CUPS_DNSSD_MAXTIME 50 /* Milliseconds for maximum quantum of time */
#else
# define _CUPS_DNSSD_GET_DESTS 0 /* Milliseconds for cupsGetDests */

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@ extern "C" {
* Constants...
*/
# define _PPD_CACHE_VERSION 11 /* Version number in cache file */
# define _PPD_CACHE_VERSION 12 /* Version number in cache file */
/*
@ -101,6 +101,16 @@ typedef enum _pwg_print_quality_e /**** PWG print-quality values ****/
_PWG_PRINT_QUALITY_MAX
} _pwg_print_quality_t;
typedef enum _pwg_print_content_optimize_e /** PWG print-content-optimize **/
{
_PWG_PRINT_CONTENT_OPTIMIZE_AUTO = 0, /* print-content-optimize=auto */
_PWG_PRINT_CONTENT_OPTIMIZE_PHOTO, /* print-content-optimize=photo */
_PWG_PRINT_CONTENT_OPTIMIZE_GRAPHICS, /* print-content-optimize=graphics */
_PWG_PRINT_CONTENT_OPTIMIZE_TEXT, /* print-content-optimize=text */
_PWG_PRINT_CONTENT_OPTIMIZE_TEXT_AND_GRAPHICS, /* ...=text-and-graphics */
_PWG_PRINT_CONTENT_OPTIMIZE_MAX
} _pwg_print_content_optimize_t;
typedef struct _pwg_finishings_s /**** PWG finishings mapping data ****/
{
ipp_finishings_t value; /* finishings value */
@ -131,6 +141,11 @@ struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/
/* Number of print-color-mode/print-quality options */
cups_option_t *presets[_PWG_PRINT_COLOR_MODE_MAX][_PWG_PRINT_QUALITY_MAX];
/* print-color-mode/print-quality options */
int num_optimize_presets[_PWG_PRINT_CONTENT_OPTIMIZE_MAX];
/* Number of print-content-optimize
options */
cups_option_t *optimize_presets[_PWG_PRINT_CONTENT_OPTIMIZE_MAX];
/* print-content-optimize options */
char *sides_option, /* PPD option for sides */
*sides_1sided, /* Choice for one-sided */
*sides_2sided_long, /* Choice for two-sided-long-edge */
@ -214,6 +229,8 @@ extern const char *_pwgMediaTypeForType(const char *media_type,
extern const char *_pwgPageSizeForMedia(pwg_media_t *media,
char *name, size_t namesize) _CUPS_PRIVATE;
extern void _ppdCacheAssignPresets(ppd_file_t *ppd, _ppd_cache_t *pc) _CUPS_PRIVATE;
/*
* C++ magic...

View File

@ -150,6 +150,8 @@ extern int _cups_strcasecmp(const char *, const char *) _CUPS_PRIVATE;
extern int _cups_strncasecmp(const char *, const char *, size_t n) _CUPS_PRIVATE;
extern char *_cups_strcasestr(const char *, const char *) _CUPS_PRIVATE;
# ifndef HAVE_STRLCAT
extern size_t _cups_strlcat(char *, const char *, size_t) _CUPS_PRIVATE;
# define strlcat _cups_strlcat

View File

@ -671,6 +671,36 @@ _cups_strncasecmp(const char *s, /* I - First string */
return (-1);
}
/*
* '_cups_strcasestr()' - Do a case-insensitive search for a sub-string.
*/
char * /* O - Pointer to found sub-string or
NULL if not found */
_cups_strcasestr(const char *haystack, /* I - String in which to searh */
const char *needle) /* I - Sub-string */
{
char cn, /* Character in needle */
ch; /* Character in haystack */
size_t len; /* Length of needle */
if ((cn = *needle++) != 0)
{
cn = _cups_tolower(cn);
len = strlen(needle);
do
{
do
{
if ((ch = *haystack++) == 0)
return (NULL);
} while (_cups_tolower(ch) != cn);
} while (_cups_strncasecmp(haystack, needle, len) != 0);
haystack --;
}
return ((char *)haystack);
}
#ifndef HAVE_STRLCAT
/*

View File

@ -417,8 +417,7 @@ main(int argc, /* I - Number of command-line arguments */
}
else
{
failures ++;
puts("FAIL");
puts("FAIL (Debian Reproducibility; failure allowed, as this is known to fail under reprotest");
}
/*

View File

@ -63,12 +63,18 @@ MAN8 = cupsaccept.8 \
lpmove.8 \
lpc.8
LANGUAGES=de fr pt
#
# Make everything...
#
all: $(MAN1) $(MAN5) $(MAN7) $(MAN8)
all: $(MAN1) $(MAN5) $(MAN7) $(MAN8) translations
translations:
# Update the translations and build the translated material
po4a --previous ../debian/manpage-po4a/cups.cfg
for lang in $(LANGUAGES); do $(MAKE) -C $$lang; done
#
@ -91,6 +97,12 @@ unittests:
clean:
$(RM) mantohtml mantohtml.o
$(RM) $(MAN1) $(MAN5) $(MAN7) $(MAN8)
for lang in $(LANGUAGES); do $(MAKE) -C $$lang clean; done
# Make sure the PO files are updated and remove generated
# translations.
po4a --previous --rm-translations ../debian/manpage-po4a/cups.cfg
$(RM) ../debian/manpage-po4a/po/cups.pot
#
@ -142,6 +154,7 @@ install-data: all
$(RM) $(MANDIR)/man8/$$file; \
$(LN) cupsd-helper.8 $(MANDIR)/man8/$$file; \
done
for lang in $(LANGUAGES); do $(MAKE) -C $$lang install; done
#
@ -189,7 +202,7 @@ uninstall:
for file in $(MAN8) cupsenable.8 cupsreject.8 cups-deviced.8 cups-driverd.8 cups-exec.8; do \
$(RM) $(MANDIR)/man8/$$file; \
done
-$(RMDIR) $(MANDIR)/man8
-$(RMDIR) $(AMANDIR)/man$(MAN8DIR)
#
@ -222,6 +235,5 @@ html: $(MAN1) $(MAN5) $(MAN7) $(MAN8) mantohtml
./mantohtml $$file >../doc/help/man-`basename $$file .8`.html; \
done
mantohtml: mantohtml.o ../cups/$(LIBCUPSSTATIC)
$(LD_CC) $(ARCHFLAGS) $(ALL_LDFLAGS) -o $@ mantohtml.o $(LINKCUPSSTATIC)
$(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@
mantohtml: mantohtml.c
$(CC_FOR_BUILD) -o $@ $<

235
man/Makefile.l10n Normal file
View File

@ -0,0 +1,235 @@
#
# Man page makefile for CUPS.
#
# Copyright © 2007-2019 by Apple Inc.
# Copyright © 1993-2006 by Easy Software Products.
#
# Licensed under Apache License v2.0. See the file "LICENSE" for more
# information.
#
include ../../Makedefs
#
# Man pages...
#
MAN1 = cancel.1 \
cups.1 \
cups-config.1 \
cupstestppd.1 \
ippeveprinter.1 \
$(IPPFIND_MAN) \
ipptool.1 \
lp.1 \
lpoptions.1 \
lpq.1 \
lprm.1 \
lpr.1 \
lpstat.1 \
ppdc.1 \
ppdhtml.1 \
ppdi.1 \
ppdmerge.1 \
ppdpo.1
MAN5 = classes.conf.5 \
client.conf.5 \
cups-files.conf.5 \
cups-snmp.conf.5 \
cupsd.conf.5 \
cupsd-logs.5 \
ipptoolfile.5 \
mailto.conf.5 \
mime.convs.5 \
mime.types.5 \
ppdcfile.5 \
printers.conf.5 \
subscriptions.conf.5
MAN7 = backend.7 \
filter.7 \
ippevepcl.7 \
notifier.7
MAN8 = cupsaccept.8 \
cupsctl.8 \
cupsfilter.8 \
cups-lpd.8 \
cups-snmp.8 \
cupsd.8 \
cupsd-helper.8 \
cupsenable.8 \
lpadmin.8 \
lpinfo.8 \
lpmove.8 \
lpc.8
#
# Make everything...
#
# Debian-specific patch: Just assume all files are here.
all:
#
# Make library targets...
#
libs:
#
# Make unit tests...
#
unittests:
#
# Clean all config and object files...
#
clean:
$(RM) mantohtml mantohtml.o
#
# Dummy depend target...
#
depend:
#
# Install all targets...
#
# Debian-specific patch: directory-based language namespace
MANDIR := $(MANDIR)/$(LANGUAGE)
install: all install-data install-headers install-libs install-exec
#
# Install data files...
#
# Debian-specific patch: skip if doesn't exist
install-data: all
echo Installing man pages in $(MANDIR)/man1...
$(INSTALL_DIR) -m 755 $(MANDIR)/man1
for file in $(MAN1); do \
[ ! -r $$file ] || \
$(INSTALL_MAN) $$file $(MANDIR)/man1; \
done
echo Installing man pages in $(MANDIR)/man5...
$(INSTALL_DIR) -m 755 $(MANDIR)/man5
for file in $(MAN5); do \
[ ! -r $$file ] || \
$(INSTALL_MAN) $$file $(MANDIR)/man5; \
done
echo Installing man pages in $(MANDIR)/man7...
$(INSTALL_DIR) -m 755 $(MANDIR)/man7
for file in $(MAN7); do \
[ ! -r $$file ] || \
$(INSTALL_MAN) $$file $(MANDIR)/man7; \
done
$(RM) $(MANDIR)/man7/ippeveps.7
$(LN) ippevepcl.7 $(MANDIR)/man7/ippeveps.7
echo Installing man pages in $(MANDIR)/man8...
$(INSTALL_DIR) -m 755 $(MANDIR)/man8
for file in $(MAN8); do \
[ ! -r $$file ] || \
$(INSTALL_MAN) $$file $(MANDIR)/man8; \
done
$(RM) $(MANDIR)/man8/cupsdisable.8
$(LN) cupsenable.8 $(MANDIR)/man8/cupsdisable.8
$(RM) $(MANDIR)/man8/cupsreject.8
$(LN) cupsaccept.8 $(MANDIR)/man8/cupsreject.8
for file in cups-deviced.8 cups-driverd.8 cups-exec.8; do \
$(RM) $(MANDIR)/man8/$$file; \
$(LN) cupsd-helper.8 $(MANDIR)/man8/$$file; \
done
#
# Install programs...
#
install-exec:
#
# Install headers...
#
install-headers:
#
# Install libraries...
#
install-libs:
#
# Uninstall files...
#
uninstall:
echo Uninstalling man pages from $(MANDIR)/man1...
for file in $(MAN1); do \
$(RM) $(MANDIR)/man1/$$file; \
done
-$(RMDIR) $(MANDIR)/man1
echo Uninstalling man pages from $(MANDIR)/man5...
for file in $(MAN5); do \
$(RM) $(MANDIR)/man5/$$file; \
done
-$(RMDIR) $(MANDIR)/man5
echo Uninstalling man pages from $(MANDIR)/man7...
for file in $(MAN7) ippeveps.7; do \
$(RM) $(MANDIR)/man7/$$file; \
done
-$(RMDIR) $(MANDIR)/man7
echo Uninstalling man pages from $(MANDIR)/man8...
for file in $(MAN8) cupsenable.8 cupsreject.8 cups-deviced.8 cups-driverd.8 cups-exec.8; do \
$(RM) $(MANDIR)/man8/$$file; \
done
-$(RMDIR) $(MANDIR)/man8
#
# Local programs (not built when cross-compiling...)
#
local: html
#
# Make html versions of man pages...
#
html: $(MAN1) $(MAN5) $(MAN7) $(MAN8) mantohtml
echo Converting man pages to HTML...
for file in $(MAN1); do \
echo " $$file..."; \
./mantohtml $$file >../doc/help/man-`basename $$file .1`.html; \
done
for file in $(MAN5); do \
echo " $$file..."; \
./mantohtml $$file >../doc/help/man-`basename $$file .5`.html; \
done
for file in $(MAN7); do \
echo " $$file..."; \
./mantohtml $$file >../doc/help/man-`basename $$file .7`.html; \
done
for file in $(MAN8); do \
echo " $$file..."; \
./mantohtml $$file >../doc/help/man-`basename $$file .8`.html; \
done
mantohtml: mantohtml.c
$(CC_FOR_BUILD) -o $@ $<

7
man/de/Makefile Normal file
View File

@ -0,0 +1,7 @@
#
# Man page makefile for the Common UNIX Printing System (CUPS).
#
LANGUAGE=de
include ../Makefile.l10n

7
man/fr/Makefile Normal file
View File

@ -0,0 +1,7 @@
#
# Man page makefile for the Common UNIX Printing System (CUPS).
#
LANGUAGE=fr
include ../Makefile.l10n

View File

@ -11,8 +11,10 @@
* Include necessary headers.
*/
#include <cups/string-private.h>
#include <cups/array-private.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@ -811,7 +813,8 @@ main(int argc, /* I - Number of command-line args */
* Anchor for HTML output...
*/
strlcpy(anchor, line + 4, sizeof(anchor));
strncpy(anchor, line + 4, sizeof(anchor) - 1);
anchor[sizeof(anchor) - 1] = '\0';
}
else if (strncmp(line, ".\\\"", 3))
{
@ -944,7 +947,8 @@ html_alternate(const char *s, /* I - String */
manfile[1024], // Man page filename
manurl[1024]; // Man page URL
strlcpy(name, s, sizeof(name));
strncpy(name, s, sizeof(name) - 1);
name[sizeof(name) - 1] = '\0';
if ((size_t)(end - s) < sizeof(name))
name[end - s] = '\0';

7
man/pt/Makefile Normal file
View File

@ -0,0 +1,7 @@
#
# Man page makefile for the Common UNIX Printing System (CUPS).
#
LANGUAGE=pt
include ../Makefile.l10n

View File

@ -105,7 +105,7 @@ cupsdAddIPMask(
cupsd_authmask_t temp; /* New host/domain mask */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, netmask=%x:%x:%x:%x)", masks, *masks, address[0], address[1], address[2], address[3], netmask[0], netmask[1], netmask[2], netmask[3]);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, netmask=%x:%x:%x:%x)", (void *)masks, (void *)*masks, address[0], address[1], address[2], address[3], netmask[0], netmask[1], netmask[2], netmask[3]);
temp.type = CUPSD_AUTH_IP;
memcpy(temp.mask.ip.address, address, sizeof(temp.mask.ip.address));
@ -158,7 +158,7 @@ void
cupsdAddName(cupsd_location_t *loc, /* I - Location to add to */
char *name) /* I - Name to add */
{
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")", loc, name);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")", (void *)loc, name);
if (!loc->names)
loc->names = cupsArrayNew3(NULL, NULL, NULL, 0,
@ -188,7 +188,7 @@ cupsdAddNameMask(cups_array_t **masks, /* IO - Masks array (created as needed) *
*ifptr; /* Pointer to end of name */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddNameMask(masks=%p(%p), name=\"%s\")", masks, *masks, name);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddNameMask(masks=%p(%p), name=\"%s\")", (void *)masks, (void *)*masks, name);
if (!_cups_strcasecmp(name, "@LOCAL"))
{
@ -274,7 +274,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
con->best = cupsdFindBest(con->uri, httpGetState(con->http));
con->type = CUPSD_AUTH_NONE;
cupsdLogClient(con, CUPSD_LOG_DEBUG2, "con->uri=\"%s\", con->best=%p(%s)", con->uri, con->best, con->best ? con->best->location : "");
cupsdLogClient(con, CUPSD_LOG_DEBUG2, "con->uri=\"%s\", con->best=%p(%s)", con->uri, (void *)con->best, con->best ? con->best->location : "");
if (con->best && con->best->type != CUPSD_AUTH_NONE)
{
@ -1143,7 +1143,7 @@ cupsdCheckGroup(
#endif /* HAVE_MBR_UID_TO_UUID */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")", username, user, groupname);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")", username, (void *)user, groupname);
/*
* Validate input...
@ -1558,7 +1558,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */
};
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)", con->uri, con->best, con->best ? con->best->location ? con->best->location : "(null)" : "");
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)", con->uri, (void *)con->best, con->best ? con->best->location ? con->best->location : "(null)" : "");
if (owner)
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: owner=\"%s\"", owner);
@ -2129,7 +2129,6 @@ check_admin_access(cupsd_client_t *con) // I - Client connection
free(snap_name);
g_clear_object(&snap);
# endif // CUPS_SNAP
done:
@ -2140,6 +2139,8 @@ check_admin_access(cupsd_client_t *con) // I - Client connection
return (ret);
#else
(void)con;
// No AppArmor/snapd to deal with...
return (1);
#endif // HAVE_LIBAPPARMOR && HAVE_LIBSNAPDGLIB

View File

@ -98,8 +98,6 @@ typedef struct
http_encryption_t encryption; /* To encrypt or not to encrypt... */
} cupsd_location_t;
typedef struct cupsd_client_s cupsd_client_t;
/*
* Globals...

View File

@ -430,6 +430,14 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */
con->file = -1;
}
if (con->bg_pending)
{
/*
* Don't close connection when there is a background thread pending
*/
partial = 1;
}
/*
* Close the socket and clear the file from the input set for select()...
*/

View File

@ -42,6 +42,8 @@ struct cupsd_client_s
*query_string; /* QUERY_STRING environment variable */
int file; /* Input/output file */
int file_ready; /* Input ready on file/pipe? */
int bg_pending; /* Background response pending? */
cupsd_printer_t *bg_printer; /* Background printer */
int pipe_pid; /* Pipe process ID (or 0 if not a pipe) */
http_status_t pipe_status; /* HTTP status from pipe process */
int sent_header, /* Non-zero if sent HTTP header */

View File

@ -1128,10 +1128,12 @@ cupsdReadConfiguration(void)
Group, 1, 1) < 0 ||
cupsdCheckPermissions(ServerRoot, "ssl", 0700, RunUser,
Group, 1, 0) < 0 ||
/* Never alter permissions of central conffile
cupsdCheckPermissions(ConfigurationFile, NULL, ConfigFilePerm, RunUser,
Group, 0, 0) < 0 ||
cupsdCheckPermissions(CupsFilesFile, NULL, ConfigFilePerm, RunUser,
Group, 0, 0) < 0 ||
*/
cupsdCheckPermissions(ServerRoot, "classes.conf", 0600, RunUser,
Group, 0, 0) < 0 ||
cupsdCheckPermissions(ServerRoot, "printers.conf", 0600, RunUser,

View File

@ -241,7 +241,6 @@ add_ppd(const char *filename, /* I - PPD filename */
const char *scheme) /* I - PPD scheme */
{
ppd_info_t *ppd; /* PPD */
char *recommended; /* Foomatic driver string */
/*
@ -279,15 +278,6 @@ add_ppd(const char *filename, /* I - PPD filename */
strlcpy(ppd->record.device_id, device_id, sizeof(ppd->record.device_id));
strlcpy(ppd->record.scheme, scheme, sizeof(ppd->record.scheme));
/*
* Strip confusing (and often wrong) "recommended" suffix added by
* Foomatic drivers...
*/
if ((recommended = strstr(ppd->record.make_and_model,
" (recommended)")) != NULL)
*recommended = '\0';
/*
* Add the PPD to the PPD arrays...
*/

View File

@ -99,6 +99,15 @@ extern const char *cups_hstrerror(int);
#endif /* _MAIN_C */
/*
* Base types...
*/
typedef struct cupsd_client_s cupsd_client_t;
typedef struct cupsd_job_s cupsd_job_t;
typedef struct cupsd_printer_s cupsd_printer_t;
/*
* Other stuff for the scheduler...
*/

View File

@ -73,7 +73,7 @@ static void copy_subscription_attrs(cupsd_client_t *con,
cups_array_t *ra,
cups_array_t *exclude);
static void create_job(cupsd_client_t *con, ipp_attribute_t *uri);
static void *create_local_bg_thread(cupsd_printer_t *printer);
static void *create_local_bg_thread(cupsd_client_t *con);
static void create_local_printer(cupsd_client_t *con);
static cups_array_t *create_requested_array(ipp_t *request);
static void create_subscriptions(cupsd_client_t *con, ipp_attribute_t *uri);
@ -111,6 +111,7 @@ static void send_document(cupsd_client_t *con, ipp_attribute_t *uri);
static void send_http_error(cupsd_client_t *con, http_status_t status,
cupsd_printer_t *printer);
static void send_ipp_status(cupsd_client_t *con, ipp_status_t status, const char *message, ...) _CUPS_FORMAT(3, 4);
static int send_response(cupsd_client_t *con);
static void set_default(cupsd_client_t *con, ipp_attribute_t *uri);
static void set_job_attrs(cupsd_client_t *con, ipp_attribute_t *uri);
static void set_printer_attrs(cupsd_client_t *con, ipp_attribute_t *uri);
@ -143,7 +144,7 @@ cupsdProcessIPPRequest(
int valid = 1; /* Valid request? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdProcessIPPRequest(%p[%d]): operation_id=%04x(%s)", con, con->number, con->request->request.op.operation_id, ippOpString(con->request->request.op.operation_id));
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdProcessIPPRequest(%p[%d]): operation_id=%04x(%s)", (void *)con, con->number, con->request->request.op.operation_id, ippOpString(con->request->request.op.operation_id));
if (LogLevel >= CUPSD_LOG_DEBUG2)
{
@ -615,68 +616,13 @@ cupsdProcessIPPRequest(
}
}
if (con->response)
if (!con->bg_pending && con->response)
{
/*
* Sending data from the scheduler...
*/
cupsdLogClient(con, con->response->request.status.status_code >= IPP_STATUS_ERROR_BAD_REQUEST && con->response->request.status.status_code != IPP_STATUS_ERROR_NOT_FOUND ? CUPSD_LOG_ERROR : CUPSD_LOG_DEBUG, "Returning IPP %s for %s (%s) from %s.", ippErrorString(con->response->request.status.status_code), ippOpString(con->request->request.op.operation_id), uri ? uri->values[0].string.text : "no URI", con->http->hostname);
httpClearFields(con->http);
#ifdef CUPSD_USE_CHUNKING
/*
* Because older versions of CUPS (1.1.17 and older) and some IPP
* clients do not implement chunking properly, we cannot use
* chunking by default. This may become the default in future
* CUPS releases, or we might add a configuration directive for
* it.
*/
if (con->http->version == HTTP_1_1)
{
cupsdLogClient(con, CUPSD_LOG_DEBUG, "Transfer-Encoding: chunked");
cupsdSetLength(con->http, 0);
}
else
#endif /* CUPSD_USE_CHUNKING */
{
size_t length; /* Length of response */
length = ippLength(con->response);
if (con->file >= 0 && !con->pipe_pid)
{
struct stat fileinfo; /* File information */
if (!fstat(con->file, &fileinfo))
length += (size_t)fileinfo.st_size;
}
cupsdLogClient(con, CUPSD_LOG_DEBUG, "Content-Length: " CUPS_LLFMT, CUPS_LLCAST length);
httpSetLength(con->http, length);
}
if (cupsdSendHeader(con, HTTP_OK, "application/ipp", CUPSD_AUTH_NONE))
{
/*
* Tell the caller the response header was sent successfully...
*/
cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient, (cupsd_selfunc_t)cupsdWriteClient, con);
return (1);
}
else
{
/*
* Tell the caller the response header could not be sent...
*/
return (0);
}
return (send_response(con));
}
else
{
@ -747,7 +693,7 @@ accept_jobs(cupsd_client_t *con, /* I - Client connection */
cupsd_printer_t *printer; /* Printer data */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "accept_jobs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "accept_jobs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -832,7 +778,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */
int need_restart_job; /* Need to restart job? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_class(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_class(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -1142,7 +1088,7 @@ add_file(cupsd_client_t *con, /* I - Connection to client */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"add_file(con=%p[%d], job=%d, filetype=%s/%s, "
"compression=%d)", con, con ? con->number : -1, job->id,
"compression=%d)", (void *)con, con ? con->number : -1, job->id,
filetype->super, filetype->type, compression);
/*
@ -1245,8 +1191,8 @@ add_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))",
con, con->number, printer, printer->name,
filetype, filetype ? filetype->super : "none",
(void *)con, con->number, (void *)printer, printer->name,
(void *)filetype, filetype ? filetype->super : "none",
filetype ? filetype->type : "none");
/*
@ -2226,7 +2172,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
set_port_monitor; /* Did we set the port monitor? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -2717,8 +2663,21 @@ add_printer(cupsd_client_t *con, /* I - Client connection */
return;
}
// Run a background thread to create the PPD...
_cupsThreadCreate((_cups_thread_func_t)create_local_bg_thread, printer);
if (!printer->printer_id)
printer->printer_id = NextPrinterId ++;
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
cupsdSetPrinterAttrs(printer);
/* Run a background thread to create the PPD... */
cupsdLogClient(con, CUPSD_LOG_DEBUG, "Creating PPD in background thread.");
con->bg_pending = 1;
con->bg_printer = printer;
_cupsThreadCreate((_cups_thread_func_t)create_local_bg_thread, con);
return;
}
else if (!strcmp(ppd_name, "raw"))
{
@ -2883,7 +2842,7 @@ add_printer_state_reasons(
{
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"add_printer_state_reasons(%p[%d], %p[%s])",
con, con->number, p, p->name);
(void *)con, con->number, (void *)p, p->name);
if (p->num_reasons == 0)
ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
@ -2909,7 +2868,7 @@ add_queued_job_count(
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_queued_job_count(%p[%d], %p[%s])",
con, con->number, p, p->name);
(void *)con, con->number, (void *)p, p->name);
count = cupsdGetPrinterJobCount(p->name);
@ -2999,7 +2958,7 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "authenticate_job(%p[%d], %s)",
con, con->number, uri->values[0].string.text);
(void *)con, con->number, uri->values[0].string.text);
/*
* Start with "everything is OK" status...
@ -3177,7 +3136,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */
cupsd_job_t *job; /* Job */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_all_jobs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_all_jobs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -3414,7 +3373,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */
cupsd_jobaction_t purge; /* Purge the job? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_job(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_job(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -3615,7 +3574,7 @@ cancel_subscription(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cancel_subscription(con=%p[%d], sub_id=%d)",
con, con->number, sub_id);
(void *)con, con->number, sub_id);
/*
* Is the subscription ID valid?
@ -3721,7 +3680,7 @@ check_quotas(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "check_quotas(%p[%d], %p[%s])",
con, con->number, p, p->name);
(void *)con, con->number, (void *)p, p->name);
/*
* Figure out who is printing...
@ -3943,7 +3902,7 @@ close_job(cupsd_client_t *con, /* I - Client connection */
username[256]; /* User name */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "close_job(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "close_job(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -4063,7 +4022,7 @@ copy_attrs(ipp_t *to, /* I - Destination request */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"copy_attrs(to=%p, from=%p, ra=%p, group=%x, quickcopy=%d)",
to, from, ra, group, quickcopy);
(void *)to, (void *)from, (void *)ra, group, quickcopy);
if (!to || !from)
return;
@ -4147,7 +4106,7 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"copy_banner(con=%p[%d], job=%p[%d], name=\"%s\")",
con, con ? con->number : -1, job, job->id,
(void *)con, con ? con->number : -1, (void *)job, job->id,
name ? name : "(null)");
/*
@ -4492,7 +4451,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */
/* cupsProtocol attribute */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_model(con=%p, from=\"%s\", to=\"%s\")", con, from, to);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_model(con=%p, from=\"%s\", to=\"%s\")", (void *)con, from, to);
/*
* Run cups-driverd to get the PPD file...
@ -5106,7 +5065,7 @@ copy_subscription_attrs(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"copy_subscription_attrs(con=%p, sub=%p, ra=%p, exclude=%p)",
con, sub, ra, exclude);
(void *)con, (void *)sub, (void *)ra, (void *)exclude);
/*
* Copy the subscription attributes to the response using the
@ -5220,7 +5179,7 @@ create_job(cupsd_client_t *con, /* I - Client connection */
};
cupsdLogMessage(CUPSD_LOG_DEBUG2, "create_job(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "create_job(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -5285,11 +5244,14 @@ create_job(cupsd_client_t *con, /* I - Client connection */
static void * /* O - Exit status */
create_local_bg_thread(
cupsd_printer_t *printer) /* I - Printer */
cupsd_client_t *con) /* I - Client */
{
cupsd_printer_t *printer = con->bg_printer;
/* Printer */
cups_file_t *from, /* Source file */
*to; /* Destination file */
char fromppd[1024], /* Source PPD */
char device_uri[1024], /* Device URI */
fromppd[1024], /* Source PPD */
toppd[1024], /* Destination PPD */
scheme[32], /* URI scheme */
userpass[256], /* User:pass */
@ -5301,7 +5263,7 @@ create_local_bg_thread(
http_encryption_t encryption; /* Type of encryption to use */
http_t *http; /* Connection to printer */
ipp_t *request, /* Request to printer */
*response; /* Response from printer */
*response = NULL; /* Response from printer */
ipp_attribute_t *attr; /* Attribute in response */
ipp_status_t status; /* Status code */
static const char * const pattrs[] = /* Printer attributes we need */
@ -5315,26 +5277,47 @@ create_local_bg_thread(
* Try connecting to the printer...
*/
cupsdLogMessage(CUPSD_LOG_DEBUG, "%s: Generating PPD file from \"%s\"...", printer->name, printer->device_uri);
_cupsRWLockRead(&printer->lock);
strlcpy(device_uri, printer->device_uri, sizeof(device_uri));
_cupsRWUnlock(&printer->lock);
cupsdLogMessage(CUPSD_LOG_DEBUG, "%s: Generating PPD file from \"%s\"...", printer->name, device_uri);
if (strstr(printer->device_uri, "._tcp"))
if (strstr(device_uri, "._tcp"))
{
cupsdLogMessage(CUPSD_LOG_DEBUG2, "%s: Resolving mDNS URI \"%s\".", printer->name, printer->device_uri);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "%s: Resolving mDNS URI \"%s\".", printer->name, device_uri);
if (!_httpResolveURI(printer->device_uri, uri, sizeof(uri), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
if (!_httpResolveURI(device_uri, uri, sizeof(uri), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
{
cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Couldn't resolve mDNS URI \"%s\".", printer->name, printer->device_uri);
return (NULL);
cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Couldn't resolve mDNS URI \"%s\".", printer->name, device_uri);
/* Force printer to timeout and be deleted */
_cupsRWLockWrite(&printer->lock);
printer->state_time = 0;
_cupsRWUnlock(&printer->lock);
send_ipp_status(con, IPP_STATUS_ERROR_DEVICE, _("Couldn't resolve mDNS URI \"%s\"."), printer->device_uri);
goto finish_response;
}
_cupsRWLockWrite(&printer->lock);
cupsdSetString(&printer->device_uri, uri);
_cupsRWUnlock(&printer->lock);
strlcpy(device_uri, uri, sizeof(device_uri));
}
if (httpSeparateURI(HTTP_URI_CODING_ALL, printer->device_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
if (httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
{
cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Bad device URI \"%s\".", printer->name, printer->device_uri);
return (NULL);
cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Bad device URI \"%s\".", printer->name, device_uri);
/* Force printer to timeout and be deleted */
_cupsRWLockWrite(&printer->lock);
printer->state_time = 0;
_cupsRWUnlock(&printer->lock);
send_ipp_status(con, IPP_STATUS_ERROR_DEVICE, _("Bad device URI \"%s\"."), device_uri);
goto finish_response;
}
if (!strcmp(scheme, "ipps") || port == 443)
@ -5345,7 +5328,14 @@ create_local_bg_thread(
if ((http = httpConnect2(host, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL)) == NULL)
{
cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Unable to connect to %s:%d: %s", printer->name, host, port, cupsLastErrorString());
return (NULL);
/* Force printer to timeout and be deleted */
_cupsRWLockWrite(&printer->lock);
printer->state_time = 0;
_cupsRWUnlock(&printer->lock);
send_ipp_status(con, IPP_STATUS_ERROR_DEVICE, _("Unable to connect to %s:%d: %s"), host, port, cupsLastErrorString());
goto finish_response;
}
/*
@ -5389,6 +5379,7 @@ create_local_bg_thread(
* If we did not succeed to obtain the "media-col-database" attribute
* try to get it separately
*/
if (ippFindAttribute(response, "media-col-database", IPP_TAG_ZERO) ==
NULL)
{
@ -5447,17 +5438,29 @@ create_local_bg_thread(
if ((from = cupsFileOpen(fromppd, "r")) == NULL)
{
cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Unable to read generated PPD: %s", printer->name, strerror(errno));
ippDelete(response);
return (NULL);
/* Force printer to timeout and be deleted */
_cupsRWLockWrite(&printer->lock);
printer->state_time = 0;
_cupsRWUnlock(&printer->lock);
send_ipp_status(con, IPP_STATUS_ERROR_DEVICE, _("Unable to read generated PPD: %s"), strerror(errno));
goto finish_response;
}
snprintf(toppd, sizeof(toppd), "%s/ppd/%s.ppd", ServerRoot, printer->name);
if ((to = cupsdCreateConfFile(toppd, ConfigFilePerm)) == NULL)
{
cupsdLogMessage(CUPSD_LOG_ERROR, "%s: Unable to create PPD for printer: %s", printer->name, strerror(errno));
ippDelete(response);
cupsFileClose(from);
return (NULL);
/* Force printer to timeout and be deleted */
_cupsRWLockWrite(&printer->lock);
printer->state_time = 0;
_cupsRWUnlock(&printer->lock);
send_ipp_status(con, IPP_STATUS_ERROR_DEVICE, _("Unable to create PPD for printer: %s"), strerror(errno));
goto finish_response;
}
while (cupsFileGets(from, line, sizeof(line)))
@ -5466,10 +5469,14 @@ create_local_bg_thread(
cupsFileClose(from);
if (!cupsdCloseCreatedConfFile(to, toppd))
{
_cupsRWLockWrite(&printer->lock);
printer->config_time = time(NULL);
printer->state = IPP_PSTATE_IDLE;
printer->accepting = 1;
_cupsRWUnlock(&printer->lock);
cupsdSetPrinterAttrs(printer);
cupsdAddEvent(CUPSD_EVENT_PRINTER_CONFIG, printer, NULL, "Printer \"%s\" is now available.", printer->name);
@ -5477,10 +5484,39 @@ create_local_bg_thread(
}
}
else
{
cupsdLogMessage(CUPSD_LOG_ERROR, "%s: PPD creation failed: %s", printer->name, cupsLastErrorString());
/* Force printer to timeout and be deleted */
_cupsRWLockWrite(&printer->lock);
printer->state_time = 0;
_cupsRWUnlock(&printer->lock);
send_ipp_status(con, IPP_STATUS_ERROR_DEVICE, _("Unable to create PPD: %s"), cupsLastErrorString());
goto finish_response;
}
/*
* Respond to the client...
*/
send_ipp_status(con, IPP_STATUS_OK, _("Local printer created."));
ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs", (char)printer->accepting);
ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", (int)printer->state);
add_printer_state_reasons(con, printer);
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), httpIsEncrypted(con->http) ? "ipps" : "ipp", NULL, con->clientname, con->clientport, "/printers/%s", printer->name);
ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri);
finish_response:
ippDelete(response);
send_response(con);
con->bg_pending = 0;
return (NULL);
}
@ -5592,10 +5628,21 @@ create_local_printer(
if ((printer = cupsdFindDest(name)) != NULL)
{
send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Printer \"%s\" already exists."), name);
printer->state_time = time(NULL);
send_ipp_status(con, IPP_STATUS_OK, _("Printer \"%s\" already exists."), name);
goto add_printer_attributes;
}
for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); printer; printer = (cupsd_printer_t *)cupsArrayNext(Printers))
{
if (printer->device_uri && !strcmp(ptr, printer->device_uri))
{
printer->state_time = time(NULL);
send_ipp_status(con, IPP_STATUS_OK, _("Printer \"%s\" already exists."), printer->name);
goto add_printer_attributes;
}
}
/*
* Create the printer...
*/
@ -5682,14 +5729,17 @@ create_local_printer(
* Run a background thread to create the PPD...
*/
_cupsThreadCreate((_cups_thread_func_t)create_local_bg_thread, printer);
con->bg_pending = 1;
con->bg_printer = printer;
_cupsThreadCreate((_cups_thread_func_t)create_local_bg_thread, con);
return;
/*
* Return printer attributes...
*/
send_ipp_status(con, IPP_STATUS_OK, _("Local printer created."));
add_printer_attributes:
ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs", (char)printer->accepting);
@ -5795,7 +5845,7 @@ create_subscriptions(
* Is the destination valid?
*/
cupsdLogMessage(CUPSD_LOG_DEBUG, "create_subscriptions(con=%p(%d), uri=\"%s\")", con, con->number, uri->values[0].string.text);
cupsdLogMessage(CUPSD_LOG_DEBUG, "create_subscriptions(con=%p(%d), uri=\"%s\")", (void *)con, con->number, uri->values[0].string.text);
httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme,
sizeof(scheme), userpass, sizeof(userpass), host,
@ -6143,7 +6193,7 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */
int temporary; /* Temporary queue? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "delete_printer(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "delete_printer(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -6256,7 +6306,7 @@ get_default(cupsd_client_t *con) /* I - Client connection */
cups_array_t *ra; /* Requested attributes array */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", con, con->number);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", (void *)con, con->number);
/*
* Check policy...
@ -6306,7 +6356,7 @@ get_devices(cupsd_client_t *con) /* I - Client connection */
/* String for included schemes */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->number);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", (void *)con, con->number);
/*
* Check policy...
@ -6399,7 +6449,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */
format[1024]; /* Format for document */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_document(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_document(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -6546,7 +6596,7 @@ get_job_attrs(cupsd_client_t *con, /* I - Client connection */
*exclude; /* Private attributes array */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_job_attrs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_job_attrs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -6677,7 +6727,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
cupsd_policy_t *policy; /* Current policy */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->number,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", (void *)con, con->number,
uri->values[0].string.text);
/*
@ -6988,7 +7038,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"get_jobs: job->id=%d, dest=\"%s\", username=\"%s\", "
"state_value=%d, attrs=%p", job->id, job->dest,
job->username, job->state_value, job->attrs);
job->username, job->state_value, (void *)job->attrs);
if (!job->dest || !job->username)
cupsdLoadJob(job);
@ -7067,7 +7117,7 @@ get_notifications(cupsd_client_t *con) /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_notifications(con=%p[%d])",
con, con->number);
(void *)con, con->number);
/*
* Get subscription attributes...
@ -7200,8 +7250,8 @@ get_ppd(cupsd_client_t *con, /* I - Client connection */
cups_ptype_t dtype; /* Destination type */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppd(%p[%d], %p[%s=%s])", con,
con->number, uri, uri->name, uri->values[0].string.text);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppd(%p[%d], %p[%s=%s])", (void *)con,
con->number, (void *)uri, uri->name, uri->values[0].string.text);
if (!strcmp(ippGetName(uri), "ppd-name"))
{
@ -7373,7 +7423,7 @@ get_ppds(cupsd_client_t *con) /* I - Client connection */
/* String for included schemes */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->number);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", (void *)con, con->number);
/*
* Check policy...
@ -7517,7 +7567,7 @@ get_printer_attrs(cupsd_client_t *con, /* I - Client connection */
cups_array_t *ra; /* Requested attributes array */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_attrs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_attrs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -7573,7 +7623,7 @@ get_printer_supported(
cupsd_printer_t *printer; /* Printer/class */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_supported(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_supported(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -7643,7 +7693,7 @@ get_printers(cupsd_client_t *con, /* I - Client connection */
int local; /* Local connection? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printers(%p[%d], %x)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printers(%p[%d], %x)", (void *)con,
con->number, type);
/*
@ -7804,7 +7854,7 @@ get_subscription_attrs(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"get_subscription_attrs(con=%p[%d], sub_id=%d)",
con, con->number, sub_id);
(void *)con, con->number, sub_id);
/*
* Expire subscriptions as needed...
@ -7891,7 +7941,7 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"get_subscriptions(con=%p[%d], uri=%s)",
con, con->number, uri->values[0].string.text);
(void *)con, con->number, uri->values[0].string.text);
/*
* Is the destination valid?
@ -8059,7 +8109,7 @@ hold_job(cupsd_client_t *con, /* I - Client connection */
cupsd_job_t *job; /* Job information */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", con, con->number,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", (void *)con, con->number,
uri->values[0].string.text);
/*
@ -8190,7 +8240,7 @@ hold_new_jobs(cupsd_client_t *con, /* I - Connection */
cupsd_printer_t *printer; /* Printer data */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_new_jobs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_new_jobs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -8267,7 +8317,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */
*dprinter; /* Destination printer */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", con, con->number,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", (void *)con, con->number,
uri->values[0].string.text);
/*
@ -8596,7 +8646,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */
int compression; /* Document compression */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", con, con->number,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", (void *)con, con->number,
uri->values[0].string.text);
/*
@ -9047,7 +9097,7 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *attr; /* printer-state-message text */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "reject_jobs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "reject_jobs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -9129,7 +9179,7 @@ release_held_new_jobs(
cupsd_printer_t *printer; /* Printer data */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_held_new_jobs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_held_new_jobs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -9202,7 +9252,7 @@ release_job(cupsd_client_t *con, /* I - Client connection */
cupsd_job_t *job; /* Job information */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_job(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_job(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -9339,7 +9389,7 @@ renew_subscription(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"renew_subscription(con=%p[%d], sub_id=%d)",
con, con->number, sub_id);
(void *)con, con->number, sub_id);
/*
* Is the subscription ID valid?
@ -9426,7 +9476,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */
int port; /* Port portion of URI */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "restart_job(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "restart_job(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -9777,7 +9827,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */
int start_job; /* Start the job? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_document(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_document(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -10288,6 +10338,82 @@ send_ipp_status(cupsd_client_t *con, /* I - Client connection */
}
/*
* 'send_response()' - Send the IPP response.
*/
static int /* O - 1 on success, 0 on failure */
send_response(cupsd_client_t *con) /* I - Client */
{
ipp_attribute_t *uri; /* Target URI */
int ret = 0; /* Return value */
static _cups_mutex_t mutex = _CUPS_MUTEX_INITIALIZER;
/* Mutex for logging/access */
_cupsMutexLock(&mutex);
if ((uri = ippFindAttribute(con->request, "printer-uri", IPP_TAG_URI)) == NULL)
{
if ((uri = ippFindAttribute(con->request, "job-uri", IPP_TAG_URI)) == NULL)
uri = ippFindAttribute(con->request, "ppd-name", IPP_TAG_NAME);
}
cupsdLogClient(con, con->response->request.status.status_code >= IPP_STATUS_ERROR_BAD_REQUEST && con->response->request.status.status_code != IPP_STATUS_ERROR_NOT_FOUND ? CUPSD_LOG_ERROR : CUPSD_LOG_DEBUG, "Returning IPP %s for %s (%s) from %s.", ippErrorString(con->response->request.status.status_code), ippOpString(con->request->request.op.operation_id), uri ? uri->values[0].string.text : "no URI", con->http->hostname);
httpClearFields(con->http);
#ifdef CUPSD_USE_CHUNKING
/*
* Because older versions of CUPS (1.1.17 and older) and some IPP
* clients do not implement chunking properly, we cannot use
* chunking by default. This may become the default in future
* CUPS releases, or we might add a configuration directive for
* it.
*/
if (con->http->version == HTTP_1_1)
{
cupsdLogClient(con, CUPSD_LOG_DEBUG, "Transfer-Encoding: chunked");
cupsdSetLength(con->http, 0);
}
else
#endif /* CUPSD_USE_CHUNKING */
{
size_t length; /* Length of response */
length = ippLength(con->response);
if (con->file >= 0 && !con->pipe_pid)
{
struct stat fileinfo; /* File information */
if (!fstat(con->file, &fileinfo))
length += (size_t)fileinfo.st_size;
}
cupsdLogClient(con, CUPSD_LOG_DEBUG, "Content-Length: " CUPS_LLFMT, CUPS_LLCAST length);
httpSetLength(con->http, length);
}
if (cupsdSendHeader(con, HTTP_STATUS_OK, "application/ipp", CUPSD_AUTH_NONE))
{
/*
* Tell the caller the response header was sent successfully...
*/
cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient, (cupsd_selfunc_t)cupsdWriteClient, con);
ret = 1;
}
_cupsMutexUnlock(&mutex);
return (ret);
}
/*
* 'set_default()' - Set the default destination...
*/
@ -10302,7 +10428,7 @@ set_default(cupsd_client_t *con, /* I - Client connection */
*oldprinter; /* Old default printer */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_default(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_default(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -10384,7 +10510,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */
int check_jobs; /* Check jobs? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_job_attrs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_job_attrs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -10764,7 +10890,7 @@ set_printer_attrs(cupsd_client_t *con, /* I - Client connection */
int changed = 0; /* Was anything changed? */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_attrs(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_attrs(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -11110,7 +11236,7 @@ start_printer(cupsd_client_t *con, /* I - Client connection */
cupsd_printer_t *printer; /* Printer data */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_printer(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_printer(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -11192,7 +11318,7 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *attr; /* printer-state-message attribute */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_printer(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_printer(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -11434,7 +11560,7 @@ validate_job(cupsd_client_t *con, /* I - Client connection */
cupsd_printer_t *printer; /* Printer */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_job(%p[%d], %s)", con,
cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_job(%p[%d], %s)", (void *)con,
con->number, uri->values[0].string.text);
/*
@ -11627,7 +11753,7 @@ validate_user(cupsd_job_t *job, /* I - Job */
cupsd_printer_t *printer; /* Printer for job */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, userlen=" CUPS_LLFMT ")", job->id, con ? con->number : 0, owner ? owner : "(null)", username, CUPS_LLCAST userlen);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, userlen=" CUPS_LLFMT ")", job->id, con ? con->number : 0, owner ? owner : "(null)", (void *)username, CUPS_LLCAST userlen);
/*
* Validate input...

View File

@ -3653,9 +3653,13 @@ get_options(cupsd_job_t *job, /* I - Job */
cups_option_t *pwgppds, /* PWG->PPD options */
*pwgppd, /* Current PWG->PPD option */
*preset; /* Current preset option */
int print_color_mode,
int print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR,
/* Output mode (if any) */
print_quality; /* Print quality (if any) */
print_quality = _PWG_PRINT_QUALITY_NORMAL,
/* Print quality (if any) */
print_content_optimize =
_PWG_PRINT_CONTENT_OPTIMIZE_AUTO;
/* Print content type (if any)*/
const char *ppd; /* PPD option choice */
int exact; /* Did we get an exact match? */
static char *options = NULL;/* Full list of options */
@ -3677,7 +3681,7 @@ get_options(cupsd_job_t *job, /* I - Job */
if (pc &&
!ippFindAttribute(job->attrs, "com.apple.print.DocumentTicket.PMSpoolFormat", IPP_TAG_ZERO) &&
!ippFindAttribute(job->attrs, "APPrinterPreset", IPP_TAG_ZERO) &&
(ippFindAttribute(job->attrs, "print-color-mode", IPP_TAG_ZERO) || ippFindAttribute(job->attrs, "print-quality", IPP_TAG_ZERO) || ippFindAttribute(job->attrs, "cupsPrintQuality", IPP_TAG_ZERO)))
(ippFindAttribute(job->attrs, "print-color-mode", IPP_TAG_ZERO) || ippFindAttribute(job->attrs, "print-quality", IPP_TAG_ZERO) || ippFindAttribute(job->attrs, "print-content-optimize", IPP_TAG_ZERO) || ippFindAttribute(job->attrs, "cupsPrintQuality", IPP_TAG_ZERO)))
{
/*
* Map print-color-mode and print-quality to a preset...
@ -3739,6 +3743,12 @@ get_options(cupsd_job_t *job, /* I - Job */
}
}
cupsdLogJob(job, CUPSD_LOG_DEBUG,
"print-color-mode=%s, print-quality=%s",
print_color_mode == _PWG_PRINT_COLOR_MODE_MONOCHROME ?
"gray" : "color",
print_quality == _PWG_PRINT_QUALITY_DRAFT ? "draft" :
(print_quality == _PWG_PRINT_QUALITY_HIGH ? "high" : "normal"));
if (pc->num_presets[print_color_mode][print_quality] > 0)
{
/*
@ -3753,7 +3763,72 @@ get_options(cupsd_job_t *job, /* I - Job */
{
if (!ippFindAttribute(job->attrs, preset->name, IPP_TAG_ZERO))
{
cupsdLogJob(job, CUPSD_LOG_DEBUG2, "Adding preset option %s=%s", preset->name, preset->value);
cupsdLogJob(job, CUPSD_LOG_DEBUG, "Adding preset option %s=%s", preset->name, preset->value);
num_pwgppds = cupsAddOption(preset->name, preset->value, num_pwgppds, &pwgppds);
}
}
}
}
if (pc &&
ippFindAttribute(job->attrs, "print-content-optimize", IPP_TAG_ZERO))
{
/*
* Map print-content-optimize to a preset...
*/
if ((attr = ippFindAttribute(job->attrs, "print-content-optimize",
IPP_TAG_KEYWORD)) != NULL)
{
if (!strcmp(attr->values[0].string.text, "auto"))
print_content_optimize = _PWG_PRINT_CONTENT_OPTIMIZE_AUTO;
else if (!strcmp(attr->values[0].string.text, "photo"))
print_content_optimize = _PWG_PRINT_CONTENT_OPTIMIZE_PHOTO;
else if (!strcmp(attr->values[0].string.text, "graphics") ||
!strcmp(attr->values[0].string.text, "graphic"))
print_content_optimize = _PWG_PRINT_CONTENT_OPTIMIZE_GRAPHICS;
else if (!strcmp(attr->values[0].string.text, "text"))
print_content_optimize = _PWG_PRINT_CONTENT_OPTIMIZE_TEXT;
else if (!strcmp(attr->values[0].string.text, "text-and-graphics") ||
!strcmp(attr->values[0].string.text, "text-and-graphic"))
print_content_optimize = _PWG_PRINT_CONTENT_OPTIMIZE_TEXT_AND_GRAPHICS;
else
print_content_optimize = _PWG_PRINT_CONTENT_OPTIMIZE_AUTO;
}
else
print_content_optimize = _PWG_PRINT_CONTENT_OPTIMIZE_AUTO;
cupsdLogJob(job, CUPSD_LOG_DEBUG,
"print-content-optimize=%s",
(print_content_optimize == _PWG_PRINT_CONTENT_OPTIMIZE_AUTO ?
"automatic" :
(print_content_optimize == _PWG_PRINT_CONTENT_OPTIMIZE_PHOTO ?
"photo" :
(print_content_optimize == _PWG_PRINT_CONTENT_OPTIMIZE_GRAPHICS ?
"graphics" :
(print_content_optimize == _PWG_PRINT_CONTENT_OPTIMIZE_TEXT ?
"text" :
"text and graphics")))));
if (pc->num_optimize_presets[print_content_optimize] > 0)
{
/*
* Copy the preset options as long as the corresponding names are not
* already defined in the IPP request and also if it does not change
* the print quality preset (as long as we do not print in high quality)
* ...
*/
for (i = pc->num_optimize_presets[print_content_optimize],
preset = pc->optimize_presets[print_content_optimize];
i > 0;
i --, preset ++)
{
if (!ippFindAttribute(job->attrs, preset->name, IPP_TAG_ZERO) &&
(print_quality == _PWG_PRINT_QUALITY_HIGH ||
cupsGetOption(preset->name, num_pwgppds, pwgppds) == NULL))
{
cupsdLogJob(job, CUPSD_LOG_DEBUG, "Adding content optimization preset option %s=%s", preset->name, preset->value);
num_pwgppds = cupsAddOption(preset->name, preset->value, num_pwgppds, &pwgppds);
}

View File

@ -22,8 +22,6 @@ typedef struct
*ops; /* Operations */
} cupsd_policy_t;
typedef struct cupsd_printer_s cupsd_printer_t;
/*
* Globals...

View File

@ -620,7 +620,7 @@ cupsdDeletePrinter(
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeletePrinter(p=%p(%s), update=%d)",
p, p->name, update);
(void *)p, p->name, update);
/*
* Save the current position in the Printers array...
@ -782,11 +782,11 @@ cupsdDeleteTemporaryPrinters(int force) /* I - Force deletion instead of auto? *
"cupsdDeleteTemporaryPrinters: Removing unused temporary printers");
/*
* Allow temporary printers to stick around for 60 seconds after the last job
* Allow temporary printers to stick around for 5 minutes after the last job
* completes.
*/
unused_time = time(NULL) - 60;
unused_time = time(NULL) - 300;
for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); p; p = (cupsd_printer_t *)cupsArrayNext(Printers))
{
@ -2550,7 +2550,7 @@ cupsdSetPrinterReasons(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", p, p->name, s);
"cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", (void *)p, p->name, s);
if (s[0] == '-' || s[0] == '+')
{
@ -3396,7 +3396,7 @@ add_printer_filter(
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"add_printer_filter(p=%p(%s), filtertype=%p(%s/%s), "
"filter=\"%s\")", p, p->name, filtertype, filtertype->super,
"filter=\"%s\")", (void *)p, p->name, (void *)filtertype, filtertype->super,
filtertype->type, filter);
/*

View File

@ -50,8 +50,6 @@ typedef AvahiStringList *cupsd_txt_t; /* TXT record */
* Printer/class information structure...
*/
typedef struct cupsd_job_s cupsd_job_t;
struct cupsd_printer_s
{
_cups_rwlock_t lock; /* Concurrency lock for background updates */

View File

@ -19,7 +19,8 @@ argcount=$#
if test "x`id -u`" = x0; then
echo Please run this as a normal user. Not supported when run as root.
exit 1
echo "Debian Reproducibility: Skipping allowed, as this is known to break under reprotest. This message MUST NOT be visible in normal Debian buildd logs."
exit 0
fi
#