chiark / gitweb /
udevd: at startup create /dev/null, /dev/console, /dev/kmsg
[elogind.git] / udev / udevd.c
index d9de26ea6cc705e8912bebc897ae3451f8d021fc..d1a226673e6df8244ce8e5bbb071539ccb84657d 100644 (file)
@@ -295,7 +295,7 @@ static void event_queue_insert(struct udev_event *event)
 
 static int mem_size_mb(void)
 {
-       FILEf;
+       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) {
@@ -813,7 +865,7 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       kernel_monitor = udev_monitor_new_from_netlink(udev, UDEV_MONITOR_KERNEL);
+       kernel_monitor = udev_monitor_new_from_netlink(udev, "kernel");
        if (kernel_monitor == NULL || udev_monitor_enable_receiving(kernel_monitor) < 0) {
                fprintf(stderr, "error initializing netlink socket\n");
                err(udev, "error initializing netlink socket\n");
@@ -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));