# HG changeset patch # User Rob Landley # Date 1331010950 21600 # Node ID a3116cb7ba1e547d7323e50cd334310147a099ce # Parent f435e8e3a0ba2c5f9c9d914039f8e7d57c053618 mkdir cleanups: Let umask do its thing at the syscall level, have mode be a global to prepare for -m, use do_blah name loopfiles() usually calls, one less redundant mkdir() call, go ahead and modify writeable args instead of strdup(), return before restoring / so error message is better, use perror_msg(). diff -r f435e8e3a0ba -r a3116cb7ba1e toys/mkdir.c --- a/toys/mkdir.c Mon Mar 05 22:19:36 2012 -0600 +++ b/toys/mkdir.c Mon Mar 05 23:15:50 2012 -0600 @@ -22,46 +22,40 @@ #include "toys.h" +DEFINE_GLOBALS( + long mode; +) -static int create_dir(const char *dir, mode_t mode) { - int ret = 0; +#define TT this.mkdir + +static int do_mkdir(char *dir) +{ unsigned int i; - // Shortcut - if (strchr(dir, '/') == NULL || !toys.optflags) - return mkdir(dir, mode); - - char *d = strdup(dir); - if (!d) - return -1; - unsigned int dlen = strlen(dir); + if (toys.optflags && *dir) { + // Skip first char (it can be /) + for (i = 1; dir[i]; i++) { + int ret; - // Skip first char (it can be /) - for (i = 1; i < dlen; i++) { - if (d[i] != '/') - continue; - d[i] = '\0'; - ret = mkdir(d, mode); - d[i] = '/'; - if (ret < 0 && errno != EEXIST) - goto OUT; + if (dir[i] != '/') continue; + dir[i] = 0; + ret = mkdir(dir, TT.mode); + if (ret < 0 && errno != EEXIST) return ret; + dir[i] = '/'; + } } - ret = mkdir(d, mode); -OUT: - free(d); - return ret; + return mkdir(dir, TT.mode); } void mkdir_main(void) { char **s; - mode_t umask_val = umask(0); - mode_t dir_mode = (0777 & ~umask_val) | (S_IWUSR | S_IXUSR); - umask(umask_val); + + TT.mode = 0777; for (s=toys.optargs; *s; s++) { - if (create_dir(*s, dir_mode) != 0) { - fprintf(stderr, "mkdir: cannot create directory '%s': %s\n", *s, strerror(errno)); + if (do_mkdir(*s)) { + perror_msg("cannot create directory '%s'", *s); toys.exitval = 1; } }