From 124b71a11d5478228b9001a22873bdfd18d952aa Mon Sep 17 00:00:00 2001
From: Britney Fransen <brfransen@gmail.com>
Date: Wed, 26 Mar 2014 15:01:49 +0000
Subject: cups: update to 1.7.1

---
 abs/extra/cups/PKGBUILD                            |  161 ++-
 abs/extra/cups/PKGBUILD.16                         |  146 ---
 abs/extra/cups/cups                                |   68 --
 abs/extra/cups/cups-1.6.0-fix-install-perms.patch  |   25 +
 abs/extra/cups/cups-1.6.2-statedir.patch           |   12 +
 abs/extra/cups/cups-avahi-1-config.patch           |   42 -
 abs/extra/cups/cups-avahi-2-backend.patch          | 1118 -----------------
 abs/extra/cups/cups-avahi-3-timeouts.patch         |  381 ------
 abs/extra/cups/cups-avahi-4-poll.patch             |  529 --------
 abs/extra/cups/cups-avahi-5-services.patch         | 1272 --------------------
 abs/extra/cups/cups-avahi-address.patch            |   75 ++
 abs/extra/cups/cups-enum-all.patch                 |   17 +
 abs/extra/cups/cups-final-content-type.patch       |   18 +
 abs/extra/cups/cups-no-export-ssllibs.patch        |    8 +-
 abs/extra/cups/cups-no-gcrypt.patch                |    8 +-
 abs/extra/cups/cups-no-gzip-man.patch              |    2 +-
 abs/extra/cups/cups-no-gzip-man.patch.16           |   18 -
 abs/extra/cups/cups-res_init.patch                 |   26 +
 abs/extra/cups/cups-systemd-socket.patch           |  262 ++--
 abs/extra/cups/cups.install                        |   21 +-
 abs/extra/cups/cups.logrotate                      |    8 -
 ...-no-crash-on-avahi-threaded-poll-shutdown.patch |   19 +
 ...r-statically-configured-ipp-shared-queues.patch |   31 +
 abs/extra/cups/ppd-poll-with-client-conf.patch     |   23 +
 24 files changed, 436 insertions(+), 3854 deletions(-)
 delete mode 100644 abs/extra/cups/PKGBUILD.16
 delete mode 100755 abs/extra/cups/cups
 create mode 100644 abs/extra/cups/cups-1.6.0-fix-install-perms.patch
 create mode 100644 abs/extra/cups/cups-1.6.2-statedir.patch
 delete mode 100644 abs/extra/cups/cups-avahi-1-config.patch
 delete mode 100644 abs/extra/cups/cups-avahi-2-backend.patch
 delete mode 100644 abs/extra/cups/cups-avahi-3-timeouts.patch
 delete mode 100644 abs/extra/cups/cups-avahi-4-poll.patch
 delete mode 100644 abs/extra/cups/cups-avahi-5-services.patch
 create mode 100644 abs/extra/cups/cups-avahi-address.patch
 create mode 100644 abs/extra/cups/cups-enum-all.patch
 create mode 100644 abs/extra/cups/cups-final-content-type.patch
 delete mode 100644 abs/extra/cups/cups-no-gzip-man.patch.16
 create mode 100644 abs/extra/cups/cups-res_init.patch
 delete mode 100644 abs/extra/cups/cups.logrotate
 create mode 100644 abs/extra/cups/cupsd-no-crash-on-avahi-threaded-poll-shutdown.patch
 create mode 100644 abs/extra/cups/get-ppd-file-for-statically-configured-ipp-shared-queues.patch
 create mode 100644 abs/extra/cups/ppd-poll-with-client-conf.patch

diff --git a/abs/extra/cups/PKGBUILD b/abs/extra/cups/PKGBUILD
index 9a55d2f..63bb641 100644
--- a/abs/extra/cups/PKGBUILD
+++ b/abs/extra/cups/PKGBUILD
@@ -1,66 +1,104 @@
-# $Id: PKGBUILD 161774 2012-06-13 17:38:37Z andyrtr $
+# $Id$
 # Maintainer: Andreas Radke <andyrtr@archlinux.org>
 
 pkgbase="cups"
 pkgname=('libcups' 'cups')
-pkgver=1.5.3
-pkgrel=5
+pkgver=1.7.1
+pkgrel=4
 arch=('i686' 'x86_64')
 license=('GPL')
 url="http://www.cups.org/"
-makedepends=('libtiff>=4.0.0' 'libpng>=1.5.7' 'acl' 'openslp' 'pam' 'xdg-utils' 'krb5' 'gnutls>=2.8.3' 'cups-filters' 'bc'
-             'xinetd' 'gzip' 'autoconf'  'libusb' 'dbus-core' 'avahi'  'hicolor-icon-theme' 'systemd')
-source=(ftp://ftp.easysw.com/pub/cups/${pkgver}/cups-${pkgver}-source.tar.bz2
-        cups-avahi-1-config.patch
-        cups-avahi-2-backend.patch
-        cups-avahi-3-timeouts.patch
-        cups-avahi-4-poll.patch
-        cups-avahi-5-services.patch
+makedepends=('libtiff>=4.0.0' 'libpng>=1.5.7' 'acl' 'pam' 'xdg-utils' 'krb5' 'openssl'
+             'cups-filters' 'bc' 'colord' 'xinetd' 'gzip' 'autoconf' 'libusb' 'dbus' 
+             'avahi'  'hicolor-icon-theme' 'systemd' 'inetutils' 'libpaper' 'valgrind')
+source=(#http://mirror.easysw.com/pub/cups/${pkgver}/cups-${pkgver}-source.tar.bz2
+        http://www.cups.org/software/${pkgver}/cups-${pkgver}-source.tar.bz2
+        cups.logrotate cups.pam
+        # improve build and linking
         cups-no-export-ssllibs.patch
         cups-no-gcrypt.patch
         cups-no-gzip-man.patch
+        # FC
         cups-systemd-socket.patch
-        cups cups.logrotate cups.pam)
-#options=('!emptydirs')
-md5sums=('e1ad15257aa6f162414ea3beae0c5df8'
-         '12c8af5bcd3b8f84240280b3dfaf9e89'
-         'cdc1322c8014297ae349e2db78a03c5a'
-         '1a5112f63958643f2888abc9418dbcac'
-         'c37d1bf1bb76acc3fe93362c80d91b7c'
-         '5d302860559960042f3b47a91b97c5fe'
-         '9b8467a1e51d360096b70e2c3c081e6c'
-         '3733c23e77eb503bd94cc368e02830dc'
-         'c9159ba1233902ba6ddbbe6885a46b72'
-         '4505b8b2c57a7c28ea79e08388bbbbb9'
-         '9657daa21760bb0b5fa3d8b51d5e01a1'
+        cups-res_init.patch
+        cups-avahi-address.patch
+        cups-enum-all.patch
+        cups-final-content-type.patch
+        # Gentoo
+        cups-1.6.0-fix-install-perms.patch
+        cups-1.6.2-statedir.patch
+        # Debian
+        cupsd-no-crash-on-avahi-threaded-poll-shutdown.patch
+        get-ppd-file-for-statically-configured-ipp-shared-queues.patch
+        ppd-poll-with-client-conf.patch)
+md5sums=('55277c40fd4b7183dc3671d39c5c42b7'
          'f861b18f4446c43918c8643dcbbd7f6d'
-         '96f82c38f3f540b53f3e5144900acf17')
+         '96f82c38f3f540b53f3e5144900acf17'
+         '3ba9e3410df1dc3015463d615ef91b3b'
+         'cc4101beccb5ed6deb1c92707a575925'
+         '90c30380d4c8cd48a908cfdadae1ea24'
+         'cf2f881967b0531ec49bcb5d0e9573a8'
+         '8fe27d4248cacbc02824e7937cab4088'
+         'df0c367c0022e3c7d8e01827e8a6c5e7'
+         'f30c2a161caaf27854581507cde8cac6'
+         'a31b64ba25a985fbae65d8ddf311b08c'
+         '5117f65342fcc69c6a506529e4daca9e'
+         '451609db34f95209d64c38474de27ce1'
+         'cb58bf4e0b80eaee383712e5c84a1ab4'
+         'b578bcd17949a7203237ba1e31f78ef9'
+         '0becd6ab8782b97f19a02c1dc174c75e')
 
-build() {
-  cd ${srcdir}/${pkgbase}-${pkgver}
-  # http://www.cups.org/str.php?L3066
-  # Avahi support in the dnssd backend. patches from upstream/FC RawHide
-  patch -Np1 -i ${srcdir}/cups-avahi-1-config.patch
-  patch -Np1 -i ${srcdir}/cups-avahi-2-backend.patch
-  patch -Np1 -i ${srcdir}/cups-avahi-3-timeouts.patch
-  patch -Np1 -i ${srcdir}/cups-avahi-4-poll.patch
-  patch -Np1 -i ${srcdir}/cups-avahi-5-services.patch
+prepare() {
 
+  cd ${pkgbase}-${pkgver}
+	
   # add systemd socket support - Fedora patch, also used in Gentoo
+  # modified now to the changes done by Gentoo in their svn ebuild
+  # http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/net-print/cups/files/cups-1.5.0-systemd-socket.patch?revision=1.1
   patch -Np1 -i ${srcdir}/cups-systemd-socket.patch
-  
+
   # Do not export SSL libs in cups-config
   patch -Np1 -i "${srcdir}/cups-no-export-ssllibs.patch"
 
   patch -Np1 -i "${srcdir}/cups-no-gcrypt.patch"
+
   # don't zip man pages in make install, let makepkg do that / Fedora
   patch -Np1 -i ${srcdir}/cups-no-gzip-man.patch
+
+
+  # various bugfixes (upstream reports/SVN or Fedora/Debian
+
+  # Fixed crash which sometimes happens on shutdown of the CUPS daemon, caused by a wrong shutdown sequence for shutting down the Avahi threaded poll.
+#  patch -Np1 -i ${srcdir}/cupsd-no-crash-on-avahi-threaded-poll-shutdown.patch
+  # Applications could not get the PPD file for statically-configured IPP-shared print queues
+  patch -Np1 -i ${srcdir}/get-ppd-file-for-statically-configured-ipp-shared-queues.patch
+  # If an external server is used via client.conf and the DNS is inconsistent (ex: DNS gives "noname" for many IPs, reverse DNS gives one of these IPs
+  # for "noname") local PPDs can get polled for print queues instead of the PPDs of the external server Bug: http://www.cups.org/str.php?L2763
+#  patch -Np1 -i ${srcdir}/ppd-poll-with-client-conf.patch
+  # fix permissions on some files - alternative: cups-0755.patch by FC
+  patch -Np0 -i ${srcdir}/cups-1.6.0-fix-install-perms.patch
+  # move /var/run -> /run for pid file
+  patch -Np1 -i ${srcdir}/cups-1.6.2-statedir.patch
+  # Re-initialise the resolver on failure in httpAddrGetList() 
+  patch -Np1 -i ${srcdir}/cups-res_init.patch
+  # Use IP address when resolving DNSSD URIs
+  patch -Np1 -i ${srcdir}/cups-avahi-address.patch
+  # Return from cupsEnumDests() once all records have been returned.
+  patch -Np1 -i ${srcdir}/cups-enum-all.patch
   
-  # Rebuild configure script for --enable-avahi.
+  # Fix printing to some network printers fails - https://bugs.archlinux.org/task/37605
+  patch -Np1 -i ${srcdir}/cups-final-content-type.patch
+  
+  # Rebuild configure script for not zipping man-pages.
   aclocal -I config-scripts
   autoconf -I config-scripts
+}
+
+build() {
+  cd ${pkgbase}-${pkgver}
 
   ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
+     --sbindir=/usr/bin \
      --libdir=/usr/lib \
      --with-systemdsystemunitdir=/usr/lib/systemd/system \
      --with-logdir=/var/log/cups \
@@ -68,32 +106,30 @@ build() {
      --with-cups-user=daemon \
      --with-cups-group=lp \
      --enable-pam=yes \
-     --disable-ldap \
      --enable-raw-printing \
      --enable-dbus --with-dbusdir=/etc/dbus-1 \
-     --enable-ssl=yes --enable-gnutls \
+     --enable-ssl=yes --enable-openssl \
      --enable-threads \
      --enable-avahi\
+     --enable-libpaper \
      --with-php=/usr/bin/php-cgi \
-     --with-pdftops=pdftops \
      --with-optim="$CFLAGS"
   make
 }
 
 check() {
-  cd "$srcdir/$pkgbase-$pkgver"
-  #httpAddrGetList(workstation64): FAIL
-  #1 TESTS FAILED!
-  #make[1]: *** [testhttp] Error 1
+  cd ${pkgbase}-${pkgver}
+#./run-stp-tests.sh: line 782:  6307 Aborted                 (core dumped) $VALGRIND ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f > /tmp/cups-$user/log/debug_log 2>&1
+#FAIL: 87 error messages, expected 33.
   make -k check || /bin/true
 }
 
 package_libcups() {
 pkgdesc="The CUPS Printing System - client libraries and headers"
-depends=('gnutls>=2.8.3' 'libtiff>=4.0.0' 'libpng>=1.5.7' 'krb5' 'avahi')
+depends=('openssl' 'libtiff>=4.0.0' 'libpng>=1.5.7' 'krb5' 'avahi')
 backup=(etc/cups/client.conf)
 
-  cd ${srcdir}/${pkgbase}-${pkgver}
+  cd ${pkgbase}-${pkgver}
   make BUILDROOT=${pkgdir} install-headers install-libs
   # put this into the libs pkg to make other software find the libs(no pkg-config file included)
   mkdir -p ${pkgdir}/usr/bin 
@@ -101,13 +137,12 @@ backup=(etc/cups/client.conf)
   
   # install client.conf man page and config file
   install -dm755 ${pkgdir}/usr/share/man/man5
-  #install -Dm644  ${srcdir}/${pkgbase}-${pkgver}/man/client.conf.5.gz ${pkgdir}/usr/share/man/man5/
   install -Dm644  ${srcdir}/${pkgbase}-${pkgver}/man/client.conf.5 ${pkgdir}/usr/share/man/man5/
-  install -dm755 ${pkgdir}/etc/cups
+  install -dm755 -g lp ${pkgdir}/etc/cups
   touch ${pkgdir}/etc/cups/client.conf
   echo "# see 'man client.conf'" >> ${pkgdir}/etc/cups/client.conf
   echo "ServerName /var/run/cups/cups.sock #  alternative: ServerName hostname-or-ip-address[:port] of a remote server" >> ${pkgdir}/etc/cups/client.conf
-  chgrp lp ${pkgdir}/etc/cups/client.conf
+  chgrp -R lp ${pkgdir}/etc/cups
 }
 
 package_cups() {
@@ -117,16 +152,17 @@ backup=(etc/cups/cupsd.conf
         etc/cups/snmp.conf
         etc/cups/printers.conf
         etc/cups/classes.conf
+        etc/cups/cups-files.conf
         etc/cups/subscriptions.conf
         etc/dbus-1/system.d/cups.conf
         etc/logrotate.d/cups
         etc/pam.d/cups
         etc/xinetd.d/cups-lpd)
-depends=('acl' 'openslp' 'pam' "libcups>=${pkgver}" 'cups-filters' 'bc' 'libusb' 'dbus-core' 'libsystemd' 'hicolor-icon-theme')
-optdepends=('php: for included phpcups.so module'
-	    'xdg-utils: xdg .desktop file support')
+depends=('acl' 'pam' "libcups>=${pkgver}" 'cups-filters' 'bc' 'colord'
+         'libusb' 'dbus' 'systemd' 'libpaper' 'hicolor-icon-theme')
+optdepends=('xdg-utils: xdg .desktop file support')
 
-  cd ${srcdir}/${pkgbase}-${pkgver}
+  cd ${pkgbase}-${pkgver}
   make BUILDROOT=${pkgdir} install-data install-exec
 
   # this one we ship in the libcups pkg
@@ -135,24 +171,23 @@ optdepends=('php: for included phpcups.so module'
   # kill the sysv stuff
   rm -rf ${pkgdir}/etc/rc*.d
   rm -rf ${pkgdir}/etc/init.d
-  install -D -m755 ../cups ${pkgdir}/etc/rc.d/cupsd
   install -D -m644 ../cups.logrotate ${pkgdir}/etc/logrotate.d/cups
   install -D -m644 ../cups.pam ${pkgdir}/etc/pam.d/cups
   
   # fix perms on /var/spool and /etc
   chmod 755 ${pkgdir}/var/spool
   chmod 755 ${pkgdir}/etc
-  
+
   # install ssl directory where to store the certs, solves some samba issues
   install -dm700 -g lp ${pkgdir}/etc/cups/ssl
-  # remove directory from package, we create it in cups rc.d file
-  rm -rf ${pkgdir}/var/run
+  # remove directory from package, it will be recreated at each server start
+  rm -rf ${pkgdir}/run
 
   # install some more configuration files that will get filled by cupsd
   touch ${pkgdir}/etc/cups/printers.conf
   touch ${pkgdir}/etc/cups/classes.conf
   touch ${pkgdir}/etc/cups/subscriptions.conf 
-  chgrp lp ${pkgdir}/etc/cups/{printers.conf,classes.conf,subscriptions.conf}
+  chgrp -R lp ${pkgdir}/etc/cups
   
   # fix .desktop file
   sed -i 's|^Exec=htmlview http://localhost:631/|Exec=xdg-open http://localhost:631/|g' ${pkgdir}/usr/share/applications/cups.desktop
@@ -163,12 +198,12 @@ optdepends=('php: for included phpcups.so module'
   # remove client.conf man page
   rm -f ${pkgdir}/usr/share/man/man5/client.conf.5
   
-  # remove files now part of cups-filters - check cups-filters INSTALL for packagers instructions
-  rm -v ${pkgdir}/usr/lib/cups/backend/{parallel,serial}
-  rm -v ${pkgdir}/usr/lib/cups/filter/{bannertops,commandtoescpx,commandtopclx,imagetops,imagetoraster,pdftops,rastertoescpx,rastertopclx,texttops}
+  # remove files now part of cups-filters
   rm -v ${pkgdir}/usr/share/cups/banners/*
-  rm -v ${pkgdir}/usr/share/cups/data/{testprint,psglyphs}
-  rm -v ${pkgdir}/usr/share/cups/fonts/*
+  rm -v ${pkgdir}/usr/share/cups/data/testprint
   # comment out all conversion rules which use any of the removed filters
-  perl -p -i -e 's:^(.*\s+(pdftops|texttops|imagetops|bannertops|imagetoraster)\s*)$:#\1:' ${pkgdir}/usr/share/cups/mime/mime.convs
+  perl -p -i -e 's:^(.*\s+bannertops\s*)$:#\1:' $pkgdir/usr/share/cups/mime/mime.convs
+
+  # Provide native service for arch-daemons generator
+  ln -s cups.service "$pkgdir/usr/lib/systemd/system/cupsd.service"
 }
diff --git a/abs/extra/cups/PKGBUILD.16 b/abs/extra/cups/PKGBUILD.16
deleted file mode 100644
index 01faba0..0000000
--- a/abs/extra/cups/PKGBUILD.16
+++ /dev/null
@@ -1,146 +0,0 @@
-# $Id: PKGBUILD 159509 2012-05-25 16:34:34Z andyrtr $
-# Maintainer: Andreas Radke <andyrtr@archlinux.org>
-
-pkgbase="cups"
-pkgname=('libcups' 'cups')
-pkgver=1.6b1
-pkgrel=1
-arch=('i686' 'x86_64')
-license=('GPL')
-url="http://www.cups.org/"
-makedepends=('libtiff>=4.0.0' 'libpng>=1.5.7' 'acl' 'openslp' 'pam' 'xdg-utils' 'krb5' 'gnutls>=2.8.3' 'cups-filters' 'bc' 'colord'
-             'xinetd' 'gzip' 'autoconf' 'libusb' 'dbus-core' 'avahi'  'hicolor-icon-theme')
-source=(ftp://ftp.easysw.com/pub/cups/${pkgver}/cups-${pkgver}-source.tar.bz2
-        cups-no-export-ssllibs.patch
-        cups-no-gcrypt.patch
-        cups-no-gzip-man.patch
-        cups cups.logrotate cups.pam)
-#options=('!emptydirs')
-md5sums=('468a40755a872d84be89111ce97a69d1'
-         '9b8467a1e51d360096b70e2c3c081e6c'
-         '3733c23e77eb503bd94cc368e02830dc'
-         '90c30380d4c8cd48a908cfdadae1ea24'
-         '9657daa21760bb0b5fa3d8b51d5e01a1'
-         'f861b18f4446c43918c8643dcbbd7f6d'
-         '96f82c38f3f540b53f3e5144900acf17')
-
-build() {
-  cd ${srcdir}/${pkgbase}-${pkgver}
-
-  # Do not export SSL libs in cups-config
-  patch -Np1 -i "${srcdir}/cups-no-export-ssllibs.patch"
-
-  patch -Np1 -i "${srcdir}/cups-no-gcrypt.patch"
-  # don't zip man pages in make install, let makepkg do that / Fedora
-  patch -Np1 -i ${srcdir}/cups-no-gzip-man.patch
-  
-  # Rebuild configure script for not zipping man-pages.
-  aclocal -I config-scripts
-  autoconf -I config-scripts
-
-  ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
-     --libdir=/usr/lib \
-     --with-logdir=/var/log/cups \
-     --with-docdir=/usr/share/cups/doc \
-     --with-cups-user=daemon \
-     --with-cups-group=lp \
-     --enable-pam=yes \
-     --enable-raw-printing \
-     --enable-dbus --with-dbusdir=/etc/dbus-1 \
-     --enable-ssl=yes --enable-gnutls \
-     --enable-threads \
-     --enable-avahi\
-     --with-php=/usr/bin/php-cgi \
-     --with-optim="$CFLAGS"
-  make
-}
-
-check() {
-  cd "$srcdir/$pkgbase-$pkgver"
-  #httpAddrGetList(workstation64): FAIL
-  #1 TESTS FAILED!
-  #make[1]: *** [testhttp] Error 1
-  make -k check || /bin/true
-}
-
-package_libcups() {
-pkgdesc="The CUPS Printing System - client libraries and headers"
-depends=('gnutls>=2.8.3' 'libtiff>=4.0.0' 'libpng>=1.5.7' 'krb5' 'avahi')
-backup=(etc/cups/client.conf)
-
-  cd ${srcdir}/${pkgbase}-${pkgver}
-  make BUILDROOT=${pkgdir} install-headers install-libs
-  # put this into the libs pkg to make other software find the libs(no pkg-config file included)
-  mkdir -p ${pkgdir}/usr/bin 
-  install -m755 ${srcdir}/${pkgbase}-${pkgver}/cups-config ${pkgdir}/usr/bin/cups-config
-  
-  # install client.conf man page and config file
-  install -dm755 ${pkgdir}/usr/share/man/man5
-  #install -Dm644  ${srcdir}/${pkgbase}-${pkgver}/man/client.conf.5.gz ${pkgdir}/usr/share/man/man5/
-  install -Dm644  ${srcdir}/${pkgbase}-${pkgver}/man/client.conf.5 ${pkgdir}/usr/share/man/man5/
-  install -dm755 ${pkgdir}/etc/cups
-  touch ${pkgdir}/etc/cups/client.conf
-  echo "# see 'man client.conf'" >> ${pkgdir}/etc/cups/client.conf
-  echo "ServerName /var/run/cups/cups.sock #  alternative: ServerName hostname-or-ip-address[:port] of a remote server" >> ${pkgdir}/etc/cups/client.conf
-  chgrp lp ${pkgdir}/etc/cups/client.conf
-}
-
-package_cups() {
-pkgdesc="The CUPS Printing System - daemon package"
-install=cups.install
-backup=(etc/cups/cupsd.conf
-        etc/cups/snmp.conf
-        etc/cups/printers.conf
-        etc/cups/classes.conf
-        etc/cups/subscriptions.conf
-        etc/dbus-1/system.d/cups.conf
-        etc/logrotate.d/cups
-        etc/pam.d/cups
-        etc/xinetd.d/cups-lpd)
-depends=('acl' 'openslp' 'pam' "libcups>=${pkgver}" 'cups-filters' 'bc' 'libusb' 'dbus-core' 'hicolor-icon-theme')
-optdepends=('xdg-utils: xdg .desktop file support')
-
-  cd ${srcdir}/${pkgbase}-${pkgver}
-  make BUILDROOT=${pkgdir} install-data install-exec
-
-  # this one we ship in the libcups pkg
-  rm -f ${pkgdir}/usr/bin/cups-config
-
-  # kill the sysv stuff
-  rm -rf ${pkgdir}/etc/rc*.d
-  rm -rf ${pkgdir}/etc/init.d
-  install -D -m755 ../cups ${pkgdir}/etc/rc.d/cupsd
-  install -D -m644 ../cups.logrotate ${pkgdir}/etc/logrotate.d/cups
-  install -D -m644 ../cups.pam ${pkgdir}/etc/pam.d/cups
-  
-  # fix perms on /var/spool and /etc
-  chmod 755 ${pkgdir}/var/spool
-  chmod 755 ${pkgdir}/etc
-
-  # install ssl directory where to store the certs, solves some samba issues
-  install -dm700 -g lp ${pkgdir}/etc/cups/ssl
-  # remove directory from package, we create it in cups rc.d file
-  rm -rf ${pkgdir}/var/run
-
-  # install some more configuration files that will get filled by cupsd
-  touch ${pkgdir}/etc/cups/printers.conf
-  touch ${pkgdir}/etc/cups/classes.conf
-  touch ${pkgdir}/etc/cups/subscriptions.conf 
-  chgrp lp ${pkgdir}/etc/cups/{printers.conf,classes.conf,subscriptions.conf}
-  
-  # fix .desktop file
-  sed -i 's|^Exec=htmlview http://localhost:631/|Exec=xdg-open http://localhost:631/|g' ${pkgdir}/usr/share/applications/cups.desktop
-  
-  # compress some driver files, adopted from Fedora
-  find ${pkgdir}/usr/share/cups/model -name "*.ppd" | xargs gzip -n9f
-  
-  # remove client.conf man page
-  rm -f ${pkgdir}/usr/share/man/man5/client.conf.5
-  
-  # remove files now part of cups-filters
-  rm -v ${pkgdir}/usr/lib/cups/filter/bannertops
-  rm -v ${pkgdir}/usr/share/cups/banners/*
-  rm -v ${pkgdir}/usr/share/cups/data/testprint
-  # comment out all conversion rules which use any of the removed filters
-  perl -p -i -e 's:^(.*\s+bannertops\s*)$:#\1:' /usr/share/cups/mime/mime.convs
-}
diff --git a/abs/extra/cups/cups b/abs/extra/cups/cups
deleted file mode 100755
index 744c8e6..0000000
--- a/abs/extra/cups/cups
+++ /dev/null
@@ -1,68 +0,0 @@
-#!/bin/bash
-
-daemon_name=cupsd
-
-. /etc/rc.conf
-. /etc/rc.d/functions
-#. /etc/conf.d/$daemon_name.conf
-
-get_pid() {
-        pidof -o %PPID $daemon_name
-}
-
-case "$1" in
-  start)
-    stat_busy "Starting $daemon_name daemon"
-
-    PID=$(get_pid)
-    if [ -z "$PID" ]; then
-      [ -f /var/run/$daemon_name.pid ] && rm -f /var/run/$daemon_name.pid
-      # RUN
-      $daemon_name
-      #
-      if [ $? -gt 0 ]; then
-        stat_fail
-        exit 1
-      else
-        echo $(get_pid) > /var/run/$daemon_name.pid
-        add_daemon $daemon_name
-        stat_done
-      fi
-    else
-      stat_fail
-      exit 1
-    fi
-    ;;
-
-  stop)
-    stat_busy "Stopping $daemon_name daemon"
-    PID=$(get_pid)
-    # KILL
-    [ ! -z "$PID" ] && kill $PID &> /dev/null
-    #
-    if [ $? -gt 0 ]; then
-      stat_fail
-      exit 1
-    else
-      rm -f /var/run/$daemon_name.pid &> /dev/null
-      rm_daemon $daemon_name
-      stat_done
-    fi
-    ;;
-
-  restart)
-    $0 stop
-    sleep 3
-    $0 start
-    ;;
-
-  status)
-    stat_busy "Checking $daemon_name status";
-    ck_status $daemon_name
-    ;;
-
-  *)
-    echo "usage: $0 {start|stop|restart|status}"
-esac
-
-exit 0
diff --git a/abs/extra/cups/cups-1.6.0-fix-install-perms.patch b/abs/extra/cups/cups-1.6.0-fix-install-perms.patch
new file mode 100644
index 0000000..2d7a77c
--- /dev/null
+++ b/abs/extra/cups/cups-1.6.0-fix-install-perms.patch
@@ -0,0 +1,25 @@
+Index: Makedefs.in
+===================================================================
+--- Makedefs.in	(Revision 10520)
++++ Makedefs.in	(Arbeitskopie)
+@@ -40,14 +40,14 @@
+ # Installation programs...
+ #
+ 
+-INSTALL_BIN	=	$(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
+-INSTALL_COMPDATA =	$(INSTALL) -c -m 444 @INSTALL_GZIP@
++INSTALL_BIN	=	$(LIBTOOL) $(INSTALL) -c -m 755 @INSTALL_STRIP@
++INSTALL_COMPDATA =	$(INSTALL) -c -m 644 @INSTALL_GZIP@
+ INSTALL_CONFIG	=	$(INSTALL) -c -m @CUPS_CONFIG_FILE_PERM@
+-INSTALL_DATA	=	$(INSTALL) -c -m 444
++INSTALL_DATA	=	$(INSTALL) -c -m 644
+ INSTALL_DIR	=	$(INSTALL) -d
+-INSTALL_LIB	=	$(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
+-INSTALL_MAN	=	$(INSTALL) -c -m 444
+-INSTALL_SCRIPT	=	$(INSTALL) -c -m 555
++INSTALL_LIB	=	$(LIBTOOL) $(INSTALL) -c -m 755 @INSTALL_STRIP@
++INSTALL_MAN	=	$(INSTALL) -c -m 644
++INSTALL_SCRIPT	=	$(INSTALL) -c -m 755
+ 
+ #
+ # Default user, group, and system groups for the scheduler...
diff --git a/abs/extra/cups/cups-1.6.2-statedir.patch b/abs/extra/cups/cups-1.6.2-statedir.patch
new file mode 100644
index 0000000..c44ebed
--- /dev/null
+++ b/abs/extra/cups/cups-1.6.2-statedir.patch
@@ -0,0 +1,12 @@
+diff -ruN cups-1.6.2.orig/config-scripts/cups-directories.m4 cups-1.6.2/config-scripts/cups-directories.m4
+--- cups-1.6.2.orig/config-scripts/cups-directories.m4	2012-10-01 03:55:23.000000000 +0200
++++ cups-1.6.2/config-scripts/cups-directories.m4	2013-04-02 00:11:41.000000000 +0200
+@@ -420,7 +420,7 @@
+ 			;;
+ 		*)
+ 			# All others
+-			CUPS_STATEDIR="$localstatedir/run/cups"
++			CUPS_STATEDIR="/run/cups"
+ 			;;
+ 	esac])
+ AC_DEFINE_UNQUOTED(CUPS_STATEDIR, "$CUPS_STATEDIR")
diff --git a/abs/extra/cups/cups-avahi-1-config.patch b/abs/extra/cups/cups-avahi-1-config.patch
deleted file mode 100644
index 304cd26..0000000
--- a/abs/extra/cups/cups-avahi-1-config.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-diff -up cups-1.5.2/config.h.in.avahi-1-config cups-1.5.2/config.h.in
---- cups-1.5.2/config.h.in.avahi-1-config	2011-06-16 21:12:16.000000000 +0100
-+++ cups-1.5.2/config.h.in	2012-03-14 15:04:51.365347165 +0000
-@@ -390,6 +390,13 @@
- 
- 
- /*
-+ * Do we have Avahi for DNS Service Discovery?
-+ */
-+
-+#undef HAVE_AVAHI
-+
-+
-+/*
-  * Do we have <sys/ioctl.h>?
-  */
- 
-diff -up cups-1.5.2/config-scripts/cups-dnssd.m4.avahi-1-config cups-1.5.2/config-scripts/cups-dnssd.m4
---- cups-1.5.2/config-scripts/cups-dnssd.m4.avahi-1-config	2011-05-12 06:21:56.000000000 +0100
-+++ cups-1.5.2/config-scripts/cups-dnssd.m4	2012-03-14 15:04:51.365347165 +0000
-@@ -23,6 +23,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
\ No newline at end of file
diff --git a/abs/extra/cups/cups-avahi-2-backend.patch b/abs/extra/cups/cups-avahi-2-backend.patch
deleted file mode 100644
index 00e12a0..0000000
--- a/abs/extra/cups/cups-avahi-2-backend.patch
+++ /dev/null
@@ -1,1118 +0,0 @@
-diff -up cups-1.5.3/backend/dnssd.c.avahi-2-backend cups-1.5.3/backend/dnssd.c
---- cups-1.5.3/backend/dnssd.c.avahi-2-backend	2012-05-15 16:53:18.164774446 +0200
-+++ cups-1.5.3/backend/dnssd.c	2012-05-15 17:09:07.684155704 +0200
-@@ -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 */
- 
- 
- /*
-@@ -53,7 +71,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 */
-@@ -65,6 +88,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...
-@@ -78,6 +115,7 @@ static int		job_canceled = 0;
-  * Local functions...
-  */
- 
-+#ifdef HAVE_DNSSD
- static void		browse_callback(DNSServiceRef sdRef,
- 			                DNSServiceFlags flags,
- 				        uint32_t interfaceIndex,
-@@ -95,13 +133,6 @@ static void		browse_local_callback(DNSSe
- 					      const char *replyDomain,
- 					      void *context)
- 					      __attribute__((nonnull(1,5,6,7,8)));
--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)
--				    __attribute__((nonnull(1,2,3,4)));
- static void		query_callback(DNSServiceRef sdRef,
- 			               DNSServiceFlags flags,
- 				       uint32_t interfaceIndex,
-@@ -111,10 +142,119 @@ static void		query_callback(DNSServiceRe
- 				       const void *rdata, uint32_t ttl,
- 				       void *context)
- 				       __attribute__((nonnull(1,5,9,11)));
-+#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)
-+				    __attribute__((nonnull(1,2,3,4)));
- static void		sigterm_handler(int sig);
- static void		unquote(char *dst, const char *src, size_t dstsize)
- 			    __attribute__((nonnull(1,2)));
- 
-+#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.
-@@ -125,6 +265,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 */
-@@ -138,12 +285,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 */
-@@ -203,6 +349,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 ("DEBUG: Unable to create avahi client");
-+    return (0);
-+  }
-+
-+  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");
-@@ -263,6 +452,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...
-@@ -270,6 +460,9 @@ main(int  argc,				/* I - Number of comm
- 
-   while (!job_canceled)
-   {
-+    int announce = 0;
-+
-+#ifdef HAVE_DNSSD
-     FD_ZERO(&input);
-     FD_SET(fd, &input);
- 
-@@ -289,11 +482,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 */
-@@ -307,6 +524,7 @@ main(int  argc,				/* I - Number of comm
-         if (device->sent)
- 	  sent ++;
- 
-+#ifdef HAVE_DNSSD
-         if (device->ref)
- 	  count ++;
- 
-@@ -338,14 +556,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;
-@@ -406,6 +633,7 @@ main(int  argc,				/* I - Number of comm
- }
- 
- 
-+#ifdef HAVE_DNSSD
- /*
-  * 'browse_callback()' - Browse devices.
-  */
-@@ -494,6 +722,7 @@ browse_local_callback(
- 	  device->fullName);
-   device->sent = 1;
- }
-+#endif /* HAVE_DNSSD */
- 
- 
- /*
-@@ -574,6 +803,41 @@ 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"))
-+    return (CUPS_DEVICE_IPP);
-+  else if (!strcmp(regtype, "_ipps._tcp") ||
-+	   !strcmp(regtype, "_ipp-tls._tcp"))
-+    return (CUPS_DEVICE_IPPS);
-+  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."))
-+    return (CUPS_DEVICE_IPP);
-+  else if (!strcmp(regtype, "_ipps._tcp.") ||
-+	   !strcmp(regtype, "_ipp-tls._tcp."))
-+    return (CUPS_DEVICE_IPPS);
-+  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.
-  */
- 
-@@ -594,20 +858,7 @@ get_device(cups_array_t *devices,	/* I -
-   */
- 
-   key.name = (char *)serviceName;
--
--  if (!strcmp(regtype, "_ipp._tcp."))
--    key.type = CUPS_DEVICE_IPP;
--  else if (!strcmp(regtype, "_ipps._tcp.") ||
--	   !strcmp(regtype, "_ipp-tls._tcp."))
--    key.type = CUPS_DEVICE_IPPS;
--  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;
-@@ -627,8 +878,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);
-       }
-@@ -648,6 +905,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);
- 
-@@ -655,13 +915,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.
-  */
-@@ -685,7 +952,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\", "
-@@ -719,94 +986,233 @@ query_callback(
-   if ((ptr = strstr(name, "._")) != NULL)
-     *ptr = '\0';
- 
--  if (strstr(fullName, "_ipp._tcp."))
--    dkey.type = CUPS_DEVICE_IPP;
--  else if (strstr(fullName, "_ipps._tcp.") ||
--           strstr(fullName, "_ipp-tls._tcp."))
--    dkey.type = CUPS_DEVICE_IPPS;
--  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);
- 
--  for (device = cupsArrayFind(devices, &dkey);
-+  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);
-+
-+  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 (_cups_strcasecmp(device->name, dkey.name) ||
--        _cups_strcasecmp(device->domain, dkey.domain))
-+    if (_cups_strcasecmp(device->name, dkey->name) ||
-+        _cups_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;
--
--        datanext = data + datalen;
--
--        for (ptr = key; data < datanext && *data != '='; data ++)
--	  *ptr++ = *data;
--	*ptr = '\0';
-+	char *key;
-+	char *value;
- 
--	if (data < datanext && *data == '=')
--	{
--	  data ++;
--
--	  if (data < datanext)
--	    memcpy(value, data, datanext - data);
--	  value[datanext - data] = '\0';
-+	if (parse_txt_record_pair (txt))
-+	  goto next;
- 
--	  fprintf(stderr, "DEBUG2: query_callback: \"%s=%s\".\n",
--	          key, value);
--	}
--	else
--	{
--	  fprintf(stderr, "DEBUG2: query_callback: \"%s\" with no value.\n",
--	          key);
--	  continue;
--	}
--
--        if (!_cups_strncasecmp(key, "usb_", 4))
-+	key = txt->key;
-+	value = txt->value;
-+        if (!strncasecmp(key, "usb_", 4))
- 	{
- 	 /*
- 	  * Add USB device ID information...
-@@ -861,6 +1267,10 @@ query_callback(
- 	  if (device->type == CUPS_DEVICE_PRINTER)
- 	    device->sent = 1;
- 	}
-+
-+      next:
-+	if (next_txt_record (txt) == NULL)
-+	  break;
-       }
- 
-       if (device->device_id)
-@@ -917,11 +1327,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.5.3/cups/http-support.c.avahi-2-backend cups-1.5.3/cups/http-support.c
---- cups-1.5.3/cups/http-support.c.avahi-2-backend	2012-02-15 02:06:12.000000000 +0100
-+++ cups-1.5.3/cups/http-support.c	2012-05-15 17:04:51.045944634 +0200
-@@ -43,6 +43,10 @@
-  *   http_copy_decode()   - Copy and decode a URI.
-  *   http_copy_encode()   - Copy and encode a URI.
-  *   http_resolve_cb()    - 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.
-  */
- 
- /*
-@@ -60,6 +64,11 @@
- #    include <sys/select.h>
- #  endif /* WIN32 */
- #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 */
- 
- 
- /*
-@@ -127,6 +136,24 @@ static void DNSSD_API	http_resolve_cb(DN
- 					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
-@@ -1434,6 +1461,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
- #  ifdef WIN32
- #    pragma comment(lib, "dnssd.lib")
-@@ -1452,6 +1482,17 @@ _httpResolveURI(
-     fd_set		input_set;	/* Input set for select() */
-     struct timeval	stimeout;	/* Timeout value for select() */
- #endif /* HAVE_POLL */
-+#else /* HAVE_AVAHI */
-+    AvahiSimplePoll	*simple_poll;
-+    AvahiClient		*client;
-+    int			error;
-+    struct
-+    {
-+      AvahiSimplePoll	*poll;
-+      _http_uribuf_t	uribuf;
-+    } user_data;
-+#endif /* HAVE_DNSSD */
-+
- 
-     if (options & _HTTP_RESOLVE_STDERR)
-       fprintf(stderr, "DEBUG: Resolving \"%s\"...\n", hostname);
-@@ -1488,9 +1529,16 @@ _httpResolveURI(
-     if (domain)
-       *domain++ = '\0';
- 
-+#ifdef HAVE_DNSSD
-     uribuf.buffer   = resolved_uri;
-     uribuf.bufsize  = resolved_size;
-     uribuf.options  = options;
-+#else
-+    user_data.uribuf.buffer = resolved_uri;
-+    user_data.uribuf.bufsize = resolved_size;
-+    user_data.uribuf.options = options;
-+#endif
-+
-     resolved_uri[0] = '\0';
- 
-     DEBUG_printf(("6_httpResolveURI: Resolving hostname=\"%s\", regtype=\"%s\", "
-@@ -1504,6 +1552,7 @@ _httpResolveURI(
- 
-     uri = NULL;
- 
-+#ifdef HAVE_DNSSD
-     if (DNSServiceCreateConnection(&ref) == kDNSServiceErr_NoError)
-     {
-       localref = ref;
-@@ -1611,6 +1660,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 (options & _HTTP_RESOLVE_STDERR)
-     {
-@@ -1622,13 +1701,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 ((options & _HTTP_RESOLVE_STDERR) && !uri)
-       _cupsLangPrintFilter(stderr, "ERROR", _("Unable to find printer."));
-@@ -1916,6 +1995,115 @@ http_resolve_cb(
- }
- #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 10284 2012-02-15 01:06:12Z mike $".
\ No newline at end of file
diff --git a/abs/extra/cups/cups-avahi-3-timeouts.patch b/abs/extra/cups/cups-avahi-3-timeouts.patch
deleted file mode 100644
index daf852a..0000000
--- a/abs/extra/cups/cups-avahi-3-timeouts.patch
+++ /dev/null
@@ -1,381 +0,0 @@
-diff -up cups-1.5.2/scheduler/cupsd.h.avahi-3-timeouts cups-1.5.2/scheduler/cupsd.h
---- cups-1.5.2/scheduler/cupsd.h.avahi-3-timeouts	2011-05-11 23:17:34.000000000 +0100
-+++ cups-1.5.2/scheduler/cupsd.h	2012-03-14 15:06:36.509476983 +0000
-@@ -140,6 +140,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...
-@@ -173,6 +182,11 @@ VAR int			Launchd		VALUE(0);
- 					/* Running from launchd */
- #endif /* HAVE_LAUNCH_H */
- 
-+#ifdef HAVE_AVAHI
-+VAR cups_array_t *Timeouts;		/* Timed callbacks for main loop */
-+#endif /* HAVE_AVAHI */
-+
-+
- 
- /*
-  * Prototypes...
-@@ -242,6 +256,20 @@ extern void		cupsdStopSelect(void);
- extern void		cupsdStartServer(void);
- extern void		cupsdStopServer(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);
-+
- 
- /*
-  * End of "$Id: cupsd.h 9766 2011-05-11 22:17:34Z mike $".
-diff -up cups-1.5.2/scheduler/main.c.avahi-3-timeouts cups-1.5.2/scheduler/main.c
---- cups-1.5.2/scheduler/main.c.avahi-3-timeouts	2012-03-14 15:04:17.655305548 +0000
-+++ cups-1.5.2/scheduler/main.c	2012-03-14 15:06:36.511476986 +0000
-@@ -146,6 +146,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
-@@ -535,6 +539,14 @@ main(int  argc,				/* I - Number of comm
- 
-   httpInitialize();
- 
-+#ifdef HAVE_AVAHI
-+ /*
-+  * Initialize timed callback structures.
-+  */
-+
-+  cupsdInitTimeouts();
-+#endif /* HAVE_AVAHI */
-+
-   cupsdStartServer();
- 
-  /*
-@@ -874,6 +886,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...
-@@ -1787,6 +1809,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 */
- 
- 
-  /*
-@@ -1829,6 +1855,19 @@ select_timeout(int fds)			/* I - Number
-   }
- #endif /* __APPLE__ */
- 
-+#ifdef HAVE_AVAHI
-+ /*
-+  * See if there are any scheduled timed callbacks to run.
-+  */
-+
-+  if ((tmo = cupsdNextTimeout(&tmo_delay)) != NULL &&
-+      (now + tmo_delay) < timeout)
-+  {
-+    timeout = tmo_delay;
-+    why = "run a timed callback";
-+  }
-+#endif /* HAVE_AVAHI */
-+
-  /*
-   * Check whether we are accepting new connections...
-   */
-diff -up cups-1.5.2/scheduler/Makefile.avahi-3-timeouts cups-1.5.2/scheduler/Makefile
---- cups-1.5.2/scheduler/Makefile.avahi-3-timeouts	2012-03-14 15:04:17.685305586 +0000
-+++ cups-1.5.2/scheduler/Makefile	2012-03-14 15:06:36.508476980 +0000
-@@ -39,7 +39,8 @@ CUPSDOBJS =	\
- 		server.o \
- 		statbuf.o \
- 		subscriptions.o \
--		sysman.o
-+		sysman.o \
-+		timeout.o
- LIBOBJS =	\
- 		filter.o \
- 		mime.o \
-diff -up cups-1.5.2/scheduler/timeout.c.avahi-3-timeouts cups-1.5.2/scheduler/timeout.c
---- cups-1.5.2/scheduler/timeout.c.avahi-3-timeouts	2012-03-14 15:06:36.552477037 +0000
-+++ cups-1.5.2/scheduler/timeout.c	2012-03-14 15:06:36.552477037 +0000
-@@ -0,0 +1,235 @@
-+/*
-+ * "$Id$"
-+ *
-+ *   Timeout functions for the Common UNIX Printing System (CUPS).
-+ *
-+ *   Copyright (C) 2010, 2011 Red Hat, Inc.
-+ *   Authors:
-+ *     Tim Waugh <twaugh@redhat.com>
-+ *
-+ *   Redistribution and use in source and binary forms, with or without
-+ *   modification, are permitted provided that the following conditions
-+ *   are met:
-+ *
-+ *   Redistributions of source code must retain the above copyright
-+ *   notice, this list of conditions and the following disclaimer.
-+ *
-+ *   Redistributions in binary form must reproduce the above copyright
-+ *   notice, this list of conditions and the following disclaimer in the
-+ *   documentation and/or other materials provided with the distribution.
-+ *
-+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-+ *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-+ *   COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-+ *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-+ *   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-+ *   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-+ *   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-+ *   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-+ *   OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ * 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_addrs (void *p0, void *p1)
-+{
-+  if (p0 == p1)
-+    return (0);
-+  if (p0 < p1)
-+    return (-1);
-+  return (1);
-+}
-+
-+static int
-+compare_timeouts (cupsd_timeout_t *p0, cupsd_timeout_t *p1)
-+{
-+  int addrsdiff = compare_addrs (p0, p1);
-+  int tvdiff;
-+
-+  if (addrsdiff == 0)
-+    return (0);
-+
-+  if (!p0->enabled || !p1->enabled)
-+  {
-+    if (!p0->enabled && !p1->enabled)
-+      return (addrsdiff);
-+
-+    return (p0->enabled ? -1 : 1);
-+  }
-+
-+  tvdiff = avahi_timeval_compare (&p0->when, &p1->when);
-+  if (tvdiff != 0)
-+    return (tvdiff);
-+
-+  return (addrsdiff);
-+}
-+
-+
-+/*
-+ * '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 */
-+{
-+  if (!timeout)
-+    return;
-+  timeout->enabled = 0;
-+  if (!timeout->callback)
-+    return;
-+  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$".
-+ */
diff --git a/abs/extra/cups/cups-avahi-4-poll.patch b/abs/extra/cups/cups-avahi-4-poll.patch
deleted file mode 100644
index d7fa5fd..0000000
--- a/abs/extra/cups/cups-avahi-4-poll.patch
+++ /dev/null
@@ -1,529 +0,0 @@
-diff -up cups-1.5.2/scheduler/avahi.c.avahi-4-poll cups-1.5.2/scheduler/avahi.c
---- cups-1.5.2/scheduler/avahi.c.avahi-4-poll	2012-03-14 15:07:29.477542381 +0000
-+++ cups-1.5.2/scheduler/avahi.c	2012-03-14 15:07:29.477542381 +0000
-@@ -0,0 +1,441 @@
-+/*
-+ * "$Id$"
-+ *
-+ *   Avahi poll implementation for the CUPS scheduler.
-+ *
-+ *   Copyright (C) 2010, 2011 Red Hat, Inc.
-+ *   Authors:
-+ *    Tim Waugh <twaugh@redhat.com>
-+ *
-+ *   Redistribution and use in source and binary forms, with or without
-+ *   modification, are permitted provided that the following conditions
-+ *   are met:
-+ *
-+ *   Redistributions of source code must retain the above copyright
-+ *   notice, this list of conditions and the following disclaimer.
-+ *
-+ *   Redistributions in binary form must reproduce the above copyright
-+ *   notice, this list of conditions and the following disclaimer in the
-+ *   documentation and/or other materials provided with the distribution.
-+ *
-+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-+ *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-+ *   COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-+ *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-+ *   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-+ *   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-+ *   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-+ *   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-+ *   OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ * 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
-+ *   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);
-+
-+
-+/*
-+ * '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;
-+  int any_watches = 0;
-+
-+  for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches);
-+       watch;
-+       watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches))
-+  {
-+    any_watches = 1;
-+    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 (any_watches);
-+}
-+
-+/*
-+ * '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)
-+    {
-+      free (watch);
-+      return (NULL);
-+    }
-+
-+    watched_fd->fd = fd;
-+    watched_fd->occurred = 0;
-+    watched_fd->cups_poll = cups_poll;
-+    watched_fd->watches = cupsArrayNew (NULL, NULL);
-+    cupsArrayAdd (cups_poll->watched_fds, watched_fd);
-+  }
-+
-+  watch->watched_fd = watched_fd;
-+  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);
-+}
-+
-+
-+/*
-+ * '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)
-+{
-+  /*
-+   * Compare by fd (no two elements have the same fd)
-+   */
-+
-+  if (p0->fd == p1->fd)
-+    return 0;
-+
-+  return (p0->fd < p1->fd ? -1 : 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 (NULL, 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.5.2/scheduler/avahi.h.avahi-4-poll cups-1.5.2/scheduler/avahi.h
---- cups-1.5.2/scheduler/avahi.h.avahi-4-poll	2012-03-14 15:07:29.477542381 +0000
-+++ cups-1.5.2/scheduler/avahi.h	2012-03-14 15:07:29.477542381 +0000
-@@ -0,0 +1,69 @@
-+/*
-+ * "$Id$"
-+ *
-+ *   Avahi poll implementation for the CUPS scheduler.
-+ *
-+ *   Copyright (C) 2010, 2011 Red Hat, Inc.
-+ *   Authors:
-+ *    Tim Waugh <twaugh@redhat.com>
-+ *
-+ *   Redistribution and use in source and binary forms, with or without
-+ *   modification, are permitted provided that the following conditions
-+ *   are met:
-+ *
-+ *   Redistributions of source code must retain the above copyright
-+ *   notice, this list of conditions and the following disclaimer.
-+ *
-+ *   Redistributions in binary form must reproduce the above copyright
-+ *   notice, this list of conditions and the following disclaimer in the
-+ *   documentation and/or other materials provided with the distribution.
-+ *
-+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-+ *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-+ *   COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-+ *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-+ *   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-+ *   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-+ *   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-+ *   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-+ *   OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#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.5.2/scheduler/Makefile.avahi-4-poll cups-1.5.2/scheduler/Makefile
---- cups-1.5.2/scheduler/Makefile.avahi-4-poll	2012-03-14 15:06:36.508476980 +0000
-+++ cups-1.5.2/scheduler/Makefile	2012-03-14 15:07:29.476542380 +0000
-@@ -17,6 +17,7 @@ include ../Makedefs
- 
- CUPSDOBJS =	\
- 		auth.o \
-+		avahi.o \
- 		banners.o \
- 		cert.o \
- 		classes.o \
diff --git a/abs/extra/cups/cups-avahi-5-services.patch b/abs/extra/cups/cups-avahi-5-services.patch
deleted file mode 100644
index 820b3c3..0000000
--- a/abs/extra/cups/cups-avahi-5-services.patch
+++ /dev/null
@@ -1,1272 +0,0 @@
-diff -up cups-1.5.2/cgi-bin/admin.c.avahi-5-services cups-1.5.2/cgi-bin/admin.c
---- cups-1.5.2/cgi-bin/admin.c.avahi-5-services	2011-08-17 22:01:53.000000000 +0100
-+++ cups-1.5.2/cgi-bin/admin.c	2012-03-14 15:08:25.701611799 +0000
-@@ -1643,7 +1643,7 @@ do_config_server(http_t *http)		/* I - H
-       else
- 	local_protocols[0] = '\0';
- 
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-       if (cgiGetVariable("BROWSE_LOCAL_DNSSD"))
-       {
- 	if (local_protocols[0])
-@@ -1651,7 +1651,7 @@ do_config_server(http_t *http)		/* I - H
- 	else
- 	  strcat(local_protocols, "dnssd");
-       }
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
- #ifdef HAVE_LDAP
-       if (cgiGetVariable("BROWSE_LOCAL_LDAP"))
-@@ -2718,9 +2718,9 @@ do_menu(http_t *http)			/* I - HTTP conn
- #endif /* HAVE_GSSAPI */
-   cgiSetVariable("KERBEROS", "");
- 
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-   cgiSetVariable("HAVE_DNSSD", "1");
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
- #ifdef HAVE_LDAP
-   cgiSetVariable("HAVE_LDAP", "1");
-diff -up cups-1.5.2/scheduler/avahi.h.avahi-5-services cups-1.5.2/scheduler/avahi.h
---- cups-1.5.2/scheduler/avahi.h.avahi-5-services	2012-03-14 15:07:29.477542381 +0000
-+++ cups-1.5.2/scheduler/avahi.h	2012-03-14 15:08:25.701611799 +0000
-@@ -3,7 +3,7 @@
-  *
-  *   Avahi poll implementation for the CUPS scheduler.
-  *
-- *   Copyright (C) 2010, 2011 Red Hat, Inc.
-+ *   Copyright (C) 2010, 2011, 2012 Red Hat, Inc.
-  *   Authors:
-  *    Tim Waugh <twaugh@redhat.com>
-  *
-@@ -32,37 +32,40 @@
-  *   OF THE POSSIBILITY OF SUCH DAMAGE.
-  */
- 
--#include <config.h>
-+#ifndef _CUPS_AVAHI_H_
-+#  define _CUPS_AVAHI_H_
- 
--#ifdef HAVE_AVAHI
--#  include <avahi-client/client.h>
--#  include <avahi-client/publish.h>
--#endif /* HAVE_AVAHI */
-+/*
-+ * Include necessary headers...
-+ */
- 
--#ifdef HAVE_AUTHORIZATION_H
--#  include <Security/Authorization.h>
--#endif /* HAVE_AUTHORIZATION_H */
-+#  include <config.h>
- 
-+#  ifdef HAVE_AVAHI
-+#    include <avahi-client/client.h>
-+#    include <avahi-client/publish.h>
-+#  endif /* HAVE_AVAHI */
- 
--#ifdef HAVE_AVAHI
-+#  ifdef HAVE_AVAHI
- typedef struct
- {
-     AvahiPoll api;
-     cups_array_t *watched_fds;
-     cups_array_t *timeouts;
- } AvahiCupsPoll;
--#endif /* HAVE_AVAHI */
-+#  endif /* HAVE_AVAHI */
- 
- /*
-  * Prototypes...
-  */
- 
--#ifdef HAVE_AVAHI
-+#  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 */
-+#  endif /* HAVE_AVAHI */
- 
-+#endif /* !_CUPS_AVAHI_H_ */
- 
- /*
-  * End of "$Id$".
-diff -up cups-1.5.2/scheduler/client.c.avahi-5-services cups-1.5.2/scheduler/client.c
---- cups-1.5.2/scheduler/client.c.avahi-5-services	2012-01-13 23:00:22.000000000 +0000
-+++ cups-1.5.2/scheduler/client.c	2012-03-14 15:08:25.703611797 +0000
-@@ -4989,7 +4989,7 @@ valid_host(cupsd_client_t *con)		/* I -
- 	    !strncmp(host, "[::1]:", 6));
-   }
- 
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-  /*
-   * Check if the hostname is something.local (Bonjour); if so, allow it.
-   */
-@@ -4998,7 +4998,7 @@ valid_host(cupsd_client_t *con)		/* I -
-       (!_cups_strcasecmp(end, ".local") || !_cups_strncasecmp(end, ".local:", 7) ||
-        !_cups_strcasecmp(end, ".local.") || !_cups_strncasecmp(end, ".local.:", 8)))
-     return (1);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
-  /*
-   * Check if the hostname is an IP address...
-diff -up cups-1.5.2/scheduler/conf.c.avahi-5-services cups-1.5.2/scheduler/conf.c
---- cups-1.5.2/scheduler/conf.c.avahi-5-services	2012-03-14 15:04:17.636305526 +0000
-+++ cups-1.5.2/scheduler/conf.c	2012-03-14 15:08:25.706611803 +0000
-@@ -652,7 +652,7 @@ cupsdReadConfiguration(void)
-   Browsing                 = CUPS_DEFAULT_BROWSING;
-   DefaultShared            = CUPS_DEFAULT_DEFAULT_SHARED;
- 
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-   cupsdSetString(&DNSSDRegType, "_ipp._tcp,_cups");
- #endif /* HAVE_DNSSD */
- 
-diff -up cups-1.5.2/scheduler/dirsvc.c.avahi-5-services cups-1.5.2/scheduler/dirsvc.c
---- cups-1.5.2/scheduler/dirsvc.c.avahi-5-services	2012-03-14 15:04:17.674305572 +0000
-+++ cups-1.5.2/scheduler/dirsvc.c	2012-03-14 15:08:25.709611806 +0000
-@@ -27,6 +27,7 @@
-  *   ldap_connect()             - Start new LDAP connection
-  *   ldap_reconnect()           - Reconnect to LDAP Server
-  *   ldap_disconnect()          - Disconnect from LDAP Server
-+ *   cupsdStartAvahiClient()    - Start an Avahi client if needed
-  *   cupsdStartBrowsing()       - Start sending and receiving broadcast
-  *                                information.
-  *   cupsdStartPolling()        - Start polling servers as needed.
-@@ -40,11 +41,12 @@
-  *   dequote()                  - Remote quotes from a string.
-  *   dnssdAddAlias()            - Add a DNS-SD alias name.
-  *   dnssdBuildTxtRecord()      - Build a TXT record from printer info.
-- *   dnssdComparePrinters()     - Compare the registered names of two printers.
-  *   dnssdDeregisterPrinter()   - Stop sending broadcast information for a
-  *                                printer.
-  *   dnssdPackTxtRecord()       - Pack an array of key/value pairs into the TXT
-  *                                record format.
-+ *   avahiPackTxtRecord()       - Pack an array of key/value pairs into an
-+ *                                AvahiStringList.
-  *   dnssdRegisterCallback()    - DNSServiceRegister callback.
-  *   dnssdRegisterPrinter()     - Start sending broadcast information for a
-  *                                printer or update the broadcast contents.
-@@ -83,6 +85,7 @@
-  */
- 
- #include "cupsd.h"
-+#include <assert.h>
- #include <grp.h>
- 
- #ifdef HAVE_DNSSD
-@@ -97,6 +100,17 @@
- #    endif /* HAVE_SYSTEMCONFIGURATION */
- #  endif /* __APPLE__ */
- #endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+#  include <avahi-common/domain.h>
-+#endif /* HAVE_AVAHI */
-+
-+
-+#ifdef HAVE_DNSSD
-+typedef char *cupsd_txt_record_t;
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+typedef AvahiStringList *cupsd_txt_record_t;
-+#endif /* HAVE_AVAHI */
- 
- 
- /*
-@@ -159,27 +173,38 @@ 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 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,
- 		                      DNSServiceFlags flags,
- 				      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 +308,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) */
- }
- 
- 
-@@ -702,10 +727,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) */
- }
- 
- 
-@@ -1419,6 +1444,36 @@ ldap_disconnect(LDAP *ld)		/* I - LDAP h
- #endif /* HAVE_LDAP */
- 
- 
-+#ifdef HAVE_AVAHI
-+/*
-+ * 'cupsdStartAvahiClient()' - Start an Avahi client if needed
-+ */
-+
-+void
-+cupsdStartAvahiClient(void)
-+{
-+  int error = 0;
-+
-+  if (!AvahiCupsClient && !AvahiCupsClientConnecting)
-+  {
-+    if (!AvahiCupsPollHandle)
-+      AvahiCupsPollHandle = avahi_cups_poll_new ();
-+
-+    if (AvahiCupsPollHandle)
-+    {
-+      if (avahi_client_new (avahi_cups_poll_get (AvahiCupsPollHandle),
-+			    AVAHI_CLIENT_NO_FAIL,
-+			    avahi_client_cb, NULL,
-+			    &error) != NULL)
-+	AvahiCupsClientConnecting = 1;
-+      else
-+	cupsdLogMessage (CUPSD_LOG_WARN, "Avahi client failed: %d", error);
-+    }
-+  }
-+}
-+#endif /* HAVE_AVAHI */
-+
-+  
- /*
-  * 'cupsdStartBrowsing()' - Start sending and receiving broadcast information.
-  */
-@@ -1542,13 +1597,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...
-     */
-@@ -1573,6 +1631,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
-@@ -1598,17 +1657,23 @@ cupsdStartBrowsing(void)
-       */
- 
-       if (BrowseRemoteProtocols & BROWSE_DNSSD)
--        DNSSDPrinters = cupsArrayNew((cups_array_func_t)dnssdComparePrinters,
--	                             NULL);
-+	  DNSSDPrinters = cupsArrayNew(NULL, NULL);
- 
-      /*
-       * Set the computer name and register the web interface...
-       */
- 
-       cupsdUpdateDNSSDName();
-+
-+#ifdef HAVE_AVAHI
-+      cupsdStartAvahiClient ();
-+#endif /* HAVE_AVAHI */
-+
-+#ifdef HAVE_DNSSD
-     }
--  }
- #endif /* HAVE_DNSSD */
-+  }
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
- #ifdef HAVE_LIBSLP
-   if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP)
-@@ -1834,10 +1899,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) &&
-@@ -1902,7 +1967,7 @@ cupsdStopPolling(void)
- }
- 
- 
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- /*
-  * 'cupsdUpdateDNSSDName()' - Update the computer name we use for browsing...
-  */
-@@ -1910,8 +1975,14 @@ cupsdStopPolling(void)
- void
- cupsdUpdateDNSSDName(void)
- {
-+#ifdef HAVE_DNSSD
-   DNSServiceErrorType error;		/* Error from service creation */
-   char		webif[1024];		/* Web interface share name */
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+  int		ret;			/* Error from service creation */
-+  char		webif[AVAHI_LABEL_MAX];	/* Web interface share name */
-+#endif /* HAVE_AVAHI */
- #  ifdef HAVE_SYSTEMCONFIGURATION
-   SCDynamicStoreRef sc;			/* Context for dynamic store */
-   CFDictionaryRef btmm;			/* Back-to-My-Mac domains */
-@@ -2042,6 +2113,7 @@ cupsdUpdateDNSSDName(void)
-     else
-       strlcpy(webif, "CUPS Web Interface", sizeof(webif));
- 
-+#ifdef HAVE_DNSSD
-     if (WebIFRef)
-       DNSServiceRefDeallocate(WebIFRef);
- 
-@@ -2054,9 +2126,45 @@ 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 */
-+					   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 */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
- 
- #ifdef HAVE_LDAP
-@@ -2334,13 +2442,15 @@ dnssdAddAlias(const void *key,		/* I - K
-                     "Bad Back to My Mac domain in dynamic store!");
- }
- #  endif /* HAVE_COREFOUNDATION */
-+#endif /* HAVE_DNSSD */
- 
- 
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- /*
-  * 'dnssdBuildTxtRecord()' - Build a TXT record from printer info.
-  */
- 
--static char *				/* O - TXT record */
-+static cupsd_txt_record_t		/* O - TXT record */
- dnssdBuildTxtRecord(
-     int             *txt_len,		/* O - TXT record length */
-     cupsd_printer_t *p,			/* I - Printer information */
-@@ -2379,7 +2489,12 @@ dnssdBuildTxtRecord(
-   keyvalue[i  ][0] = "ty";
-   keyvalue[i++][1] = p->make_model ? p->make_model : "Unknown";
- 
--  snprintf(admin_hostname, sizeof(admin_hostname), "%s.local.", DNSSDHostName);
-+  snprintf(admin_hostname, sizeof(admin_hostname),
-+	   "%s.local"
-+#ifdef HAVE_DNSSD
-+	   "." /* terminating dot no good for Avahi */
-+#endif /* HAVE_DNSSD */
-+	   , DNSSDHostName);
-   httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl_str, sizeof(adminurl_str),
-                    "http", NULL, admin_hostname, DNSSDPort, "/%s/%s",
- 		   (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers",
-@@ -2462,19 +2577,12 @@ dnssdBuildTxtRecord(
-   * Then pack them into a proper txt record...
-   */
- 
-+#ifdef HAVE_DNSSD
-   return (dnssdPackTxtRecord(txt_len, keyvalue, i));
--}
--
--
--/*
-- * 'dnssdComparePrinters()' - Compare the registered names of two printers.
-- */
--
--static int				/* O - Result of comparison */
--dnssdComparePrinters(cupsd_printer_t *a,/* I - First printer */
--                     cupsd_printer_t *b)/* I - Second printer */
--{
--  return (_cups_strcasecmp(a->reg_name, b->reg_name));
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+  return (avahiPackTxtRecord(keyvalue, i));
-+#endif /* HAVE_AVAHI */
- }
- 
- 
-@@ -2489,6 +2597,10 @@ dnssdDeregisterPrinter(
- {
-   cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdDeregisterPrinter(%s)", p->name);
- 
-+#ifdef HAVE_DNSSD
-+  if (!DNSSDRef)
-+    return;
-+
-  /*
-   * Closing the socket deregisters the service
-   */
-@@ -2524,6 +2636,24 @@ 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
-@@ -2533,8 +2663,10 @@ dnssdDeregisterPrinter(
-   cupsArrayRemove(DNSSDPrinters, p);
-   cupsdClearString(&p->reg_name);
- }
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
- 
-+#ifdef HAVE_DNSSD
- /*
-  * 'dnssdPackTxtRecord()' - Pack an array of key/value pairs into the
-  *                          TXT record format.
-@@ -2644,8 +2776,10 @@ dnssdRegisterCallback(
-     LastEvent |= CUPSD_EVENT_PRINTER_MODIFIED;
-   }
- }
-+#endif /* HAVE_DNSSD */
- 
- 
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
- /*
-  * 'dnssdRegisterPrinter()' - Start sending broadcast information for a printer
-  *		              or update the broadcast contents.
-@@ -2654,20 +2788,40 @@ dnssdRegisterCallback(
- static void
- dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
- {
-+#ifdef HAVE_DNSSD
-   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 */
-+			name[1024];	/* Service name */
-   int			ipp_len,	/* IPP TXT record length */
- 			printer_len,	/* LPD TXT record length */
- 			printer_port;	/* LPD port number */
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+  int			ret;		/* Error code */
-+  AvahiStringList	*ipp_txt,	/* IPP TXT record */
-+			*printer_txt;	/* LPD TXT record */
-+  char			name[AVAHI_LABEL_MAX],	/* Service name */
-+			fullsubtype[AVAHI_LABEL_MAX]; /* Full subtype */
-+  char			*regtype_copy,	/* Writeable copy of reg type */
-+			*subtype,	/* Current service sub type */
-+			*nextsubtype;	/* Next service sub type */
-+#endif /* HAVE_AVAHI */
-+  char			*nameptr;	/* Pointer into name */
-   const char		*regtype;	/* Registration type */
- 
- 
-+#ifdef HAVE_DNSSD
-+  if (!DNSSDRef)
-+    return;
-+
-   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 */
-  /*
-   * If per-printer sharing was just disabled make sure we're not
-   * registered before returning.
-@@ -2686,12 +2840,36 @@ dnssdRegisterPrinter(cupsd_printer_t *p)
-   if (p->info && strlen(p->info) > 0)
-   {
-     if (DNSSDComputerName)
--      snprintf(name, sizeof(name), "%s @ %s", p->info, DNSSDComputerName);
-+    {
-+     /*
-+      * Make sure there is room for at least 15 characters of
-+      * DNSSDComputerName.
-+      */
-+
-+      assert(sizeof(name) >= 15 + 4);
-+      nameptr = name + strlcpy(name, p->info,
-+			       sizeof(name) - 4 -
-+			       strnlen(DNSSDComputerName, 15));
-+      nameptr += strlcpy(nameptr, " @ ", sizeof(name) - (nameptr - name));
-+      strlcpy(nameptr, DNSSDComputerName, sizeof(name) - (nameptr - name));
-+    }
-     else
-       strlcpy(name, p->info, sizeof(name));
-   }
-   else if (DNSSDComputerName)
--    snprintf(name, sizeof(name), "%s @ %s", p->name, DNSSDComputerName);
-+  {
-+   /*
-+    * Make sure there is room for at least 15 characters of
-+    * DNSSDComputerName.
-+    */
-+
-+    assert(sizeof(name) >= 15 + 4);
-+    nameptr = name + strlcpy(name, p->info,
-+			     sizeof(name) - 4 -
-+			     strnlen(DNSSDComputerName, 15));
-+    nameptr += strlcpy(nameptr, " @ ", sizeof(name) - (nameptr - name));
-+    strlcpy(nameptr, DNSSDComputerName, sizeof(name) - (nameptr - name));
-+  }
-   else
-     strlcpy(name, p->name, sizeof(name));
- 
-@@ -2712,6 +2890,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);
- 
-@@ -2884,6 +3063,209 @@ 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" : DNSSDRegType;
-+
-+  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);
-+
-+   /*
-+    * Update the service group entry.
-+    */
-+
-+    regtype_copy = strdup (regtype);
-+    subtype = strchr (regtype_copy, ',');
-+    if (subtype)
-+      *subtype = '\0';
-+
-+    cupsdLogMessage (CUPSD_LOG_DEBUG,
-+		     "Updating TXT record for %s (%s)", name, regtype_copy);
-+    ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group,
-+						       AVAHI_IF_UNSPEC,
-+						       AVAHI_PROTO_UNSPEC,
-+						       0, name,
-+						       regtype_copy,
-+						       NULL, ipp_txt);
-+    free (regtype_copy);
-+
-+    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);
-+
-+    if (!p->avahi_group)
-+    {
-+      ret = 0;
-+      goto add_failed;
-+    }
-+
-+   /*
-+    * Add each service type (DNSSDRegType may contain several,
-+    * separated by commas).
-+    */
-+
-+    subtype = regtype_copy = strdup (regtype);
-+    while (subtype && *subtype)
-+    {
-+      nextsubtype = strchr (subtype, ',');
-+      if (nextsubtype)
-+	*nextsubtype++ = '\0';
-+
-+      if (subtype == regtype_copy)
-+      {
-+       /*
-+	* Main type entry.
-+	*/
-+
-+	cupsdLogMessage (CUPSD_LOG_DEBUG,
-+			 "Adding TXT record for %s (%s)", name, regtype_copy);
-+	ret = avahi_entry_group_add_service_strlst (p->avahi_group,
-+						    AVAHI_IF_UNSPEC,
-+						    AVAHI_PROTO_UNSPEC,
-+						    0, name, regtype_copy,
-+						    NULL, NULL,
-+						    DNSSDPort,
-+						    ipp_txt);
-+      }
-+      else
-+      {
-+       /*
-+	* Sub-type entry.
-+	*/
-+
-+	snprintf (fullsubtype, sizeof(fullsubtype),
-+		  "%s._sub.%s", subtype, regtype_copy);
-+	cupsdLogMessage (CUPSD_LOG_DEBUG,
-+			 "Adding TXT record for %s (%s)", name, fullsubtype);
-+	ret = avahi_entry_group_add_service_subtype (p->avahi_group,
-+						     AVAHI_IF_UNSPEC,
-+						     AVAHI_PROTO_UNSPEC,
-+						     0, name,
-+						     regtype_copy,
-+						     NULL, fullsubtype);
-+      }
-+
-+      if (ret < 0)
-+      {
-+	free (regtype_copy);
-+	goto add_failed;
-+      }
-+
-+      subtype = nextsubtype;
-+    }
-+
-+    free (regtype_copy);
-+    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,
-+						  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);
-+      if (p->avahi_group)
-+      {
-+	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 */
- }
- 
- 
-@@ -2896,6 +3278,10 @@ dnssdStop(void)
- {
-   cupsd_printer_t	*p;		/* Current printer */
- 
-+#ifdef HAVE_DNSSD
-+  if (!DNSSDRef)
-+    return;
-+#endif /* HAVE_DNSSD */
- 
-  /*
-   * De-register the individual printers
-@@ -2910,12 +3296,23 @@ dnssdStop(void)
-   * Shutdown the rest of the service refs...
-   */
- 
-+#ifdef HAVE_DNSSD
-   if (WebIFRef)
-   {
-     DNSServiceRefDeallocate(WebIFRef);
-     WebIFRef = NULL;
-   }
-+#endif /* HAVE_DNSSD */
-+#ifdef HAVE_AVAHI
-+  if (AvahiWebIFGroup)
-+  {
-+    avahi_entry_group_reset (AvahiWebIFGroup);
-+    avahi_entry_group_free (AvahiWebIFGroup);
-+    AvahiWebIFGroup = NULL;
-+  }
-+#endif /* HAVE_AVAHI */
- 
-+#ifdef HAVE_DNSSD
-   if (RemoteRef)
-   {
-     DNSServiceRefDeallocate(RemoteRef);
-@@ -2926,14 +3323,17 @@ dnssdStop(void)
- 
-   DNSServiceRefDeallocate(DNSSDRef);
-   DNSSDRef = NULL;
-+#endif /* HAVE_DNSSD */
- 
-   cupsArrayDelete(DNSSDPrinters);
-   DNSSDPrinters = NULL;
- 
-   DNSSDPort = 0;
- }
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
- 
-+#ifdef HAVE_DNSSD
- /*
-  * 'dnssdUpdate()' - Handle DNS-SD queries.
-  */
-@@ -2955,6 +3355,153 @@ 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 - Number of items in table */
-+{
-+  AvahiStringList *strlst = NULL;
-+  char **elements;
-+  size_t len;
-+  int i = 0;
-+
-+  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;
-+    AvahiCupsClientConnecting = 0;
-+    cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client started");
-+
-+    cupsdUpdateDNSSDName ();
-+
-+    for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers);
-+	 printer;
-+	 printer = (cupsd_printer_t *)cupsArrayNext(Printers))
-+      if (Browsing && (BrowseLocalProtocols & BROWSE_DNSSD) &&
-+	  (!(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT |
-+			      CUPS_PRINTER_SCANNER))) && printer->shared)
-+	dnssdRegisterPrinter (printer);
-+
-+    break;
-+
-+  case AVAHI_CLIENT_CONNECTING:
-+   /*
-+    * No Avahi daemon, client is waiting.
-+    */
-+    cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client connecting");
-+    break;
-+
-+  case AVAHI_CLIENT_S_REGISTERING:
-+    /*
-+     * Not yet registered.
-+     */
-+    cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client registering");
-+    break;
-+
-+  case AVAHI_CLIENT_FAILURE:
-+   /*
-+    * Avahi client failed, close it to allow a clean restart.
-+    */
-+    cupsdLogMessage (CUPSD_LOG_ERROR,
-+		     "Avahi client failed, "
-+		     "closing client to allow a clean restart");
-+
-+    for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers);
-+	 printer;
-+	 printer = (cupsd_printer_t *)cupsArrayNext(Printers))
-+      dnssdDeregisterPrinter (printer);
-+
-+    avahi_client_free(client);
-+    AvahiCupsClientConnecting = 0;
-+    AvahiCupsClient = NULL;
-+
-+    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.5.2/scheduler/dirsvc.h.avahi-5-services cups-1.5.2/scheduler/dirsvc.h
---- cups-1.5.2/scheduler/dirsvc.h.avahi-5-services	2011-03-21 02:12:14.000000000 +0000
-+++ cups-1.5.2/scheduler/dirsvc.h	2012-03-14 15:08:25.711611808 +0000
-@@ -31,6 +31,10 @@
- #  endif /* HAVE_LDAP_SSL_H */
- #endif /* HAVE_LDAP */
- 
-+#ifdef HAVE_AVAHI
-+#  include <avahi-client/publish.h>
-+#endif /* HAVE_AVAHI */
-+
- /*
-  * Browse protocols...
-  */
-@@ -131,19 +135,22 @@ 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 char		*DNSSDComputerName VALUE(NULL),
- 					/* Computer/server name */
- 			*DNSSDHostName	VALUE(NULL),
- 					/* Hostname */
- 			*DNSSDRegType VALUE(NULL);
- 					/* Bonjour registration type */
--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 /* defined(HAVE_DNSSD) || defined(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),
-@@ -152,6 +159,17 @@ 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 int			AvahiCupsClientConnecting	VALUE(0);
-+					/* Is AvahiClient object connecting? */
-+VAR AvahiEntryGroup	*AvahiWebIFGroup	VALUE(NULL);
-+					/* Web interface entry group */
-+#endif /* HAVE_AVAHI */
-+
- #ifdef HAVE_LIBSLP
- VAR SLPHandle		BrowseSLPHandle	VALUE(NULL);
- 					/* SLP API handle */
-@@ -195,13 +213,14 @@ extern void	cupsdRegisterPrinter(cupsd_p
- extern void	cupsdRestartPolling(void);
- extern void	cupsdSaveRemoteCache(void);
- extern void	cupsdSendBrowseList(void);
-+extern void	cupsdStartAvahiClient(void);
- 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.5.2/scheduler/ipp.c.avahi-5-services cups-1.5.2/scheduler/ipp.c
---- cups-1.5.2/scheduler/ipp.c.avahi-5-services	2012-03-14 15:04:17.665305560 +0000
-+++ cups-1.5.2/scheduler/ipp.c	2012-03-14 15:08:25.715611813 +0000
-@@ -6099,7 +6099,7 @@ copy_printer_attrs(
-     ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time",
-                ippTimeToDate(curtime));
- 
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-   if (!ra || cupsArrayFind(ra, "printer-dns-sd-name"))
-   {
-     if (printer->reg_name)
-@@ -6109,7 +6109,7 @@ copy_printer_attrs(
-       ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE,
-                    "printer-dns-sd-name", 0);
-   }
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
-   if (!ra || cupsArrayFind(ra, "printer-error-policy"))
-     ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME,
-diff -up cups-1.5.2/scheduler/main.c.avahi-5-services cups-1.5.2/scheduler/main.c
---- cups-1.5.2/scheduler/main.c.avahi-5-services	2012-03-14 15:06:36.511476986 +0000
-+++ cups-1.5.2/scheduler/main.c	2012-03-14 15:08:25.718611817 +0000
-@@ -120,6 +120,10 @@ main(int  argc,				/* I - Number of comm
-   cupsd_listener_t	*lis;		/* Current listener */
-   time_t		current_time,	/* Current time */
- 			activity,	/* Client activity timer */
-+#ifdef HAVE_AVAHI
-+			avahi_client_time, /* Time for next Avahi client
-+					      check */
-+#endif /* HAVE_AVAHI */
- 			browse_time,	/* Next browse send time */
- 			senddoc_time,	/* Send-Document time */
- 			expire_time,	/* Subscription expire time */
-@@ -672,6 +676,9 @@ main(int  argc,				/* I - Number of comm
-   */
- 
-   current_time  = time(NULL);
-+#ifdef HAVE_AVAHI
-+  avahi_client_time = current_time;
-+#endif /* HAVE_AVAHI */
-   browse_time   = current_time;
-   event_time    = current_time;
-   expire_time   = current_time;
-@@ -894,6 +901,16 @@ main(int  argc,				/* I - Number of comm
-     tmo = cupsdNextTimeout (&tmo_delay);
-     if (tmo && tmo_delay == 0)
-       cupsdRunTimeout (tmo);
-+
-+   /*
-+    * Try to restart the Avahi client every 10 seconds if needed...
-+    */
-+
-+    if ((current_time - avahi_client_time) >= 10)
-+    {
-+      avahi_client_time = current_time;
-+      cupsdStartAvahiClient();
-+    }
- #endif /* HAVE_AVAHI */
- 
- #ifndef __APPLE__
-diff -up cups-1.5.2/scheduler/printers.c.avahi-5-services cups-1.5.2/scheduler/printers.c
---- cups-1.5.2/scheduler/printers.c.avahi-5-services	2012-03-14 15:04:17.646305537 +0000
-+++ cups-1.5.2/scheduler/printers.c	2012-03-14 15:08:25.720611819 +0000
-@@ -883,9 +883,9 @@ cupsdDeletePrinter(
-   cupsdClearString(&p->alert);
-   cupsdClearString(&p->alert_description);
- 
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-   cupsdClearString(&p->pdl);
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- 
-   cupsArrayDelete(p->filetypes);
- 
-@@ -3787,7 +3787,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 */
-@@ -3843,7 +3843,7 @@ add_printer_formats(cupsd_printer_t *p)
- 
-     cupsdSetString(&p->pdl, pdl);
-   }
--#endif /* HAVE_DNSSD */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
- }
- 
- 
-diff -up cups-1.5.2/scheduler/printers.h.avahi-5-services cups-1.5.2/scheduler/printers.h
---- cups-1.5.2/scheduler/printers.h.avahi-5-services	2011-03-18 18:42:46.000000000 +0000
-+++ cups-1.5.2/scheduler/printers.h	2012-03-14 15:08:25.721611820 +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>
- 
- 
-@@ -95,16 +98,23 @@ struct cupsd_printer_s
-   time_t	marker_time;		/* Last time marker attributes were updated */
-   _ppd_cache_t	*pc;			/* PPD cache and mapping data */
- 
--#ifdef HAVE_DNSSD
-+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-   char		*reg_name,		/* Name used for service registration */
--		*pdl,			/* pdl value for TXT record */
--		*ipp_txt,		/* IPP TXT record contents */
-+		*pdl;			/* pdl value for TXT record */
-+#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */
-+#ifdef HAVE_DNSSD
-+  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 */
- };
- 
- 
diff --git a/abs/extra/cups/cups-avahi-address.patch b/abs/extra/cups/cups-avahi-address.patch
new file mode 100644
index 0000000..a03d1ad
--- /dev/null
+++ b/abs/extra/cups/cups-avahi-address.patch
@@ -0,0 +1,75 @@
+diff -up cups-1.6.2/cups/http-support.c.avahi-address cups-1.6.2/cups/http-support.c
+--- cups-1.6.2/cups/http-support.c.avahi-address	2013-03-11 18:44:36.000000000 +0000
++++ cups-1.6.2/cups/http-support.c	2013-04-04 15:39:06.651847041 +0100
+@@ -2121,7 +2121,7 @@ http_resolve_cb(
+     const char             *type,	/* I - Registration type */
+     const char             *domain,	/* I - Domain (unused) */
+     const char             *hostTarget,	/* I - Hostname */
+-    const AvahiAddress     *address,	/* I - Address (unused) */
++    const AvahiAddress     *address,	/* I - Address */
+     uint16_t               port,	/* I - Port number */
+     AvahiStringList        *txt,	/* I - TXT record */
+     AvahiLookupResultFlags flags,	/* I - Lookup flags (unused) */
+@@ -2253,36 +2253,37 @@ http_resolve_cb(
+ 
+     DEBUG_printf(("8http_resolve_cb: Looking up \"%s\".", hostTarget));
+ 
+-    snprintf(fqdn, sizeof(fqdn), "%d", ntohs(port));
+-    if ((addrlist = httpAddrGetList(hostTarget, AF_UNSPEC, fqdn)) != NULL)
++    int error = getnameinfo(&(address->data),
++			    address->proto == AVAHI_PROTO_INET ?
++			    sizeof (AvahiIPv4Address) :
++			    (address->proto == AVAHI_PROTO_INET6 ?
++			     sizeof (AvahiIPv6Address) :
++			     sizeof (address->data)),
++			    fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
++
++    if (!error)
+     {
+-      for (addr = addrlist; addr; addr = addr->next)
++      DEBUG_printf(("8http_resolve_cb: Found \"%s\".", fqdn));
++
++      if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn ||
++	  _cups_strcasecmp(hostptr, ".local"))
+       {
+-        int error = getnameinfo(&(addr->addr.addr),
+-	                        httpAddrLength(&(addr->addr)),
+-			        fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
+-
+-        if (!error)
+-	{
+-	  DEBUG_printf(("8http_resolve_cb: Found \"%s\".", fqdn));
+-
+-	  if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn ||
+-	      _cups_strcasecmp(hostptr, ".local"))
+-	  {
+-	    hostTarget = fqdn;
+-	    break;
+-	  }
+-	}
++	hostTarget = fqdn;
++      }
++    }
+ #ifdef DEBUG
+-	else
+-	  DEBUG_printf(("8http_resolve_cb: \"%s\" did not resolve: %d",
+-	                httpAddrString(&(addr->addr), fqdn, sizeof(fqdn)),
+-			error));
++    else
++      DEBUG_printf(("8http_resolve_cb: \"%s\" did not resolve: %d",
++		    httpAddrString(&(addr->addr), fqdn, sizeof(fqdn)),
++		    error));
+ #endif /* DEBUG */
+-      }
++  } else {
++   /*
++    * Use the IP address that responded...
++    */
+ 
+-      httpAddrFreeList(addrlist);
+-    }
++   avahi_address_snprint (fqdn, sizeof (fqdn), address);
++   hostTarget = fqdn;
+   }
+ 
+  /*
diff --git a/abs/extra/cups/cups-enum-all.patch b/abs/extra/cups/cups-enum-all.patch
new file mode 100644
index 0000000..0ac3983
--- /dev/null
+++ b/abs/extra/cups/cups-enum-all.patch
@@ -0,0 +1,17 @@
+diff -up cups-1.6.2/cups/dest.c.enum-all cups-1.6.2/cups/dest.c
+--- cups-1.6.2/cups/dest.c.enum-all	2013-06-04 10:58:36.169786250 +0100
++++ cups-1.6.2/cups/dest.c	2013-06-04 10:59:02.147900811 +0100
+@@ -2724,9 +2724,12 @@ cups_dnssd_browse_cb(
+ 	break;
+ 
+     case AVAHI_BROWSER_REMOVE:
+-    case AVAHI_BROWSER_ALL_FOR_NOW:
+     case AVAHI_BROWSER_CACHE_EXHAUSTED:
+         break;
++
++    case AVAHI_BROWSER_ALL_FOR_NOW:
++	avahi_simple_poll_quit(data->simple_poll);
++        break;
+   }
+ }
+ 
diff --git a/abs/extra/cups/cups-final-content-type.patch b/abs/extra/cups/cups-final-content-type.patch
new file mode 100644
index 0000000..6ae4010
--- /dev/null
+++ b/abs/extra/cups/cups-final-content-type.patch
@@ -0,0 +1,18 @@
+diff -up cups-1.6.4/scheduler/job.c.final-content-type cups-1.6.4/scheduler/job.c
+--- cups-1.6.4/scheduler/job.c.final-content-type	2013-09-27 16:58:13.934775402 +0100
++++ cups-1.6.4/scheduler/job.c	2013-09-27 17:00:57.716549576 +0100
+@@ -692,12 +692,7 @@ cupsdContinueJob(cupsd_job_t *job)	/* I
+ 
+     if (!job->printer->remote)
+     {
+-      for (filter = (mime_filter_t *)cupsArrayLast(filters);
+-           filter && filter->dst;
+-           filter = (mime_filter_t *)cupsArrayPrev(filters))
+-        if (strcmp(filter->dst->super, "printer") ||
+-            strcmp(filter->dst->type, job->printer->name))
+-          break;
++      filter = (mime_filter_t *)cupsArrayLast(filters);
+ 
+       if (filter && filter->dst)
+       {
+
diff --git a/abs/extra/cups/cups-no-export-ssllibs.patch b/abs/extra/cups/cups-no-export-ssllibs.patch
index 9be3c81..e227bd1 100644
--- a/abs/extra/cups/cups-no-export-ssllibs.patch
+++ b/abs/extra/cups/cups-no-export-ssllibs.patch
@@ -1,7 +1,7 @@
 diff -up cups-1.5b1/config-scripts/cups-ssl.m4.no-export-ssllibs cups-1.5b1/config-scripts/cups-ssl.m4
---- cups-1.5b1/config-scripts/cups-ssl.m4.no-export-ssllibs	2011-05-11 02:52:08.000000000 +0200
-+++ cups-1.5b1/config-scripts/cups-ssl.m4	2011-05-23 17:47:27.000000000 +0200
-@@ -164,7 +164,7 @@ AC_SUBST(IPPALIASES)
+--- cups-1.6.2/config-scripts/cups-ssl.m4.no-export-ssllibs	2011-05-11 02:52:08.000000000 +0200
++++ cups-1.6.2/config-scripts/cups-ssl.m4	2011-05-23 17:47:27.000000000 +0200
+@@ -180,7 +180,7 @@
  AC_SUBST(SSLFLAGS)
  AC_SUBST(SSLLIBS)
  
@@ -9,4 +9,4 @@ diff -up cups-1.5b1/config-scripts/cups-ssl.m4.no-export-ssllibs cups-1.5b1/conf
 +EXPORT_SSLLIBS=""
  AC_SUBST(EXPORT_SSLLIBS)
  
- 
+ dnl
diff --git a/abs/extra/cups/cups-no-gcrypt.patch b/abs/extra/cups/cups-no-gcrypt.patch
index 42f71d0..4eaff67 100644
--- a/abs/extra/cups/cups-no-gcrypt.patch
+++ b/abs/extra/cups/cups-no-gcrypt.patch
@@ -9,12 +9,14 @@ diff -ruN cups-1.4.7.orig//config-scripts/cups-ssl.m4 cups-1.4.7/config-scripts/
  	if $PKGCONFIG --exists gnutls; then
  	    have_ssl=1
  	    SSLLIBS=`$PKGCONFIG --libs gnutls`
-@@ -110,16 +109,6 @@
- 	    AC_DEFINE(HAVE_SSL)
+@@ -108,18 +107,6 @@
  	    AC_DEFINE(HAVE_GNUTLS)
  	fi
--
+ 
 -	if test $have_ssl = 1; then
+-	    CUPS_SERVERCERT="ssl/server.crt"
+-	    CUPS_SERVERKEY="ssl/server.key"
+-
 -            if $PKGCONFIG --exists gcrypt; then
 -	        SSLLIBS="$SSLLIBS `$PKGCONFIG --libs gcrypt`"
 -	        SSLFLAGS="$SSLFLAGS `$PKGCONFIG --cflags gcrypt`"
diff --git a/abs/extra/cups/cups-no-gzip-man.patch b/abs/extra/cups/cups-no-gzip-man.patch
index 6786c44..69899b9 100644
--- a/abs/extra/cups/cups-no-gzip-man.patch
+++ b/abs/extra/cups/cups-no-gzip-man.patch
@@ -4,7 +4,7 @@ diff -up cups-1.5b1/config-scripts/cups-manpages.m4.no-gzip-man cups-1.5b1/confi
 @@ -69,10 +69,10 @@ case "$uname" in
  		;;
  	Linux* | GNU* | Darwin*)
- 		# Linux, GNU Hurd, and Mac OS X
+ 		# Linux, GNU Hurd, and OS X
 -		MAN1EXT=1.gz
 -		MAN5EXT=5.gz
 -		MAN7EXT=7.gz
diff --git a/abs/extra/cups/cups-no-gzip-man.patch.16 b/abs/extra/cups/cups-no-gzip-man.patch.16
deleted file mode 100644
index 69899b9..0000000
--- a/abs/extra/cups/cups-no-gzip-man.patch.16
+++ /dev/null
@@ -1,18 +0,0 @@
-diff -up cups-1.5b1/config-scripts/cups-manpages.m4.no-gzip-man cups-1.5b1/config-scripts/cups-manpages.m4
---- cups-1.5b1/config-scripts/cups-manpages.m4.no-gzip-man	2011-05-12 07:21:56.000000000 +0200
-+++ cups-1.5b1/config-scripts/cups-manpages.m4	2011-05-23 17:25:50.000000000 +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 --git a/abs/extra/cups/cups-res_init.patch b/abs/extra/cups/cups-res_init.patch
new file mode 100644
index 0000000..94a81a4
--- /dev/null
+++ b/abs/extra/cups/cups-res_init.patch
@@ -0,0 +1,26 @@
+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 --git a/abs/extra/cups/cups-systemd-socket.patch b/abs/extra/cups/cups-systemd-socket.patch
index 09d17d4..ad13a6d 100644
--- a/abs/extra/cups/cups-systemd-socket.patch
+++ b/abs/extra/cups/cups-systemd-socket.patch
@@ -1,7 +1,7 @@
-diff -up cups-1.5.2/config.h.in.systemd-socket cups-1.5.2/config.h.in
---- cups-1.5.2/config.h.in.systemd-socket	2012-03-16 14:50:57.089449755 +0000
-+++ cups-1.5.2/config.h.in	2012-03-16 14:50:57.146449787 +0000
-@@ -503,6 +503,13 @@
+diff -up cups-1.7rc1/config.h.in.systemd-socket cups-1.7rc1/config.h.in
+--- cups-1.7rc1/config.h.in.systemd-socket	2013-05-29 13:51:34.000000000 +0200
++++ cups-1.7rc1/config.h.in	2013-07-12 11:16:53.257546263 +0200
+@@ -451,6 +451,13 @@
  
  
  /*
@@ -15,9 +15,9 @@ diff -up cups-1.5.2/config.h.in.systemd-socket cups-1.5.2/config.h.in
   * Various scripting languages...
   */
  
-diff -up cups-1.5.2/config-scripts/cups-systemd.m4.systemd-socket cups-1.5.2/config-scripts/cups-systemd.m4
---- cups-1.5.2/config-scripts/cups-systemd.m4.systemd-socket	2012-03-16 14:50:57.146449787 +0000
-+++ cups-1.5.2/config-scripts/cups-systemd.m4	2012-03-16 14:50:57.146449787 +0000
+diff -up cups-1.7rc1/config-scripts/cups-systemd.m4.systemd-socket cups-1.7rc1/config-scripts/cups-systemd.m4
+--- cups-1.7rc1/config-scripts/cups-systemd.m4.systemd-socket	2013-07-12 11:16:53.257546263 +0200
++++ cups-1.7rc1/config-scripts/cups-systemd.m4	2013-07-12 11:16:53.257546263 +0200
 @@ -0,0 +1,36 @@
 +dnl
 +dnl "$Id$"
@@ -55,31 +55,31 @@ diff -up cups-1.5.2/config-scripts/cups-systemd.m4.systemd-socket cups-1.5.2/con
 +dnl
 +dnl "$Id$"
 +dnl
-diff -up cups-1.5.2/configure.in.systemd-socket cups-1.5.2/configure.in
---- cups-1.5.2/configure.in.systemd-socket	2011-08-31 02:36:33.000000000 +0100
-+++ cups-1.5.2/configure.in	2012-03-16 14:50:57.146449787 +0000
-@@ -37,6 +37,7 @@ sinclude(config-scripts/cups-pam.m4)
+diff -up cups-1.7rc1/configure.in.systemd-socket cups-1.7rc1/configure.in
+--- cups-1.7rc1/configure.in.systemd-socket	2013-07-08 23:15:13.000000000 +0200
++++ cups-1.7rc1/configure.in	2013-07-12 11:16:53.257546263 +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-pdf.m4)
  sinclude(config-scripts/cups-scripting.m4)
-@@ -71,6 +72,9 @@ AC_OUTPUT(Makedefs
+ 
+@@ -67,6 +68,9 @@ AC_OUTPUT(Makedefs
  	  conf/snmp.conf
  	  cups-config
  	  data/testprint
-+          data/cups.service
-+          data/cups.socket
-+          data/cups.path
++	  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
- 	  doc/help/standard.html
-diff -up cups-1.5.2/cups/usersys.c.systemd-socket cups-1.5.2/cups/usersys.c
---- cups-1.5.2/cups/usersys.c.systemd-socket	2012-03-16 14:50:57.054449734 +0000
-+++ cups-1.5.2/cups/usersys.c	2012-03-16 14:50:57.148449788 +0000
-@@ -778,7 +778,7 @@ cups_read_client_conf(
+diff -up cups-1.7rc1/cups/usersys.c.systemd-socket cups-1.7rc1/cups/usersys.c
+--- cups-1.7rc1/cups/usersys.c.systemd-socket	2013-07-10 16:08:39.000000000 +0200
++++ cups-1.7rc1/cups/usersys.c	2013-07-12 11:16:53.258546249 +0200
+@@ -1046,7 +1046,7 @@ cups_read_client_conf(
      struct stat	sockinfo;		/* Domain socket information */
  
      if (!stat(CUPS_DEFAULT_DOMAINSOCKET, &sockinfo) &&
@@ -88,9 +88,9 @@ diff -up cups-1.5.2/cups/usersys.c.systemd-socket cups-1.5.2/cups/usersys.c
        cups_server = CUPS_DEFAULT_DOMAINSOCKET;
      else
  #endif /* CUPS_DEFAULT_DOMAINSOCKET */
-diff -up cups-1.5.2/data/cups.path.in.systemd-socket cups-1.5.2/data/cups.path.in
---- cups-1.5.2/data/cups.path.in.systemd-socket	2012-03-16 14:50:57.148449788 +0000
-+++ cups-1.5.2/data/cups.path.in	2012-03-16 14:50:57.148449788 +0000
+diff -up cups-1.7rc1/data/cups.path.in.systemd-socket cups-1.7rc1/data/cups.path.in
+--- cups-1.7rc1/data/cups.path.in.systemd-socket	2013-07-12 11:16:53.258546249 +0200
++++ cups-1.7rc1/data/cups.path.in	2013-07-12 11:16:53.258546249 +0200
 @@ -0,0 +1,8 @@
 +[Unit]
 +Description=CUPS Printer Service Spool
@@ -100,9 +100,9 @@ diff -up cups-1.5.2/data/cups.path.in.systemd-socket cups-1.5.2/data/cups.path.i
 +
 +[Install]
 +WantedBy=multi-user.target
-diff -up cups-1.5.2/data/cups.service.in.systemd-socket cups-1.5.2/data/cups.service.in
---- cups-1.5.2/data/cups.service.in.systemd-socket	2012-03-16 14:50:57.149449788 +0000
-+++ cups-1.5.2/data/cups.service.in	2012-03-16 14:50:57.149449788 +0000
+diff -up cups-1.7rc1/data/cups.service.in.systemd-socket cups-1.7rc1/data/cups.service.in
+--- cups-1.7rc1/data/cups.service.in.systemd-socket	2013-07-12 11:16:53.258546249 +0200
++++ cups-1.7rc1/data/cups.service.in	2013-07-12 11:16:53.258546249 +0200
 @@ -0,0 +1,10 @@
 +[Unit]
 +Description=CUPS Printing Service
@@ -114,25 +114,24 @@ diff -up cups-1.5.2/data/cups.service.in.systemd-socket cups-1.5.2/data/cups.ser
 +[Install]
 +Also=cups.socket cups.path
 +WantedBy=printer.target
-diff -up cups-1.5.2/data/cups.socket.in.systemd-socket cups-1.5.2/data/cups.socket.in
---- cups-1.5.2/data/cups.socket.in.systemd-socket	2012-03-16 14:50:57.150449788 +0000
-+++ cups-1.5.2/data/cups.socket.in	2012-03-16 14:50:57.150449788 +0000
-@@ -0,0 +1,11 @@
+diff -up cups-1.7rc1/data/cups.socket.in.systemd-socket cups-1.7rc1/data/cups.socket.in
+--- cups-1.7rc1/data/cups.socket.in.systemd-socket	2013-07-12 11:16:53.259546235 +0200
++++ cups-1.7rc1/data/cups.socket.in	2013-07-12 11:16:53.259546235 +0200
+@@ -0,0 +1,10 @@
 +[Unit]
 +Description=CUPS Printing Service Sockets
 +
 +[Socket]
 +ListenStream=@CUPS_DEFAULT_DOMAINSOCKET@
-+ListenStream=631
-+ListenDatagram=0.0.0.0:631
++ListenStream=@DEFAULT_IPP_PORT@
 +BindIPv6Only=ipv6-only
 +
 +[Install]
 +WantedBy=sockets.target
-diff -up cups-1.5.2/data/Makefile.systemd-socket cups-1.5.2/data/Makefile
---- cups-1.5.2/data/Makefile.systemd-socket	2011-05-12 06:21:56.000000000 +0100
-+++ cups-1.5.2/data/Makefile	2012-03-16 14:50:57.151449789 +0000
-@@ -112,6 +112,12 @@ install-data:
+diff -up cups-1.7rc1/data/Makefile.systemd-socket cups-1.7rc1/data/Makefile
+--- cups-1.7rc1/data/Makefile.systemd-socket	2013-05-29 13:51:34.000000000 +0200
++++ cups-1.7rc1/data/Makefile	2013-07-12 11:16:53.259546235 +0200
+@@ -100,6 +100,12 @@ install-data:
  		$(INSTALL_DATA) $$file $(DATADIR)/ppdc; \
  	done
  	$(INSTALL_DIR) -m 755 $(DATADIR)/profiles
@@ -145,8 +144,8 @@ diff -up cups-1.5.2/data/Makefile.systemd-socket cups-1.5.2/data/Makefile
  
  
  #
-@@ -159,6 +165,9 @@ uninstall:
- 	-$(RMDIR) $(DATADIR)/charsets
+@@ -143,6 +149,9 @@ uninstall:
+ 	-$(RMDIR) $(DATADIR)/data
  	-$(RMDIR) $(DATADIR)/banners
  	-$(RMDIR) $(DATADIR)
 +	for file in $(SYSTEMD_UNITS); do \
@@ -155,10 +154,10 @@ diff -up cups-1.5.2/data/Makefile.systemd-socket cups-1.5.2/data/Makefile
  
  
  #
-diff -up cups-1.5.2/Makedefs.in.systemd-socket cups-1.5.2/Makedefs.in
---- cups-1.5.2/Makedefs.in.systemd-socket	2012-03-16 14:50:57.081449751 +0000
-+++ cups-1.5.2/Makedefs.in	2012-03-16 14:50:57.152449790 +0000
-@@ -143,6 +143,7 @@ CXXFLAGS	=	@CPPFLAGS@ @CXXFLAGS@
+diff -up cups-1.7rc1/Makedefs.in.systemd-socket cups-1.7rc1/Makedefs.in
+--- cups-1.7rc1/Makedefs.in.systemd-socket	2013-07-12 11:16:53.246546416 +0200
++++ cups-1.7rc1/Makedefs.in	2013-07-12 11:17:49.327768742 +0200
+@@ -134,6 +134,7 @@ CXXFLAGS	=	@CPPFLAGS@ @CXXFLAGS@
  CXXLIBS		=	@CXXLIBS@
  DBUS_NOTIFIER	=	@DBUS_NOTIFIER@
  DBUS_NOTIFIERLIBS =	@DBUS_NOTIFIERLIBS@
@@ -166,15 +165,15 @@ diff -up cups-1.5.2/Makedefs.in.systemd-socket cups-1.5.2/Makedefs.in
  DNSSD_BACKEND	=	@DNSSD_BACKEND@
  DSOFLAGS	=	-L../cups @DSOFLAGS@
  DSOLIBS		=	@DSOLIBS@ $(COMMONLIBS)
-@@ -151,6 +152,7 @@ FONTS		=	@FONTS@
- IMGLIBS		=	@IMGLIBS@
- IMGFILTERS	=	@IMGFILTERS@
+@@ -141,6 +142,7 @@ DNSSDLIBS	=	@DNSSDLIBS@
+ 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)
-@@ -267,6 +269,7 @@ PAMFILE		=	@PAMFILE@
+@@ -231,6 +233,7 @@ PAMFILE		=	@PAMFILE@
  
  DEFAULT_LAUNCHD_CONF =	@DEFAULT_LAUNCHD_CONF@
  DBUSDIR		=	@DBUSDIR@
@@ -182,10 +181,10 @@ diff -up cups-1.5.2/Makedefs.in.systemd-socket cups-1.5.2/Makedefs.in
  
  
  #
-diff -up cups-1.5.2/scheduler/client.h.systemd-socket cups-1.5.2/scheduler/client.h
---- cups-1.5.2/scheduler/client.h.systemd-socket	2011-03-25 21:25:38.000000000 +0000
-+++ cups-1.5.2/scheduler/client.h	2012-03-16 14:50:57.153449791 +0000
-@@ -75,6 +75,9 @@ typedef struct
+diff -up cups-1.7rc1/scheduler/client.h.systemd-socket cups-1.7rc1/scheduler/client.h
+--- cups-1.7rc1/scheduler/client.h.systemd-socket	2013-05-29 13:51:34.000000000 +0200
++++ cups-1.7rc1/scheduler/client.h	2013-07-12 11:16:53.260546222 +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... */
@@ -195,99 +194,9 @@ diff -up cups-1.5.2/scheduler/client.h.systemd-socket cups-1.5.2/scheduler/clien
  } cupsd_listener_t;
  
  
-diff -up cups-1.5.2/scheduler/dirsvc.c.systemd-socket cups-1.5.2/scheduler/dirsvc.c
---- cups-1.5.2/scheduler/dirsvc.c.systemd-socket	2012-03-16 14:50:57.112449768 +0000
-+++ cups-1.5.2/scheduler/dirsvc.c	2012-03-16 14:50:57.155449792 +0000
-@@ -1512,7 +1512,7 @@ cupsdStartBrowsing(void)
-       }
-     }
- 
--    if (BrowseSocket >= 0)
-+    if (BrowseSocket >= 0 && !BrowseSocketIsSystemd)
-     {
-      /*
-       * Bind the socket to browse port...
-@@ -1556,13 +1556,17 @@ cupsdStartBrowsing(void)
- 	cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to set broadcast mode - %s.",
- 			strerror(errno));
- 
-+	if (!BrowseSocketIsSystemd)
-+	{
- #ifdef WIN32
--	closesocket(BrowseSocket);
-+	  closesocket(BrowseSocket);
- #else
--	close(BrowseSocket);
-+	  close(BrowseSocket);
- #endif /* WIN32 */
- 
--	BrowseSocket = -1;
-+	  BrowseSocket = -1;
-+	}
-+
- 	BrowseLocalProtocols &= ~BROWSE_CUPS;
- 	BrowseRemoteProtocols &= ~BROWSE_CUPS;
- 
-@@ -1885,15 +1889,22 @@ cupsdStopBrowsing(void)
-   if (((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_CUPS) &&
-       BrowseSocket >= 0)
-   {
--   /*
--    * Close the socket and remove it from the input selection set.
--    */
-+    if (!BrowseSocketIsSystemd)
-+    {
-+     /*
-+      * Close the socket.
-+      */
- 
- #ifdef WIN32
--    closesocket(BrowseSocket);
-+      closesocket(BrowseSocket);
- #else
--    close(BrowseSocket);
-+      close(BrowseSocket);
- #endif /* WIN32 */
-+    }
-+
-+   /*
-+    * Remove it from the input selection set.
-+    */
- 
-     cupsdRemoveSelect(BrowseSocket);
-     BrowseSocket = -1;
-@@ -5693,11 +5704,14 @@ update_cups_browse(void)
-                       strerror(errno));
-       cupsdLogMessage(CUPSD_LOG_ERROR, "CUPS browsing turned off.");
- 
-+      if (!BrowseSocketIsSystemd)
-+      {
- #ifdef WIN32
--      closesocket(BrowseSocket);
-+	closesocket(BrowseSocket);
- #else
--      close(BrowseSocket);
-+	close(BrowseSocket);
- #endif /* WIN32 */
-+      }
- 
-       cupsdRemoveSelect(BrowseSocket);
-       BrowseSocket = -1;
-diff -up cups-1.5.2/scheduler/dirsvc.h.systemd-socket cups-1.5.2/scheduler/dirsvc.h
---- cups-1.5.2/scheduler/dirsvc.h.systemd-socket	2012-03-16 14:50:57.113449769 +0000
-+++ cups-1.5.2/scheduler/dirsvc.h	2012-03-16 14:50:57.157449792 +0000
-@@ -100,6 +100,8 @@ VAR int			Browsing	VALUE(TRUE),
- 					/* Short names for remote printers? */
- 			BrowseSocket	VALUE(-1),
- 					/* Socket for browsing */
-+			BrowseSocketIsSystemd	VALUE(0),
-+					/* BrowseSocket is systemd-provided? */
- 			BrowsePort	VALUE(IPP_PORT),
- 					/* Port number for broadcasts */
- 			BrowseInterval	VALUE(DEFAULT_INTERVAL),
-diff -up cups-1.5.2/scheduler/listen.c.systemd-socket cups-1.5.2/scheduler/listen.c
---- cups-1.5.2/scheduler/listen.c.systemd-socket	2011-04-16 00:38:13.000000000 +0100
-+++ cups-1.5.2/scheduler/listen.c	2012-03-16 14:50:57.158449792 +0000
+diff -up cups-1.7rc1/scheduler/listen.c.systemd-socket cups-1.7rc1/scheduler/listen.c
+--- cups-1.7rc1/scheduler/listen.c.systemd-socket	2013-05-29 13:51:34.000000000 +0200
++++ cups-1.7rc1/scheduler/listen.c	2013-07-12 11:16:53.260546222 +0200
 @@ -401,7 +401,11 @@ cupsdStopListening(void)
         lis;
         lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
@@ -301,9 +210,9 @@ diff -up cups-1.5.2/scheduler/listen.c.systemd-socket cups-1.5.2/scheduler/liste
      {
  #ifdef WIN32
        closesocket(lis->fd);
-diff -up cups-1.5.2/scheduler/main.c.systemd-socket cups-1.5.2/scheduler/main.c
---- cups-1.5.2/scheduler/main.c.systemd-socket	2012-03-16 14:50:57.121449773 +0000
-+++ cups-1.5.2/scheduler/main.c	2012-03-16 14:51:55.409483636 +0000
+diff -up cups-1.7rc1/scheduler/main.c.systemd-socket cups-1.7rc1/scheduler/main.c
+--- cups-1.7rc1/scheduler/main.c.systemd-socket	2013-07-12 11:16:53.212546887 +0200
++++ cups-1.7rc1/scheduler/main.c	2013-07-12 11:16:53.261546208 +0200
 @@ -26,6 +26,8 @@
   *   launchd_checkin()     - Check-in with launchd and collect the listening
   *                           fds.
@@ -324,7 +233,7 @@ diff -up cups-1.5.2/scheduler/main.c.systemd-socket cups-1.5.2/scheduler/main.c
  #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
  #  include <malloc.h>
  #endif /* HAVE_MALLOC_H && HAVE_MALLINFO */
-@@ -78,6 +84,9 @@
+@@ -83,6 +89,9 @@
  static void		launchd_checkin(void);
  static void		launchd_checkout(void);
  #endif /* HAVE_LAUNCHD */
@@ -334,7 +243,7 @@ diff -up cups-1.5.2/scheduler/main.c.systemd-socket cups-1.5.2/scheduler/main.c
  static void		parent_handler(int sig);
  static void		process_children(void);
  static void		sigchld_handler(int sig);
-@@ -537,6 +546,13 @@ main(int  argc,				/* I - Number of comm
+@@ -574,6 +583,13 @@ main(int  argc,				/* I - Number of comm
    }
  #endif /* HAVE_LAUNCHD */
  
@@ -348,7 +257,7 @@ diff -up cups-1.5.2/scheduler/main.c.systemd-socket cups-1.5.2/scheduler/main.c
   /*
    * Startup the server...
    */
-@@ -759,6 +775,15 @@ main(int  argc,				/* I - Number of comm
+@@ -762,6 +778,15 @@ main(int  argc,				/* I - Number of comm
  	}
  #endif /* HAVE_LAUNCHD */
  
@@ -364,7 +273,7 @@ diff -up cups-1.5.2/scheduler/main.c.systemd-socket cups-1.5.2/scheduler/main.c
         /*
          * Startup the server...
          */
-@@ -1584,6 +1609,139 @@ launchd_checkout(void)
+@@ -1511,6 +1536,102 @@ launchd_checkout(void)
  }
  #endif /* HAVE_LAUNCHD */
  
@@ -406,43 +315,6 @@ diff -up cups-1.5.2/scheduler/main.c.systemd-socket cups-1.5.2/scheduler/main.c
 +
 +    if (!r)
 +    {
-+      if (Browsing &&
-+	  ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_CUPS))
-+      {
-+	r = sd_is_socket(fd, AF_UNSPEC, SOCK_DGRAM, 0);
-+	if (r < 0)
-+	{
-+	  cupsdLogMessage(CUPSD_LOG_ERROR,
-+			  "systemd_checkin: Unable to verify socket type - %s",
-+			  strerror(-r));
-+	  continue;
-+	}
-+
-+	if (r)
-+	{
-+	 /*
-+	  * This is the browse socket.
-+	  */
-+
-+	  char addrstr[256];
-+	  if (getsockname(fd, (struct sockaddr*) &addr, &addrlen))
-+	  {
-+	    cupsdLogMessage(CUPSD_LOG_ERROR,
-+			    "systemd_checkin: Unable to get local address - %s",
-+			    strerror(errno));
-+	    continue;
-+	  }
-+
-+	  httpAddrString (&addr, addrstr, sizeof (addrstr));
-+	  BrowseSocket = fd;
-+	  BrowseSocketIsSystemd = 1;
-+	  cupsdLogMessage(CUPSD_LOG_DEBUG,
-+			  "systemd_checkin: Matched browse (port %d) with fd %d:%s...",
-+			  BrowsePort, fd, addrstr);
-+	  continue;
-+	}
-+
-+      }
 +      cupsdLogMessage(CUPSD_LOG_ERROR,
 +             "systemd_checkin: Socket not of the right type");
 +      continue;
@@ -504,10 +376,10 @@ diff -up cups-1.5.2/scheduler/main.c.systemd-socket cups-1.5.2/scheduler/main.c
  
  /*
   * 'parent_handler()' - Catch USR1/CHLD signals...
-diff -up cups-1.5.2/scheduler/Makefile.systemd-socket cups-1.5.2/scheduler/Makefile
---- cups-1.5.2/scheduler/Makefile.systemd-socket	2012-03-16 14:50:57.130449778 +0000
-+++ cups-1.5.2/scheduler/Makefile	2012-03-16 14:50:57.160449794 +0000
-@@ -382,7 +382,7 @@ cupsd:	$(CUPSDOBJS) $(LIBCUPSMIME) ../cu
+diff -up cups-1.7rc1/scheduler/Makefile.systemd-socket cups-1.7rc1/scheduler/Makefile
+--- cups-1.7rc1/scheduler/Makefile.systemd-socket	2013-05-29 13:51:34.000000000 +0200
++++ cups-1.7rc1/scheduler/Makefile	2013-07-12 11:16:53.261546208 +0200
+@@ -381,7 +381,7 @@ cupsd:	$(CUPSDOBJS) $(LIBCUPSMIME) ../cu
  	$(CC) $(LDFLAGS) -o cupsd $(CUPSDOBJS) -L. -lcupsmime \
  		$(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
  		$(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBS) \
@@ -516,12 +388,12 @@ diff -up cups-1.5.2/scheduler/Makefile.systemd-socket cups-1.5.2/scheduler/Makef
  
  cupsd-static:	$(CUPSDOBJS) libcupsmime.a ../cups/$(LIBCUPSSTATIC)
  	echo Linking $@...
-@@ -390,7 +390,7 @@ cupsd-static:	$(CUPSDOBJS) libcupsmime.a
+@@ -389,7 +389,7 @@ cupsd-static:	$(CUPSDOBJS) libcupsmime.a
  		$(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
  		../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(LIBPAPER) \
  		$(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBGSSAPI) \
 -		$(LIBWRAP)
-+		$(LIBWRAP) $(SDLIBS)
++		$(LIBWRAP)  $(SDLIBS)
  
+ tls.o:	tls-darwin.c tls-gnutls.c tls-openssl.c
  
- #
diff --git a/abs/extra/cups/cups.install b/abs/extra/cups/cups.install
index 47c3d9b..121eeb0 100644
--- a/abs/extra/cups/cups.install
+++ b/abs/extra/cups/cups.install
@@ -1,6 +1,6 @@
 post_install() {
     if [ -x usr/bin/xdg-icon-resource ]; then
-	xdg-icon-resource forceupdate --theme hicolor 2> /dev/null
+      xdg-icon-resource forceupdate --theme hicolor 2> /dev/null
     fi
  echo ">> If you use an HTTPS connection to CUPS, the first time you access"
  echo ">> the interface it may take a very long time before the site comes up."
@@ -10,17 +10,26 @@ post_install() {
 
 post_upgrade() {
     if [ -x usr/bin/xdg-icon-resource ]; then
-	xdg-icon-resource forceupdate --theme hicolor 2> /dev/null
+      xdg-icon-resource forceupdate --theme hicolor 2> /dev/null
     fi
-  if [ "`vercmp $2 1.4.7-2`" -lt 0 ]; then
+  
+  if [ "`vercmp $2 1.6.0`" -lt 0 ]; then
     # important upgrade notice
-    echo "daemon script has been renamed to /etc/rc.d/cupsd"
-    echo "change your entry in  /etc/rc.conf"
+    echo "* avahi-daemon should now run before you start cupsd for"
+    echo "  printer Browsing support"
+    echo "* check your config with cupsd -t"
+    echo "  and fix all Browsing related settings"
+  fi
+
+  if [ "`vercmp $2 1.6.1-3`" -lt 0 ]; then
+    # important upgrade notice
+    echo "> It's now safe to load usblp kernel module."
+    echo "> There's no more need to blacklist it."
   fi
 }
 
 post_remove() {
     if [ -x usr/bin/xdg-icon-resource ]; then
-	xdg-icon-resource forceupdate --theme hicolor 2> /dev/null
+      xdg-icon-resource forceupdate --theme hicolor 2> /dev/null
     fi
 }
diff --git a/abs/extra/cups/cups.logrotate b/abs/extra/cups/cups.logrotate
deleted file mode 100644
index 9c49bbd..0000000
--- a/abs/extra/cups/cups.logrotate
+++ /dev/null
@@ -1,8 +0,0 @@
-/var/log/cups/*log {
-   missingok
-   notifempty
-   delaycompress
-   postrotate
-      /bin/kill -HUP `cat /var/run/cups.pid 2>/dev/null` 2>/dev/null || true
-   endscript
-}
diff --git a/abs/extra/cups/cupsd-no-crash-on-avahi-threaded-poll-shutdown.patch b/abs/extra/cups/cupsd-no-crash-on-avahi-threaded-poll-shutdown.patch
new file mode 100644
index 0000000..ee36936
--- /dev/null
+++ b/abs/extra/cups/cupsd-no-crash-on-avahi-threaded-poll-shutdown.patch
@@ -0,0 +1,19 @@
+Description: Fixed crash which sometimes happens on shutdown of the CUPS
+ daemon, caused by a wrong shutdown sequence for shutting down the Avahi
+ threaded poll.
+Author: Till Kamppeter <till.kamppeter@gmail.com>
+Bug-Upstream: http://cups.org/str.php?L4180
+Bug-Upstream: http://cups.org/str.php?L4213
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1034045
+Last-Updated: 2012-10-16
+
+--- a/scheduler/dirsvc.c
++++ b/scheduler/dirsvc.c
+@@ -1333,6 +1333,7 @@
+   DNSSDMaster = NULL;
+ 
+ #  else /* HAVE_AVAHI */
++  avahi_threaded_poll_stop(DNSSDMaster);
+   avahi_client_free(DNSSDClient);
+   DNSSDClient = NULL;
+ 
diff --git a/abs/extra/cups/get-ppd-file-for-statically-configured-ipp-shared-queues.patch b/abs/extra/cups/get-ppd-file-for-statically-configured-ipp-shared-queues.patch
new file mode 100644
index 0000000..ed132d7
--- /dev/null
+++ b/abs/extra/cups/get-ppd-file-for-statically-configured-ipp-shared-queues.patch
@@ -0,0 +1,31 @@
+Description: Applications could not get the PPD file for
+ statically-configured IPP-shared print queues
+Author: Till Kamppeter <till.kamppeter@gmail.com>
+Bug-Upstream: http://cups.org/str.php?L4178
+Last-Updated: 2012-09-19
+
+--- a/cups/util.c
++++ b/cups/util.c
+@@ -1731,6 +1731,22 @@
+ 
+       return (1);
+     }
++    else if (device_uri &&
++	     (!strncmp(device_uri, "ipp:", 4) != NULL ||
++	      !strncmp(device_uri, "ipps:", 5) != NULL))
++    {
++     /*
++      * Statically-configured IPP shared printer.
++      */
++
++      httpSeparateURI(HTTP_URI_CODING_ALL,
++                      device_uri,
++                      scheme, sizeof(scheme), username, sizeof(username),
++		      host, hostsize, port, resource, resourcesize);
++      ippDelete(response);
++
++      return (1);
++    }
+     else if ((attr = ippFindAttribute(response, "member-uris",
+                                       IPP_TAG_URI)) != NULL)
+     {
diff --git a/abs/extra/cups/ppd-poll-with-client-conf.patch b/abs/extra/cups/ppd-poll-with-client-conf.patch
new file mode 100644
index 0000000..8985fa3
--- /dev/null
+++ b/abs/extra/cups/ppd-poll-with-client-conf.patch
@@ -0,0 +1,23 @@
+Description: If an external server is used via client.conf and the DNS is inconsistent (ex: DNS gives "noname" for many IPs, reverse DNS gives one of these IPs for "noname") local PPDs can get polled for print queues instead of the PPDs of the external server
+Bug: http://www.cups.org/str.php?L2763
+
+--- a/cups/util.c
++++ b/cups/util.c
+@@ -1085,11 +1085,13 @@
+     http2 = http;
+   else if ((http2 = httpConnectEncrypt(hostname, port,
+                                        cupsEncryption())) == NULL)
+-  {
+-    DEBUG_puts("1cupsGetPPD3: Unable to connect to server");
++    if ((http2 = httpConnectEncrypt(http_hostname, http_port,
++				    cupsEncryption())) == NULL)
++    {
++      DEBUG_puts("1cupsGetPPD3: Unable to connect to server");
+ 
+-    return (HTTP_SERVICE_UNAVAILABLE);
+-  }
++      return (HTTP_SERVICE_UNAVAILABLE);
++    }
+ 
+  /*
+   * Get a temp file...
-- 
cgit v0.12

