chiark / gitweb /
keymap: Add Acer Aspire 1810TZ
[elogind.git] / udev / udevd.c
index dfdbb4c245b37b41f6115d7845f53f97dd6044bd..170225d00c85457f2fbdb735fb08e405c847190d 100644 (file)
@@ -223,7 +223,6 @@ static void worker_new(struct event *event)
        /* allow the main daemon netlink address to send devices to the worker */
        udev_monitor_allow_unicast_sender(worker_monitor, monitor);
        udev_monitor_enable_receiving(worker_monitor);
-       util_set_fd_cloexec(udev_monitor_get_fd(worker_monitor));
 
        worker = calloc(1, sizeof(struct worker));
        if (worker == NULL)
@@ -293,12 +292,9 @@ static void worker_new(struct event *event)
                        if (udev_device_get_event_timeout(dev) >= 0)
                                alarm(udev_device_get_event_timeout(dev));
 
-                       /* execute RUN= */
-                       if (err == 0 && !udev_event->ignore_device && udev_get_run(udev_event->udev))
-                               failed = udev_event_execute_run(udev_event,
-                                                               &orig_sigmask);
+                       if (err == 0)
+                               failed = udev_event_execute_run(udev_event, &orig_sigmask);
 
-                       /* reset alarm */
                        alarm(0);
 
                        /* apply/restore inotify watch */
@@ -310,7 +306,7 @@ static void worker_new(struct event *event)
                        /* send processed event back to libudev listeners */
                        udev_monitor_send_device(worker_monitor, NULL, dev);
 
-                       /* send back the result of the event execution */
+                       /* send udevd the result of the event execution */
                        if (err != 0)
                                msg.exitcode = err;
                        else if (failed != 0)
@@ -765,37 +761,11 @@ static void handle_signal(struct udev *udev, int signo)
        }
 }
 
-static void startup_log(struct udev *udev)
-{
-       FILE *f;
-       char path[UTIL_PATH_SIZE];
-       struct stat statbuf;
-
-       f = fopen("/dev/kmsg", "w");
-       if (f != NULL)
-               fprintf(f, "<6>udev: starting version " VERSION "\n");
-
-       util_strscpyl(path, sizeof(path), udev_get_sys_path(udev), "/class/mem/null", NULL);
-       if (lstat(path, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) {
-               const char *depr_str =
-                       "udev: missing sysfs features; please update the kernel "
-                       "or disable the kernel's CONFIG_SYSFS_DEPRECATED option; "
-                       "udev may fail to work correctly";
-
-               if (f != NULL)
-                       fprintf(f, "<3>%s\n", depr_str);
-               err(udev, "%s\n", depr_str);
-               sleep(15);
-       }
-
-       if (f != NULL)
-               fclose(f);
-}
-
 int main(int argc, char *argv[])
 {
        struct udev *udev;
        int fd;
+       FILE *f;
        sigset_t mask;
        const char *value;
        int daemonize = false;
@@ -920,6 +890,7 @@ int main(int argc, char *argv[])
                                  IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
        } else {
                char filename[UTIL_PATH_SIZE];
+               struct stat statbuf;
 
                inotify_add_watch(pfd[FD_INOTIFY].fd, LIBEXECDIR "/rules.d",
                                  IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
@@ -928,6 +899,12 @@ int main(int argc, char *argv[])
 
                /* watch dynamic rules directory */
                util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/rules.d", NULL);
+               if (stat(filename, &statbuf) != 0) {
+                       util_create_path(udev, filename);
+                       udev_selinux_setfscreatecon(udev, filename, S_IFDIR|0755);
+                       mkdir(filename, 0755);
+                       udev_selinux_resetfscreatecon(udev);
+               }
                inotify_add_watch(pfd[FD_INOTIFY].fd, filename,
                                  IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
        }
@@ -945,14 +922,13 @@ int main(int argc, char *argv[])
        }
 
        /* unnamed socket from workers to the main daemon */
-       if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, worker_watch) < 0) {
+       if (socketpair(AF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0, worker_watch) < 0) {
                fprintf(stderr, "error getting socketpair\n");
                err(udev, "error getting socketpair\n");
                rc = 6;
                goto exit;
        }
        pfd[FD_WORKER].fd = worker_watch[READ_END];
-       util_set_fd_cloexec(worker_watch[WRITE_END]);
 
        rules = udev_rules_new(udev, resolve_names);
        if (rules == NULL) {
@@ -983,7 +959,11 @@ int main(int argc, char *argv[])
                }
        }
 
-       startup_log(udev);
+       f = fopen("/dev/kmsg", "w");
+       if (f != NULL) {
+               fprintf(f, "<6>udev: starting version " VERSION "\n");
+               fclose(f);
+       }
 
        /* redirect std{out,err} */
        if (!debug && !debug_trace) {