chiark / gitweb /
[PATCH] make udevd only have one instance running at a time
authorgreg@kroah.com <greg@kroah.com>
Sat, 24 Jan 2004 06:26:19 +0000 (22:26 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:13:18 +0000 (21:13 -0700)
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...

udevd.c

diff --git a/udevd.c b/udevd.c
index da887ec29b4c4b2a49f1fe440f58645e07e4f722..2e63d8030e4035827e28a8fb42e780c7d8feda74 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -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);