diff --git a/hardware/component.xml b/hardware/component.xml
new file mode 100644
index 0000000000..3d5a2b3c2e
--- /dev/null
+++ b/hardware/component.xml
@@ -0,0 +1,3 @@
+
+ hardware
+
diff --git a/hardware/misc/component.xml b/hardware/misc/component.xml
new file mode 100644
index 0000000000..79c4d92674
--- /dev/null
+++ b/hardware/misc/component.xml
@@ -0,0 +1,3 @@
+
+ hardware.misc
+
diff --git a/hardware/misc/libmtdev/actions.py b/hardware/misc/libmtdev/actions.py
new file mode 100644
index 0000000000..02b1401a95
--- /dev/null
+++ b/hardware/misc/libmtdev/actions.py
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file http://www.gnu.org/licenses/gpl.txt
+
+from pisi.actionsapi import autotools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import get
+
+WorkDir = "mtdev-%s" % get.srcVERSION()
+
+def setup():
+ autotools.autoreconf('-vfi')
+ autotools.configure("--disable-static")
+
+def build():
+ autotools.make()
+
+def install():
+ autotools.rawInstall("DESTDIR=%s" % get.installDIR())
+
+ pisitools.dodoc("ChangeLog", "COPYING", "README")
diff --git a/hardware/misc/libmtdev/pspec.xml b/hardware/misc/libmtdev/pspec.xml
new file mode 100644
index 0000000000..85f68c1e03
--- /dev/null
+++ b/hardware/misc/libmtdev/pspec.xml
@@ -0,0 +1,75 @@
+
+
+
+
+ libmtdev
+ http://bitmath.org/code/mtdev
+
+ PisiLinux Community
+ admins@pisilinux.org
+
+ MIT
+ library
+ Multitouch Protocol Translation Library
+ The libmtdev is a stand-alone library which transforms all variants of kernel MT events to the slotted type B protocol.
+ http://bitmath.org/code/mtdev/mtdev-1.1.5.tar.gz
+
+
+
+ libmtdev
+
+ /usr/bin
+ /usr/lib
+ /usr/share/doc
+
+
+
+
+ libmtdev-devel
+ Development files of libmtdev
+
+ libmtdev
+
+
+ /usr/include
+ /usr/lib/pkgconfig
+
+
+
+
+ libmtdev-32bit
+ emul32
+ 32-bit shared libraries for libmtdev
+ emul32
+
+ libmtdev
+
+
+ /usr/lib32
+
+
+
+
+
+ 2014-05-16
+ 1.1.5
+ Version bump.
+ Kamil Atlı
+ suvarice@gmail.com
+
+
+ 2014-03-09
+ 1.1.3
+ Rebuild.
+ Kamil Atlı
+ suvarice@gmail.com
+
+
+ 2012-10-03
+ 1.1.3
+ First release
+ PisiLinux Community
+ admins@pisilinux.org
+
+
+
diff --git a/hardware/misc/libmtdev/translations.xml b/hardware/misc/libmtdev/translations.xml
new file mode 100644
index 0000000000..44798c7e42
--- /dev/null
+++ b/hardware/misc/libmtdev/translations.xml
@@ -0,0 +1,13 @@
+
+
+
+ libmtdev
+ Çoklu Dokunmatik Protokol Dönüşüm Kütüphanesi
+ Libmtdev kütüphanesi, kernel MT olaylarının tüm çeşitlerini slotlu B tipi protokole dönüştürür.
+
+
+
+ libmtdev-devel
+ Libmtdev için geliştirme dosyaları
+
+
diff --git a/hardware/printer/component.xml b/hardware/printer/component.xml
new file mode 100644
index 0000000000..42941e1597
--- /dev/null
+++ b/hardware/printer/component.xml
@@ -0,0 +1,3 @@
+
+ hardware.printer
+
diff --git a/hardware/printer/cups/actions.py b/hardware/printer/cups/actions.py
new file mode 100644
index 0000000000..1655420abc
--- /dev/null
+++ b/hardware/printer/cups/actions.py
@@ -0,0 +1,98 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file http://www.gnu.org/licenses/gpl.txt
+
+from pisi.actionsapi import get
+from pisi.actionsapi import autotools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import shelltools
+
+def setup():
+ #pisitools.flags.add("-fstack-protector-all", "-DLDAP_DEPRECATED=1")
+ pisitools.dosed("config-scripts/cups-sharedlibs.m4", "( -shared )", " -Wl,--as-needed\\1")
+
+ # For --enable-avahi
+ autotools.aclocal("-I config-scripts")
+ autotools.autoconf("-I config-scripts")
+
+ options = '--with-cups-user=lp \
+ --with-cups-group=lp \
+ --with-system-groups=lpadmin \
+ --with-docdir=/usr/share/cups/html \
+ --with-dbusdir=/etc/dbus-1 \
+ --with-optim="%s" \
+ --with-php=/usr/bin/php-cgi \
+ --with-cupsd-file-perm=0755 \
+ --with-log-file-perm=0600 \
+ --without-java \
+ --enable-acl \
+ --enable-ssl=yes \
+ --enable-libpaper \
+ --enable-libusb=yes \
+ --enable-debug \
+ --enable-avahi \
+ --enable-gssapi \
+ --enable-dbus \
+ --enable-pam=yes \
+ --enable-relro \
+ --enable-dnssd \
+ --enable-browsing \
+ --enable-threads \
+ --enable-raw-printing \
+ --disable-gnutls \
+ --disable-launchd \
+ --without-rcdir \
+ --libdir=/usr/lib \
+ --without-perl \
+ --with-logdir=/var/log/cups \
+ KRB5CONFIG=/usr/bin/krb5-config \
+ --localstatedir=/var \
+ --with-rundir=/run/cups \
+ --with-xinetd=/etc/xinetd.d \
+ ' % get.CFLAGS()
+
+ if get.buildTYPE() == "emul32":
+ options += ' \
+ --enable-libusb=no \
+ --disable-avahi \
+ --disable-dnssd \
+ --disable-gssapi \
+ --disable-dbus \
+ --bindir=/usr/bin32 \
+ --sbindir=/usr/sbin32 \
+ --libdir=/usr/lib32'
+
+ autotools.configure(options)
+
+def build():
+ autotools.make()
+
+#def check():
+ #autotools.make("check")
+
+def install():
+ if get.buildTYPE() == "emul32":
+ # SERVERBIN is hardcoded to /usr/lib/cups, thus it overwrites 64 bit libraries
+ autotools.rawInstall("BUILDROOT=%s SERVERBIN=%s/usr/serverbin32 install-libs" % (get.installDIR(), get.installDIR()))
+ pisitools.domove("/usr/bin32/cups-config", "/usr/bin", "cups-config-32bit")
+ pisitools.removeDir("/usr/bin32")
+ pisitools.removeDir("/usr/sbin32")
+ pisitools.removeDir("/usr/serverbin32")
+
+ # remove files now part of cups-filters
+ pisitools.remove("/usr/share/cups/data/testprint")
+ pisitools.removeDir("/usr/share/cups/banners")
+ pisitools.dodir("/usr/share/cups/banners")
+ return
+
+ autotools.rawInstall("BUILDROOT=%s install-headers install-libs install-data install-exec" % get.installDIR())
+ shelltools.chmod("%s/run/cups/certs" % get.installDIR(), 0755)
+
+ pisitools.dodir("/usr/share/cups/profiles")
+
+ # Serial backend needs to run as root
+ #shelltools.chmod("%s/usr/lib/cups/backend/serial" % get.installDIR(), 0700)
+
+ pisitools.dodoc("CHANGES.txt", "CREDITS.txt", "LICENSE.txt", "README.txt")
diff --git a/hardware/printer/cups/comar/package.py b/hardware/printer/cups/comar/package.py
new file mode 100644
index 0000000000..730d2b67da
--- /dev/null
+++ b/hardware/printer/cups/comar/package.py
@@ -0,0 +1,22 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import os
+import re
+
+ownerships = {
+ "/run/cups" : "root:lp",
+ "/var/log/cups" : "root:lp",
+ }
+
+CUPSD_CONFIG_FILE = "/etc/cups/cupsd.conf"
+
+def postInstall(fromVersion, fromRelease, toVersion, toRelease):
+ for directory,owners in ownerships.items():
+ if os.path.exists(directory):
+ os.system("chown %s %s" % (owners, directory))
+
+ # Replace possible pnpadmin leftover from cupsd.conf
+ if os.path.exists(CUPSD_CONFIG_FILE):
+ cupsd = open(CUPSD_CONFIG_FILE, "r").read()
+ open(CUPSD_CONFIG_FILE, "w").write(re.sub("pnpadmin", "lpadmin", cupsd))
diff --git a/hardware/printer/cups/comar/service.py b/hardware/printer/cups/comar/service.py
new file mode 100644
index 0000000000..cc3baf190b
--- /dev/null
+++ b/hardware/printer/cups/comar/service.py
@@ -0,0 +1,50 @@
+from comar.service import *
+import os
+
+serviceType = "server"
+serviceDefault = "on"
+serviceDesc = _({"en": "CUPS Printer Server",
+ "tr": "CUPS Yazıcı Sunucusu"})
+serviceConf = "cups"
+
+PIDFILE = "/run/cups/cupsd.pid"
+
+@synchronized
+def start():
+ # FIXME: After avahi before hal
+ startDependencies("avahi")
+
+ # Load ppdev and lp drivers if wanted
+ if config.get("LOAD_LP_MODULE") == "yes":
+ os.system("/sbin/modprobe -q lp")
+ os.system("/sbin/modprobe -q ppdev")
+
+ startService(command="/usr/sbin/cupsd",
+ donotify=True)
+ os.system("pidof -o %PPID /usr/sbin/cupsd > " + PIDFILE)
+
+ # Tell udevd to replay printer events
+ # One for low-level usb
+ os.system("udevadm trigger --subsystem-match=usb \
+ --attr-match=bInterfaceClass=07 \
+ --attr-match=bInterfaceSubClass=01 \
+ --action=add")
+ # One for usblp backend
+ os.system("udevadm trigger --subsystem-match=usb \
+ --property-match=DEVNAME=\"/dev/usb/lp*\" \
+ --action=add")
+
+
+@synchronized
+def reload():
+ if os.path.exists(PIDFILE):
+ # 1 is SIGHUP
+ os.kill(int(open(PIDFILE, "r").read().strip()), 1)
+
+@synchronized
+def stop():
+ stopService(pidfile=PIDFILE, donotify=True)
+ if os.path.isfile(PIDFILE): os.unlink(PIDFILE)
+
+def status():
+ return isServiceRunning(pidfile=PIDFILE)
diff --git a/hardware/printer/cups/files/archlinux/cups-1.6.2-statedir.patch b/hardware/printer/cups/files/archlinux/cups-1.6.2-statedir.patch
new file mode 100644
index 0000000000..8b16549815
--- /dev/null
+++ b/hardware/printer/cups/files/archlinux/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/hardware/printer/cups/files/archlinux/cups-no-export-ssllibs.patch b/hardware/printer/cups/files/archlinux/cups-no-export-ssllibs.patch
new file mode 100644
index 0000000000..e227bd1823
--- /dev/null
+++ b/hardware/printer/cups/files/archlinux/cups-no-export-ssllibs.patch
@@ -0,0 +1,12 @@
+diff -up cups-1.5b1/config-scripts/cups-ssl.m4.no-export-ssllibs cups-1.5b1/config-scripts/cups-ssl.m4
+--- 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)
+
+-EXPORT_SSLLIBS="$SSLLIBS"
++EXPORT_SSLLIBS=""
+ AC_SUBST(EXPORT_SSLLIBS)
+
+ dnl
diff --git a/hardware/printer/cups/files/archlinux/cups-no-gcrypt.patch b/hardware/printer/cups/files/archlinux/cups-no-gcrypt.patch
new file mode 100644
index 0000000000..481b1a7264
--- /dev/null
+++ b/hardware/printer/cups/files/archlinux/cups-no-gcrypt.patch
@@ -0,0 +1,11 @@
+diff -up cups-2.0rc1/config-scripts/cups-ssl.m4.no-gcry cups-2.0rc1/config-scripts/cups-ssl.m4
+--- cups-2.0rc1/config-scripts/cups-ssl.m4.no-gcry 2014-09-12 15:41:23.324760213 +0200
++++ cups-2.0rc1/config-scripts/cups-ssl.m4 2014-09-12 15:43:13.124203363 +0200
+@@ -60,7 +60,6 @@ if test x$enable_ssl != xno; then
+ dnl Then look for GNU TLS...
+ if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then
+ AC_PATH_TOOL(LIBGNUTLSCONFIG,libgnutls-config)
+- AC_PATH_TOOL(LIBGCRYPTCONFIG,libgcrypt-config)
+ if $PKGCONFIG --exists gnutls; then
+ have_ssl=1
+ SSLLIBS=`$PKGCONFIG --libs gnutls`
diff --git a/hardware/printer/cups/files/archlinux/cups-no-gzip-man.patch b/hardware/printer/cups/files/archlinux/cups-no-gzip-man.patch
new file mode 100644
index 0000000000..69899b9cb7
--- /dev/null
+++ b/hardware/printer/cups/files/archlinux/cups-no-gzip-man.patch
@@ -0,0 +1,18 @@
+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/hardware/printer/cups/files/cups.logrotate b/hardware/printer/cups/files/cups.logrotate
new file mode 100644
index 0000000000..773c70fd2a
--- /dev/null
+++ b/hardware/printer/cups/files/cups.logrotate
@@ -0,0 +1,5 @@
+/var/log/cups/*_log {
+ missingok
+ notifempty
+ sharedscripts
+}
diff --git a/hardware/printer/cups/files/debian/get-ppd-file-for-statically-configured-ipp-shared-queues.patch b/hardware/printer/cups/files/debian/get-ppd-file-for-statically-configured-ipp-shared-queues.patch
new file mode 100644
index 0000000000..ed132d7503
--- /dev/null
+++ b/hardware/printer/cups/files/debian/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
+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/hardware/printer/cups/files/fedora/cups-avahi-address.patch b/hardware/printer/cups/files/fedora/cups-avahi-address.patch
new file mode 100644
index 0000000000..308ee89335
--- /dev/null
+++ b/hardware/printer/cups/files/fedora/cups-avahi-address.patch
@@ -0,0 +1,95 @@
+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-06-28 13:42:15.834715511 +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) */
+@@ -2248,41 +2248,59 @@ http_resolve_cb(
+ * getting the IP address of the .local name and then do reverse-lookups...
+ */
+
+- http_addrlist_t *addrlist, /* List of addresses */
+- *addr; /* Current address */
++ http_addr_t addr;
++ size_t addrlen;
++ int error;
+
+ DEBUG_printf(("8http_resolve_cb: Looking up \"%s\".", hostTarget));
+
+- snprintf(fqdn, sizeof(fqdn), "%d", ntohs(port));
+- if ((addrlist = httpAddrGetList(hostTarget, AF_UNSPEC, fqdn)) != NULL)
++ switch (address->proto)
+ {
+- for (addr = addrlist; addr; addr = addr->next)
++ case AVAHI_PROTO_INET:
++ addr.ipv4.sin_family = AF_INET;
++ addrlen = sizeof (addr.ipv4.sin_addr);
++ memcpy (&addr.ipv4.sin_addr, &address->data, addrlen);
++ break;
++ case AVAHI_PROTO_INET6:
++ addr.ipv6.sin6_family = AF_INET6;
++ addrlen = sizeof (addr.ipv6.sin6_addr);
++ memcpy (&addr.ipv6.sin6_addr, &address->data, addrlen);
++ break;
++ default:
++ DEBUG_printf(("8http_resolve_cb: unknown address family %d",
++ address->proto));
++ addrlen = 0;
++ }
++
++ if (addrlen > 0) {
++ error = getnameinfo(&addr.addr, httpAddrLength (&addr),
++ fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
++
++ if (!error)
+ {
+- int error = getnameinfo(&(addr->addr.addr),
+- httpAddrLength(&(addr->addr)),
+- fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
++ DEBUG_printf(("8http_resolve_cb: Found \"%s\".", fqdn));
+
+- if (!error)
++ if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn ||
++ _cups_strcasecmp(hostptr, ".local"))
+ {
+- DEBUG_printf(("8http_resolve_cb: Found \"%s\".", fqdn));
+-
+- if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn ||
+- _cups_strcasecmp(hostptr, ".local"))
+- {
+- hostTarget = fqdn;
+- break;
+- }
++ hostTarget = fqdn;
+ }
++ } else {
++ avahi_address_snprint (fqdn, sizeof (fqdn), address);
++ hostTarget = fqdn;
+ #ifdef DEBUG
+- else
+- DEBUG_printf(("8http_resolve_cb: \"%s\" did not resolve: %d",
+- httpAddrString(&(addr->addr), fqdn, sizeof(fqdn)),
+- error));
++ DEBUG_printf(("8http_resolve_cb: \"%s\" did not resolve: %d",
++ fqdn, error));
+ #endif /* DEBUG */
+ }
+-
+- httpAddrFreeList(addrlist);
+ }
++ } else {
++ /*
++ * Use the IP address that responded...
++ */
++
++ avahi_address_snprint (fqdn, sizeof (fqdn), address);
++ hostTarget = fqdn;
+ }
+
+ /*
diff --git a/hardware/printer/cups/files/fedora/cups-enum-all.patch b/hardware/printer/cups/files/fedora/cups-enum-all.patch
new file mode 100644
index 0000000000..0ac39835ea
--- /dev/null
+++ b/hardware/printer/cups/files/fedora/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/hardware/printer/cups/files/fedora/cups-final-content-type.patch b/hardware/printer/cups/files/fedora/cups-final-content-type.patch
new file mode 100644
index 0000000000..7076e2b475
--- /dev/null
+++ b/hardware/printer/cups/files/fedora/cups-final-content-type.patch
@@ -0,0 +1,17 @@
+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/hardware/printer/cups/files/fedora/cups-res_init.patch b/hardware/printer/cups/files/fedora/cups-res_init.patch
new file mode 100644
index 0000000000..3866521d77
--- /dev/null
+++ b/hardware/printer/cups/files/fedora/cups-res_init.patch
@@ -0,0 +1,26 @@
+diff -up cups-1.7b1/cups/http-addr.c.res_init cups-1.7b1/cups/http-addr.c
+--- cups-1.7b1/cups/http-addr.c.res_init 2013-03-20 19:14:10.000000000 +0100
++++ cups-1.7b1/cups/http-addr.c 2013-04-19 12:01:36.927512159 +0200
+@@ -319,7 +319,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.7b1/cups/http-addrlist.c.res_init cups-1.7b1/cups/http-addrlist.c
+--- cups-1.7b1/cups/http-addrlist.c.res_init 2013-04-19 12:01:36.930512119 +0200
++++ cups-1.7b1/cups/http-addrlist.c 2013-04-19 12:03:13.769229554 +0200
+@@ -581,7 +581,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_STATUS_ERROR_INTERNAL, gai_strerror(error), 0);
diff --git a/hardware/printer/cups/files/fedora/textonly.ppd b/hardware/printer/cups/files/fedora/textonly.ppd
new file mode 100644
index 0000000000..89060bc51e
--- /dev/null
+++ b/hardware/printer/cups/files/fedora/textonly.ppd
@@ -0,0 +1,47 @@
+*PPD-Adobe: "4.3"
+*%
+*% Text-only printer definition
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "TEXTONLY.PPD"
+*Manufacturer: "Generic"
+*Product: "(Generic)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "text/plain 0 textonly"
+*ModelName: "Generic text-only printer"
+*ShortNickName: "Generic text-only printer"
+*NickName: "Generic text-only printer"
+*PSVersion: "(2017.000) 0"
+*LanguageLevel: "2"
+*ColorDevice: False
+*DefaultColorSpace: Gray
+*FileSystem: False
+*Throughput: "8"
+*LandscapeOrientation: Plus90
+*VariablePaperSize: False
+*TTRasterizer: Type42
+*DefaultImageableArea: Letter
+*ImageableArea Letter/US Letter: "18 36 594 756"
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*OpenUI *PageSize/Media Size: PickOne
+*OrderDependency: 10 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "<>setpagedevice"
+*CloseUI: *PageSize
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 10 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "<>setpagedevice"
+*CloseUI: *PageRegion
+
+*OpenUI *SendFF: Boolean
+*DefaultSendFF: False
+*SendFF True/True: ""
+*SendFF False/False: ""
+*CloseUI: *SendFF
diff --git a/hardware/printer/cups/files/gentoo/cups-1.6.0-fix-install-perms.patch b/hardware/printer/cups/files/gentoo/cups-1.6.0-fix-install-perms.patch
new file mode 100644
index 0000000000..2d7a77c44f
--- /dev/null
+++ b/hardware/printer/cups/files/gentoo/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/hardware/printer/cups/files/gentoo/cups-2.0.1-fix-compilation.patch b/hardware/printer/cups/files/gentoo/cups-2.0.1-fix-compilation.patch
new file mode 100644
index 0000000000..c805978221
--- /dev/null
+++ b/hardware/printer/cups/files/gentoo/cups-2.0.1-fix-compilation.patch
@@ -0,0 +1,25 @@
+From 7bb9184b40bea3c4b9f46362642e5d40053a3ae1 Mon Sep 17 00:00:00 2001
+From: Matthias Maier
+Date: Wed, 19 Nov 2014 18:44:33 +0100
+Subject: [PATCH] fix compilation
+
+---
+ test/ippserver.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/test/ippserver.c b/test/ippserver.c
+index c785e5f..1c64668 100644
+--- a/test/ippserver.c
++++ b/test/ippserver.c
+@@ -421,7 +421,7 @@ static int valid_job_attributes(_ipp_client_t *client);
+
+ # ifdef HAVE_DNSSD
+ static DNSServiceRef DNSSDMaster = NULL;
+-# else /* HAVE_AVAHI */
++# elif defined(HAVE_AVAHI)
+ static AvahiThreadedPoll *DNSSDMaster = NULL;
+ static AvahiClient *DNSSDClient = NULL;
+ # endif /* HAVE_DNSSD */
+--
+2.0.4
+
diff --git a/hardware/printer/cups/files/gentoo/cups-2.0.1-fix-linkage-to-gnutls.patch b/hardware/printer/cups/files/gentoo/cups-2.0.1-fix-linkage-to-gnutls.patch
new file mode 100644
index 0000000000..9714a742d7
--- /dev/null
+++ b/hardware/printer/cups/files/gentoo/cups-2.0.1-fix-linkage-to-gnutls.patch
@@ -0,0 +1,24 @@
+--- a/cups/usersys.c
++++ b/cups/usersys.c
+@@ -1044,7 +1044,9 @@
+ options = 0;
+ }
+
++#ifdef HAVE_SSL
+ _httpTLSSetOptions(options);
++#endif /* HAVE_SSL */
+ }
+ }
+
+--- a/scheduler/conf.c
++++ b/scheduler/conf.c
+@@ -2975,7 +2975,9 @@
+ }
+ }
+
++#ifdef HAVE_SSL
+ _httpTLSSetOptions(options);
++#endif /* HAVE_SSL */
+ }
+ else if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")
+ #ifdef HAVE_SSL
diff --git a/hardware/printer/cups/files/gentoo/cups-2.0.1-rename-systemd-service-files.patch b/hardware/printer/cups/files/gentoo/cups-2.0.1-rename-systemd-service-files.patch
new file mode 100644
index 0000000000..825d0de2e6
--- /dev/null
+++ b/hardware/printer/cups/files/gentoo/cups-2.0.1-rename-systemd-service-files.patch
@@ -0,0 +1,73 @@
+From 33e0d4c8e450fe69b195422c0880aaa96ca9478d Mon Sep 17 00:00:00 2001
+From: Matthias Maier
+Date: Wed, 19 Nov 2014 18:00:06 +0100
+Subject: [PATCH] change systemd service files to gentoo naming scheme
+
+---
+ scheduler/Makefile | 10 +++++-----
+ scheduler/org.cups.cupsd.path.in | 2 +-
+ scheduler/org.cups.cupsd.service.in | 2 +-
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/scheduler/Makefile b/scheduler/Makefile
+index 3e0884a..b354420 100644
+--- a/scheduler/Makefile
++++ b/scheduler/Makefile
+@@ -203,11 +203,11 @@ install-data:
+ if test "x$(SYSTEMD_DIR)" != x; then \
+ echo Installing systemd configuration files...; \
+ $(INSTALL_DIR) $(BUILDROOT)$(SYSTEMD_DIR); \
+- $(INSTALL_DATA) org.cups.cupsd.path $(BUILDROOT)$(SYSTEMD_DIR); \
+- $(INSTALL_DATA) org.cups.cupsd.service $(BUILDROOT)$(SYSTEMD_DIR); \
+- $(INSTALL_DATA) org.cups.cupsd.socket $(BUILDROOT)$(SYSTEMD_DIR); \
+- $(INSTALL_DATA) org.cups.cups-lpdAT.service $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cups-lpd@.service; \
+- $(INSTALL_DATA) org.cups.cups-lpd.socket $(BUILDROOT)$(SYSTEMD_DIR); \
++ $(INSTALL_DATA) org.cups.cupsd.path $(BUILDROOT)$(SYSTEMD_DIR)/cups.path; \
++ $(INSTALL_DATA) org.cups.cupsd.service $(BUILDROOT)$(SYSTEMD_DIR)/cups.service; \
++ $(INSTALL_DATA) org.cups.cupsd.socket $(BUILDROOT)$(SYSTEMD_DIR)/cups.socket; \
++ $(INSTALL_DATA) org.cups.cups-lpdAT.service $(BUILDROOT)$(SYSTEMD_DIR)/cups-lpd@.service; \
++ $(INSTALL_DATA) org.cups.cups-lpd.socket $(BUILDROOT)$(SYSTEMD_DIR)/cups-lpd.socket; \
+ elif test "x$(XINETD)" != x; then \
+ echo Installing xinetd configuration file for cups-lpd...; \
+ $(INSTALL_DIR) -m 755 $(BUILDROOT)$(XINETD); \
+diff --git a/scheduler/org.cups.cupsd.path.in b/scheduler/org.cups.cupsd.path.in
+index 1bccc6f..90c8576 100644
+--- a/scheduler/org.cups.cupsd.path.in
++++ b/scheduler/org.cups.cupsd.path.in
+@@ -2,7 +2,7 @@
+ Description=CUPS Scheduler
+
+ [Path]
+-PathExists=@CUPS_CACHEDIR@/org.cups.cupsd
++PathExists=@CUPS_CACHEDIR@/d*
+
+ [Install]
+ WantedBy=multi-user.target
+diff --git a/scheduler/org.cups.cupsd.service.in b/scheduler/org.cups.cupsd.service.in
+index 0a27c76..7a04248 100644
+--- a/scheduler/org.cups.cupsd.service.in
++++ b/scheduler/org.cups.cupsd.service.in
+@@ -7,5 +7,5 @@ ExecStart=@sbindir@/cupsd -l
+ Type=simple
+
+ [Install]
+-Also=org.cups.cupsd.socket org.cups.cupsd.path
++Also=cups.socket cups.path
+ WantedBy=printer.target
+diff --git a/scheduler/org.cups.cupsd.socket.in b/scheduler/org.cups.cupsd.socket.in
+--- a/scheduler/org.cups.cupsd.socket.in
++++ a/scheduler/org.cups.cupsd.socket.in
+@@ -3,6 +3,10 @@
+
+ [Socket]
+ ListenStream=@CUPS_DEFAULT_DOMAINSOCKET@
++ListenStream=[::1]:631
++ListenStream=127.0.0.1:631
++BindIPv6Only=ipv6-only
++ReusePort=true
+
+ [Install]
+ WantedBy=sockets.target
+--
+2.0.4
+
diff --git a/hardware/printer/cups/files/pisilinux/cups-run.patch b/hardware/printer/cups/files/pisilinux/cups-run.patch
new file mode 100644
index 0000000000..dbe6dd3416
--- /dev/null
+++ b/hardware/printer/cups/files/pisilinux/cups-run.patch
@@ -0,0 +1,48 @@
+diff -Nuar cups-1.6.1.orig/config.h.in cups-1.6.1/config.h.in
+--- cups-1.6.1.orig/config.h.in 2012-07-16 21:21:43.000000000 +0300
++++ cups-1.6.1/config.h.in 2013-03-13 18:46:13.805434622 +0200
+@@ -127,7 +127,7 @@
+ #define CUPS_SBINDIR "/usr/sbin"
+ #define CUPS_SERVERBIN "/usr/lib/cups"
+ #define CUPS_SERVERROOT "/etc/cups"
+-#define CUPS_STATEDIR "/var/run/cups"
++#define CUPS_STATEDIR "/run/cups"
+
+
+ /*
+diff -Nuar cups-1.6.1.orig/doc/help/security.html cups-1.6.1/doc/help/security.html
+--- cups-1.6.1.orig/doc/help/security.html 2011-04-29 00:20:12.000000000 +0300
++++ cups-1.6.1/doc/help/security.html 2013-03-13 18:45:47.222433880 +0200
+@@ -53,7 +53,7 @@
+ Local certificate authentication passes 128-bit
+ "certificates" that identify an authenticated user.
+ Certificates are created on-the-fly from random data and
+- stored in files under /var/run/cups/certs.
++ stored in files under /run/cups/certs.
+ They have restricted read permissions: root +
+ system-group(s) for the root certificate, and lp + lp
+ for CGI certificates.
+diff -Nuar cups-1.6.1.orig/scheduler/org.cups.cupsd.plist cups-1.6.1/scheduler/org.cups.cupsd.plist
+--- cups-1.6.1.orig/scheduler/org.cups.cupsd.plist 2011-04-20 21:15:44.000000000 +0300
++++ cups-1.6.1/scheduler/org.cups.cupsd.plist 2013-03-13 18:44:26.286431623 +0200
+@@ -54,7 +54,7 @@
+ SockPathMode
+ 49663
+ SockPathName
+- /private/var/run/cupsd
++ /run/cupsd
+
+
+
+diff -Nuar cups-1.6.1.orig/xcode/config.h cups-1.6.1/xcode/config.h
+--- cups-1.6.1.orig/xcode/config.h 2012-07-16 21:21:43.000000000 +0300
++++ cups-1.6.1/xcode/config.h 2013-03-13 18:43:13.618429596 +0200
+@@ -100,7 +100,7 @@
+ * Do we have domain socket support, and if so what is the default one?
+ */
+
+-#define CUPS_DEFAULT_DOMAINSOCKET "/private/var/run/cupsd"
++#define CUPS_DEFAULT_DOMAINSOCKET "/run/cupsd"
+
+
+ /*
diff --git a/hardware/printer/cups/files/pisilinux/lib64.patch b/hardware/printer/cups/files/pisilinux/lib64.patch
new file mode 100644
index 0000000000..bc7b4bae6f
--- /dev/null
+++ b/hardware/printer/cups/files/pisilinux/lib64.patch
@@ -0,0 +1,37 @@
+--- cups-config.in~ 2014-01-18 13:56:12.423297761 +0100
++++ cups-config.in 2014-01-18 13:56:59.459964275 +0100
+@@ -50,7 +50,7 @@ else
+ CFLAGS="$CFLAGS -I$includedir"
+ fi
+
+- if test $libdir != /usr/lib -a $libdir != /usr/lib32 -a $libdir != /usr/lib64; then
++ if test $libdir != /usr/lib -a $libdir != /usr/lib32 -a $libdir != /usr/lib; then
+ LDFLAGS="$LDFLAGS -L$libdir"
+ fi
+ fi
+--- config-scripts/cups-directories.m4~ 2014-01-18 13:56:23.529964393 +0100
++++ config-scripts/cups-directories.m4 2014-01-18 13:57:40.706630807 +0100
+@@ -103,8 +103,8 @@ dnl Fix "libdir" variable...
+ if test "$libdir" = "\${exec_prefix}/lib"; then
+ case "$uname" in
+ Linux*)
+- if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then
+- libdir="$exec_prefix/lib64"
++ if test -d /usr/lib -a ! -d /usr/lib/fakeroot; then
++ libdir="$exec_prefix/lib"
+ fi
+ ;;
+ HP-UX*)
+--- configure~ 2014-01-18 13:56:32.346631030 +0100
++++ configure 2014-01-18 13:57:12.076630898 +0100
+@@ -5893,8 +5893,8 @@ fi
+ if test "$libdir" = "\${exec_prefix}/lib"; then
+ case "$uname" in
+ Linux*)
+- if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then
+- libdir="$exec_prefix/lib64"
++ if test -d /usr/lib -a ! -d /usr/lib/fakeroot; then
++ libdir="$exec_prefix/lib"
+ fi
+ ;;
+ HP-UX*)
diff --git a/hardware/printer/cups/files/pisilinux/nostrip.patch b/hardware/printer/cups/files/pisilinux/nostrip.patch
new file mode 100644
index 0000000000..ab38c25d7e
--- /dev/null
+++ b/hardware/printer/cups/files/pisilinux/nostrip.patch
@@ -0,0 +1,26 @@
+Index: cups-1.4.4/config-scripts/cups-compiler.m4
+===================================================================
+--- cups-1.4.4.orig/config-scripts/cups-compiler.m4
++++ cups-1.4.4/config-scripts/cups-compiler.m4
+@@ -30,7 +30,7 @@ dnl For debugging, keep symbols, otherwi
+ if test x$enable_debug = xyes; then
+ OPTIM="-g"
+ else
+- INSTALL_STRIP="-s"
++ INSTALL_STRIP=""
+ fi
+
+ dnl Debug printfs can slow things down, so provide a separate option for that
+Index: cups-1.4.4/configure
+===================================================================
+--- cups-1.4.4.orig/configure
++++ cups-1.4.4/configure
+@@ -10978,7 +10978,7 @@ fi
+ if test x$enable_debug = xyes; then
+ OPTIM="-g"
+ else
+- INSTALL_STRIP="-s"
++ INSTALL_STRIP=""
+ fi
+
+ if test x$enable_debug_printfs = xyes; then
diff --git a/hardware/printer/cups/files/pisilinux/statedir.patch b/hardware/printer/cups/files/pisilinux/statedir.patch
new file mode 100644
index 0000000000..d20057e74c
--- /dev/null
+++ b/hardware/printer/cups/files/pisilinux/statedir.patch
@@ -0,0 +1,22 @@
+--- config-scripts/cups-network.m4~ 2014-01-18 14:05:51.353295869 +0100
++++ config-scripts/cups-network.m4 2014-01-18 14:07:25.179962227 +0100
+@@ -45,7 +45,7 @@ if test x$enable_domainsocket != xno -a
+ case "$uname" in
+ Darwin*)
+ # Darwin and MaxOS X do their own thing...
+- CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd"
++ CUPS_DEFAULT_DOMAINSOCKET="/run/cupsd"
+ ;;
+ *)
+ # All others use FHS standard...
+--- config-scripts/cups-directories.m4~ 2014-01-18 14:05:59.609962507 +0100
++++ config-scripts/cups-directories.m4 2014-01-18 14:07:13.516628933 +0100
+@@ -420,7 +420,7 @@ AC_ARG_WITH(rundir, [ --with-rundir
+ ;;
+ *)
+ # All others
+- CUPS_STATEDIR="$localstatedir/run/cups"
++ CUPS_STATEDIR="/run/cups"
+ ;;
+ esac])
+ AC_DEFINE_UNQUOTED(CUPS_STATEDIR, "$CUPS_STATEDIR")
diff --git a/hardware/printer/cups/files/pld-linux/cups-avahi-address.patch b/hardware/printer/cups/files/pld-linux/cups-avahi-address.patch
new file mode 100644
index 0000000000..1b40df957c
--- /dev/null
+++ b/hardware/printer/cups/files/pld-linux/cups-avahi-address.patch
@@ -0,0 +1,95 @@
+diff -up cups-2.0rc1/cups/http-support.c.avahi-address cups-2.0rc1/cups/http-support.c
+--- cups-2.0rc1/cups/http-support.c.avahi-address 2014-08-28 17:37:22.000000000 +0200
++++ cups-2.0rc1/cups/http-support.c 2014-09-12 15:31:45.062950696 +0200
+@@ -2342,7 +2342,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) */
+@@ -2495,39 +2495,62 @@ http_resolve_cb(
+ * getting the IP address of the .local name and then do reverse-lookups...
+ */
+
+- http_addrlist_t *addrlist, /* List of addresses */
+- *addr; /* Current address */
++ http_addr_t addr;
++ size_t addrlen;
++ int error;
+
+ DEBUG_printf(("8http_resolve_cb: Looking up \"%s\".", hostTarget));
+
+- snprintf(fqdn, sizeof(fqdn), "%d", ntohs(port));
+- if ((addrlist = httpAddrGetList(hostTarget, AF_UNSPEC, fqdn)) != NULL)
++ switch (address->proto)
+ {
+- for (addr = addrlist; addr; addr = addr->next)
++ case AVAHI_PROTO_INET:
++ addr.ipv4.sin_family = AF_INET;
++ addrlen = sizeof (addr.ipv4.sin_addr);
++ memcpy (&addr.ipv4.sin_addr, &address->data, addrlen);
++ break;
++ case AVAHI_PROTO_INET6:
++ addr.ipv6.sin6_family = AF_INET6;
++ addrlen = sizeof (addr.ipv6.sin6_addr);
++ memcpy (&addr.ipv6.sin6_addr, &address->data, addrlen);
++ break;
++ default:
++ DEBUG_printf(("8http_resolve_cb: unknown address family %d",
++ address->proto));
++ addrlen = 0;
++ }
++
++ if (addrlen > 0) {
++ error = getnameinfo(&addr.addr, httpAddrLength (&addr),
++ fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
++
++ if (!error)
+ {
+- int error = getnameinfo(&(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr)), fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
++ DEBUG_printf(("8http_resolve_cb: Found \"%s\".", fqdn));
+
+- if (!error)
+- {
+- DEBUG_printf(("8http_resolve_cb: Found \"%s\".", fqdn));
++ if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn ||
++ _cups_strcasecmp(hostptr, ".local"))
+
+- if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn ||
+- _cups_strcasecmp(hostptr, ".local"))
+- {
+- hostTarget = fqdn;
+- break;
+- }
++ {
++ hostTarget = fqdn;
+ }
++ } else {
++ avahi_address_snprint (fqdn, sizeof (fqdn), address);
++ hostTarget = fqdn;
++
+ #ifdef DEBUG
+- else
+- DEBUG_printf(("8http_resolve_cb: \"%s\" did not resolve: %d",
+- httpAddrString(&(addr->addr), fqdn, sizeof(fqdn)),
+- error));
++ DEBUG_printf(("8http_resolve_cb: \"%s\" did not resolve: %d",
++ fqdn, error));
+ #endif /* DEBUG */
+ }
+
+- httpAddrFreeList(addrlist);
+ }
++ } else {
++ /*
++ * Use the IP address that responded...
++ */
++
++ avahi_address_snprint (fqdn, sizeof (fqdn), address);
++ hostTarget = fqdn;
+ }
+
+ /*
diff --git a/hardware/printer/cups/files/pld-linux/cups-avahi-no-threaded.patch b/hardware/printer/cups/files/pld-linux/cups-avahi-no-threaded.patch
new file mode 100644
index 0000000000..9dd6cc4171
--- /dev/null
+++ b/hardware/printer/cups/files/pld-linux/cups-avahi-no-threaded.patch
@@ -0,0 +1,1021 @@
+diff -up cups-2.0rc1/scheduler/avahi.c.avahi-no-threaded cups-2.0rc1/scheduler/avahi.c
+--- cups-2.0rc1/scheduler/avahi.c.avahi-no-threaded 2014-09-12 15:45:28.772280006 +0200
++++ cups-2.0rc1/scheduler/avahi.c 2014-09-12 15:45:28.772280006 +0200
+@@ -0,0 +1,441 @@
++/*
++ * "$Id$"
++ *
++ * Avahi poll implementation for the CUPS scheduler.
++ *
++ * Copyright (C) 2010, 2011 Red Hat, Inc.
++ * Authors:
++ * Tim Waugh
++ *
++ * 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
++
++#ifdef HAVE_AVAHI /* Applies to entire file... */
++
++/*
++ * Include necessary headers...
++ */
++
++#include "cupsd.h"
++
++#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
++# include
++#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */
++
++#ifdef HAVE_AVAHI
++# include
++#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-2.0rc1/scheduler/avahi.h.avahi-no-threaded cups-2.0rc1/scheduler/avahi.h
+--- cups-2.0rc1/scheduler/avahi.h.avahi-no-threaded 2014-09-12 15:45:28.772280006 +0200
++++ cups-2.0rc1/scheduler/avahi.h 2014-09-12 15:45:28.772280006 +0200
+@@ -0,0 +1,69 @@
++/*
++ * "$Id$"
++ *
++ * Avahi poll implementation for the CUPS scheduler.
++ *
++ * Copyright (C) 2010, 2011 Red Hat, Inc.
++ * Authors:
++ * Tim Waugh
++ *
++ * 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
++
++#ifdef HAVE_AVAHI
++# include
++# include
++#endif /* HAVE_AVAHI */
++
++#ifdef HAVE_AUTHORIZATION_H
++# include
++#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-2.0rc1/scheduler/cupsd.h.avahi-no-threaded cups-2.0rc1/scheduler/cupsd.h
+--- cups-2.0rc1/scheduler/cupsd.h.avahi-no-threaded 2014-03-21 17:42:53.000000000 +0100
++++ cups-2.0rc1/scheduler/cupsd.h 2014-09-12 15:47:02.886945551 +0200
+@@ -119,6 +119,7 @@ extern const char *cups_hstrerror(int);
+ #include "colorman.h"
+ #include "conf.h"
+ #include "banners.h"
++#include "avahi.h"
+ #include "dirsvc.h"
+ #include "network.h"
+ #include "subscriptions.h"
+@@ -139,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...
+@@ -163,6 +173,10 @@ VAR int OnDemand VALUE(0);
+ /* Launched on demand */
+ #endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
+
++#ifdef HAVE_AVAHI
++VAR cups_array_t *Timeouts; /* Timed callbacks for main loop */
++#endif /* HAVE_AVAHI */
++
+
+ /*
+ * Prototypes...
+@@ -226,6 +240,17 @@ 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 */
+
+ /*
+ * End of "$Id: cupsd.h 11717 2014-03-21 16:42:53Z msweet $".
+diff -up cups-2.0rc1/scheduler/dirsvc.c.avahi-no-threaded cups-2.0rc1/scheduler/dirsvc.c
+--- cups-2.0rc1/scheduler/dirsvc.c.avahi-no-threaded 2014-05-09 22:57:11.000000000 +0200
++++ cups-2.0rc1/scheduler/dirsvc.c 2014-09-12 15:45:28.773279992 +0200
+@@ -195,7 +195,7 @@ cupsdStartBrowsing(void)
+ cupsdUpdateDNSSDName();
+
+ # else /* HAVE_AVAHI */
+- if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL)
++ if ((DNSSDMaster = avahi_cups_poll_new()) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create DNS-SD thread.");
+
+@@ -206,7 +206,7 @@ cupsdStartBrowsing(void)
+ {
+ int error; /* Error code, if any */
+
+- DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssdClientCallback, NULL, &error);
++ DNSSDClient = avahi_client_new(avahi_cups_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssdClientCallback, NULL, &error);
+
+ if (DNSSDClient == NULL)
+ {
+@@ -217,11 +217,9 @@ cupsdStartBrowsing(void)
+ if (FatalErrors & CUPSD_FATAL_BROWSE)
+ cupsdEndProcess(getpid(), 0);
+
+- avahi_threaded_poll_free(DNSSDMaster);
++ avahi_cups_poll_free(DNSSDMaster);
+ DNSSDMaster = NULL;
+ }
+- else
+- avahi_threaded_poll_start(DNSSDMaster);
+ }
+ # endif /* HAVE_DNSSD */
+ }
+@@ -608,7 +606,7 @@ dnssdClientCallback(
+ * Renew Avahi client...
+ */
+
+- DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssdClientCallback, NULL, &error);
++ DNSSDClient = avahi_client_new(avahi_cups_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssdClientCallback, NULL, &error);
+
+ if (!DNSSDClient)
+ {
+@@ -672,13 +670,7 @@ dnssdDeregisterInstance(
+ DNSServiceRefDeallocate(*srv);
+
+ # else /* HAVE_AVAHI */
+- if (!from_callback)
+- avahi_threaded_poll_lock(DNSSDMaster);
+-
+ avahi_entry_group_free(*srv);
+-
+- if (!from_callback)
+- avahi_threaded_poll_unlock(DNSSDMaster);
+ # endif /* HAVE_DNSSD */
+
+ *srv = NULL;
+@@ -999,16 +991,10 @@ dnssdRegisterInstance(
+ (void)commit;
+
+ # else /* HAVE_AVAHI */
+- if (!from_callback)
+- avahi_threaded_poll_lock(DNSSDMaster);
+-
+ if (!*srv)
+ *srv = avahi_entry_group_new(DNSSDClient, dnssdRegisterCallback, NULL);
+ if (!*srv)
+ {
+- if (!from_callback)
+- avahi_threaded_poll_unlock(DNSSDMaster);
+-
+ cupsdLogMessage(CUPSD_LOG_WARN, "DNS-SD registration of \"%s\" failed: %s",
+ name, dnssdErrorString(avahi_client_errno(DNSSDClient)));
+ return (0);
+@@ -1123,9 +1109,6 @@ dnssdRegisterInstance(
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "DNS-SD commit of \"%s\" failed.",
+ name);
+ }
+-
+- if (!from_callback)
+- avahi_threaded_poll_unlock(DNSSDMaster);
+ # endif /* HAVE_DNSSD */
+
+ if (error)
+@@ -1296,12 +1279,10 @@ dnssdStop(void)
+ DNSSDMaster = NULL;
+
+ # else /* HAVE_AVAHI */
+- avahi_threaded_poll_stop(DNSSDMaster);
+-
+ avahi_client_free(DNSSDClient);
+ DNSSDClient = NULL;
+
+- avahi_threaded_poll_free(DNSSDMaster);
++ avahi_cups_poll_free(DNSSDMaster);
+ DNSSDMaster = NULL;
+ # endif /* HAVE_DNSSD */
+
+diff -up cups-2.0rc1/scheduler/dirsvc.h.avahi-no-threaded cups-2.0rc1/scheduler/dirsvc.h
+--- cups-2.0rc1/scheduler/dirsvc.h.avahi-no-threaded 2013-05-29 13:51:34.000000000 +0200
++++ cups-2.0rc1/scheduler/dirsvc.h 2014-09-12 15:45:28.773279992 +0200
+@@ -51,7 +51,7 @@ VAR cups_array_t *DNSSDPrinters VALUE(NU
+ VAR DNSServiceRef DNSSDMaster VALUE(NULL);
+ /* Master DNS-SD service reference */
+ # else /* HAVE_AVAHI */
+-VAR AvahiThreadedPoll *DNSSDMaster VALUE(NULL);
++VAR AvahiCupsPoll *DNSSDMaster VALUE(NULL);
+ /* Master polling interface for Avahi */
+ VAR AvahiClient *DNSSDClient VALUE(NULL);
+ /* Client information */
+diff -up cups-2.0rc1/scheduler/main.c.avahi-no-threaded cups-2.0rc1/scheduler/main.c
+--- cups-2.0rc1/scheduler/main.c.avahi-no-threaded 2014-09-12 15:45:28.736280516 +0200
++++ cups-2.0rc1/scheduler/main.c 2014-09-12 15:47:43.433370643 +0200
+@@ -127,6 +127,10 @@ main(int argc, /* I - Number of comm
+ int service_idle_exit;
+ /* Idle exit on select timeout? */
+ #endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
++#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
+@@ -569,6 +573,14 @@ main(int argc, /* I - Number of comm
+
+ httpInitialize();
+
++#ifdef HAVE_AVAHI
++ /*
++ * Initialize timed callback structures.
++ */
++
++ cupsdInitTimeouts();
++#endif /* HAVE_AVAHI */
++
+ cupsdStartServer();
+
+ /*
+@@ -871,6 +883,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...
+@@ -1562,6 +1584,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 */
+
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "select_timeout: JobHistoryUpdate=%ld",
+@@ -1607,6 +1633,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-2.0rc1/scheduler/Makefile.avahi-no-threaded cups-2.0rc1/scheduler/Makefile
+--- cups-2.0rc1/scheduler/Makefile.avahi-no-threaded 2014-08-29 13:27:18.000000000 +0200
++++ cups-2.0rc1/scheduler/Makefile 2014-09-12 15:48:35.367634265 +0200
+@@ -17,6 +17,7 @@ include ../Makedefs
+
+ CUPSDOBJS = \
+ auth.o \
++ avahi.o \
+ banners.o \
+ cert.o \
+ classes.o \
+@@ -40,7 +41,8 @@ CUPSDOBJS = \
+ server.o \
+ statbuf.o \
+ subscriptions.o \
+- sysman.o
++ sysman.o \
++ timeout.o
+ LIBOBJS = \
+ filter.o \
+ mime.o \
+diff -up cups-2.0rc1/scheduler/timeout.c.avahi-no-threaded cups-2.0rc1/scheduler/timeout.c
+--- cups-2.0rc1/scheduler/timeout.c.avahi-no-threaded 2014-09-12 15:45:28.775279963 +0200
++++ cups-2.0rc1/scheduler/timeout.c 2014-09-12 15:45:28.775279963 +0200
+@@ -0,0 +1,235 @@
++/*
++ * "$Id$"
++ *
++ * Timeout functions for the Common UNIX Printing System (CUPS).
++ *
++ * Copyright (C) 2010, 2011 Red Hat, Inc.
++ * Authors:
++ * Tim Waugh
++ *
++ * 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
++
++#ifdef HAVE_AVAHI /* Applies to entire file... */
++
++/*
++ * Include necessary headers...
++ */
++
++#include "cupsd.h"
++
++#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
++# include
++#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */
++
++#ifdef HAVE_AVAHI
++# include
++#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/hardware/printer/cups/files/tmpfiles.conf b/hardware/printer/cups/files/tmpfiles.conf
new file mode 100644
index 0000000000..c9291d84c2
--- /dev/null
+++ b/hardware/printer/cups/files/tmpfiles.conf
@@ -0,0 +1,2 @@
+d /run/cups 0755 root lp
+d /run/cups/certs 0755 lp lpadmin
diff --git a/hardware/printer/cups/pspec.xml b/hardware/printer/cups/pspec.xml
new file mode 100644
index 0000000000..c1e11be0c2
--- /dev/null
+++ b/hardware/printer/cups/pspec.xml
@@ -0,0 +1,244 @@
+
+
+
+
+ cups
+ http://www.cups.org/
+
+ Pisi Linux Admins
+ admins@pisilinux.org
+
+ GPLv2
+ service
+ Common Unix Printing System
+ cups provides a portable printing layer for *nix-based operating systems.
+ http://www.cups.org/software/2.0.3/cups-2.0.3-source.tar.bz2
+
+
+ acl-devel
+ pam-devel
+ dbus-devel
+ zlib-devel
+ libusb-devel
+ libgcc
+ avahi-devel
+ cups-filters
+ mit-kerberos
+ libpaper-devel
+
+
+
+ archlinux/cups-no-export-ssllibs.patch
+ archlinux/cups-no-gzip-man.patch
+ archlinux/cups-1.6.2-statedir.patch
+ archlinux/cups-no-gcrypt.patch
+
+
+
+
+
+ fedora/cups-enum-all.patch
+ fedora/cups-final-content-type.patch
+ fedora/cups-res_init.patch
+
+
+ gentoo/cups-1.6.0-fix-install-perms.patch
+ gentoo/cups-2.0.1-rename-systemd-service-files.patch
+
+
+
+ pisilinux/lib64.patch
+ pisilinux/nostrip.patch
+ pisilinux/cups-run.patch
+
+
+ pld-linux/cups-avahi-address.patch
+
+
+
+
+
+
+ cups
+
+ acl
+ pam
+ dbus
+ zlib
+ libusb
+ libgcc
+ libpaper
+ avahi-libs
+ mit-kerberos
+
+
+ /etc/cups/*conf
+ /usr/lib/tmpfiles.d/cups.conf
+ /usr/lib
+ /usr/sbin
+ /usr/bin
+ /var/cache/cups/rss
+ /var/spool/cups/tmp
+ /run/cups/certs
+ /var/log/cups
+ /etc
+ /lib/udev/rules.d
+ /lib/systemd/system
+ /usr/share/cups
+ /usr/share/icons
+ /usr/share/applications
+ /usr/share/doc
+ /usr/share/man
+ /usr/share/locale
+
+
+ tmpfiles.conf
+
+
+ cups.logrotate
+
+
+ fedora/textonly.ppd
+
+
+ System.Service
+ System.Package
+
+
+
+
+ cups-devel
+ Development files for cups
+
+ cups
+
+
+ /usr/include
+ /usr/bin/cups-config
+
+
+
+
+ cups-32bit
+ emul32
+ 32-bit shared libraries for cups
+ emul32
+
+ glibc-32bit
+ zlib-32bit
+ openssl-32bit
+
+
+ glibc-32bit
+ zlib-32bit
+ openssl-32bit
+ cups
+
+
+ /usr/bin/cups-config-32bit
+ /usr/lib32
+
+
+
+
+
+ 2015-06-10
+ 2.0.3
+ Version bump.
+ Ertuğrul Erata
+ ertugrulerata@gmail.com
+
+
+ 2014-02-05
+ 2.0.1
+ Version bump.
+ Vedat Demir
+ vedat@pisilinux.org
+
+
+ 2014-09-25
+ 1.7.5
+ Version bump.
+ Serdar Soytetir
+ kaptan@pisilinux.org
+
+
+ 2014-05-20
+ 1.7.2
+ Version bump.
+ Marcin Bojara
+ marcin@pisilinux.org
+
+
+ 2014-01-30
+ 1.7.1
+ Fix comar service.
+ Marcin Bojara
+ marcin@pisilinux.org
+
+
+ 2014-01-18
+ 1.7.1
+ Add tmpfiles.conf. Rebuild.
+ Marcin Bojara
+ marcin@pisilinux.org
+
+
+ 2014-01-17
+ 1.7.1
+ Version bump.
+ Yusuf Aydemir
+ yusuf.aydemir@pisilinux.org
+
+
+ 2013-11-1
+ 1.7.0
+ Version bump.
+ Kamil Atlı
+ suvarice@gmail.com
+
+
+ 2013-10-14
+ 1.6.4
+ Version bump.
+ Yusuf Aydemir
+ yusuf.aydemir@pisilinux.org
+
+
+ 2013-07-13
+ 1.6.3
+ Version bump.
+ Marcin Bojara
+ marcin@pisilinux.org
+
+
+ 2013-05-19
+ 1.6.1
+ Lib64 path correction.
+ Ertan Güven
+ ertan@pisilinux.org
+
+
+ 2013-03-13
+ 1.6.1
+ Version bump
+ Ertan Güven
+ ertan@pisilinux.org
+
+
+ 2012-10-18
+ 1.5.4
+ Fixed
+ Osman Erkan
+ osman.erkan@pisilinux.org
+
+
+ 2012-10-18
+ 1.5.4
+ First release
+ Erdinç Gültekin
+ admins@pisilinux.org
+
+
+
diff --git a/hardware/printer/cups/translations.xml b/hardware/printer/cups/translations.xml
new file mode 100644
index 0000000000..dded592445
--- /dev/null
+++ b/hardware/printer/cups/translations.xml
@@ -0,0 +1,22 @@
+
+
+
+ cups
+ Unix Ortak Yazdırma Sistemi
+
+
+
+ cups-php
+ PHP için CUPS programlama kitaplığı
+
+
+
+ cups-devel
+ cups için geliştirme dosyaları
+
+
+
+ cups-32bit
+ cups için 32-bit paylaşımlı kitaplıklar
+
+
diff --git a/hardware/sound/alsa-lib/actions.py b/hardware/sound/alsa-lib/actions.py
new file mode 100644
index 0000000000..f960849d80
--- /dev/null
+++ b/hardware/sound/alsa-lib/actions.py
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file http://www.gnu.org/licenses/gpl.txt
+
+from pisi.actionsapi import autotools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import get
+from pisi.actionsapi import shelltools
+
+def setup():
+ options = "--disable-aload"
+
+ if get.buildTYPE() == "emul32":
+ options += " --disable-python"
+ shelltools.export("CFLAGS", "%s -m32" % get.CFLAGS())
+
+ autotools.autoreconf("-fi")
+
+ autotools.configure(options)
+ pisitools.dosed("libtool", " -shared ", " -Wl,--as-needed -shared ")
+
+ # rpath fix
+ pisitools.dosed("libtool", "^hardcode_libdir_flag_spec=.*", "hardcode_libdir_flag_spec=\"\"")
+ pisitools.dosed("libtool", "^runpath_var=LD_RUN_PATH", "runpath_var=DIE_RPATH_DIE")
+
+def build():
+ autotools.make()
+
+def install():
+ autotools.rawInstall("DESTDIR=%s" % get.installDIR())
+
+ if get.buildTYPE() == "emul32": return
+
+ pisitools.dodoc("ChangeLog", "TODO", "COPYING", "doc/*.txt")
diff --git a/hardware/sound/alsa-lib/pspec.xml b/hardware/sound/alsa-lib/pspec.xml
new file mode 100644
index 0000000000..28610c93fa
--- /dev/null
+++ b/hardware/sound/alsa-lib/pspec.xml
@@ -0,0 +1,116 @@
+
+
+
+
+ alsa-lib
+ http://www.alsa-project.org/
+
+ PisiLinux Community
+ admins@pisilinux.org
+
+ GPLv2
+ library
+ app:console
+ The Advanced Linux Sound Architecture (ALSA) library
+ alsa-lib provides ALSA runtime libraries to simplify application programming and provide higher level functionality as well as support for the older OSS API, providing binary compatibility for most OSS programs.
+ ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.29.tar.bz2
+
+
+
+ alsa-lib
+
+ /usr/lib
+ /usr/bin
+ /usr/share/doc
+ /usr/share/alsa
+
+
+
+
+ alsa-lib-devel
+ Development files for alsa-lib
+
+ alsa-lib
+
+
+ /usr/lib/pkgconfig
+ /usr/lib32/pkgconfig
+ /usr/include/sys
+ /usr/include/alsa
+ /usr/share/aclocal
+ /usr/share/man/man3
+
+
+
+
+ alsa-lib-32bit
+ emul32
+ 32-bit shared libraries for alsa-lib
+ emul32
+
+ alsa-lib
+
+
+ /usr/lib32
+
+
+
+
+
+ 2015-03-04
+ 1.0.29
+ Version bump.
+ Hakan Yıldız
+ hknyldz93@gmail.com
+
+
+ 2014-08-19
+ 1.0.28
+ Rebuild version 28.
+ Serdar Soytetir
+ kaptan@pisilinux.org
+
+
+ 2014-08-19
+ 1.0.28
+ Version bump.
+ Serdar Soytetir
+ kaptan@pisilinux.org
+
+
+ 2014-05-26
+ 1.0.27.2
+ Release bump.
+ Alihan Öztürk
+ alihan@pisilinux.org
+
+
+ 2014-03-05
+ 1.0.27.2
+ Rebuild for buildhost
+ PisiLinux Community
+ admins@pisilinux.org
+
+
+ 2013-08-22
+ 1.0.27.2
+ Release bump.
+ Marcin Bojara
+ marcin@pisilinux.org
+
+
+ 2013-07-27
+ 1.0.27.2
+ Version bump.
+ Marcin Bojara
+ marcin@pisilinux.org
+
+
+ 2012-10-13
+ 1.0.26.20121013
+ First release
+ Erdinç Gültekin
+ admins@pisilinux.org
+
+
+
diff --git a/hardware/sound/alsa-lib/translations.xml b/hardware/sound/alsa-lib/translations.xml
new file mode 100644
index 0000000000..9122b1fb89
--- /dev/null
+++ b/hardware/sound/alsa-lib/translations.xml
@@ -0,0 +1,18 @@
+
+
+
+ alsa-lib
+ Gelişmiş Linux Ses Mimarisi kütüphanesi
+ alsa-lib, ses aygıtlarına erişim sağlayarak kolayca uygulama yazılmasını sağlayan bir kütüphanedir.
+
+
+
+ alsa-lib-devel
+ alsa-lib için geliştirme dosyaları
+
+
+
+ alsa-lib-32bit
+ alsa-lib için 32-bit paylaşımlı kitaplıklar
+
+
diff --git a/hardware/sound/component.xml b/hardware/sound/component.xml
new file mode 100644
index 0000000000..e15449bfb7
--- /dev/null
+++ b/hardware/sound/component.xml
@@ -0,0 +1,3 @@
+
+ hardware.sound
+