X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudevd.c;h=d1a226673e6df8244ce8e5bbb071539ccb84657d;hb=08a7a795f61eaf42f31b26e435067a664f0a4d4d;hp=6de1196421eacd096da57fea3c78e95bb3cb1358;hpb=f2b937440c682bca3837263a1bafd78e30b17e4d;p=elogind.git diff --git a/udev/udevd.c b/udev/udevd.c index 6de119642..d1a226673 100644 --- a/udev/udevd.c +++ b/udev/udevd.c @@ -295,7 +295,7 @@ static void event_queue_insert(struct udev_event *event) static int mem_size_mb(void) { - FILE* f; + FILE *f; char buf[4096]; long int memsize = -1; @@ -708,6 +708,56 @@ static void export_initial_seqnum(struct udev *udev) } } +/* create the nodes the we depend on to properly start up */ +static void setup_initial_nodes(struct udev *udev) +{ + struct udev_device *dev; + + dev = udev_device_new_from_subsystem_sysname(udev, "mem", "null"); + if (dev != NULL) { + udev_node_mknod(dev, "null", makedev(0,0), 0666, 0, 0); + udev_device_unref(dev); + } + dev = udev_device_new_from_subsystem_sysname(udev, "mem", "kmsg"); + if (dev != NULL) { + udev_node_mknod(dev, "kmsg", makedev(0,0), 0660, 0, 0); + udev_device_unref(dev); + } + dev = udev_device_new_from_subsystem_sysname(udev, "tty", "console"); + if (dev != NULL) { + udev_node_mknod(dev, "console", makedev(0,0), 0600, 0, 0); + udev_device_unref(dev); + } +} + +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_strlcpy(path, udev_get_sys_path(udev), sizeof(path)); + util_strlcat(path, "/class/mem/null", sizeof(path)); + 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(3); + } + + if (f != NULL) + fclose(f); +} + int main(int argc, char *argv[]) { struct udev *udev; @@ -786,6 +836,8 @@ int main(int argc, char *argv[]) goto exit; } + setup_initial_nodes(udev); + /* make sure std{in,out,err} fd's are in a sane state */ fd = open("/dev/null", O_RDWR); if (fd < 0) { @@ -875,27 +927,7 @@ int main(int argc, char *argv[]) close(fd); } - fd = open("/dev/kmsg", O_WRONLY); - if (fd > 0) { - const char *ver_str = "<6>udev: starting version " VERSION "\n"; - char path[UTIL_PATH_SIZE]; - struct stat statbuf; - - write(fd, ver_str, strlen(ver_str)); - util_strlcpy(path, udev_get_sys_path(udev), sizeof(path)); - util_strlcat(path, "/class/mem/null", sizeof(path)); - if (lstat(path, &statbuf) == 0) { - if (S_ISDIR(statbuf.st_mode)) { - const char *depr_str = - "<6>udev: deprecated sysfs layout; update the kernel or " - "disable CONFIG_SYSFS_DEPRECATED; some udev features will " - "not work correctly\n"; - - write(fd, depr_str, strlen(depr_str)); - } - } - close(fd); - } + startup_log(udev); /* set signal handlers */ memset(&act, 0x00, sizeof(struct sigaction));