Annotation of /trunk/cups/patches/cups-1.5.2-avahi-5-services.patch
Parent Directory | Revision Log
Revision 1642 -
(hide annotations)
(download)
Thu Feb 16 08:44:18 2012 UTC (12 years, 7 months ago) by niro
File size: 35658 byte(s)
Thu Feb 16 08:44:18 2012 UTC (12 years, 7 months ago) by niro
File size: 35658 byte(s)
-added redhat/fedora avahi patches
1 | niro | 1642 | diff -up cups-1.5.0/cgi-bin/admin.c.avahi-5-services cups-1.5.0/cgi-bin/admin.c |
2 | --- cups-1.5.0/cgi-bin/admin.c.avahi-5-services 2011-05-20 04:49:49.000000000 +0100 | ||
3 | +++ cups-1.5.0/cgi-bin/admin.c 2011-10-19 11:53:32.123177998 +0100 | ||
4 | @@ -1643,7 +1643,7 @@ do_config_server(http_t *http) /* I - H | ||
5 | else | ||
6 | local_protocols[0] = '\0'; | ||
7 | |||
8 | -#ifdef HAVE_DNSSD | ||
9 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
10 | if (cgiGetVariable("BROWSE_LOCAL_DNSSD")) | ||
11 | { | ||
12 | if (local_protocols[0]) | ||
13 | @@ -1651,7 +1651,7 @@ do_config_server(http_t *http) /* I - H | ||
14 | else | ||
15 | strcat(local_protocols, "dnssd"); | ||
16 | } | ||
17 | -#endif /* HAVE_DNSSD */ | ||
18 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
19 | |||
20 | #ifdef HAVE_LDAP | ||
21 | if (cgiGetVariable("BROWSE_LOCAL_LDAP")) | ||
22 | @@ -2718,9 +2718,9 @@ do_menu(http_t *http) /* I - HTTP conn | ||
23 | #endif /* HAVE_GSSAPI */ | ||
24 | cgiSetVariable("KERBEROS", ""); | ||
25 | |||
26 | -#ifdef HAVE_DNSSD | ||
27 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
28 | cgiSetVariable("HAVE_DNSSD", "1"); | ||
29 | -#endif /* HAVE_DNSSD */ | ||
30 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
31 | |||
32 | #ifdef HAVE_LDAP | ||
33 | cgiSetVariable("HAVE_LDAP", "1"); | ||
34 | diff -up cups-1.5.0/scheduler/client.c.avahi-5-services cups-1.5.0/scheduler/client.c | ||
35 | --- cups-1.5.0/scheduler/client.c.avahi-5-services 2011-06-10 22:16:18.000000000 +0100 | ||
36 | +++ cups-1.5.0/scheduler/client.c 2011-10-19 11:53:32.127177926 +0100 | ||
37 | @@ -4987,7 +4987,7 @@ valid_host(cupsd_client_t *con) /* I - | ||
38 | !strncmp(host, "[::1]:", 6)); | ||
39 | } | ||
40 | |||
41 | -#ifdef HAVE_DNSSD | ||
42 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
43 | /* | ||
44 | * Check if the hostname is something.local (Bonjour); if so, allow it. | ||
45 | */ | ||
46 | @@ -4996,7 +4996,7 @@ valid_host(cupsd_client_t *con) /* I - | ||
47 | (!_cups_strcasecmp(end, ".local") || !_cups_strncasecmp(end, ".local:", 7) || | ||
48 | !_cups_strcasecmp(end, ".local.") || !_cups_strncasecmp(end, ".local.:", 8))) | ||
49 | return (1); | ||
50 | -#endif /* HAVE_DNSSD */ | ||
51 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
52 | |||
53 | /* | ||
54 | * Check if the hostname is an IP address... | ||
55 | diff -up cups-1.5.0/scheduler/conf.c.avahi-5-services cups-1.5.0/scheduler/conf.c | ||
56 | --- cups-1.5.0/scheduler/conf.c.avahi-5-services 2011-10-19 11:53:31.895182225 +0100 | ||
57 | +++ cups-1.5.0/scheduler/conf.c 2011-10-19 11:53:32.131177850 +0100 | ||
58 | @@ -651,7 +651,7 @@ cupsdReadConfiguration(void) | ||
59 | Browsing = CUPS_DEFAULT_BROWSING; | ||
60 | DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED; | ||
61 | |||
62 | -#ifdef HAVE_DNSSD | ||
63 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
64 | cupsdSetString(&DNSSDRegType, "_ipp._tcp,_cups"); | ||
65 | #endif /* HAVE_DNSSD */ | ||
66 | |||
67 | diff -up cups-1.5.0/scheduler/dirsvc.c.avahi-5-services cups-1.5.0/scheduler/dirsvc.c | ||
68 | --- cups-1.5.0/scheduler/dirsvc.c.avahi-5-services 2011-10-19 11:53:32.011180075 +0100 | ||
69 | +++ cups-1.5.0/scheduler/dirsvc.c 2011-10-19 11:53:58.916681461 +0100 | ||
70 | @@ -27,6 +27,7 @@ | ||
71 | * ldap_connect() - Start new LDAP connection | ||
72 | * ldap_reconnect() - Reconnect to LDAP Server | ||
73 | * ldap_disconnect() - Disconnect from LDAP Server | ||
74 | + * cupsdStartAvahiClient() - Start an Avahi client if needed | ||
75 | * cupsdStartBrowsing() - Start sending and receiving broadcast | ||
76 | * information. | ||
77 | * cupsdStartPolling() - Start polling servers as needed. | ||
78 | @@ -40,11 +41,12 @@ | ||
79 | * dequote() - Remote quotes from a string. | ||
80 | * dnssdAddAlias() - Add a DNS-SD alias name. | ||
81 | * dnssdBuildTxtRecord() - Build a TXT record from printer info. | ||
82 | - * dnssdComparePrinters() - Compare the registered names of two printers. | ||
83 | * dnssdDeregisterPrinter() - Stop sending broadcast information for a | ||
84 | * printer. | ||
85 | * dnssdPackTxtRecord() - Pack an array of key/value pairs into the TXT | ||
86 | * record format. | ||
87 | + * avahiPackTxtRecord() - Pack an array of key/value pairs into an | ||
88 | + * AvahiStringList. | ||
89 | * dnssdRegisterCallback() - DNSServiceRegister callback. | ||
90 | * dnssdRegisterPrinter() - Start sending broadcast information for a | ||
91 | * printer or update the broadcast contents. | ||
92 | @@ -83,6 +85,7 @@ | ||
93 | */ | ||
94 | |||
95 | #include "cupsd.h" | ||
96 | +#include <assert.h> | ||
97 | #include <grp.h> | ||
98 | |||
99 | #ifdef HAVE_DNSSD | ||
100 | @@ -97,6 +100,17 @@ | ||
101 | # endif /* HAVE_SYSTEMCONFIGURATION */ | ||
102 | # endif /* __APPLE__ */ | ||
103 | #endif /* HAVE_DNSSD */ | ||
104 | +#ifdef HAVE_AVAHI | ||
105 | +# include <avahi-common/domain.h> | ||
106 | +#endif /* HAVE_AVAHI */ | ||
107 | + | ||
108 | + | ||
109 | +#ifdef HAVE_DNSSD | ||
110 | +typedef char *cupsd_txt_record_t; | ||
111 | +#endif /* HAVE_DNSSD */ | ||
112 | +#ifdef HAVE_AVAHI | ||
113 | +typedef AvahiStringList *cupsd_txt_record_t; | ||
114 | +#endif /* HAVE_AVAHI */ | ||
115 | |||
116 | |||
117 | /* | ||
118 | @@ -159,27 +173,38 @@ static void update_polling(void); | ||
119 | static void update_smb(int onoff); | ||
120 | |||
121 | |||
122 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
123 | +static cupsd_txt_record_t dnssdBuildTxtRecord(int *txt_len, cupsd_printer_t *p, | ||
124 | + int for_lpd); | ||
125 | +static void dnssdDeregisterPrinter(cupsd_printer_t *p); | ||
126 | +static void dnssdRegisterPrinter(cupsd_printer_t *p); | ||
127 | +static void dnssdStop(void); | ||
128 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
129 | + | ||
130 | #ifdef HAVE_DNSSD | ||
131 | # ifdef HAVE_COREFOUNDATION | ||
132 | static void dnssdAddAlias(const void *key, const void *value, | ||
133 | void *context); | ||
134 | # endif /* HAVE_COREFOUNDATION */ | ||
135 | -static char *dnssdBuildTxtRecord(int *txt_len, cupsd_printer_t *p, | ||
136 | - int for_lpd); | ||
137 | -static int dnssdComparePrinters(cupsd_printer_t *a, cupsd_printer_t *b); | ||
138 | -static void dnssdDeregisterPrinter(cupsd_printer_t *p); | ||
139 | -static char *dnssdPackTxtRecord(int *txt_len, char *keyvalue[][2], | ||
140 | - int count); | ||
141 | static void dnssdRegisterCallback(DNSServiceRef sdRef, | ||
142 | DNSServiceFlags flags, | ||
143 | DNSServiceErrorType errorCode, | ||
144 | const char *name, const char *regtype, | ||
145 | const char *domain, void *context); | ||
146 | -static void dnssdRegisterPrinter(cupsd_printer_t *p); | ||
147 | -static void dnssdStop(void); | ||
148 | static void dnssdUpdate(void); | ||
149 | #endif /* HAVE_DNSSD */ | ||
150 | |||
151 | +#ifdef HAVE_AVAHI | ||
152 | +static AvahiStringList *avahiPackTxtRecord(char *keyvalue[][2], | ||
153 | + int count); | ||
154 | +static void avahi_entry_group_cb (AvahiEntryGroup *group, | ||
155 | + AvahiEntryGroupState state, | ||
156 | + void *userdata); | ||
157 | +static void avahi_client_cb (AvahiClient *client, | ||
158 | + AvahiClientState state, | ||
159 | + void *userdata); | ||
160 | +#endif /* HAVE_AVAHI */ | ||
161 | + | ||
162 | #ifdef HAVE_LDAP | ||
163 | static const char * const ldap_attrs[] =/* CUPS LDAP attributes */ | ||
164 | { | ||
165 | @@ -283,10 +308,10 @@ cupsdDeregisterPrinter( | ||
166 | ldap_dereg_printer(p); | ||
167 | #endif /* HAVE_LDAP */ | ||
168 | |||
169 | -#ifdef HAVE_DNSSD | ||
170 | - if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef) | ||
171 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
172 | + if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD)) | ||
173 | dnssdDeregisterPrinter(p); | ||
174 | -#endif /* HAVE_DNSSD */ | ||
175 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
176 | } | ||
177 | |||
178 | |||
179 | @@ -702,10 +727,10 @@ cupsdRegisterPrinter(cupsd_printer_t *p) | ||
180 | slpRegisterPrinter(p); */ | ||
181 | #endif /* HAVE_LIBSLP */ | ||
182 | |||
183 | -#ifdef HAVE_DNSSD | ||
184 | - if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef) | ||
185 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
186 | + if ((BrowseLocalProtocols & BROWSE_DNSSD)) | ||
187 | dnssdRegisterPrinter(p); | ||
188 | -#endif /* HAVE_DNSSD */ | ||
189 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
190 | } | ||
191 | |||
192 | |||
193 | @@ -1419,6 +1444,36 @@ ldap_disconnect(LDAP *ld) /* I - LDAP h | ||
194 | #endif /* HAVE_LDAP */ | ||
195 | |||
196 | |||
197 | +#ifdef HAVE_AVAHI | ||
198 | +/* | ||
199 | + * 'cupsdStartAvahiClient()' - Start an Avahi client if needed | ||
200 | + */ | ||
201 | + | ||
202 | +void | ||
203 | +cupsdStartAvahiClient(void) | ||
204 | +{ | ||
205 | + int error = 0; | ||
206 | + | ||
207 | + if (!AvahiCupsClient && !AvahiCupsClientConnecting) | ||
208 | + { | ||
209 | + if (!AvahiCupsPollHandle) | ||
210 | + AvahiCupsPollHandle = avahi_cups_poll_new (); | ||
211 | + | ||
212 | + if (AvahiCupsPollHandle) | ||
213 | + { | ||
214 | + if (avahi_client_new (avahi_cups_poll_get (AvahiCupsPollHandle), | ||
215 | + AVAHI_CLIENT_NO_FAIL, | ||
216 | + avahi_client_cb, NULL, | ||
217 | + &error) != NULL) | ||
218 | + AvahiCupsClientConnecting = 1; | ||
219 | + else | ||
220 | + cupsdLogMessage (CUPSD_LOG_WARN, "Avahi client failed: %d", error); | ||
221 | + } | ||
222 | + } | ||
223 | +} | ||
224 | +#endif /* HAVE_AVAHI */ | ||
225 | + | ||
226 | + | ||
227 | /* | ||
228 | * 'cupsdStartBrowsing()' - Start sending and receiving broadcast information. | ||
229 | */ | ||
230 | @@ -1542,13 +1597,16 @@ cupsdStartBrowsing(void) | ||
231 | else | ||
232 | BrowseSocket = -1; | ||
233 | |||
234 | -#ifdef HAVE_DNSSD | ||
235 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
236 | if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_DNSSD) | ||
237 | { | ||
238 | +#ifdef HAVE_DNSSD | ||
239 | DNSServiceErrorType error; /* Error from service creation */ | ||
240 | +#endif /* HAVE_DNSSD */ | ||
241 | cupsd_listener_t *lis; /* Current listening socket */ | ||
242 | |||
243 | |||
244 | +#ifdef HAVE_DNSSD | ||
245 | /* | ||
246 | * First create a "master" connection for all registrations... | ||
247 | */ | ||
248 | @@ -1573,6 +1631,7 @@ cupsdStartBrowsing(void) | ||
249 | fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); | ||
250 | |||
251 | cupsdAddSelect(fd, (cupsd_selfunc_t)dnssdUpdate, NULL, NULL); | ||
252 | +#endif /* HAVE_DNSSD */ | ||
253 | |||
254 | /* | ||
255 | * Then get the port we use for registrations. If we are not listening | ||
256 | @@ -1598,17 +1657,23 @@ cupsdStartBrowsing(void) | ||
257 | */ | ||
258 | |||
259 | if (BrowseRemoteProtocols & BROWSE_DNSSD) | ||
260 | - DNSSDPrinters = cupsArrayNew((cups_array_func_t)dnssdComparePrinters, | ||
261 | - NULL); | ||
262 | + DNSSDPrinters = cupsArrayNew(NULL, NULL); | ||
263 | |||
264 | /* | ||
265 | * Set the computer name and register the web interface... | ||
266 | */ | ||
267 | |||
268 | cupsdUpdateDNSSDName(); | ||
269 | + | ||
270 | +#ifdef HAVE_AVAHI | ||
271 | + cupsdStartAvahiClient (); | ||
272 | +#endif /* HAVE_AVAHI */ | ||
273 | + | ||
274 | +#ifdef HAVE_DNSSD | ||
275 | } | ||
276 | - } | ||
277 | #endif /* HAVE_DNSSD */ | ||
278 | + } | ||
279 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
280 | |||
281 | #ifdef HAVE_LIBSLP | ||
282 | if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP) | ||
283 | @@ -1834,10 +1899,10 @@ cupsdStopBrowsing(void) | ||
284 | BrowseSocket = -1; | ||
285 | } | ||
286 | |||
287 | -#ifdef HAVE_DNSSD | ||
288 | - if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef) | ||
289 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
290 | + if ((BrowseLocalProtocols & BROWSE_DNSSD)) | ||
291 | dnssdStop(); | ||
292 | -#endif /* HAVE_DNSSD */ | ||
293 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
294 | |||
295 | #ifdef HAVE_LIBSLP | ||
296 | if (((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP) && | ||
297 | @@ -1902,7 +1967,7 @@ cupsdStopPolling(void) | ||
298 | } | ||
299 | |||
300 | |||
301 | -#ifdef HAVE_DNSSD | ||
302 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
303 | /* | ||
304 | * 'cupsdUpdateDNSSDName()' - Update the computer name we use for browsing... | ||
305 | */ | ||
306 | @@ -1910,8 +1975,14 @@ cupsdStopPolling(void) | ||
307 | void | ||
308 | cupsdUpdateDNSSDName(void) | ||
309 | { | ||
310 | +#ifdef HAVE_DNSSD | ||
311 | DNSServiceErrorType error; /* Error from service creation */ | ||
312 | char webif[1024]; /* Web interface share name */ | ||
313 | +#endif /* HAVE_DNSSD */ | ||
314 | +#ifdef HAVE_AVAHI | ||
315 | + int ret; /* Error from service creation */ | ||
316 | + char webif[AVAHI_LABEL_MAX]; /* Web interface share name */ | ||
317 | +#endif /* HAVE_AVAHI */ | ||
318 | # ifdef HAVE_SYSTEMCONFIGURATION | ||
319 | SCDynamicStoreRef sc; /* Context for dynamic store */ | ||
320 | CFDictionaryRef btmm; /* Back-to-My-Mac domains */ | ||
321 | @@ -2042,6 +2113,7 @@ cupsdUpdateDNSSDName(void) | ||
322 | else | ||
323 | strlcpy(webif, "CUPS Web Interface", sizeof(webif)); | ||
324 | |||
325 | +#ifdef HAVE_DNSSD | ||
326 | if (WebIFRef) | ||
327 | DNSServiceRefDeallocate(WebIFRef); | ||
328 | |||
329 | @@ -2054,9 +2126,45 @@ cupsdUpdateDNSSDName(void) | ||
330 | NULL)) != kDNSServiceErr_NoError) | ||
331 | cupsdLogMessage(CUPSD_LOG_ERROR, | ||
332 | "DNS-SD web interface registration failed: %d", error); | ||
333 | +#endif /* HAVE_DNSSD */ | ||
334 | + | ||
335 | +#ifdef HAVE_AVAHI | ||
336 | + if (!AvahiCupsClient) | ||
337 | + /* | ||
338 | + * Client not yet running. | ||
339 | + */ | ||
340 | + return; | ||
341 | + | ||
342 | + if (AvahiWebIFGroup) | ||
343 | + avahi_entry_group_reset (AvahiWebIFGroup); | ||
344 | + else | ||
345 | + AvahiWebIFGroup = avahi_entry_group_new (AvahiCupsClient, | ||
346 | + avahi_entry_group_cb, | ||
347 | + NULL); | ||
348 | + | ||
349 | + if (AvahiWebIFGroup) | ||
350 | + { | ||
351 | + ret = avahi_entry_group_add_service (AvahiWebIFGroup, | ||
352 | + AVAHI_IF_UNSPEC, | ||
353 | + AVAHI_PROTO_UNSPEC, | ||
354 | + 0, /* flags */ | ||
355 | + webif, /* name */ | ||
356 | + "_http._tcp", /* type */ | ||
357 | + NULL, /* domain */ | ||
358 | + NULL, /* host */ | ||
359 | + DNSSDPort, /* port */ | ||
360 | + "path=/", NULL); | ||
361 | + if (ret == 0) | ||
362 | + ret = avahi_entry_group_commit (AvahiWebIFGroup); | ||
363 | + | ||
364 | + if (ret != 0) | ||
365 | + cupsdLogMessage (CUPSD_LOG_ERROR, | ||
366 | + "Avahi web interface registration failed: %d", ret); | ||
367 | + } | ||
368 | +#endif /* HAVE_AVAHI */ | ||
369 | } | ||
370 | } | ||
371 | -#endif /* HAVE_DNSSD */ | ||
372 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
373 | |||
374 | |||
375 | #ifdef HAVE_LDAP | ||
376 | @@ -2334,13 +2442,15 @@ dnssdAddAlias(const void *key, /* I - K | ||
377 | "Bad Back to My Mac domain in dynamic store!"); | ||
378 | } | ||
379 | # endif /* HAVE_COREFOUNDATION */ | ||
380 | +#endif /* HAVE_DNSSD */ | ||
381 | |||
382 | |||
383 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
384 | /* | ||
385 | * 'dnssdBuildTxtRecord()' - Build a TXT record from printer info. | ||
386 | */ | ||
387 | |||
388 | -static char * /* O - TXT record */ | ||
389 | +static cupsd_txt_record_t /* O - TXT record */ | ||
390 | dnssdBuildTxtRecord( | ||
391 | int *txt_len, /* O - TXT record length */ | ||
392 | cupsd_printer_t *p, /* I - Printer information */ | ||
393 | @@ -2379,7 +2489,12 @@ dnssdBuildTxtRecord( | ||
394 | keyvalue[i ][0] = "ty"; | ||
395 | keyvalue[i++][1] = p->make_model ? p->make_model : "Unknown"; | ||
396 | |||
397 | - snprintf(admin_hostname, sizeof(admin_hostname), "%s.local.", DNSSDHostName); | ||
398 | + snprintf(admin_hostname, sizeof(admin_hostname), | ||
399 | + "%s.local" | ||
400 | +#ifdef HAVE_DNSSD | ||
401 | + "." /* terminating dot no good for Avahi */ | ||
402 | +#endif /* HAVE_DNSSD */ | ||
403 | + , DNSSDHostName); | ||
404 | httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl_str, sizeof(adminurl_str), | ||
405 | "http", NULL, admin_hostname, DNSSDPort, "/%s/%s", | ||
406 | (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", | ||
407 | @@ -2462,19 +2577,12 @@ dnssdBuildTxtRecord( | ||
408 | * Then pack them into a proper txt record... | ||
409 | */ | ||
410 | |||
411 | +#ifdef HAVE_DNSSD | ||
412 | return (dnssdPackTxtRecord(txt_len, keyvalue, i)); | ||
413 | -} | ||
414 | - | ||
415 | - | ||
416 | -/* | ||
417 | - * 'dnssdComparePrinters()' - Compare the registered names of two printers. | ||
418 | - */ | ||
419 | - | ||
420 | -static int /* O - Result of comparison */ | ||
421 | -dnssdComparePrinters(cupsd_printer_t *a,/* I - First printer */ | ||
422 | - cupsd_printer_t *b)/* I - Second printer */ | ||
423 | -{ | ||
424 | - return (_cups_strcasecmp(a->reg_name, b->reg_name)); | ||
425 | +#endif /* HAVE_DNSSD */ | ||
426 | +#ifdef HAVE_AVAHI | ||
427 | + return (avahiPackTxtRecord(keyvalue, i)); | ||
428 | +#endif /* HAVE_AVAHI */ | ||
429 | } | ||
430 | |||
431 | |||
432 | @@ -2489,6 +2597,10 @@ dnssdDeregisterPrinter( | ||
433 | { | ||
434 | cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdDeregisterPrinter(%s)", p->name); | ||
435 | |||
436 | +#ifdef HAVE_DNSSD | ||
437 | + if (!DNSSDRef) | ||
438 | + return; | ||
439 | + | ||
440 | /* | ||
441 | * Closing the socket deregisters the service | ||
442 | */ | ||
443 | @@ -2524,6 +2636,24 @@ dnssdDeregisterPrinter( | ||
444 | free(p->printer_txt); | ||
445 | p->printer_txt = NULL; | ||
446 | } | ||
447 | +#endif /* HAVE_DNSSD */ | ||
448 | + | ||
449 | +#ifdef HAVE_AVAHI | ||
450 | + if (p->avahi_group) | ||
451 | + { | ||
452 | + avahi_entry_group_reset (p->avahi_group); | ||
453 | + avahi_entry_group_free (p->avahi_group); | ||
454 | + p->avahi_group = NULL; | ||
455 | + | ||
456 | + if (p->ipp_txt) | ||
457 | + avahi_string_list_free (p->ipp_txt); | ||
458 | + | ||
459 | + if (p->printer_txt) | ||
460 | + avahi_string_list_free (p->printer_txt); | ||
461 | + | ||
462 | + p->ipp_txt = p->printer_txt = NULL; | ||
463 | + } | ||
464 | +#endif /* HAVE_AVAHI */ | ||
465 | |||
466 | /* | ||
467 | * Remove the printer from the array of DNS-SD printers, then clear the | ||
468 | @@ -2533,8 +2663,10 @@ dnssdDeregisterPrinter( | ||
469 | cupsArrayRemove(DNSSDPrinters, p); | ||
470 | cupsdClearString(&p->reg_name); | ||
471 | } | ||
472 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
473 | |||
474 | |||
475 | +#ifdef HAVE_DNSSD | ||
476 | /* | ||
477 | * 'dnssdPackTxtRecord()' - Pack an array of key/value pairs into the | ||
478 | * TXT record format. | ||
479 | @@ -2644,8 +2776,10 @@ dnssdRegisterCallback( | ||
480 | LastEvent |= CUPSD_EVENT_PRINTER_MODIFIED; | ||
481 | } | ||
482 | } | ||
483 | +#endif /* HAVE_DNSSD */ | ||
484 | |||
485 | |||
486 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
487 | /* | ||
488 | * 'dnssdRegisterPrinter()' - Start sending broadcast information for a printer | ||
489 | * or update the broadcast contents. | ||
490 | @@ -2654,20 +2788,40 @@ dnssdRegisterCallback( | ||
491 | static void | ||
492 | dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */ | ||
493 | { | ||
494 | +#ifdef HAVE_DNSSD | ||
495 | DNSServiceErrorType se; /* dnssd errors */ | ||
496 | char *ipp_txt, /* IPP TXT record buffer */ | ||
497 | *printer_txt, /* LPD TXT record buffer */ | ||
498 | - name[1024], /* Service name */ | ||
499 | - *nameptr; /* Pointer into name */ | ||
500 | + name[1024]; /* Service name */ | ||
501 | int ipp_len, /* IPP TXT record length */ | ||
502 | printer_len, /* LPD TXT record length */ | ||
503 | printer_port; /* LPD port number */ | ||
504 | +#endif /* HAVE_DNSSD */ | ||
505 | +#ifdef HAVE_AVAHI | ||
506 | + int ret; /* Error code */ | ||
507 | + AvahiStringList *ipp_txt, /* IPP TXT record */ | ||
508 | + *printer_txt; /* LPD TXT record */ | ||
509 | + char name[AVAHI_LABEL_MAX], /* Service name */ | ||
510 | + fullsubtype[AVAHI_LABEL_MAX]; /* Full subtype */ | ||
511 | + char *regtype_copy, /* Writeable copy of reg type */ | ||
512 | + *subtype, /* Current service sub type */ | ||
513 | + *nextsubtype; /* Next service sub type */ | ||
514 | +#endif /* HAVE_AVAHI */ | ||
515 | + char *nameptr; /* Pointer into name */ | ||
516 | const char *regtype; /* Registration type */ | ||
517 | |||
518 | |||
519 | +#ifdef HAVE_DNSSD | ||
520 | + if (!DNSSDRef) | ||
521 | + return; | ||
522 | + | ||
523 | cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name, | ||
524 | !p->ipp_ref ? "new" : "update"); | ||
525 | - | ||
526 | +#endif /* HAVE_DNSSD */ | ||
527 | +#ifdef HAVE_AVAHI | ||
528 | + cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name, | ||
529 | + !p->avahi_group ? "new" : "update"); | ||
530 | +#endif /* HAVE_AVAHI */ | ||
531 | /* | ||
532 | * If per-printer sharing was just disabled make sure we're not | ||
533 | * registered before returning. | ||
534 | @@ -2686,12 +2840,36 @@ dnssdRegisterPrinter(cupsd_printer_t *p) | ||
535 | if (p->info && strlen(p->info) > 0) | ||
536 | { | ||
537 | if (DNSSDComputerName) | ||
538 | - snprintf(name, sizeof(name), "%s @ %s", p->info, DNSSDComputerName); | ||
539 | + { | ||
540 | + /* | ||
541 | + * Make sure there is room for at least 15 characters of | ||
542 | + * DNSSDComputerName. | ||
543 | + */ | ||
544 | + | ||
545 | + assert(sizeof(name) >= 15 + 4); | ||
546 | + nameptr = name + strlcpy(name, p->info, | ||
547 | + sizeof(name) - 4 - | ||
548 | + strnlen(DNSSDComputerName, 15)); | ||
549 | + nameptr += strlcpy(nameptr, " @ ", sizeof(name) - (nameptr - name)); | ||
550 | + strlcpy(nameptr, DNSSDComputerName, sizeof(name) - (nameptr - name)); | ||
551 | + } | ||
552 | else | ||
553 | strlcpy(name, p->info, sizeof(name)); | ||
554 | } | ||
555 | else if (DNSSDComputerName) | ||
556 | - snprintf(name, sizeof(name), "%s @ %s", p->name, DNSSDComputerName); | ||
557 | + { | ||
558 | + /* | ||
559 | + * Make sure there is room for at least 15 characters of | ||
560 | + * DNSSDComputerName. | ||
561 | + */ | ||
562 | + | ||
563 | + assert(sizeof(name) >= 15 + 4); | ||
564 | + nameptr = name + strlcpy(name, p->info, | ||
565 | + sizeof(name) - 4 - | ||
566 | + strnlen(DNSSDComputerName, 15)); | ||
567 | + nameptr += strlcpy(nameptr, " @ ", sizeof(name) - (nameptr - name)); | ||
568 | + strlcpy(nameptr, DNSSDComputerName, sizeof(name) - (nameptr - name)); | ||
569 | + } | ||
570 | else | ||
571 | strlcpy(name, p->name, sizeof(name)); | ||
572 | |||
573 | @@ -2712,6 +2890,7 @@ dnssdRegisterPrinter(cupsd_printer_t *p) | ||
574 | * Register IPP and (optionally) LPD... | ||
575 | */ | ||
576 | |||
577 | +#ifdef HAVE_DNSSD | ||
578 | ipp_len = 0; /* anti-compiler-warning-code */ | ||
579 | ipp_txt = dnssdBuildTxtRecord(&ipp_len, p, 0); | ||
580 | |||
581 | @@ -2884,6 +3063,209 @@ dnssdRegisterPrinter(cupsd_printer_t *p) | ||
582 | |||
583 | if (printer_txt) | ||
584 | free(printer_txt); | ||
585 | +#endif /* HAVE_DNSSD */ | ||
586 | +#ifdef HAVE_AVAHI | ||
587 | + if (!AvahiCupsClient) | ||
588 | + /* | ||
589 | + * Client not running yet. The client callback will call us again later. | ||
590 | + */ | ||
591 | + return; | ||
592 | + | ||
593 | + ipp_txt = dnssdBuildTxtRecord(NULL, p, 0); | ||
594 | + printer_txt = dnssdBuildTxtRecord(NULL, p, 1); | ||
595 | + regtype = (p->type & CUPS_PRINTER_FAX) ? "_fax-ipp._tcp" : DNSSDRegType; | ||
596 | + | ||
597 | + if (p->avahi_group && p->ipp_txt && ipp_txt && | ||
598 | + !avahi_string_list_equal (p->ipp_txt, ipp_txt)) | ||
599 | + { | ||
600 | + /* | ||
601 | + * Update the existing registration... | ||
602 | + */ | ||
603 | + | ||
604 | + avahi_string_list_free (p->ipp_txt); | ||
605 | + | ||
606 | + if (p->printer_txt) | ||
607 | + avahi_string_list_free (p->printer_txt); | ||
608 | + | ||
609 | + /* | ||
610 | + * Update the service group entry. | ||
611 | + */ | ||
612 | + | ||
613 | + regtype_copy = strdup (regtype); | ||
614 | + subtype = strchr (regtype_copy, ','); | ||
615 | + if (subtype) | ||
616 | + *subtype = '\0'; | ||
617 | + | ||
618 | + cupsdLogMessage (CUPSD_LOG_DEBUG, | ||
619 | + "Updating TXT record for %s (%s)", name, regtype_copy); | ||
620 | + ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group, | ||
621 | + AVAHI_IF_UNSPEC, | ||
622 | + AVAHI_PROTO_UNSPEC, | ||
623 | + 0, name, | ||
624 | + regtype_copy, | ||
625 | + NULL, ipp_txt); | ||
626 | + free (regtype_copy); | ||
627 | + | ||
628 | + if (ret < 0) | ||
629 | + goto update_failed; | ||
630 | + | ||
631 | + p->ipp_txt = ipp_txt; | ||
632 | + ipp_txt = NULL; | ||
633 | + | ||
634 | + if (BrowseLocalProtocols & BROWSE_LPD) | ||
635 | + { | ||
636 | + ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group, | ||
637 | + AVAHI_IF_UNSPEC, | ||
638 | + AVAHI_PROTO_UNSPEC, | ||
639 | + 0, name, | ||
640 | + "_printer._tcp", NULL, | ||
641 | + printer_txt); | ||
642 | + if (ret < 0) | ||
643 | + goto update_failed; | ||
644 | + | ||
645 | + p->printer_txt = printer_txt; | ||
646 | + printer_txt = NULL; | ||
647 | + } | ||
648 | + | ||
649 | + ret = avahi_entry_group_commit (p->avahi_group); | ||
650 | + if (ret < 0) | ||
651 | + { | ||
652 | + update_failed: | ||
653 | + cupsdLogMessage (CUPSD_LOG_ERROR, | ||
654 | + "Failed to update TXT record for %s: %d", | ||
655 | + name, ret); | ||
656 | + avahi_entry_group_reset (p->avahi_group); | ||
657 | + avahi_entry_group_free (p->avahi_group); | ||
658 | + p->avahi_group = NULL; | ||
659 | + ipp_txt = p->ipp_txt; | ||
660 | + p->ipp_txt = NULL; | ||
661 | + } | ||
662 | + } | ||
663 | + | ||
664 | + if (!p->avahi_group) | ||
665 | + { | ||
666 | + /* | ||
667 | + * Initial registration. Use the _fax subtype for fax queues... | ||
668 | + */ | ||
669 | + | ||
670 | + p->avahi_group = avahi_entry_group_new (AvahiCupsClient, | ||
671 | + avahi_entry_group_cb, | ||
672 | + p); | ||
673 | + | ||
674 | + cupsdLogMessage(CUPSD_LOG_DEBUG, | ||
675 | + "Registering Avahi printer %s with name \"%s\" and " | ||
676 | + "type \"%s\"", p->name, name, regtype); | ||
677 | + | ||
678 | + if (!p->avahi_group) | ||
679 | + { | ||
680 | + ret = 0; | ||
681 | + goto add_failed; | ||
682 | + } | ||
683 | + | ||
684 | + /* | ||
685 | + * Add each service type (DNSSDRegType may contain several, | ||
686 | + * separated by commas). | ||
687 | + */ | ||
688 | + | ||
689 | + subtype = regtype_copy = strdup (regtype); | ||
690 | + while (subtype && *subtype) | ||
691 | + { | ||
692 | + nextsubtype = strchr (subtype, ','); | ||
693 | + if (nextsubtype) | ||
694 | + *nextsubtype++ = '\0'; | ||
695 | + | ||
696 | + if (subtype == regtype_copy) | ||
697 | + { | ||
698 | + /* | ||
699 | + * Main type entry. | ||
700 | + */ | ||
701 | + | ||
702 | + cupsdLogMessage (CUPSD_LOG_DEBUG, | ||
703 | + "Adding TXT record for %s (%s)", name, regtype_copy); | ||
704 | + ret = avahi_entry_group_add_service_strlst (p->avahi_group, | ||
705 | + AVAHI_IF_UNSPEC, | ||
706 | + AVAHI_PROTO_UNSPEC, | ||
707 | + 0, name, regtype_copy, | ||
708 | + NULL, NULL, | ||
709 | + DNSSDPort, | ||
710 | + ipp_txt); | ||
711 | + } | ||
712 | + else | ||
713 | + { | ||
714 | + /* | ||
715 | + * Sub-type entry. | ||
716 | + */ | ||
717 | + | ||
718 | + snprintf (fullsubtype, sizeof(fullsubtype), | ||
719 | + "%s._sub.%s", subtype, regtype_copy); | ||
720 | + cupsdLogMessage (CUPSD_LOG_DEBUG, | ||
721 | + "Adding TXT record for %s (%s)", name, fullsubtype); | ||
722 | + ret = avahi_entry_group_add_service_subtype (p->avahi_group, | ||
723 | + AVAHI_IF_UNSPEC, | ||
724 | + AVAHI_PROTO_UNSPEC, | ||
725 | + 0, name, | ||
726 | + regtype_copy, | ||
727 | + NULL, fullsubtype); | ||
728 | + } | ||
729 | + | ||
730 | + if (ret < 0) | ||
731 | + { | ||
732 | + free (regtype_copy); | ||
733 | + goto add_failed; | ||
734 | + } | ||
735 | + | ||
736 | + subtype = nextsubtype; | ||
737 | + } | ||
738 | + | ||
739 | + free (regtype_copy); | ||
740 | + p->ipp_txt = ipp_txt; | ||
741 | + ipp_txt = NULL; | ||
742 | + | ||
743 | + if (BrowseLocalProtocols & BROWSE_LPD) | ||
744 | + { | ||
745 | + cupsdLogMessage(CUPSD_LOG_DEBUG, | ||
746 | + "Registering Avahi printer %s with name \"%s\" and " | ||
747 | + "type \"_printer._tcp\"", p->name, name); | ||
748 | + | ||
749 | + ret = avahi_entry_group_add_service_strlst (p->avahi_group, | ||
750 | + AVAHI_IF_UNSPEC, | ||
751 | + AVAHI_PROTO_UNSPEC, | ||
752 | + 0, name, | ||
753 | + "_printer._tcp", NULL, NULL, | ||
754 | + 515, | ||
755 | + printer_txt); | ||
756 | + if (ret < 0) | ||
757 | + goto add_failed; | ||
758 | + | ||
759 | + p->printer_txt = printer_txt; | ||
760 | + printer_txt = NULL; | ||
761 | + } | ||
762 | + | ||
763 | + ret = avahi_entry_group_commit (p->avahi_group); | ||
764 | + | ||
765 | + if (ret < 0) | ||
766 | + { | ||
767 | + add_failed: | ||
768 | + cupsdLogMessage (CUPSD_LOG_ERROR, | ||
769 | + "Failed to add Avahi entry for %s: %d", | ||
770 | + name, ret); | ||
771 | + if (p->avahi_group) | ||
772 | + { | ||
773 | + avahi_entry_group_reset (p->avahi_group); | ||
774 | + avahi_entry_group_free (p->avahi_group); | ||
775 | + p->avahi_group = NULL; | ||
776 | + } | ||
777 | + ipp_txt = p->ipp_txt; | ||
778 | + p->ipp_txt = NULL; | ||
779 | + } | ||
780 | + } | ||
781 | + | ||
782 | + if (ipp_txt) | ||
783 | + avahi_string_list_free (ipp_txt); | ||
784 | + | ||
785 | + if (printer_txt) | ||
786 | + avahi_string_list_free (printer_txt); | ||
787 | +#endif /* HAVE_AVAHI */ | ||
788 | } | ||
789 | |||
790 | |||
791 | @@ -2896,6 +3278,10 @@ dnssdStop(void) | ||
792 | { | ||
793 | cupsd_printer_t *p; /* Current printer */ | ||
794 | |||
795 | +#ifdef HAVE_DNSSD | ||
796 | + if (!DNSSDRef) | ||
797 | + return; | ||
798 | +#endif /* HAVE_DNSSD */ | ||
799 | |||
800 | /* | ||
801 | * De-register the individual printers | ||
802 | @@ -2906,6 +3292,7 @@ dnssdStop(void) | ||
803 | p = (cupsd_printer_t *)cupsArrayNext(Printers)) | ||
804 | dnssdDeregisterPrinter(p); | ||
805 | |||
806 | +#ifdef HAVE_DNSSD | ||
807 | /* | ||
808 | * Shutdown the rest of the service refs... | ||
809 | */ | ||
810 | @@ -2926,14 +3313,17 @@ dnssdStop(void) | ||
811 | |||
812 | DNSServiceRefDeallocate(DNSSDRef); | ||
813 | DNSSDRef = NULL; | ||
814 | +#endif /* HAVE_DNSSD */ | ||
815 | |||
816 | cupsArrayDelete(DNSSDPrinters); | ||
817 | DNSSDPrinters = NULL; | ||
818 | |||
819 | DNSSDPort = 0; | ||
820 | } | ||
821 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
822 | |||
823 | |||
824 | +#ifdef HAVE_DNSSD | ||
825 | /* | ||
826 | * 'dnssdUpdate()' - Handle DNS-SD queries. | ||
827 | */ | ||
828 | @@ -2955,6 +3345,153 @@ dnssdUpdate(void) | ||
829 | #endif /* HAVE_DNSSD */ | ||
830 | |||
831 | |||
832 | +#ifdef HAVE_AVAHI | ||
833 | +/* | ||
834 | + * 'avahiPackTxtRecord()' - Pack an array of key/value pairs into an | ||
835 | + * AvahiStringList. | ||
836 | + */ | ||
837 | + | ||
838 | +static AvahiStringList * /* O - new string list */ | ||
839 | +avahiPackTxtRecord(char *keyvalue[][2], /* I - Table of key value pairs */ | ||
840 | + int count) /* I - Number of items in table */ | ||
841 | +{ | ||
842 | + AvahiStringList *strlst = NULL; | ||
843 | + char **elements; | ||
844 | + size_t len; | ||
845 | + int i = 0; | ||
846 | + | ||
847 | + elements = malloc ((1 + count) * sizeof (char *)); | ||
848 | + if (!elements) | ||
849 | + goto cleanup; | ||
850 | + | ||
851 | + for (i = 0; i < count; i++) | ||
852 | + { | ||
853 | + len = (1 + strlen (keyvalue[i][0]) + | ||
854 | + (keyvalue[i][1] ? 1 + strlen (keyvalue[i][1]) : 1)); | ||
855 | + elements[i] = malloc (len * sizeof (char)); | ||
856 | + if (!elements[i]) | ||
857 | + goto cleanup; | ||
858 | + | ||
859 | + snprintf (elements[i], len, "%s=%s", keyvalue[i][0], keyvalue[i][1]); | ||
860 | + } | ||
861 | + | ||
862 | + strlst = avahi_string_list_new_from_array ((const char **) elements, count); | ||
863 | + | ||
864 | +cleanup: | ||
865 | + while (--i >= 0) | ||
866 | + free (elements[i]); | ||
867 | + | ||
868 | + free (elements); | ||
869 | + return (strlst); | ||
870 | +} | ||
871 | + | ||
872 | + | ||
873 | +/* | ||
874 | + * 'avahi_entry_group_cb()' - Avahi entry group callback function. | ||
875 | + */ | ||
876 | +static void | ||
877 | +avahi_entry_group_cb (AvahiEntryGroup *group, | ||
878 | + AvahiEntryGroupState state, | ||
879 | + void *userdata) | ||
880 | +{ | ||
881 | + char *name; | ||
882 | + | ||
883 | + if (userdata) | ||
884 | + name = ((cupsd_printer_t *) userdata)->reg_name; | ||
885 | + else | ||
886 | + name = "CUPS web interface"; | ||
887 | + | ||
888 | + switch (state) | ||
889 | + { | ||
890 | + case AVAHI_ENTRY_GROUP_UNCOMMITED: | ||
891 | + case AVAHI_ENTRY_GROUP_REGISTERING: | ||
892 | + break; | ||
893 | + | ||
894 | + case AVAHI_ENTRY_GROUP_ESTABLISHED: | ||
895 | + cupsdLogMessage (CUPSD_LOG_DEBUG, | ||
896 | + "Avahi entry group established for %s", name); | ||
897 | + break; | ||
898 | + | ||
899 | + default: | ||
900 | + cupsdLogMessage (CUPSD_LOG_DEBUG, | ||
901 | + "Avahi entry group %s has state %d", | ||
902 | + name, state); | ||
903 | + break; | ||
904 | + } | ||
905 | +} | ||
906 | + | ||
907 | + | ||
908 | +/* | ||
909 | + * 'avahi_client_cb()' - Avahi client callback function. | ||
910 | + */ | ||
911 | +static void | ||
912 | +avahi_client_cb (AvahiClient *client, | ||
913 | + AvahiClientState state, | ||
914 | + void *userdata) | ||
915 | +{ | ||
916 | + cupsd_printer_t *printer; | ||
917 | + switch (state) | ||
918 | + { | ||
919 | + case AVAHI_CLIENT_S_RUNNING: | ||
920 | + /* | ||
921 | + * Avahi client started successfully. | ||
922 | + */ | ||
923 | + AvahiCupsClient = client; | ||
924 | + AvahiCupsClientConnecting = 0; | ||
925 | + cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client started"); | ||
926 | + | ||
927 | + cupsdUpdateDNSSDName (); | ||
928 | + | ||
929 | + for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); | ||
930 | + printer; | ||
931 | + printer = (cupsd_printer_t *)cupsArrayNext(Printers)) | ||
932 | + if (Browsing && (BrowseLocalProtocols & BROWSE_DNSSD) && | ||
933 | + (!(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | | ||
934 | + CUPS_PRINTER_SCANNER))) && printer->shared) | ||
935 | + dnssdRegisterPrinter (printer); | ||
936 | + | ||
937 | + break; | ||
938 | + | ||
939 | + case AVAHI_CLIENT_CONNECTING: | ||
940 | + /* | ||
941 | + * No Avahi daemon, client is waiting. | ||
942 | + */ | ||
943 | + cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client connecting"); | ||
944 | + break; | ||
945 | + | ||
946 | + case AVAHI_CLIENT_S_REGISTERING: | ||
947 | + /* | ||
948 | + * Not yet registered. | ||
949 | + */ | ||
950 | + cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client registering"); | ||
951 | + break; | ||
952 | + | ||
953 | + case AVAHI_CLIENT_FAILURE: | ||
954 | + /* | ||
955 | + * Avahi client failed, close it to allow a clean restart. | ||
956 | + */ | ||
957 | + cupsdLogMessage (CUPSD_LOG_ERROR, | ||
958 | + "Avahi client failed, " | ||
959 | + "closing client to allow a clean restart"); | ||
960 | + | ||
961 | + for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); | ||
962 | + printer; | ||
963 | + printer = (cupsd_printer_t *)cupsArrayNext(Printers)) | ||
964 | + dnssdDeregisterPrinter (printer); | ||
965 | + | ||
966 | + avahi_client_free(client); | ||
967 | + AvahiCupsClientConnecting = 0; | ||
968 | + AvahiCupsClient = NULL; | ||
969 | + | ||
970 | + break; | ||
971 | + | ||
972 | + default: | ||
973 | + cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client state: %d", state); | ||
974 | + } | ||
975 | +} | ||
976 | +#endif /* HAVE_AVAHI */ | ||
977 | + | ||
978 | + | ||
979 | /* | ||
980 | * 'get_auth_info_required()' - Get the auth-info-required value to advertise. | ||
981 | */ | ||
982 | diff -up cups-1.5.0/scheduler/dirsvc.h.avahi-5-services cups-1.5.0/scheduler/dirsvc.h | ||
983 | --- cups-1.5.0/scheduler/dirsvc.h.avahi-5-services 2011-03-21 02:12:14.000000000 +0000 | ||
984 | +++ cups-1.5.0/scheduler/dirsvc.h 2011-10-19 11:53:32.138177721 +0100 | ||
985 | @@ -31,6 +31,10 @@ | ||
986 | # endif /* HAVE_LDAP_SSL_H */ | ||
987 | #endif /* HAVE_LDAP */ | ||
988 | |||
989 | +#ifdef HAVE_AVAHI | ||
990 | +# include <avahi-client/publish.h> | ||
991 | +#endif /* HAVE_AVAHI */ | ||
992 | + | ||
993 | /* | ||
994 | * Browse protocols... | ||
995 | */ | ||
996 | @@ -131,19 +135,22 @@ VAR int PollPipe VALUE(0); | ||
997 | VAR cupsd_statbuf_t *PollStatusBuffer VALUE(NULL); | ||
998 | /* Status buffer for pollers */ | ||
999 | |||
1000 | -#ifdef HAVE_DNSSD | ||
1001 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
1002 | VAR char *DNSSDComputerName VALUE(NULL), | ||
1003 | /* Computer/server name */ | ||
1004 | *DNSSDHostName VALUE(NULL), | ||
1005 | /* Hostname */ | ||
1006 | *DNSSDRegType VALUE(NULL); | ||
1007 | /* Bonjour registration type */ | ||
1008 | -VAR cups_array_t *DNSSDAlias VALUE(NULL); | ||
1009 | - /* List of dynamic ServerAlias's */ | ||
1010 | VAR int DNSSDPort VALUE(0); | ||
1011 | /* Port number to register */ | ||
1012 | VAR cups_array_t *DNSSDPrinters VALUE(NULL); | ||
1013 | /* Printers we have registered */ | ||
1014 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
1015 | + | ||
1016 | +#ifdef HAVE_DNSSD | ||
1017 | +VAR cups_array_t *DNSSDAlias VALUE(NULL); | ||
1018 | + /* List of dynamic ServerAlias's */ | ||
1019 | VAR DNSServiceRef DNSSDRef VALUE(NULL), | ||
1020 | /* Master DNS-SD service reference */ | ||
1021 | WebIFRef VALUE(NULL), | ||
1022 | @@ -152,6 +159,17 @@ VAR DNSServiceRef DNSSDRef VALUE(NULL), | ||
1023 | /* Remote printer browse reference */ | ||
1024 | #endif /* HAVE_DNSSD */ | ||
1025 | |||
1026 | +#ifdef HAVE_AVAHI | ||
1027 | +VAR AvahiCupsPoll *AvahiCupsPollHandle VALUE(NULL); | ||
1028 | + /* AvahiCupsPoll object */ | ||
1029 | +VAR AvahiClient *AvahiCupsClient VALUE(NULL); | ||
1030 | + /* AvahiClient object */ | ||
1031 | +VAR int AvahiCupsClientConnecting VALUE(0); | ||
1032 | + /* Is AvahiClient object connecting? */ | ||
1033 | +VAR AvahiEntryGroup *AvahiWebIFGroup VALUE(NULL); | ||
1034 | + /* Web interface entry group */ | ||
1035 | +#endif /* HAVE_AVAHI */ | ||
1036 | + | ||
1037 | #ifdef HAVE_LIBSLP | ||
1038 | VAR SLPHandle BrowseSLPHandle VALUE(NULL); | ||
1039 | /* SLP API handle */ | ||
1040 | @@ -195,13 +213,14 @@ extern void cupsdRegisterPrinter(cupsd_p | ||
1041 | extern void cupsdRestartPolling(void); | ||
1042 | extern void cupsdSaveRemoteCache(void); | ||
1043 | extern void cupsdSendBrowseList(void); | ||
1044 | +extern void cupsdStartAvahiClient(void); | ||
1045 | extern void cupsdStartBrowsing(void); | ||
1046 | extern void cupsdStartPolling(void); | ||
1047 | extern void cupsdStopBrowsing(void); | ||
1048 | extern void cupsdStopPolling(void); | ||
1049 | -#ifdef HAVE_DNSSD | ||
1050 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
1051 | extern void cupsdUpdateDNSSDName(void); | ||
1052 | -#endif /* HAVE_DNSSD */ | ||
1053 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
1054 | #ifdef HAVE_LDAP | ||
1055 | extern void cupsdUpdateLDAPBrowse(void); | ||
1056 | #endif /* HAVE_LDAP */ | ||
1057 | diff -up cups-1.5.0/scheduler/ipp.c.avahi-5-services cups-1.5.0/scheduler/ipp.c | ||
1058 | --- cups-1.5.0/scheduler/ipp.c.avahi-5-services 2011-10-19 11:53:31.978180686 +0100 | ||
1059 | +++ cups-1.5.0/scheduler/ipp.c 2011-10-19 11:53:32.147177555 +0100 | ||
1060 | @@ -6096,7 +6096,7 @@ copy_printer_attrs( | ||
1061 | ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time", | ||
1062 | ippTimeToDate(curtime)); | ||
1063 | |||
1064 | -#ifdef HAVE_DNSSD | ||
1065 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
1066 | if (!ra || cupsArrayFind(ra, "printer-dns-sd-name")) | ||
1067 | { | ||
1068 | if (printer->reg_name) | ||
1069 | @@ -6106,7 +6106,7 @@ copy_printer_attrs( | ||
1070 | ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, | ||
1071 | "printer-dns-sd-name", 0); | ||
1072 | } | ||
1073 | -#endif /* HAVE_DNSSD */ | ||
1074 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
1075 | |||
1076 | if (!ra || cupsArrayFind(ra, "printer-error-policy")) | ||
1077 | ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, | ||
1078 | diff -up cups-1.5.0/scheduler/main.c.avahi-5-services cups-1.5.0/scheduler/main.c | ||
1079 | --- cups-1.5.0/scheduler/main.c.avahi-5-services 2011-10-19 11:53:32.101178406 +0100 | ||
1080 | +++ cups-1.5.0/scheduler/main.c 2011-10-19 11:53:32.151177479 +0100 | ||
1081 | @@ -120,6 +120,10 @@ main(int argc, /* I - Number of comm | ||
1082 | cupsd_listener_t *lis; /* Current listener */ | ||
1083 | time_t current_time, /* Current time */ | ||
1084 | activity, /* Client activity timer */ | ||
1085 | +#ifdef HAVE_AVAHI | ||
1086 | + avahi_client_time, /* Time for next Avahi client | ||
1087 | + check */ | ||
1088 | +#endif /* HAVE_AVAHI */ | ||
1089 | browse_time, /* Next browse send time */ | ||
1090 | senddoc_time, /* Send-Document time */ | ||
1091 | expire_time, /* Subscription expire time */ | ||
1092 | @@ -672,6 +676,9 @@ main(int argc, /* I - Number of comm | ||
1093 | */ | ||
1094 | |||
1095 | current_time = time(NULL); | ||
1096 | +#ifdef HAVE_AVAHI | ||
1097 | + avahi_client_time = current_time; | ||
1098 | +#endif /* HAVE_AVAHI */ | ||
1099 | browse_time = current_time; | ||
1100 | event_time = current_time; | ||
1101 | expire_time = current_time; | ||
1102 | @@ -894,6 +901,16 @@ main(int argc, /* I - Number of comm | ||
1103 | tmo = cupsdNextTimeout (&tmo_delay); | ||
1104 | if (tmo && tmo_delay == 0) | ||
1105 | cupsdRunTimeout (tmo); | ||
1106 | + | ||
1107 | + /* | ||
1108 | + * Try to restart the Avahi client every 10 seconds if needed... | ||
1109 | + */ | ||
1110 | + | ||
1111 | + if ((current_time - avahi_client_time) >= 10) | ||
1112 | + { | ||
1113 | + avahi_client_time = current_time; | ||
1114 | + cupsdStartAvahiClient(); | ||
1115 | + } | ||
1116 | #endif /* HAVE_AVAHI */ | ||
1117 | |||
1118 | #ifndef __APPLE__ | ||
1119 | diff -up cups-1.5.0/scheduler/printers.c.avahi-5-services cups-1.5.0/scheduler/printers.c | ||
1120 | --- cups-1.5.0/scheduler/printers.c.avahi-5-services 2011-10-19 11:53:31.916181835 +0100 | ||
1121 | +++ cups-1.5.0/scheduler/printers.c 2011-10-19 11:53:32.156177388 +0100 | ||
1122 | @@ -883,9 +883,9 @@ cupsdDeletePrinter( | ||
1123 | cupsdClearString(&p->alert); | ||
1124 | cupsdClearString(&p->alert_description); | ||
1125 | |||
1126 | -#ifdef HAVE_DNSSD | ||
1127 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
1128 | cupsdClearString(&p->pdl); | ||
1129 | -#endif /* HAVE_DNSSD */ | ||
1130 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
1131 | |||
1132 | cupsArrayDelete(p->filetypes); | ||
1133 | |||
1134 | @@ -3787,7 +3787,7 @@ add_printer_formats(cupsd_printer_t *p) | ||
1135 | attr->values[i].string.text = _cupsStrAlloc(mimetype); | ||
1136 | } | ||
1137 | |||
1138 | -#ifdef HAVE_DNSSD | ||
1139 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
1140 | { | ||
1141 | char pdl[1024]; /* Buffer to build pdl list */ | ||
1142 | mime_filter_t *filter; /* MIME filter looping var */ | ||
1143 | @@ -3843,7 +3843,7 @@ add_printer_formats(cupsd_printer_t *p) | ||
1144 | |||
1145 | cupsdSetString(&p->pdl, pdl); | ||
1146 | } | ||
1147 | -#endif /* HAVE_DNSSD */ | ||
1148 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
1149 | } | ||
1150 | |||
1151 | |||
1152 | diff -up cups-1.5.0/scheduler/printers.h.avahi-5-services cups-1.5.0/scheduler/printers.h | ||
1153 | --- cups-1.5.0/scheduler/printers.h.avahi-5-services 2011-03-18 18:42:46.000000000 +0000 | ||
1154 | +++ cups-1.5.0/scheduler/printers.h 2011-10-19 11:53:32.157177369 +0100 | ||
1155 | @@ -16,6 +16,9 @@ | ||
1156 | #ifdef HAVE_DNSSD | ||
1157 | # include <dns_sd.h> | ||
1158 | #endif /* HAVE_DNSSD */ | ||
1159 | +#ifdef HAVE_AVAHI | ||
1160 | +# include "avahi.h" | ||
1161 | +#endif /* HAVE_AVAHI */ | ||
1162 | #include <cups/pwg-private.h> | ||
1163 | |||
1164 | |||
1165 | @@ -95,16 +98,23 @@ struct cupsd_printer_s | ||
1166 | time_t marker_time; /* Last time marker attributes were updated */ | ||
1167 | _ppd_cache_t *pc; /* PPD cache and mapping data */ | ||
1168 | |||
1169 | -#ifdef HAVE_DNSSD | ||
1170 | +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) | ||
1171 | char *reg_name, /* Name used for service registration */ | ||
1172 | - *pdl, /* pdl value for TXT record */ | ||
1173 | - *ipp_txt, /* IPP TXT record contents */ | ||
1174 | + *pdl; /* pdl value for TXT record */ | ||
1175 | +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ | ||
1176 | +#ifdef HAVE_DNSSD | ||
1177 | + char *ipp_txt, /* IPP TXT record contents */ | ||
1178 | *printer_txt; /* LPD TXT record contents */ | ||
1179 | int ipp_len, /* IPP TXT record length */ | ||
1180 | printer_len; /* LPD TXT record length */ | ||
1181 | DNSServiceRef ipp_ref, /* Reference for _ipp._tcp,_cups */ | ||
1182 | printer_ref; /* Reference for _printer._tcp */ | ||
1183 | #endif /* HAVE_DNSSD */ | ||
1184 | +#ifdef HAVE_AVAHI | ||
1185 | + AvahiStringList *ipp_txt, /* IPP TXT record */ | ||
1186 | + *printer_txt; /* LPD TXT record */ | ||
1187 | + AvahiEntryGroup *avahi_group; /* Avahi entry group */ | ||
1188 | +#endif /* HAVE_AVAHI */ | ||
1189 | }; | ||
1190 | |||
1191 |