changeset 1372:d46baa9adb5f draft

Bugfixes for cleaned up makedevs. Newline after table = <stdin>, move start/increment/count loop around entire device creation if/else staircase including chmod/chown code and use ptr to record node vs toybuf.
author Rob Landley <rob@landley.net>
date Mon, 30 Jun 2014 04:58:37 -0500
parents 0a87952492ae
children a3ee4f91462a
files toys/pending/makedevs.c
diffstat 1 files changed, 26 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/toys/pending/makedevs.c	Sat Jun 28 22:47:40 2014 -0500
+++ b/toys/pending/makedevs.c	Mon Jun 30 04:58:37 2014 -0500
@@ -49,11 +49,11 @@
   if (toys.optflags & FLAG_d && strcmp(TT.fname, "-")) {
     fd = xopen(TT.fname, O_RDONLY);
     xprintf("table = %s\n", TT.fname);
-  } else xprintf("table = <stdin>");
+  } else xprintf("table = <stdin>\n");
   xchdir(*toys.optargs);
 
   for (line_no = 0; (line = get_line(fd)); free(line)) {
-    char type=0, str[64], user[64], group[64], *node = str, *ptr = line;
+    char type=0, user[64], group[64], *node, *ptr = line;
     unsigned int mode = 0755, major = 0, minor = 0, cnt = 0, incr = 0, 
                  st_val = 0;
     uid_t uid;
@@ -63,9 +63,10 @@
     line_no++;
     while (isspace(*ptr)) ptr++;
     if (!*ptr || *ptr == '#') continue;
+    node = ptr;
 
     while (*ptr && !isspace(*ptr)) ptr++;
-    if (*ptr) *ptr++ = 0;
+    if (*ptr) *(ptr++) = 0;
     *user = *group = 0;
     sscanf(ptr, "%c %o %63s %63s %u %u %u %u %u", &type, &mode,
            user, group, &major, &minor, &st_val, &incr, &cnt);
@@ -100,28 +101,31 @@
     } else gid = getgid();
 
     while (*node == '/') node++; // using relative path
-    if (type == 'd') {
-      if (mkpathat(AT_FDCWD, node, mode, 3))  {
-        perror_msg("can't create directory '%s'", node);
-        continue;
-      }
-    } else if (type == 'f') {
-      if (stat(node, &st) || !S_ISREG(st.st_mode)) {
-        perror_msg("line %d: regular file '%s' does not exist", line_no, node);
+
+    for (i = 0; (!cnt && !i) || i < cnt; i++) {
+      if (cnt) {
+        snprintf(toybuf, sizeof(toybuf), "%s%u", node, st_val + i);
+        ptr = toybuf;
+      } else ptr = node;
+
+      if (type == 'd') {
+        if (mkpathat(AT_FDCWD, ptr, mode, 3))  {
+          perror_msg("can't create directory '%s'", ptr);
+          continue;
+        }
+      } else if (type == 'f') {
+        if (stat(ptr, &st) || !S_ISREG(st.st_mode)) {
+          perror_msg("line %d: file '%s' does not exist", line_no, ptr);
+          continue;
+        }
+      } else if (mknod(ptr, mode, makedev(major, minor + i*incr))) {
+        perror_msg("line %d: can't create node '%s'", line_no, ptr);
         continue;
       }
-    } else {
-      if (cnt) --cnt;
-      for (i = 0; i <= cnt; i++) {
-        sprintf(toybuf, cnt ? "%s%u" : "%s", node, st_val + i);
-        if (mknod(toybuf, mode, makedev(major, minor + i*incr))) {
-          perror_msg("line %d: can't create node '%s'", line_no, toybuf);
-          continue;
-        }
-      }
+
+      if (chown(ptr, uid, gid) || chmod(ptr, mode)) 
+        perror_msg("line %d: can't chown/chmod '%s'", line_no, ptr);
     }
-    if (chown(toybuf, uid, gid) || chmod(toybuf, mode)) 
-      perror_msg("line %d: can't chown/chmod '%s'", line_no, toybuf);
   }
   xclose(fd);
 }