makedevs: make special node creation idempotent

When makedevs is called for a second time with the same device file,
it fails because the files already exist and mknod() gives -EEXIST.

Ignore EEXIST errors.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2016-11-27 23:27:54 +01:00
parent bff71d3b9d
commit 2c769c69b2

View File

@ -157,8 +157,11 @@ int makedevs_main(int argc, char **argv)
/* if mode != S_IFCHR and != S_IFBLK, /* if mode != S_IFCHR and != S_IFBLK,
* third param in mknod() ignored */ * third param in mknod() ignored */
if (mknod(nodname, mode, makedev(Smajor, Sminor))) if (mknod(nodname, mode, makedev(Smajor, Sminor)) != 0
&& errno != EEXIST
) {
bb_perror_msg("can't create '%s'", nodname); bb_perror_msg("can't create '%s'", nodname);
}
/*if (nodname == basedev)*/ /* ex. /dev/hda - to /dev/hda1 ... */ /*if (nodname == basedev)*/ /* ex. /dev/hda - to /dev/hda1 ... */
nodname = buf; nodname = buf;
@ -279,7 +282,9 @@ int makedevs_main(int argc UNUSED_PARAM, char **argv)
for (i = start; i <= start + count; i++) { for (i = start; i <= start + count; i++) {
sprintf(full_name_inc, count ? "%s%u" : "%s", full_name, i); sprintf(full_name_inc, count ? "%s%u" : "%s", full_name, i);
rdev = makedev(major, minor + (i - start) * increment); rdev = makedev(major, minor + (i - start) * increment);
if (mknod(full_name_inc, mode, rdev) < 0) { if (mknod(full_name_inc, mode, rdev) != 0
&& errno != EEXIST
) {
bb_perror_msg("line %d: can't create node %s", linenum, full_name_inc); bb_perror_msg("line %d: can't create node %s", linenum, full_name_inc);
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
} else if (chown(full_name_inc, uid, gid) < 0) { } else if (chown(full_name_inc, uid, gid) < 0) {