X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fudev%2Fudevd.c;h=43937db8903a5aa0742717a564098111ce59b9d4;hp=d6de2aa2224425bb94a1529ecf597d6d66a7f66a;hb=667e392408d6b56db981d8e76c31990501d0faf3;hpb=6ada823a9a0979ea145fd70add1007c21caa45c0 diff --git a/src/udev/udevd.c b/src/udev/udevd.c index d6de2aa22..43937db89 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -47,6 +47,7 @@ #include "udev.h" #include "sd-daemon.h" #include "cgroup-util.h" +#include "dev-setup.h" static bool debug; @@ -98,13 +99,9 @@ struct event { int ifindex; }; -static struct event *node_to_event(struct udev_list_node *node) +static inline struct event *node_to_event(struct udev_list_node *node) { - char *event; - - event = (char *)node; - event -= offsetof(struct event, node); - return (struct event *)event; + return container_of(node, struct event, node); } static void event_queue_cleanup(struct udev *udev, enum event_state type); @@ -133,13 +130,9 @@ struct worker_message { int exitcode; }; -static struct worker *node_to_worker(struct udev_list_node *node) +static inline struct worker *node_to_worker(struct udev_list_node *node) { - char *worker; - - worker = (char *)node; - worker -= offsetof(struct worker, node); - return (struct worker *)worker; + return container_of(node, struct worker, node); } static void event_queue_delete(struct event *event, bool export) @@ -857,52 +850,17 @@ static void static_dev_create_from_modules(struct udev *udev) continue; util_strscpyl(filename, sizeof(filename), "/dev/", devname, NULL); - util_create_path_selinux(udev, filename); - udev_selinux_setfscreatecon(udev, filename, mode); + mkdir_parents_label(filename, 0755); + label_context_set(filename, mode); log_debug("mknod '%s' %c%u:%u\n", filename, type, maj, min); if (mknod(filename, mode, makedev(maj, min)) < 0 && errno == EEXIST) utimensat(AT_FDCWD, filename, NULL, 0); - udev_selinux_resetfscreatecon(udev); + label_context_clear(); } fclose(f); } -/* needed for standalone udev operations */ -static void static_dev_create_links(struct udev *udev) -{ - DIR *dir; - struct stdlinks { - const char *link; - const char *target; - }; - static const struct stdlinks stdlinks[] = { - { "core", "/proc/kcore" }, - { "fd", "/proc/self/fd" }, - { "stdin", "/proc/self/fd/0" }, - { "stdout", "/proc/self/fd/1" }, - { "stderr", "/proc/self/fd/2" }, - }; - unsigned int i; - - dir = opendir("/dev"); - if (dir == NULL) - return; - - for (i = 0; i < ELEMENTSOF(stdlinks); i++) { - struct stat sb; - - if (stat(stdlinks[i].target, &sb) == 0) { - udev_selinux_setfscreateconat(udev, dirfd(dir), stdlinks[i].link, S_IFLNK); - if (symlinkat(stdlinks[i].target, dirfd(dir), stdlinks[i].link) < 0 && errno == EEXIST) - utimensat(dirfd(dir), stdlinks[i].link, NULL, AT_SYMLINK_NOFOLLOW); - udev_selinux_resetfscreatecon(udev); - } - } - - closedir(dir); -} - static int mem_size_mb(void) { FILE *f; @@ -938,7 +896,7 @@ static int convert_db(struct udev *udev) return 0; /* make sure we do not get here again */ - util_create_path(udev, "/run/udev/data"); + mkdir_parents("/run/udev/data", 0755); mkdir(filename, 0755); /* old database */ @@ -1072,6 +1030,7 @@ int main(int argc, char *argv[]) int fd_ctrl = -1; int fd_netlink = -1; int fd_worker = -1; + const char *prefixes[] = { "/dev", "/run", NULL }; struct epoll_event ep_ctrl, ep_inotify, ep_signal, ep_netlink, ep_worker; struct udev_ctrl_connection *ctrl_conn = NULL; int rc = 1; @@ -1084,7 +1043,7 @@ int main(int argc, char *argv[]) log_parse_environment(); udev_set_log_fn(udev, udev_main_log); log_debug("version %s\n", VERSION); - udev_selinux_init(udev); + label_init(prefixes); for (;;) { int option; @@ -1186,8 +1145,7 @@ int main(int argc, char *argv[]) mkdir("/run/udev", 0755); - /* create standard links, copy static nodes, create nodes from modules */ - static_dev_create_links(udev); + dev_setup(); static_dev_create_from_modules(udev); /* before opening new files, make sure std{in,out,err} fds are in a sane state */ @@ -1290,18 +1248,8 @@ int main(int argc, char *argv[]) setsid(); - fd = open("/proc/self/oom_score_adj", O_RDWR); - if (fd < 0) { - /* Fallback to old interface */ - fd = open("/proc/self/oom_adj", O_RDWR); - if (fd < 0) { - log_error("error disabling OOM: %m\n"); - } else { - /* OOM_DISABLE == -17 */ - write(fd, "-17", 3); - close(fd); - } - } else { + fd = open("/proc/self/oom_score_adj", O_RDWR|O_CLOEXEC); + if (fd >= 0) { write(fd, "-1000", 5); close(fd); } @@ -1614,7 +1562,7 @@ exit_daemonize: udev_queue_export_unref(udev_queue_export); udev_ctrl_connection_unref(ctrl_conn); udev_ctrl_unref(udev_ctrl); - udev_selinux_exit(udev); + label_finish(); udev_unref(udev); log_close(); return rc;