Contents of /trunk/cups/patches/cups-1.5.2-avahi-5-services.patch
Parent Directory | Revision Log
Revision 1642 -
(show 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 | 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 |