aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2014-06-30 04:58:37 -0500
committerRob Landley <rob@landley.net>2014-06-30 04:58:37 -0500
commit936ab6d68b747ed7a315ef9c27bb9b90088686f3 (patch)
tree83c7faca0e53779f3bdc5c28f8b708ef55d393a0
parent7a9f7d1fbc9b72dc43296f7de8b5ab64536938b1 (diff)
downloadtoybox-936ab6d68b747ed7a315ef9c27bb9b90088686f3.tar.gz
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.
-rw-r--r--toys/pending/makedevs.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/toys/pending/makedevs.c b/toys/pending/makedevs.c
index 19ccac76..4480f8c7 100644
--- a/toys/pending/makedevs.c
+++ b/toys/pending/makedevs.c
@@ -49,11 +49,11 @@ void makedevs_main()
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 @@ void makedevs_main()
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 @@ void makedevs_main()
} 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);
- 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);
+
+ 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;
}
+
+ 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);
}