diff -ruN cups-1.7.2.orig/Makedefs.in cups-1.7.2/Makedefs.in --- cups-1.7.2.orig/Makedefs.in 2013-07-17 17:21:18.000000000 +0200 +++ cups-1.7.2/Makedefs.in 2014-04-15 13:24:45.594054459 +0200 @@ -134,6 +134,7 @@ 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) @@ -141,6 +142,7 @@ IPPFIND_BIN = @IPPFIND_BIN@ IPPFIND_MAN = @IPPFIND_MAN@ LAUNCHDLIBS = @LAUNCHDLIBS@ +SDLIBS = @SDLIBS@ LDFLAGS = -L../cgi-bin -L../cups -L../filter -L../ppdc \ -L../scheduler @LDARCHFLAGS@ \ @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM) @@ -232,6 +234,7 @@ DEFAULT_LAUNCHD_CONF = @DEFAULT_LAUNCHD_CONF@ DBUSDIR = @DBUSDIR@ +SYSTEMDUNITDIR = $(BUILDROOT)@systemdsystemunitdir@ # diff -ruN cups-1.7.2.orig/config-scripts/cups-systemd.m4 cups-1.7.2/config-scripts/cups-systemd.m4 --- cups-1.7.2.orig/config-scripts/cups-systemd.m4 1970-01-01 01:00:00.000000000 +0100 +++ cups-1.7.2/config-scripts/cups-systemd.m4 2014-04-15 13:24:45.592054459 +0200 @@ -0,0 +1,36 @@ +dnl +dnl "$Id: cups-1.7.2-systemd-socket-2.patch,v 1.1 2014/04/15 11:34:10 dilfridge Exp $" +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) + AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir]) + if $PKGCONFIG --exists libsystemd-daemon; then + AC_MSG_RESULT(yes) + SDCFLAGS=`$PKGCONFIG --cflags libsystemd-daemon` + SDLIBS=`$PKGCONFIG --libs libsystemd-daemon` + 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: cups-1.7.2-systemd-socket-2.patch,v 1.1 2014/04/15 11:34:10 dilfridge Exp $" +dnl diff -ruN cups-1.7.2.orig/config.h.in cups-1.7.2/config.h.in --- cups-1.7.2.orig/config.h.in 2014-02-27 16:57:59.000000000 +0100 +++ cups-1.7.2/config.h.in 2014-04-15 13:24:45.592054459 +0200 @@ -451,6 +451,13 @@ /* + * Do we have systemd support? + */ + +#undef HAVE_SYSTEMD + + +/* * Various scripting languages... */ diff -ruN cups-1.7.2.orig/configure.in cups-1.7.2/configure.in --- cups-1.7.2.orig/configure.in 2013-07-08 23:15:13.000000000 +0200 +++ cups-1.7.2/configure.in 2014-04-15 13:24:45.593054459 +0200 @@ -33,6 +33,7 @@ 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) @@ -67,6 +68,9 @@ conf/snmp.conf cups-config data/testprint + data/cups.service + data/cups.socket + data/cups.path desktop/cups.desktop doc/help/ref-cups-files-conf.html doc/help/ref-cupsd-conf.html diff -ruN cups-1.7.2.orig/cups/usersys.c cups-1.7.2/cups/usersys.c --- cups-1.7.2.orig/cups/usersys.c 2014-03-05 22:22:12.000000000 +0100 +++ cups-1.7.2/cups/usersys.c 2014-04-15 13:24:45.593054459 +0200 @@ -1050,7 +1050,7 @@ 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 -ruN cups-1.7.2.orig/data/Makefile cups-1.7.2/data/Makefile --- cups-1.7.2.orig/data/Makefile 2013-05-29 13:51:34.000000000 +0200 +++ cups-1.7.2/data/Makefile 2014-04-15 13:24:45.594054459 +0200 @@ -100,6 +100,12 @@ $(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 @@ -$(RMDIR) $(DATADIR)/data -$(RMDIR) $(DATADIR)/banners -$(RMDIR) $(DATADIR) + for file in $(SYSTEMD_UNITS); do \ + $(RM) $(SYSTEMDUNITDIR)/$$file; \ + done # diff -ruN cups-1.7.2.orig/data/cups.path.in cups-1.7.2/data/cups.path.in --- cups-1.7.2.orig/data/cups.path.in 1970-01-01 01:00:00.000000000 +0100 +++ cups-1.7.2/data/cups.path.in 2014-04-15 13:24:45.593054459 +0200 @@ -0,0 +1,8 @@ +[Unit] +Description=CUPS Printer Service Spool + +[Path] +PathExistsGlob=@CUPS_REQUESTS@/d* + +[Install] +WantedBy=multi-user.target diff -ruN cups-1.7.2.orig/data/cups.service.in cups-1.7.2/data/cups.service.in --- cups-1.7.2.orig/data/cups.service.in 1970-01-01 01:00:00.000000000 +0100 +++ cups-1.7.2/data/cups.service.in 2014-04-15 13:24:45.594054459 +0200 @@ -0,0 +1,9 @@ +[Unit] +Description=CUPS Printing Service + +[Service] +ExecStart=@sbindir@/cupsd -f + +[Install] +Also=cups.socket cups.path +WantedBy=printer.target diff -ruN cups-1.7.2.orig/data/cups.socket.in cups-1.7.2/data/cups.socket.in --- cups-1.7.2.orig/data/cups.socket.in 1970-01-01 01:00:00.000000000 +0100 +++ cups-1.7.2/data/cups.socket.in 2014-04-15 13:24:45.594054459 +0200 @@ -0,0 +1,10 @@ +[Unit] +Description=CUPS Printing Service Sockets + +[Socket] +ListenStream=@CUPS_DEFAULT_DOMAINSOCKET@ +ListenStream=631 +BindIPv6Only=ipv6-only + +[Install] +WantedBy=sockets.target diff -ruN cups-1.7.2.orig/scheduler/Makefile cups-1.7.2/scheduler/Makefile --- cups-1.7.2.orig/scheduler/Makefile 2013-05-29 13:51:34.000000000 +0200 +++ cups-1.7.2/scheduler/Makefile 2014-04-15 13:24:45.595054459 +0200 @@ -381,7 +381,7 @@ $(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 $@... @@ -389,7 +389,7 @@ $(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 -ruN cups-1.7.2.orig/scheduler/client.h cups-1.7.2/scheduler/client.h --- cups-1.7.2.orig/scheduler/client.h 2013-08-02 00:23:18.000000000 +0200 +++ cups-1.7.2/scheduler/client.h 2014-04-15 13:24:45.594054459 +0200 @@ -79,6 +79,9 @@ 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 -ruN cups-1.7.2.orig/scheduler/listen.c cups-1.7.2/scheduler/listen.c --- cups-1.7.2.orig/scheduler/listen.c 2013-05-29 13:51:34.000000000 +0200 +++ cups-1.7.2/scheduler/listen.c 2014-04-15 13:24:45.594054459 +0200 @@ -401,7 +401,11 @@ 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 -ruN cups-1.7.2.orig/scheduler/main.c cups-1.7.2/scheduler/main.c --- cups-1.7.2.orig/scheduler/main.c 2014-03-21 19:18:56.000000000 +0100 +++ cups-1.7.2/scheduler/main.c 2014-04-15 13:24:45.595054459 +0200 @@ -39,6 +39,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 */ @@ -64,6 +68,9 @@ static void launchd_checkin(void); static void launchd_checkout(void); #endif /* HAVE_LAUNCHD */ +#ifdef HAVE_SYSTEMD +static int systemd_checkin(void); +#endif /* HAVE_SYSTEMD */ static void parent_handler(int sig); static void process_children(void); static void sigchld_handler(int sig); @@ -553,6 +560,14 @@ } #endif /* HAVE_LAUNCHD */ +#ifdef HAVE_SYSTEMD + /* + * If we were started by systemd get the listen sockets file descriptors... + */ + if (systemd_checkin() < 0) + exit(EXIT_FAILURE); +#endif /* HAVE_SYSTEMD */ + /* * Startup the server... */ @@ -741,6 +756,16 @@ } #endif /* HAVE_LAUNCHD */ +#ifdef HAVE_SYSTEMD + /* + * If we were started by systemd get the listen sockets file + * descriptors... + */ + + if (systemd_checkin() < 0) + exit(EXIT_FAILURE); +#endif /* HAVE_SYSTEMD */ + /* * Startup the server... */ @@ -1490,6 +1515,102 @@ } #endif /* HAVE_LAUNCHD */ +#ifdef HAVE_SYSTEMD +static int +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 -- skipping systemd activation", + strerror(-n)); + return (1); + } + + if (n == 0) + return (0); + + 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)); + return (-ENOMEM); + } + + 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 */ + } + + return (0); +} +#endif /* HAVE_SYSTEMD */ /* * 'parent_handler()' - Catch USR1/CHLD signals...