]> git.pld-linux.org Git - packages/cups.git/blame - cups-avahi-3-timeouts.patch
- rel 2; add ipp14 backend; fixes for ipp15 backend; other fixes - everything from...
[packages/cups.git] / cups-avahi-3-timeouts.patch
CommitLineData
ec7a81b2
JR
1diff -up cups-1.5.2/scheduler/cupsd.h.avahi-3-timeouts cups-1.5.2/scheduler/cupsd.h
2--- cups-1.5.2/scheduler/cupsd.h.avahi-3-timeouts 2011-05-11 23:17:34.000000000 +0100
3+++ cups-1.5.2/scheduler/cupsd.h 2012-03-14 15:06:36.509476983 +0000
d07e62b1
ER
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$".
ec7a81b2
JR
53diff -up cups-1.5.2/scheduler/main.c.avahi-3-timeouts cups-1.5.2/scheduler/main.c
54--- cups-1.5.2/scheduler/main.c.avahi-3-timeouts 2012-03-14 15:04:17.655305548 +0000
55+++ cups-1.5.2/scheduler/main.c 2012-03-14 15:06:36.511476986 +0000
d07e62b1
ER
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...
ec7a81b2 99@@ -1787,6 +1809,10 @@ select_timeout(int fds) /* I - Number
d07e62b1
ER
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 /*
ec7a81b2 110@@ -1829,6 +1855,19 @@ select_timeout(int fds) /* I - Number
d07e62b1
ER
111 }
112 #endif /* __APPLE__ */
113
114+#ifdef HAVE_AVAHI
115+ /*
116+ * See if there are any scheduled timed callbacks to run.
117+ */
118+
ec7a81b2
JR
119+ if ((tmo = cupsdNextTimeout(&tmo_delay)) != NULL &&
120+ (now + tmo_delay) < timeout)
d07e62b1
ER
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 */
ec7a81b2
JR
130diff -up cups-1.5.2/scheduler/Makefile.avahi-3-timeouts cups-1.5.2/scheduler/Makefile
131--- cups-1.5.2/scheduler/Makefile.avahi-3-timeouts 2012-03-14 15:04:17.685305586 +0000
132+++ cups-1.5.2/scheduler/Makefile 2012-03-14 15:06:36.508476980 +0000
d07e62b1
ER
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 \
ec7a81b2
JR
143diff -up cups-1.5.2/scheduler/timeout.c.avahi-3-timeouts cups-1.5.2/scheduler/timeout.c
144--- cups-1.5.2/scheduler/timeout.c.avahi-3-timeouts 2012-03-14 15:06:36.552477037 +0000
145+++ cups-1.5.2/scheduler/timeout.c 2012-03-14 15:06:36.552477037 +0000
146@@ -0,0 +1,235 @@
d07e62b1
ER
147+/*
148+ * "$Id$"
149+ *
150+ * Timeout functions for the Common UNIX Printing System (CUPS).
151+ *
ec7a81b2 152+ * Copyright (C) 2010, 2011 Red Hat, Inc.
d07e62b1
ER
153+ * Authors:
154+ * Tim Waugh <twaugh@redhat.com>
155+ *
ec7a81b2
JR
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.
d07e62b1
ER
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
ec7a81b2
JR
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
d07e62b1
ER
236+compare_timeouts (cupsd_timeout_t *p0, cupsd_timeout_t *p1)
237+{
ec7a81b2
JR
238+ int addrsdiff = compare_addrs (p0, p1);
239+ int tvdiff;
240+
241+ if (addrsdiff == 0)
242+ return (0);
243+
d07e62b1
ER
244+ if (!p0->enabled || !p1->enabled)
245+ {
246+ if (!p0->enabled && !p1->enabled)
ec7a81b2 247+ return (addrsdiff);
d07e62b1
ER
248+
249+ return (p0->enabled ? -1 : 1);
250+ }
251+
ec7a81b2
JR
252+ tvdiff = avahi_timeval_compare (&p0->when, &p1->when);
253+ if (tvdiff != 0)
254+ return (tvdiff);
255+
256+ return (addrsdiff);
d07e62b1
ER
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+ */
This page took 0.088519 seconds and 4 git commands to generate.