###############################################################################
name = cups
-version = 1.4.5
-release = 7
+version = 1.6.1
+release = 1
groups = Applications/Printing
url = http://cups.org/software.php
--- /dev/null
+diff -up cups-1.6b1/config-scripts/cups-manpages.m4.no-gzip-man cups-1.6b1/config-scripts/cups-manpages.m4
+--- cups-1.6b1/config-scripts/cups-manpages.m4.no-gzip-man 2012-04-23 19:26:57.000000000 +0200
++++ cups-1.6b1/config-scripts/cups-manpages.m4 2012-05-25 14:57:01.959845267 +0200
+@@ -69,10 +69,10 @@ case "$uname" in
+ ;;
+ Linux* | GNU* | Darwin*)
+ # Linux, GNU Hurd, and OS X
+- MAN1EXT=1.gz
+- MAN5EXT=5.gz
+- MAN7EXT=7.gz
+- MAN8EXT=8.gz
++ MAN1EXT=1
++ MAN5EXT=5
++ MAN7EXT=7
++ MAN8EXT=8
+ MAN8DIR=8
+ ;;
+ *)
-diff -up /dev/null cups-1.4.2/conf/cups.password-auth
---- /dev/null 2009-11-10 09:17:06.284031490 +0000
-+++ cups-1.4.2/conf/cups.password-auth 2009-11-10 11:15:42.750666738 +0000
+diff -up cups-1.5b1/conf/cups.password-auth.system-auth cups-1.5b1/conf/cups.password-auth
+--- cups-1.5b1/conf/cups.password-auth.system-auth 2011-05-23 17:27:27.000000000 +0200
++++ cups-1.5b1/conf/cups.password-auth 2011-05-23 17:27:27.000000000 +0200
@@ -0,0 +1,4 @@
+#%PAM-1.0
+# Use password-auth common PAM configuration for the daemon
+auth include password-auth
+account include password-auth
-diff -up cups-1.4.2/conf/cups.system-auth cups-1.4.2/conf/cups
-diff -up /dev/null cups-1.4.2/conf/cups.system-auth
---- /dev/null 2009-11-10 09:17:06.284031490 +0000
-+++ cups-1.4.2/conf/cups.system-auth 2009-11-10 11:15:42.750666738 +0000
+diff -up cups-1.5b1/conf/cups.system-auth.system-auth cups-1.5b1/conf/cups.system-auth
+--- cups-1.5b1/conf/cups.system-auth.system-auth 2011-05-23 17:27:27.000000000 +0200
++++ cups-1.5b1/conf/cups.system-auth 2011-05-23 17:27:27.000000000 +0200
@@ -0,0 +1,3 @@
+#%PAM-1.0
+auth include system-auth
+account include system-auth
-diff -up cups-1.4.2/conf/Makefile.system-auth cups-1.4.2/conf/Makefile
---- cups-1.4.2/conf/Makefile.system-auth 2009-09-22 22:53:31.000000000 +0100
-+++ cups-1.4.2/conf/Makefile 2009-11-10 11:18:44.188791989 +0000
+diff -up cups-1.5b1/conf/Makefile.system-auth cups-1.5b1/conf/Makefile
+--- cups-1.5b1/conf/Makefile.system-auth 2011-05-12 07:21:56.000000000 +0200
++++ cups-1.5b1/conf/Makefile 2011-05-23 17:27:27.000000000 +0200
@@ -90,10 +90,16 @@ install-data:
done
-if test x$(PAMDIR) != x; then \
---- cups-1.2.3/cups-config.in.multilib 2006-08-03 01:54:38.000000000 +0100
-+++ cups-1.2.3/cups-config.in 2006-08-30 15:47:35.000000000 +0100
-@@ -30,8 +30,10 @@
+diff -up cups-1.5b1/cups-config.in.multilib cups-1.5b1/cups-config.in
+--- cups-1.5b1/cups-config.in.multilib 2010-06-16 02:48:25.000000000 +0200
++++ cups-1.5b1/cups-config.in 2011-05-23 17:33:31.000000000 +0200
+@@ -22,8 +22,10 @@ prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
includedir=@includedir@
--- /dev/null
+diff -up cups-1.5b1/scheduler/banners.c.banners cups-1.5b1/scheduler/banners.c
+--- cups-1.5b1/scheduler/banners.c.banners 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.5b1/scheduler/banners.c 2011-05-23 17:35:30.000000000 +0200
+@@ -110,6 +110,8 @@ cupsdLoadBanners(const char *d) /* I -
+ if ((ext = strrchr(dent->filename, '.')) != NULL)
+ if (!strcmp(ext, ".bck") ||
+ !strcmp(ext, ".bak") ||
++ !strcmp(ext, ".rpmnew") ||
++ !strcmp(ext, ".rpmsave") ||
+ !strcmp(ext, ".sav"))
+ continue;
+
-diff -up cups-1.4.4/scheduler/conf.c.serverbin-compat cups-1.4.4/scheduler/conf.c
---- cups-1.4.4/scheduler/conf.c.serverbin-compat 2010-04-23 19:56:34.000000000 +0100
-+++ cups-1.4.4/scheduler/conf.c 2010-09-15 13:20:41.339960335 +0100
-@@ -488,6 +488,9 @@ cupsdReadConfiguration(void)
+diff -up cups-1.5b1/scheduler/conf.c.serverbin-compat cups-1.5b1/scheduler/conf.c
+--- cups-1.5b1/scheduler/conf.c.serverbin-compat 2011-05-20 06:24:54.000000000 +0200
++++ cups-1.5b1/scheduler/conf.c 2011-05-23 17:20:33.000000000 +0200
+@@ -491,6 +491,9 @@ cupsdReadConfiguration(void)
cupsdClearString(&ServerName);
cupsdClearString(&ServerAdmin);
cupsdSetString(&ServerBin, CUPS_SERVERBIN);
cupsdSetString(&RequestRoot, CUPS_REQUESTS);
cupsdSetString(&CacheDir, CUPS_CACHEDIR);
cupsdSetString(&DataDir, CUPS_DATADIR);
-@@ -1318,7 +1321,12 @@ cupsdReadConfiguration(void)
+@@ -1378,7 +1381,12 @@ cupsdReadConfiguration(void)
* Read the MIME type and conversion database...
*/
+#endif
snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir);
- MimeDatabase = mimeLoadTypes(NULL, mimedir);
-diff -up cups-1.4.4/scheduler/conf.h.serverbin-compat cups-1.4.4/scheduler/conf.h
---- cups-1.4.4/scheduler/conf.h.serverbin-compat 2010-04-23 19:56:34.000000000 +0100
-+++ cups-1.4.4/scheduler/conf.h 2010-09-15 13:20:41.340959464 +0100
+ MimeDatabase = mimeNew();
+diff -up cups-1.5b1/scheduler/conf.h.serverbin-compat cups-1.5b1/scheduler/conf.h
+--- cups-1.5b1/scheduler/conf.h.serverbin-compat 2011-04-22 19:47:03.000000000 +0200
++++ cups-1.5b1/scheduler/conf.h 2011-05-23 15:34:25.000000000 +0200
@@ -105,6 +105,10 @@ VAR char *ConfigurationFile VALUE(NULL)
/* Root directory for scheduler */
*ServerBin VALUE(NULL),
*StateDir VALUE(NULL),
/* Root directory for state data */
*RequestRoot VALUE(NULL),
-diff -up cups-1.4.4/scheduler/env.c.serverbin-compat cups-1.4.4/scheduler/env.c
---- cups-1.4.4/scheduler/env.c.serverbin-compat 2009-06-15 18:13:52.000000000 +0100
-+++ cups-1.4.4/scheduler/env.c 2010-09-15 13:20:41.341959587 +0100
-@@ -87,8 +87,13 @@ cupsdInitEnv(void)
- cupsdSetEnv("LD_LIBRARY_PATH", NULL);
- cupsdSetEnv("LD_PRELOAD", NULL);
- cupsdSetEnv("NLSPATH", NULL);
+diff -up cups-1.5b1/scheduler/env.c.serverbin-compat cups-1.5b1/scheduler/env.c
+--- cups-1.5b1/scheduler/env.c.serverbin-compat 2011-01-11 04:48:42.000000000 +0100
++++ cups-1.5b1/scheduler/env.c 2011-05-23 17:07:17.000000000 +0200
+@@ -218,8 +218,13 @@ cupsdUpdateEnv(void)
+ set_if_undefined("LD_PRELOAD", NULL);
+ set_if_undefined("NLSPATH", NULL);
+ if (find_env("PATH") < 0)
+#ifdef __x86_64__
-+ cupsdSetEnvf("PATH", "%s/filter:%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR
-+ ":/bin:/usr/bin", ServerBin, ServerBin_compat);
++ cupsdSetEnvf("PATH", "%s/filter:%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR
++ ":/bin:/usr/bin", ServerBin, ServerBin_compat);
+#else /* ! defined(__x86_64__) */
- cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR
- ":/bin:/usr/bin", ServerBin);
+ cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR
+ ":/bin:/usr/bin", ServerBin);
+#endif
- cupsdSetEnv("SERVER_ADMIN", ServerAdmin);
- cupsdSetEnv("SHLIB_PATH", NULL);
- cupsdSetEnv("SOFTWARE", CUPS_MINIMAL);
-diff -up cups-1.4.4/scheduler/ipp.c.serverbin-compat cups-1.4.4/scheduler/ipp.c
---- cups-1.4.4/scheduler/ipp.c.serverbin-compat 2010-04-23 19:56:34.000000000 +0100
-+++ cups-1.4.4/scheduler/ipp.c 2010-09-15 13:20:41.359835378 +0100
-@@ -2615,9 +2615,18 @@ add_printer(cupsd_client_t *con, /* I -
+ set_if_undefined("SERVER_ADMIN", ServerAdmin);
+ set_if_undefined("SHLIB_PATH", NULL);
+ set_if_undefined("SOFTWARE", CUPS_MINIMAL);
+diff -up cups-1.5b1/scheduler/ipp.c.serverbin-compat cups-1.5b1/scheduler/ipp.c
+--- cups-1.5b1/scheduler/ipp.c.serverbin-compat 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.5b1/scheduler/ipp.c 2011-05-23 16:09:57.000000000 +0200
+@@ -2586,9 +2586,18 @@ add_printer(cupsd_client_t *con, /* I -
* Could not find device in list!
*/
+ if (access(srcfile, X_OK))
+ {
+#endif /* __x86_64__ */
- send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad device-uri scheme \"%s\"!"),
- scheme);
+ send_ipp_status(con, IPP_NOT_POSSIBLE,
+ _("Bad device-uri scheme \"%s\"."), scheme);
return;
+#ifdef __x86_64__
+ }
}
}
-diff -up cups-1.4.4/scheduler/job.c.serverbin-compat cups-1.4.4/scheduler/job.c
---- cups-1.4.4/scheduler/job.c.serverbin-compat 2010-03-30 23:07:33.000000000 +0100
-+++ cups-1.4.4/scheduler/job.c 2010-09-15 13:20:41.366836134 +0100
-@@ -972,8 +972,32 @@ cupsdContinueJob(cupsd_job_t *job) /* I
+diff -up cups-1.5b1/scheduler/job.c.serverbin-compat cups-1.5b1/scheduler/job.c
+--- cups-1.5b1/scheduler/job.c.serverbin-compat 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.5b1/scheduler/job.c 2011-05-23 16:18:57.000000000 +0200
+@@ -1047,8 +1047,32 @@ cupsdContinueJob(cupsd_job_t *job) /* I
i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
{
if (filter->filter[0] != '/')
else
strlcpy(command, filter->filter, sizeof(command));
-@@ -1119,6 +1143,28 @@ cupsdContinueJob(cupsd_job_t *job) /* I
- cupsdClosePipe(job->print_pipes);
+@@ -1199,6 +1223,28 @@ cupsdContinueJob(cupsd_job_t *job) /* I
+ {
cupsdClosePipe(job->back_pipes);
cupsdClosePipe(job->side_pipes);
+#ifdef __x86_64__
+ if (access(command, F_OK))
+ {
+ snprintf(command, sizeof(command), "%s/backend/%s", ServerBin_compat,
-+ method);
++ scheme);
+ if (!access(command, F_OK))
+ {
+ /* Not in the correct directory, but we found it in the compat
+ * directory. Issue a warning. */
+ cupsdLogMessage(CUPSD_LOG_INFO,
-+ "Backend '%s' not in %s/backend!", method,
++ "Backend '%s' not in %s/backend!", scheme,
+ ServerBin);
+ }
+ else
+ /* Not in the compat directory either; make any error
+ messages use the correct directory name then. */
+ snprintf(command, sizeof(command), "%s/backend/%s", ServerBin,
-+ method);
++ scheme);
+ }
+ }
+#endif /* __x86_64__ */
close(job->status_pipes[1]);
job->status_pipes[1] = -1;
-diff -up cups-1.4.4/scheduler/printers.c.serverbin-compat cups-1.4.4/scheduler/printers.c
---- cups-1.4.4/scheduler/printers.c.serverbin-compat 2010-04-23 21:53:38.000000000 +0100
-+++ cups-1.4.4/scheduler/printers.c 2010-09-15 13:21:39.627960657 +0100
-@@ -1059,9 +1059,19 @@ cupsdLoadAllPrinters(void)
+diff -up cups-1.5b1/scheduler/printers.c.serverbin-compat cups-1.5b1/scheduler/printers.c
+--- cups-1.5b1/scheduler/printers.c.serverbin-compat 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.5b1/scheduler/printers.c 2011-05-23 17:09:04.000000000 +0200
+@@ -1030,9 +1030,19 @@ cupsdLoadAllPrinters(void)
* Backend does not exist, stop printer...
*/
}
}
-@@ -3603,6 +3613,14 @@ add_printer_filter(
+@@ -3621,8 +3631,20 @@ add_printer_filter(
+ else
+ snprintf(filename, sizeof(filename), "%s/filter/%s", ServerBin, program);
- if (stat(filename, &fileinfo))
- {
+#ifdef __x86_64__
++ if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_PROGRAM, !RunUser,
++ cupsdLogFCMessage, p) == _CUPS_FILE_CHECK_MISSING) {
+ snprintf(filename, sizeof(filename), "%s/filter/%s", ServerBin_compat,
-+ program);
-+ if (stat(filename, &fileinfo))
-+ {
++ program);
++ if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_PROGRAM, !RunUser,
++ cupsdLogFCMessage, p) == _CUPS_FILE_CHECK_MISSING)
+ snprintf(filename, sizeof(filename), "%s/filter/%s", ServerBin,
+ program);
-+#endif /* __x86_64__ */
- memset(&fileinfo, 0, sizeof(fileinfo));
-
- snprintf(p->state_message, sizeof(p->state_message),
-@@ -3611,6 +3629,9 @@ add_printer_filter(
- cupsdSetPrinterReasons(p, "+cups-missing-filter-warning");
-
- cupsdLogMessage(CUPSD_LOG_ERROR, "%s", p->state_message);
-+#ifdef __x86_64__
-+ }
-+#endif /* __x86_64__ */
- }
++ }
++#else /* ! defined(__x86_64__) */
+ _cupsFileCheck(filename, _CUPS_FILE_CHECK_PROGRAM, !RunUser,
+ cupsdLogFCMessage, p);
++#endif
+ }
- /*
+ /*
--- /dev/null
+diff -up cups-1.5.3/config-scripts/cups-ssl.m4.no-export-ssllibs cups-1.5.3/config-scripts/cups-ssl.m4
+--- cups-1.5.3/config-scripts/cups-ssl.m4.no-export-ssllibs 2012-03-21 05:45:48.000000000 +0100
++++ cups-1.5.3/config-scripts/cups-ssl.m4 2012-05-15 16:47:13.753314620 +0200
+@@ -173,7 +173,7 @@ AC_SUBST(IPPALIASES)
+ AC_SUBST(SSLFLAGS)
+ AC_SUBST(SSLLIBS)
+
+-EXPORT_SSLLIBS="$SSLLIBS"
++EXPORT_SSLLIBS=""
+ AC_SUBST(EXPORT_SSLLIBS)
+
+ dnl
-diff -up cups-1.3.7/backend/usb-unix.c.direct-usb cups-1.3.7/backend/usb-unix.c
---- cups-1.3.7/backend/usb-unix.c.direct-usb 2008-03-26 16:02:45.000000000 +0000
-+++ cups-1.3.7/backend/usb-unix.c 2008-07-15 13:25:56.000000000 +0100
-@@ -94,6 +94,9 @@ print_device(const char *uri, /* I - De
- strncasecmp(hostname, "Minolta", 7);
+diff -up cups-1.5b1/backend/usb-unix.c.direct-usb cups-1.5b1/backend/usb-unix.c
+--- cups-1.5b1/backend/usb-unix.c.direct-usb 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.5b1/backend/usb-unix.c 2011-05-23 17:52:14.000000000 +0200
+@@ -102,6 +102,9 @@ print_device(const char *uri, /* I - De
+ _cups_strncasecmp(hostname, "Minolta", 7);
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __DragonFly__ */
+ if (use_bc && !strncmp(uri, "usb:/dev/", 9))
if ((device_fd = open_device(uri, &use_bc)) == -1)
{
if (getenv("CLASS") != NULL)
-@@ -320,12 +323,7 @@ open_device(const char *uri, /* I - Dev
+@@ -331,12 +334,7 @@ open_device(const char *uri, /* I - Dev
if (!strncmp(uri, "usb:/dev/", 9))
#ifdef __linux
{
-diff -up cups-1.4b1/berkeley/lpr.c.lpr-help cups-1.4b1/berkeley/lpr.c
---- cups-1.4b1/berkeley/lpr.c.lpr-help 2008-07-11 23:46:21.000000000 +0100
-+++ cups-1.4b1/berkeley/lpr.c 2008-11-11 16:20:32.000000000 +0000
-@@ -30,6 +30,31 @@
- #include <cups/i18n.h>
+diff -up cups-1.5b1/berkeley/lpr.c.lpr-help cups-1.5b1/berkeley/lpr.c
+--- cups-1.5b1/berkeley/lpr.c.lpr-help 2011-03-21 23:02:00.000000000 +0100
++++ cups-1.5b1/berkeley/lpr.c 2011-05-23 17:58:06.000000000 +0200
+@@ -24,6 +24,31 @@
+ #include <cups/cups-private.h>
+static void
/*
* 'main()' - Parse options and send files for printing.
*/
-@@ -54,7 +79,6 @@ main(int argc, /* I - Number of comm
- int deletefile; /* Delete file after print? */
- char buffer[8192]; /* Copy buffer */
-
--
- _cupsSetLocale(argv);
-
- deletefile = 0;
-@@ -282,6 +306,12 @@ main(int argc, /* I - Number of comm
+@@ -270,6 +294,12 @@ main(int argc, /* I - Number of comm
break;
default :
+ }
+
_cupsLangPrintf(stderr,
- _("%s: Error - unknown option \'%c\'!\n"),
- argv[0], argv[i][1]);
+ _("%s: Error - unknown option \"%c\"."), argv[0],
+ argv[i][1]);
--- /dev/null
+diff -up cups-1.5b1/scheduler/auth.c.peercred cups-1.5b1/scheduler/auth.c
+--- cups-1.5b1/scheduler/auth.c.peercred 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.5b1/scheduler/auth.c 2011-05-23 18:00:18.000000000 +0200
+@@ -52,6 +52,7 @@
+ * Include necessary headers...
+ */
+
++#define _GNU_SOURCE
+ #include "cupsd.h"
+ #include <grp.h>
+ #ifdef HAVE_SHADOW_H
---- cups-1.1.21/scheduler/main.c.pid 2004-09-24 11:29:05.073748138 +0100
-+++ cups-1.1.21/scheduler/main.c 2004-09-24 11:44:35.826446564 +0100
-@@ -349,6 +349,8 @@
+diff -up cups-1.5b1/scheduler/main.c.pid cups-1.5b1/scheduler/main.c
+--- cups-1.5b1/scheduler/main.c.pid 2011-05-18 22:44:16.000000000 +0200
++++ cups-1.5b1/scheduler/main.c 2011-05-23 18:01:20.000000000 +0200
+@@ -311,6 +311,8 @@ main(int argc, /* I - Number of comm
* Setup signal handlers for the parent...
*/
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGUSR1, parent_handler);
sigset(SIGCHLD, parent_handler);
-@@ -372,7 +374,7 @@
+@@ -334,7 +336,7 @@ main(int argc, /* I - Number of comm
signal(SIGHUP, SIG_IGN);
#endif /* HAVE_SIGSET */
{
/*
* OK, wait for the child to startup and send us SIGUSR1 or to crash
-@@ -384,7 +386,15 @@
+@@ -346,7 +348,15 @@ main(int argc, /* I - Number of comm
sleep(1);
if (parent_signal == SIGUSR1)
-diff -up cups-1.4b1/backend/ipp.c.eggcups cups-1.4b1/backend/ipp.c
---- cups-1.4b1/backend/ipp.c.eggcups 2008-10-15 19:27:45.000000000 +0100
-+++ cups-1.4b1/backend/ipp.c 2008-11-11 15:43:30.000000000 +0000
-@@ -51,6 +51,70 @@ static char pstmpname[1024] = ""; /* Tem
- static char tmpfilename[1024] = ""; /* Temporary spool file name */
- static int job_cancelled = 0; /* Job cancelled? */
+diff -up cups-1.5.3/backend/ipp.c.eggcups cups-1.5.3/backend/ipp.c
+--- cups-1.5.3/backend/ipp.c.eggcups 2012-05-05 01:00:01.000000000 +0200
++++ cups-1.5.3/backend/ipp.c 2012-05-15 16:50:41.142868986 +0200
+@@ -138,6 +138,70 @@ static cups_array_t *state_reasons; /* A
+ static char tmpfilename[1024] = "";
+ /* Temporary spool file name */
+#if HAVE_DBUS
+#include <dbus/dbus.h>
/*
* Local functions...
-@@ -1058,6 +1122,15 @@ main(int argc, /* I - Number of comm
- job_id);
+@@ -1520,6 +1584,15 @@ main(int argc, /* I - Number of comm
+ _("Print file accepted - job ID %d."), job_id);
}
+#if HAVE_DBUS
+ getenv ("PRINTER"));
+#endif /* HAVE_DBUS */
+
+ fprintf(stderr, "DEBUG: job-id=%d\n", job_id);
ippDelete(response);
- if (job_cancelled)
-diff -up cups-1.4b1/backend/Makefile.eggcups cups-1.4b1/backend/Makefile
---- cups-1.4b1/backend/Makefile.eggcups 2008-10-06 22:08:27.000000000 +0100
-+++ cups-1.4b1/backend/Makefile 2008-11-11 15:45:31.000000000 +0000
-@@ -188,7 +188,7 @@ dnssd: dnssd.o ../cups/$(LIBCUPS) libbac
+diff -up cups-1.5.3/backend/Makefile.eggcups cups-1.5.3/backend/Makefile
+--- cups-1.5.3/backend/Makefile.eggcups 2012-04-23 19:42:12.000000000 +0200
++++ cups-1.5.3/backend/Makefile 2012-05-15 16:48:17.253871982 +0200
+@@ -212,7 +212,7 @@ dnssd: dnssd.o ../cups/$(LIBCUPS) libbac
ipp: ipp.o ../cups/$(LIBCUPS) libbackend.a
echo Linking $@...
- $(CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS)
-+ $(CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS) $(CUPSDLIBS)
++ $(CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS) $(SERVERLIBS)
$(RM) http
$(LN) ipp http
-diff -up cups-1.4b1/scheduler/subscriptions.c.eggcups cups-1.4b1/scheduler/subscriptions.c
---- cups-1.4b1/scheduler/subscriptions.c.eggcups 2008-08-01 22:11:55.000000000 +0100
-+++ cups-1.4b1/scheduler/subscriptions.c 2008-11-11 15:43:30.000000000 +0000
-@@ -1302,13 +1302,13 @@ cupsd_send_dbus(cupsd_eventmask_t event,
+diff -up cups-1.5.3/scheduler/subscriptions.c.eggcups cups-1.5.3/scheduler/subscriptions.c
+--- cups-1.5.3/scheduler/subscriptions.c.eggcups 2012-02-12 06:48:09.000000000 +0100
++++ cups-1.5.3/scheduler/subscriptions.c 2012-05-15 16:48:17.253871982 +0200
+@@ -1314,13 +1314,13 @@ cupsd_send_dbus(cupsd_eventmask_t event,
what = "PrinterAdded";
else if (event & CUPSD_EVENT_PRINTER_DELETED)
what = "PrinterRemoved";
else
return;
-@@ -1344,7 +1344,7 @@ cupsd_send_dbus(cupsd_eventmask_t event,
+@@ -1356,7 +1356,7 @@ cupsd_send_dbus(cupsd_eventmask_t event,
dbus_message_append_iter_init(message, &iter);
if (dest)
dbus_message_iter_append_string(&iter, dest->name);
-diff -up cups-1.3.7/scheduler/ipp.c.driverd-timeout cups-1.3.7/scheduler/ipp.c
---- cups-1.3.7/scheduler/ipp.c.driverd-timeout 2008-07-15 13:40:51.000000000 +0100
-+++ cups-1.3.7/scheduler/ipp.c 2008-07-15 13:40:51.000000000 +0100
-@@ -4293,7 +4293,7 @@ copy_model(cupsd_client_t *con, /* I -
+diff -up cups-1.5.0/scheduler/ipp.c.driverd-timeout cups-1.5.0/scheduler/ipp.c
+--- cups-1.5.0/scheduler/ipp.c.driverd-timeout 2011-10-10 17:03:41.801690962 +0100
++++ cups-1.5.0/scheduler/ipp.c 2011-10-10 17:03:41.861689834 +0100
+@@ -5723,7 +5723,7 @@ copy_model(cupsd_client_t *con, /* I -
close(temppipe[1]);
/*
*/
total = 0;
-@@ -4315,7 +4315,7 @@ copy_model(cupsd_client_t *con, /* I -
+@@ -5743,7 +5743,7 @@ copy_model(cupsd_client_t *con, /* I -
FD_SET(temppipe[0], &input);
FD_SET(CGIPipes[0], &input);
-diff -up cups-1.3.5/cups/ppd.c~ cups-1.3.5/cups/ppd.c
---- cups-1.3.5/cups/ppd.c~ 2007-11-30 19:29:50.000000000 +0000
-+++ cups-1.3.5/cups/ppd.c 2008-01-09 12:08:48.000000000 +0000
-@@ -2801,7 +2801,7 @@ ppd_read(cups_file_t *fp, /* I - Fil
+diff -up cups-1.5b1/cups/ppd.c.strict-ppd-line-length cups-1.5b1/cups/ppd.c
+--- cups-1.5b1/cups/ppd.c.strict-ppd-line-length 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.5b1/cups/ppd.c 2011-05-24 15:46:13.000000000 +0200
+@@ -2786,7 +2786,7 @@ ppd_read(cups_file_t *fp, /* I - Fil
*lineptr++ = ch;
col ++;
{
/*
* Line is too long...
-@@ -2868,7 +2868,7 @@ ppd_read(cups_file_t *fp, /* I - Fil
+@@ -2847,7 +2847,7 @@ ppd_read(cups_file_t *fp, /* I - Fil
{
col ++;
{
/*
* Line is too long...
-@@ -2931,7 +2931,7 @@ ppd_read(cups_file_t *fp, /* I - Fil
+@@ -2906,7 +2906,7 @@ ppd_read(cups_file_t *fp, /* I - Fil
{
col ++;
-diff -up cups-1.3.5/scheduler/log.c.logrotate cups-1.3.5/scheduler/log.c
---- cups-1.3.5/scheduler/log.c.logrotate 2008-02-14 12:21:25.000000000 +0000
-+++ cups-1.3.5/scheduler/log.c 2008-02-14 12:24:16.000000000 +0000
-@@ -29,6 +29,9 @@
+diff -up cups-1.5b1/scheduler/log.c.logrotate cups-1.5b1/scheduler/log.c
+--- cups-1.5b1/scheduler/log.c.logrotate 2011-05-14 01:04:16.000000000 +0200
++++ cups-1.5b1/scheduler/log.c 2011-05-24 15:47:20.000000000 +0200
+@@ -32,6 +32,9 @@
#include "cupsd.h"
#include <stdarg.h>
#include <syslog.h>
/*
-@@ -467,12 +470,10 @@ check_log_file(cups_file_t **lf, /* IO -
+@@ -71,12 +74,10 @@ cupsdCheckLogFile(cups_file_t **lf, /* I
return (1);
/*
{
/*
* Handle format strings...
-@@ -565,6 +566,34 @@ check_log_file(cups_file_t **lf, /* IO -
+@@ -186,6 +187,34 @@ cupsdCheckLogFile(cups_file_t **lf, /* I
}
/*
-diff -up cups-1.4b1/backend/usb-unix.c.usb-paperout cups-1.4b1/backend/usb-unix.c
---- cups-1.4b1/backend/usb-unix.c.usb-paperout 2008-11-12 09:30:03.000000000 +0000
-+++ cups-1.4b1/backend/usb-unix.c 2008-11-12 09:30:03.000000000 +0000
+diff -up cups-1.5b1/backend/usb-unix.c.usb-paperout cups-1.5b1/backend/usb-unix.c
+--- cups-1.5b1/backend/usb-unix.c.usb-paperout 2011-05-24 15:51:39.000000000 +0200
++++ cups-1.5b1/backend/usb-unix.c 2011-05-24 15:51:39.000000000 +0200
@@ -30,6 +30,11 @@
#include <sys/select.h>
/*
* Local functions...
-@@ -324,7 +329,19 @@ open_device(const char *uri, /* I - Dev
+@@ -334,7 +339,19 @@ open_device(const char *uri, /* I - Dev
if (!strncmp(uri, "usb:/dev/", 9))
#ifdef __linux
{
}
else if (!strncmp(uri, "usb://", 6))
{
-@@ -390,7 +407,14 @@ open_device(const char *uri, /* I - Dev
+@@ -400,7 +417,14 @@ open_device(const char *uri, /* I - Dev
if (!strcmp(uri, device_uri))
{
/*
--- /dev/null
+diff -up cups-1.6b1/cups/http-addr.c.res_init cups-1.6b1/cups/http-addr.c
+--- cups-1.6b1/cups/http-addr.c.res_init 2012-05-17 00:57:03.000000000 +0200
++++ cups-1.6b1/cups/http-addr.c 2012-05-25 15:51:51.323916352 +0200
+@@ -254,7 +254,8 @@ httpAddrLookup(
+
+ if (error)
+ {
+- if (error == EAI_FAIL)
++ if (error == EAI_FAIL || error == EAI_AGAIN || error == EAI_NODATA ||
++ error == EAI_NONAME)
+ cg->need_res_init = 1;
+
+ return (httpAddrString(addr, name, namelen));
+diff -up cups-1.6b1/cups/http-addrlist.c.res_init cups-1.6b1/cups/http-addrlist.c
+--- cups-1.6b1/cups/http-addrlist.c.res_init 2012-04-23 19:26:57.000000000 +0200
++++ cups-1.6b1/cups/http-addrlist.c 2012-05-25 16:05:05.930377452 +0200
+@@ -540,7 +540,8 @@ httpAddrGetList(const char *hostname, /*
+ }
+ else
+ {
+- if (error == EAI_FAIL)
++ if (error == EAI_FAIL || error == EAI_AGAIN || error == EAI_NODATA ||
++ error == EAI_NONAME)
+ cg->need_res_init = 1;
+
+ _cupsSetError(IPP_INTERNAL_ERROR, gai_strerror(error), 0);
-diff -up cups-1.4rc1/scheduler/job.c.filter-debug cups-1.4rc1/scheduler/job.c
---- cups-1.4rc1/scheduler/job.c.filter-debug 2009-06-23 18:10:57.125572911 +0100
-+++ cups-1.4rc1/scheduler/job.c 2009-06-23 18:11:31.495572481 +0100
-@@ -544,10 +544,28 @@ cupsdContinueJob(cupsd_job_t *job) /* I
+diff -up cups-1.6b1/scheduler/job.c.filter-debug cups-1.6b1/scheduler/job.c
+--- cups-1.6b1/scheduler/job.c.filter-debug 2012-05-25 16:06:01.000000000 +0200
++++ cups-1.6b1/scheduler/job.c 2012-05-25 16:07:46.309259511 +0200
+@@ -625,10 +625,28 @@ cupsdContinueJob(cupsd_job_t *job) /* I
if (!filters)
{
+ mime_filter_t *current;
+
cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Unable to convert file %d to printable format!",
+ "Unable to convert file %d to printable format.",
job->current_file);
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
-diff -up cups-1.4rc1/backend/usb-unix.c.uri-compat cups-1.4rc1/backend/usb-unix.c
---- cups-1.4rc1/backend/usb-unix.c.uri-compat 2009-07-15 10:48:46.992133677 +0100
-+++ cups-1.4rc1/backend/usb-unix.c 2009-07-15 10:49:05.305008114 +0100
+diff -up cups-1.5b1/backend/usb-unix.c.uri-compat cups-1.5b1/backend/usb-unix.c
+--- cups-1.5b1/backend/usb-unix.c.uri-compat 2011-05-24 15:59:05.000000000 +0200
++++ cups-1.5b1/backend/usb-unix.c 2011-05-24 16:02:03.000000000 +0200
@@ -63,11 +63,34 @@ print_device(const char *uri, /* I - De
int device_fd; /* USB device */
- size_t tbytes; /* Total number of bytes written */
+ ssize_t tbytes; /* Total number of bytes written */
struct termios opts; /* Parallel port options */
+ char *fixed_uri = strdup (uri);
+ char *p;
* Open the USB port device...
*/
@@ -107,10 +130,10 @@ print_device(const char *uri, /* I - De
- strncasecmp(hostname, "Minolta", 7);
+ _cups_strncasecmp(hostname, "Minolta", 7);
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __DragonFly__ */
- if (use_bc && !strncmp(uri, "usb:/dev/", 9))
-diff -up cups-1.4rc1/cups/dest.c.cups-get-classes cups-1.4rc1/cups/dest.c
---- cups-1.4rc1/cups/dest.c.cups-get-classes 2009-05-13 22:39:17.000000000 +0100
-+++ cups-1.4rc1/cups/dest.c 2009-07-28 22:17:40.285709944 +0100
-@@ -1735,6 +1735,7 @@ cups_get_sdests(http_t *http, /* I
+diff -up cups-1.5.0/cups/dest.c.cups-get-classes cups-1.5.0/cups/dest.c
+--- cups-1.5.0/cups/dest.c.cups-get-classes 2011-05-20 04:49:49.000000000 +0100
++++ cups-1.5.0/cups/dest.c 2011-09-14 12:10:05.111635428 +0100
+@@ -534,6 +534,7 @@ _cupsGetDests(http_t *http, /* I -
char uri[1024]; /* printer-uri value */
int num_options; /* Number of options */
cups_option_t *options; /* Options */
#ifdef __APPLE__
char media_default[41]; /* Default paper size */
#endif /* __APPLE__ */
-@@ -1791,6 +1792,8 @@ cups_get_sdests(http_t *http, /* I
+@@ -590,6 +591,8 @@ _cupsGetDests(http_t *http, /* I -
* printer-uri [for IPP_GET_PRINTER_ATTRIBUTES]
*/
request = ippNewRequest(op);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
-@@ -1848,6 +1851,23 @@ cups_get_sdests(http_t *http, /* I
+@@ -647,6 +650,23 @@ _cupsGetDests(http_t *http, /* I -
attr->value_tag != IPP_TAG_URI)
continue;
if (!strcmp(attr->name, "auth-info-required") ||
!strcmp(attr->name, "device-uri") ||
!strcmp(attr->name, "marker-change-time") ||
-@@ -1939,6 +1959,28 @@ cups_get_sdests(http_t *http, /* I
+@@ -738,6 +758,28 @@ _cupsGetDests(http_t *http, /* I -
continue;
}
+ * early if so.
+ */
+
-+ if (op == CUPS_GET_CLASSES)
++ if (op == CUPS_GET_CLASSES && num_dests > 0)
+ {
+ int diff;
+ cups_find_dest (printer_name, NULL, num_dests, *dests, 0, &diff);
if ((dest = cups_add_dest(printer_name, NULL, &num_dests, dests)) != NULL)
{
dest->num_options = num_options;
-@@ -1955,6 +1997,16 @@ cups_get_sdests(http_t *http, /* I
+@@ -754,6 +796,15 @@ _cupsGetDests(http_t *http, /* I -
}
/*
+ */
+
+ if (get_classes)
-+ num_dests = cups_get_sdests (http, CUPS_GET_CLASSES, name,
-+ num_dests, dests);
++ num_dests = _cupsGetDests (http, CUPS_GET_CLASSES, name, dests, 0, 0);
+
+ /*
* Return the count...
-diff -up cups-1.4.3/cups/tempfile.c.str3382 cups-1.4.3/cups/tempfile.c
---- cups-1.4.3/cups/tempfile.c.str3382 2010-01-18 19:47:12.000000000 +0100
-+++ cups-1.4.3/cups/tempfile.c 2010-03-31 13:26:52.000000000 +0200
-@@ -35,6 +35,7 @@
+diff -up cups-1.5b1/cups/tempfile.c.str3382 cups-1.5b1/cups/tempfile.c
+--- cups-1.5b1/cups/tempfile.c.str3382 2010-03-24 01:45:34.000000000 +0100
++++ cups-1.5b1/cups/tempfile.c 2011-05-24 16:04:47.000000000 +0200
+@@ -33,6 +33,7 @@
# include <io.h>
#else
# include <unistd.h>
#endif /* WIN32 || __EMX__ */
-@@ -56,7 +57,7 @@ cupsTempFd(char *filename, /* I - Point
+@@ -54,7 +55,7 @@ cupsTempFd(char *filename, /* I - Point
char tmppath[1024]; /* Windows temporary directory */
DWORD curtime; /* Current time */
#else
#endif /* WIN32 */
-@@ -107,33 +108,25 @@ cupsTempFd(char *filename, /* I - Point
+@@ -105,33 +106,25 @@ cupsTempFd(char *filename, /* I - Point
snprintf(filename, len - 1, "%s/%05lx%08lx", tmpdir,
GetCurrentProcessId(), curtime);
--- /dev/null
+diff -up cups-1.6b1/Makedefs.in.0755 cups-1.6b1/Makedefs.in
+--- cups-1.6b1/Makedefs.in.0755 2012-05-23 01:58:31.000000000 +0200
++++ cups-1.6b1/Makedefs.in 2012-05-25 16:09:40.545463214 +0200
+@@ -40,14 +40,14 @@ SHELL = /bin/sh
+ # Installation programs...
+ #
+
+-INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
++INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 755 @INSTALL_STRIP@
+ INSTALL_COMPDATA = $(INSTALL) -c -m 444 @INSTALL_GZIP@
+ INSTALL_CONFIG = $(INSTALL) -c -m @CUPS_CONFIG_FILE_PERM@
+ INSTALL_DATA = $(INSTALL) -c -m 444
+ INSTALL_DIR = $(INSTALL) -d
+-INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
++INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 755 @INSTALL_STRIP@
+ INSTALL_MAN = $(INSTALL) -c -m 444
+-INSTALL_SCRIPT = $(INSTALL) -c -m 555
++INSTALL_SCRIPT = $(INSTALL) -c -m 755
+
+ #
+ # Default user, group, and system groups for the scheduler...
-diff -up cups-1.4.3/backend/snmp.c.hp-deviceid-oid cups-1.4.3/backend/snmp.c
---- cups-1.4.3/backend/snmp.c.hp-deviceid-oid 2009-12-08 02:13:42.000000000 +0000
-+++ cups-1.4.3/backend/snmp.c 2010-04-13 15:00:26.486148914 +0100
-@@ -194,6 +194,7 @@ static const int UriOID[] = { CUPS_OID_p
+diff -up cups-1.5b1/backend/snmp.c.hp-deviceid-oid cups-1.5b1/backend/snmp.c
+--- cups-1.5b1/backend/snmp.c.hp-deviceid-oid 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.5b1/backend/snmp.c 2011-05-24 17:24:48.000000000 +0200
+@@ -187,6 +187,7 @@ static const int UriOID[] = { CUPS_OID_p
static const int LexmarkProductOID[] = { 1,3,6,1,4,1,641,2,1,2,1,2,1,-1 };
static const int LexmarkProductOID2[] = { 1,3,6,1,4,1,674,10898,100,2,1,2,1,2,1,-1 };
static const int LexmarkDeviceIdOID[] = { 1,3,6,1,4,1,641,2,1,2,1,3,1,-1 };
static const int XeroxProductOID[] = { 1,3,6,1,4,1,128,2,1,3,1,2,0,-1 };
static cups_array_t *DeviceURIs = NULL;
static int HostNameLookups = 0;
-@@ -1003,6 +1004,9 @@ read_snmp_response(int fd) /* I - SNMP
+@@ -1006,6 +1007,9 @@ read_snmp_response(int fd) /* I - SNMP
_cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
packet.community, CUPS_ASN1_GET_REQUEST,
DEVICE_PRODUCT, XeroxProductOID);
--- /dev/null
+diff -up cups-1.6b1/backend/dnssd.c.dnssd-deviceid cups-1.6b1/backend/dnssd.c
+--- cups-1.6b1/backend/dnssd.c.dnssd-deviceid 2012-05-21 18:05:58.000000000 +0200
++++ cups-1.6b1/backend/dnssd.c 2012-05-25 16:27:49.226874427 +0200
+@@ -1181,15 +1181,22 @@ query_callback(
+ if (device->device_id)
+ free(device->device_id);
+
++ if (device_id[0])
++ {
++ /* Mark this as the real device ID. */
++ ptr = device_id + strlen(device_id);
++ snprintf(ptr, sizeof(device_id) - (ptr - device_id), "FZY:0;");
++ }
++
+ if (!device_id[0] && strcmp(model, "Unknown"))
+ {
+ if (make_and_model[0])
+- snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;",
++ snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;FZY:1;",
+ make_and_model, model);
+ else if (!_cups_strncasecmp(model, "designjet ", 10))
+- snprintf(device_id, sizeof(device_id), "MFG:HP;MDL:%s", model + 10);
++ snprintf(device_id, sizeof(device_id), "MFG:HP;MDL:%s;FZY:1;", model + 10);
+ else if (!_cups_strncasecmp(model, "stylus ", 7))
+- snprintf(device_id, sizeof(device_id), "MFG:EPSON;MDL:%s", model + 7);
++ snprintf(device_id, sizeof(device_id), "MFG:EPSON;MDL:%s;FZY:1;", model + 7);
+ else if ((ptr = strchr(model, ' ')) != NULL)
+ {
+ /*
+@@ -1199,7 +1206,7 @@ query_callback(
+ memcpy(make_and_model, model, ptr - model);
+ make_and_model[ptr - model] = '\0';
+
+- snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s",
++ snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;FZY:1;",
+ make_and_model, ptr + 1);
+ }
+ }
-diff -up cups-1.4.3/backend/snmp.c.ricoh-deviceid-oid cups-1.4.3/backend/snmp.c
---- cups-1.4.3/backend/snmp.c.ricoh-deviceid-oid 2010-05-11 17:30:57.266120467 +0100
-+++ cups-1.4.3/backend/snmp.c 2010-05-11 17:31:16.267120141 +0100
-@@ -195,6 +195,7 @@ static const int LexmarkProductOID[] = {
+diff -up cups-1.5b1/backend/snmp.c.ricoh-deviceid-oid cups-1.5b1/backend/snmp.c
+--- cups-1.5b1/backend/snmp.c.ricoh-deviceid-oid 2011-05-24 17:29:48.000000000 +0200
++++ cups-1.5b1/backend/snmp.c 2011-05-24 17:29:48.000000000 +0200
+@@ -188,6 +188,7 @@ static const int LexmarkProductOID[] = {
static const int LexmarkProductOID2[] = { 1,3,6,1,4,1,674,10898,100,2,1,2,1,2,1,-1 };
static const int LexmarkDeviceIdOID[] = { 1,3,6,1,4,1,641,2,1,2,1,3,1,-1 };
static const int HPDeviceIdOID[] = { 1,3,6,1,4,1,11,2,3,9,1,1,7,0,-1 };
static const int XeroxProductOID[] = { 1,3,6,1,4,1,128,2,1,3,1,2,0,-1 };
static cups_array_t *DeviceURIs = NULL;
static int HostNameLookups = 0;
-@@ -1002,6 +1003,9 @@ read_snmp_response(int fd) /* I - SNMP
+@@ -1005,6 +1006,9 @@ read_snmp_response(int fd) /* I - SNMP
packet.community, CUPS_ASN1_GET_REQUEST,
DEVICE_ID, LexmarkDeviceIdOID);
_cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1,
--- /dev/null
+diff -up cups-1.6b1/config.h.in.systemd-socket cups-1.6b1/config.h.in
+--- cups-1.6b1/config.h.in.systemd-socket 2012-05-17 00:57:03.000000000 +0200
++++ cups-1.6b1/config.h.in 2012-05-28 11:16:35.657250584 +0200
+@@ -506,6 +506,13 @@
+
+
+ /*
++ * Do we have systemd support?
++ */
++
++#undef HAVE_SYSTEMD
++
++
++/*
+ * Various scripting languages...
+ */
+
+diff -up cups-1.6b1/config-scripts/cups-systemd.m4.systemd-socket cups-1.6b1/config-scripts/cups-systemd.m4
+--- cups-1.6b1/config-scripts/cups-systemd.m4.systemd-socket 2012-05-28 11:16:35.658250577 +0200
++++ cups-1.6b1/config-scripts/cups-systemd.m4 2012-05-28 11:16:35.658250577 +0200
+@@ -0,0 +1,36 @@
++dnl
++dnl "$Id$"
++dnl
++dnl systemd stuff for CUPS.
++
++dnl Find whether systemd is available
++
++SDLIBS=""
++AC_ARG_WITH([systemdsystemunitdir],
++ AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
++ [], [with_systemdsystemunitdir=$($PKGCONFIG --variable=systemdsystemunitdir systemd)])
++if test "x$with_systemdsystemunitdir" != xno; then
++ AC_MSG_CHECKING(for libsystemd-daemon)
++ if $PKGCONFIG --exists libsystemd-daemon; then
++ AC_MSG_RESULT(yes)
++ SDCFLAGS=`$PKGCONFIG --cflags libsystemd-daemon`
++ SDLIBS=`$PKGCONFIG --libs libsystemd-daemon`
++ AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
++ AC_DEFINE(HAVE_SYSTEMD)
++ else
++ AC_MSG_RESULT(no)
++ fi
++fi
++
++if test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != xno ; then
++ SYSTEMD_UNITS="cups.service cups.socket cups.path"
++else
++ SYSTEMD_UNITS=""
++fi
++
++AC_SUBST(SYSTEMD_UNITS)
++AC_SUBST(SDLIBS)
++
++dnl
++dnl "$Id$"
++dnl
+diff -up cups-1.6b1/configure.in.systemd-socket cups-1.6b1/configure.in
+--- cups-1.6b1/configure.in.systemd-socket 2012-04-23 19:26:57.000000000 +0200
++++ cups-1.6b1/configure.in 2012-05-28 11:16:35.658250577 +0200
+@@ -33,6 +33,7 @@ sinclude(config-scripts/cups-pam.m4)
+ sinclude(config-scripts/cups-largefile.m4)
+ sinclude(config-scripts/cups-dnssd.m4)
+ sinclude(config-scripts/cups-launchd.m4)
++sinclude(config-scripts/cups-systemd.m4)
+ sinclude(config-scripts/cups-defaults.m4)
+ sinclude(config-scripts/cups-scripting.m4)
+
+@@ -66,6 +67,9 @@ AC_OUTPUT(Makedefs
+ conf/snmp.conf
+ cups-config
+ data/testprint
++ data/cups.service
++ data/cups.socket
++ data/cups.path
+ desktop/cups.desktop
+ doc/help/ref-cupsd-conf.html
+ doc/help/standard.html
+diff -up cups-1.6b1/cups/usersys.c.systemd-socket cups-1.6b1/cups/usersys.c
+--- cups-1.6b1/cups/usersys.c.systemd-socket 2012-04-23 19:26:57.000000000 +0200
++++ cups-1.6b1/cups/usersys.c 2012-05-28 11:16:35.659250570 +0200
+@@ -975,7 +975,7 @@ cups_read_client_conf(
+ struct stat sockinfo; /* Domain socket information */
+
+ if (!stat(CUPS_DEFAULT_DOMAINSOCKET, &sockinfo) &&
+- (sockinfo.st_mode & S_IRWXO) == S_IRWXO)
++ (sockinfo.st_mode & (S_IROTH | S_IWOTH)) == (S_IROTH | S_IWOTH))
+ cups_server = CUPS_DEFAULT_DOMAINSOCKET;
+ else
+ #endif /* CUPS_DEFAULT_DOMAINSOCKET */
+diff -up cups-1.6b1/data/cups.path.in.systemd-socket cups-1.6b1/data/cups.path.in
+--- cups-1.6b1/data/cups.path.in.systemd-socket 2012-05-28 11:16:35.659250570 +0200
++++ cups-1.6b1/data/cups.path.in 2012-05-28 11:16:35.659250570 +0200
+@@ -0,0 +1,8 @@
++[Unit]
++Description=CUPS Printer Service Spool
++
++[Path]
++PathExistsGlob=@CUPS_REQUESTS@/d*
++
++[Install]
++WantedBy=multi-user.target
+diff -up cups-1.6b1/data/cups.service.in.systemd-socket cups-1.6b1/data/cups.service.in
+--- cups-1.6b1/data/cups.service.in.systemd-socket 2012-05-28 11:16:35.659250570 +0200
++++ cups-1.6b1/data/cups.service.in 2012-05-28 11:16:35.659250570 +0200
+@@ -0,0 +1,10 @@
++[Unit]
++Description=CUPS Printing Service
++
++[Service]
++ExecStart=@sbindir@/cupsd -f
++PrivateTmp=true
++
++[Install]
++Also=cups.socket cups.path
++WantedBy=printer.target
+diff -up cups-1.6b1/data/cups.socket.in.systemd-socket cups-1.6b1/data/cups.socket.in
+--- cups-1.6b1/data/cups.socket.in.systemd-socket 2012-05-28 11:16:35.660250563 +0200
++++ cups-1.6b1/data/cups.socket.in 2012-05-28 11:16:35.660250563 +0200
+@@ -0,0 +1,8 @@
++[Unit]
++Description=CUPS Printing Service Sockets
++
++[Socket]
++ListenStream=@CUPS_DEFAULT_DOMAINSOCKET@
++
++[Install]
++WantedBy=sockets.target
+diff -up cups-1.6b1/data/Makefile.systemd-socket cups-1.6b1/data/Makefile
+--- cups-1.6b1/data/Makefile.systemd-socket 2011-08-27 11:23:01.000000000 +0200
++++ cups-1.6b1/data/Makefile 2012-05-28 11:16:35.660250563 +0200
+@@ -100,6 +100,12 @@ install-data:
+ $(INSTALL_DATA) $$file $(DATADIR)/ppdc; \
+ done
+ $(INSTALL_DIR) -m 755 $(DATADIR)/profiles
++ if test "x$(SYSTEMD_UNITS)" != "x" ; then \
++ $(INSTALL_DIR) -m 755 $(SYSTEMDUNITDIR); \
++ for file in $(SYSTEMD_UNITS); do \
++ $(INSTALL_DATA) $$file $(SYSTEMDUNITDIR); \
++ done; \
++ fi
+
+
+ #
+@@ -143,6 +149,9 @@ uninstall:
+ -$(RMDIR) $(DATADIR)/data
+ -$(RMDIR) $(DATADIR)/banners
+ -$(RMDIR) $(DATADIR)
++ for file in $(SYSTEMD_UNITS); do \
++ $(RM) $(SYSTEMDUNITDIR)/$$file; \
++ done
+
+
+ #
+diff -up cups-1.6b1/Makedefs.in.systemd-socket cups-1.6b1/Makedefs.in
+--- cups-1.6b1/Makedefs.in.systemd-socket 2012-05-28 11:16:35.648250647 +0200
++++ cups-1.6b1/Makedefs.in 2012-05-28 11:16:35.660250563 +0200
+@@ -134,11 +134,13 @@ CXXFLAGS = @CPPFLAGS@ @CXXFLAGS@
+ CXXLIBS = @CXXLIBS@
+ DBUS_NOTIFIER = @DBUS_NOTIFIER@
+ DBUS_NOTIFIERLIBS = @DBUS_NOTIFIERLIBS@
++SYSTEMD_UNITS = @SYSTEMD_UNITS@
+ DNSSD_BACKEND = @DNSSD_BACKEND@
+ DSOFLAGS = -L../cups @DSOFLAGS@
+ DSOLIBS = @DSOLIBS@ $(COMMONLIBS)
+ DNSSDLIBS = @DNSSDLIBS@
+ LAUNCHDLIBS = @LAUNCHDLIBS@
++SDLIBS = @SDLIBS@
+ LDFLAGS = -L../cgi-bin -L../cups -L../filter -L../ppdc \
+ -L../scheduler @LDARCHFLAGS@ \
+ @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM)
+@@ -229,6 +231,7 @@ PAMFILE = @PAMFILE@
+
+ DEFAULT_LAUNCHD_CONF = @DEFAULT_LAUNCHD_CONF@
+ DBUSDIR = @DBUSDIR@
++SYSTEMDUNITDIR = $(BUILDROOT)@systemdsystemunitdir@
+
+
+ #
+diff -up cups-1.6b1/scheduler/client.h.systemd-socket cups-1.6b1/scheduler/client.h
+--- cups-1.6b1/scheduler/client.h.systemd-socket 2012-03-22 21:30:20.000000000 +0100
++++ cups-1.6b1/scheduler/client.h 2012-05-28 11:16:35.661250556 +0200
+@@ -77,6 +77,9 @@ typedef struct
+ int fd; /* File descriptor for this server */
+ http_addr_t address; /* Bind address of socket */
+ http_encryption_t encryption; /* To encrypt or not to encrypt... */
++#ifdef HAVE_SYSTEMD
++ int is_systemd; /* Is this a systemd socket? */
++#endif /* HAVE_SYSTEMD */
+ } cupsd_listener_t;
+
+
+diff -up cups-1.6b1/scheduler/listen.c.systemd-socket cups-1.6b1/scheduler/listen.c
+--- cups-1.6b1/scheduler/listen.c.systemd-socket 2011-04-16 01:38:13.000000000 +0200
++++ cups-1.6b1/scheduler/listen.c 2012-05-28 11:16:35.661250556 +0200
+@@ -401,7 +401,11 @@ cupsdStopListening(void)
+ lis;
+ lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+ {
+- if (lis->fd != -1)
++ if (lis->fd != -1
++#ifdef HAVE_SYSTEMD
++ && !lis->is_systemd
++#endif /* HAVE_SYSTEMD */
++ )
+ {
+ #ifdef WIN32
+ closesocket(lis->fd);
+diff -up cups-1.6b1/scheduler/main.c.systemd-socket cups-1.6b1/scheduler/main.c
+--- cups-1.6b1/scheduler/main.c.systemd-socket 2012-05-28 11:16:35.612250897 +0200
++++ cups-1.6b1/scheduler/main.c 2012-05-28 12:49:32.698375139 +0200
+@@ -26,6 +26,8 @@
+ * launchd_checkin() - Check-in with launchd and collect the listening
+ * fds.
+ * launchd_checkout() - Update the launchd KeepAlive file as needed.
++ * systemd_checkin() - Check-in with systemd and collect the
++ * listening fds.
+ * parent_handler() - Catch USR1/CHLD signals...
+ * process_children() - Process all dead children...
+ * select_timeout() - Calculate the select timeout value.
+@@ -62,6 +64,10 @@
+ # endif /* !LAUNCH_JOBKEY_SERVICEIPC */
+ #endif /* HAVE_LAUNCH_H */
+
++#ifdef HAVE_SYSTEMD
++#include <systemd/sd-daemon.h>
++#endif /* HAVE_SYSTEMD */
++
+ #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
+ # include <malloc.h>
+ #endif /* HAVE_MALLOC_H && HAVE_MALLINFO */
+@@ -78,6 +84,9 @@
+ static void launchd_checkin(void);
+ static void launchd_checkout(void);
+ #endif /* HAVE_LAUNCHD */
++#ifdef HAVE_SYSTEMD
++static void systemd_checkin(void);
++#endif /* HAVE_SYSTEMD */
+ static void parent_handler(int sig);
+ static void process_children(void);
+ static void sigchld_handler(int sig);
+@@ -528,6 +537,13 @@ main(int argc, /* I - Number of comm
+ }
+ #endif /* HAVE_LAUNCHD */
+
++#ifdef HAVE_SYSTEMD
++ /*
++ * If we were started by systemd get the listen sockets file descriptors...
++ */
++ systemd_checkin();
++#endif /* HAVE_SYSTEMD */
++
+ /*
+ * Startup the server...
+ */
+@@ -738,6 +754,15 @@ main(int argc, /* I - Number of comm
+ }
+ #endif /* HAVE_LAUNCHD */
+
++#ifdef HAVE_SYSTEMD
++ /*
++ * If we were started by systemd get the listen sockets file
++ * descriptors...
++ */
++
++ systemd_checkin();
++#endif /* HAVE_SYSTEMD */
++
+ /*
+ * Startup the server...
+ */
+@@ -1516,6 +1541,102 @@ launchd_checkout(void)
+ }
+ #endif /* HAVE_LAUNCHD */
+
++#ifdef HAVE_SYSTEMD
++static void
++systemd_checkin(void)
++{
++ int n, fd;
++
++ n = sd_listen_fds(0);
++ if (n < 0)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "systemd_checkin: Failed to acquire sockets from systemd - %s",
++ strerror(-n));
++ exit(EXIT_FAILURE);
++ return;
++ }
++
++ if (n == 0)
++ return;
++
++ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++)
++ {
++ http_addr_t addr;
++ socklen_t addrlen = sizeof (addr);
++ int r;
++ cupsd_listener_t *lis;
++ char s[256];
++
++ r = sd_is_socket(fd, AF_UNSPEC, SOCK_STREAM, 1);
++ if (r < 0)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "systemd_checkin: Unable to verify socket type - %s",
++ strerror(-r));
++ continue;
++ }
++
++ if (!r)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "systemd_checkin: Socket not of the right type");
++ continue;
++ }
++
++ if (getsockname(fd, (struct sockaddr*) &addr, &addrlen))
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "systemd_checkin: Unable to get local address - %s",
++ strerror(errno));
++ continue;
++ }
++
++ /*
++ * Try to match the systemd socket address to one of the listeners...
++ */
++
++ for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
++ lis;
++ lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
++ if (httpAddrEqual(&lis->address, &addr))
++ break;
++
++ if (lis)
++ {
++ cupsdLogMessage(CUPSD_LOG_DEBUG,
++ "systemd_checkin: Matched existing listener %s with fd %d...",
++ httpAddrString(&(lis->address), s, sizeof(s)), fd);
++ }
++ else
++ {
++ cupsdLogMessage(CUPSD_LOG_DEBUG,
++ "systemd_checkin: Adding new listener %s with fd %d...",
++ httpAddrString(&addr, s, sizeof(s)), fd);
++
++ if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR,
++ "systemd_checkin: Unable to allocate listener - "
++ "%s.", strerror(errno));
++ exit(EXIT_FAILURE);
++ }
++
++ cupsArrayAdd(Listeners, lis);
++
++ memcpy(&lis->address, &addr, sizeof(lis->address));
++ }
++
++ lis->fd = fd;
++ lis->is_systemd = 1;
++
++# ifdef HAVE_SSL
++ if (_httpAddrPort(&(lis->address)) == 443)
++ lis->encryption = HTTP_ENCRYPT_ALWAYS;
++# endif /* HAVE_SSL */
++ }
++}
++#endif /* HAVE_SYSTEMD */
+
+ /*
+ * 'parent_handler()' - Catch USR1/CHLD signals...
+diff -up cups-1.6b1/scheduler/Makefile.systemd-socket cups-1.6b1/scheduler/Makefile
+--- cups-1.6b1/scheduler/Makefile.systemd-socket 2012-05-21 19:40:22.000000000 +0200
++++ cups-1.6b1/scheduler/Makefile 2012-05-28 11:16:35.663250542 +0200
+@@ -371,7 +371,7 @@ cupsd: $(CUPSDOBJS) $(LIBCUPSMIME) ../cu
+ $(CC) $(LDFLAGS) -o cupsd $(CUPSDOBJS) -L. -lcupsmime \
+ $(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
+ $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBS) \
+- $(LIBGSSAPI) $(LIBWRAP)
++ $(LIBGSSAPI) $(LIBWRAP) $(SDLIBS)
+
+ cupsd-static: $(CUPSDOBJS) libcupsmime.a ../cups/$(LIBCUPSSTATIC)
+ echo Linking $@...
+@@ -379,7 +379,7 @@ cupsd-static: $(CUPSDOBJS) libcupsmime.a
+ $(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
+ ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(LIBPAPER) \
+ $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBGSSAPI) \
+- $(LIBWRAP)
++ $(LIBWRAP) $(SDLIBS)
+
+ tls.o: tls-darwin.c tls-gnutls.c tls-openssl.c
+
-diff -up cups-1.4.5/config.h.in.lspp cups-1.4.5/config.h.in
---- cups-1.4.5/config.h.in.lspp 2010-12-24 13:21:31.134859403 +0000
-+++ cups-1.4.5/config.h.in 2010-12-24 13:21:31.173858387 +0000
-@@ -672,6 +672,12 @@
- #undef HAVE_SYS_STATVFS_H
- #undef HAVE_SYS_VFS_H
+diff -up cups-1.6b1/config.h.in.lspp cups-1.6b1/config.h.in
+--- cups-1.6b1/config.h.in.lspp 2012-05-25 17:01:32.000000000 +0200
++++ cups-1.6b1/config.h.in 2012-05-25 17:03:16.889043298 +0200
+@@ -768,6 +768,13 @@ static __inline int _cups_abs(int i) { r
+ # endif /* __GNUC__ || __STDC_VERSION__ */
+ #endif /* !HAVE_ABS && !abs */
+/*
+ * Are we trying to meet LSPP requirements?
+
+#undef WITH_LSPP
+
-
++
#endif /* !_CUPS_CONFIG_H_ */
-diff -up cups-1.4.5/config-scripts/cups-lspp.m4.lspp cups-1.4.5/config-scripts/cups-lspp.m4
---- cups-1.4.5/config-scripts/cups-lspp.m4.lspp 2010-12-24 13:21:31.174858361 +0000
-+++ cups-1.4.5/config-scripts/cups-lspp.m4 2010-12-24 13:21:31.174858361 +0000
+ /*
+diff -up cups-1.6b1/config-scripts/cups-lspp.m4.lspp cups-1.6b1/config-scripts/cups-lspp.m4
+--- cups-1.6b1/config-scripts/cups-lspp.m4.lspp 2012-05-25 17:01:32.852768495 +0200
++++ cups-1.6b1/config-scripts/cups-lspp.m4 2012-05-25 17:01:32.853768488 +0200
@@ -0,0 +1,36 @@
+dnl
+dnl LSPP code for the Common UNIX Printing System (CUPS).
+ ;;
+ esac
+fi
-diff -up cups-1.4.5/configure.in.lspp cups-1.4.5/configure.in
---- cups-1.4.5/configure.in.lspp 2010-06-22 22:42:44.000000000 +0100
-+++ cups-1.4.5/configure.in 2010-12-24 13:21:31.174858362 +0000
-@@ -42,6 +42,8 @@ sinclude(config-scripts/cups-pap.m4)
- sinclude(config-scripts/cups-pdf.m4)
+diff -up cups-1.6b1/configure.in.lspp cups-1.6b1/configure.in
+--- cups-1.6b1/configure.in.lspp 2012-05-25 17:01:32.000000000 +0200
++++ cups-1.6b1/configure.in 2012-05-25 17:04:03.994714943 +0200
+@@ -37,6 +37,8 @@ sinclude(config-scripts/cups-systemd.m4)
+ sinclude(config-scripts/cups-defaults.m4)
sinclude(config-scripts/cups-scripting.m4)
+sinclude(config-scripts/cups-lspp.m4)
INSTALL_LANGUAGES=""
UNINSTALL_LANGUAGES=""
LANGFILES=""
-diff -up cups-1.4.5/cups/cups.h.lspp cups-1.4.5/cups/cups.h
---- cups-1.4.5/cups/cups.h.lspp 2010-06-22 04:18:27.000000000 +0100
-+++ cups-1.4.5/cups/cups.h 2010-12-24 13:21:31.176858307 +0000
-@@ -15,6 +15,9 @@
- * This file is subject to the Apple OS-Developed Software exception.
- */
-
-+/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */
-+/* (c) Copyright 2005-2006 Hewlett-Packard Development Company, L.P. */
-+
- #ifndef _CUPS_CUPS_H_
- # define _CUPS_CUPS_H_
-
-@@ -86,6 +89,12 @@ extern "C" {
- # define CUPS_WHICHJOBS_COMPLETED 1
-
-
-+# ifdef WITH_LSPP
-+# define MLS_CONFIG "mls"
-+# define TE_CONFIG "te"
-+# define SELINUX_CONFIG "SELinux"
-+# define UNKNOWN_SL "UNKNOWN SL"
-+# endif /* WITH_LSPP */
- /*
- * Types and structures...
- */
-diff -up cups-1.4.5/data/Makefile.lspp cups-1.4.5/data/Makefile
---- cups-1.4.5/data/Makefile.lspp 2008-11-12 19:30:57.000000000 +0000
-+++ cups-1.4.5/data/Makefile 2010-12-24 13:21:31.177858282 +0000
-@@ -25,7 +25,10 @@ BANNERS = \
- secret \
- standard \
- topsecret \
-- unclassified
-+ unclassified \
-+ selinux \
-+ mls \
-+ te
-
- CHARMAPS = \
- euc-cn.txt \
-diff -up cups-1.4.5/data/mls.lspp cups-1.4.5/data/mls
---- cups-1.4.5/data/mls.lspp 2010-12-24 13:21:31.177858282 +0000
-+++ cups-1.4.5/data/mls 2010-12-24 13:21:31.178858258 +0000
-@@ -0,0 +1,261 @@
-+%!PS-Adobe-3.0
-+%%BoundingBox: 0 0 612 792
-+%%Pages: 1
-+%%LanguageLevel: 1
-+%%DocumentData: Clean7Bit
-+%%DocumentSuppliedResources: procset bannerprint/1.0
-+%%DocumentNeededResources: font Helvetica Helvetica-Bold Times-Roman
-+%%Creator: Michael Sweet, Easy Software Products
-+%%CreationDate: May 10, 2000
-+%%Title: Test Page
-+%%EndComments
-+%%BeginProlog
-+%%BeginResource procset bannerprint 1.1 0
-+%
-+% PostScript banner page for the Common UNIX Printing System ("CUPS").
-+%
-+% Copyright 1993-2005 by Easy Software Products
-+%
-+% These coded instructions, statements, and computer programs are the
-+% property of Easy Software Products and are protected by Federal
-+% copyright law. Distribution and use rights are outlined in the file
-+% "LICENSE.txt" which should have been included with this file. If this
-+% file is missing or damaged please contact Easy Software Products
-+% at:
-+%
-+% Attn: CUPS Licensing Information
-+% Easy Software Products
-+% 44141 Airport View Drive, Suite 204
-+% Hollywood, Maryland 20636 USA
-+%
-+% Voice: (301) 373-9600
-+% EMail: cups-info@cups.org
-+% WWW: http://www.cups.org
-+%
-+/CENTER { % Draw centered text
-+ % (name) CENTER -
-+ dup stringwidth pop % Get the width of the string
-+ 0.5 mul neg 0 rmoveto % Shift left 1/2 of the distance
-+ show % Show the string
-+} bind def
-+/RIGHT { % Draw right-justified text
-+ % (name) RIGHT -
-+ dup stringwidth pop % Get the width of the string
-+ neg 0 rmoveto % Shift left the entire distance
-+ show % Show the string
-+} bind def
-+/NUMBER { % Draw a number
-+ % power n NUMBER -
-+ 1 index 1 eq { % power == 1?
-+ round cvi exch pop % Convert "n" to integer
-+ } {
-+ 1 index mul round exch div % Truncate extra decimal places
-+ } ifelse
-+ 100 string cvs show % Convert to a string and show it...
-+} bind def
-+/CUPSLOGO { % Draw the CUPS logo
-+ % height CUPSLOGO
-+ % Start with a big C...
-+ /Helvetica findfont 1 index scalefont setfont
-+ 0 setgray
-+ 0 0 moveto
-+ (C) show
-+
-+ % Then "UNIX Printing System" much smaller...
-+ /Helvetica-Bold findfont 1 index 9 div scalefont setfont
-+ 0.25 mul
-+ dup dup 2.0 mul moveto
-+ (UNIX) show
-+ dup dup 1.6 mul moveto
-+ (Printing) show
-+ dup 1.2 mul moveto
-+ (System) show
-+} bind def
-+/ESPLOGO { % Draw the ESP logo
-+ % height ESPLOGO
-+ % Compute the size of the logo...
-+ 0 0
-+ 2 index 1.5 mul 3 index
-+
-+ % Do the "metallic" fill from 10% black to 40% black...
-+ 1 -0.001 0 {
-+ dup % loopval
-+ -0.15 mul % loopval * -0.15
-+ 0.9 add % 0.9 - loopval * 0.15
-+ setgray % set gray shade
-+
-+ 0 % x
-+ 1 index neg % loopval
-+ 1 add % 1 - loopval
-+ 3 index % height
-+ mul % height * (1 - loopval)
-+ moveto % starting point
-+
-+ dup % loopval
-+ 3 index % width
-+ mul % loopval * width
-+ 2 index % height
-+ lineto % Next point
-+
-+ 0 % x
-+ 2 index % height
-+ lineto % Next point
-+
-+ closepath
-+ fill
-+
-+ dup % loopval
-+ 0.15 mul % loopval * 0.15
-+ 0.6 add % 0.6 + loopval * 0.15
-+ setgray
-+
-+ dup % loopval
-+ neg 1 add % 1 - loopval
-+ 3 index % width
-+ mul % (1 - loopval) * width
-+ 0 % y
-+ moveto % Starting point
-+
-+ 2 index % width
-+ exch % loopval
-+ 2 index % height
-+ mul % loopval * height
-+ lineto % Next point
-+
-+ 1 index % width
-+ 0 % y
-+ lineto % Next point
-+
-+ closepath
-+ fill
-+ } for
-+
-+ 0 setgray rectstroke
-+
-+ /Helvetica-BoldOblique findfont 1 index 3 div scalefont setfont
-+ dup 40 div
-+
-+ dup 4 mul 1 index 25 mul moveto (E) show
-+ dup 10 mul 1 index 15 mul moveto (S) show
-+ dup 16 mul 1 index 5 mul moveto (P) show
-+
-+ /Helvetica-BoldOblique findfont 2 index 5 div scalefont setfont
-+ dup 14 mul 1 index 29 mul moveto (asy) show
-+ dup 20 mul 1 index 19 mul moveto (oftware) show
-+ dup 26 mul 1 index 9 mul moveto (roducts) show
-+
-+ pop
-+} bind def
-+%%EndResource
-+%%EndProlog
-+%%Page: 1 1
-+gsave
-+
-+ % Determine the imageable area and device resolution...
-+ initclip newpath clippath pathbbox % Get bounding rectangle
-+ 72 div /pageTop exch def % Get top margin in inches
-+ 72 div /pageRight exch def % Get right margin in inches
-+ 72 div /pageBottom exch def % Get bottom margin in inches
-+ 72 div /pageLeft exch def % Get left margin in inches
-+
-+ /pageWidth pageRight pageLeft sub def % pageWidth = pageRight - pageLeft
-+ /pageHeight pageTop pageBottom sub def% pageHeight = pageTop - pageBottom
-+
-+ /boxWidth % width of text box
-+ pageWidth pageHeight lt
-+ { pageWidth 54 mul }
-+ { pageHeight 42 mul }
-+ ifelse def
-+
-+ newpath % Clear bounding path
-+
-+ % Create fonts...
-+ /bigFont /Helvetica-Bold findfont % bigFont = Helvetica-Bold
-+ pageHeight 3 mul scalefont def % size = pageHeight * 3 (nominally 33)
-+
-+ /mediumFont /Helvetica findfont % mediumFont = Helvetica
-+ pageHeight 1.5 mul scalefont def % size = pageHeight * 1.5 (nominally 16.5)
-+
-+ % Offset page to account for lower-left margin...
-+ pageLeft 72 mul
-+ pageBottom 72 mul
-+ translate
-+
-+ % Job information box...
-+ pageWidth 36 mul 9 add % x = pageWidth * 1/2 * 72 + 9
-+ boxWidth 0.5 mul sub % x-= 1/2 box width
-+ pageHeight 30 mul 9 sub % y = pageHeight * 1/2 * 72 - 9
-+ boxWidth % w = box width
-+ pageHeight 14 mul % h = pageHeight * 1/2 * 72
-+ 0.5 setgray rectfill % Draw a shadow
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ boxWidth 0.5 mul sub % x-= 1/2 box width
-+ pageHeight 30 mul % y = pageHeight * 1/4 * 72
-+ boxWidth % w = box width
-+ pageHeight 14 mul % h = pageHeight * 1/2 * 72
-+
-+ 4 copy 1 setgray rectfill % Clear the box to white
-+ 0 setgray rectstroke % Draw a black box around it...
-+
-+ % Job information text...
-+ mediumFont setfont % Medium sized font
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight 5 mul add % y += 2 lines
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Job ID: ) RIGHT
-+ moveto
-+ ({printer-name}-{job-id}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight 2 mul add % y += 1 line
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Title: ) RIGHT
-+ moveto
-+ ({job-name}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight -1 mul add % y -= 1 line
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Requesting User: ) RIGHT
-+ moveto
-+ ({job-originating-user-name}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight -4 mul add % y -= 2 lines
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Billing Info: ) RIGHT
-+ moveto
-+ ({?job-billing}) show
-+
-+ % Then the CUPS logo....
-+ gsave
-+ pageWidth 4 mul
-+ pageWidth 6 mul
-+ translate
-+ pageWidth 9 mul CUPSLOGO
-+ grestore
-+
-+ % And the ESP logo....
-+ gsave
-+ pageWidth 59 mul
-+ pageWidth 6 mul
-+ translate
-+ pageWidth 6 mul ESPLOGO
-+ grestore
-+% Show the page...
-+grestore
-+showpage
-+%
-+% End of "$Id: mls_template,v 1.1 2005/06/27 18:44:46 colmo Exp $".
-+%
-+%%EOF
-diff -up cups-1.4.5/data/selinux.lspp cups-1.4.5/data/selinux
---- cups-1.4.5/data/selinux.lspp 2010-12-24 13:21:31.178858258 +0000
-+++ cups-1.4.5/data/selinux 2010-12-24 13:21:31.179858233 +0000
-@@ -0,0 +1,261 @@
-+%!PS-Adobe-3.0
-+%%BoundingBox: 0 0 612 792
-+%%Pages: 1
-+%%LanguageLevel: 1
-+%%DocumentData: Clean7Bit
-+%%DocumentSuppliedResources: procset bannerprint/1.0
-+%%DocumentNeededResources: font Helvetica Helvetica-Bold Times-Roman
-+%%Creator: Michael Sweet, Easy Software Products
-+%%CreationDate: May 10, 2000
-+%%Title: Test Page
-+%%EndComments
-+%%BeginProlog
-+%%BeginResource procset bannerprint 1.1 0
-+%
-+% PostScript banner page for the Common UNIX Printing System ("CUPS").
-+%
-+% Copyright 1993-2005 by Easy Software Products
-+%
-+% These coded instructions, statements, and computer programs are the
-+% property of Easy Software Products and are protected by Federal
-+% copyright law. Distribution and use rights are outlined in the file
-+% "LICENSE.txt" which should have been included with this file. If this
-+% file is missing or damaged please contact Easy Software Products
-+% at:
-+%
-+% Attn: CUPS Licensing Information
-+% Easy Software Products
-+% 44141 Airport View Drive, Suite 204
-+% Hollywood, Maryland 20636 USA
-+%
-+% Voice: (301) 373-9600
-+% EMail: cups-info@cups.org
-+% WWW: http://www.cups.org
-+%
-+/CENTER { % Draw centered text
-+ % (name) CENTER -
-+ dup stringwidth pop % Get the width of the string
-+ 0.5 mul neg 0 rmoveto % Shift left 1/2 of the distance
-+ show % Show the string
-+} bind def
-+/RIGHT { % Draw right-justified text
-+ % (name) RIGHT -
-+ dup stringwidth pop % Get the width of the string
-+ neg 0 rmoveto % Shift left the entire distance
-+ show % Show the string
-+} bind def
-+/NUMBER { % Draw a number
-+ % power n NUMBER -
-+ 1 index 1 eq { % power == 1?
-+ round cvi exch pop % Convert "n" to integer
-+ } {
-+ 1 index mul round exch div % Truncate extra decimal places
-+ } ifelse
-+ 100 string cvs show % Convert to a string and show it...
-+} bind def
-+/CUPSLOGO { % Draw the CUPS logo
-+ % height CUPSLOGO
-+ % Start with a big C...
-+ /Helvetica findfont 1 index scalefont setfont
-+ 0 setgray
-+ 0 0 moveto
-+ (C) show
-+
-+ % Then "UNIX Printing System" much smaller...
-+ /Helvetica-Bold findfont 1 index 9 div scalefont setfont
-+ 0.25 mul
-+ dup dup 2.0 mul moveto
-+ (UNIX) show
-+ dup dup 1.6 mul moveto
-+ (Printing) show
-+ dup 1.2 mul moveto
-+ (System) show
-+} bind def
-+/ESPLOGO { % Draw the ESP logo
-+ % height ESPLOGO
-+ % Compute the size of the logo...
-+ 0 0
-+ 2 index 1.5 mul 3 index
-+
-+ % Do the "metallic" fill from 10% black to 40% black...
-+ 1 -0.001 0 {
-+ dup % loopval
-+ -0.15 mul % loopval * -0.15
-+ 0.9 add % 0.9 - loopval * 0.15
-+ setgray % set gray shade
-+
-+ 0 % x
-+ 1 index neg % loopval
-+ 1 add % 1 - loopval
-+ 3 index % height
-+ mul % height * (1 - loopval)
-+ moveto % starting point
-+
-+ dup % loopval
-+ 3 index % width
-+ mul % loopval * width
-+ 2 index % height
-+ lineto % Next point
-+
-+ 0 % x
-+ 2 index % height
-+ lineto % Next point
-+
-+ closepath
-+ fill
-+
-+ dup % loopval
-+ 0.15 mul % loopval * 0.15
-+ 0.6 add % 0.6 + loopval * 0.15
-+ setgray
-+
-+ dup % loopval
-+ neg 1 add % 1 - loopval
-+ 3 index % width
-+ mul % (1 - loopval) * width
-+ 0 % y
-+ moveto % Starting point
-+
-+ 2 index % width
-+ exch % loopval
-+ 2 index % height
-+ mul % loopval * height
-+ lineto % Next point
-+
-+ 1 index % width
-+ 0 % y
-+ lineto % Next point
-+
-+ closepath
-+ fill
-+ } for
-+
-+ 0 setgray rectstroke
-+
-+ /Helvetica-BoldOblique findfont 1 index 3 div scalefont setfont
-+ dup 40 div
-+
-+ dup 4 mul 1 index 25 mul moveto (E) show
-+ dup 10 mul 1 index 15 mul moveto (S) show
-+ dup 16 mul 1 index 5 mul moveto (P) show
-+
-+ /Helvetica-BoldOblique findfont 2 index 5 div scalefont setfont
-+ dup 14 mul 1 index 29 mul moveto (asy) show
-+ dup 20 mul 1 index 19 mul moveto (oftware) show
-+ dup 26 mul 1 index 9 mul moveto (roducts) show
-+
-+ pop
-+} bind def
-+%%EndResource
-+%%EndProlog
-+%%Page: 1 1
-+gsave
-+
-+ % Determine the imageable area and device resolution...
-+ initclip newpath clippath pathbbox % Get bounding rectangle
-+ 72 div /pageTop exch def % Get top margin in inches
-+ 72 div /pageRight exch def % Get right margin in inches
-+ 72 div /pageBottom exch def % Get bottom margin in inches
-+ 72 div /pageLeft exch def % Get left margin in inches
-+
-+ /pageWidth pageRight pageLeft sub def % pageWidth = pageRight - pageLeft
-+ /pageHeight pageTop pageBottom sub def% pageHeight = pageTop - pageBottom
-+
-+ /boxWidth % width of text box
-+ pageWidth pageHeight lt
-+ { pageWidth 54 mul }
-+ { pageHeight 42 mul }
-+ ifelse def
-+
-+ newpath % Clear bounding path
-+
-+ % Create fonts...
-+ /bigFont /Helvetica-Bold findfont % bigFont = Helvetica-Bold
-+ pageHeight 3 mul scalefont def % size = pageHeight * 3 (nominally 33)
-+
-+ /mediumFont /Helvetica findfont % mediumFont = Helvetica
-+ pageHeight 1.5 mul scalefont def % size = pageHeight * 1.5 (nominally 16.5)
-+
-+ % Offset page to account for lower-left margin...
-+ pageLeft 72 mul
-+ pageBottom 72 mul
-+ translate
-+
-+ % Job information box...
-+ pageWidth 36 mul 9 add % x = pageWidth * 1/2 * 72 + 9
-+ boxWidth 0.5 mul sub % x-= 1/2 box width
-+ pageHeight 30 mul 9 sub % y = pageHeight * 1/2 * 72 - 9
-+ boxWidth % w = box width
-+ pageHeight 14 mul % h = pageHeight * 1/2 * 72
-+ 0.5 setgray rectfill % Draw a shadow
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ boxWidth 0.5 mul sub % x-= 1/2 box width
-+ pageHeight 30 mul % y = pageHeight * 1/4 * 72
-+ boxWidth % w = box width
-+ pageHeight 14 mul % h = pageHeight * 1/2 * 72
-+
-+ 4 copy 1 setgray rectfill % Clear the box to white
-+ 0 setgray rectstroke % Draw a black box around it...
-+
-+ % Job information text...
-+ mediumFont setfont % Medium sized font
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight 5 mul add % y += 2 lines
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Job ID: ) RIGHT
-+ moveto
-+ ({printer-name}-{job-id}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight 2 mul add % y += 1 line
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Title: ) RIGHT
-+ moveto
-+ ({job-name}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight -1 mul add % y -= 1 line
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Requesting User: ) RIGHT
-+ moveto
-+ ({job-originating-user-name}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight -4 mul add % y -= 2 lines
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Billing Info: ) RIGHT
-+ moveto
-+ ({?job-billing}) show
-+
-+ % Then the CUPS logo....
-+ gsave
-+ pageWidth 4 mul
-+ pageWidth 6 mul
-+ translate
-+ pageWidth 9 mul CUPSLOGO
-+ grestore
-+
-+ % And the ESP logo....
-+ gsave
-+ pageWidth 59 mul
-+ pageWidth 6 mul
-+ translate
-+ pageWidth 6 mul ESPLOGO
-+ grestore
-+% Show the page...
-+grestore
-+showpage
-+%
-+% End of "$Id: mls_template,v 1.1 2005/06/27 18:44:46 colmo Exp $".
-+%
-+%%EOF
-diff -up cups-1.4.5/data/te.lspp cups-1.4.5/data/te
---- cups-1.4.5/data/te.lspp 2010-12-24 13:21:31.179858233 +0000
-+++ cups-1.4.5/data/te 2010-12-24 13:21:31.180858207 +0000
-@@ -0,0 +1,261 @@
-+%!PS-Adobe-3.0
-+%%BoundingBox: 0 0 612 792
-+%%Pages: 1
-+%%LanguageLevel: 1
-+%%DocumentData: Clean7Bit
-+%%DocumentSuppliedResources: procset bannerprint/1.0
-+%%DocumentNeededResources: font Helvetica Helvetica-Bold Times-Roman
-+%%Creator: Michael Sweet, Easy Software Products
-+%%CreationDate: May 10, 2000
-+%%Title: Test Page
-+%%EndComments
-+%%BeginProlog
-+%%BeginResource procset bannerprint 1.1 0
-+%
-+% PostScript banner page for the Common UNIX Printing System ("CUPS").
-+%
-+% Copyright 1993-2005 by Easy Software Products
-+%
-+% These coded instructions, statements, and computer programs are the
-+% property of Easy Software Products and are protected by Federal
-+% copyright law. Distribution and use rights are outlined in the file
-+% "LICENSE.txt" which should have been included with this file. If this
-+% file is missing or damaged please contact Easy Software Products
-+% at:
-+%
-+% Attn: CUPS Licensing Information
-+% Easy Software Products
-+% 44141 Airport View Drive, Suite 204
-+% Hollywood, Maryland 20636 USA
-+%
-+% Voice: (301) 373-9600
-+% EMail: cups-info@cups.org
-+% WWW: http://www.cups.org
-+%
-+/CENTER { % Draw centered text
-+ % (name) CENTER -
-+ dup stringwidth pop % Get the width of the string
-+ 0.5 mul neg 0 rmoveto % Shift left 1/2 of the distance
-+ show % Show the string
-+} bind def
-+/RIGHT { % Draw right-justified text
-+ % (name) RIGHT -
-+ dup stringwidth pop % Get the width of the string
-+ neg 0 rmoveto % Shift left the entire distance
-+ show % Show the string
-+} bind def
-+/NUMBER { % Draw a number
-+ % power n NUMBER -
-+ 1 index 1 eq { % power == 1?
-+ round cvi exch pop % Convert "n" to integer
-+ } {
-+ 1 index mul round exch div % Truncate extra decimal places
-+ } ifelse
-+ 100 string cvs show % Convert to a string and show it...
-+} bind def
-+/CUPSLOGO { % Draw the CUPS logo
-+ % height CUPSLOGO
-+ % Start with a big C...
-+ /Helvetica findfont 1 index scalefont setfont
-+ 0 setgray
-+ 0 0 moveto
-+ (C) show
-+
-+ % Then "UNIX Printing System" much smaller...
-+ /Helvetica-Bold findfont 1 index 9 div scalefont setfont
-+ 0.25 mul
-+ dup dup 2.0 mul moveto
-+ (UNIX) show
-+ dup dup 1.6 mul moveto
-+ (Printing) show
-+ dup 1.2 mul moveto
-+ (System) show
-+} bind def
-+/ESPLOGO { % Draw the ESP logo
-+ % height ESPLOGO
-+ % Compute the size of the logo...
-+ 0 0
-+ 2 index 1.5 mul 3 index
-+
-+ % Do the "metallic" fill from 10% black to 40% black...
-+ 1 -0.001 0 {
-+ dup % loopval
-+ -0.15 mul % loopval * -0.15
-+ 0.9 add % 0.9 - loopval * 0.15
-+ setgray % set gray shade
-+
-+ 0 % x
-+ 1 index neg % loopval
-+ 1 add % 1 - loopval
-+ 3 index % height
-+ mul % height * (1 - loopval)
-+ moveto % starting point
-+
-+ dup % loopval
-+ 3 index % width
-+ mul % loopval * width
-+ 2 index % height
-+ lineto % Next point
-+
-+ 0 % x
-+ 2 index % height
-+ lineto % Next point
-+
-+ closepath
-+ fill
-+
-+ dup % loopval
-+ 0.15 mul % loopval * 0.15
-+ 0.6 add % 0.6 + loopval * 0.15
-+ setgray
-+
-+ dup % loopval
-+ neg 1 add % 1 - loopval
-+ 3 index % width
-+ mul % (1 - loopval) * width
-+ 0 % y
-+ moveto % Starting point
-+
-+ 2 index % width
-+ exch % loopval
-+ 2 index % height
-+ mul % loopval * height
-+ lineto % Next point
-+
-+ 1 index % width
-+ 0 % y
-+ lineto % Next point
-+
-+ closepath
-+ fill
-+ } for
-+
-+ 0 setgray rectstroke
-+
-+ /Helvetica-BoldOblique findfont 1 index 3 div scalefont setfont
-+ dup 40 div
-+
-+ dup 4 mul 1 index 25 mul moveto (E) show
-+ dup 10 mul 1 index 15 mul moveto (S) show
-+ dup 16 mul 1 index 5 mul moveto (P) show
-+
-+ /Helvetica-BoldOblique findfont 2 index 5 div scalefont setfont
-+ dup 14 mul 1 index 29 mul moveto (asy) show
-+ dup 20 mul 1 index 19 mul moveto (oftware) show
-+ dup 26 mul 1 index 9 mul moveto (roducts) show
-+
-+ pop
-+} bind def
-+%%EndResource
-+%%EndProlog
-+%%Page: 1 1
-+gsave
-+
-+ % Determine the imageable area and device resolution...
-+ initclip newpath clippath pathbbox % Get bounding rectangle
-+ 72 div /pageTop exch def % Get top margin in inches
-+ 72 div /pageRight exch def % Get right margin in inches
-+ 72 div /pageBottom exch def % Get bottom margin in inches
-+ 72 div /pageLeft exch def % Get left margin in inches
-+
-+ /pageWidth pageRight pageLeft sub def % pageWidth = pageRight - pageLeft
-+ /pageHeight pageTop pageBottom sub def% pageHeight = pageTop - pageBottom
-+
-+ /boxWidth % width of text box
-+ pageWidth pageHeight lt
-+ { pageWidth 54 mul }
-+ { pageHeight 42 mul }
-+ ifelse def
-+
-+ newpath % Clear bounding path
-+
-+ % Create fonts...
-+ /bigFont /Helvetica-Bold findfont % bigFont = Helvetica-Bold
-+ pageHeight 3 mul scalefont def % size = pageHeight * 3 (nominally 33)
-+
-+ /mediumFont /Helvetica findfont % mediumFont = Helvetica
-+ pageHeight 1.5 mul scalefont def % size = pageHeight * 1.5 (nominally 16.5)
-+
-+ % Offset page to account for lower-left margin...
-+ pageLeft 72 mul
-+ pageBottom 72 mul
-+ translate
-+
-+ % Job information box...
-+ pageWidth 36 mul 9 add % x = pageWidth * 1/2 * 72 + 9
-+ boxWidth 0.5 mul sub % x-= 1/2 box width
-+ pageHeight 30 mul 9 sub % y = pageHeight * 1/2 * 72 - 9
-+ boxWidth % w = box width
-+ pageHeight 14 mul % h = pageHeight * 1/2 * 72
-+ 0.5 setgray rectfill % Draw a shadow
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ boxWidth 0.5 mul sub % x-= 1/2 box width
-+ pageHeight 30 mul % y = pageHeight * 1/4 * 72
-+ boxWidth % w = box width
-+ pageHeight 14 mul % h = pageHeight * 1/2 * 72
-+
-+ 4 copy 1 setgray rectfill % Clear the box to white
-+ 0 setgray rectstroke % Draw a black box around it...
-+
-+ % Job information text...
-+ mediumFont setfont % Medium sized font
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight 5 mul add % y += 2 lines
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Job ID: ) RIGHT
-+ moveto
-+ ({printer-name}-{job-id}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight 2 mul add % y += 1 line
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Title: ) RIGHT
-+ moveto
-+ ({job-name}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight -1 mul add % y -= 1 line
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Requesting User: ) RIGHT
-+ moveto
-+ ({job-originating-user-name}) show
-+
-+ pageWidth 36 mul % x = pageWidth * 1/2 * 72
-+ pageHeight 36 mul % y = pageHeight * 1/2 * 72
-+ pageHeight -4 mul add % y -= 2 lines
-+ 2 copy % Copy X & Y
-+ moveto
-+ (Billing Info: ) RIGHT
-+ moveto
-+ ({?job-billing}) show
-+
-+ % Then the CUPS logo....
-+ gsave
-+ pageWidth 4 mul
-+ pageWidth 6 mul
-+ translate
-+ pageWidth 9 mul CUPSLOGO
-+ grestore
-+
-+ % And the ESP logo....
-+ gsave
-+ pageWidth 59 mul
-+ pageWidth 6 mul
-+ translate
-+ pageWidth 6 mul ESPLOGO
-+ grestore
-+% Show the page...
-+grestore
-+showpage
-+%
-+% End of "$Id: mls_template,v 1.1 2005/06/27 18:44:46 colmo Exp $".
-+%
-+%%EOF
-diff -up cups-1.4.5/filter/common.c.lspp cups-1.4.5/filter/common.c
---- cups-1.4.5/filter/common.c.lspp 2007-07-11 22:46:42.000000000 +0100
-+++ cups-1.4.5/filter/common.c 2010-12-24 13:21:31.181858180 +0000
+diff -up cups-1.6b1/filter/common.c.lspp cups-1.6b1/filter/common.c
+--- cups-1.6b1/filter/common.c.lspp 2011-05-20 05:49:49.000000000 +0200
++++ cups-1.6b1/filter/common.c 2012-05-25 17:01:32.854768481 +0200
@@ -30,6 +30,12 @@
* Include necessary headers...
*/
+ {
+ lines = 1 + (int)(label_len / max_width);
+ line_len = (int)(label_len / lines);
-+ wrapped_label = malloc(sizeof(wrapped_label) * lines);
++ wrapped_label = malloc(sizeof(*wrapped_label) * lines);
+ label_index = i = n = 0;
+ while (classification[label_index])
+ {
+ else
+ {
+ lines = 1;
-+ wrapped_label = malloc(sizeof(wrapped_label));
++ wrapped_label = malloc(sizeof(*wrapped_label));
+ wrapped_label[0] = (char*)classification;
+ }
+
/*
-diff -up cups-1.4.5/filter/pstops.c.lspp cups-1.4.5/filter/pstops.c
---- cups-1.4.5/filter/pstops.c.lspp 2010-12-24 13:21:30.960863932 +0000
-+++ cups-1.4.5/filter/pstops.c 2010-12-24 13:21:31.186858049 +0000
-@@ -3335,6 +3335,18 @@ write_label_prolog(pstops_doc_t *doc, /*
+diff -up cups-1.6b1/filter/pstops.c.lspp cups-1.6b1/filter/pstops.c
+--- cups-1.6b1/filter/pstops.c.lspp 2012-04-23 21:19:19.000000000 +0200
++++ cups-1.6b1/filter/pstops.c 2012-05-25 17:01:32.855768474 +0200
+@@ -3202,6 +3202,18 @@ write_label_prolog(pstops_doc_t *doc, /*
{
const char *classification; /* CLASSIFICATION environment variable */
const char *ptr; /* Temporary string pointer */
/*
-@@ -3357,6 +3369,124 @@ write_label_prolog(pstops_doc_t *doc, /*
+@@ -3224,6 +3236,124 @@ write_label_prolog(pstops_doc_t *doc, /*
return;
}
+ {
+ lines = 1 + (int)(label_len / max_width);
+ line_len = (int)(label_len / lines);
-+ wrapped_label = malloc(sizeof(wrapped_label) * lines);
++ wrapped_label = malloc(sizeof(*wrapped_label) * lines);
+ label_index = i = n = 0;
+ while (classification[label_index])
+ {
+ else
+ {
+ lines = 1;
-+ wrapped_label = malloc(sizeof(wrapped_label));
++ wrapped_label = malloc(sizeof(*wrapped_label));
+ wrapped_label[0] = (char*)classification;
+ }
+
/*
* Set the classification + page label string...
*/
-@@ -3435,7 +3565,10 @@ write_label_prolog(pstops_doc_t *doc, /*
+@@ -3302,7 +3432,10 @@ write_label_prolog(pstops_doc_t *doc, /*
doc_printf(doc, " %.0f moveto ESPpl show\n", top - 14.0);
doc_puts(doc, "pop\n");
doc_puts(doc, "}bind put\n");
/*
-diff -up cups-1.4.5/Makedefs.in.lspp cups-1.4.5/Makedefs.in
---- cups-1.4.5/Makedefs.in.lspp 2010-12-24 13:21:31.073860989 +0000
-+++ cups-1.4.5/Makedefs.in 2010-12-24 13:21:31.187858023 +0000
-@@ -146,7 +146,7 @@ LIBCUPSORDER = @LIBCUPSORDER@
- LIBCUPSIMAGEORDER = @LIBCUPSIMAGEORDER@
- LINKCUPS = @LINKCUPS@ $(SSLLIBS) $(DNSSDLIBS)
+diff -up cups-1.6b1/Makedefs.in.lspp cups-1.6b1/Makedefs.in
+--- cups-1.6b1/Makedefs.in.lspp 2012-05-25 17:01:32.000000000 +0200
++++ cups-1.6b1/Makedefs.in 2012-05-25 17:07:57.325088484 +0200
+@@ -146,7 +146,7 @@ LDFLAGS = -L../cgi-bin -L../cups -L../f
+ @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM)
+ LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(LIBZ)
LINKCUPSIMAGE = @LINKCUPSIMAGE@
-LIBS = $(LINKCUPS) $(COMMONLIBS)
+LIBS = $(LINKCUPS) $(COMMONLIBS) @LIBAUDIT@ @LIBSELINUX@
OPTIM = @OPTIM@
OPTIONS =
PAMLIBS = @PAMLIBS@
-@@ -258,7 +258,7 @@ DBUSDIR = @DBUSDIR@
- # Rules...
- #
-
--.SILENT:
-+
- .SUFFIXES: .1 .1.gz .1m .1m.gz .3 .3.gz .5 .5.gz .7 .7.gz .8 .8.gz .a .c .cxx .h .man .o .32.o .64.o .gz
-
- .c.o:
-diff -up cups-1.4.5/scheduler/client.c.lspp cups-1.4.5/scheduler/client.c
---- cups-1.4.5/scheduler/client.c.lspp 2010-10-17 05:13:56.000000000 +0100
-+++ cups-1.4.5/scheduler/client.c 2010-12-24 13:21:31.194857839 +0000
-@@ -44,6 +44,7 @@
- * valid_host() - Is the Host: field valid?
- * write_file() - Send a file via HTTP.
- * write_pipe() - Flag that data is available on the CGI pipe.
+diff -up cups-1.6b1/scheduler/client.c.lspp cups-1.6b1/scheduler/client.c
+--- cups-1.6b1/scheduler/client.c.lspp 2012-05-08 00:41:30.000000000 +0200
++++ cups-1.6b1/scheduler/client.c 2012-05-25 17:13:38.947707163 +0200
+@@ -41,6 +41,7 @@
+ * valid_host() - Is the Host: field valid?
+ * write_file() - Send a file via HTTP.
+ * write_pipe() - Flag that data is available on the CGI pipe.
+ * client_pid_to_auid() - Get the audit login uid of the client.
*/
/*
-@@ -52,6 +53,7 @@
+@@ -49,10 +50,16 @@
#include "cupsd.h"
+#define _GNU_SOURCE
- #ifdef HAVE_CDSASSL
- # include <Security/Security.h>
- # include <Security/SecItem.h>
-@@ -90,6 +92,12 @@ extern const char *cssmErrorString(int e
+ #ifdef HAVE_TCPD_H
# include <tcpd.h>
#endif /* HAVE_TCPD_H */
+#include <selinux/context.h>
+#include <fcntl.h>
+#endif /* WITH_LSPP */
-+
/*
- * Local functions...
-@@ -391,6 +399,57 @@ cupsdAcceptClient(cupsd_listener_t *lis)
+ * Local globals...
+@@ -371,6 +378,57 @@ cupsdAcceptClient(cupsd_listener_t *lis)
}
#endif /* HAVE_TCPD_H */
+ }
+#endif /* WITH_LSPP */
+
- #ifdef AF_INET6
- if (con->http.hostaddr->addr.sa_family == AF_INET6)
- cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAcceptClient: %d from %s:%d (IPv6)",
-@@ -781,6 +840,13 @@ cupsdReadClient(cupsd_client_t *con) /*
+ #ifdef AF_LOCAL
+ if (con->http.hostaddr->addr.sa_family == AF_LOCAL)
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Accepted from %s (Domain)",
+@@ -678,6 +736,13 @@ cupsdReadClient(cupsd_client_t *con) /*
mime_type_t *type; /* MIME type of file */
cupsd_printer_t *p; /* Printer */
static unsigned request_id = 0; /* Request ID for temp files */
status = HTTP_CONTINUE;
-@@ -2135,6 +2201,67 @@ cupsdReadClient(cupsd_client_t *con) /*
+@@ -2126,6 +2191,67 @@ cupsdReadClient(cupsd_client_t *con) /*
fchmod(con->file, 0640);
fchown(con->file, RunUser, Group);
fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
}
if (con->http.state != HTTP_POST_SEND)
-@@ -4641,6 +4768,50 @@ make_certificate(cupsd_client_t *con) /*
- #endif /* HAVE_SSL */
-
+@@ -3581,6 +3707,49 @@ is_path_absolute(const char *path) /* I
+ return (1);
+ }
+#ifdef WITH_LSPP
+/*
+ return uid;
+}
+#endif /* WITH_LSPP */
-+
+
/*
* 'pipe_command()' - Pipe the output of a command to the remote client.
- */
-diff -up cups-1.4.5/scheduler/client.h.lspp cups-1.4.5/scheduler/client.h
---- cups-1.4.5/scheduler/client.h.lspp 2009-05-26 23:01:23.000000000 +0100
-+++ cups-1.4.5/scheduler/client.h 2010-12-24 13:21:31.195857813 +0000
+diff -up cups-1.6b1/scheduler/client.h.lspp cups-1.6b1/scheduler/client.h
+--- cups-1.6b1/scheduler/client.h.lspp 2012-05-25 17:01:32.847768530 +0200
++++ cups-1.6b1/scheduler/client.h 2012-05-25 17:14:12.963470050 +0200
@@ -18,6 +18,13 @@
#endif /* HAVE_AUTHORIZATION_H */
/*
* HTTP client structure...
*/
-@@ -64,6 +71,10 @@ struct cupsd_client_s
+@@ -63,6 +70,10 @@ struct cupsd_client_s
#ifdef HAVE_AUTHORIZATION_H
AuthorizationRef authref; /* Authorization ref */
#endif /* HAVE_AUTHORIZATION_H */
};
#define HTTP(con) &((con)->http)
-@@ -133,6 +144,9 @@ extern void cupsdStartListening(void);
+@@ -135,6 +146,9 @@ extern void cupsdStartListening(void);
extern void cupsdStopListening(void);
extern void cupsdUpdateCGI(void);
extern void cupsdWriteClient(cupsd_client_t *con);
+extern uid_t client_pid_to_auid(pid_t clipid);
+#endif /* WITH_LSPP */
-
- /*
-diff -up cups-1.4.5/scheduler/conf.c.lspp cups-1.4.5/scheduler/conf.c
---- cups-1.4.5/scheduler/conf.c.lspp 2010-12-24 13:21:30.897865572 +0000
-+++ cups-1.4.5/scheduler/conf.c 2010-12-24 13:21:31.200857684 +0000
-@@ -29,6 +29,7 @@
- * read_configuration() - Read a configuration file.
+ #ifdef HAVE_SSL
+ extern int cupsdEndTLS(cupsd_client_t *con);
+diff -up cups-1.6b1/scheduler/conf.c.lspp cups-1.6b1/scheduler/conf.c
+--- cups-1.6b1/scheduler/conf.c.lspp 2012-05-25 17:01:32.778769011 +0200
++++ cups-1.6b1/scheduler/conf.c 2012-05-25 17:01:32.860768439 +0200
+@@ -32,6 +32,7 @@
* read_location() - Read a <Location path> definition.
* read_policy() - Read a <Policy name> definition.
+ * set_policy_defaults() - Set default policy values as needed.
+ * is_lspp_config() - Is the system configured for LSPP
*/
/*
-@@ -54,6 +55,9 @@
+@@ -57,6 +58,9 @@
# define INADDR_NONE 0xffffffff
#endif /* !INADDR_NONE */
/*
* Configuration variable structure...
-@@ -172,6 +176,10 @@ static const cupsd_var_t variables[] =
+@@ -164,6 +168,10 @@ static const cupsd_var_t variables[] =
# if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS)
{ "ServerKey", &ServerKey, CUPSD_VARTYPE_PATHNAME },
# endif /* HAVE_LIBSSL || HAVE_GNUTLS */
#endif /* HAVE_SSL */
{ "ServerName", &ServerName, CUPSD_VARTYPE_STRING },
{ "ServerRoot", &ServerRoot, CUPSD_VARTYPE_PATHNAME },
-@@ -430,6 +438,9 @@ cupsdReadConfiguration(void)
+@@ -537,6 +545,9 @@ cupsdReadConfiguration(void)
const char *tmpdir; /* TMPDIR environment variable */
struct stat tmpinfo; /* Temporary directory info */
cupsd_policy_t *p; /* Policy */
/*
-@@ -713,6 +724,25 @@ cupsdReadConfiguration(void)
+@@ -801,6 +812,25 @@ cupsdReadConfiguration(void)
RunUser = getuid();
cupsdLogMessage(CUPSD_LOG_INFO, "Remote access is %s.",
RemotePort ? "enabled" : "disabled");
-@@ -1081,11 +1111,23 @@ cupsdReadConfiguration(void)
- * Update classification setting as needed...
- */
-
-- if (Classification && !strcasecmp(Classification, "none"))
-+ if (Classification && strcasecmp(Classification, "none") == 0)
+@@ -1185,7 +1215,19 @@ cupsdReadConfiguration(void)
cupsdClearString(&Classification);
if (Classification)
/*
* Check the MaxClients setting, and then allocate memory for it...
-@@ -3657,6 +3699,18 @@ read_location(cups_file_t *fp, /* I - C
+@@ -3423,6 +3465,18 @@ read_location(cups_file_t *fp, /* I - C
return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum);
}
+int is_lspp_config()
+{
+ if (Classification != NULL)
-+ return ((strcasecmp(Classification, MLS_CONFIG) == 0)
-+ || (strcasecmp(Classification, TE_CONFIG) == 0)
-+ || (strcasecmp(Classification, SELINUX_CONFIG) == 0));
++ return ((_cups_strcasecmp(Classification, MLS_CONFIG) == 0)
++ || (_cups_strcasecmp(Classification, TE_CONFIG) == 0)
++ || (_cups_strcasecmp(Classification, SELINUX_CONFIG) == 0));
+ else
+ return 0;
+}
/*
* 'read_policy()' - Read a <Policy name> definition.
-diff -up cups-1.4.5/scheduler/conf.h.lspp cups-1.4.5/scheduler/conf.h
---- cups-1.4.5/scheduler/conf.h.lspp 2010-12-24 13:21:30.897865572 +0000
-+++ cups-1.4.5/scheduler/conf.h 2010-12-24 13:21:31.202857632 +0000
-@@ -250,6 +250,12 @@ VAR char *ServerKey VALUE(NULL);
- VAR int SSLOptions VALUE(CUPSD_SSL_NONE);
+diff -up cups-1.6b1/scheduler/conf.h.lspp cups-1.6b1/scheduler/conf.h
+--- cups-1.6b1/scheduler/conf.h.lspp 2012-05-25 17:01:32.000000000 +0200
++++ cups-1.6b1/scheduler/conf.h 2012-05-25 17:16:20.522580884 +0200
+@@ -247,6 +247,13 @@ VAR int SSLOptions VALUE(CUPSD_SSL_NO
/* SSL/TLS options */
#endif /* HAVE_SSL */
+
+#ifdef WITH_LSPP
+VAR int AuditLog VALUE(-1),
+ /* File descriptor for audit */
+ PerPageLabels VALUE(TRUE);
+ /* Put the label on each page */
+#endif /* WITH_LSPP */
-
++
#ifdef HAVE_LAUNCHD
- VAR int LaunchdTimeout VALUE(DEFAULT_KEEPALIVE);
-@@ -266,6 +272,9 @@ VAR char *SystemGroupAuthKey VALUE(NULL
- /* System group auth key */
- #endif /* HAVE_AUTHORIZATION_H */
+ VAR int LaunchdTimeout VALUE(10);
+ /* Time after which an idle cupsd will exit */
+@@ -265,6 +272,9 @@ int HaveServerCreds VALUE(0);
+ gss_cred_id_t ServerCreds; /* Server's GSS credentials */
+ #endif /* HAVE_GSSAPI */
+#ifdef WITH_LSPP
-+extern int is_lspp_config(void);
++extern int is_lspp_config(void);
+#endif /* WITH_LSPP */
/*
* Prototypes...
-diff -up cups-1.4.5/scheduler/ipp.c.lspp cups-1.4.5/scheduler/ipp.c
---- cups-1.4.5/scheduler/ipp.c.lspp 2010-12-24 13:21:31.114859924 +0000
-+++ cups-1.4.5/scheduler/ipp.c 2010-12-24 13:21:31.217857242 +0000
-@@ -41,6 +41,7 @@
- * cancel_all_jobs() - Cancel all print jobs.
+diff -up cups-1.6b1/scheduler/cupsd.h.lspp cups-1.6b1/scheduler/cupsd.h
+--- cups-1.6b1/scheduler/cupsd.h.lspp 2012-05-21 19:40:22.000000000 +0200
++++ cups-1.6b1/scheduler/cupsd.h 2012-05-25 17:01:32.861768432 +0200
+@@ -13,6 +13,8 @@
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ */
+
++/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */
++/* (c) Copyright 2005-2006 Hewlett-Packard Development Company, L.P. */
+
+ /*
+ * Include necessary headers.
+@@ -37,13 +39,20 @@
+ # include <unistd.h>
+ #endif /* WIN32 */
+
++#include "config.h"
++#ifdef WITH_LSPP
++# define MLS_CONFIG "mls"
++# define TE_CONFIG "te"
++# define SELINUX_CONFIG "SELinux"
++# define UNKNOWN_SL "UNKNOWN SL"
++#endif /* WITH_LSPP */
++
+ #include "mime.h"
+
+ #if defined(HAVE_CDSASSL)
+ # include <CoreFoundation/CoreFoundation.h>
+ #endif /* HAVE_CDSASSL */
+
+-
+ /*
+ * Some OS's don't have hstrerror(), most notably Solaris...
+ */
+diff -up cups-1.6b1/scheduler/ipp.c.lspp cups-1.6b1/scheduler/ipp.c
+--- cups-1.6b1/scheduler/ipp.c.lspp 2012-05-25 17:01:32.810768787 +0200
++++ cups-1.6b1/scheduler/ipp.c 2012-05-25 17:18:06.620841313 +0200
+@@ -35,6 +35,7 @@
+ * cancel_all_jobs() - Cancel all or selected print jobs.
* cancel_job() - Cancel a print job.
* cancel_subscription() - Cancel a subscription.
+ * check_context() - Check the SELinux context for a user and job
- * check_quotas() - Check quotas for a printer and user.
* check_rss_recipient() - Check that we do not have a duplicate RSS
* feed URI.
-@@ -102,6 +103,9 @@
+ * check_quotas() - Check quotas for a printer and user.
+@@ -99,6 +100,9 @@
* validate_user() - Validate the user for the request.
*/
/*
* Include necessary headers...
*/
-@@ -124,6 +128,14 @@ extern int mbr_check_membership_by_id(uu
+@@ -122,6 +126,14 @@ extern int mbr_check_membership_by_id(uu
# endif /* HAVE_MEMBERSHIPPRIV_H */
#endif /* __APPLE__ */
/*
* Local functions...
-@@ -157,6 +169,9 @@ static void cancel_all_jobs(cupsd_client
+@@ -146,6 +158,9 @@ static void cancel_all_jobs(cupsd_client
static void cancel_job(cupsd_client_t *con, ipp_attribute_t *uri);
static void cancel_subscription(cupsd_client_t *con, int id);
static int check_rss_recipient(const char *recipient);
+static int check_context(cupsd_client_t *con, cupsd_job_t *job);
+#endif /* WITH_LSPP */
static int check_quotas(cupsd_client_t *con, cupsd_printer_t *p);
- static ipp_attribute_t *copy_attribute(ipp_t *to, ipp_attribute_t *attr,
- int quickcopy);
-@@ -1354,6 +1369,21 @@ add_job(cupsd_client_t *con, /* I - Cl
+ 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,
+@@ -1285,6 +1300,21 @@ add_job(cupsd_client_t *con, /* I - Cl
ipp_attribute_t *media_col, /* media-col attribute */
*media_margin; /* media-*-margin attribute */
ipp_t *unsup_col; /* media-col in unsupported response */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))",
-@@ -1612,6 +1642,106 @@ add_job(cupsd_client_t *con, /* I - Cl
+@@ -1542,6 +1572,106 @@ add_job(cupsd_client_t *con, /* I - Cl
ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL,
"Untitled");
if ((job = cupsdAddJob(priority, printer->name)) == NULL)
{
send_ipp_status(con, IPP_INTERNAL_ERROR,
-@@ -1620,6 +1750,32 @@ add_job(cupsd_client_t *con, /* I - Cl
+@@ -1550,6 +1680,32 @@ add_job(cupsd_client_t *con, /* I - Cl
return (NULL);
}
+ }
+#endif /* WITH_LSPP */
+
- job->dtype = printer->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT |
- CUPS_PRINTER_REMOTE);
+ job->dtype = printer->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE);
job->attrs = con->request;
-@@ -1825,6 +1981,29 @@ add_job(cupsd_client_t *con, /* I - Cl
+ job->dirty = 1;
+@@ -1759,6 +1915,29 @@ add_job(cupsd_client_t *con, /* I - Cl
attr->values[0].string.text = _cupsStrRetain(printer->job_sheets[0]);
attr->values[1].string.text = _cupsStrRetain(printer->job_sheets[1]);
}
job->job_sheets = attr;
-@@ -1855,6 +2034,9 @@ add_job(cupsd_client_t *con, /* I - Cl
+@@ -1789,6 +1968,9 @@ add_job(cupsd_client_t *con, /* I - Cl
"job-sheets=\"%s,none\", "
"job-originating-user-name=\"%s\"",
Classification, job->username);
}
else if (attr->num_values == 2 &&
strcmp(attr->values[0].string.text,
-@@ -1873,6 +2055,9 @@ add_job(cupsd_client_t *con, /* I - Cl
+@@ -1807,6 +1989,9 @@ add_job(cupsd_client_t *con, /* I - Cl
"job-originating-user-name=\"%s\"",
attr->values[0].string.text,
attr->values[1].string.text, job->username);
}
else if (strcmp(attr->values[0].string.text, Classification) &&
strcmp(attr->values[0].string.text, "none") &&
-@@ -1893,6 +2078,9 @@ add_job(cupsd_client_t *con, /* I - Cl
+@@ -1827,6 +2012,9 @@ add_job(cupsd_client_t *con, /* I - Cl
"job-originating-user-name=\"%s\"",
attr->values[0].string.text,
attr->values[1].string.text, job->username);
}
}
else if (strcmp(attr->values[0].string.text, Classification) &&
-@@ -1933,8 +2121,52 @@ add_job(cupsd_client_t *con, /* I - Cl
+@@ -1867,8 +2055,52 @@ add_job(cupsd_client_t *con, /* I - Cl
"job-sheets=\"%s\", "
"job-originating-user-name=\"%s\"",
Classification, job->username);
/*
* See if we need to add the starting sheet...
-@@ -4289,6 +4521,107 @@ check_rss_recipient(
+@@ -3615,6 +3847,111 @@ check_rss_recipient(
}
+ cupsdLogMessage(CUPSD_LOG_ERROR, "check_context: unable to convert %s to SELinux sid", con->scon);
+ return -1;
+ }
-+ avc_context_to_sid(job->scon, &jobsid);
++ if (avc_context_to_sid(job->scon, &jobsid) != 0)
++ {
++ cupsdLogMessage(CUPSD_LOG_ERROR, "check_context: unable to convert %s to SELinux sid", job->scon);
++ return -1;
++ }
+ avc_entry_ref_init(&avcref);
+ tclass = SECCLASS_FILE;
+ avr = FILE__READ;
/*
* 'check_quotas()' - Check quotas for a printer and user.
*/
-@@ -4843,6 +5176,15 @@ copy_banner(cupsd_client_t *con, /* I -
+@@ -4067,6 +4404,15 @@ copy_banner(cupsd_client_t *con, /* I -
char attrname[255], /* Name of attribute */
*s; /* Pointer into name */
ipp_attribute_t *attr; /* Attribute */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
-@@ -4878,6 +5220,82 @@ copy_banner(cupsd_client_t *con, /* I -
+@@ -4102,6 +4448,82 @@ copy_banner(cupsd_client_t *con, /* I -
fchmod(cupsFileNumber(out), 0640);
fchown(cupsFileNumber(out), RunUser, Group);
/*
* Try the localized banner file under the subdirectory...
-@@ -4972,6 +5390,24 @@ copy_banner(cupsd_client_t *con, /* I -
+@@ -4196,6 +4618,24 @@ copy_banner(cupsd_client_t *con, /* I -
else
s = attrname;
+ if (job->scon != NULL && strncmp(job->scon, UNKNOWN_SL, strlen(UNKNOWN_SL)) != 0)
+ {
+ jobcon = context_new(job->scon);
-+ if (strcasecmp(name, MLS_CONFIG) == 0)
++ if (_cups_strcasecmp(name, MLS_CONFIG) == 0)
+ mls_label = context_range_get(jobcon);
-+ else if (strcasecmp(name, TE_CONFIG) == 0)
++ else if (_cups_strcasecmp(name, TE_CONFIG) == 0)
+ mls_label = context_type_get(jobcon);
+ else // default to using the whole context string
+ mls_label = context_str(jobcon);
if (!strcmp(s, "printer-name"))
{
cupsFilePuts(out, job->dest);
-@@ -6945,6 +7381,22 @@ get_job_attrs(cupsd_client_t *con, /* I
- return;
- }
+@@ -6273,6 +6713,22 @@ get_job_attrs(cupsd_client_t *con, /* I
+
+ exclude = cupsdGetPrivateAttrs(policy, con, printer, job->username);
+
+#ifdef WITH_LSPP
/*
* Copy attributes...
*/
-@@ -7175,6 +7627,11 @@ get_jobs(cupsd_client_t *con, /* I - C
- if (username[0] && strcasecmp(username, job->username))
- continue;
+@@ -6626,6 +7082,11 @@ get_jobs(cupsd_client_t *con, /* I - C
+ if (username[0] && _cups_strcasecmp(username, job->username))
+ continue;
+#ifdef WITH_LSPP
-+ if (is_lspp_config() && check_context(con, job) != 1)
-+ continue;
++ if (is_lspp_config() && check_context(con, job) != 1)
++ continue;
+#endif /* WITH_LSPP */
+
- if (count > 0)
- ippAddSeparator(con->response);
+ if (count > 0)
+ ippAddSeparator(con->response);
-@@ -11594,6 +12051,11 @@ validate_user(cupsd_job_t *job, /* I
+@@ -11106,6 +11567,11 @@ validate_user(cupsd_job_t *job, /* I
strlcpy(username, get_username(con), userlen);
/*
* Check the username against the owner...
*/
-diff -up cups-1.4.5/scheduler/job.c.lspp cups-1.4.5/scheduler/job.c
---- cups-1.4.5/scheduler/job.c.lspp 2010-12-24 13:21:31.028862162 +0000
-+++ cups-1.4.5/scheduler/job.c 2010-12-24 13:21:31.224857060 +0000
-@@ -66,6 +66,9 @@
- * update_job_attrs() - Update the job-printer-* attributes.
+diff -up cups-1.6b1/scheduler/job.c.lspp cups-1.6b1/scheduler/job.c
+--- cups-1.6b1/scheduler/job.c.lspp 2012-05-25 17:01:32.824768691 +0200
++++ cups-1.6b1/scheduler/job.c 2012-05-25 17:22:50.856860012 +0200
+@@ -68,6 +68,9 @@
+ * update_job_attrs() - Update the job-printer-* attributes.
*/
+/* Copyright (C) 2005 Trusted Computer Solutions, Inc. */
/*
* Include necessary headers...
*/
-@@ -75,6 +78,14 @@
- #include <cups/backend.h>
- #include <cups/dir.h>
+@@ -83,6 +86,14 @@
+ # endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */
+ #endif /* __APPLE__ */
+#ifdef WITH_LSPP
+#include <libaudit.h>
/*
* Design Notes for Job Management
-@@ -505,6 +516,14 @@ cupsdContinueJob(cupsd_job_t *job) /* I
- /* PRINTER env variable */
+@@ -580,6 +591,14 @@ cupsdContinueJob(cupsd_job_t *job) /* I
+ /* PRINTER_STATE_REASONS env var */
rip_max_cache[255];
/* RIP_MAX_CACHE env variable */
+#ifdef WITH_LSPP
cupsdLogMessage(CUPSD_LOG_DEBUG2,
-@@ -929,6 +948,67 @@ cupsdContinueJob(cupsd_job_t *job) /* I
+@@ -1071,6 +1090,67 @@ cupsdContinueJob(cupsd_job_t *job) /* I
}
}
+ else
+ label_template = strdup(attr->values[0].string.text);
+
-+ if (strcasecmp(label_template, MLS_CONFIG) == 0)
++ if (_cups_strcasecmp(label_template, MLS_CONFIG) == 0)
+ mls_label = context_range_get(jobcon);
-+ else if (strcasecmp(label_template, TE_CONFIG) == 0)
++ else if (_cups_strcasecmp(label_template, TE_CONFIG) == 0)
+ mls_label = context_type_get(jobcon);
-+ else if (strcasecmp(label_template, SELINUX_CONFIG) == 0)
++ else if (_cups_strcasecmp(label_template, SELINUX_CONFIG) == 0)
+ mls_label = context_str(jobcon);
+ else
+ mls_label = label_template;
if (Classification && !banner_page)
{
if ((attr = ippFindAttribute(job->attrs, "job-sheets",
-@@ -1165,13 +1245,13 @@ cupsdContinueJob(cupsd_job_t *job) /* I
- if (access(command, F_OK))
- {
- snprintf(command, sizeof(command), "%s/backend/%s", ServerBin_compat,
-- method);
-+ scheme);
- if (!access(command, F_OK))
- {
- /* Not in the correct directory, but we found it in the compat
- * directory. Issue a warning. */
- cupsdLogMessage(CUPSD_LOG_INFO,
-- "Backend '%s' not in %s/backend!", method,
-+ "Backend '%s' not in %s/backend!", scheme,
- ServerBin);
- }
- else
-@@ -1179,7 +1259,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I
- /* Not in the compat directory either; make any error
- messages use the correct directory name then. */
- snprintf(command, sizeof(command), "%s/backend/%s", ServerBin,
-- method);
-+ scheme);
- }
- }
- #endif /* __x86_64__ */
-@@ -1626,6 +1706,20 @@ cupsdLoadJob(cupsd_job_t *job) /* I - J
- goto error;
+@@ -1845,6 +1925,20 @@ cupsdLoadJob(cupsd_job_t *job) /* I - J
+ ippSetString(job->attrs, &job->reasons, 0, "none");
}
+#ifdef WITH_LSPP
job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed",
IPP_TAG_INTEGER);
job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
-@@ -2013,6 +2107,14 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J
+@@ -2235,6 +2329,14 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J
{
char filename[1024]; /* Job control filename */
cups_file_t *fp; /* Job file */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p",
-@@ -2031,6 +2133,76 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J
- fchmod(cupsFileNumber(fp), 0600);
+@@ -2247,6 +2349,76 @@ cupsdSaveJob(cupsd_job_t *job) /* I - J
+
fchown(cupsFileNumber(fp), RunUser, Group);
+#ifdef WITH_LSPP
job->attrs->state = IPP_IDLE;
if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL,
-@@ -3332,6 +3504,18 @@ get_options(cupsd_job_t *job, /* I - Jo
+@@ -3735,6 +3907,18 @@ get_options(cupsd_job_t *job, /* I - Jo
banner_page)
continue;
/*
* Otherwise add them to the list...
*/
-@@ -4020,6 +4204,19 @@ static void
+@@ -4457,6 +4641,19 @@ static void
start_job(cupsd_job_t *job, /* I - Job ID */
cupsd_printer_t *printer) /* I - Printer to print job */
{
cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))",
job, job->id, printer, printer->name);
-@@ -4142,6 +4339,108 @@ start_job(cupsd_job_t *job, /* I -
+@@ -4599,6 +4796,108 @@ start_job(cupsd_job_t *job, /* I -
fcntl(job->side_pipes[1], F_SETFD,
fcntl(job->side_pipes[1], F_GETFD) | FD_CLOEXEC);
/*
* Now start the first file in the job...
*/
-diff -up cups-1.4.5/scheduler/job.h.lspp cups-1.4.5/scheduler/job.h
---- cups-1.4.5/scheduler/job.h.lspp 2009-05-11 23:46:01.000000000 +0100
-+++ cups-1.4.5/scheduler/job.h 2010-12-24 13:21:31.225857034 +0000
+diff -up cups-1.6b1/scheduler/job.h.lspp cups-1.6b1/scheduler/job.h
+--- cups-1.6b1/scheduler/job.h.lspp 2012-05-23 03:36:50.000000000 +0200
++++ cups-1.6b1/scheduler/job.h 2012-05-25 17:23:41.802504888 +0200
@@ -13,6 +13,13 @@
* file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
* Constants...
*/
-@@ -83,6 +90,10 @@ struct cupsd_job_s /**** Job request *
- krb5_ccache ccache; /* Kerberos credential cache */
- char *ccname; /* KRB5CCNAME environment variable */
- #endif /* HAVE_GSSAPI */
+@@ -82,6 +89,10 @@ struct cupsd_job_s /**** Job request *
+ int progress; /* Printing progress */
+ int num_keywords; /* Number of PPD keywords */
+ cups_option_t *keywords; /* PPD keywords */
+#ifdef WITH_LSPP
+ security_context_t scon; /* Security context of job */
+ uid_t auid; /* Audit loginuid for this job */
};
typedef struct cupsd_joblog_s /**** Job log message ****/
-diff -up cups-1.4.5/scheduler/main.c.lspp cups-1.4.5/scheduler/main.c
---- cups-1.4.5/scheduler/main.c.lspp 2010-12-24 13:21:31.158858778 +0000
-+++ cups-1.4.5/scheduler/main.c 2010-12-24 13:22:10.827825881 +0000
-@@ -37,6 +37,8 @@
+diff -up cups-1.6b1/scheduler/main.c.lspp cups-1.6b1/scheduler/main.c
+--- cups-1.6b1/scheduler/main.c.lspp 2012-05-25 17:01:32.849768516 +0200
++++ cups-1.6b1/scheduler/main.c 2012-05-25 17:01:32.868768383 +0200
+@@ -38,6 +38,8 @@
* usage() - Show scheduler usage.
*/
/*
* Include necessary headers...
*/
-@@ -76,6 +78,9 @@
- # include <dlfcn.h>
- #endif /* __APPLE__ && HAVE_DLFCN_H */
+@@ -75,6 +77,9 @@
+ # include <notify.h>
+ #endif /* HAVE_NOTIFY_H */
+#ifdef WITH_LSPP
+# include <libaudit.h>
/*
* Local functions...
-@@ -145,6 +150,9 @@ main(int argc, /* I - Number of comm
+@@ -138,6 +143,9 @@ main(int argc, /* I - Number of comm
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
#ifdef __sgi
cups_file_t *fp; /* Fake lpsched lock file */
struct stat statbuf; /* Needed for checking lpsched FIFO */
-@@ -474,6 +482,25 @@ main(int argc, /* I - Number of comm
+@@ -463,6 +471,25 @@ main(int argc, /* I - Number of comm
#endif /* DEBUG */
}
/*
* Set the timezone info...
*/
-@@ -1241,6 +1268,11 @@ main(int argc, /* I - Number of comm
+@@ -1180,6 +1207,11 @@ main(int argc, /* I - Number of comm
cupsdStopSelect();
return (!stop_scheduler);
}
-diff -up cups-1.4.5/scheduler/printers.c.lspp cups-1.4.5/scheduler/printers.c
---- cups-1.4.5/scheduler/printers.c.lspp 2010-12-24 13:21:31.168858518 +0000
-+++ cups-1.4.5/scheduler/printers.c 2010-12-24 13:21:31.236856747 +0000
-@@ -59,6 +59,8 @@
+diff -up cups-1.6b1/scheduler/printers.c.lspp cups-1.6b1/scheduler/printers.c
+--- cups-1.6b1/scheduler/printers.c.lspp 2012-05-25 17:01:32.786768955 +0200
++++ cups-1.6b1/scheduler/printers.c 2012-05-25 17:24:11.144300359 +0200
+@@ -56,6 +56,8 @@
* write_xml_string() - Write a string with XML escaping.
*/
/*
* Include necessary headers...
*/
-@@ -103,6 +105,10 @@ static void write_irix_state(cupsd_print
- #endif /* __sgi */
- static void write_xml_string(cups_file_t *fp, const char *s);
+@@ -80,6 +82,10 @@
+ # include <asl.h>
+ #endif /* __APPLE__ */
+#ifdef WITH_LSPP
+# include <libaudit.h>
+#endif /* WITH_LSPP */
/*
- * 'cupsdAddPrinter()' - Add a printer to the system.
-@@ -2267,6 +2273,13 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
+ * Local functions...
+@@ -2101,6 +2107,13 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
"username",
"password"
};
DEBUG_printf(("cupsdSetPrinterAttrs: entering name = %s, type = %x\n", p->name,
-@@ -2397,6 +2410,45 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
+@@ -2234,6 +2247,45 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
attr->values[1].string.text = _cupsStrAlloc(Classification ?
Classification : p->job_sheets[1]);
}
+ if (getfilecon(printerfile, &devcon) == -1)
+ {
+ if(is_selinux_enabled())
-+ cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdSetPrinterAttrs: Unable to get printer context");
++ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdSetPrinterAttrs: Unable to get printer context");
+ }
+ else
+ {
}
p->raw = 0;
-@@ -5536,7 +5588,6 @@ write_irix_state(cupsd_printer_t *p) /*
+@@ -5320,7 +5372,6 @@ write_irix_state(cupsd_printer_t *p) /*
}
#endif /* __sgi */
+++ /dev/null
-diff -up cups-1.4.5/Makedefs.in.0755 cups-1.4.5/Makedefs.in
---- cups-1.4.5/Makedefs.in.0755 2010-12-06 17:19:03.335315249 +0000
-+++ cups-1.4.5/Makedefs.in 2010-12-06 17:19:03.416307263 +0000
-@@ -41,13 +41,13 @@ SHELL = /bin/sh
- # Installation programs...
- #
-
--INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
-+INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 755 @INSTALL_STRIP@
- INSTALL_CONFIG = $(INSTALL) -c -m @CUPS_CONFIG_FILE_PERM@
- INSTALL_DATA = $(INSTALL) -c -m 444
- INSTALL_DIR = $(INSTALL) -d
--INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
-+INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 755 @INSTALL_STRIP@
- INSTALL_MAN = $(INSTALL) -c -m 444
--INSTALL_SCRIPT = $(INSTALL) -c -m 555
-+INSTALL_SCRIPT = $(INSTALL) -c -m 755
-
- #
- # Default user, group, and system groups for the scheduler...
-diff -up cups-1.4.5/scheduler/Makefile.0755 cups-1.4.5/scheduler/Makefile
---- cups-1.4.5/scheduler/Makefile.0755 2010-12-06 17:28:58.562552167 +0000
-+++ cups-1.4.5/scheduler/Makefile 2010-12-06 17:29:07.087756415 +0000
-@@ -174,7 +174,7 @@ install-data:
- install-exec:
- echo Installing programs in $(SBINDIR)...
- $(INSTALL_DIR) -m 755 $(SBINDIR)
-- $(INSTALL_BIN) -m 500 cupsd $(SBINDIR)
-+ $(INSTALL_BIN) -m 755 cupsd $(SBINDIR)
- $(INSTALL_BIN) cupsfilter $(SBINDIR)
- -if test "x`uname`" = xDarwin; then \
- $(INSTALL_DIR) $(BUILDROOT)/System/Library/Printers/Libraries; \
+++ /dev/null
-diff -up cups-1.4.2/cups/http-addr.c.EAI_AGAIN cups-1.4.2/cups/http-addr.c
---- cups-1.4.2/cups/http-addr.c.EAI_AGAIN 2010-02-23 10:39:35.038261623 +0000
-+++ cups-1.4.2/cups/http-addr.c 2010-02-23 10:41:14.684385991 +0000
-@@ -253,7 +253,7 @@ httpAddrLookup(
-
- if (error)
- {
-- if (error == EAI_FAIL)
-+ if (error == EAI_FAIL || error == EAI_AGAIN || error == EAI_NODATA)
- cg->need_res_init = 1;
-
- return (httpAddrString(addr, name, namelen));
+++ /dev/null
-diff -up cups-1.4.4/scheduler/ipp.c.autotype-crash cups-1.4.4/scheduler/ipp.c
---- cups-1.4.4/scheduler/ipp.c.autotype-crash 2010-10-15 15:25:15.093421917 +0100
-+++ cups-1.4.4/scheduler/ipp.c 2010-10-15 15:25:49.645296947 +0100
-@@ -10481,8 +10481,9 @@ send_document(cupsd_client_t *con, /* I
- if (!filetype)
- filetype = mimeType(MimeDatabase, super, type);
-
-- cupsdLogJob(job, CUPSD_LOG_DEBUG, "Request file type is %s/%s.",
-- filetype->super, filetype->type);
-+ if (filetype)
-+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Request file type is %s/%s.",
-+ filetype->super, filetype->type);
- }
- else
- filetype = mimeType(MimeDatabase, super, type);
+++ /dev/null
-diff -up cups-1.4.5/backend/dnssd.c.avahi cups-1.4.5/backend/dnssd.c
---- cups-1.4.5/backend/dnssd.c.avahi 2010-12-24 13:11:33.760461375 +0000
-+++ cups-1.4.5/backend/dnssd.c 2010-12-24 13:11:38.325341226 +0000
-@@ -15,14 +15,21 @@
- *
- * Contents:
- *
-+ * next_txt_record() - Get next TXT record from a cups_txt_records_t.
-+ * parse_txt_record_pair() - Read key/value pair in cups_txt_records_t.
- * main() - Browse for printers.
- * browse_callback() - Browse devices.
- * browse_local_callback() - Browse local devices.
- * compare_devices() - Compare two devices.
- * exec_backend() - Execute the backend that corresponds to the
- * resolved service name.
-+ * device_type() - Get DNS-SD type enumeration from string.
- * get_device() - Create or update a device.
- * query_callback() - Process query data.
-+ * avahi_client_callback() - Avahi client callback function.
-+ * avahi_query_callback() - Avahi query callback function.
-+ * avahi_browse_callback() - Avahi browse callback function.
-+ * find_device() - Find a device from its name and domain.
- * sigterm_handler() - Handle termination signals...
- * unquote() - Unquote a name string.
- */
-@@ -33,7 +40,18 @@
-
- #include "backend-private.h"
- #include <cups/array.h>
--#include <dns_sd.h>
-+#ifdef HAVE_DNSSD
-+# include <dns_sd.h>
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+# include <avahi-client/client.h>
-+# include <avahi-client/lookup.h>
-+# include <avahi-common/simple-watch.h>
-+# include <avahi-common/domain.h>
-+# include <avahi-common/error.h>
-+# include <avahi-common/malloc.h>
-+#define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX
-+#endif /* HAVE_AVAHI */
-
-
- /*
-@@ -52,7 +70,12 @@ typedef enum
-
- typedef struct
- {
-+#ifdef HAVE_DNSSD
- DNSServiceRef ref; /* Service reference for resolve */
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ int resolved; /* Did we resolve the device? */
-+#endif /* HAVE_AVAHI */
- char *name, /* Service name */
- *domain, /* Domain name */
- *fullName, /* Full name */
-@@ -64,6 +87,20 @@ typedef struct
- sent; /* Did we list the device? */
- } cups_device_t;
-
-+typedef struct
-+{
-+ char key[256];
-+ char value[256];
-+
-+#ifdef HAVE_DNSSD
-+ const uint8_t *data;
-+ const uint8_t *datanext;
-+ const uint8_t *dataend;
-+#else /* HAVE_AVAHI */
-+ AvahiStringList *txt;
-+#endif /* HAVE_DNSSD */
-+} cups_txt_records_t;
-+
-
- /*
- * Local globals...
-@@ -77,6 +114,7 @@ static int job_canceled = 0;
- * Local functions...
- */
-
-+#ifdef HAVE_DNSSD
- static void browse_callback(DNSServiceRef sdRef,
- DNSServiceFlags flags,
- uint32_t interfaceIndex,
-@@ -92,12 +130,6 @@ static void browse_local_callback(DNSSe
- const char *regtype,
- const char *replyDomain,
- void *context);
--static int compare_devices(cups_device_t *a, cups_device_t *b);
--static void exec_backend(char **argv);
--static cups_device_t *get_device(cups_array_t *devices,
-- const char *serviceName,
-- const char *regtype,
-- const char *replyDomain);
- static void query_callback(DNSServiceRef sdRef,
- DNSServiceFlags flags,
- uint32_t interfaceIndex,
-@@ -106,9 +138,118 @@ static void query_callback(DNSServiceRe
- uint16_t rrclass, uint16_t rdlen,
- const void *rdata, uint32_t ttl,
- void *context);
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+static void avahi_client_callback (AvahiClient *client,
-+ AvahiClientState state,
-+ void *context);
-+static void avahi_browse_callback (AvahiServiceBrowser *browser,
-+ AvahiIfIndex interface,
-+ AvahiProtocol protocol,
-+ AvahiBrowserEvent event,
-+ const char *serviceName,
-+ const char *regtype,
-+ const char *replyDomain,
-+ AvahiLookupResultFlags flags,
-+ void *context);
-+#endif /* HAVE_AVAHI */
-+
-+static cups_device_t * find_device (cups_array_t *devices,
-+ cups_txt_records_t *txt,
-+ cups_device_t *dkey);
-+static int compare_devices(cups_device_t *a, cups_device_t *b);
-+static void exec_backend(char **argv);
-+static cups_device_t *get_device(cups_array_t *devices,
-+ const char *serviceName,
-+ const char *regtype,
-+ const char *replyDomain);
- static void sigterm_handler(int sig);
- static void unquote(char *dst, const char *src, size_t dstsize);
-
-+#ifdef HAVE_AVAHI
-+static AvahiSimplePoll *simple_poll = NULL;
-+static int avahi_got_callback;
-+#endif /* HAVE_AVAHI */
-+
-+
-+/*
-+ * 'next_txt_record()' - Get next TXT record from a cups_txt_records_t.
-+ */
-+
-+static cups_txt_records_t *
-+next_txt_record (cups_txt_records_t *txt)
-+{
-+#ifdef HAVE_DNSSD
-+ txt->data = txt->datanext;
-+#else /* HAVE_AVAHI */
-+ txt->txt = avahi_string_list_get_next (txt->txt);
-+ if (txt->txt == NULL)
-+ return NULL;
-+#endif /* HAVE_DNSSD */
-+
-+ return txt;
-+}
-+
-+
-+/*
-+ * 'parse_txt_record_pair()' - Read key/value pair in cups_txt_records_t.
-+ */
-+
-+static int
-+parse_txt_record_pair (cups_txt_records_t *txt)
-+{
-+#ifdef HAVE_DNSSD
-+ uint8_t datalen;
-+ uint8_t *data = txt->data;
-+ char *ptr;
-+
-+ /*
-+ * Read a key/value pair starting with an 8-bit length. Since the
-+ * length is 8 bits and the size of the key/value buffers is 256, we
-+ * don't need to check for overflow...
-+ */
-+
-+ datalen = *data++;
-+ if (!datalen || (data + datalen) >= txt->dataend)
-+ return NULL;
-+ txt->datanext = data + datalen;
-+
-+ for (ptr = txt->key; data < txt->datanext && *data != '='; data ++)
-+ *ptr++ = *data;
-+ *ptr = '\0';
-+
-+ if (data < txt->datanext && *data == '=')
-+ {
-+ data++;
-+
-+ if (data < datanext)
-+ memcpy (txt->value, data, txt->datanext - data);
-+ value[txt->datanext - data] = '\0';
-+ }
-+ else
-+ return 1;
-+#else /* HAVE_AVAHI */
-+ char *key, *value;
-+ size_t len;
-+ avahi_string_list_get_pair (txt->txt, &key, &value, &len);
-+ if (len > sizeof (txt->value) - 1)
-+ len = sizeof (txt->value) - 1;
-+
-+ memcpy (txt->value, value, len);
-+ txt->value[len] = '\0';
-+ len = strlen (key);
-+ if (len > sizeof (txt->key) - 1)
-+ len = sizeof (txt->key) - 1;
-+
-+ memcpy (txt->key, key, len);
-+ txt->key[len] = '\0';
-+ avahi_free (key);
-+ avahi_free (value);
-+#endif /* HAVE_AVAHI */
-+
-+ return 0;
-+}
-+
-
- /*
- * 'main()' - Browse for printers.
-@@ -119,6 +260,13 @@ main(int argc, /* I - Number of comm
- char *argv[]) /* I - Command-line arguments */
- {
- const char *name; /* Backend name */
-+ cups_array_t *devices; /* Device array */
-+ cups_device_t *device; /* Current device */
-+ char uriName[1024]; /* Unquoted fullName for URI */
-+#ifdef HAVE_DNSSD
-+ int fd; /* Main file descriptor */
-+ fd_set input; /* Input set for select() */
-+ struct timeval timeout; /* Timeout for select() */
- DNSServiceRef main_ref, /* Main service reference */
- fax_ipp_ref, /* IPP fax service reference */
- ipp_ref, /* IPP service reference */
-@@ -130,12 +278,11 @@ main(int argc, /* I - Number of comm
- pdl_datastream_ref, /* AppSocket service reference */
- printer_ref, /* LPD service reference */
- riousbprint_ref; /* Remote IO service reference */
-- int fd; /* Main file descriptor */
-- fd_set input; /* Input set for select() */
-- struct timeval timeout; /* Timeout for select() */
-- cups_array_t *devices; /* Device array */
-- cups_device_t *device; /* Current device */
-- char uriName[1024]; /* Unquoted fullName for URI */
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ AvahiClient *client;
-+ int error;
-+#endif /* HAVE_AVAHI */
- #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
- struct sigaction action; /* Actions for POSIX signals */
- #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
-@@ -194,6 +341,49 @@ main(int argc, /* I - Number of comm
- * Browse for different kinds of printers...
- */
-
-+#ifdef HAVE_AVAHI
-+ if ((simple_poll = avahi_simple_poll_new ()) == NULL)
-+ {
-+ perror ("ERROR: Unable to create avahi simple poll object");
-+ return (1);
-+ }
-+
-+ client = avahi_client_new (avahi_simple_poll_get (simple_poll),
-+ 0, avahi_client_callback, NULL, &error);
-+ if (!client)
-+ {
-+ perror ("ERROR: Unable to create avahi client");
-+ return (1);
-+ }
-+
-+ avahi_service_browser_new (client, AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ "_fax-ipp._tcp", NULL, 0,
-+ avahi_browse_callback, devices);
-+ avahi_service_browser_new (client, AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ "_ipp._tcp", NULL, 0,
-+ avahi_browse_callback, devices);
-+ avahi_service_browser_new (client, AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ "_ipp-tls._tcp", NULL, 0,
-+ avahi_browse_callback, devices);
-+ avahi_service_browser_new (client, AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ "_pdl-datastream._tcp",
-+ NULL, 0,
-+ avahi_browse_callback,
-+ devices);
-+ avahi_service_browser_new (client, AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ "_printer._tcp", NULL, 0,
-+ avahi_browse_callback, devices);
-+ avahi_service_browser_new (client, AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ "_riousbprint._tcp", NULL, 0,
-+ avahi_browse_callback, devices);
-+#endif /* HAVE_AVAHI */
-+#ifdef HAVE_DNSSD
- if (DNSServiceCreateConnection(&main_ref) != kDNSServiceErr_NoError)
- {
- perror("ERROR: Unable to create service connection");
-@@ -245,6 +435,7 @@ main(int argc, /* I - Number of comm
- riousbprint_ref = main_ref;
- DNSServiceBrowse(&riousbprint_ref, kDNSServiceFlagsShareConnection, 0,
- "_riousbprint._tcp", NULL, browse_callback, devices);
-+#endif /* HAVE_DNSSD */
-
- /*
- * Loop until we are killed...
-@@ -252,6 +443,9 @@ main(int argc, /* I - Number of comm
-
- while (!job_canceled)
- {
-+ int announce = 0;
-+
-+#ifdef HAVE_DNSSD
- FD_ZERO(&input);
- FD_SET(fd, &input);
-
-@@ -271,11 +465,35 @@ main(int argc, /* I - Number of comm
- }
- else
- {
-+ announce = 1;
-+ }
-+#else /* HAVE_AVAHI */
-+ int r;
-+ avahi_got_callback = 0;
-+ r = avahi_simple_poll_iterate (simple_poll, 1);
-+ if (r != 0 && r != EINTR)
-+ {
-+ /*
-+ * We've been told to exit the loop. Perhaps the connection to
-+ * avahi failed.
-+ */
-+
-+ break;
-+ }
-+
-+ if (avahi_got_callback)
-+ announce = 1;
-+#endif /* HAVE_DNSSD */
-+
-+ if (announce)
-+ {
- /*
- * Announce any devices we've found...
- */
-
-+#ifdef HAVE_DNSSD
- DNSServiceErrorType status; /* DNS query status */
-+#endif /* HAVE_DNSSD */
- cups_device_t *best; /* Best matching device */
- char device_uri[1024]; /* Device URI */
- int count; /* Number of queries */
-@@ -285,6 +503,7 @@ main(int argc, /* I - Number of comm
- best = NULL, count = 0;
- device;
- device = (cups_device_t *)cupsArrayNext(devices))
-+#ifdef HAVE_DNSSD
- if (!device->ref && !device->sent)
- {
- /*
-@@ -313,14 +532,23 @@ main(int argc, /* I - Number of comm
- count ++;
- }
- }
-- else if (!device->sent)
-+ else
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ if (!device->resolved)
-+ continue;
-+ else
-+#endif /* HAVE_AVAHI */
-+ if (!device->sent)
- {
-+#ifdef HAVE_DNSSD
- /*
- * Got the TXT records, now report the device...
- */
-
- DNSServiceRefDeallocate(device->ref);
- device->ref = 0;
-+#endif /* HAVE_DNSSD */
-
- if (!best)
- best = device;
-@@ -368,6 +596,7 @@ main(int argc, /* I - Number of comm
- }
-
-
-+#ifdef HAVE_DNSSD
- /*
- * 'browse_callback()' - Browse devices.
- */
-@@ -456,6 +685,7 @@ browse_local_callback(
- device->fullName);
- device->sent = 1;
- }
-+#endif /* HAVE_DNSSD */
-
-
- /*
-@@ -530,6 +760,37 @@ exec_backend(char **argv) /* I - Comman
-
-
- /*
-+ * 'device_type()' - Get DNS-SD type enumeration from string.
-+ */
-+
-+static int
-+device_type (const char *regtype)
-+{
-+#ifdef HAVE_AVAHI
-+ if (!strcmp(regtype, "_ipp._tcp") ||
-+ !strcmp(regtype, "_ipp-tls._tcp"))
-+ return (CUPS_DEVICE_IPP);
-+ else if (!strcmp(regtype, "_fax-ipp._tcp"))
-+ return (CUPS_DEVICE_FAX_IPP);
-+ else if (!strcmp(regtype, "_printer._tcp"))
-+ return (CUPS_DEVICE_PDL_DATASTREAM);
-+#else
-+ if (!strcmp(regtype, "_ipp._tcp.") ||
-+ !strcmp(regtype, "_ipp-tls._tcp."))
-+ return (CUPS_DEVICE_IPP);
-+ else if (!strcmp(regtype, "_fax-ipp._tcp."))
-+ return (CUPS_DEVICE_FAX_IPP);
-+ else if (!strcmp(regtype, "_printer._tcp."))
-+ return (CUPS_DEVICE_PRINTER);
-+ else if (!strcmp(regtype, "_pdl-datastream._tcp."))
-+ return (CUPS_DEVICE_PDL_DATASTREAM);
-+#endif /* HAVE_AVAHI */
-+
-+ return (CUPS_DEVICE_RIOUSBPRINT);
-+}
-+
-+
-+/*
- * 'get_device()' - Create or update a device.
- */
-
-@@ -550,18 +811,7 @@ get_device(cups_array_t *devices, /* I -
- */
-
- key.name = (char *)serviceName;
--
-- if (!strcmp(regtype, "_ipp._tcp.") ||
-- !strcmp(regtype, "_ipp-tls._tcp."))
-- key.type = CUPS_DEVICE_IPP;
-- else if (!strcmp(regtype, "_fax-ipp._tcp."))
-- key.type = CUPS_DEVICE_FAX_IPP;
-- else if (!strcmp(regtype, "_printer._tcp."))
-- key.type = CUPS_DEVICE_PRINTER;
-- else if (!strcmp(regtype, "_pdl-datastream._tcp."))
-- key.type = CUPS_DEVICE_PDL_DATASTREAM;
-- else
-- key.type = CUPS_DEVICE_RIOUSBPRINT;
-+ key.type = device_type (regtype);
-
- for (device = cupsArrayFind(devices, &key);
- device;
-@@ -581,8 +831,14 @@ get_device(cups_array_t *devices, /* I -
- free(device->domain);
- device->domain = strdup(replyDomain);
-
-+#ifdef HAVE_DNSSD
- DNSServiceConstructFullName(fullName, device->name, regtype,
- replyDomain);
-+#else /* HAVE_AVAHI */
-+ avahi_service_name_join (fullName, kDNSServiceMaxDomainName,
-+ serviceName, regtype, replyDomain);
-+#endif /* HAVE_DNSSD */
-+
- free(device->fullName);
- device->fullName = strdup(fullName);
- }
-@@ -602,6 +858,9 @@ get_device(cups_array_t *devices, /* I -
- device->domain = strdup(replyDomain);
- device->type = key.type;
- device->priority = 50;
-+#ifdef HAVE_AVAHI
-+ device->resolved = 0;
-+#endif /* HAVE_AVAHI */
-
- cupsArrayAdd(devices, device);
-
-@@ -609,13 +868,20 @@ get_device(cups_array_t *devices, /* I -
- * Set the "full name" of this service, which is used for queries...
- */
-
-+#ifdef HAVE_DNSSD
- DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain);
-+#else /* HAVE_AVAHI */
-+ avahi_service_name_join (fullName, kDNSServiceMaxDomainName,
-+ serviceName, regtype, replyDomain);
-+#endif /* HAVE_DNSSD */
-+
- device->fullName = strdup(fullName);
-
- return (device);
- }
-
-
-+#ifdef HAVE_DNSSD
- /*
- * 'query_callback()' - Process query data.
- */
-@@ -639,7 +905,7 @@ query_callback(
- *ptr; /* Pointer into string */
- cups_device_t dkey, /* Search key */
- *device; /* Device */
--
-+ cups_txt_records_t txt;
-
- fprintf(stderr, "DEBUG2: query_callback(sdRef=%p, flags=%x, "
- "interfaceIndex=%d, errorCode=%d, fullName=\"%s\", "
-@@ -673,84 +939,232 @@ query_callback(
- if ((ptr = strstr(name, "._")) != NULL)
- *ptr = '\0';
-
-- if (strstr(fullName, "_ipp._tcp.") ||
-- strstr(fullName, "_ipp-tls._tcp."))
-- dkey.type = CUPS_DEVICE_IPP;
-- else if (strstr(fullName, "_fax-ipp._tcp."))
-- dkey.type = CUPS_DEVICE_FAX_IPP;
-- else if (strstr(fullName, "_printer._tcp."))
-- dkey.type = CUPS_DEVICE_PRINTER;
-- else if (strstr(fullName, "_pdl-datastream._tcp."))
-- dkey.type = CUPS_DEVICE_PDL_DATASTREAM;
-+ dkey.type = device_type (fullName);
-+
-+ txt.data = rdata;
-+ txt.dataend = rdata + rdlen;
-+ device = find_device ((cups_array_t *) context, &txt, &dkey);
-+ if (!device)
-+ fprintf(stderr, "DEBUG: Ignoring TXT record for \"%s\"...\n", fullName);
-+}
-+#endif /* HAVE_DNSSD */
-+
-+
-+#ifdef HAVE_AVAHI
-+/*
-+ * 'avahi_client_callback()' - Avahi client callback function.
-+ */
-+
-+static void
-+avahi_client_callback(AvahiClient *client,
-+ AvahiClientState state,
-+ void *context)
-+{
-+ /*
-+ * If the connection drops, quit.
-+ */
-+
-+ if (state == AVAHI_CLIENT_FAILURE)
-+ {
-+ fprintf (stderr, "ERROR: Avahi connection failed\n");
-+ avahi_simple_poll_quit (simple_poll);
-+ }
-+}
-+
-+
-+/*
-+ * 'avahi_query_callback()' - Avahi query callback function.
-+ */
-+
-+static void
-+avahi_query_callback(AvahiServiceResolver *resolver,
-+ AvahiIfIndex interface,
-+ AvahiProtocol protocol,
-+ AvahiResolverEvent event,
-+ const char *name,
-+ const char *type,
-+ const char *domain,
-+ const char *host_name,
-+ const AvahiAddress *address,
-+ uint16_t port,
-+ AvahiStringList *txt,
-+ AvahiLookupResultFlags flags,
-+ void *context)
-+{
-+ AvahiClient *client;
-+ cups_device_t key,
-+ *device;
-+ char uqname[1024],
-+ *ptr;
-+ cups_txt_records_t txtr;
-+
-+ client = avahi_service_resolver_get_client (resolver);
-+ if (event != AVAHI_RESOLVER_FOUND)
-+ {
-+ if (event == AVAHI_RESOLVER_FAILURE)
-+ {
-+ fprintf (stderr, "ERROR: %s\n",
-+ avahi_strerror (avahi_client_errno (client)));
-+ }
-+
-+ avahi_service_resolver_free (resolver);
-+ return;
-+ }
-+
-+ /*
-+ * Set search key for device.
-+ */
-+
-+ key.name = uqname;
-+ unquote (uqname, name, sizeof (uqname));
-+ if ((ptr = strstr(name, "._")) != NULL)
-+ *ptr = '\0';
-+
-+ key.domain = (char *) domain;
-+ key.type = device_type (type);
-+
-+ /*
-+ * Find the device and the the TXT information.
-+ */
-+
-+ txtr.txt = txt;
-+ device = find_device ((cups_array_t *) context, &txtr, &key);
-+ if (device)
-+ {
-+ /*
-+ * Let the main loop know to announce the device.
-+ */
-+
-+ device->resolved = 1;
-+ avahi_got_callback = 1;
-+ }
- else
-- dkey.type = CUPS_DEVICE_RIOUSBPRINT;
-+ fprintf (stderr, "DEBUG: Ignoring TXT record for \"%s\"...\n", name);
-+
-+ avahi_service_resolver_free (resolver);
-+}
-+
-+
-+/*
-+ * 'avahi_browse_callback()' - Avahi browse callback function.
-+ */
-+
-+static void
-+avahi_browse_callback(AvahiServiceBrowser *browser,
-+ AvahiIfIndex interface,
-+ AvahiProtocol protocol,
-+ AvahiBrowserEvent event,
-+ const char *name,
-+ const char *type,
-+ const char *domain,
-+ AvahiLookupResultFlags flags,
-+ void *context)
-+{
-+ AvahiClient *client = avahi_service_browser_get_client (browser);
-
-- for (device = cupsArrayFind(devices, &dkey);
-+ switch (event)
-+ {
-+ case AVAHI_BROWSER_FAILURE:
-+ fprintf (stderr, "ERROR: %s\n",
-+ avahi_strerror (avahi_client_errno (client)));
-+ avahi_simple_poll_quit (simple_poll);
-+ return;
-+
-+ case AVAHI_BROWSER_NEW:
-+ /*
-+ * This object is new on the network.
-+ */
-+
-+ if (flags & AVAHI_LOOKUP_RESULT_LOCAL)
-+ {
-+ /*
-+ * This comes from the local machine so ignore it.
-+ */
-+
-+ fprintf (stderr, "DEBUG: ignoring local service %s\n", name);
-+ }
-+ else
-+ {
-+ /*
-+ * Create a device entry for it if it doesn't yet exist.
-+ */
-+
-+ get_device ((cups_array_t *)context, name, type, domain);
-+
-+ /*
-+ * Now look for a TXT entry.
-+ */
-+
-+ if (avahi_service_resolver_new (client, interface, protocol,
-+ name, type, domain,
-+ AVAHI_PROTO_UNSPEC, 0,
-+ avahi_query_callback, context) == NULL)
-+ {
-+ fprintf (stderr, "ERROR: failed to resolve service %s: %s\n",
-+ name, avahi_strerror (avahi_client_errno (client)));
-+ }
-+ }
-+
-+ break;
-+
-+ case AVAHI_BROWSER_REMOVE:
-+ case AVAHI_BROWSER_ALL_FOR_NOW:
-+ case AVAHI_BROWSER_CACHE_EXHAUSTED:
-+ break;
-+ }
-+}
-+#endif /* HAVE_AVAHI */
-+
-+
-+/*
-+ * 'find_device()' - Find a device from its name and domain.
-+ */
-+
-+static cups_device_t *
-+find_device (cups_array_t *devices,
-+ cups_txt_records_t *txt,
-+ cups_device_t *dkey)
-+{
-+ cups_device_t *device;
-+ char *ptr;
-+
-+ for (device = cupsArrayFind(devices, dkey);
- device;
- device = cupsArrayNext(devices))
- {
-- if (strcasecmp(device->name, dkey.name) ||
-- strcasecmp(device->domain, dkey.domain))
-+ if (strcasecmp(device->name, dkey->name) ||
-+ strcasecmp(device->domain, dkey->domain))
- {
- device = NULL;
- break;
- }
-- else if (device->type == dkey.type)
-+ else if (device->type == dkey->type)
- {
- /*
- * Found it, pull out the priority and make and model from the TXT
- * record and save it...
- */
-
-- const uint8_t *data, /* Pointer into data */
-- *datanext, /* Next key/value pair */
-- *dataend; /* End of entire TXT record */
-- uint8_t datalen; /* Length of current key/value pair */
-- char key[256], /* Key string */
-- value[256], /* Value string */
-- make_and_model[512],
-+ char make_and_model[512],
- /* Manufacturer and model */
- model[256], /* Model */
-- device_id[2048];/* 1284 device ID */
--
-+ device_id[2048]; /* 1284 device ID */
-
- device_id[0] = '\0';
- make_and_model[0] = '\0';
-
- strcpy(model, "Unknown");
-
-- for (data = rdata, dataend = data + rdlen;
-- data < dataend;
-- data = datanext)
-+ for (;;)
- {
-- /*
-- * Read a key/value pair starting with an 8-bit length. Since the
-- * length is 8 bits and the size of the key/value buffers is 256, we
-- * don't need to check for overflow...
-- */
--
-- datalen = *data++;
--
-- if (!datalen || (data + datalen) >= dataend)
-- break;
-+ char *key;
-+ char *value;
-
-- datanext = data + datalen;
--
-- for (ptr = key; data < datanext && *data != '='; data ++)
-- *ptr++ = *data;
-- *ptr = '\0';
--
-- if (data < datanext && *data == '=')
-- {
-- data ++;
--
-- if (data < datanext)
-- memcpy(value, data, datanext - data);
-- value[datanext - data] = '\0';
-- }
-- else
-- continue;
-+ if (parse_txt_record_pair (txt))
-+ goto next;
-
-+ key = txt->key;
-+ value = txt->value;
- if (!strncasecmp(key, "usb_", 4))
- {
- /*
-@@ -805,6 +1219,10 @@ query_callback(
- if (device->type == CUPS_DEVICE_PRINTER)
- device->sent = 1;
- }
-+
-+ next:
-+ if (next_txt_record (txt) == NULL)
-+ break;
- }
-
- if (device->device_id)
-@@ -861,11 +1279,9 @@ query_callback(
- }
- }
-
-- if (!device)
-- fprintf(stderr, "DEBUG: Ignoring TXT record for \"%s\"...\n", fullName);
-+ return device;
- }
-
--
- /*
- * 'sigterm_handler()' - Handle termination signals...
- */
-diff -up cups-1.4.5/config.h.in.avahi cups-1.4.5/config.h.in
---- cups-1.4.5/config.h.in.avahi 2010-08-13 05:11:46.000000000 +0100
-+++ cups-1.4.5/config.h.in 2010-12-24 13:11:38.327341170 +0000
-@@ -344,6 +344,13 @@
-
-
- /*
-+ * Do we have Avahi for DNS Service Discovery?
-+ */
-+
-+#undef HAVE_AVAHI
-+
-+
-+/*
- * Do we have <sys/ioctl.h>?
- */
-
-diff -up cups-1.4.5/config-scripts/cups-dnssd.m4.avahi cups-1.4.5/config-scripts/cups-dnssd.m4
---- cups-1.4.5/config-scripts/cups-dnssd.m4.avahi 2009-08-28 23:54:34.000000000 +0100
-+++ cups-1.4.5/config-scripts/cups-dnssd.m4 2010-12-24 13:11:38.326341199 +0000
-@@ -27,6 +27,21 @@ AC_ARG_WITH(dnssd-includes, [ --with-dn
- DNSSDLIBS=""
- DNSSD_BACKEND=""
-
-+AC_ARG_ENABLE(avahi, [ --enable-avahi turn on DNS Service Discovery support, default=no],
-+ [if test x$enable_avahi = xyes; then
-+ AC_MSG_CHECKING(for Avahi)
-+ if $PKGCONFIG --exists avahi-client; then
-+ AC_MSG_RESULT(yes)
-+ CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`"
-+ DNSSDLIBS="`$PKGCONFIG --libs avahi-client`"
-+ DNSSD_BACKEND="dnssd"
-+ AC_DEFINE(HAVE_AVAHI)
-+ enable_dnssd=no
-+ else
-+ AC_MSG_RESULT(no)
-+ fi
-+ fi])
-+
- if test x$enable_dnssd != xno; then
- AC_CHECK_HEADER(dns_sd.h, [
- case "$uname" in
-diff -up cups-1.4.5/cups/http-support.c.avahi cups-1.4.5/cups/http-support.c
---- cups-1.4.5/cups/http-support.c.avahi 2010-10-01 23:40:38.000000000 +0100
-+++ cups-1.4.5/cups/http-support.c 2010-12-24 13:11:38.330341093 +0000
-@@ -41,6 +41,10 @@
- * http_copy_decode() - Copy and decode a URI.
- * http_copy_encode() - Copy and encode a URI.
- * resolve_callback() - Build a device URI for the given service name.
-+ * avahi_resolve_uri_client_cb()
-+ * - Avahi client callback for resolving URI.
-+ * avahi_resolve_uri_resolver_cb()
-+ * - Avahi resolver callback for resolving URI.
- */
-
- /*
-@@ -55,6 +59,11 @@
- # include <dns_sd.h>
- # include <poll.h>
- #endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+# include <avahi-client/client.h>
-+# include <avahi-client/lookup.h>
-+# include <avahi-common/simple-watch.h>
-+#endif /* HAVE_AVAHI */
-
-
- /*
-@@ -121,6 +130,24 @@ static void resolve_callback(DNSService
- void *context);
- #endif /* HAVE_DNSSD */
-
-+#ifdef HAVE_AVAHI
-+static void avahi_resolve_uri_client_cb(AvahiClient *client,
-+ AvahiClientState state,
-+ void *simple_poll);
-+static void avahi_resolve_uri_resolver_cb(AvahiServiceResolver *resolver,
-+ AvahiIfIndex interface,
-+ AvahiProtocol protocol,
-+ AvahiResolverEvent event,
-+ const char *name,
-+ const char *type,
-+ const char *domain,
-+ const char *host_name,
-+ const AvahiAddress *address,
-+ uint16_t port,
-+ AvahiStringList *txt,
-+ AvahiLookupResultFlags flags,
-+ void *context);
-+#endif /* HAVE_AVAHI */
-
- /*
- * 'httpAssembleURI()' - Assemble a uniform resource identifier from its
-@@ -1351,6 +1378,9 @@ _httpResolveURI(
-
- if (strstr(hostname, "._tcp"))
- {
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-+ char *regtype, /* Pointer to type in hostname */
-+ *domain; /* Pointer to domain in hostname */
- #ifdef HAVE_DNSSD
- DNSServiceRef ref, /* DNS-SD master service reference */
- domainref, /* DNS-SD service reference for domain */
-@@ -1361,6 +1391,16 @@ _httpResolveURI(
- *domain; /* Pointer to domain in hostname */
- _http_uribuf_t uribuf; /* URI buffer */
- struct pollfd polldata; /* Polling data */
-+#else /* HAVE_AVAHI */
-+ AvahiSimplePoll *simple_poll;
-+ AvahiClient *client;
-+ int error;
-+ struct
-+ {
-+ AvahiSimplePoll *poll;
-+ _http_uribuf_t uribuf;
-+ } user_data;
-+#endif /* HAVE_DNSSD */
-
-
- if (logit)
-@@ -1398,8 +1438,13 @@ _httpResolveURI(
- if (domain)
- *domain++ = '\0';
-
-+#ifdef HAVE_DNSSD
- uribuf.buffer = resolved_uri;
- uribuf.bufsize = resolved_size;
-+#else
-+ user_data.uribuf.buffer = resolved_uri;
-+ user_data.uribuf.bufsize = resolved_size;
-+#endif
-
- resolved_uri[0] = '\0';
-
-@@ -1414,6 +1459,7 @@ _httpResolveURI(
-
- uri = NULL;
-
-+#ifdef HAVE_DNSSD
- if (DNSServiceCreateConnection(&ref) == kDNSServiceErr_NoError)
- {
- localref = ref;
-@@ -1500,6 +1546,36 @@ _httpResolveURI(
-
- DNSServiceRefDeallocate(ref);
- }
-+#else /* HAVE_AVAHI */
-+ if ((simple_poll = avahi_simple_poll_new ()) != NULL)
-+ {
-+ if ((client = avahi_client_new (avahi_simple_poll_get (simple_poll),
-+ 0, avahi_resolve_uri_client_cb,
-+ &simple_poll, &error)) != NULL)
-+ {
-+ user_data.poll = simple_poll;
-+ if (avahi_service_resolver_new (client, AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC, hostname,
-+ regtype, domain, AVAHI_PROTO_UNSPEC, 0,
-+ avahi_resolve_uri_resolver_cb,
-+ &user_data) != NULL)
-+ {
-+ avahi_simple_poll_loop (simple_poll);
-+
-+ /*
-+ * Collect the result.
-+ */
-+
-+ if (resolved_uri[0])
-+ uri = resolved_uri;
-+ }
-+
-+ avahi_client_free (client);
-+ }
-+
-+ avahi_simple_poll_free (simple_poll);
-+ }
-+#endif /* HAVE_DNSSD */
-
- if (logit)
- {
-@@ -1511,13 +1587,13 @@ _httpResolveURI(
- fputs("STATE: -connecting-to-device,offline-report\n", stderr);
- }
-
--#else
-+#else /* HAVE_DNSSD || HAVE_AVAHI */
- /*
- * No DNS-SD support...
- */
-
- uri = NULL;
--#endif /* HAVE_DNSSD */
-+#endif /* HAVE_DNSSD || HAVE_AVAHI */
-
- if (logit && !uri)
- _cupsLangPuts(stderr, _("Unable to find printer!\n"));
-@@ -1723,6 +1799,116 @@ resolve_callback(
- #endif /* HAVE_DNSSD */
-
-
-+#ifdef HAVE_AVAHI
-+/*
-+ * 'avahi_resolve_uri_client_cb()' - Avahi client callback for resolving URI.
-+ */
-+
-+static void
-+avahi_resolve_uri_client_cb (AvahiClient *client,
-+ AvahiClientState state,
-+ void *simple_poll)
-+{
-+ DEBUG_printf(("avahi_resolve_uri_client_callback(client=%p, state=%d, "
-+ "simple_poll=%p)\n", client, state, simple_poll));
-+
-+ /*
-+ * If the connection drops, quit.
-+ */
-+
-+ if (state == AVAHI_CLIENT_FAILURE)
-+ avahi_simple_poll_quit (simple_poll);
-+}
-+
-+
-+/*
-+ * 'avahi_resolve_uri_resolver_cb()' - Avahi resolver callback for resolving
-+ * URI.
-+ */
-+
-+static void
-+avahi_resolve_uri_resolver_cb (AvahiServiceResolver *resolver,
-+ AvahiIfIndex interface,
-+ AvahiProtocol protocol,
-+ AvahiResolverEvent event,
-+ const char *name,
-+ const char *type,
-+ const char *domain,
-+ const char *host_name,
-+ const AvahiAddress *address,
-+ uint16_t port,
-+ AvahiStringList *txt,
-+ AvahiLookupResultFlags flags,
-+ void *context)
-+{
-+ const char *scheme; /* URI scheme */
-+ char rp[256]; /* Remote printer */
-+ AvahiStringList *pair;
-+ char *value;
-+ size_t valueLen = 0;
-+ char addr[AVAHI_ADDRESS_STR_MAX];
-+ struct
-+ {
-+ AvahiSimplePoll *poll;
-+ _http_uribuf_t uribuf;
-+ } *poll_uribuf = context;
-+
-+ DEBUG_printf(("avahi_resolve_uri_resolver_callback(resolver=%p, "
-+ "interface=%d, protocol=%d, event=%d, name=\"%s\", "
-+ "type=\"%s\", domain=\"%s\", host_name=\"%s\", address=%p, "
-+ "port=%d, txt=%p, flags=%d, context=%p)\n",
-+ resolver, interface, protocol, event, name, type, domain,
-+ host_name, address, port, txt, flags, context));
-+
-+ if (event != AVAHI_RESOLVER_FOUND)
-+ {
-+ avahi_service_resolver_free (resolver);
-+ avahi_simple_poll_quit (poll_uribuf->poll);
-+ return;
-+ }
-+
-+ /*
-+ * Figure out the scheme from the full name...
-+ */
-+
-+ if (strstr(type, "_ipp."))
-+ scheme = "ipp";
-+ else if (strstr(type, "_printer."))
-+ scheme = "lpd";
-+ else if (strstr(type, "_pdl-datastream."))
-+ scheme = "socket";
-+ else
-+ scheme = "riousbprint";
-+
-+ /*
-+ * Extract the "remote printer key from the TXT record...
-+ */
-+
-+ if ((pair = avahi_string_list_find (txt, "rp")) != NULL)
-+ {
-+ avahi_string_list_get_pair (pair, NULL, &value, &valueLen);
-+ rp[0] = '/';
-+ memcpy (rp + 1, value, valueLen);
-+ rp[valueLen + 1] = '\0';
-+ }
-+ else
-+ rp[0] = '\0';
-+
-+ /*
-+ * Assemble the final device URI...
-+ */
-+
-+ avahi_address_snprint (addr, AVAHI_ADDRESS_STR_MAX, address);
-+ httpAssembleURI(HTTP_URI_CODING_ALL, poll_uribuf->uribuf.buffer,
-+ poll_uribuf->uribuf.bufsize, scheme, NULL,
-+ addr, port, rp);
-+ DEBUG_printf(("avahi_resolve_uri_resolver_callback: Resolved URI is \"%s\"\n",
-+ poll_uribuf->uribuf.buffer));
-+ avahi_simple_poll_quit (poll_uribuf->poll);
-+}
-+#endif /* HAVE_AVAHI */
-+
-+
- /*
- * End of "$Id: http-support.c 9322 2010-10-01 22:40:38Z mike $".
- */
-diff -up cups-1.4.5/scheduler/avahi.c.avahi cups-1.4.5/scheduler/avahi.c
---- cups-1.4.5/scheduler/avahi.c.avahi 2010-12-24 13:11:38.333341014 +0000
-+++ cups-1.4.5/scheduler/avahi.c 2010-12-24 13:11:38.333341014 +0000
-@@ -0,0 +1,441 @@
-+/*
-+ * "$Id$"
-+ *
-+ * Avahi poll implementation for the CUPS scheduler.
-+ *
-+ * Copyright (C) 2010 Red Hat, Inc.
-+ * Authors:
-+ * Tim Waugh <twaugh@redhat.com>
-+ *
-+ * Distribution and use rights are outlined in the file "LICENSE.txt"
-+ * "LICENSE" which should have been included with this file. If this
-+ * file is missing or damaged, see the license at "http://www.cups.org/".
-+ *
-+ * Contents:
-+ *
-+ * watch_read_cb - Read callback for file descriptor
-+ * watch_write_cb - Write callback for file descriptor
-+ * watched_fd_add_select() - Call cupsdAddSelect() as needed
-+ * watch_new() - Create a new file descriptor watch
-+ * watch_free() - Free a file descriptor watch
-+ * watch_update() - Update watched events for a file descriptor
-+ * watch_get_events() - Get events that happened for a file descriptor
-+ * timeout_cb() - Run a timed Avahi callback
-+ * timeout_new() - Set a wakeup time
-+ * timeout_update() - Update the expiration time for a timeout
-+ * timeout_free() - Free a timeout
-+ * compare_watched_fds() - Compare watched file descriptors for array sorting
-+ * compare_timeouts() - Compare timeouts for array sorting
-+ * avahi_cups_poll_new() - Create a new Avahi main loop object for CUPS
-+ * avahi_cups_poll_free() - Free an Avahi main loop object for CUPS
-+ * avahi_cups_poll_get() - Get the abstract poll API structure
-+ */
-+
-+#include <config.h>
-+
-+#ifdef HAVE_AVAHI /* Applies to entire file... */
-+
-+/*
-+ * Include necessary headers...
-+ */
-+
-+#include "cupsd.h"
-+
-+#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
-+# include <malloc.h>
-+#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */
-+
-+#ifdef HAVE_AVAHI
-+# include <avahi-common/timeval.h>
-+#endif /* HAVE_AVAHI */
-+
-+
-+typedef struct
-+{
-+ AvahiCupsPoll *cups_poll;
-+
-+ int fd;
-+ AvahiWatchEvent occurred;
-+ cups_array_t *watches;
-+} cupsd_watched_fd_t;
-+
-+struct AvahiWatch
-+{
-+ cupsd_watched_fd_t *watched_fd;
-+
-+ AvahiWatchEvent events;
-+ AvahiWatchCallback callback;
-+ void *userdata;
-+};
-+
-+struct AvahiTimeout
-+{
-+ AvahiCupsPoll *cups_poll;
-+ AvahiTimeoutCallback callback;
-+ void *userdata;
-+ cupsd_timeout_t *cupsd_timeout;
-+};
-+
-+/*
-+ * Local functions...
-+ */
-+
-+static AvahiWatch * watch_new(const AvahiPoll *api,
-+ int fd,
-+ AvahiWatchEvent events,
-+ AvahiWatchCallback callback,
-+ void *userdata);
-+static void watch_free(AvahiWatch *watch);
-+static void watch_update(AvahiWatch *watch,
-+ AvahiWatchEvent events);
-+static AvahiWatchEvent watch_get_events(AvahiWatch *watch);
-+static int compare_watches(AvahiWatch *p0,
-+ AvahiWatch *p1);
-+
-+
-+/*
-+ * 'watch_read_cb' - Read callback for file descriptor
-+ */
-+
-+static void
-+watch_read_cb (void *userdata)
-+{
-+ AvahiWatch *watch;
-+ cupsd_watched_fd_t *watched_fd = userdata;
-+ watched_fd->occurred |= AVAHI_WATCH_IN;
-+ for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches);
-+ watch;
-+ watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) {
-+ if (watch->events & watched_fd->occurred) {
-+ (watch->callback) (watch, watched_fd->fd,
-+ AVAHI_WATCH_IN, watch->userdata);
-+ watched_fd->occurred &= ~AVAHI_WATCH_IN;
-+ break;
-+ }
-+ }
-+}
-+
-+
-+/*
-+ * 'watch_write_cb' - Write callback for file descriptor
-+ */
-+
-+static void
-+watch_write_cb (void *userdata)
-+{
-+ AvahiWatch *watch;
-+ cupsd_watched_fd_t *watched_fd = userdata;
-+ watched_fd->occurred |= AVAHI_WATCH_OUT;
-+ for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches);
-+ watch;
-+ watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) {
-+ if (watch->events & watched_fd->occurred) {
-+ (watch->callback) (watch, watched_fd->fd,
-+ AVAHI_WATCH_OUT, watch->userdata);
-+ watched_fd->occurred &= ~AVAHI_WATCH_OUT;
-+ break;
-+ }
-+ }
-+}
-+
-+
-+/*
-+ * 'watched_fd_add_select' - Call cupsdAddSelect() as needed
-+ */
-+
-+static int /* O - Watches? */
-+watched_fd_add_select (cupsd_watched_fd_t *watched_fd)
-+{
-+ AvahiWatch *watch;
-+ cupsd_selfunc_t read_cb = NULL, write_cb = NULL;
-+
-+ for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches);
-+ watch;
-+ watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) {
-+ if (watch->events & (AVAHI_WATCH_IN |
-+ AVAHI_WATCH_ERR |
-+ AVAHI_WATCH_HUP)) {
-+ read_cb = (cupsd_selfunc_t)watch_read_cb;
-+ if (write_cb != NULL)
-+ break;
-+ }
-+
-+ if (watch->events & AVAHI_WATCH_OUT) {
-+ write_cb = (cupsd_selfunc_t)watch_write_cb;
-+ if (read_cb != NULL)
-+ break;
-+ }
-+ }
-+
-+ if (read_cb || write_cb)
-+ cupsdAddSelect (watched_fd->fd, read_cb, write_cb, watched_fd);
-+ else
-+ cupsdRemoveSelect (watched_fd->fd);
-+
-+ return (read_cb || write_cb);
-+}
-+
-+/*
-+ * 'watch_new' - Create a new file descriptor watch
-+ */
-+
-+static AvahiWatch *
-+watch_new (const AvahiPoll *api,
-+ int fd,
-+ AvahiWatchEvent events,
-+ AvahiWatchCallback callback,
-+ void *userdata)
-+{
-+ cupsd_watched_fd_t key, *watched_fd;
-+ AvahiCupsPoll *cups_poll = api->userdata;
-+ AvahiWatch *watch = malloc(sizeof(AvahiWatch));
-+ if (watch == NULL)
-+ return (NULL);
-+
-+ watch->events = events;
-+ watch->callback = callback;
-+ watch->userdata = userdata;
-+
-+ key.fd = fd;
-+ watched_fd = cupsArrayFind (cups_poll->watched_fds, &key);
-+ if (watched_fd == NULL) {
-+ watched_fd = malloc(sizeof(cupsd_watched_fd_t));
-+ if (watched_fd == NULL)
-+ return (NULL);
-+
-+ watched_fd->fd = fd;
-+ watched_fd->occurred = 0;
-+ watched_fd->watches = cupsArrayNew ((cups_array_func_t)compare_watches,
-+ NULL);
-+ }
-+
-+ cupsArrayAdd(watched_fd->watches, watch);
-+ watched_fd_add_select (watched_fd);
-+ return (watch);
-+}
-+
-+
-+/*
-+ * 'watch_free' - Free a file descriptor watch
-+ */
-+
-+static void
-+watch_free (AvahiWatch *watch)
-+{
-+ cupsd_watched_fd_t *watched_fd = watch->watched_fd;
-+ AvahiCupsPoll *cups_poll = watched_fd->cups_poll;
-+
-+ cupsArrayRemove (watched_fd->watches, watch);
-+ free (watch);
-+
-+ if (!watched_fd_add_select (watched_fd)) {
-+ /* No more watches */
-+ cupsArrayRemove (cups_poll->watched_fds, watched_fd);
-+ free (watched_fd);
-+ }
-+}
-+
-+
-+/*
-+ * 'watch_update' - Update watched events for a file descriptor
-+ */
-+
-+static void
-+watch_update (AvahiWatch *watch,
-+ AvahiWatchEvent events)
-+{
-+ watch->events = events;
-+ watched_fd_add_select (watch->watched_fd);
-+}
-+
-+
-+/*
-+ * 'watch_get_events' - Get events that happened for a file descriptor
-+ */
-+
-+static AvahiWatchEvent
-+watch_get_events (AvahiWatch *watch)
-+{
-+ return (watch->watched_fd->occurred);
-+}
-+
-+
-+/*
-+ * 'compare_watches' - Compare watches for array sorting
-+ */
-+
-+static int
-+compare_watches (AvahiWatch *p0,
-+ AvahiWatch *p1)
-+{
-+ if (p0->watched_fd->fd < p1->watched_fd->fd)
-+ return (-1);
-+
-+ return ((p0->watched_fd->fd == p1->watched_fd->fd) ? 0 : 1);
-+}
-+
-+
-+/*
-+ * 'timeout_cb()' - Run a timed Avahi callback
-+ */
-+
-+static void
-+timeout_cb (cupsd_timeout_t *cupsd_timeout, void *userdata)
-+{
-+ AvahiTimeout *timeout = userdata;
-+ (timeout->callback) (timeout, timeout->userdata);
-+}
-+
-+
-+/*
-+ * 'timeout_new' - Set a wakeup time
-+ */
-+
-+static AvahiTimeout *
-+timeout_new (const AvahiPoll *api,
-+ const struct timeval *tv,
-+ AvahiTimeoutCallback callback,
-+ void *userdata)
-+{
-+ AvahiTimeout *timeout;
-+ AvahiCupsPoll *cups_poll = api->userdata;
-+
-+ timeout = malloc(sizeof(AvahiTimeout));
-+ if (timeout == NULL)
-+ return (NULL);
-+
-+ timeout->cups_poll = cups_poll;
-+ timeout->callback = callback;
-+ timeout->userdata = userdata;
-+ timeout->cupsd_timeout = cupsdAddTimeout (tv,
-+ (cupsd_timeoutfunc_t)timeout_cb,
-+ timeout);
-+ cupsArrayAdd (cups_poll->timeouts, timeout);
-+ return (timeout);
-+}
-+
-+
-+/*
-+ * 'timeout_update' - Update the expiration time for a timeout
-+ */
-+
-+static void
-+timeout_update (AvahiTimeout *timeout,
-+ const struct timeval *tv)
-+{
-+ cupsdUpdateTimeout (timeout->cupsd_timeout, tv);
-+}
-+
-+
-+/*
-+ * ' timeout_free' - Free a timeout
-+ */
-+
-+static void
-+timeout_free (AvahiTimeout *timeout)
-+{
-+ cupsArrayRemove (timeout->cups_poll->timeouts, timeout);
-+ cupsdRemoveTimeout (timeout->cupsd_timeout);
-+ free (timeout);
-+}
-+
-+
-+/*
-+ * 'compare_watched_fds' - Compare watched file descriptors for array sorting
-+ */
-+static int
-+compare_watched_fds(cupsd_watched_fd_t *p0,
-+ cupsd_watched_fd_t *p1)
-+{
-+ if (p0->fd != p1->fd)
-+ return (p0->fd < p1->fd ? -1 : 1);
-+
-+ if (p0 == p1)
-+ return (0);
-+
-+ return (p0 < p1 ? -1 : 1);
-+}
-+
-+
-+/*
-+ * 'compare_timeouts' - Compare timeouts for array sorting
-+ */
-+static int
-+compare_timeouts(AvahiTimeout *p0,
-+ AvahiTimeout *p1)
-+{
-+ /*
-+ * Just compare pointers to make it a stable sort.
-+ */
-+
-+ if (p0->cupsd_timeout < p1->cupsd_timeout)
-+ return (-1);
-+ return ((p0->cupsd_timeout == p1->cupsd_timeout) ? 0 : 1);
-+}
-+
-+
-+/*
-+ * 'avahi_cups_poll_new' - Create a new Avahi main loop object for CUPS
-+ */
-+
-+AvahiCupsPoll *
-+avahi_cups_poll_new (void)
-+{
-+ AvahiCupsPoll *cups_poll = malloc(sizeof(AvahiCupsPoll));
-+ if (cups_poll == NULL)
-+ return (NULL);
-+
-+ cups_poll->watched_fds = cupsArrayNew ((cups_array_func_t)compare_watched_fds,
-+ NULL);
-+ cups_poll->timeouts = cupsArrayNew ((cups_array_func_t)compare_timeouts,
-+ NULL);
-+
-+ cups_poll->api.userdata = cups_poll;
-+ cups_poll->api.watch_new = watch_new;
-+ cups_poll->api.watch_free = watch_free;
-+ cups_poll->api.watch_update = watch_update;
-+ cups_poll->api.watch_get_events = watch_get_events;
-+
-+ cups_poll->api.timeout_new = timeout_new;
-+ cups_poll->api.timeout_update = timeout_update;
-+ cups_poll->api.timeout_free = timeout_free;
-+
-+ return (cups_poll);
-+}
-+
-+
-+/*
-+ * 'avahi_cups_poll_free' - Free an Avahi main loop object for CUPS
-+ */
-+void
-+avahi_cups_poll_free (AvahiCupsPoll *cups_poll)
-+{
-+ cupsd_watched_fd_t *watched_fd;
-+
-+ for (watched_fd = (cupsd_watched_fd_t*)cupsArrayFirst(cups_poll->watched_fds);
-+ watched_fd;
-+ watched_fd = (cupsd_watched_fd_t*)cupsArrayNext(cups_poll->watched_fds)){
-+ cupsArrayClear (watched_fd->watches);
-+ }
-+
-+ cupsArrayClear (cups_poll->watched_fds);
-+ cupsArrayClear (cups_poll->timeouts);
-+}
-+
-+
-+/*
-+ * 'avahi_cups_poll_get' - Get the abstract poll API structure
-+ */
-+
-+const AvahiPoll *
-+avahi_cups_poll_get (AvahiCupsPoll *cups_poll)
-+{
-+ return (&cups_poll->api);
-+}
-+
-+
-+#endif /* HAVE_AVAHI ... from top of file */
-+
-+/*
-+ * End of "$Id$".
-+ */
-diff -up cups-1.4.5/scheduler/avahi.h.avahi cups-1.4.5/scheduler/avahi.h
---- cups-1.4.5/scheduler/avahi.h.avahi 2010-12-24 13:11:38.334340988 +0000
-+++ cups-1.4.5/scheduler/avahi.h 2010-12-24 13:11:38.334340988 +0000
-@@ -0,0 +1,49 @@
-+/*
-+ * "$Id$"
-+ *
-+ * Avahi poll implementation for the CUPS scheduler.
-+ *
-+ * Copyright (C) 2010 Red Hat, Inc.
-+ * Authors:
-+ * Tim Waugh <twaugh@redhat.com>
-+ *
-+ * Distribution and use rights are outlined in the file "LICENSE.txt"
-+ * which should have been included with this file. If this file is
-+ * file is missing or damaged, see the license at "http://www.cups.org/".
-+ */
-+
-+#include <config.h>
-+
-+#ifdef HAVE_AVAHI
-+# include <avahi-client/client.h>
-+# include <avahi-client/publish.h>
-+#endif /* HAVE_AVAHI */
-+
-+#ifdef HAVE_AUTHORIZATION_H
-+# include <Security/Authorization.h>
-+#endif /* HAVE_AUTHORIZATION_H */
-+
-+
-+#ifdef HAVE_AVAHI
-+typedef struct
-+{
-+ AvahiPoll api;
-+ cups_array_t *watched_fds;
-+ cups_array_t *timeouts;
-+} AvahiCupsPoll;
-+#endif /* HAVE_AVAHI */
-+
-+/*
-+ * Prototypes...
-+ */
-+
-+#ifdef HAVE_AVAHI
-+extern AvahiCupsPoll * avahi_cups_poll_new(void);
-+extern void avahi_cups_poll_free(AvahiCupsPoll *cups_poll);
-+extern const AvahiPoll *avahi_cups_poll_get(AvahiCupsPoll *cups_poll);
-+#endif /* HAVE_AVAHI */
-+
-+
-+/*
-+ * End of "$Id$".
-+ */
-diff -up cups-1.4.5/scheduler/cupsd.h.avahi cups-1.4.5/scheduler/cupsd.h
---- cups-1.4.5/scheduler/cupsd.h.avahi 2010-09-21 23:34:57.000000000 +0100
-+++ cups-1.4.5/scheduler/cupsd.h 2010-12-24 13:11:38.335340961 +0000
-@@ -147,6 +147,15 @@ extern const char *cups_hstrerror(int);
-
- typedef void (*cupsd_selfunc_t)(void *data);
-
-+#ifdef HAVE_AVAHI
-+/*
-+ * Timeout callback function type...
-+ */
-+
-+typedef struct _cupsd_timeout_s cupsd_timeout_t;
-+typedef void (*cupsd_timeoutfunc_t)(cupsd_timeout_t *timeout, void *data);
-+#endif /* HAVE_AVAHI */
-+
-
- /*
- * Globals...
-@@ -188,6 +197,9 @@ VAR PSQUpdateQuotaProcPtr PSQUpdateQuota
- /* Apple PrintService quota function */
- #endif /* __APPLE__ && HAVE_DLFCN_H */
-
-+#ifdef HAVE_AVAHI
-+VAR cups_array_t *Timeouts; /* Timed callbacks for main loop */
-+#endif /* HAVE_AVAHI */
-
-
-
-@@ -240,6 +252,18 @@ extern void cupsdRemoveSelect(int fd);
- extern void cupsdStartSelect(void);
- extern void cupsdStopSelect(void);
-
-+#ifdef HAVE_AVAHI
-+extern void cupsdInitTimeouts(void);
-+extern cupsd_timeout_t *cupsdAddTimeout (const struct timeval *tv,
-+ cupsd_timeoutfunc_t cb,
-+ void *data);
-+extern cupsd_timeout_t *cupsdNextTimeout (long *delay);
-+extern void cupsdRunTimeout (cupsd_timeout_t *timeout);
-+extern void cupsdUpdateTimeout (cupsd_timeout_t *timeout,
-+ const struct timeval *tv);
-+extern void cupsdRemoveTimeout (cupsd_timeout_t *timeout);
-+#endif /* HAVE_AVAHI */
-+
- extern int cupsdRemoveFile(const char *filename);
-
-
-diff -up cups-1.4.5/scheduler/dirsvc.c.avahi cups-1.4.5/scheduler/dirsvc.c
---- cups-1.4.5/scheduler/dirsvc.c.avahi 2010-12-24 13:11:33.679463507 +0000
-+++ cups-1.4.5/scheduler/dirsvc.c 2010-12-24 13:11:38.343340751 +0000
-@@ -99,6 +99,13 @@
- #endif /* HAVE_DNSSD */
-
-
-+#ifdef HAVE_DNSSD
-+typedef char *cupsd_txt_record_t;
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+typedef AvahiStringList *cupsd_txt_record_t;
-+#endif /* HAVE_AVAHI */
-+
- /*
- * Local functions...
- */
-@@ -159,15 +166,20 @@ static void update_polling(void);
- static void update_smb(int onoff);
-
-
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-+static cupsd_txt_record_t dnssdBuildTxtRecord(int *txt_len, cupsd_printer_t *p,
-+ int for_lpd);
-+static void dnssdDeregisterPrinter(cupsd_printer_t *p);
-+static int dnssdComparePrinters(cupsd_printer_t *a, cupsd_printer_t *b);
-+static void dnssdRegisterPrinter(cupsd_printer_t *p);
-+static void dnssdStop(void);
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
-+
- #ifdef HAVE_DNSSD
- # ifdef HAVE_COREFOUNDATION
- static void dnssdAddAlias(const void *key, const void *value,
- void *context);
- # endif /* HAVE_COREFOUNDATION */
--static char *dnssdBuildTxtRecord(int *txt_len, cupsd_printer_t *p,
-- int for_lpd);
--static int dnssdComparePrinters(cupsd_printer_t *a, cupsd_printer_t *b);
--static void dnssdDeregisterPrinter(cupsd_printer_t *p);
- static char *dnssdPackTxtRecord(int *txt_len, char *keyvalue[][2],
- int count);
- static void dnssdRegisterCallback(DNSServiceRef sdRef,
-@@ -175,11 +187,20 @@ static void dnssdRegisterCallback(DNSSer
- DNSServiceErrorType errorCode,
- const char *name, const char *regtype,
- const char *domain, void *context);
--static void dnssdRegisterPrinter(cupsd_printer_t *p);
--static void dnssdStop(void);
- static void dnssdUpdate(void);
- #endif /* HAVE_DNSSD */
-
-+#ifdef HAVE_AVAHI
-+static AvahiStringList *avahiPackTxtRecord(char *keyvalue[][2],
-+ int count);
-+static void avahi_entry_group_cb (AvahiEntryGroup *group,
-+ AvahiEntryGroupState state,
-+ void *userdata);
-+static void avahi_client_cb (AvahiClient *client,
-+ AvahiClientState state,
-+ void *userdata);
-+#endif /* HAVE_AVAHI */
-+
- #ifdef HAVE_LDAP
- static const char * const ldap_attrs[] =/* CUPS LDAP attributes */
- {
-@@ -283,10 +304,10 @@ cupsdDeregisterPrinter(
- ldap_dereg_printer(p);
- #endif /* HAVE_LDAP */
-
--#ifdef HAVE_DNSSD
-- if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef)
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-+ if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD))
- dnssdDeregisterPrinter(p);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- }
-
-
-@@ -694,10 +715,10 @@ cupsdRegisterPrinter(cupsd_printer_t *p)
- slpRegisterPrinter(p); */
- #endif /* HAVE_LIBSLP */
-
--#ifdef HAVE_DNSSD
-- if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef)
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-+ if ((BrowseLocalProtocols & BROWSE_DNSSD))
- dnssdRegisterPrinter(p);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- }
-
-
-@@ -1535,13 +1556,16 @@ cupsdStartBrowsing(void)
- else
- BrowseSocket = -1;
-
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_DNSSD)
- {
-+#ifdef HAVE_DNSSD
- DNSServiceErrorType error; /* Error from service creation */
-+#endif /* HAVE_DNSSD */
- cupsd_listener_t *lis; /* Current listening socket */
-
-
-+#ifdef HAVE_DNSSD
- /*
- * First create a "master" connection for all registrations...
- */
-@@ -1566,6 +1590,7 @@ cupsdStartBrowsing(void)
- fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
-
- cupsdAddSelect(fd, (cupsd_selfunc_t)dnssdUpdate, NULL, NULL);
-+#endif /* HAVE_DNSSD */
-
- /*
- * Then get the port we use for registrations. If we are not listening
-@@ -1607,9 +1632,20 @@ cupsdStartBrowsing(void)
- */
-
- cupsdUpdateDNSSDName();
-+#ifdef HAVE_DNSSD
- }
-- }
- #endif /* HAVE_DNSSD */
-+ }
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
-+
-+#ifdef HAVE_AVAHI
-+ if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_DNSSD)
-+ {
-+ AvahiCupsPollHandle = avahi_cups_poll_new ();
-+ avahi_client_new (avahi_cups_poll_get (AvahiCupsPollHandle),
-+ 0, avahi_client_cb, NULL, NULL);
-+ }
-+#endif /* HAVE_AVAHI */
-
- #ifdef HAVE_LIBSLP
- if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP)
-@@ -1835,10 +1871,10 @@ cupsdStopBrowsing(void)
- BrowseSocket = -1;
- }
-
--#ifdef HAVE_DNSSD
-- if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef)
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-+ if ((BrowseLocalProtocols & BROWSE_DNSSD))
- dnssdStop();
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
-
- #ifdef HAVE_LIBSLP
- if (((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP) &&
-@@ -1903,7 +1939,7 @@ cupsdStopPolling(void)
- }
-
-
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- /*
- * 'cupsdUpdateDNSSDName()' - Update the computer name we use for browsing...
- */
-@@ -1911,7 +1947,12 @@ cupsdStopPolling(void)
- void
- cupsdUpdateDNSSDName(void)
- {
-+#ifdef HAVE_DNSSD
- DNSServiceErrorType error; /* Error from service creation */
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ int ret; /* Error from service creation */
-+#endif /* HAVE_AVAHI */
- char webif[1024]; /* Web interface share name */
- #ifdef HAVE_COREFOUNDATION_H
- SCDynamicStoreRef sc; /* Context for dynamic store */
-@@ -2043,6 +2084,7 @@ cupsdUpdateDNSSDName(void)
- else
- strlcpy(webif, "CUPS Web Interface", sizeof(webif));
-
-+#ifdef HAVE_DNSSD
- if (WebIFRef)
- DNSServiceRefDeallocate(WebIFRef);
-
-@@ -2055,6 +2097,42 @@ cupsdUpdateDNSSDName(void)
- NULL)) != kDNSServiceErr_NoError)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "DNS-SD web interface registration failed: %d", error);
-+#endif /* HAVE_DNSSD */
-+
-+#ifdef HAVE_AVAHI
-+ if (!AvahiCupsClient)
-+ /*
-+ * Client not yet running.
-+ */
-+ return;
-+
-+ if (AvahiWebIFGroup)
-+ avahi_entry_group_reset (AvahiWebIFGroup);
-+ else
-+ AvahiWebIFGroup = avahi_entry_group_new (AvahiCupsClient,
-+ avahi_entry_group_cb,
-+ NULL);
-+
-+ if (AvahiWebIFGroup)
-+ {
-+ ret = avahi_entry_group_add_service (AvahiWebIFGroup,
-+ AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ 0, /* flags */
-+ webif, /* name */
-+ "_http._tcp", /* type */
-+ NULL, /* domain */
-+ NULL, /* host */
-+ htons(DNSSDPort), /* port */
-+ "path=/", NULL);
-+ if (ret == 0)
-+ ret = avahi_entry_group_commit (AvahiWebIFGroup);
-+
-+ if (ret != 0)
-+ cupsdLogMessage (CUPSD_LOG_ERROR,
-+ "Avahi web interface registration failed: %d", ret);
-+ }
-+#endif /* HAVE_AVAHI */
- }
- }
- #endif /* HAVE_DNSSD */
-@@ -2300,162 +2378,7 @@ dequote(char *d, /* I - Destinat
- }
-
-
--#ifdef HAVE_DNSSD
--# ifdef HAVE_COREFOUNDATION
--/*
-- * 'dnssdAddAlias()' - Add a DNS-SD alias name.
-- */
--
--static void
--dnssdAddAlias(const void *key, /* I - Key */
-- const void *value, /* I - Value (domain) */
-- void *context) /* I - Unused */
--{
-- char valueStr[1024], /* Domain string */
-- hostname[1024]; /* Complete hostname */
--
--
-- (void)context;
--
-- if (CFGetTypeID((CFStringRef)value) == CFStringGetTypeID() &&
-- CFStringGetCString((CFStringRef)value, valueStr, sizeof(valueStr),
-- kCFStringEncodingUTF8))
-- {
-- snprintf(hostname, sizeof(hostname), "%s.%s", DNSSDHostName, valueStr);
-- if (!DNSSDAlias)
-- DNSSDAlias = cupsArrayNew(NULL, NULL);
--
-- cupsdAddAlias(DNSSDAlias, hostname);
-- cupsdLogMessage(CUPSD_LOG_DEBUG, "Added Back to My Mac ServerAlias %s",
-- hostname);
-- }
-- else
-- cupsdLogMessage(CUPSD_LOG_ERROR,
-- "Bad Back to My Mac domain in dynamic store!");
--}
--# endif /* HAVE_COREFOUNDATION */
--
--
--/*
-- * 'dnssdBuildTxtRecord()' - Build a TXT record from printer info.
-- */
--
--static char * /* O - TXT record */
--dnssdBuildTxtRecord(
-- int *txt_len, /* O - TXT record length */
-- cupsd_printer_t *p, /* I - Printer information */
-- int for_lpd) /* I - 1 = LPD, 0 = IPP */
--{
-- int i; /* Looping var */
-- char adminurl_str[256], /* URL for th admin page */
-- type_str[32], /* Type to string buffer */
-- state_str[32], /* State to string buffer */
-- rp_str[1024], /* Queue name string buffer */
-- air_str[1024], /* auth-info-required string buffer */
-- *keyvalue[32][2]; /* Table of key/value pairs */
--
--
-- /*
-- * Load up the key value pairs...
-- */
--
-- i = 0;
--
-- keyvalue[i ][0] = "txtvers";
-- keyvalue[i++][1] = "1";
--
-- keyvalue[i ][0] = "qtotal";
-- keyvalue[i++][1] = "1";
--
-- keyvalue[i ][0] = "rp";
-- keyvalue[i++][1] = rp_str;
-- if (for_lpd)
-- strlcpy(rp_str, p->name, sizeof(rp_str));
-- else
-- snprintf(rp_str, sizeof(rp_str), "%s/%s",
-- (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", p->name);
--
-- keyvalue[i ][0] = "ty";
-- keyvalue[i++][1] = p->make_model ? p->make_model : "Unknown";
--
-- httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl_str, sizeof(adminurl_str),
-- "http", NULL, DNSSDHostName, DNSSDPort, "/%s/%s",
-- (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers",
-- p->name);
-- keyvalue[i ][0] = "adminurl";
-- keyvalue[i++][1] = adminurl_str;
--
-- keyvalue[i ][0] = "note";
-- keyvalue[i++][1] = p->location ? p->location : "";
--
-- keyvalue[i ][0] = "priority";
-- keyvalue[i++][1] = for_lpd ? "100" : "0";
--
-- keyvalue[i ][0] = "product";
-- keyvalue[i++][1] = p->product ? p->product : "Unknown";
--
-- snprintf(type_str, sizeof(type_str), "0x%X", p->type | CUPS_PRINTER_REMOTE);
-- snprintf(state_str, sizeof(state_str), "%d", p->state);
--
-- keyvalue[i ][0] = "printer-state";
-- keyvalue[i++][1] = state_str;
--
-- keyvalue[i ][0] = "printer-type";
-- keyvalue[i++][1] = type_str;
--
-- keyvalue[i ][0] = "Transparent";
-- keyvalue[i++][1] = "T";
--
-- keyvalue[i ][0] = "Binary";
-- keyvalue[i++][1] = "T";
--
-- keyvalue[i ][0] = "Fax";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_FAX) ? "T" : "F";
--
-- keyvalue[i ][0] = "Color";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_COLOR) ? "T" : "F";
--
-- keyvalue[i ][0] = "Duplex";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_DUPLEX) ? "T" : "F";
--
-- keyvalue[i ][0] = "Staple";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_STAPLE) ? "T" : "F";
--
-- keyvalue[i ][0] = "Copies";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_COPIES) ? "T" : "F";
--
-- keyvalue[i ][0] = "Collate";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_COLLATE) ? "T" : "F";
--
-- keyvalue[i ][0] = "Punch";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_PUNCH) ? "T" : "F";
--
-- keyvalue[i ][0] = "Bind";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_BIND) ? "T" : "F";
--
-- keyvalue[i ][0] = "Sort";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_SORT) ? "T" : "F";
--
-- keyvalue[i ][0] = "Scan";
-- keyvalue[i++][1] = (p->type & CUPS_PRINTER_MFP) ? "T" : "F";
--
-- keyvalue[i ][0] = "pdl";
-- keyvalue[i++][1] = p->pdl ? p->pdl : "application/postscript";
--
-- if (get_auth_info_required(p, air_str, sizeof(air_str)))
-- {
-- keyvalue[i ][0] = "air";
-- keyvalue[i++][1] = air_str;
-- }
--
-- /*
-- * Then pack them into a proper txt record...
-- */
--
-- return (dnssdPackTxtRecord(txt_len, keyvalue, i));
--}
--
--
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- /*
- * 'dnssdComparePrinters()' - Compare the registered names of two printers.
- */
-@@ -2479,6 +2402,10 @@ dnssdDeregisterPrinter(
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdDeregisterPrinter(%s)", p->name);
-
-+#ifdef HAVE_DNSSD
-+ if (!DNSSDRef)
-+ return;
-+
- /*
- * Closing the socket deregisters the service
- */
-@@ -2514,6 +2441,23 @@ dnssdDeregisterPrinter(
- free(p->printer_txt);
- p->printer_txt = NULL;
- }
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ if (p->avahi_group)
-+ {
-+ avahi_entry_group_reset (p->avahi_group);
-+ avahi_entry_group_free (p->avahi_group);
-+ p->avahi_group = NULL;
-+
-+ if (p->ipp_txt)
-+ avahi_string_list_free (p->ipp_txt);
-+
-+ if (p->printer_txt)
-+ avahi_string_list_free (p->printer_txt);
-+
-+ p->ipp_txt = p->printer_txt = NULL;
-+ }
-+#endif /* HAVE_AVAHI */
-
- /*
- * Remove the printer from the array of DNS-SD printers, then clear the
-@@ -2526,140 +2470,53 @@ dnssdDeregisterPrinter(
-
-
- /*
-- * 'dnssdPackTxtRecord()' - Pack an array of key/value pairs into the
-- * TXT record format.
-+ * 'dnssdRegisterPrinter()' - Start sending broadcast information for a printer
-+ * or update the broadcast contents.
- */
-
--static char * /* O - TXT record */
--dnssdPackTxtRecord(int *txt_len, /* O - TXT record length */
-- char *keyvalue[][2], /* I - Table of key value pairs */
-- int count) /* I - Items in table */
-+static void
-+dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
- {
-- int i; /* Looping var */
-- int length; /* Length of TXT record */
-- int length2; /* Length of value */
-- char *txtRecord; /* TXT record buffer */
-- char *cursor; /* Looping pointer */
-+#ifdef HAVE_DNSSD
-+ DNSServiceErrorType se; /* dnssd errors */
-+ char *ipp_txt, /* IPP TXT record buffer */
-+ *printer_txt, /* LPD TXT record buffer */
-+ *nameptr; /* Pointer into name */
-+ int ipp_len, /* IPP TXT record length */
-+ printer_len; /* LPD TXT record length */
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ int ret; /* Error code */
-+ AvahiStringList *ipp_txt, /* IPP TXT record list */
-+ *printer_txt; /* LPD TXT record buffer */
-+#endif /* HAVE_AVAHI */
-+ char name[1024]; /* Service name */
-+ const char *regtype; /* Registration type */
-
-
-- /*
-- * Calculate the buffer size
-- */
-+#ifdef HAVE_DNSSD
-+ if (!DNSSDRef)
-+ return;
-
-- for (length = i = 0; i < count; i++)
-- length += 1 + strlen(keyvalue[i][0]) +
-- (keyvalue[i][1] ? 1 + strlen(keyvalue[i][1]) : 0);
-+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name,
-+ !p->ipp_ref ? "new" : "update");
-+
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name,
-+ !p->avahi_group ? "new" : "update");
-+#endif /* HAVE_AVAHI */
-
- /*
-- * Allocate and fill it
-+ * If per-printer sharing was just disabled make sure we're not
-+ * registered before returning.
- */
-
-- txtRecord = malloc(length);
-- if (txtRecord)
-+ if (!p->shared)
- {
-- *txt_len = length;
--
-- for (cursor = txtRecord, i = 0; i < count; i++)
-- {
-- /*
-- * Drop in the p-string style length byte followed by the data
-- */
--
-- length = strlen(keyvalue[i][0]);
-- length2 = keyvalue[i][1] ? 1 + strlen(keyvalue[i][1]) : 0;
--
-- *cursor++ = (unsigned char)(length + length2);
--
-- memcpy(cursor, keyvalue[i][0], length);
-- cursor += length;
--
-- if (length2)
-- {
-- length2 --;
-- *cursor++ = '=';
-- memcpy(cursor, keyvalue[i][1], length2);
-- cursor += length2;
-- }
-- }
-- }
--
-- return (txtRecord);
--}
--
--
--/*
-- * 'dnssdRegisterCallback()' - DNSServiceRegister callback.
-- */
--
--static void
--dnssdRegisterCallback(
-- DNSServiceRef sdRef, /* I - DNS Service reference */
-- DNSServiceFlags flags, /* I - Reserved for future use */
-- DNSServiceErrorType errorCode, /* I - Error code */
-- const char *name, /* I - Service name */
-- const char *regtype, /* I - Service type */
-- const char *domain, /* I - Domain. ".local" for now */
-- void *context) /* I - User-defined context */
--{
-- cupsd_printer_t *p = (cupsd_printer_t *)context;
-- /* Current printer */
--
--
-- cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterCallback(%s, %s) for %s (%s)",
-- name, regtype, p ? p->name : "Web Interface",
-- p ? (p->reg_name ? p->reg_name : "(null)") : "NA");
--
-- if (errorCode)
-- {
-- cupsdLogMessage(CUPSD_LOG_ERROR,
-- "DNSServiceRegister failed with error %d", (int)errorCode);
-- return;
-- }
-- else if (p && (!p->reg_name || strcasecmp(name, p->reg_name)))
-- {
-- cupsdLogMessage(CUPSD_LOG_INFO, "Using service name \"%s\" for \"%s\"",
-- name, p->name);
--
-- cupsArrayRemove(DNSSDPrinters, p);
-- cupsdSetString(&p->reg_name, name);
-- cupsArrayAdd(DNSSDPrinters, p);
--
-- LastEvent |= CUPSD_EVENT_PRINTER_MODIFIED;
-- }
--}
--
--
--/*
-- * 'dnssdRegisterPrinter()' - Start sending broadcast information for a printer
-- * or update the broadcast contents.
-- */
--
--static void
--dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
--{
-- DNSServiceErrorType se; /* dnssd errors */
-- char *ipp_txt, /* IPP TXT record buffer */
-- *printer_txt, /* LPD TXT record buffer */
-- name[1024], /* Service name */
-- *nameptr; /* Pointer into name */
-- int ipp_len, /* IPP TXT record length */
-- printer_len; /* LPD TXT record length */
-- const char *regtype; /* Registration type */
--
--
-- cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name,
-- !p->ipp_ref ? "new" : "update");
--
-- /*
-- * If per-printer sharing was just disabled make sure we're not
-- * registered before returning.
-- */
--
-- if (!p->shared)
-- {
-- dnssdDeregisterPrinter(p);
-- return;
-- }
-+ dnssdDeregisterPrinter(p);
-+ return;
-+ }
-
- /*
- * The registered name takes the form of "<printer-info> @ <computer name>"...
-@@ -2694,6 +2551,7 @@ dnssdRegisterPrinter(cupsd_printer_t *p)
- * Register IPP and (optionally) LPD...
- */
-
-+#ifdef HAVE_DNSSD
- ipp_len = 0; /* anti-compiler-warning-code */
- ipp_txt = dnssdBuildTxtRecord(&ipp_len, p, 0);
-
-@@ -2860,6 +2718,140 @@ dnssdRegisterPrinter(cupsd_printer_t *p)
- if (printer_txt)
- free(printer_txt);
- }
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ if (!AvahiCupsClient)
-+ /*
-+ * Client not running yet. The client callback will call us again later.
-+ */
-+ return;
-+
-+ ipp_txt = dnssdBuildTxtRecord(NULL, p, 0);
-+ printer_txt = dnssdBuildTxtRecord(NULL, p, 1);
-+ regtype = (p->type & CUPS_PRINTER_FAX) ? "_fax-ipp._tcp" : "_ipp._tcp";
-+
-+ if (p->avahi_group && p->ipp_txt && ipp_txt &&
-+ !avahi_string_list_equal (p->ipp_txt, ipp_txt))
-+ {
-+ /*
-+ * Update the existing registration...
-+ */
-+
-+ avahi_string_list_free (p->ipp_txt);
-+
-+ if (p->printer_txt)
-+ avahi_string_list_free (p->printer_txt);
-+
-+ ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group,
-+ AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ 0, name, regtype, NULL,
-+ ipp_txt);
-+ if (ret < 0)
-+ goto update_failed;
-+
-+ p->ipp_txt = ipp_txt;
-+ ipp_txt = NULL;
-+
-+ if (BrowseLocalProtocols & BROWSE_LPD)
-+ {
-+ ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group,
-+ AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ 0, name,
-+ "_printer._tcp", NULL,
-+ printer_txt);
-+
-+ if (ret < 0)
-+ goto update_failed;
-+
-+ p->printer_txt = printer_txt;
-+ printer_txt = NULL;
-+ }
-+
-+ ret = avahi_entry_group_commit (p->avahi_group);
-+ if (ret < 0)
-+ {
-+ update_failed:
-+ cupsdLogMessage (CUPSD_LOG_ERROR,
-+ "Failed to update TXT record for %s: %d",
-+ name, ret);
-+ avahi_entry_group_reset (p->avahi_group);
-+ avahi_entry_group_free (p->avahi_group);
-+ p->avahi_group = NULL;
-+ ipp_txt = p->ipp_txt;
-+ p->ipp_txt = NULL;
-+ }
-+ }
-+
-+ if (!p->avahi_group)
-+ {
-+ /*
-+ * Initial registration. Use the _fax subtype for fax queues...
-+ */
-+
-+ p->avahi_group = avahi_entry_group_new (AvahiCupsClient,
-+ avahi_entry_group_cb,
-+ p);
-+
-+ cupsdLogMessage(CUPSD_LOG_DEBUG,
-+ "Registering Avahi printer %s with name \"%s\" and "
-+ "type \"%s\"", p->name, name, regtype);
-+
-+ ret = avahi_entry_group_add_service_strlst (p->avahi_group,
-+ AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ 0, name, regtype, NULL, NULL,
-+ htons(DNSSDPort),
-+ ipp_txt);
-+ if (ret < 0)
-+ goto add_failed;
-+
-+ p->ipp_txt = ipp_txt;
-+ ipp_txt = NULL;
-+
-+ if (BrowseLocalProtocols & BROWSE_LPD)
-+ {
-+ cupsdLogMessage(CUPSD_LOG_DEBUG,
-+ "Registering Avahi printer %s with name \"%s\" and "
-+ "type \"_printer._tcp\"", p->name, name);
-+
-+ ret = avahi_entry_group_add_service_strlst (p->avahi_group,
-+ AVAHI_IF_UNSPEC,
-+ AVAHI_PROTO_UNSPEC,
-+ 0, name,
-+ "_printer._tcp", NULL, NULL,
-+ htons(515),
-+ printer_txt);
-+ if (ret < 0)
-+ goto add_failed;
-+
-+ p->printer_txt = printer_txt;
-+ printer_txt = NULL;
-+ }
-+
-+ ret = avahi_entry_group_commit (p->avahi_group);
-+
-+ if (ret < 0)
-+ {
-+ add_failed:
-+ cupsdLogMessage (CUPSD_LOG_ERROR,
-+ "Failed to add Avahi entry for %s: %d",
-+ name, ret);
-+ avahi_entry_group_reset (p->avahi_group);
-+ avahi_entry_group_free (p->avahi_group);
-+ p->avahi_group = NULL;
-+ ipp_txt = p->ipp_txt;
-+ p->ipp_txt = NULL;
-+ }
-+ }
-+
-+ if (ipp_txt)
-+ avahi_string_list_free (ipp_txt);
-+
-+ if (printer_txt)
-+ avahi_string_list_free (printer_txt);
-+#endif /* HAVE_AVAHI */
- }
-
-
-@@ -2872,6 +2864,10 @@ dnssdStop(void)
- {
- cupsd_printer_t *p; /* Current printer */
-
-+#ifdef HAVE_DNSSD
-+ if (!DNSSDRef)
-+ return;
-+#endif /* HAVE_DNSSD */
-
- /*
- * De-register the individual printers
-@@ -2882,6 +2878,7 @@ dnssdStop(void)
- p = (cupsd_printer_t *)cupsArrayNext(Printers))
- dnssdDeregisterPrinter(p);
-
-+#ifdef HAVE_DNSSD
- /*
- * Shutdown the rest of the service refs...
- */
-@@ -2902,6 +2899,7 @@ dnssdStop(void)
-
- DNSServiceRefDeallocate(DNSSDRef);
- DNSSDRef = NULL;
-+#endif /* HAVE_DNSSD */
-
- cupsArrayDelete(DNSSDPrinters);
- DNSSDPrinters = NULL;
-@@ -2911,6 +2909,272 @@ dnssdStop(void)
-
-
- /*
-+ * 'dnssdBuildTxtRecord()' - Build a TXT record from printer info.
-+ */
-+
-+static cupsd_txt_record_t /* O - TXT record */
-+dnssdBuildTxtRecord(
-+ int *txt_len, /* O - TXT record length */
-+ cupsd_printer_t *p, /* I - Printer information */
-+ int for_lpd) /* I - 1 = LPD, 0 = IPP */
-+{
-+ int i; /* Looping var */
-+ char adminurl_str[256], /* URL for th admin page */
-+ type_str[32], /* Type to string buffer */
-+ state_str[32], /* State to string buffer */
-+ rp_str[1024], /* Queue name string buffer */
-+ air_str[1024], /* auth-info-required string buffer */
-+ *keyvalue[32][2]; /* Table of key/value pairs */
-+
-+
-+ /*
-+ * Load up the key value pairs...
-+ */
-+
-+ i = 0;
-+
-+ keyvalue[i ][0] = "txtvers";
-+ keyvalue[i++][1] = "1";
-+
-+ keyvalue[i ][0] = "qtotal";
-+ keyvalue[i++][1] = "1";
-+
-+ keyvalue[i ][0] = "rp";
-+ keyvalue[i++][1] = rp_str;
-+ if (for_lpd)
-+ strlcpy(rp_str, p->name, sizeof(rp_str));
-+ else
-+ snprintf(rp_str, sizeof(rp_str), "%s/%s",
-+ (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", p->name);
-+
-+ keyvalue[i ][0] = "ty";
-+ keyvalue[i++][1] = p->make_model ? p->make_model : "Unknown";
-+
-+ httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl_str, sizeof(adminurl_str),
-+ "http", NULL, DNSSDHostName, DNSSDPort, "/%s/%s",
-+ (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers",
-+ p->name);
-+ keyvalue[i ][0] = "adminurl";
-+ keyvalue[i++][1] = adminurl_str;
-+
-+ keyvalue[i ][0] = "note";
-+ keyvalue[i++][1] = p->location ? p->location : "";
-+
-+ keyvalue[i ][0] = "priority";
-+ keyvalue[i++][1] = for_lpd ? "100" : "0";
-+
-+ keyvalue[i ][0] = "product";
-+ keyvalue[i++][1] = p->product ? p->product : "Unknown";
-+
-+ snprintf(type_str, sizeof(type_str), "0x%X", p->type | CUPS_PRINTER_REMOTE);
-+ snprintf(state_str, sizeof(state_str), "%d", p->state);
-+
-+ keyvalue[i ][0] = "printer-state";
-+ keyvalue[i++][1] = state_str;
-+
-+ keyvalue[i ][0] = "printer-type";
-+ keyvalue[i++][1] = type_str;
-+
-+ keyvalue[i ][0] = "Transparent";
-+ keyvalue[i++][1] = "T";
-+
-+ keyvalue[i ][0] = "Binary";
-+ keyvalue[i++][1] = "T";
-+
-+ keyvalue[i ][0] = "Fax";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_FAX) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Color";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_COLOR) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Duplex";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_DUPLEX) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Staple";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_STAPLE) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Copies";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_COPIES) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Collate";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_COLLATE) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Punch";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_PUNCH) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Bind";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_BIND) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Sort";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_SORT) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "Scan";
-+ keyvalue[i++][1] = (p->type & CUPS_PRINTER_MFP) ? "T" : "F";
-+
-+ keyvalue[i ][0] = "pdl";
-+ keyvalue[i++][1] = p->pdl ? p->pdl : "application/postscript";
-+
-+ if (get_auth_info_required(p, air_str, sizeof(air_str)))
-+ {
-+ keyvalue[i ][0] = "air";
-+ keyvalue[i++][1] = air_str;
-+ }
-+
-+ /*
-+ * Then pack them into a proper txt record...
-+ */
-+
-+#ifdef HAVE_DNSSD
-+ return (dnssdPackTxtRecord(txt_len, keyvalue, i));
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ return (avahiPackTxtRecord(keyvalue, i));
-+#endif /* HAVE_AVAHI */
-+}
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
-+
-+
-+#ifdef HAVE_DNSSD
-+# ifdef HAVE_COREFOUNDATION
-+/*
-+ * 'dnssdAddAlias()' - Add a DNS-SD alias name.
-+ */
-+
-+static void
-+dnssdAddAlias(const void *key, /* I - Key */
-+ const void *value, /* I - Value (domain) */
-+ void *context) /* I - Unused */
-+{
-+ char valueStr[1024], /* Domain string */
-+ hostname[1024]; /* Complete hostname */
-+
-+
-+ (void)context;
-+
-+ if (CFGetTypeID((CFStringRef)value) == CFStringGetTypeID() &&
-+ CFStringGetCString((CFStringRef)value, valueStr, sizeof(valueStr),
-+ kCFStringEncodingUTF8))
-+ {
-+ snprintf(hostname, sizeof(hostname), "%s.%s", DNSSDHostName, valueStr);
-+ if (!DNSSDAlias)
-+ DNSSDAlias = cupsArrayNew(NULL, NULL);
-+
-+ cupsdAddAlias(DNSSDAlias, hostname);
-+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Added Back to My Mac ServerAlias %s",
-+ hostname);
-+ }
-+ else
-+ cupsdLogMessage(CUPSD_LOG_ERROR,
-+ "Bad Back to My Mac domain in dynamic store!");
-+}
-+# endif /* HAVE_COREFOUNDATION */
-+
-+
-+/*
-+ * 'dnssdPackTxtRecord()' - Pack an array of key/value pairs into the
-+ * TXT record format.
-+ */
-+
-+static char * /* O - TXT record */
-+dnssdPackTxtRecord(int *txt_len, /* O - TXT record length */
-+ char *keyvalue[][2], /* I - Table of key value pairs */
-+ int count) /* I - Items in table */
-+{
-+ int i; /* Looping var */
-+ int length; /* Length of TXT record */
-+ int length2; /* Length of value */
-+ char *txtRecord; /* TXT record buffer */
-+ char *cursor; /* Looping pointer */
-+
-+
-+ /*
-+ * Calculate the buffer size
-+ */
-+
-+ for (length = i = 0; i < count; i++)
-+ length += 1 + strlen(keyvalue[i][0]) +
-+ (keyvalue[i][1] ? 1 + strlen(keyvalue[i][1]) : 0);
-+
-+ /*
-+ * Allocate and fill it
-+ */
-+
-+ txtRecord = malloc(length);
-+ if (txtRecord)
-+ {
-+ *txt_len = length;
-+
-+ for (cursor = txtRecord, i = 0; i < count; i++)
-+ {
-+ /*
-+ * Drop in the p-string style length byte followed by the data
-+ */
-+
-+ length = strlen(keyvalue[i][0]);
-+ length2 = keyvalue[i][1] ? 1 + strlen(keyvalue[i][1]) : 0;
-+
-+ *cursor++ = (unsigned char)(length + length2);
-+
-+ memcpy(cursor, keyvalue[i][0], length);
-+ cursor += length;
-+
-+ if (length2)
-+ {
-+ length2 --;
-+ *cursor++ = '=';
-+ memcpy(cursor, keyvalue[i][1], length2);
-+ cursor += length2;
-+ }
-+ }
-+ }
-+
-+ return (txtRecord);
-+}
-+
-+
-+/*
-+ * 'dnssdRegisterCallback()' - DNSServiceRegister callback.
-+ */
-+
-+static void
-+dnssdRegisterCallback(
-+ DNSServiceRef sdRef, /* I - DNS Service reference */
-+ DNSServiceFlags flags, /* I - Reserved for future use */
-+ DNSServiceErrorType errorCode, /* I - Error code */
-+ const char *name, /* I - Service name */
-+ const char *regtype, /* I - Service type */
-+ const char *domain, /* I - Domain. ".local" for now */
-+ void *context) /* I - User-defined context */
-+{
-+ cupsd_printer_t *p = (cupsd_printer_t *)context;
-+ /* Current printer */
-+
-+
-+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterCallback(%s, %s) for %s (%s)",
-+ name, regtype, p ? p->name : "Web Interface",
-+ p ? (p->reg_name ? p->reg_name : "(null)") : "NA");
-+
-+ if (errorCode)
-+ {
-+ cupsdLogMessage(CUPSD_LOG_ERROR,
-+ "DNSServiceRegister failed with error %d", (int)errorCode);
-+ return;
-+ }
-+ else if (p && (!p->reg_name || strcasecmp(name, p->reg_name)))
-+ {
-+ cupsdLogMessage(CUPSD_LOG_INFO, "Using service name \"%s\" for \"%s\"",
-+ name, p->name);
-+
-+ cupsArrayRemove(DNSSDPrinters, p);
-+ cupsdSetString(&p->reg_name, name);
-+ cupsArrayAdd(DNSSDPrinters, p);
-+
-+ LastEvent |= CUPSD_EVENT_PRINTER_MODIFIED;
-+ }
-+}
-+
-+
-+/*
- * 'dnssdUpdate()' - Handle DNS-SD queries.
- */
-
-@@ -2931,6 +3195,126 @@ dnssdUpdate(void)
- #endif /* HAVE_DNSSD */
-
-
-+#ifdef HAVE_AVAHI
-+/*
-+ * 'avahiPackTxtRecord()' - Pack an array of key/value pairs into an
-+ * AvahiStringList.
-+ */
-+
-+static AvahiStringList * /* O - new string list */
-+avahiPackTxtRecord(char *keyvalue[][2], /* I - Table of key value pairs */
-+ int count) /* I - Items in table */
-+{
-+ AvahiStringList *strlst = NULL;
-+ char **elements;
-+ size_t len;
-+ int i;
-+
-+ elements = malloc ((1 + count) * sizeof (char *));
-+ if (!elements)
-+ goto cleanup;
-+
-+ for (i = 0; i < count; i++)
-+ {
-+ len = (1 + strlen (keyvalue[i][0]) +
-+ (keyvalue[i][1] ? 1 + strlen (keyvalue[i][1]) : 1));
-+ elements[i] = malloc (len * sizeof (char));
-+ if (!elements[i])
-+ goto cleanup;
-+
-+ snprintf (elements[i], len, "%s=%s", keyvalue[i][0], keyvalue[i][1]);
-+ }
-+
-+ strlst = avahi_string_list_new_from_array ((const char **) elements, count);
-+
-+cleanup:
-+ while (--i >= 0)
-+ free (elements[i]);
-+
-+ free (elements);
-+ return (strlst);
-+}
-+
-+
-+/*
-+ * 'avahi_entry_group_cb()' - Avahi entry group callback function.
-+ */
-+static void
-+avahi_entry_group_cb (AvahiEntryGroup *group,
-+ AvahiEntryGroupState state,
-+ void *userdata)
-+{
-+ char *name;
-+
-+ if (userdata)
-+ name = ((cupsd_printer_t *) userdata)->reg_name;
-+ else
-+ name = "CUPS web interface";
-+
-+ switch (state)
-+ {
-+ case AVAHI_ENTRY_GROUP_UNCOMMITED:
-+ case AVAHI_ENTRY_GROUP_REGISTERING:
-+ break;
-+
-+ case AVAHI_ENTRY_GROUP_ESTABLISHED:
-+ cupsdLogMessage (CUPSD_LOG_DEBUG,
-+ "Avahi entry group established for %s", name);
-+ break;
-+
-+ default:
-+ cupsdLogMessage (CUPSD_LOG_DEBUG,
-+ "Avahi entry group %s has state %d",
-+ name, state);
-+ break;
-+ }
-+}
-+
-+/*
-+ * 'avahi_client_cb()' - Avahi client callback function.
-+ */
-+static void
-+avahi_client_cb (AvahiClient *client,
-+ AvahiClientState state,
-+ void *userdata)
-+{
-+ cupsd_printer_t *printer;
-+ switch (state)
-+ {
-+ case AVAHI_CLIENT_S_RUNNING:
-+ /*
-+ * Avahi client started successfully.
-+ */
-+ AvahiCupsClient = client;
-+ cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client started");
-+
-+ cupsdUpdateDNSSDName ();
-+
-+ for (printer = (cupsd_printer_t *)cupsArrayFirst(DNSSDPrinters);
-+ printer;
-+ printer = (cupsd_printer_t *)cupsArrayNext(DNSSDPrinters))
-+ {
-+ if (!printer->avahi_group)
-+ dnssdRegisterPrinter (printer);
-+ }
-+
-+ break;
-+
-+ case AVAHI_CLIENT_CONNECTING:
-+ cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client connecting");
-+ break;
-+
-+ case AVAHI_CLIENT_FAILURE:
-+ cupsdLogMessage (CUPSD_LOG_ERROR, "Avahi client failed");
-+ break;
-+
-+ default:
-+ cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client state: %d", state);
-+ }
-+}
-+#endif /* HAVE_AVAHI */
-+
-+
- /*
- * 'get_auth_info_required()' - Get the auth-info-required value to advertise.
- */
-diff -up cups-1.4.5/scheduler/dirsvc.h.avahi cups-1.4.5/scheduler/dirsvc.h
---- cups-1.4.5/scheduler/dirsvc.h.avahi 2009-05-14 18:54:37.000000000 +0100
-+++ cups-1.4.5/scheduler/dirsvc.h 2010-12-24 13:11:38.344340724 +0000
-@@ -32,6 +32,10 @@
- # endif /* HAVE_LDAP_SSL_H */
- #endif /* HAVE_LDAP */
-
-+#ifdef HAVE_AVAHI
-+# include <avahi-client/publish.h>
-+#endif /* HAVE_AVAHI */
-+
- /*
- * Browse protocols...
- */
-@@ -132,17 +136,20 @@ VAR int PollPipe VALUE(0);
- VAR cupsd_statbuf_t *PollStatusBuffer VALUE(NULL);
- /* Status buffer for pollers */
-
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-+VAR int DNSSDPort VALUE(0);
-+ /* Port number to register */
- VAR char *DNSSDComputerName VALUE(NULL),
- /* Computer/server name */
- *DNSSDHostName VALUE(NULL);
- /* Hostname */
--VAR cups_array_t *DNSSDAlias VALUE(NULL);
-- /* List of dynamic ServerAlias's */
--VAR int DNSSDPort VALUE(0);
-- /* Port number to register */
- VAR cups_array_t *DNSSDPrinters VALUE(NULL);
- /* Printers we have registered */
-+#endif /* HAVE_DNSSD || HAVE_AVAHI */
-+
-+#ifdef HAVE_DNSSD
-+VAR cups_array_t *DNSSDAlias VALUE(NULL);
-+ /* List of dynamic ServerAlias's */
- VAR DNSServiceRef DNSSDRef VALUE(NULL),
- /* Master DNS-SD service reference */
- WebIFRef VALUE(NULL),
-@@ -151,6 +158,15 @@ VAR DNSServiceRef DNSSDRef VALUE(NULL),
- /* Remote printer browse reference */
- #endif /* HAVE_DNSSD */
-
-+#ifdef HAVE_AVAHI
-+VAR AvahiCupsPoll *AvahiCupsPollHandle VALUE(NULL);
-+ /* AvahiCupsPoll object */
-+VAR AvahiClient *AvahiCupsClient VALUE(NULL);
-+ /* AvahiClient object */
-+VAR AvahiEntryGroup *AvahiWebIFGroup VALUE(NULL);
-+ /* Web interface entry group */
-+#endif /* HAVE_AVAHI */
-+
- #ifdef HAVE_LIBSLP
- VAR SLPHandle BrowseSLPHandle VALUE(NULL);
- /* SLP API handle */
-@@ -198,9 +214,9 @@ extern void cupsdStartBrowsing(void);
- extern void cupsdStartPolling(void);
- extern void cupsdStopBrowsing(void);
- extern void cupsdStopPolling(void);
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- extern void cupsdUpdateDNSSDName(void);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- #ifdef HAVE_LDAP
- extern void cupsdUpdateLDAPBrowse(void);
- #endif /* HAVE_LDAP */
-diff -up cups-1.4.5/scheduler/main.c.avahi cups-1.4.5/scheduler/main.c
---- cups-1.4.5/scheduler/main.c.avahi 2010-12-24 13:11:33.633464718 +0000
-+++ cups-1.4.5/scheduler/main.c 2010-12-24 13:11:38.348340619 +0000
-@@ -161,6 +161,10 @@ main(int argc, /* I - Number of comm
- int launchd_idle_exit;
- /* Idle exit on select timeout? */
- #endif /* HAVE_LAUNCHD */
-+#ifdef HAVE_AVAHI
-+ cupsd_timeout_t *tmo; /* Next scheduled timed callback */
-+ long tmo_delay; /* Time before it must be called */
-+#endif /* HAVE_AVAHI */
-
-
- #ifdef HAVE_GETEUID
-@@ -561,6 +565,14 @@ main(int argc, /* I - Number of comm
-
- httpInitialize();
-
-+#ifdef HAVE_AVAHI
-+ /*
-+ * Initialize timed callback structures.
-+ */
-+
-+ cupsdInitTimeouts();
-+#endif /* HAVE_AVAHI */
-+
- cupsdStartServer();
-
- /*
-@@ -900,6 +912,16 @@ main(int argc, /* I - Number of comm
- }
- #endif /* __APPLE__ */
-
-+#ifdef HAVE_AVAHI
-+ /*
-+ * If a timed callback is due, run it.
-+ */
-+
-+ tmo = cupsdNextTimeout (&tmo_delay);
-+ if (tmo && tmo_delay == 0)
-+ cupsdRunTimeout (tmo);
-+#endif /* HAVE_AVAHI */
-+
- #ifndef __APPLE__
- /*
- * Update the network interfaces once a minute...
-@@ -1925,6 +1947,10 @@ select_timeout(int fds) /* I - Number
- cupsd_job_t *job; /* Job information */
- cupsd_subscription_t *sub; /* Subscription information */
- const char *why; /* Debugging aid */
-+#ifdef HAVE_AVAHI
-+ cupsd_timeout_t *tmo; /* Timed callback */
-+ long tmo_delay; /* Seconds before calling it */
-+#endif /* HAVE_AVAHI */
-
-
- /*
-@@ -1967,6 +1993,19 @@ select_timeout(int fds) /* I - Number
- }
- #endif /* __APPLE__ */
-
-+#ifdef HAVE_AVAHI
-+ /*
-+ * See if there are any scheduled timed callbacks to run.
-+ */
-+
-+ tmo = cupsdNextTimeout (&tmo_delay);
-+ if (tmo)
-+ {
-+ timeout = tmo_delay;
-+ why = "run a timed callback";
-+ }
-+#endif /* HAVE_AVAHI */
-+
- /*
- * Check whether we are accepting new connections...
- */
-diff -up cups-1.4.5/scheduler/Makefile.avahi cups-1.4.5/scheduler/Makefile
---- cups-1.4.5/scheduler/Makefile.avahi 2010-12-24 13:11:33.739461928 +0000
-+++ cups-1.4.5/scheduler/Makefile 2010-12-24 13:11:38.332341040 +0000
-@@ -17,6 +17,7 @@ include ../Makedefs
-
- CUPSDOBJS = \
- auth.o \
-+ avahi.o \
- banners.o \
- cert.o \
- classes.o \
-@@ -39,7 +40,8 @@ CUPSDOBJS = \
- server.o \
- statbuf.o \
- subscriptions.o \
-- sysman.o
-+ sysman.o \
-+ timeout.o
- LIBOBJS = \
- filter.o \
- mime.o \
-diff -up cups-1.4.5/scheduler/printers.c.avahi cups-1.4.5/scheduler/printers.c
---- cups-1.4.5/scheduler/printers.c.avahi 2010-12-24 13:11:33.784460744 +0000
-+++ cups-1.4.5/scheduler/printers.c 2010-12-24 13:11:38.356340409 +0000
-@@ -929,10 +929,10 @@ cupsdDeletePrinter(
- cupsdClearString(&p->alert);
- cupsdClearString(&p->alert_description);
-
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- cupsdClearString(&p->product);
- cupsdClearString(&p->pdl);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
-
- cupsArrayDelete(p->filetypes);
-
-@@ -1301,9 +1301,9 @@ cupsdLoadAllPrinters(void)
- {
- if (value)
- {
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- p->product = _cupsStrAlloc(value);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- }
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
-@@ -1717,10 +1717,10 @@ cupsdSaveAllPrinters(void)
-
- cupsFilePrintf(fp, "Type %d\n", printer->type);
-
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- if (printer->product)
- cupsFilePutConf(fp, "Product", printer->product);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
-
- for (ptr = (char *)cupsArrayFirst(printer->filters);
- ptr;
-@@ -3860,7 +3860,7 @@ add_printer_formats(cupsd_printer_t *p)
- attr->values[i].string.text = _cupsStrAlloc(mimetype);
- }
-
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- {
- char pdl[1024]; /* Buffer to build pdl list */
- mime_filter_t *filter; /* MIME filter looping var */
-@@ -3914,7 +3914,7 @@ add_printer_formats(cupsd_printer_t *p)
-
- cupsdSetString(&p->pdl, pdl);
- }
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- }
-
-
-@@ -4951,9 +4951,9 @@ load_ppd(cupsd_printer_t *p) /* I - Pri
- attr->values[i].string.text = _cupsStrAlloc("bcp");
- }
-
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- cupsdSetString(&p->product, ppd->product);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
-
- if (ppdFindAttr(ppd, "APRemoteQueueID", NULL))
- p->type |= CUPS_PRINTER_REMOTE;
-diff -up cups-1.4.5/scheduler/printers.h.avahi cups-1.4.5/scheduler/printers.h
---- cups-1.4.5/scheduler/printers.h.avahi 2010-03-30 23:07:33.000000000 +0100
-+++ cups-1.4.5/scheduler/printers.h 2010-12-24 13:11:38.357340382 +0000
-@@ -16,6 +16,9 @@
- #ifdef HAVE_DNSSD
- # include <dns_sd.h>
- #endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+# include "avahi.h"
-+#endif /* HAVE_AVAHI */
- #include <cups/pwg-private.h>
-
-
-@@ -99,17 +102,24 @@ typedef struct cupsd_printer_s
- char *recoverable; /* com.apple.print.recoverable-message */
- _pwg_t *pwg; /* PWG<->PPD mapping data */
-
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-+ char *reg_name; /* Name used for service registration */
-+ char *product, /* PPD Product string */
-+ *pdl; /* pdl value for TXT record */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- #ifdef HAVE_DNSSD
-- char *reg_name, /* Name used for service registration */
-- *product, /* PPD Product string */
-- *pdl, /* pdl value for TXT record */
-- *ipp_txt, /* IPP TXT record contents */
-+ char *ipp_txt, /* IPP TXT record contents */
- *printer_txt; /* LPD TXT record contents */
- int ipp_len, /* IPP TXT record length */
- printer_len; /* LPD TXT record length */
- DNSServiceRef ipp_ref, /* Reference for _ipp._tcp,_cups */
- printer_ref; /* Reference for _printer._tcp */
- #endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+ AvahiStringList *ipp_txt, /* IPP TXT record */
-+ *printer_txt; /* LPD TXT record */
-+ AvahiEntryGroup *avahi_group; /* Avahi entry group */
-+#endif /* HAVE_AVAHI */
- } cupsd_printer_t;
-
-
-diff -up cups-1.4.5/scheduler/timeout.c.avahi cups-1.4.5/scheduler/timeout.c
---- cups-1.4.5/scheduler/timeout.c.avahi 2010-12-24 13:11:38.358340356 +0000
-+++ cups-1.4.5/scheduler/timeout.c 2010-12-24 13:11:38.358340356 +0000
-@@ -0,0 +1,191 @@
-+/*
-+ * "$Id$"
-+ *
-+ * Timeout functions for the Common UNIX Printing System (CUPS).
-+ *
-+ * Copyright (C) 2010 Red Hat, Inc.
-+ * Authors:
-+ * Tim Waugh <twaugh@redhat.com>
-+ *
-+ * Distribution and use rights are outlined in the file "LICENSE.txt"
-+ * which should have been included with this file. If this file is
-+ * file is missing or damaged, see the license at "http://www.cups.org/".
-+ *
-+ * Contents:
-+ *
-+ * cupsdInitTimeouts() - Initialise timeout structure.
-+ * cupsdAddTimeout() - Add a timed callback.
-+ * cupsdNextTimeout() - Find the next enabled timed callback.
-+ * cupsdUpdateTimeout() - Adjust the time of a timed callback or disable it.
-+ * cupsdRemoveTimeout() - Discard a timed callback.
-+ * compare_timeouts() - Compare timed callbacks for array sorting.
-+ */
-+
-+#include <config.h>
-+
-+#ifdef HAVE_AVAHI /* Applies to entire file... */
-+
-+/*
-+ * Include necessary headers...
-+ */
-+
-+#include "cupsd.h"
-+
-+#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
-+# include <malloc.h>
-+#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */
-+
-+#ifdef HAVE_AVAHI
-+# include <avahi-common/timeval.h>
-+#endif /* HAVE_AVAHI */
-+
-+
-+struct _cupsd_timeout_s
-+{
-+ struct timeval when;
-+ int enabled;
-+ cupsd_timeoutfunc_t callback;
-+ void *data;
-+};
-+
-+/*
-+ * Local functions...
-+ */
-+
-+/*
-+ * 'compare_timeouts()' - Compare timed callbacks for array sorting.
-+ */
-+
-+static int
-+compare_timeouts (cupsd_timeout_t *p0, cupsd_timeout_t *p1)
-+{
-+ if (!p0->enabled || !p1->enabled)
-+ {
-+ if (!p0->enabled && !p1->enabled)
-+ return (0);
-+
-+ return (p0->enabled ? -1 : 1);
-+ }
-+
-+ return (avahi_timeval_compare (&p0->when, &p1->when));
-+}
-+
-+
-+/*
-+ * 'cupsdInitTimeouts()' - Initialise timeout structures.
-+ */
-+
-+void
-+cupsdInitTimeouts(void)
-+{
-+ Timeouts = cupsArrayNew ((cups_array_func_t)compare_timeouts, NULL);
-+}
-+
-+
-+/*
-+ * 'cupsdAddTimeout()' - Add a timed callback.
-+ */
-+
-+cupsd_timeout_t * /* O - Timeout handle */
-+cupsdAddTimeout(const struct timeval *tv, /* I - Absolute time */
-+ cupsd_timeoutfunc_t cb, /* I - Callback function */
-+ void *data) /* I - User data */
-+{
-+ cupsd_timeout_t *timeout;
-+
-+ timeout = malloc (sizeof(cupsd_timeout_t));
-+ if (timeout != NULL)
-+ {
-+ timeout->enabled = (tv != NULL);
-+ if (tv)
-+ {
-+ timeout->when.tv_sec = tv->tv_sec;
-+ timeout->when.tv_usec = tv->tv_usec;
-+ }
-+
-+ timeout->callback = cb;
-+ timeout->data = data;
-+ cupsArrayAdd (Timeouts, timeout);
-+ }
-+
-+ return timeout;
-+}
-+
-+
-+/*
-+ * 'cupsdNextTimeout()' - Find the next enabled timed callback.
-+ */
-+
-+cupsd_timeout_t * /* O - Next enabled timeout or NULL */
-+cupsdNextTimeout(long *delay) /* O - Seconds before scheduled */
-+{
-+ cupsd_timeout_t *first = cupsArrayFirst (Timeouts);
-+ struct timeval curtime;
-+
-+ if (first && !first->enabled)
-+ first = NULL;
-+
-+ if (first && delay)
-+ {
-+ gettimeofday (&curtime, NULL);
-+ if (avahi_timeval_compare (&curtime, &first->when) > 0)
-+ {
-+ *delay = 0;
-+ } else {
-+ *delay = 1 + first->when.tv_sec - curtime.tv_sec;
-+ if (first->when.tv_usec < curtime.tv_usec)
-+ (*delay)--;
-+ }
-+ }
-+
-+ return (first);
-+}
-+
-+
-+/*
-+ * 'cupsdRunTimeout()' - Run a timed callback.
-+ */
-+
-+void
-+cupsdRunTimeout(cupsd_timeout_t *timeout) /* I - Timeout */
-+{
-+ timeout->enabled = 0;
-+ timeout->callback (timeout, timeout->data);
-+}
-+
-+/*
-+ * 'cupsdUpdateTimeout()' - Adjust the time of a timed callback or disable it.
-+ */
-+
-+void
-+cupsdUpdateTimeout(cupsd_timeout_t *timeout, /* I - Timeout */
-+ const struct timeval *tv) /* I - Absolute time or NULL */
-+{
-+ cupsArrayRemove (Timeouts, timeout);
-+ timeout->enabled = (tv != NULL);
-+ if (tv)
-+ {
-+ timeout->when.tv_sec = tv->tv_sec;
-+ timeout->when.tv_usec = tv->tv_usec;
-+ }
-+ cupsArrayAdd (Timeouts, timeout);
-+}
-+
-+
-+/*
-+ * 'cupsdRemoveTimeout()' - Discard a timed callback.
-+ */
-+
-+void
-+cupsdRemoveTimeout(cupsd_timeout_t *timeout) /* I - Timeout */
-+{
-+ cupsArrayRemove (Timeouts, timeout);
-+ free (timeout);
-+}
-+
-+
-+#endif /* HAVE_AVAHI ... from top of file */
-+
-+/*
-+ * End of "$Id$".
-+ */
+++ /dev/null
---- cups-1.2rc2/scheduler/banners.c.banners 2006-04-19 16:12:07.000000000 +0100
-+++ cups-1.2rc2/scheduler/banners.c 2006-04-19 16:12:42.000000000 +0100
-@@ -119,6 +119,8 @@
- if ((ext = strrchr(dent->filename, '.')) != NULL)
- if (!strcmp(ext, ".bck") ||
- !strcmp(ext, ".bak") ||
-+ !strcmp(ext, ".rpmnew") ||
-+ !strcmp(ext, ".rpmsave") ||
- !strcmp(ext, ".sav"))
- continue;
-
+++ /dev/null
-diff -up cups-1.4rc1/Makedefs.in.build cups-1.4rc1/Makedefs.in
---- cups-1.4rc1/Makedefs.in.build 2009-05-27 00:27:06.000000000 +0100
-+++ cups-1.4rc1/Makedefs.in 2009-06-17 11:18:27.185443255 +0100
-@@ -124,7 +124,7 @@ ARFLAGS = @ARFLAGS@
- BACKLIBS = @BACKLIBS@
- BANNERTOPS = @BANNERTOPS@
- CFLAGS = @CPPFLAGS@ @CFLAGS@
--COMMONLIBS = @LIBS@
-+COMMONLIBS = @LIBS@ $(DNSSDLIBS)
- CUPSDLIBS = @CUPSDLIBS@
- CXXFLAGS = @CPPFLAGS@ @CXXFLAGS@
- CXXLIBS = @CXXLIBS@
-diff -up cups-1.4rc1/scheduler/dirsvc.c.build cups-1.4rc1/scheduler/dirsvc.c
---- cups-1.4rc1/scheduler/dirsvc.c.build 2009-05-14 18:54:37.000000000 +0100
-+++ cups-1.4rc1/scheduler/dirsvc.c 2009-06-17 11:23:23.366318546 +0100
-@@ -2042,7 +2042,7 @@ cupsdUpdateDNSSDName(void)
-
- WebIFRef = DNSSDRef;
- if ((error = DNSServiceRegister(&WebIFRef,
-- kDNSServiceFlagsShareConnection,
-+ 0,
- 0, webif, "_http._tcp", NULL,
- NULL, htons(DNSSDPort), 7,
- "\006path=/", dnssdRegisterCallback,
-@@ -2765,7 +2765,7 @@ dnssdRegisterPrinter(cupsd_printer_t *p)
- do
- {
- p->ipp_ref = DNSSDRef;
-- if ((se = DNSServiceRegister(&p->ipp_ref, kDNSServiceFlagsShareConnection,
-+ if ((se = DNSServiceRegister(&p->ipp_ref, 0,
- 0, name, regtype, NULL, NULL,
- htons(DNSSDPort), ipp_len, ipp_txt,
- dnssdRegisterCallback,
-@@ -2854,7 +2854,7 @@ dnssdRegisterPrinter(cupsd_printer_t *p)
-
- p->printer_ref = DNSSDRef;
- if ((se = DNSServiceRegister(&p->printer_ref,
-- kDNSServiceFlagsShareConnection,
-+ 0,
- 0, name, "_printer._tcp", NULL, NULL,
- htons(515), printer_len, printer_txt,
- dnssdRegisterCallback,
+++ /dev/null
-diff -up cups-1.4.3/backend/dnssd.c.dnssd-deviceid.patch cups-1.4.3/backend/dnssd.c
---- cups-1.4.3/backend/dnssd.c.dnssd-deviceid.patch 2010-04-16 19:36:12.226148774 +0100
-+++ cups-1.4.3/backend/dnssd.c 2010-04-16 19:39:53.314148240 +0100
-@@ -1192,15 +1192,22 @@ find_device (cups_array_t *devices,
- if (device->device_id)
- free(device->device_id);
-
-+ if (device_id[0])
-+ {
-+ /* Mark this as the real device ID. */
-+ ptr = device_id + strlen(device_id);
-+ snprintf(ptr, sizeof(device_id) - (ptr - device_id), "FZY:0;");
-+ }
-+
- if (!device_id[0] && strcmp(model, "Unknown"))
- {
- if (make_and_model[0])
-- snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;",
-+ snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;FZY:1;",
- make_and_model, model);
- else if (!strncasecmp(model, "designjet ", 10))
-- snprintf(device_id, sizeof(device_id), "MFG:HP;MDL:%s", model + 10);
-+ snprintf(device_id, sizeof(device_id), "MFG:HP;MDL:%s;FZY:1;", model + 10);
- else if (!strncasecmp(model, "stylus ", 7))
-- snprintf(device_id, sizeof(device_id), "MFG:EPSON;MDL:%s", model + 7);
-+ snprintf(device_id, sizeof(device_id), "MFG:EPSON;MDL:%s;FZY:1;", model + 7);
- else if ((ptr = strchr(model, ' ')) != NULL)
- {
- /*
-@@ -1210,7 +1217,7 @@ find_device (cups_array_t *devices,
- memcpy(make_and_model, model, ptr - model);
- make_and_model[ptr - model] = '\0';
-
-- snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s",
-+ snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;FZY:1;",
- make_and_model, ptr + 1);
- }
- }
+++ /dev/null
-diff -up cups-1.4.4/config-scripts/cups-ssl.m4.force-gnutls cups-1.4.4/config-scripts/cups-ssl.m4
---- cups-1.4.4/config-scripts/cups-ssl.m4.force-gnutls 2010-09-15 16:49:22.343502552 +0100
-+++ cups-1.4.4/config-scripts/cups-ssl.m4 2010-09-15 16:49:42.347502595 +0100
-@@ -65,23 +65,21 @@ if test x$enable_ssl != xno; then
- if $PKGCONFIG --exists gnutls; then
- if test "x$have_pthread" = xyes; then
- AC_MSG_WARN([The current version of GNU TLS cannot be made thread-safe.])
-- else
-- have_ssl=1
-- SSLLIBS=`$PKGCONFIG --libs gnutls`
-- SSLFLAGS=`$PKGCONFIG --cflags gnutls`
-- AC_DEFINE(HAVE_SSL)
-- AC_DEFINE(HAVE_GNUTLS)
- fi
-+ have_ssl=1
-+ SSLLIBS=`$PKGCONFIG --libs gnutls`
-+ SSLFLAGS=`$PKGCONFIG --cflags gnutls`
-+ AC_DEFINE(HAVE_SSL)
-+ AC_DEFINE(HAVE_GNUTLS)
- elif test "x$LIBGNUTLSCONFIG" != x; then
- if test "x$have_pthread" = xyes; then
- AC_MSG_WARN([The current version of GNU TLS cannot be made thread-safe.])
-- else
-- have_ssl=1
-- SSLLIBS=`$LIBGNUTLSCONFIG --libs`
-- SSLFLAGS=`$LIBGNUTLSCONFIG --cflags`
-- AC_DEFINE(HAVE_SSL)
-- AC_DEFINE(HAVE_GNUTLS)
- fi
-+ have_ssl=1
-+ SSLLIBS=`$LIBGNUTLSCONFIG --libs`
-+ SSLFLAGS=`$LIBGNUTLSCONFIG --cflags`
-+ AC_DEFINE(HAVE_SSL)
-+ AC_DEFINE(HAVE_GNUTLS)
- fi
-
- if test $have_ssl = 1; then
-diff -up cups-1.4.4/configure.force-gnutls cups-1.4.4/configure
---- cups-1.4.4/configure.force-gnutls 2010-06-17 19:25:47.000000000 +0100
-+++ cups-1.4.4/configure 2010-09-15 16:50:01.689503165 +0100
-@@ -17542,36 +17542,34 @@ fi
- if test "x$have_pthread" = xyes; then
- { echo "$as_me:$LINENO: WARNING: The current version of GNU TLS cannot be made thread-safe." >&5
- echo "$as_me: WARNING: The current version of GNU TLS cannot be made thread-safe." >&2;}
-- else
-- have_ssl=1
-- SSLLIBS=`$PKGCONFIG --libs gnutls`
-- SSLFLAGS=`$PKGCONFIG --cflags gnutls`
-- cat >>confdefs.h <<\_ACEOF
-+ fi
-+ have_ssl=1
-+ SSLLIBS=`$PKGCONFIG --libs gnutls`
-+ SSLFLAGS=`$PKGCONFIG --cflags gnutls`
-+ cat >>confdefs.h <<\_ACEOF
- #define HAVE_SSL 1
- _ACEOF
-
-- cat >>confdefs.h <<\_ACEOF
-+ cat >>confdefs.h <<\_ACEOF
- #define HAVE_GNUTLS 1
- _ACEOF
-
-- fi
- elif test "x$LIBGNUTLSCONFIG" != x; then
- if test "x$have_pthread" = xyes; then
- { echo "$as_me:$LINENO: WARNING: The current version of GNU TLS cannot be made thread-safe." >&5
- echo "$as_me: WARNING: The current version of GNU TLS cannot be made thread-safe." >&2;}
-- else
-- have_ssl=1
-- SSLLIBS=`$LIBGNUTLSCONFIG --libs`
-- SSLFLAGS=`$LIBGNUTLSCONFIG --cflags`
-- cat >>confdefs.h <<\_ACEOF
-+ fi
-+ have_ssl=1
-+ SSLLIBS=`$LIBGNUTLSCONFIG --libs`
-+ SSLFLAGS=`$LIBGNUTLSCONFIG --cflags`
-+ cat >>confdefs.h <<\_ACEOF
- #define HAVE_SSL 1
- _ACEOF
-
-- cat >>confdefs.h <<\_ACEOF
-+ cat >>confdefs.h <<\_ACEOF
- #define HAVE_GNUTLS 1
- _ACEOF
-
-- fi
- fi
-
- if test $have_ssl = 1; then
+++ /dev/null
-diff -up cups-1.4.4/cups/usersys.c.getpass cups-1.4.4/cups/usersys.c
---- cups-1.4.4/cups/usersys.c.getpass 2010-03-30 23:07:33.000000000 +0100
-+++ cups-1.4.4/cups/usersys.c 2010-06-18 09:38:08.368096897 +0100
-@@ -41,6 +41,8 @@
- #include "globals.h"
- #include <stdlib.h>
- #include <sys/stat.h>
-+#include <termios.h>
-+#include <signal.h>
- #ifdef WIN32
- # include <windows.h>
- #else
-@@ -406,7 +408,29 @@ _cupsGetPassword(const char *prompt) /*
- * Use the standard getpass function to get a password from the console.
- */
-
-- return (getpass(prompt));
-+ static char password[100];
-+ struct termios oldtio, newtio;
-+ sigset_t oldset, newset;
-+ int nread;
-+ sigprocmask (SIG_BLOCK, NULL, &newset);
-+ sigaddset (&newset, SIGINT);
-+ sigaddset (&newset, SIGTSTP);
-+ sigprocmask (SIG_BLOCK, &newset, &oldset);
-+ tcgetattr (STDIN_FILENO, &oldtio);
-+ newtio = oldtio;
-+ newtio.c_lflag &= ~ECHO;
-+ tcsetattr (STDIN_FILENO, TCSAFLUSH, &newtio);
-+ fputs (prompt, stdout);
-+ fflush (stdout);
-+ nread = read (STDIN_FILENO, password, sizeof (password));
-+ tcsetattr (STDIN_FILENO, TCSAFLUSH, &oldtio);
-+ fputc ('\n', stdout);
-+ sigprocmask (SIG_SETMASK, &oldset, NULL);
-+ if (nread > 0)
-+ password[nread - 1] = '\0';
-+ else
-+ password[0] ='\0';
-+ return password;
- #endif /* WIN32 */
- }
-
+++ /dev/null
-diff -up cups-1.4.4/scheduler/network.c.hostnamelookups cups-1.4.4/scheduler/network.c
---- cups-1.4.4/scheduler/network.c.hostnamelookups 2010-04-09 23:42:09.000000000 +0100
-+++ cups-1.4.4/scheduler/network.c 2010-06-18 11:13:02.331979867 +0100
-@@ -154,11 +154,7 @@ cupsdNetIFUpdate(void)
- * Try looking up the hostname for the address as needed...
- */
-
--#ifdef __APPLE__
- if (HostNameLookups)
--#else
-- if (HostNameLookups || RemotePort)
--#endif /* __APPLE__ */
- httpAddrLookup((http_addr_t *)(addr->ifa_addr), hostname,
- sizeof(hostname));
- else
-@@ -166,7 +162,7 @@ cupsdNetIFUpdate(void)
- /*
- * Map the default server address and localhost to the server name
- * and localhost, respectively; for all other addresses, use the
-- * dotted notation...
-+ * numeric address...
- */
-
- if (httpAddrLocalhost((http_addr_t *)(addr->ifa_addr)))
+++ /dev/null
-diff -up cups-1.4b2-svn8404/config-scripts/cups-ssl.m4.no-export-ssllibs cups-1.4b2-svn8404/config-scripts/cups-ssl.m4
---- cups-1.4b2-svn8404/config-scripts/cups-ssl.m4.no-export-ssllibs 2009-02-17 17:45:27.000000000 +0000
-+++ cups-1.4b2-svn8404/config-scripts/cups-ssl.m4 2009-03-05 11:12:59.000000000 +0000
-@@ -110,7 +110,7 @@ fi
- AC_SUBST(SSLFLAGS)
- AC_SUBST(SSLLIBS)
-
--EXPORT_SSLLIBS="$SSLLIBS"
-+EXPORT_SSLLIBS=""
- AC_SUBST(EXPORT_SSLLIBS)
-
-
+++ /dev/null
-diff -up cups-1.4b2-svn8404/config-scripts/cups-manpages.m4.no-gzip-man cups-1.4b2-svn8404/config-scripts/cups-manpages.m4
---- cups-1.4b2-svn8404/config-scripts/cups-manpages.m4.no-gzip-man 2009-01-16 08:58:42.000000000 +0000
-+++ cups-1.4b2-svn8404/config-scripts/cups-manpages.m4 2009-03-05 11:11:12.000000000 +0000
-@@ -69,10 +69,10 @@ case "$uname" in
- ;;
- Linux* | GNU* | Darwin*)
- # Linux, GNU Hurd, and Mac OS X
-- MAN1EXT=1.gz
-- MAN5EXT=5.gz
-- MAN7EXT=7.gz
-- MAN8EXT=8.gz
-+ MAN1EXT=1
-+ MAN5EXT=5
-+ MAN7EXT=7
-+ MAN8EXT=8
- MAN8DIR=8
- ;;
- *)
+++ /dev/null
-diff -up cups-1.4.5/filter/pstops.c.page-label cups-1.4.5/filter/pstops.c
---- cups-1.4.5/filter/pstops.c.page-label 2010-08-31 20:36:08.000000000 +0200
-+++ cups-1.4.5/filter/pstops.c 2010-11-12 13:11:11.000000000 +0100
-@@ -108,6 +108,7 @@ typedef struct /**** Document informa
- int num_options; /* Number of document-wide options */
- cups_option_t *options; /* Document-wide options */
- int normal_landscape, /* Normal rotation for landscape? */
-+ orientation, /* Original orientation of the document */
- saw_eof, /* Saw the %%EOF comment? */
- slow_collate, /* Collate copies by hand? */
- slow_duplex, /* Duplex pages slowly? */
-@@ -2083,7 +2084,7 @@ do_setup(pstops_doc_t *doc, /* I - Docu
- * of the pages...
- */
-
-- if (Orientation & 1)
-+ if (doc->orientation & 1)
- write_label_prolog(doc, doc->page_label, PageBottom,
- PageWidth - PageLength + PageTop, PageLength);
- else
-@@ -2091,7 +2092,30 @@ do_setup(pstops_doc_t *doc, /* I - Docu
- PageLength);
- }
- else
-- write_label_prolog(doc, doc->page_label, PageBottom, PageTop, PageWidth);
-+ {
-+ switch (doc->orientation)
-+ {
-+ case 0 :
-+ write_label_prolog(doc, doc->page_label, PageBottom, PageTop,
-+ PageWidth);
-+ break;
-+
-+ case 1 :
-+ write_label_prolog(doc, doc->page_label, PageLeft, PageRight,
-+ PageLength);
-+ break;
-+
-+ case 2 :
-+ write_label_prolog(doc, doc->page_label, PageLength - PageTop,
-+ PageLength - PageBottom, PageWidth);
-+ break;
-+
-+ case 3 :
-+ write_label_prolog(doc, doc->page_label, PageWidth - PageRight,
-+ PageWidth - PageLeft, PageLength);
-+ break;
-+ }
-+ }
- }
-
-
-@@ -2176,7 +2200,7 @@ end_nup(pstops_doc_t *doc, /* I - Docum
- case 1 :
- if (doc->use_ESPshowpage)
- {
-- write_labels(doc, Orientation);
-+ write_labels(doc, doc->orientation);
- doc_puts(doc, "ESPshowpage\n");
- }
- break;
-@@ -2191,7 +2215,7 @@ end_nup(pstops_doc_t *doc, /* I - Docum
- * Rotate the labels back to portrait...
- */
-
-- write_labels(doc, Orientation - 1);
-+ write_labels(doc, doc->orientation - 1);
- }
- else if (Orientation == 0)
- {
-@@ -2217,7 +2241,7 @@ end_nup(pstops_doc_t *doc, /* I - Docum
- default :
- if (is_last_page(number) && doc->use_ESPshowpage)
- {
-- write_labels(doc, Orientation);
-+ write_labels(doc, doc->orientation);
- doc_puts(doc, "ESPshowpage\n");
- }
- break;
-@@ -2433,6 +2457,12 @@ set_pstops_options(
- Orientation = 0;
-
- /*
-+ * Save original orientation of the document
-+ */
-+
-+ doc->orientation = Orientation;
-+
-+ /*
- * AP_FIRSTPAGE_* and the corresponding non-first-page options.
- */
-
+++ /dev/null
-diff -up cups-1.3.5/scheduler/auth.c.peercred cups-1.3.5/scheduler/auth.c
---- cups-1.3.5/scheduler/auth.c.peercred 2008-02-05 16:52:20.000000000 +0000
-+++ cups-1.3.5/scheduler/auth.c 2008-02-05 18:20:06.000000000 +0000
-@@ -54,6 +54,7 @@
- * Include necessary headers...
- */
-
-+#define _GNU_SOURCE
- #include "cupsd.h"
- #include <grp.h>
- #ifdef HAVE_SHADOW_H
+++ /dev/null
-diff -up cups-1.4b2-svn8404/cups/http-addrlist.c.res_init cups-1.4b2-svn8404/cups/http-addrlist.c
---- cups-1.4b2-svn8404/cups/http-addrlist.c.res_init 2009-03-23 17:41:03.000000000 +0000
-+++ cups-1.4b2-svn8404/cups/http-addrlist.c 2009-03-23 17:41:26.000000000 +0000
-@@ -373,7 +373,7 @@ httpAddrGetList(const char *hostname, /*
-
- freeaddrinfo(results);
- }
-- else if (error == EAI_FAIL)
-+ else if (error == EAI_FAIL || error == EAI_AGAIN || error == EAI_NODATA)
- cg->need_res_init = 1;
-
- #else
+++ /dev/null
-diff -up cups-1.4b2/backend/serial.c.serial cups-1.4b2/backend/serial.c
---- cups-1.4b2/backend/serial.c.serial 2008-12-16 16:25:02.000000000 +0000
-+++ cups-1.4b2/backend/serial.c 2008-12-16 16:25:21.000000000 +0000
-@@ -74,6 +74,7 @@
- #endif /* __APPLE__ */
-
- #if defined(__linux) && defined(TIOCGSERIAL)
-+# include <linux/types.h>
- # include <linux/serial.h>
- # include <linux/ioctl.h>
- #endif /* __linux && TIOCGSERIAL */
+++ /dev/null
-diff -up cups-1.4.4/cups/http.c.serialize-gnutls cups-1.4.4/cups/http.c
---- cups-1.4.4/cups/http.c.serialize-gnutls 2010-09-17 13:37:01.858871762 +0100
-+++ cups-1.4.4/cups/http.c 2010-09-17 13:55:22.579871934 +0100
-@@ -149,7 +149,7 @@ static int http_write_ssl(http_t *http,
-
- # ifdef HAVE_GNUTLS
- # ifdef HAVE_PTHREAD_H
--GCRY_THREAD_OPTION_PTHREAD_IMPL;
-+static pthread_mutex_t gnutls_lock;
- # endif /* HAVE_PTHREAD_H */
-
- # elif defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H)
-@@ -1231,7 +1231,7 @@ httpInitialize(void)
- */
-
- # ifdef HAVE_PTHREAD_H
-- gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
-+ pthread_mutex_init(&gnutls_lock, NULL);
- # endif /* HAVE_PTHREAD_H */
-
- /*
-@@ -2228,6 +2228,7 @@ _httpWait(http_t *http, /* I - Connect
- if (SSL_pending((SSL *)(http->tls)))
- return (1);
- # elif defined(HAVE_GNUTLS)
-+ /* lock already held here... */
- if (gnutls_record_check_pending(((http_tls_t *)(http->tls))->session))
- return (1);
- # elif defined(HAVE_CDSASSL)
-@@ -2294,6 +2295,8 @@ int /* O - 1 if data is available, 0
- httpWait(http_t *http, /* I - Connection to server */
- int msec) /* I - Milliseconds to wait */
- {
-+ int ret;
-+
- /*
- * First see if there is data in the buffer...
- */
-@@ -2318,7 +2321,17 @@ httpWait(http_t *http, /* I - Connecti
- * If not, check the SSL/TLS buffers and do a select() on the connection...
- */
-
-- return (_httpWait(http, msec, 1));
-+#if defined(HAVE_SSL) && defined(HAVE_GNUTLS) && defined(HAVE_PTHREAD_H)
-+ pthread_mutex_lock(&gnutls_lock);
-+#endif
-+
-+ ret = _httpWait(http, msec, 1);
-+
-+#if defined(HAVE_SSL) && defined(HAVE_GNUTLS) && defined(HAVE_PTHREAD_H)
-+ pthread_mutex_unlock(&gnutls_lock);
-+#endif
-+
-+ return (ret);
- }
-
-
-@@ -2769,7 +2782,9 @@ http_read_ssl(http_t *http, /* I - Conn
- ssize_t result; /* Return value */
-
-
-+ pthread_mutex_lock(&gnutls_lock);
- result = gnutls_record_recv(((http_tls_t *)(http->tls))->session, buf, len);
-+ pthread_mutex_unlock(&gnutls_lock);
-
- if (result < 0 && !errno)
- {
-@@ -3085,6 +3100,7 @@ http_setup_ssl(http_t *http) /* I - Con
- return (-1);
- }
-
-+ pthread_mutex_lock(&gnutls_lock);
- gnutls_certificate_allocate_credentials(credentials);
-
- gnutls_init(&(conn->session), GNUTLS_CLIENT);
-@@ -3104,9 +3120,11 @@ http_setup_ssl(http_t *http) /* I - Con
- free(credentials);
- free(conn);
-
-+ pthread_mutex_unlock(&gnutls_lock);
- return (-1);
- }
-
-+ pthread_mutex_unlock(&gnutls_lock);
- conn->credentials = credentials;
-
- # elif defined(HAVE_CDSASSL)
-@@ -3196,9 +3214,11 @@ http_shutdown_ssl(http_t *http) /* I -
- conn = (http_tls_t *)(http->tls);
- credentials = (gnutls_certificate_client_credentials *)(conn->credentials);
-
-+ pthread_mutex_lock(&gnutls_lock);
- gnutls_bye(conn->session, GNUTLS_SHUT_RDWR);
- gnutls_deinit(conn->session);
- gnutls_certificate_free_credentials(*credentials);
-+ pthread_mutex_unlock(&gnutls_lock);
- free(credentials);
- free(conn);
-
-@@ -3445,7 +3465,9 @@ http_write_ssl(http_t *http, /* I -
- # elif defined(HAVE_GNUTLS)
- ssize_t result; /* Return value */
-
-+ pthread_mutex_lock(&gnutls_lock);
- result = gnutls_record_send(((http_tls_t *)(http->tls))->session, buf, len);
-+ pthread_mutex_unlock(&gnutls_lock);
-
- if (result < 0 && !errno)
- {
+++ /dev/null
-diff -up cups-1.4.3/backend/snmp-supplies.c.snmp-quirks cups-1.4.3/backend/snmp-supplies.c
---- cups-1.4.3/backend/snmp-supplies.c.snmp-quirks 2009-11-20 01:27:57.000000000 +0000
-+++ cups-1.4.3/backend/snmp-supplies.c 2010-06-09 16:27:05.515019804 +0100
-@@ -38,6 +38,13 @@
-
-
- /*
-+ * Printer quirks...
-+ */
-+
-+#define QUIRK_CAPACITY (1<<0)
-+
-+
-+/*
- * Local structures...
- */
-
-@@ -57,6 +64,12 @@ typedef struct /**** Printer state ta
- const char *keyword; /* IPP printer-state-reasons keyword */
- } backend_state_t;
-
-+typedef struct /**** Quirk names table ****/
-+{
-+ int bit; /* Quirk bit */
-+ const char *keyword; /* cupsSNMPQuirks keyword */
-+} quirk_name_t;
-+
-
- /*
- * Local globals...
-@@ -68,6 +81,7 @@ static int current_state = -1;
- static int charset = -1; /* Character set for supply names */
- static int num_supplies = 0;
- /* Number of supplies found */
-+static int quirks = 0; /* Printer quirks */
- static backend_supplies_t supplies[CUPS_MAX_SUPPLIES];
- /* Supply information */
-
-@@ -153,6 +167,15 @@ static const backend_state_t const print
- { CUPS_TC_outputFull, "output-area-full-warning" }
- };
-
-+static const quirk_name_t const quirk_names[] =
-+ {
-+ /*
-+ * The prtMarkerSuppliesLevel values are
-+ * percentages, not levels relative to the
-+ * stated capacity.
-+ */
-+ { QUIRK_CAPACITY, "capacity" }
-+ };
-
- /*
- * Local functions...
-@@ -208,6 +231,9 @@ backendSNMPSupplies(
- if (i)
- *ptr++ = ',';
-
-+ if (quirks & QUIRK_CAPACITY)
-+ supplies[i].max_capacity = 100;
-+
- if (supplies[i].max_capacity > 0)
- sprintf(ptr, "%d", 100 * supplies[i].level / supplies[i].max_capacity);
- else
-@@ -305,6 +331,7 @@ backend_init_supplies(
- http_addr_t *addr) /* I - Printer address */
- {
- int i, /* Looping var */
-+ len, /* Quirk name length */
- type; /* Current marker type */
- cups_file_t *cachefile; /* Cache file */
- const char *cachedir; /* CUPS_CACHEDIR value */
-@@ -366,6 +393,7 @@ backend_init_supplies(
- current_state = -1;
- num_supplies = -1;
- charset = -1;
-+ quirks = 0;
-
- memset(supplies, 0, sizeof(supplies));
-
-@@ -381,6 +409,34 @@ backend_init_supplies(
- return;
- }
-
-+ if (ppd &&
-+ (ppdattr = ppdFindAttr(ppd, "cupsSNMPQuirks", NULL)) != NULL &&
-+ ppdattr->value)
-+ {
-+ ptr = ppdattr->value;
-+ while (*ptr != '\0')
-+ {
-+ /*
-+ * Match keyword against quirk_names table.
-+ */
-+
-+ for (i = 0; i < sizeof (quirk_names) / sizeof (quirk_names[0]); i++)
-+ {
-+ len = strlen (quirk_names[i].keyword);
-+ if (!strncmp (ptr, quirk_names[i].keyword, len) &&
-+ (ptr[len] == '\0' || ptr[len] == ' '))
-+ quirks |= quirk_names[i].bit;
-+ }
-+
-+ /*
-+ * Advance to next keyword.
-+ */
-+
-+ ptr += strcspn (ptr, " ");
-+ ptr += strspn (ptr, " ");
-+ }
-+ }
-+
- ppdClose(ppd);
-
- /*
+++ /dev/null
-diff -up cups-1.4.5/scheduler/printers.c.printer-timeout cups-1.4.5/scheduler/printers.c
---- cups-1.4.5/scheduler/printers.c.printer-timeout 2010-12-16 14:42:07.048865052 +0000
-+++ cups-1.4.5/scheduler/printers.c 2010-12-16 14:43:05.325684376 +0000
-@@ -785,6 +785,7 @@ cupsdDeletePrinter(
- */
-
- cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, update);
-+ p->state = IPP_PRINTER_STOPPED;
-
- if (p->job)
- cupsdSetJobState(p->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE,
+++ /dev/null
-diff -up cups-1.4.3/filter/texttops.c.texttops-rotate-page cups-1.4.3/filter/texttops.c
---- cups-1.4.3/filter/texttops.c.texttops-rotate-page 2008-11-06 16:42:18.000000000 +0000
-+++ cups-1.4.3/filter/texttops.c 2010-05-18 16:42:23.669940884 +0100
-@@ -97,6 +97,13 @@ WritePage(void)
-
- puts("gsave");
-
-+ /* If we're opereating in Landscape (Orientation == 1 or Orientation == 3)
-+ then rotate and translate the page */
-+ if ( Orientation & 1 ) {
-+ printf ("%d rotate\n", (Orientation & 3) * 90 );
-+ printf("0 %.0f neg translate\n", PageLength);
-+ }
-+
- if (PrettyPrint)
- printf("%d H\n", NumPages);
-
-@@ -212,7 +219,7 @@ WriteProlog(const char *title, /* I - T
-
- puts("%!PS-Adobe-3.0");
- printf("%%%%BoundingBox: 0 0 %.0f %.0f\n", PageWidth, PageLength);
-- printf("%%cupsRotation: %d\n", (Orientation & 3) * 90);
-+ puts("%cupsRotation: 0");
- puts("%%Creator: texttops/" CUPS_SVERSION);
- printf("%%%%CreationDate: %s\n", curdate);
- WriteTextComment("Title", title);
-@@ -549,6 +556,8 @@ WriteProlog(const char *title, /* I - T
- puts("%%EndComments");
-
- puts("%%BeginProlog");
-+ printf("%%%%Orientation: %s\n",
-+ Orientation & 1 ? "Landscape" : "Portrait");
-
- /*
- * Download any missing fonts...
[Unit]
-Description=CUPS Printing Service
+Description=CUPS scheduler
+Requires=printer.target
+After=syslog.target
[Service]
-ExecStart=/usr/sbin/cupsd -f -c /etc/cups/cupsd.conf
-ExecStartPost=/sbin/udevadm trigger --subsystem-match=usb --attr-match=serial=AL01077498
+Type=forking
+PIDFile=/var/run/cupsd.pid
+ExecStartPre=/usr/sbin/cupsd -t
+ExecStart=/usr/sbin/cupsd
+ExecStartPost=/sbin/udevadm trigger --subsystem-match=usb --attr-match=bInterfaceClass=07 --attr-match=bInterfaceSubClass=01 --action=add
+ExecStartPost=/sbin/udevadm trigger --subsystem-match=usb --property-match=DEVNAME="/dev/usb/lp*" --action=add
[Install]
WantedBy=multi-user.target
-