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