c85cd189dc
We use makedevs to create device nodes in the target rootfs. However, this can be called several times, e.g. when building several filesystem images or when rebuilding. When makedevs is called the second time, the device node already exists so mknod() errors out. This wasn't noticed before because fakeroot's mknod() wrapper (incorrectly) does _not_ error out when the file exists already. Now we switched from fakeroot to pseudo, the problem becomes apparent. Before creating the device node, check if it already exists and if so, if it has the correct device type and number. Change of mode and ownership is still done. This approach was preferred over removing the target files before creating them, which would be simpler. However, when e.g. a file exists as a normal file and makedevs specifies it as a device node, that really is an error so we should detect it. The other types don't have to be changed. The 'd' (directory) type is already OK because it already only creates directories if they don't exist yet. The 'f' (file mode) and 'r' (recursive) types only operate on files and directories that exist already. Patch also sent upstream to busybox. Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> Reported-by: Fabio Estevam <festevam@gmail.com> Tested-by: Fabio Estevam <festevam@gmail.com> Reviewed-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Tested-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> |
||
---|---|---|
.. | ||
Config.in | ||
makedevs.c | ||
makedevs.mk | ||
README |
When building a target filesystem, it is desirable to not have to become root and then run 'mknod' a thousand times. Using a device table you can create device nodes and directories "on the fly". You can do all sorts of interesting things with a device table file. For example, if you want to adjust the permissions on a particular file you can just add an entry like: /sbin/foobar f 2755 0 0 - - - - - and (assuming the file /sbin/foobar exists) it will be made setuid root (regardless of what its permissions are on the host filesystem. Furthermore, you can use a single table entry to create a many device minors. For example, if I wanted to create /dev/hda and /dev/hda[0-15] I could just use the following two table entries: /dev/hda b 640 0 0 3 0 0 0 - /dev/hda b 640 0 0 3 1 1 1 15 Device table entries take the form of: <name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count> where name is the file name, type can be one of: f: A regular file d: Directory c: Character special device file b: Block special device file p: Fifo (named pipe) uid is the user id for the target file, gid is the group id for the target file. The rest of the entries (major, minor, etc) apply only to device special files.