Annotation of /trunk/cups/patches/cups-1.5.2-avahi-3-timeouts.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: 9900 byte(s)
Thu Feb 16 08:44:18 2012 UTC (12 years, 7 months ago) by niro
File size: 9900 byte(s)
-added redhat/fedora avahi patches
1 | niro | 1642 | diff -up cups-1.5.0/scheduler/cupsd.h.avahi-3-timeouts cups-1.5.0/scheduler/cupsd.h |
2 | --- cups-1.5.0/scheduler/cupsd.h.avahi-3-timeouts 2011-05-11 23:17:34.000000000 +0100 | ||
3 | +++ cups-1.5.0/scheduler/cupsd.h 2011-10-07 13:20:41.522867324 +0100 | ||
4 | @@ -140,6 +140,15 @@ extern const char *cups_hstrerror(int); | ||
5 | |||
6 | typedef void (*cupsd_selfunc_t)(void *data); | ||
7 | |||
8 | +#ifdef HAVE_AVAHI | ||
9 | +/* | ||
10 | + * Timeout callback function type... | ||
11 | + */ | ||
12 | + | ||
13 | +typedef struct _cupsd_timeout_s cupsd_timeout_t; | ||
14 | +typedef void (*cupsd_timeoutfunc_t)(cupsd_timeout_t *timeout, void *data); | ||
15 | +#endif /* HAVE_AVAHI */ | ||
16 | + | ||
17 | |||
18 | /* | ||
19 | * Globals... | ||
20 | @@ -173,6 +182,11 @@ VAR int Launchd VALUE(0); | ||
21 | /* Running from launchd */ | ||
22 | #endif /* HAVE_LAUNCH_H */ | ||
23 | |||
24 | +#ifdef HAVE_AVAHI | ||
25 | +VAR cups_array_t *Timeouts; /* Timed callbacks for main loop */ | ||
26 | +#endif /* HAVE_AVAHI */ | ||
27 | + | ||
28 | + | ||
29 | |||
30 | /* | ||
31 | * Prototypes... | ||
32 | @@ -242,6 +256,20 @@ extern void cupsdStopSelect(void); | ||
33 | extern void cupsdStartServer(void); | ||
34 | extern void cupsdStopServer(void); | ||
35 | |||
36 | +#ifdef HAVE_AVAHI | ||
37 | +extern void cupsdInitTimeouts(void); | ||
38 | +extern cupsd_timeout_t *cupsdAddTimeout (const struct timeval *tv, | ||
39 | + cupsd_timeoutfunc_t cb, | ||
40 | + void *data); | ||
41 | +extern cupsd_timeout_t *cupsdNextTimeout (long *delay); | ||
42 | +extern void cupsdRunTimeout (cupsd_timeout_t *timeout); | ||
43 | +extern void cupsdUpdateTimeout (cupsd_timeout_t *timeout, | ||
44 | + const struct timeval *tv); | ||
45 | +extern void cupsdRemoveTimeout (cupsd_timeout_t *timeout); | ||
46 | +#endif /* HAVE_AVAHI */ | ||
47 | + | ||
48 | +extern int cupsdRemoveFile(const char *filename); | ||
49 | + | ||
50 | |||
51 | /* | ||
52 | * End of "$Id: cupsd.h 9766 2011-05-11 22:17:34Z mike $". | ||
53 | diff -up cups-1.5.0/scheduler/main.c.avahi-3-timeouts cups-1.5.0/scheduler/main.c | ||
54 | --- cups-1.5.0/scheduler/main.c.avahi-3-timeouts 2011-10-07 13:20:36.875954675 +0100 | ||
55 | +++ cups-1.5.0/scheduler/main.c 2011-10-07 13:20:41.524867282 +0100 | ||
56 | @@ -146,6 +146,10 @@ main(int argc, /* I - Number of comm | ||
57 | int launchd_idle_exit; | ||
58 | /* Idle exit on select timeout? */ | ||
59 | #endif /* HAVE_LAUNCHD */ | ||
60 | +#ifdef HAVE_AVAHI | ||
61 | + cupsd_timeout_t *tmo; /* Next scheduled timed callback */ | ||
62 | + long tmo_delay; /* Time before it must be called */ | ||
63 | +#endif /* HAVE_AVAHI */ | ||
64 | |||
65 | |||
66 | #ifdef HAVE_GETEUID | ||
67 | @@ -535,6 +539,14 @@ main(int argc, /* I - Number of comm | ||
68 | |||
69 | httpInitialize(); | ||
70 | |||
71 | +#ifdef HAVE_AVAHI | ||
72 | + /* | ||
73 | + * Initialize timed callback structures. | ||
74 | + */ | ||
75 | + | ||
76 | + cupsdInitTimeouts(); | ||
77 | +#endif /* HAVE_AVAHI */ | ||
78 | + | ||
79 | cupsdStartServer(); | ||
80 | |||
81 | /* | ||
82 | @@ -874,6 +886,16 @@ main(int argc, /* I - Number of comm | ||
83 | } | ||
84 | #endif /* __APPLE__ */ | ||
85 | |||
86 | +#ifdef HAVE_AVAHI | ||
87 | + /* | ||
88 | + * If a timed callback is due, run it. | ||
89 | + */ | ||
90 | + | ||
91 | + tmo = cupsdNextTimeout (&tmo_delay); | ||
92 | + if (tmo && tmo_delay == 0) | ||
93 | + cupsdRunTimeout (tmo); | ||
94 | +#endif /* HAVE_AVAHI */ | ||
95 | + | ||
96 | #ifndef __APPLE__ | ||
97 | /* | ||
98 | * Update the network interfaces once a minute... | ||
99 | @@ -1787,6 +1809,10 @@ select_timeout(int fds) /* I - Number | ||
100 | cupsd_job_t *job; /* Job information */ | ||
101 | cupsd_subscription_t *sub; /* Subscription information */ | ||
102 | const char *why; /* Debugging aid */ | ||
103 | +#ifdef HAVE_AVAHI | ||
104 | + cupsd_timeout_t *tmo; /* Timed callback */ | ||
105 | + long tmo_delay; /* Seconds before calling it */ | ||
106 | +#endif /* HAVE_AVAHI */ | ||
107 | |||
108 | |||
109 | /* | ||
110 | @@ -1829,6 +1855,19 @@ select_timeout(int fds) /* I - Number | ||
111 | } | ||
112 | #endif /* __APPLE__ */ | ||
113 | |||
114 | +#ifdef HAVE_AVAHI | ||
115 | + /* | ||
116 | + * See if there are any scheduled timed callbacks to run. | ||
117 | + */ | ||
118 | + | ||
119 | + tmo = cupsdNextTimeout (&tmo_delay); | ||
120 | + if (tmo) | ||
121 | + { | ||
122 | + timeout = tmo_delay; | ||
123 | + why = "run a timed callback"; | ||
124 | + } | ||
125 | +#endif /* HAVE_AVAHI */ | ||
126 | + | ||
127 | /* | ||
128 | * Check whether we are accepting new connections... | ||
129 | */ | ||
130 | diff -up cups-1.5.0/scheduler/Makefile.avahi-3-timeouts cups-1.5.0/scheduler/Makefile | ||
131 | --- cups-1.5.0/scheduler/Makefile.avahi-3-timeouts 2011-10-07 13:20:36.955953170 +0100 | ||
132 | +++ cups-1.5.0/scheduler/Makefile 2011-10-07 13:20:41.521867343 +0100 | ||
133 | @@ -39,7 +39,8 @@ CUPSDOBJS = \ | ||
134 | server.o \ | ||
135 | statbuf.o \ | ||
136 | subscriptions.o \ | ||
137 | - sysman.o | ||
138 | + sysman.o \ | ||
139 | + timeout.o | ||
140 | LIBOBJS = \ | ||
141 | filter.o \ | ||
142 | mime.o \ | ||
143 | diff -up cups-1.5.0/scheduler/timeout.c.avahi-3-timeouts cups-1.5.0/scheduler/timeout.c | ||
144 | --- cups-1.5.0/scheduler/timeout.c.avahi-3-timeouts 2011-10-07 13:20:41.525867259 +0100 | ||
145 | +++ cups-1.5.0/scheduler/timeout.c 2011-10-07 13:20:41.525867259 +0100 | ||
146 | @@ -0,0 +1,235 @@ | ||
147 | +/* | ||
148 | + * "$Id$" | ||
149 | + * | ||
150 | + * Timeout functions for the Common UNIX Printing System (CUPS). | ||
151 | + * | ||
152 | + * Copyright (C) 2010, 2011 Red Hat, Inc. | ||
153 | + * Authors: | ||
154 | + * Tim Waugh <twaugh@redhat.com> | ||
155 | + * | ||
156 | + * Redistribution and use in source and binary forms, with or without | ||
157 | + * modification, are permitted provided that the following conditions | ||
158 | + * are met: | ||
159 | + * | ||
160 | + * Redistributions of source code must retain the above copyright | ||
161 | + * notice, this list of conditions and the following disclaimer. | ||
162 | + * | ||
163 | + * Redistributions in binary form must reproduce the above copyright | ||
164 | + * notice, this list of conditions and the following disclaimer in the | ||
165 | + * documentation and/or other materials provided with the distribution. | ||
166 | + * | ||
167 | + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
168 | + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
169 | + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | ||
170 | + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
171 | + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | ||
172 | + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
173 | + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
174 | + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
175 | + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
176 | + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
177 | + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
178 | + * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
179 | + * | ||
180 | + * Contents: | ||
181 | + * | ||
182 | + * cupsdInitTimeouts() - Initialise timeout structure. | ||
183 | + * cupsdAddTimeout() - Add a timed callback. | ||
184 | + * cupsdNextTimeout() - Find the next enabled timed callback. | ||
185 | + * cupsdUpdateTimeout() - Adjust the time of a timed callback or disable it. | ||
186 | + * cupsdRemoveTimeout() - Discard a timed callback. | ||
187 | + * compare_timeouts() - Compare timed callbacks for array sorting. | ||
188 | + */ | ||
189 | + | ||
190 | +#include <config.h> | ||
191 | + | ||
192 | +#ifdef HAVE_AVAHI /* Applies to entire file... */ | ||
193 | + | ||
194 | +/* | ||
195 | + * Include necessary headers... | ||
196 | + */ | ||
197 | + | ||
198 | +#include "cupsd.h" | ||
199 | + | ||
200 | +#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) | ||
201 | +# include <malloc.h> | ||
202 | +#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */ | ||
203 | + | ||
204 | +#ifdef HAVE_AVAHI | ||
205 | +# include <avahi-common/timeval.h> | ||
206 | +#endif /* HAVE_AVAHI */ | ||
207 | + | ||
208 | + | ||
209 | +struct _cupsd_timeout_s | ||
210 | +{ | ||
211 | + struct timeval when; | ||
212 | + int enabled; | ||
213 | + cupsd_timeoutfunc_t callback; | ||
214 | + void *data; | ||
215 | +}; | ||
216 | + | ||
217 | +/* | ||
218 | + * Local functions... | ||
219 | + */ | ||
220 | + | ||
221 | +/* | ||
222 | + * 'compare_timeouts()' - Compare timed callbacks for array sorting. | ||
223 | + */ | ||
224 | + | ||
225 | +static int | ||
226 | +compare_addrs (void *p0, void *p1) | ||
227 | +{ | ||
228 | + if (p0 == p1) | ||
229 | + return (0); | ||
230 | + if (p0 < p1) | ||
231 | + return (-1); | ||
232 | + return (1); | ||
233 | +} | ||
234 | + | ||
235 | +static int | ||
236 | +compare_timeouts (cupsd_timeout_t *p0, cupsd_timeout_t *p1) | ||
237 | +{ | ||
238 | + int addrsdiff = compare_addrs (p0, p1); | ||
239 | + int tvdiff; | ||
240 | + | ||
241 | + if (addrsdiff == 0) | ||
242 | + return (0); | ||
243 | + | ||
244 | + if (!p0->enabled || !p1->enabled) | ||
245 | + { | ||
246 | + if (!p0->enabled && !p1->enabled) | ||
247 | + return (addrsdiff); | ||
248 | + | ||
249 | + return (p0->enabled ? -1 : 1); | ||
250 | + } | ||
251 | + | ||
252 | + tvdiff = avahi_timeval_compare (&p0->when, &p1->when); | ||
253 | + if (tvdiff != 0) | ||
254 | + return (tvdiff); | ||
255 | + | ||
256 | + return (addrsdiff); | ||
257 | +} | ||
258 | + | ||
259 | + | ||
260 | +/* | ||
261 | + * 'cupsdInitTimeouts()' - Initialise timeout structures. | ||
262 | + */ | ||
263 | + | ||
264 | +void | ||
265 | +cupsdInitTimeouts(void) | ||
266 | +{ | ||
267 | + Timeouts = cupsArrayNew ((cups_array_func_t)compare_timeouts, NULL); | ||
268 | +} | ||
269 | + | ||
270 | + | ||
271 | +/* | ||
272 | + * 'cupsdAddTimeout()' - Add a timed callback. | ||
273 | + */ | ||
274 | + | ||
275 | +cupsd_timeout_t * /* O - Timeout handle */ | ||
276 | +cupsdAddTimeout(const struct timeval *tv, /* I - Absolute time */ | ||
277 | + cupsd_timeoutfunc_t cb, /* I - Callback function */ | ||
278 | + void *data) /* I - User data */ | ||
279 | +{ | ||
280 | + cupsd_timeout_t *timeout; | ||
281 | + | ||
282 | + timeout = malloc (sizeof(cupsd_timeout_t)); | ||
283 | + if (timeout != NULL) | ||
284 | + { | ||
285 | + timeout->enabled = (tv != NULL); | ||
286 | + if (tv) | ||
287 | + { | ||
288 | + timeout->when.tv_sec = tv->tv_sec; | ||
289 | + timeout->when.tv_usec = tv->tv_usec; | ||
290 | + } | ||
291 | + | ||
292 | + timeout->callback = cb; | ||
293 | + timeout->data = data; | ||
294 | + cupsArrayAdd (Timeouts, timeout); | ||
295 | + } | ||
296 | + | ||
297 | + return timeout; | ||
298 | +} | ||
299 | + | ||
300 | + | ||
301 | +/* | ||
302 | + * 'cupsdNextTimeout()' - Find the next enabled timed callback. | ||
303 | + */ | ||
304 | + | ||
305 | +cupsd_timeout_t * /* O - Next enabled timeout or NULL */ | ||
306 | +cupsdNextTimeout(long *delay) /* O - Seconds before scheduled */ | ||
307 | +{ | ||
308 | + cupsd_timeout_t *first = cupsArrayFirst (Timeouts); | ||
309 | + struct timeval curtime; | ||
310 | + | ||
311 | + if (first && !first->enabled) | ||
312 | + first = NULL; | ||
313 | + | ||
314 | + if (first && delay) | ||
315 | + { | ||
316 | + gettimeofday (&curtime, NULL); | ||
317 | + if (avahi_timeval_compare (&curtime, &first->when) > 0) | ||
318 | + { | ||
319 | + *delay = 0; | ||
320 | + } else { | ||
321 | + *delay = 1 + first->when.tv_sec - curtime.tv_sec; | ||
322 | + if (first->when.tv_usec < curtime.tv_usec) | ||
323 | + (*delay)--; | ||
324 | + } | ||
325 | + } | ||
326 | + | ||
327 | + return (first); | ||
328 | +} | ||
329 | + | ||
330 | + | ||
331 | +/* | ||
332 | + * 'cupsdRunTimeout()' - Run a timed callback. | ||
333 | + */ | ||
334 | + | ||
335 | +void | ||
336 | +cupsdRunTimeout(cupsd_timeout_t *timeout) /* I - Timeout */ | ||
337 | +{ | ||
338 | + if (!timeout) | ||
339 | + return; | ||
340 | + timeout->enabled = 0; | ||
341 | + if (!timeout->callback) | ||
342 | + return; | ||
343 | + timeout->callback (timeout, timeout->data); | ||
344 | +} | ||
345 | + | ||
346 | +/* | ||
347 | + * 'cupsdUpdateTimeout()' - Adjust the time of a timed callback or disable it. | ||
348 | + */ | ||
349 | + | ||
350 | +void | ||
351 | +cupsdUpdateTimeout(cupsd_timeout_t *timeout, /* I - Timeout */ | ||
352 | + const struct timeval *tv) /* I - Absolute time or NULL */ | ||
353 | +{ | ||
354 | + cupsArrayRemove (Timeouts, timeout); | ||
355 | + timeout->enabled = (tv != NULL); | ||
356 | + if (tv) | ||
357 | + { | ||
358 | + timeout->when.tv_sec = tv->tv_sec; | ||
359 | + timeout->when.tv_usec = tv->tv_usec; | ||
360 | + } | ||
361 | + cupsArrayAdd (Timeouts, timeout); | ||
362 | +} | ||
363 | + | ||
364 | + | ||
365 | +/* | ||
366 | + * 'cupsdRemoveTimeout()' - Discard a timed callback. | ||
367 | + */ | ||
368 | + | ||
369 | +void | ||
370 | +cupsdRemoveTimeout(cupsd_timeout_t *timeout) /* I - Timeout */ | ||
371 | +{ | ||
372 | + cupsArrayRemove (Timeouts, timeout); | ||
373 | + free (timeout); | ||
374 | +} | ||
375 | + | ||
376 | + | ||
377 | +#endif /* HAVE_AVAHI ... from top of file */ | ||
378 | + | ||
379 | +/* | ||
380 | + * End of "$Id$". | ||
381 | + */ |