xref: /aosp_15_r20/external/libcups/notifier/dbus.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * D-Bus notifier for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2008-2014 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright (C) 2011, 2013 Red Hat, Inc.
6*5e7646d2SAndroid Build Coastguard Worker  * Copyright (C) 2007 Tim Waugh <[email protected]>
7*5e7646d2SAndroid Build Coastguard Worker  * Copyright 1997-2005 by Easy Software Products.
8*5e7646d2SAndroid Build Coastguard Worker  *
9*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
10*5e7646d2SAndroid Build Coastguard Worker  */
11*5e7646d2SAndroid Build Coastguard Worker 
12*5e7646d2SAndroid Build Coastguard Worker /*
13*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
14*5e7646d2SAndroid Build Coastguard Worker  */
15*5e7646d2SAndroid Build Coastguard Worker 
16*5e7646d2SAndroid Build Coastguard Worker #include <cups/cups.h>
17*5e7646d2SAndroid Build Coastguard Worker #include <cups/string-private.h>
18*5e7646d2SAndroid Build Coastguard Worker #include <fcntl.h>
19*5e7646d2SAndroid Build Coastguard Worker #include <signal.h>
20*5e7646d2SAndroid Build Coastguard Worker #include <sys/stat.h>
21*5e7646d2SAndroid Build Coastguard Worker #include <sys/types.h>
22*5e7646d2SAndroid Build Coastguard Worker #include <unistd.h>
23*5e7646d2SAndroid Build Coastguard Worker 
24*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_DBUS
25*5e7646d2SAndroid Build Coastguard Worker #  include <dbus/dbus.h>
26*5e7646d2SAndroid Build Coastguard Worker #  ifdef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND
27*5e7646d2SAndroid Build Coastguard Worker #    define dbus_message_append_iter_init dbus_message_iter_init_append
28*5e7646d2SAndroid Build Coastguard Worker #    define dbus_message_iter_append_string(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, v)
29*5e7646d2SAndroid Build Coastguard Worker #    define dbus_message_iter_append_uint32(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_UINT32, v)
30*5e7646d2SAndroid Build Coastguard Worker #    define dbus_message_iter_append_boolean(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, v)
31*5e7646d2SAndroid Build Coastguard Worker #  endif /* HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */
32*5e7646d2SAndroid Build Coastguard Worker 
33*5e7646d2SAndroid Build Coastguard Worker 
34*5e7646d2SAndroid Build Coastguard Worker /*
35*5e7646d2SAndroid Build Coastguard Worker  * D-Bus object: org.cups.cupsd.Notifier
36*5e7646d2SAndroid Build Coastguard Worker  * D-Bus object path: /org/cups/cupsd/Notifier
37*5e7646d2SAndroid Build Coastguard Worker  *
38*5e7646d2SAndroid Build Coastguard Worker  * D-Bus interface name: org.cups.cupsd.Notifier
39*5e7646d2SAndroid Build Coastguard Worker  *
40*5e7646d2SAndroid Build Coastguard Worker  * Signals:
41*5e7646d2SAndroid Build Coastguard Worker  *
42*5e7646d2SAndroid Build Coastguard Worker  * ServerRestarted(STRING text)
43*5e7646d2SAndroid Build Coastguard Worker  * Server has restarted.
44*5e7646d2SAndroid Build Coastguard Worker  *
45*5e7646d2SAndroid Build Coastguard Worker  * ServerStarted(STRING text)
46*5e7646d2SAndroid Build Coastguard Worker  * Server has started.
47*5e7646d2SAndroid Build Coastguard Worker  *
48*5e7646d2SAndroid Build Coastguard Worker  * ServerStopped(STRING text)
49*5e7646d2SAndroid Build Coastguard Worker  * Server has stopped.
50*5e7646d2SAndroid Build Coastguard Worker  *
51*5e7646d2SAndroid Build Coastguard Worker  * ServerAudit(STRING text)
52*5e7646d2SAndroid Build Coastguard Worker  * Security-related event.
53*5e7646d2SAndroid Build Coastguard Worker  *
54*5e7646d2SAndroid Build Coastguard Worker  * PrinterRestarted(STRING text,
55*5e7646d2SAndroid Build Coastguard Worker  *                  STRING printer-uri,
56*5e7646d2SAndroid Build Coastguard Worker  *                  STRING printer-name,
57*5e7646d2SAndroid Build Coastguard Worker  *                  UINT32 printer-state,
58*5e7646d2SAndroid Build Coastguard Worker  *                  STRING printer-state-reasons,
59*5e7646d2SAndroid Build Coastguard Worker  *                  BOOLEAN printer-is-accepting-jobs)
60*5e7646d2SAndroid Build Coastguard Worker  * Printer has restarted.
61*5e7646d2SAndroid Build Coastguard Worker  *
62*5e7646d2SAndroid Build Coastguard Worker  * PrinterShutdown(STRING text,
63*5e7646d2SAndroid Build Coastguard Worker  *                 STRING printer-uri,
64*5e7646d2SAndroid Build Coastguard Worker  *                 STRING printer-name,
65*5e7646d2SAndroid Build Coastguard Worker  *                 UINT32 printer-state,
66*5e7646d2SAndroid Build Coastguard Worker  *                 STRING printer-state-reasons,
67*5e7646d2SAndroid Build Coastguard Worker  *                 BOOLEAN printer-is-accepting-jobs)
68*5e7646d2SAndroid Build Coastguard Worker  * Printer has shutdown.
69*5e7646d2SAndroid Build Coastguard Worker  *
70*5e7646d2SAndroid Build Coastguard Worker  * PrinterStopped(STRING text,
71*5e7646d2SAndroid Build Coastguard Worker  *                STRING printer-uri,
72*5e7646d2SAndroid Build Coastguard Worker  *                STRING printer-name,
73*5e7646d2SAndroid Build Coastguard Worker  *                UINT32 printer-state,
74*5e7646d2SAndroid Build Coastguard Worker  *                STRING printer-state-reasons,
75*5e7646d2SAndroid Build Coastguard Worker  *                BOOLEAN printer-is-accepting-jobs)
76*5e7646d2SAndroid Build Coastguard Worker  * Printer has stopped.
77*5e7646d2SAndroid Build Coastguard Worker  *
78*5e7646d2SAndroid Build Coastguard Worker  * PrinterStateChanged(STRING text,
79*5e7646d2SAndroid Build Coastguard Worker  *                     STRING printer-uri,
80*5e7646d2SAndroid Build Coastguard Worker  *                     STRING printer-name,
81*5e7646d2SAndroid Build Coastguard Worker  *                     UINT32 printer-state,
82*5e7646d2SAndroid Build Coastguard Worker  *                     STRING printer-state-reasons,
83*5e7646d2SAndroid Build Coastguard Worker  *                     BOOLEAN printer-is-accepting-jobs)
84*5e7646d2SAndroid Build Coastguard Worker  * Printer state has changed.
85*5e7646d2SAndroid Build Coastguard Worker  *
86*5e7646d2SAndroid Build Coastguard Worker  * PrinterFinishingsChanged(STRING text,
87*5e7646d2SAndroid Build Coastguard Worker  *                          STRING printer-uri,
88*5e7646d2SAndroid Build Coastguard Worker  *                          STRING printer-name,
89*5e7646d2SAndroid Build Coastguard Worker  *                          UINT32 printer-state,
90*5e7646d2SAndroid Build Coastguard Worker  *                          STRING printer-state-reasons,
91*5e7646d2SAndroid Build Coastguard Worker  *                          BOOLEAN printer-is-accepting-jobs)
92*5e7646d2SAndroid Build Coastguard Worker  * Printer's finishings-supported attribute has changed.
93*5e7646d2SAndroid Build Coastguard Worker  *
94*5e7646d2SAndroid Build Coastguard Worker  * PrinterMediaChanged(STRING text,
95*5e7646d2SAndroid Build Coastguard Worker  *                     STRING printer-uri,
96*5e7646d2SAndroid Build Coastguard Worker  *                     STRING printer-name,
97*5e7646d2SAndroid Build Coastguard Worker  *                     UINT32 printer-state,
98*5e7646d2SAndroid Build Coastguard Worker  *                     STRING printer-state-reasons,
99*5e7646d2SAndroid Build Coastguard Worker  *                     BOOLEAN printer-is-accepting-jobs)
100*5e7646d2SAndroid Build Coastguard Worker  * Printer's media-supported attribute has changed.
101*5e7646d2SAndroid Build Coastguard Worker  *
102*5e7646d2SAndroid Build Coastguard Worker  * PrinterAdded(STRING text,
103*5e7646d2SAndroid Build Coastguard Worker  *              STRING printer-uri,
104*5e7646d2SAndroid Build Coastguard Worker  *              STRING printer-name,
105*5e7646d2SAndroid Build Coastguard Worker  *              UINT32 printer-state,
106*5e7646d2SAndroid Build Coastguard Worker  *              STRING printer-state-reasons,
107*5e7646d2SAndroid Build Coastguard Worker  *              BOOLEAN printer-is-accepting-jobs)
108*5e7646d2SAndroid Build Coastguard Worker  * Printer has been added.
109*5e7646d2SAndroid Build Coastguard Worker  *
110*5e7646d2SAndroid Build Coastguard Worker  * PrinterDeleted(STRING text,
111*5e7646d2SAndroid Build Coastguard Worker  *                STRING printer-uri,
112*5e7646d2SAndroid Build Coastguard Worker  *                STRING printer-name,
113*5e7646d2SAndroid Build Coastguard Worker  *                UINT32 printer-state,
114*5e7646d2SAndroid Build Coastguard Worker  *                STRING printer-state-reasons,
115*5e7646d2SAndroid Build Coastguard Worker  *                BOOLEAN printer-is-accepting-jobs)
116*5e7646d2SAndroid Build Coastguard Worker  * Printer has been deleted.
117*5e7646d2SAndroid Build Coastguard Worker  *
118*5e7646d2SAndroid Build Coastguard Worker  * PrinterModified(STRING text,
119*5e7646d2SAndroid Build Coastguard Worker  *                 STRING printer-uri,
120*5e7646d2SAndroid Build Coastguard Worker  *                 STRING printer-name,
121*5e7646d2SAndroid Build Coastguard Worker  *                 UINT32 printer-state,
122*5e7646d2SAndroid Build Coastguard Worker  *                 STRING printer-state-reasons,
123*5e7646d2SAndroid Build Coastguard Worker  *                 BOOLEAN printer-is-accepting-jobs)
124*5e7646d2SAndroid Build Coastguard Worker  * Printer has been modified.
125*5e7646d2SAndroid Build Coastguard Worker  *
126*5e7646d2SAndroid Build Coastguard Worker  * text describes the event.
127*5e7646d2SAndroid Build Coastguard Worker  * printer-state-reasons is a comma-separated list.
128*5e7646d2SAndroid Build Coastguard Worker  * If printer-uri is "" in a Job* signal, the other printer-* parameters
129*5e7646d2SAndroid Build Coastguard Worker  * must be ignored.
130*5e7646d2SAndroid Build Coastguard Worker  * If the job name is not know, job-name will be "".
131*5e7646d2SAndroid Build Coastguard Worker  */
132*5e7646d2SAndroid Build Coastguard Worker 
133*5e7646d2SAndroid Build Coastguard Worker /*
134*5e7646d2SAndroid Build Coastguard Worker  * Constants...
135*5e7646d2SAndroid Build Coastguard Worker  */
136*5e7646d2SAndroid Build Coastguard Worker 
137*5e7646d2SAndroid Build Coastguard Worker enum
138*5e7646d2SAndroid Build Coastguard Worker {
139*5e7646d2SAndroid Build Coastguard Worker   PARAMS_NONE,
140*5e7646d2SAndroid Build Coastguard Worker   PARAMS_PRINTER,
141*5e7646d2SAndroid Build Coastguard Worker   PARAMS_JOB
142*5e7646d2SAndroid Build Coastguard Worker };
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker 
145*5e7646d2SAndroid Build Coastguard Worker /*
146*5e7646d2SAndroid Build Coastguard Worker  * Global variables...
147*5e7646d2SAndroid Build Coastguard Worker  */
148*5e7646d2SAndroid Build Coastguard Worker 
149*5e7646d2SAndroid Build Coastguard Worker static char		lock_filename[1024];	/* Lock filename */
150*5e7646d2SAndroid Build Coastguard Worker 
151*5e7646d2SAndroid Build Coastguard Worker 
152*5e7646d2SAndroid Build Coastguard Worker /*
153*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
154*5e7646d2SAndroid Build Coastguard Worker  */
155*5e7646d2SAndroid Build Coastguard Worker 
156*5e7646d2SAndroid Build Coastguard Worker static int	acquire_lock(int *fd, char *lockfile, size_t locksize);
157*5e7646d2SAndroid Build Coastguard Worker static void	release_lock(void);
158*5e7646d2SAndroid Build Coastguard Worker 
159*5e7646d2SAndroid Build Coastguard Worker 
160*5e7646d2SAndroid Build Coastguard Worker /*
161*5e7646d2SAndroid Build Coastguard Worker  * 'main()' - Read events and send DBUS notifications.
162*5e7646d2SAndroid Build Coastguard Worker  */
163*5e7646d2SAndroid Build Coastguard Worker 
164*5e7646d2SAndroid Build Coastguard Worker int					/* O - Exit status */
main(int argc,char * argv[])165*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				/* I - Number of command-line args */
166*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			/* I - Command-line arguments */
167*5e7646d2SAndroid Build Coastguard Worker {
168*5e7646d2SAndroid Build Coastguard Worker   ipp_t			*msg;		/* Event message from scheduler */
169*5e7646d2SAndroid Build Coastguard Worker   ipp_state_t		state;		/* IPP event state */
170*5e7646d2SAndroid Build Coastguard Worker   struct sigaction	action;		/* POSIX sigaction data */
171*5e7646d2SAndroid Build Coastguard Worker   DBusConnection	*con = NULL;	/* Connection to DBUS server */
172*5e7646d2SAndroid Build Coastguard Worker   DBusError		error;		/* Error, if any */
173*5e7646d2SAndroid Build Coastguard Worker   DBusMessage		*message;	/* Message to send */
174*5e7646d2SAndroid Build Coastguard Worker   DBusMessageIter	iter;		/* Iterator for message data */
175*5e7646d2SAndroid Build Coastguard Worker   int			lock_fd = -1;	/* Lock file descriptor */
176*5e7646d2SAndroid Build Coastguard Worker 
177*5e7646d2SAndroid Build Coastguard Worker 
178*5e7646d2SAndroid Build Coastguard Worker  /*
179*5e7646d2SAndroid Build Coastguard Worker   * Don't buffer stderr...
180*5e7646d2SAndroid Build Coastguard Worker   */
181*5e7646d2SAndroid Build Coastguard Worker 
182*5e7646d2SAndroid Build Coastguard Worker   setbuf(stderr, NULL);
183*5e7646d2SAndroid Build Coastguard Worker 
184*5e7646d2SAndroid Build Coastguard Worker  /*
185*5e7646d2SAndroid Build Coastguard Worker   * Ignore SIGPIPE signals...
186*5e7646d2SAndroid Build Coastguard Worker   */
187*5e7646d2SAndroid Build Coastguard Worker 
188*5e7646d2SAndroid Build Coastguard Worker   memset(&action, 0, sizeof(action));
189*5e7646d2SAndroid Build Coastguard Worker   action.sa_handler = SIG_IGN;
190*5e7646d2SAndroid Build Coastguard Worker   sigaction(SIGPIPE, &action, NULL);
191*5e7646d2SAndroid Build Coastguard Worker 
192*5e7646d2SAndroid Build Coastguard Worker  /*
193*5e7646d2SAndroid Build Coastguard Worker   * Validate command-line options...
194*5e7646d2SAndroid Build Coastguard Worker   */
195*5e7646d2SAndroid Build Coastguard Worker 
196*5e7646d2SAndroid Build Coastguard Worker   if (argc != 3)
197*5e7646d2SAndroid Build Coastguard Worker   {
198*5e7646d2SAndroid Build Coastguard Worker     fputs("Usage: dbus dbus:/// notify-user-data\n", stderr);
199*5e7646d2SAndroid Build Coastguard Worker     return (1);
200*5e7646d2SAndroid Build Coastguard Worker   }
201*5e7646d2SAndroid Build Coastguard Worker 
202*5e7646d2SAndroid Build Coastguard Worker   if (strncmp(argv[1], "dbus:", 5))
203*5e7646d2SAndroid Build Coastguard Worker   {
204*5e7646d2SAndroid Build Coastguard Worker     fprintf(stderr, "ERROR: Bad URI \"%s\"!\n", argv[1]);
205*5e7646d2SAndroid Build Coastguard Worker     return (1);
206*5e7646d2SAndroid Build Coastguard Worker   }
207*5e7646d2SAndroid Build Coastguard Worker 
208*5e7646d2SAndroid Build Coastguard Worker  /*
209*5e7646d2SAndroid Build Coastguard Worker   * Loop forever until we run out of events...
210*5e7646d2SAndroid Build Coastguard Worker   */
211*5e7646d2SAndroid Build Coastguard Worker 
212*5e7646d2SAndroid Build Coastguard Worker   for (;;)
213*5e7646d2SAndroid Build Coastguard Worker   {
214*5e7646d2SAndroid Build Coastguard Worker     ipp_attribute_t	*attr;		/* Current attribute */
215*5e7646d2SAndroid Build Coastguard Worker     const char		*event;		/* Event name */
216*5e7646d2SAndroid Build Coastguard Worker     const char		*signame = NULL;/* DBUS signal name */
217*5e7646d2SAndroid Build Coastguard Worker     char		*printer_reasons = NULL;
218*5e7646d2SAndroid Build Coastguard Worker 					/* Printer reasons string */
219*5e7646d2SAndroid Build Coastguard Worker     char		*job_reasons = NULL;
220*5e7646d2SAndroid Build Coastguard Worker 					/* Job reasons string */
221*5e7646d2SAndroid Build Coastguard Worker     const char		*nul = "";	/* Empty string value */
222*5e7646d2SAndroid Build Coastguard Worker     int			no = 0;		/* Boolean "no" value */
223*5e7646d2SAndroid Build Coastguard Worker     int			params = PARAMS_NONE;
224*5e7646d2SAndroid Build Coastguard Worker 					/* What parameters to include? */
225*5e7646d2SAndroid Build Coastguard Worker 
226*5e7646d2SAndroid Build Coastguard Worker 
227*5e7646d2SAndroid Build Coastguard Worker    /*
228*5e7646d2SAndroid Build Coastguard Worker     * Get the next event...
229*5e7646d2SAndroid Build Coastguard Worker     */
230*5e7646d2SAndroid Build Coastguard Worker 
231*5e7646d2SAndroid Build Coastguard Worker     msg = ippNew();
232*5e7646d2SAndroid Build Coastguard Worker     while ((state = ippReadFile(0, msg)) != IPP_DATA)
233*5e7646d2SAndroid Build Coastguard Worker     {
234*5e7646d2SAndroid Build Coastguard Worker       if (state <= IPP_IDLE)
235*5e7646d2SAndroid Build Coastguard Worker         break;
236*5e7646d2SAndroid Build Coastguard Worker     }
237*5e7646d2SAndroid Build Coastguard Worker 
238*5e7646d2SAndroid Build Coastguard Worker     fprintf(stderr, "DEBUG: state=%d\n", state);
239*5e7646d2SAndroid Build Coastguard Worker 
240*5e7646d2SAndroid Build Coastguard Worker     if (state == IPP_ERROR)
241*5e7646d2SAndroid Build Coastguard Worker       fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr);
242*5e7646d2SAndroid Build Coastguard Worker 
243*5e7646d2SAndroid Build Coastguard Worker     if (state <= IPP_IDLE)
244*5e7646d2SAndroid Build Coastguard Worker     {
245*5e7646d2SAndroid Build Coastguard Worker      /*
246*5e7646d2SAndroid Build Coastguard Worker       * Out of messages, free memory and then exit...
247*5e7646d2SAndroid Build Coastguard Worker       */
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker       ippDelete(msg);
250*5e7646d2SAndroid Build Coastguard Worker       break;
251*5e7646d2SAndroid Build Coastguard Worker     }
252*5e7646d2SAndroid Build Coastguard Worker 
253*5e7646d2SAndroid Build Coastguard Worker    /*
254*5e7646d2SAndroid Build Coastguard Worker     * Verify connection to DBUS server...
255*5e7646d2SAndroid Build Coastguard Worker     */
256*5e7646d2SAndroid Build Coastguard Worker 
257*5e7646d2SAndroid Build Coastguard Worker     if (con && !dbus_connection_get_is_connected(con))
258*5e7646d2SAndroid Build Coastguard Worker     {
259*5e7646d2SAndroid Build Coastguard Worker       dbus_connection_unref(con);
260*5e7646d2SAndroid Build Coastguard Worker       con = NULL;
261*5e7646d2SAndroid Build Coastguard Worker     }
262*5e7646d2SAndroid Build Coastguard Worker 
263*5e7646d2SAndroid Build Coastguard Worker     if (!con)
264*5e7646d2SAndroid Build Coastguard Worker     {
265*5e7646d2SAndroid Build Coastguard Worker       dbus_error_init(&error);
266*5e7646d2SAndroid Build Coastguard Worker 
267*5e7646d2SAndroid Build Coastguard Worker       con = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
268*5e7646d2SAndroid Build Coastguard Worker       if (!con)
269*5e7646d2SAndroid Build Coastguard Worker 	dbus_error_free(&error);
270*5e7646d2SAndroid Build Coastguard Worker       else
271*5e7646d2SAndroid Build Coastguard Worker 	fputs("DEBUG: Connected to D-BUS\n", stderr);
272*5e7646d2SAndroid Build Coastguard Worker     }
273*5e7646d2SAndroid Build Coastguard Worker 
274*5e7646d2SAndroid Build Coastguard Worker     if (!con)
275*5e7646d2SAndroid Build Coastguard Worker       continue;
276*5e7646d2SAndroid Build Coastguard Worker 
277*5e7646d2SAndroid Build Coastguard Worker     if (lock_fd == -1 &&
278*5e7646d2SAndroid Build Coastguard Worker         acquire_lock(&lock_fd, lock_filename, sizeof(lock_filename)))
279*5e7646d2SAndroid Build Coastguard Worker       continue;
280*5e7646d2SAndroid Build Coastguard Worker 
281*5e7646d2SAndroid Build Coastguard Worker     attr = ippFindAttribute(msg, "notify-subscribed-event",
282*5e7646d2SAndroid Build Coastguard Worker 			    IPP_TAG_KEYWORD);
283*5e7646d2SAndroid Build Coastguard Worker     if (!attr)
284*5e7646d2SAndroid Build Coastguard Worker       continue;
285*5e7646d2SAndroid Build Coastguard Worker 
286*5e7646d2SAndroid Build Coastguard Worker     event = ippGetString(attr, 0, NULL);
287*5e7646d2SAndroid Build Coastguard Worker     if (!strncmp(event, "server-", 7))
288*5e7646d2SAndroid Build Coastguard Worker     {
289*5e7646d2SAndroid Build Coastguard Worker       const char *word2 = event + 7;	/* Second word */
290*5e7646d2SAndroid Build Coastguard Worker 
291*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(word2, "restarted"))
292*5e7646d2SAndroid Build Coastguard Worker 	signame = "ServerRestarted";
293*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "started"))
294*5e7646d2SAndroid Build Coastguard Worker 	signame = "ServerStarted";
295*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "stopped"))
296*5e7646d2SAndroid Build Coastguard Worker 	signame = "ServerStopped";
297*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "audit"))
298*5e7646d2SAndroid Build Coastguard Worker 	signame = "ServerAudit";
299*5e7646d2SAndroid Build Coastguard Worker       else
300*5e7646d2SAndroid Build Coastguard Worker 	continue;
301*5e7646d2SAndroid Build Coastguard Worker     }
302*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(event, "printer-", 8))
303*5e7646d2SAndroid Build Coastguard Worker     {
304*5e7646d2SAndroid Build Coastguard Worker       const char *word2 = event + 8;	/* Second word */
305*5e7646d2SAndroid Build Coastguard Worker 
306*5e7646d2SAndroid Build Coastguard Worker       params = PARAMS_PRINTER;
307*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(word2, "restarted"))
308*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterRestarted";
309*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "shutdown"))
310*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterShutdown";
311*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "stopped"))
312*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterStopped";
313*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "state-changed"))
314*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterStateChanged";
315*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "finishings-changed"))
316*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterFinishingsChanged";
317*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "media-changed"))
318*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterMediaChanged";
319*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "added"))
320*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterAdded";
321*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "deleted"))
322*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterDeleted";
323*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "modified"))
324*5e7646d2SAndroid Build Coastguard Worker 	signame = "PrinterModified";
325*5e7646d2SAndroid Build Coastguard Worker       else
326*5e7646d2SAndroid Build Coastguard Worker 	continue;
327*5e7646d2SAndroid Build Coastguard Worker     }
328*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(event, "job-", 4))
329*5e7646d2SAndroid Build Coastguard Worker     {
330*5e7646d2SAndroid Build Coastguard Worker       const char *word2 = event + 4;	/* Second word */
331*5e7646d2SAndroid Build Coastguard Worker 
332*5e7646d2SAndroid Build Coastguard Worker       params = PARAMS_JOB;
333*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(word2, "state-changed"))
334*5e7646d2SAndroid Build Coastguard Worker 	signame = "JobState";
335*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "created"))
336*5e7646d2SAndroid Build Coastguard Worker 	signame = "JobCreated";
337*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "completed"))
338*5e7646d2SAndroid Build Coastguard Worker 	signame = "JobCompleted";
339*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "stopped"))
340*5e7646d2SAndroid Build Coastguard Worker 	signame = "JobStopped";
341*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "config-changed"))
342*5e7646d2SAndroid Build Coastguard Worker 	signame = "JobConfigChanged";
343*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(word2, "progress"))
344*5e7646d2SAndroid Build Coastguard Worker 	signame = "JobProgress";
345*5e7646d2SAndroid Build Coastguard Worker       else
346*5e7646d2SAndroid Build Coastguard Worker 	continue;
347*5e7646d2SAndroid Build Coastguard Worker     }
348*5e7646d2SAndroid Build Coastguard Worker     else
349*5e7646d2SAndroid Build Coastguard Worker       continue;
350*5e7646d2SAndroid Build Coastguard Worker 
351*5e7646d2SAndroid Build Coastguard Worker     /*
352*5e7646d2SAndroid Build Coastguard Worker      * Create and send the new message...
353*5e7646d2SAndroid Build Coastguard Worker      */
354*5e7646d2SAndroid Build Coastguard Worker 
355*5e7646d2SAndroid Build Coastguard Worker     fprintf(stderr, "DEBUG: %s\n", signame);
356*5e7646d2SAndroid Build Coastguard Worker     message = dbus_message_new_signal("/org/cups/cupsd/Notifier",
357*5e7646d2SAndroid Build Coastguard Worker 				      "org.cups.cupsd.Notifier",
358*5e7646d2SAndroid Build Coastguard Worker 				      signame);
359*5e7646d2SAndroid Build Coastguard Worker 
360*5e7646d2SAndroid Build Coastguard Worker     dbus_message_append_iter_init(message, &iter);
361*5e7646d2SAndroid Build Coastguard Worker     attr = ippFindAttribute(msg, "notify-text", IPP_TAG_TEXT);
362*5e7646d2SAndroid Build Coastguard Worker     if (attr)
363*5e7646d2SAndroid Build Coastguard Worker     {
364*5e7646d2SAndroid Build Coastguard Worker       const char *val = ippGetString(attr, 0, NULL);
365*5e7646d2SAndroid Build Coastguard Worker       if (!dbus_message_iter_append_string(&iter, &val))
366*5e7646d2SAndroid Build Coastguard Worker         goto bail;
367*5e7646d2SAndroid Build Coastguard Worker     }
368*5e7646d2SAndroid Build Coastguard Worker     else
369*5e7646d2SAndroid Build Coastguard Worker       goto bail;
370*5e7646d2SAndroid Build Coastguard Worker 
371*5e7646d2SAndroid Build Coastguard Worker     if (params >= PARAMS_PRINTER)
372*5e7646d2SAndroid Build Coastguard Worker     {
373*5e7646d2SAndroid Build Coastguard Worker       char	*p;			/* Pointer into printer_reasons */
374*5e7646d2SAndroid Build Coastguard Worker       size_t	reasons_length;		/* Required size of printer_reasons */
375*5e7646d2SAndroid Build Coastguard Worker       int	i;			/* Looping var */
376*5e7646d2SAndroid Build Coastguard Worker       int	have_printer_params = 1;/* Do we have printer URI? */
377*5e7646d2SAndroid Build Coastguard Worker 
378*5e7646d2SAndroid Build Coastguard Worker       /* STRING printer-uri or "" */
379*5e7646d2SAndroid Build Coastguard Worker       attr = ippFindAttribute(msg, "notify-printer-uri", IPP_TAG_URI);
380*5e7646d2SAndroid Build Coastguard Worker       if (attr)
381*5e7646d2SAndroid Build Coastguard Worker       {
382*5e7646d2SAndroid Build Coastguard Worker         const char *val = ippGetString(attr, 0, NULL);
383*5e7646d2SAndroid Build Coastguard Worker         if (!dbus_message_iter_append_string(&iter, &val))
384*5e7646d2SAndroid Build Coastguard Worker 	  goto bail;
385*5e7646d2SAndroid Build Coastguard Worker       }
386*5e7646d2SAndroid Build Coastguard Worker       else
387*5e7646d2SAndroid Build Coastguard Worker       {
388*5e7646d2SAndroid Build Coastguard Worker 	have_printer_params = 0;
389*5e7646d2SAndroid Build Coastguard Worker 	dbus_message_iter_append_string(&iter, &nul);
390*5e7646d2SAndroid Build Coastguard Worker       }
391*5e7646d2SAndroid Build Coastguard Worker 
392*5e7646d2SAndroid Build Coastguard Worker       /* STRING printer-name */
393*5e7646d2SAndroid Build Coastguard Worker       if (have_printer_params)
394*5e7646d2SAndroid Build Coastguard Worker       {
395*5e7646d2SAndroid Build Coastguard Worker 	attr = ippFindAttribute(msg, "printer-name", IPP_TAG_NAME);
396*5e7646d2SAndroid Build Coastguard Worker         if (attr)
397*5e7646d2SAndroid Build Coastguard Worker         {
398*5e7646d2SAndroid Build Coastguard Worker           const char *val = ippGetString(attr, 0, NULL);
399*5e7646d2SAndroid Build Coastguard Worker           if (!dbus_message_iter_append_string(&iter, &val))
400*5e7646d2SAndroid Build Coastguard Worker             goto bail;
401*5e7646d2SAndroid Build Coastguard Worker         }
402*5e7646d2SAndroid Build Coastguard Worker         else
403*5e7646d2SAndroid Build Coastguard Worker           goto bail;
404*5e7646d2SAndroid Build Coastguard Worker       }
405*5e7646d2SAndroid Build Coastguard Worker       else
406*5e7646d2SAndroid Build Coastguard Worker 	dbus_message_iter_append_string(&iter, &nul);
407*5e7646d2SAndroid Build Coastguard Worker 
408*5e7646d2SAndroid Build Coastguard Worker       /* UINT32 printer-state */
409*5e7646d2SAndroid Build Coastguard Worker       if (have_printer_params)
410*5e7646d2SAndroid Build Coastguard Worker       {
411*5e7646d2SAndroid Build Coastguard Worker 	attr = ippFindAttribute(msg, "printer-state", IPP_TAG_ENUM);
412*5e7646d2SAndroid Build Coastguard Worker 	if (attr)
413*5e7646d2SAndroid Build Coastguard Worker 	{
414*5e7646d2SAndroid Build Coastguard Worker 	  dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
415*5e7646d2SAndroid Build Coastguard Worker 	  dbus_message_iter_append_uint32(&iter, &val);
416*5e7646d2SAndroid Build Coastguard Worker 	}
417*5e7646d2SAndroid Build Coastguard Worker 	else
418*5e7646d2SAndroid Build Coastguard Worker 	  goto bail;
419*5e7646d2SAndroid Build Coastguard Worker       }
420*5e7646d2SAndroid Build Coastguard Worker       else
421*5e7646d2SAndroid Build Coastguard Worker 	dbus_message_iter_append_uint32(&iter, &no);
422*5e7646d2SAndroid Build Coastguard Worker 
423*5e7646d2SAndroid Build Coastguard Worker       /* STRING printer-state-reasons */
424*5e7646d2SAndroid Build Coastguard Worker       if (have_printer_params)
425*5e7646d2SAndroid Build Coastguard Worker       {
426*5e7646d2SAndroid Build Coastguard Worker 	attr = ippFindAttribute(msg, "printer-state-reasons",
427*5e7646d2SAndroid Build Coastguard Worker 				IPP_TAG_KEYWORD);
428*5e7646d2SAndroid Build Coastguard Worker 	if (attr)
429*5e7646d2SAndroid Build Coastguard Worker 	{
430*5e7646d2SAndroid Build Coastguard Worker 	  int num_values = ippGetCount(attr);
431*5e7646d2SAndroid Build Coastguard Worker 	  for (reasons_length = 0, i = 0; i < num_values; i++)
432*5e7646d2SAndroid Build Coastguard Worker 	    /* All need commas except the last, which needs a nul byte. */
433*5e7646d2SAndroid Build Coastguard Worker 	    reasons_length += 1 + strlen(ippGetString(attr, i, NULL));
434*5e7646d2SAndroid Build Coastguard Worker 	  printer_reasons = malloc(reasons_length);
435*5e7646d2SAndroid Build Coastguard Worker 	  if (!printer_reasons)
436*5e7646d2SAndroid Build Coastguard Worker 	    goto bail;
437*5e7646d2SAndroid Build Coastguard Worker 	  p = printer_reasons;
438*5e7646d2SAndroid Build Coastguard Worker 	  for (i = 0; i < num_values; i++)
439*5e7646d2SAndroid Build Coastguard Worker 	  {
440*5e7646d2SAndroid Build Coastguard Worker 	    if (i)
441*5e7646d2SAndroid Build Coastguard Worker 	      *p++ = ',';
442*5e7646d2SAndroid Build Coastguard Worker 
443*5e7646d2SAndroid Build Coastguard Worker 	    strlcpy(p, ippGetString(attr, i, NULL), reasons_length - (size_t)(p - printer_reasons));
444*5e7646d2SAndroid Build Coastguard Worker 	    p += strlen(p);
445*5e7646d2SAndroid Build Coastguard Worker 	  }
446*5e7646d2SAndroid Build Coastguard Worker 	  if (!dbus_message_iter_append_string(&iter, &printer_reasons))
447*5e7646d2SAndroid Build Coastguard Worker 	    goto bail;
448*5e7646d2SAndroid Build Coastguard Worker 	}
449*5e7646d2SAndroid Build Coastguard Worker 	else
450*5e7646d2SAndroid Build Coastguard Worker 	  goto bail;
451*5e7646d2SAndroid Build Coastguard Worker       }
452*5e7646d2SAndroid Build Coastguard Worker       else
453*5e7646d2SAndroid Build Coastguard Worker 	dbus_message_iter_append_string(&iter, &nul);
454*5e7646d2SAndroid Build Coastguard Worker 
455*5e7646d2SAndroid Build Coastguard Worker       /* BOOL printer-is-accepting-jobs */
456*5e7646d2SAndroid Build Coastguard Worker       if (have_printer_params)
457*5e7646d2SAndroid Build Coastguard Worker       {
458*5e7646d2SAndroid Build Coastguard Worker 	attr = ippFindAttribute(msg, "printer-is-accepting-jobs",
459*5e7646d2SAndroid Build Coastguard Worker 				IPP_TAG_BOOLEAN);
460*5e7646d2SAndroid Build Coastguard Worker 	if (attr)
461*5e7646d2SAndroid Build Coastguard Worker 	{
462*5e7646d2SAndroid Build Coastguard Worker 	  dbus_bool_t val = (dbus_bool_t)ippGetBoolean(attr, 0);
463*5e7646d2SAndroid Build Coastguard Worker 	  dbus_message_iter_append_boolean(&iter, &val);
464*5e7646d2SAndroid Build Coastguard Worker 	}
465*5e7646d2SAndroid Build Coastguard Worker 	else
466*5e7646d2SAndroid Build Coastguard Worker 	  goto bail;
467*5e7646d2SAndroid Build Coastguard Worker       }
468*5e7646d2SAndroid Build Coastguard Worker       else
469*5e7646d2SAndroid Build Coastguard Worker 	dbus_message_iter_append_boolean(&iter, &no);
470*5e7646d2SAndroid Build Coastguard Worker     }
471*5e7646d2SAndroid Build Coastguard Worker 
472*5e7646d2SAndroid Build Coastguard Worker     if (params >= PARAMS_JOB)
473*5e7646d2SAndroid Build Coastguard Worker     {
474*5e7646d2SAndroid Build Coastguard Worker       char	*p;			/* Pointer into job_reasons */
475*5e7646d2SAndroid Build Coastguard Worker       size_t	reasons_length;		/* Required size of job_reasons */
476*5e7646d2SAndroid Build Coastguard Worker       int	i;			/* Looping var */
477*5e7646d2SAndroid Build Coastguard Worker 
478*5e7646d2SAndroid Build Coastguard Worker       /* UINT32 job-id */
479*5e7646d2SAndroid Build Coastguard Worker       attr = ippFindAttribute(msg, "notify-job-id", IPP_TAG_INTEGER);
480*5e7646d2SAndroid Build Coastguard Worker       if (attr)
481*5e7646d2SAndroid Build Coastguard Worker       {
482*5e7646d2SAndroid Build Coastguard Worker         dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
483*5e7646d2SAndroid Build Coastguard Worker         dbus_message_iter_append_uint32(&iter, &val);
484*5e7646d2SAndroid Build Coastguard Worker       }
485*5e7646d2SAndroid Build Coastguard Worker       else
486*5e7646d2SAndroid Build Coastguard Worker 	goto bail;
487*5e7646d2SAndroid Build Coastguard Worker 
488*5e7646d2SAndroid Build Coastguard Worker       /* UINT32 job-state */
489*5e7646d2SAndroid Build Coastguard Worker       attr = ippFindAttribute(msg, "job-state", IPP_TAG_ENUM);
490*5e7646d2SAndroid Build Coastguard Worker       if (attr)
491*5e7646d2SAndroid Build Coastguard Worker       {
492*5e7646d2SAndroid Build Coastguard Worker         dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
493*5e7646d2SAndroid Build Coastguard Worker         dbus_message_iter_append_uint32(&iter, &val);
494*5e7646d2SAndroid Build Coastguard Worker       }
495*5e7646d2SAndroid Build Coastguard Worker       else
496*5e7646d2SAndroid Build Coastguard Worker 	goto bail;
497*5e7646d2SAndroid Build Coastguard Worker 
498*5e7646d2SAndroid Build Coastguard Worker       /* STRING job-state-reasons */
499*5e7646d2SAndroid Build Coastguard Worker       attr = ippFindAttribute(msg, "job-state-reasons", IPP_TAG_KEYWORD);
500*5e7646d2SAndroid Build Coastguard Worker       if (attr)
501*5e7646d2SAndroid Build Coastguard Worker       {
502*5e7646d2SAndroid Build Coastguard Worker 	int num_values = ippGetCount(attr);
503*5e7646d2SAndroid Build Coastguard Worker 	for (reasons_length = 0, i = 0; i < num_values; i++)
504*5e7646d2SAndroid Build Coastguard Worker 	  /* All need commas except the last, which needs a nul byte. */
505*5e7646d2SAndroid Build Coastguard Worker 	  reasons_length += 1 + strlen(ippGetString(attr, i, NULL));
506*5e7646d2SAndroid Build Coastguard Worker 	job_reasons = malloc(reasons_length);
507*5e7646d2SAndroid Build Coastguard Worker 	if (!job_reasons)
508*5e7646d2SAndroid Build Coastguard Worker 	  goto bail;
509*5e7646d2SAndroid Build Coastguard Worker 	p = job_reasons;
510*5e7646d2SAndroid Build Coastguard Worker 	for (i = 0; i < num_values; i++)
511*5e7646d2SAndroid Build Coastguard Worker 	{
512*5e7646d2SAndroid Build Coastguard Worker 	  if (i)
513*5e7646d2SAndroid Build Coastguard Worker 	    *p++ = ',';
514*5e7646d2SAndroid Build Coastguard Worker 
515*5e7646d2SAndroid Build Coastguard Worker 	  strlcpy(p, ippGetString(attr, i, NULL), reasons_length - (size_t)(p - job_reasons));
516*5e7646d2SAndroid Build Coastguard Worker 	  p += strlen(p);
517*5e7646d2SAndroid Build Coastguard Worker 	}
518*5e7646d2SAndroid Build Coastguard Worker 	if (!dbus_message_iter_append_string(&iter, &job_reasons))
519*5e7646d2SAndroid Build Coastguard Worker 	  goto bail;
520*5e7646d2SAndroid Build Coastguard Worker       }
521*5e7646d2SAndroid Build Coastguard Worker       else
522*5e7646d2SAndroid Build Coastguard Worker 	goto bail;
523*5e7646d2SAndroid Build Coastguard Worker 
524*5e7646d2SAndroid Build Coastguard Worker       /* STRING job-name or "" */
525*5e7646d2SAndroid Build Coastguard Worker       attr = ippFindAttribute(msg, "job-name", IPP_TAG_NAME);
526*5e7646d2SAndroid Build Coastguard Worker       if (attr)
527*5e7646d2SAndroid Build Coastguard Worker       {
528*5e7646d2SAndroid Build Coastguard Worker         const char *val = ippGetString(attr, 0, NULL);
529*5e7646d2SAndroid Build Coastguard Worker         if (!dbus_message_iter_append_string(&iter, &val))
530*5e7646d2SAndroid Build Coastguard Worker           goto bail;
531*5e7646d2SAndroid Build Coastguard Worker       }
532*5e7646d2SAndroid Build Coastguard Worker       else
533*5e7646d2SAndroid Build Coastguard Worker 	dbus_message_iter_append_string(&iter, &nul);
534*5e7646d2SAndroid Build Coastguard Worker 
535*5e7646d2SAndroid Build Coastguard Worker       /* UINT32 job-impressions-completed */
536*5e7646d2SAndroid Build Coastguard Worker       attr = ippFindAttribute(msg, "job-impressions-completed",
537*5e7646d2SAndroid Build Coastguard Worker 			      IPP_TAG_INTEGER);
538*5e7646d2SAndroid Build Coastguard Worker       if (attr)
539*5e7646d2SAndroid Build Coastguard Worker       {
540*5e7646d2SAndroid Build Coastguard Worker         dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
541*5e7646d2SAndroid Build Coastguard Worker         dbus_message_iter_append_uint32(&iter, &val);
542*5e7646d2SAndroid Build Coastguard Worker       }
543*5e7646d2SAndroid Build Coastguard Worker       else
544*5e7646d2SAndroid Build Coastguard Worker 	goto bail;
545*5e7646d2SAndroid Build Coastguard Worker     }
546*5e7646d2SAndroid Build Coastguard Worker 
547*5e7646d2SAndroid Build Coastguard Worker     dbus_connection_send(con, message, NULL);
548*5e7646d2SAndroid Build Coastguard Worker     dbus_connection_flush(con);
549*5e7646d2SAndroid Build Coastguard Worker 
550*5e7646d2SAndroid Build Coastguard Worker    /*
551*5e7646d2SAndroid Build Coastguard Worker     * Cleanup...
552*5e7646d2SAndroid Build Coastguard Worker     */
553*5e7646d2SAndroid Build Coastguard Worker 
554*5e7646d2SAndroid Build Coastguard Worker     bail:
555*5e7646d2SAndroid Build Coastguard Worker 
556*5e7646d2SAndroid Build Coastguard Worker     dbus_message_unref(message);
557*5e7646d2SAndroid Build Coastguard Worker 
558*5e7646d2SAndroid Build Coastguard Worker     if (printer_reasons)
559*5e7646d2SAndroid Build Coastguard Worker       free(printer_reasons);
560*5e7646d2SAndroid Build Coastguard Worker 
561*5e7646d2SAndroid Build Coastguard Worker     if (job_reasons)
562*5e7646d2SAndroid Build Coastguard Worker       free(job_reasons);
563*5e7646d2SAndroid Build Coastguard Worker 
564*5e7646d2SAndroid Build Coastguard Worker     ippDelete(msg);
565*5e7646d2SAndroid Build Coastguard Worker   }
566*5e7646d2SAndroid Build Coastguard Worker 
567*5e7646d2SAndroid Build Coastguard Worker  /*
568*5e7646d2SAndroid Build Coastguard Worker   * Remove lock file...
569*5e7646d2SAndroid Build Coastguard Worker   */
570*5e7646d2SAndroid Build Coastguard Worker 
571*5e7646d2SAndroid Build Coastguard Worker   if (lock_fd >= 0)
572*5e7646d2SAndroid Build Coastguard Worker   {
573*5e7646d2SAndroid Build Coastguard Worker     close(lock_fd);
574*5e7646d2SAndroid Build Coastguard Worker     release_lock();
575*5e7646d2SAndroid Build Coastguard Worker   }
576*5e7646d2SAndroid Build Coastguard Worker 
577*5e7646d2SAndroid Build Coastguard Worker   return (0);
578*5e7646d2SAndroid Build Coastguard Worker }
579*5e7646d2SAndroid Build Coastguard Worker 
580*5e7646d2SAndroid Build Coastguard Worker 
581*5e7646d2SAndroid Build Coastguard Worker /*
582*5e7646d2SAndroid Build Coastguard Worker  * 'release_lock()' - Release the singleton lock.
583*5e7646d2SAndroid Build Coastguard Worker  */
584*5e7646d2SAndroid Build Coastguard Worker 
585*5e7646d2SAndroid Build Coastguard Worker static void
release_lock(void)586*5e7646d2SAndroid Build Coastguard Worker release_lock(void)
587*5e7646d2SAndroid Build Coastguard Worker {
588*5e7646d2SAndroid Build Coastguard Worker   unlink(lock_filename);
589*5e7646d2SAndroid Build Coastguard Worker }
590*5e7646d2SAndroid Build Coastguard Worker 
591*5e7646d2SAndroid Build Coastguard Worker 
592*5e7646d2SAndroid Build Coastguard Worker /*
593*5e7646d2SAndroid Build Coastguard Worker  * 'handle_sigterm()' - Handle SIGTERM signal.
594*5e7646d2SAndroid Build Coastguard Worker  */
595*5e7646d2SAndroid Build Coastguard Worker static void
handle_sigterm(int signum)596*5e7646d2SAndroid Build Coastguard Worker handle_sigterm(int signum)
597*5e7646d2SAndroid Build Coastguard Worker {
598*5e7646d2SAndroid Build Coastguard Worker   release_lock();
599*5e7646d2SAndroid Build Coastguard Worker   _exit(0);
600*5e7646d2SAndroid Build Coastguard Worker }
601*5e7646d2SAndroid Build Coastguard Worker 
602*5e7646d2SAndroid Build Coastguard Worker /*
603*5e7646d2SAndroid Build Coastguard Worker  * 'acquire_lock()' - Acquire a lock so we only have a single notifier running.
604*5e7646d2SAndroid Build Coastguard Worker  */
605*5e7646d2SAndroid Build Coastguard Worker 
606*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 0 on success, -1 on failure */
acquire_lock(int * fd,char * lockfile,size_t locksize)607*5e7646d2SAndroid Build Coastguard Worker acquire_lock(int    *fd,		/* O - Lock file descriptor */
608*5e7646d2SAndroid Build Coastguard Worker              char   *lockfile,		/* I - Lock filename buffer */
609*5e7646d2SAndroid Build Coastguard Worker 	     size_t locksize)		/* I - Size of filename buffer */
610*5e7646d2SAndroid Build Coastguard Worker {
611*5e7646d2SAndroid Build Coastguard Worker   const char		*tmpdir;	/* Temporary directory */
612*5e7646d2SAndroid Build Coastguard Worker   struct sigaction	action;		/* POSIX sigaction data */
613*5e7646d2SAndroid Build Coastguard Worker 
614*5e7646d2SAndroid Build Coastguard Worker 
615*5e7646d2SAndroid Build Coastguard Worker  /*
616*5e7646d2SAndroid Build Coastguard Worker   * Figure out where to put the lock file...
617*5e7646d2SAndroid Build Coastguard Worker   */
618*5e7646d2SAndroid Build Coastguard Worker 
619*5e7646d2SAndroid Build Coastguard Worker   if ((tmpdir = getenv("TMPDIR")) == NULL)
620*5e7646d2SAndroid Build Coastguard Worker     tmpdir = "/tmp";
621*5e7646d2SAndroid Build Coastguard Worker 
622*5e7646d2SAndroid Build Coastguard Worker   snprintf(lockfile, locksize, "%s/cups-dbus-notifier-lockfile", tmpdir);
623*5e7646d2SAndroid Build Coastguard Worker 
624*5e7646d2SAndroid Build Coastguard Worker  /*
625*5e7646d2SAndroid Build Coastguard Worker   * Create the lock file and fail if it already exists...
626*5e7646d2SAndroid Build Coastguard Worker   */
627*5e7646d2SAndroid Build Coastguard Worker 
628*5e7646d2SAndroid Build Coastguard Worker   if ((*fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) < 0)
629*5e7646d2SAndroid Build Coastguard Worker     return (-1);
630*5e7646d2SAndroid Build Coastguard Worker 
631*5e7646d2SAndroid Build Coastguard Worker  /*
632*5e7646d2SAndroid Build Coastguard Worker   * Set a SIGTERM handler to make sure we release the lock if the
633*5e7646d2SAndroid Build Coastguard Worker   * scheduler decides to stop us.
634*5e7646d2SAndroid Build Coastguard Worker   */
635*5e7646d2SAndroid Build Coastguard Worker   memset(&action, 0, sizeof(action));
636*5e7646d2SAndroid Build Coastguard Worker   action.sa_handler = handle_sigterm;
637*5e7646d2SAndroid Build Coastguard Worker   sigaction(SIGTERM, &action, NULL);
638*5e7646d2SAndroid Build Coastguard Worker 
639*5e7646d2SAndroid Build Coastguard Worker   return (0);
640*5e7646d2SAndroid Build Coastguard Worker }
641*5e7646d2SAndroid Build Coastguard Worker #else /* !HAVE_DBUS */
642*5e7646d2SAndroid Build Coastguard Worker int
main(void)643*5e7646d2SAndroid Build Coastguard Worker main(void)
644*5e7646d2SAndroid Build Coastguard Worker {
645*5e7646d2SAndroid Build Coastguard Worker   return (1);
646*5e7646d2SAndroid Build Coastguard Worker }
647*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_DBUS */
648