chiark / gitweb /
udevd: at startup create /dev/null, /dev/console, /dev/kmsg
authorKay Sievers <kay.sievers@vrfy.org>
Sun, 19 Apr 2009 01:25:04 +0000 (03:25 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Sun, 19 Apr 2009 01:25:04 +0000 (03:25 +0200)
udev/lib/libudev-ctrl.c
udev/udev-node.c
udev/udevd.c

index 25661cade91308b871b64976853c518e25f93d97..80ab0370e237dba6e108b8d0d72e838eba044630 100644 (file)
@@ -22,7 +22,7 @@
 #include "libudev.h"
 #include "libudev-private.h"
 
-/* last known version with this wire protocol */
+/* wire protocol magic must match */
 #define UDEV_CTRL_MAGIC                                0xdead1dea
 
 enum udev_ctrl_msg_type {
index 74ec00b1ebb4404a2a3a97dd9b88ab748ae6ce67..965017240cf9b4bcb8f8358726c5c8c76733420b 100644 (file)
@@ -68,7 +68,7 @@ static int name_index(struct udev *udev, const char *devpath, const char *name,
 int udev_node_mknod(struct udev_device *dev, const char *file, dev_t devnum, mode_t mode, uid_t uid, gid_t gid)
 {
        struct udev *udev = udev_device_get_udev(dev);
-       char file_tmp[UTIL_PATH_SIZE + sizeof(TMP_FILE_EXT)];
+       char filename[UTIL_PATH_SIZE];
        struct stat stats;
        int preserve = 0;
        int err = 0;
@@ -81,8 +81,14 @@ int udev_node_mknod(struct udev_device *dev, const char *file, dev_t devnum, mod
        else
                mode |= S_IFCHR;
 
-       if (file == NULL)
+       if (file == NULL) {
                file = udev_device_get_devnode(dev);
+       } else if (file[0] != '/') {
+               util_strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
+               util_strlcat(filename, "/", sizeof(filename));
+               util_strlcat(filename, file, sizeof(filename));
+               file = filename;
+       }
 
        if (lstat(file, &stats) == 0) {
                if (((stats.st_mode & S_IFMT) == (mode & S_IFMT)) && (stats.st_rdev == devnum)) {
@@ -90,6 +96,8 @@ int udev_node_mknod(struct udev_device *dev, const char *file, dev_t devnum, mod
                        preserve = 1;
                        udev_selinux_lsetfilecon(udev, file, mode);
                } else {
+                       char file_tmp[UTIL_PATH_SIZE + sizeof(TMP_FILE_EXT)];
+
                        info(udev, "atomically replace existing file '%s'\n", file);
                        util_strlcpy(file_tmp, file, sizeof(file_tmp));
                        util_strlcat(file_tmp, TMP_FILE_EXT, sizeof(file_tmp));
index 1aa50eb74cfbcdd00031aaf0c6d234c1416f91d7..d1a226673e6df8244ce8e5bbb071539ccb84657d 100644 (file)
@@ -708,6 +708,28 @@ 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;
@@ -814,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) {