summaryrefslogtreecommitdiff
path: root/notifier
diff options
context:
space:
mode:
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>2014-01-06 22:17:44 +0000
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>2014-01-06 22:17:44 +0000
commite9dd00a00d48ad89f1322e65b78acafb2ce07be4 (patch)
tree678269c2da387446d631efa8308518bb4fcdd2b3 /notifier
parente584c0683db65b3af344638f148b3fe8e5b49336 (diff)
downloadcups-e9dd00a00d48ad89f1322e65b78acafb2ce07be4.tar.gz
The D-BUS notifier did not remove its lockfile (STR #4314)
Add signal handler and remove lockfile. git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@11499 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'notifier')
-rw-r--r--notifier/dbus.c73
1 files changed, 52 insertions, 21 deletions
diff --git a/notifier/dbus.c b/notifier/dbus.c
index 1629c4e7f..ae9655109 100644
--- a/notifier/dbus.c
+++ b/notifier/dbus.c
@@ -1,23 +1,18 @@
/*
* "$Id$"
*
- * D-Bus notifier for CUPS.
+ * D-Bus notifier for CUPS.
*
- * Copyright 2008-2012 by Apple Inc.
- * Copyright (C) 2011 Red Hat, Inc.
- * Copyright (C) 2007 Tim Waugh <twaugh@redhat.com>
- * Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2008-2014 by Apple Inc.
+ * Copyright (C) 2011, 2013 Red Hat, Inc.
+ * Copyright (C) 2007 Tim Waugh <twaugh@redhat.com>
+ * Copyright 1997-2005 by Easy Software Products.
*
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Read events and send DBUS notifications.
- * acquire_lock() - Acquire a lock so we only have a single notifier running.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*/
/*
@@ -154,10 +149,18 @@ enum
/*
+ * Global variables...
+ */
+
+static char lock_filename[1024]; /* Lock filename */
+
+
+/*
* Local functions...
*/
static int acquire_lock(int *fd, char *lockfile, size_t locksize);
+static void release_lock(void);
/*
@@ -176,8 +179,6 @@ main(int argc, /* I - Number of command-line args */
DBusMessage *message; /* Message to send */
DBusMessageIter iter; /* Iterator for message data */
int lock_fd = -1; /* Lock file descriptor */
- char lock_filename[1024];
- /* Lock filename */
/*
@@ -578,7 +579,7 @@ main(int argc, /* I - Number of command-line args */
if (lock_fd >= 0)
{
close(lock_fd);
- unlink(lock_filename);
+ release_lock();
}
return (0);
@@ -586,6 +587,27 @@ main(int argc, /* I - Number of command-line args */
/*
+ * 'release_lock()' - Release the singleton lock.
+ */
+
+static void
+release_lock(void)
+{
+ unlink(lock_filename);
+}
+
+
+/*
+ * 'handle_sigterm()' - Handle SIGTERM signal.
+ */
+static void
+handle_sigterm(int signum)
+{
+ release_lock();
+ _exit(0);
+}
+
+/*
* 'acquire_lock()' - Acquire a lock so we only have a single notifier running.
*/
@@ -594,7 +616,8 @@ acquire_lock(int *fd, /* O - Lock file descriptor */
char *lockfile, /* I - Lock filename buffer */
size_t locksize) /* I - Size of filename buffer */
{
- const char *tmpdir; /* Temporary directory */
+ const char *tmpdir; /* Temporary directory */
+ struct sigaction action; /* POSIX sigaction data */
/*
@@ -612,8 +635,16 @@ acquire_lock(int *fd, /* O - Lock file descriptor */
if ((*fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) < 0)
return (-1);
- else
- return (0);
+
+ /*
+ * Set a SIGTERM handler to make sure we release the lock if the
+ * scheduler decides to stop us.
+ */
+ memset(&action, 0, sizeof(action));
+ action.sa_handler = handle_sigterm;
+ sigaction(SIGTERM, &action, NULL);
+
+ return (0);
}
#else /* !HAVE_DBUS */
int