chiark / gitweb /
autogen.sh: add debug
[elogind.git] / udev / udevd.c
index 0827a5ceb32551b41520caa4414c82b774b1483f..68cf26436988ad1428f0d6e70a8c942b0717506c 100644 (file)
@@ -17,6 +17,8 @@
  *
  */
 
+#include "config.h"
+
 #include <stddef.h>
 #include <signal.h>
 #include <unistd.h>
@@ -39,6 +41,9 @@
 #include <sys/ioctl.h>
 #include <linux/types.h>
 #include <linux/netlink.h>
+#ifdef HAVE_INOTIFY
+#include <sys/inotify.h>
+#endif
 
 #include "udev.h"
 #include "udev_rules.h"
@@ -121,7 +126,7 @@ static int udev_event_process(struct udevd_uevent_msg *msg)
        for (i = 0; msg->envp[i]; i++)
                putenv(msg->envp[i]);
 
-       udev = udev_device_init(NULL);
+       udev = udev_device_init();
        if (udev == NULL)
                return -1;
        strlcpy(udev->action, msg->action, sizeof(udev->action));
@@ -156,12 +161,12 @@ static void export_event_state(struct udevd_uevent_msg *msg, enum event_state st
        size_t start;
 
        /* location of queue file */
-       snprintf(filename, sizeof(filename), "%s/"EVENT_QUEUE_DIR"/%llu", udev_root, msg->seqnum);
+       snprintf(filename, sizeof(filename), "%s/.udev/queue/%llu", udev_root, msg->seqnum);
 
        /* location of failed file */
        strlcpy(filename_failed, udev_root, sizeof(filename_failed));
        strlcat(filename_failed, "/", sizeof(filename_failed));
-       start = strlcat(filename_failed, EVENT_FAILED_DIR"/", sizeof(filename_failed));
+       start = strlcat(filename_failed, ".udev/failed/", sizeof(filename_failed));
        strlcat(filename_failed, msg->devpath, sizeof(filename_failed));
        path_encode(&filename_failed[start], sizeof(filename_failed) - start);
 
@@ -182,7 +187,7 @@ static void export_event_state(struct udevd_uevent_msg *msg, enum event_state st
 
                        strlcpy(filename_failed_old, udev_root, sizeof(filename_failed_old));
                        strlcat(filename_failed_old, "/", sizeof(filename_failed_old));
-                       start = strlcat(filename_failed_old, EVENT_FAILED_DIR"/", sizeof(filename_failed_old));
+                       start = strlcat(filename_failed_old, ".udev/failed/", sizeof(filename_failed_old));
                        strlcat(filename_failed_old, msg->devpath_old, sizeof(filename_failed_old));
                        path_encode(&filename_failed_old[start], sizeof(filename) - start);
 
@@ -273,7 +278,7 @@ static void msg_queue_insert(struct udevd_uevent_msg *msg)
        info("seq %llu queued, '%s' '%s'\n", msg->seqnum, msg->action, msg->subsystem);
 
        strlcpy(filename, udev_root, sizeof(filename));
-       strlcat(filename, "/" EVENT_SEQNUM, sizeof(filename));
+       strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
        fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
        if (fd >= 0) {
                char str[32];
@@ -659,7 +664,6 @@ static void get_ctrl_msg(void)
        struct iovec iov;
        struct ucred *cred;
        char cred_msg[CMSG_SPACE(sizeof(struct ucred))];
-       int *intval;
        char *pos;
 
        memset(&ctrl_msg, 0x00, sizeof(struct udevd_ctrl_msg));
@@ -722,21 +726,18 @@ static void get_ctrl_msg(void)
                msg_queue_manager();
                break;
        case UDEVD_CTRL_SET_LOG_LEVEL:
-               intval = (int *) ctrl_msg.buf;
-               info("udevd message (SET_LOG_PRIORITY) received, udev_log_priority=%i\n", *intval);
-               udev_log_priority = *intval;
+               info("udevd message (SET_LOG_PRIORITY) received, udev_log_priority=%i\n", ctrl_msg.intval);
+               udev_log_priority =  ctrl_msg.intval;
                sprintf(udev_log, "UDEV_LOG=%i", udev_log_priority);
                putenv(udev_log);
                break;
        case UDEVD_CTRL_SET_MAX_CHILDS:
-               intval = (int *) ctrl_msg.buf;
-               info("udevd message (UDEVD_SET_MAX_CHILDS) received, max_childs=%i\n", *intval);
-               max_childs = *intval;
+               info("udevd message (UDEVD_SET_MAX_CHILDS) received, max_childs=%i\n", ctrl_msg.intval);
+               max_childs = ctrl_msg.intval;
                break;
        case UDEVD_CTRL_SET_MAX_CHILDS_RUNNING:
-               intval = (int *) ctrl_msg.buf;
-               info("udevd message (UDEVD_SET_MAX_CHILDS_RUNNING) received, max_childs=%i\n", *intval);
-               max_childs_running = *intval;
+               info("udevd message (UDEVD_SET_MAX_CHILDS_RUNNING) received, max_childs_running=%i\n", ctrl_msg.intval);
+               max_childs_running = ctrl_msg.intval;
                break;
        case UDEVD_CTRL_RELOAD_RULES:
                info("udevd message (RELOAD_RULES) received\n");
@@ -865,9 +866,11 @@ static int init_udevd_socket(void)
 
        memset(&saddr, 0x00, sizeof(saddr));
        saddr.sun_family = AF_LOCAL;
-       /* use abstract namespace for socket path */
-       strcpy(&saddr.sun_path[1], UDEVD_CTRL_SOCK_PATH);
-       addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&saddr.sun_path[1]);
+       strcpy(saddr.sun_path, UDEVD_CTRL_SOCK_PATH);
+       addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path);
+       /* translate leading '@' to abstract namespace */
+       if (saddr.sun_path[0] == '@')
+               saddr.sun_path[0] = '\0';
 
        udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
        if (udevd_sock == -1) {
@@ -939,7 +942,7 @@ static void export_initial_seqnum(void)
                len = 3;
        }
        strlcpy(filename, udev_root, sizeof(filename));
-       strlcat(filename, "/" EVENT_SEQNUM, sizeof(filename));
+       strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
        create_path(filename);
        fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
        if (fd >= 0) {
@@ -948,7 +951,7 @@ static void export_initial_seqnum(void)
        }
 }
 
-int main(int argc, char *argv[], char *envp[])
+int main(int argc, char *argv[])
 {
        int retval;
        int fd;
@@ -971,7 +974,7 @@ int main(int argc, char *argv[], char *envp[])
        logging_init("udevd");
        udev_config_init();
        selinux_init();
-       dbg("version %s\n", UDEV_VERSION);
+       dbg("version %s\n", VERSION);
 
        while (1) {
                option = getopt_long(argc, argv, "dDthV", options, NULL);
@@ -994,7 +997,7 @@ int main(int argc, char *argv[], char *envp[])
                        printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--debug] [--version]\n");
                        goto exit;
                case 'V':
-                       printf("%s\n", UDEV_VERSION);
+                       printf("%s\n", VERSION);
                        goto exit;
                default:
                        goto exit;
@@ -1123,7 +1126,7 @@ int main(int argc, char *argv[], char *envp[])
 
        fd = open("/dev/kmsg", O_WRONLY);
        if (fd > 0) {
-               const char *str = "<6>udevd version " UDEV_VERSION " started\n";
+               const char *str = "<6>udevd version " VERSION " started\n";
 
                write(fd, str, strlen(str));
                close(fd);
@@ -1148,14 +1151,14 @@ int main(int argc, char *argv[], char *envp[])
                } else {
                        char filename[PATH_MAX];
 
-                       inotify_add_watch(inotify_fd, RULES_LIB_DIR,
+                       inotify_add_watch(inotify_fd, UDEV_PREFIX "/lib/udev/rules.d",
                                          IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
-                       inotify_add_watch(inotify_fd, RULES_ETC_DIR,
+                       inotify_add_watch(inotify_fd, SYSCONFDIR "/udev/rules.d",
                                          IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
 
                        /* watch dynamic rules directory */
                        strlcpy(filename, udev_root, sizeof(filename));
-                       strlcat(filename, "/"RULES_DYN_DIR, sizeof(filename));
+                       strlcat(filename, "/.udev/rules.d", sizeof(filename));
                        inotify_add_watch(inotify_fd, filename,
                                          IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
                }