chiark / gitweb /
[PATCH] udevd - switch socket path to abstract namespace
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index 22fb4d3..24cf9c9 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -19,6 +19,7 @@
  *
  */
 
+#include <pthread.h>
 #include <stddef.h>
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -33,7 +34,6 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
-#include <pthread.h>
 
 #include "list.h"
 #include "udev.h"
@@ -42,6 +42,7 @@
 #include "logging.h"
 
 
+unsigned char logname[42];
 static pthread_mutex_t  msg_lock;
 static pthread_mutex_t  msg_active_lock;
 static pthread_cond_t msg_active;
@@ -71,7 +72,6 @@ static void msg_dump(struct hotplug_msg *msg)
            msg->seqnum, msg->action, msg->devpath, msg->subsystem);
 }
 
-/* allocates a new message */
 static struct hotplug_msg *msg_create(void)
 {
        struct hotplug_msg *new_msg;
@@ -81,10 +81,15 @@ static struct hotplug_msg *msg_create(void)
                dbg("error malloc");
                return NULL;
        }
-       memset(new_msg, 0x00, sizeof(struct hotplug_msg));
        return new_msg;
 }
 
+static void msg_delete(struct hotplug_msg *msg)
+{
+       if (msg != NULL)
+               free(msg);
+}
+
 /* orders the message in the queue by sequence number */
 static void msg_queue_insert(struct hotplug_msg *msg)
 {
@@ -143,7 +148,7 @@ exit:
        list_del_init(&msg->list);
        pthread_mutex_unlock(&running_lock);
 
-       free(msg);
+       msg_delete(msg);
 
        /* signal queue activity to exec manager */
        pthread_mutex_lock(&exec_active_lock);
@@ -200,16 +205,20 @@ static void *exec_queue_manager(void * parm)
        }
 }
 
-/* move message from incoming to exec queue */
-static void msg_move_exec(struct list_head *head)
+static void exec_queue_activate(void)
 {
-       list_move_tail(head, &exec_list);
-       /* signal queue activity to manager */
        pthread_mutex_lock(&exec_active_lock);
        pthread_cond_signal(&exec_active);
        pthread_mutex_unlock(&exec_active_lock);
 }
 
+/* move message from incoming to exec queue */
+static void msg_move_exec(struct list_head *head)
+{
+       list_move_tail(head, &exec_list);
+       exec_queue_activate();
+}
+
 /* queue management thread handles the timeouts and dispatches the events */
 static void *msg_queue_manager(void * parm)
 {
@@ -289,12 +298,21 @@ static void *client_threads(void * parm)
 
        if (strncmp(msg->magic, UDEV_MAGIC, sizeof(UDEV_MAGIC)) != 0 ) {
                dbg("message magic '%s' doesn't match, ignore it", msg->magic);
+               msg_delete(msg);
                goto exit;
        }
 
-       pthread_mutex_lock(&msg_lock);
-       msg_queue_insert(msg);
-       pthread_mutex_unlock(&msg_lock);
+       /* if no seqnum is given, we move straight to exec queue */
+       if (msg->seqnum == 0) {
+               pthread_mutex_lock(&exec_lock);
+               list_add(&msg->list, &exec_list);
+               exec_queue_activate();
+               pthread_mutex_unlock(&exec_lock);
+       } else {
+               pthread_mutex_lock(&msg_lock);
+               msg_queue_insert(msg);
+               pthread_mutex_unlock(&msg_lock);
+       }
 
 exit:
        close(sock);
@@ -307,7 +325,6 @@ static void sig_handler(int signum)
                case SIGINT:
                case SIGTERM:
                        unlink(UDEVD_LOCK);
-                       unlink(UDEVD_SOCKET);
                        exit(20 + signum);
                        break;
                default:
@@ -320,7 +337,6 @@ static int one_and_only(void)
        char string[50];
        int lock_file;
 
-       /* see if we can open */
        lock_file = open(UDEVD_LOCK, O_RDWR | O_CREAT, 0x640);
        if (lock_file < 0)
                return -1;
@@ -350,6 +366,8 @@ int main(int argc, char *argv[])
        pthread_t mgr_exec_tid;
        int retval;
 
+       init_logging("udevd");
+
        /* only let one version of the daemon run at any one time */
        if (one_and_only() != 0)
                exit(0);
@@ -359,9 +377,9 @@ int main(int argc, char *argv[])
 
        memset(&saddr, 0x00, sizeof(saddr));
        saddr.sun_family = AF_LOCAL;
-       strcpy(saddr.sun_path, UDEVD_SOCKET);
+       /* use abstract namespace for socket path */
+       strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH);
 
-       unlink(UDEVD_SOCKET);
        ssock = socket(AF_LOCAL, SOCK_STREAM, 0);
        if (ssock == -1) {
                dbg("error getting socket");
@@ -389,6 +407,7 @@ int main(int argc, char *argv[])
        /* set default attributes for created threads */
        pthread_attr_init(&thr_attr);
        pthread_attr_setdetachstate(&thr_attr, PTHREAD_CREATE_DETACHED);
+       pthread_attr_setstacksize(&thr_attr, 16 * 1024);
 
        /* init queue management */
        pthread_create(&mgr_msg_tid, &thr_attr, msg_queue_manager, NULL);
@@ -399,14 +418,12 @@ int main(int argc, char *argv[])
        while (1) {
                csock = accept(ssock, &caddr, &clen);
                if (csock < 0) {
-                       if (errno == EINTR)
-                               continue;
                        dbg("client accept failed\n");
+                       continue;
                }
                pthread_create(&cli_tid, &thr_attr, client_threads, (void *) csock);
        }
 exit:
        close(ssock);
-       unlink(UDEVD_SOCKET);
        exit(1);
 }