diff -up cups-1.7.0/notifier/dbus.c.dbus-notifier cups-1.7.0/notifier/dbus.c --- cups-1.7.0/notifier/dbus.c.dbus-notifier 2013-11-14 18:10:31.745121435 +0000 +++ cups-1.7.0/notifier/dbus.c 2013-11-14 18:10:53.997227718 +0000 @@ -4,7 +4,7 @@ * D-Bus notifier for CUPS. * * Copyright 2008-2012 by Apple Inc. - * Copyright (C) 2011 Red Hat, Inc. + * Copyright (C) 2011, 2013 Red Hat, Inc. * Copyright (C) 2007 Tim Waugh * Copyright 1997-2005 by Easy Software Products. * @@ -157,9 +157,16 @@ enum /* + * Global variables... + */ + +static char lock_filename[1024]; /* Lock filename */ + +/* * Local functions... */ +static void release_lock(void); static int acquire_lock(int *fd, char *lockfile, size_t locksize); static const char *validate_utf8(const char *str); @@ -251,8 +258,6 @@ main(int argc, /* I - Number of comm DBusMessage *message; /* Message to send */ DBusMessageIter iter; /* Iterator for message data */ int lock_fd = -1; /* Lock file descriptor */ - char lock_filename[1024]; - /* Lock filename */ /* @@ -653,7 +658,7 @@ main(int argc, /* I - Number of comm if (lock_fd >= 0) { close(lock_fd); - unlink(lock_filename); + release_lock(); } return (0); @@ -661,6 +666,26 @@ main(int argc, /* I - Number of comm /* + * '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(); +} + +/* * 'acquire_lock()' - Acquire a lock so we only have a single notifier running. */ @@ -669,7 +694,8 @@ acquire_lock(int *fd, /* O - Lock fi 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 */ /* @@ -687,8 +713,16 @@ acquire_lock(int *fd, /* O - Lock fi 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