chiark / gitweb /
[PATCH] added RFC-dev.d document detailing how /etc/dev.d/ works.
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index 366c227a3bc9c48c42d1236c4e2fe5006e3cc685..4cb3e1d405650965da86ea0569ca420dd2212a38 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -36,6 +36,7 @@
 
 #include "list.h"
 #include "udev.h"
+#include "udev_lib.h"
 #include "udev_version.h"
 #include "udevd.h"
 #include "logging.h"
@@ -51,12 +52,17 @@ LIST_HEAD(running_list);
 static void exec_queue_manager(void);
 static void msg_queue_manager(void);
 
-unsigned char logname[42];
-
-int log_ok(void)
+#ifdef LOG
+unsigned char logname[LOGNAME_SIZE];
+void log_message (int level, const char *format, ...)
 {
-       return 1;
+       va_list args;
+
+       va_start(args, format);
+       vsyslog(level, format, args);
+       va_end(args);
 }
+#endif
 
 static void msg_dump_queue(void)
 {
@@ -114,8 +120,8 @@ static void msg_queue_insert(struct hotplug_msg *msg)
 static void udev_run(struct hotplug_msg *msg)
 {
        pid_t pid;
-       char action[32];
-       char devpath[256];
+       char action[ACTION_SIZE];
+       char devpath[DEVPATH_SIZE];
        char *env[] = { action, devpath, NULL };
 
        snprintf(action, sizeof(action), "ACTION=%s", msg->action);
@@ -252,16 +258,19 @@ static void handle_msg(int sock)
        cmsg = CMSG_FIRSTHDR(&smsg);
        cred = (struct ucred *) CMSG_DATA(cmsg);
 
+       if (cmsg == NULL || cmsg->cmsg_type != SCM_CREDENTIALS) {
+               dbg("no sender credentials received, message ignored");
+               goto skip;
+       }
+
        if (cred->uid != 0) {
                dbg("sender uid=%i, message ignored", cred->uid);
-               free(msg);
-               return;
+               goto skip;
        }
 
        if (strncmp(msg->magic, UDEV_MAGIC, sizeof(UDEV_MAGIC)) != 0 ) {
                dbg("message magic '%s' doesn't match, ignore it", msg->magic);
-               free(msg);
-               return;
+               goto skip;
        }
 
        /* if no seqnum is given, we move straight to exec queue */
@@ -271,6 +280,11 @@ static void handle_msg(int sock)
        } else {
                msg_queue_insert(msg);
        }
+       return;
+
+skip:
+       free(msg);
+       return;
 }
 
 static void sig_handler(int signum)
@@ -315,6 +329,12 @@ int main(int argc, char *argv[])
        struct sigaction act;
 
        init_logging("udevd");
+       dbg("version %s", UDEV_VERSION);
+
+       if (getuid() != 0) {
+               dbg("need to be root, exit");
+               exit(1);
+       }
 
        /* set signal handler */
        act.sa_handler = sig_handler;
@@ -336,14 +356,14 @@ int main(int argc, char *argv[])
 
        ssock = socket(AF_LOCAL, SOCK_DGRAM, 0);
        if (ssock == -1) {
-               dbg("error getting socket");
+               dbg("error getting socket, exit");
                exit(1);
        }
 
        /* the bind takes care of ensuring only one copy running */
        retval = bind(ssock, (struct sockaddr *) &saddr, addrlen);
        if (retval < 0) {
-               dbg("bind failed\n");
+               dbg("bind failed, exit");
                goto exit;
        }