summaryrefslogtreecommitdiff
path: root/debian/patches/0038-Resolve-DNS-SD-service-name-based-URIs-correctly-als.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/0038-Resolve-DNS-SD-service-name-based-URIs-correctly-als.patch')
-rw-r--r--debian/patches/0038-Resolve-DNS-SD-service-name-based-URIs-correctly-als.patch71
1 files changed, 71 insertions, 0 deletions
diff --git a/debian/patches/0038-Resolve-DNS-SD-service-name-based-URIs-correctly-als.patch b/debian/patches/0038-Resolve-DNS-SD-service-name-based-URIs-correctly-als.patch
new file mode 100644
index 000000000..6c6af1947
--- /dev/null
+++ b/debian/patches/0038-Resolve-DNS-SD-service-name-based-URIs-correctly-als.patch
@@ -0,0 +1,71 @@
+From: Till Kamppeter <till.kamppeter@gmail.com>
+Date: Tue, 25 Aug 2020 21:34:00 +0200
+Subject: Resolve DNS-SD-service-name-based URIs correctly also if they are
+ from a service from localhost (like IPP-over-USB, Printer Application, ...)
+
+---
+ cups/http-support.c | 33 +++++++++++++++++++++++++++++----
+ 1 file changed, 29 insertions(+), 4 deletions(-)
+
+diff --git a/cups/http-support.c b/cups/http-support.c
+index 6317514..8eabaee 100644
+--- a/cups/http-support.c
++++ b/cups/http-support.c
+@@ -2483,7 +2483,7 @@ http_poll_cb(
+ static void
+ http_resolve_cb(
+ AvahiServiceResolver *resolver, /* I - Resolver (unused) */
+- AvahiIfIndex interface, /* I - Interface index (unused) */
++ AvahiIfIndex interface, /* I - Interface index */
+ AvahiProtocol protocol, /* I - Network protocol (unused) */
+ AvahiResolverEvent event, /* I - Event (found, etc.) */
+ const char *name, /* I - Service name */
+@@ -2504,6 +2504,7 @@ http_resolve_cb(
+ *resdefault; /* Default path */
+ char resource[257], /* Remote path */
+ fqdn[256]; /* FQDN of the .local name */
++ char ifname[IF_NAMESIZE]; /* Interface name */
+ AvahiStringList *pair; /* Current TXT record key/value pair */
+ char *value; /* Value for "rp" key */
+ size_t valueLen = 0; /* Length of "rp" key */
+@@ -2630,13 +2631,37 @@ http_resolve_cb(
+ strlcpy(resource, resdefault, sizeof(resource));
+ }
+
++ /*
++ * Check whether the interface is the loopback interface ("lo"), in this
++ * case set "localhost" as the host name
++ */
++
++ if (!if_indextoname((unsigned int)interface, ifname))
++ {
++ if (uribuf->options & _HTTP_RESOLVE_STDERR)
++ fprintf(stderr,
++ "DEBUG: Unable to find interface name for interface %d: %s\n",
++ interface, strerror(errno));
++ DEBUG_printf(("Unable to find interface name for interface %d: %s\n",
++ interface, strerror(errno)));
++ ifname[0] = '\0';
++ }
++
++ if (!strcmp(ifname, "lo")) {
++ if (uribuf->options & _HTTP_RESOLVE_STDERR)
++ fputs("DEBUG: Service comes from loopback interface \"lo\", setting \"localhost\" as host name.\n",
++ stderr);
++ DEBUG_puts("Service comes from loopback interface \"lo\", setting \"localhost\" as host name.");
++ hostTarget = "localhost";
++ }
++
+ /*
+ * Lookup the FQDN if needed...
+ */
+
+- if ((uribuf->options & _HTTP_RESOLVE_FQDN) &&
+- (hostptr = hostTarget + strlen(hostTarget) - 6) > hostTarget &&
+- !_cups_strcasecmp(hostptr, ".local"))
++ else if ((uribuf->options & _HTTP_RESOLVE_FQDN) &&
++ (hostptr = hostTarget + strlen(hostTarget) - 6) > hostTarget &&
++ !_cups_strcasecmp(hostptr, ".local"))
+ {
+ /*
+ * OK, we got a .local name but the caller needs a real domain. Start by