diff options
author | greg@kroah.com <greg@kroah.com> | 2004-01-23 22:26:19 -0800 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 21:13:18 -0700 |
commit | 1c5c245e6f053da7ac147a1733ea49dd84f260a5 (patch) | |
tree | 0eacf57a874f69d69272c129c398855a9adcbffc | |
parent | 305dd8b494d62168897313031293485ef4d085c2 (diff) |
[PATCH] make udevd only have one instance running at a time
it used a file lock right now. need to put that lock in the udev directory,
it's in the current directory, which isn't a good thing...
-rw-r--r-- | udevd.c | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -32,6 +32,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <fcntl.h> #include "udev.h" #include "udevd.h" @@ -157,6 +158,9 @@ static void add_queue(struct hotplug_msg *pmsg) dump_queue(); } +static int lock_file = -1; +static char *lock_filename = ".udevd_lock"; + static int process_queue(void) { int msgid; @@ -203,6 +207,10 @@ static int process_queue(void) expect_seqnum = head->seqnum; } else { info("we have nothing to do, so daemon exits..."); + if (lock_file >= 0) { + close(lock_file); + unlink(lock_filename); + } exit(0); } check_queue(); @@ -221,6 +229,10 @@ static void sig_handler(int signum) case SIGINT: case SIGTERM: case SIGKILL: + if (lock_file >= 0) { + close(lock_file); + unlink(lock_filename); + } exit(20 + signum); break; @@ -229,8 +241,35 @@ static void sig_handler(int signum) } } +static int one_and_only(void) +{ + char string[100]; + + lock_file = open(lock_filename, O_RDWR | O_CREAT, 0x640); + + /* see if we can open */ + if (lock_file < 0) + return -EINVAL; + + /* see if we can lock */ + if (lockf(lock_file, F_TLOCK, 0) < 0) { + close(lock_file); + unlink(lock_filename); + return -EINVAL; + } + + snprintf(string, sizeof(string), "%d\n", getpid()); + write(lock_file, string, strlen(string)); + + return 0; +} + int main(int argc, char *argv[]) { + /* only let one version of the daemon run at any one time */ + if (one_and_only() != 0) + exit(0); + /* set up signal handler */ signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); |