makedevs: make special node creation idempotent
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 27 Nov 2016 22:27:54 +0000 (23:27 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 27 Nov 2016 22:27:54 +0000 (23:27 +0100)
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>
miscutils/makedevs.c

index 6278ee77cf2dd66f0992899dbd0feb5ca6dd1b5e..c5eeed0e0c4872667feeca2013ead2e7f98d9440 100644 (file)
@@ -157,8 +157,11 @@ int makedevs_main(int argc, char **argv)
 
                /* if mode != S_IFCHR and != S_IFBLK,
                 * 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);
+               }
 
                /*if (nodname == basedev)*/ /* ex. /dev/hda - to /dev/hda1 ... */
                        nodname = buf;
@@ -279,7 +282,9 @@ int makedevs_main(int argc UNUSED_PARAM, char **argv)
                        for (i = start; i <= start + count; i++) {
                                sprintf(full_name_inc, count ? "%s%u" : "%s", full_name, i);
                                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);
                                        ret = EXIT_FAILURE;
                                } else if (chown(full_name_inc, uid, gid) < 0) {