6f9127aa90
- Drop cups-1.7.5-cupsEnumDests-react-to-all-for-now.diff and add 0001-Update-cupsEnumDests-implementation-to-return-early-if-all.patch, 0002-Save-work-on-Avahi-code.patch and 0003-Avahi-fixes-for-cupsEnumDests.patch which is what upstream finally commited to cups 2.2 sources in response to https://github.com/apple/cups/pull/4989 in order to fix cupsEnumDests to react to the ALL_FOR_NOW avahi event (and also include a similar fix for the dnssd case). Related to bsc#955432. OBS-URL: https://build.opensuse.org/request/show/489647 OBS-URL: https://build.opensuse.org/package/show/Printing/cups?expand=0&rev=326
227 lines
7.1 KiB
Diff
227 lines
7.1 KiB
Diff
From 657c5b5f91e6d5120c4ad7b118cf9098dd27f03d Mon Sep 17 00:00:00 2001
|
|
From: Michael R Sweet <michael.r.sweet@gmail.com>
|
|
Date: Thu, 20 Apr 2017 09:11:45 -0400
|
|
Subject: [PATCH] Save work on Avahi code
|
|
|
|
---
|
|
cups/dest.c | 64 +++++++++++++++++++++++++++++++++++++++++++------------------
|
|
1 file changed, 45 insertions(+), 19 deletions(-)
|
|
|
|
diff --git a/cups/dest.c b/cups/dest.c
|
|
index 54f2a7f..c1a0913 100644
|
|
--- a/cups/dest.c
|
|
+++ b/cups/dest.c
|
|
@@ -85,6 +85,7 @@ typedef struct _cups_dnssd_data_s /* Enumeration data */
|
|
AvahiSimplePoll *simple_poll; /* Polling interface */
|
|
AvahiClient *client; /* Client information */
|
|
int got_data; /* Did we get data? */
|
|
+ int browsers; /* How many browsers are running? */
|
|
# endif /* HAVE_DNSSD */
|
|
cups_dest_cb_t cb; /* Callback */
|
|
void *user_data; /* User data pointer */
|
|
@@ -102,7 +103,6 @@ typedef struct _cups_dnssd_device_s /* Enumerated device */
|
|
AvahiRecordBrowser *ref; /* Browser for query */
|
|
# endif /* HAVE_DNSSD */
|
|
char *fullName, /* Full name */
|
|
-// *serviceName, /* Service name */
|
|
*regtype, /* Registration type */
|
|
*domain; /* Domain name */
|
|
cups_ptype_t type; /* Device registration type */
|
|
@@ -1021,12 +1021,15 @@ cupsEnumDests(
|
|
i > 0 && (!cancel || !*cancel);
|
|
i --, dest ++)
|
|
{
|
|
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
|
|
const char *device_uri; /* Device URI */
|
|
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
|
|
|
|
if (!(*cb)(user_data, i > 1 ? CUPS_DEST_FLAGS_MORE : CUPS_DEST_FLAGS_NONE,
|
|
dest))
|
|
break;
|
|
|
|
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
|
|
if (!dest->instance && (device_uri = cupsGetOption("device-uri", dest->num_options, dest->options)) != NULL && !strncmp(device_uri, "dnssd://", 8))
|
|
{
|
|
/*
|
|
@@ -1058,13 +1061,17 @@ cupsEnumDests(
|
|
}
|
|
}
|
|
}
|
|
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
|
|
}
|
|
|
|
cupsFreeDests(num_dests, dests);
|
|
|
|
if (i > 0 || msec == 0)
|
|
{
|
|
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
|
|
cupsArrayDelete(data.devices);
|
|
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
|
|
+
|
|
return (1);
|
|
}
|
|
|
|
@@ -1122,10 +1129,12 @@ cupsEnumDests(
|
|
return (1);
|
|
}
|
|
|
|
+ data.browsers ++;
|
|
ipp_ref = avahi_service_browser_new(data.client, AVAHI_IF_UNSPEC,
|
|
AVAHI_PROTO_UNSPEC, "_ipp._tcp", NULL,
|
|
0, cups_dnssd_browse_cb, &data);
|
|
# ifdef HAVE_SSL
|
|
+ data.browsers ++;
|
|
ipps_ref = avahi_service_browser_new(data.client, AVAHI_IF_UNSPEC,
|
|
AVAHI_PROTO_UNSPEC, "_ipps._tcp", NULL,
|
|
0, cups_dnssd_browse_cb, &data);
|
|
@@ -1166,7 +1175,7 @@ cupsEnumDests(
|
|
# else /* HAVE_AVAHI */
|
|
data.got_data = 0;
|
|
|
|
- if ((error = avahi_simple_poll_iterate(data.simple_poll, 500)) > 0)
|
|
+ if ((error = avahi_simple_poll_iterate(data.simple_poll, 1000)) > 0)
|
|
{
|
|
/*
|
|
* We've been told to exit the loop. Perhaps the connection to
|
|
@@ -1176,6 +1185,7 @@ cupsEnumDests(
|
|
break;
|
|
}
|
|
|
|
+ DEBUG_printf(("1cupsEnumDests: got_data=%d", data.got_data));
|
|
# endif /* HAVE_DNSSD */
|
|
|
|
remaining -= 500;
|
|
@@ -1227,14 +1237,14 @@ cupsEnumDests(
|
|
cups_dnssd_query_cb,
|
|
&data)) != NULL)
|
|
{
|
|
+ DEBUG_printf(("1cupsEnumDests: browser ref=%p", device->ref));
|
|
count ++;
|
|
}
|
|
else
|
|
{
|
|
device->state = _CUPS_DNSSD_ERROR;
|
|
|
|
- DEBUG_printf(("1cupsEnumDests: Query failed: %s",
|
|
- avahi_strerror(avahi_client_errno(data.client))));
|
|
+ DEBUG_printf(("1cupsEnumDests: Query failed: %s", avahi_strerror(avahi_client_errno(data.client))));
|
|
}
|
|
# endif /* HAVE_DNSSD */
|
|
}
|
|
@@ -1256,8 +1266,17 @@ cupsEnumDests(
|
|
}
|
|
}
|
|
|
|
+# ifdef HAVE_AVAHI
|
|
+ DEBUG_printf(("1cupsEnumDests: browsers=%d, completed=%d, count=%d, devices count=%d", data.browsers, completed, count, cupsArrayCount(data.devices)));
|
|
+
|
|
+ if (data.browsers == 0 && completed == cupsArrayCount(data.devices))
|
|
+ break;
|
|
+# else
|
|
+ DEBUG_printf(("1cupsEnumDests: completed=%d, count=%d, devices count=%d", completed, count, cupsArrayCount(data.devices)));
|
|
+
|
|
if (completed == cupsArrayCount(data.devices))
|
|
break;
|
|
+# endif /* HAVE_AVAHI */
|
|
}
|
|
|
|
cupsArrayDelete(data.devices);
|
|
@@ -2889,11 +2908,12 @@ cups_dnssd_browse_cb(
|
|
(void)protocol;
|
|
(void)context;
|
|
|
|
+ DEBUG_printf(("cups_dnssd_browse_cb(..., name=\"%s\", type=\"%s\", domain=\"%s\", ...);", name, type, domain));
|
|
+
|
|
switch (event)
|
|
{
|
|
case AVAHI_BROWSER_FAILURE:
|
|
- DEBUG_printf(("cups_dnssd_browse_cb: %s",
|
|
- avahi_strerror(avahi_client_errno(client))));
|
|
+ DEBUG_printf(("cups_dnssd_browse_cb: %s", avahi_strerror(avahi_client_errno(client))));
|
|
avahi_simple_poll_quit(data->simple_poll);
|
|
break;
|
|
|
|
@@ -2908,8 +2928,7 @@ cups_dnssd_browse_cb(
|
|
* This comes from the local machine so ignore it.
|
|
*/
|
|
|
|
- DEBUG_printf(("cups_dnssd_browse_cb: Ignoring local service \"%s\".",
|
|
- name));
|
|
+ DEBUG_printf(("cups_dnssd_browse_cb: Ignoring local service \"%s\".", name));
|
|
}
|
|
else
|
|
{
|
|
@@ -2921,9 +2940,13 @@ cups_dnssd_browse_cb(
|
|
}
|
|
break;
|
|
|
|
- case AVAHI_BROWSER_REMOVE:
|
|
- case AVAHI_BROWSER_ALL_FOR_NOW:
|
|
- case AVAHI_BROWSER_CACHE_EXHAUSTED:
|
|
+ case AVAHI_BROWSER_REMOVE :
|
|
+ case AVAHI_BROWSER_CACHE_EXHAUSTED :
|
|
+ break;
|
|
+
|
|
+ case AVAHI_BROWSER_ALL_FOR_NOW :
|
|
+ DEBUG_puts("cups_dnssd_browse_cb: ALL_FOR_NOW");
|
|
+ data->browsers --;
|
|
break;
|
|
}
|
|
}
|
|
@@ -2945,6 +2968,8 @@ cups_dnssd_client_cb(
|
|
|
|
(void)client;
|
|
|
|
+ DEBUG_printf(("cups_dnssd_client_cb(client=%p, state=%d, context=%p)", client, state, context));
|
|
+
|
|
/*
|
|
* If the connection drops, quit.
|
|
*/
|
|
@@ -3214,16 +3239,22 @@ cups_dnssd_poll_cb(
|
|
int val; /* Return value */
|
|
|
|
|
|
+ DEBUG_printf(("cups_dnssd_poll_cb(pollfds=%p, num_pollfds=%d, timeout=%d, context=%p)", pollfds, num_pollfds, timeout, context));
|
|
+
|
|
(void)timeout;
|
|
|
|
- val = poll(pollfds, num_pollfds, 250);
|
|
+ val = poll(pollfds, num_pollfds, 500);
|
|
+
|
|
+ DEBUG_printf(("cups_dnssd_poll_cb: poll() returned %d", val));
|
|
|
|
if (val < 0)
|
|
{
|
|
DEBUG_printf(("cups_dnssd_poll_cb: %s", strerror(errno)));
|
|
}
|
|
else if (val > 0)
|
|
+ {
|
|
data->got_data = 1;
|
|
+ }
|
|
|
|
return (val);
|
|
}
|
|
@@ -3290,11 +3321,7 @@ cups_dnssd_query_cb(
|
|
return;
|
|
|
|
# else /* HAVE_AVAHI */
|
|
- DEBUG_printf(("5cups_dnssd_query_cb(browser=%p, interfaceIndex=%d, "
|
|
- "protocol=%d, event=%d, fullName=\"%s\", rrclass=%u, "
|
|
- "rrtype=%u, rdata=%p, rdlen=%u, flags=%x, context=%p)",
|
|
- browser, interfaceIndex, protocol, event, fullName, rrclass,
|
|
- rrtype, rdata, (unsigned)rdlen, flags, context));
|
|
+ DEBUG_printf(("cups_dnssd_query_cb(browser=%p, interfaceIndex=%d, protocol=%d, event=%d, fullName=\"%s\", rrclass=%u, rrtype=%u, rdata=%p, rdlen=%u, flags=%x, context=%p)", browser, interfaceIndex, protocol, event, fullName, rrclass, rrtype, rdata, (unsigned)rdlen, flags, context));
|
|
|
|
/*
|
|
* Only process "add" data...
|
|
@@ -3303,8 +3330,7 @@ cups_dnssd_query_cb(
|
|
if (event != AVAHI_BROWSER_NEW)
|
|
{
|
|
if (event == AVAHI_BROWSER_FAILURE)
|
|
- DEBUG_printf(("cups_dnssd_query_cb: %s",
|
|
- avahi_strerror(avahi_client_errno(client))));
|
|
+ DEBUG_printf(("cups_dnssd_query_cb: %s", avahi_strerror(avahi_client_errno(client))));
|
|
|
|
return;
|
|
}
|