Mercurial > hg > toybox
diff lib/lib.c @ 590:7becb497c3c4
Update chmod to work with new dirtree, and fix bugs in string_to_mode().
author | Rob Landley <rob@landley.net> |
---|---|
date | Sun, 03 Jun 2012 00:32:12 -0500 |
parents | 1dcd7994abea |
children | be4b2d3796eb |
line wrap: on
line diff
--- a/lib/lib.c Fri Jun 01 20:27:51 2012 -0500 +++ b/lib/lib.c Sun Jun 03 00:32:12 2012 -0500 @@ -726,6 +726,17 @@ } } +int wfchmodat(int fd, char *name, mode_t mode) +{ + int rc = fchmodat(fd, name, mode, 0); + + if (rc) { + perror_msg("chmod '%s' to %04o", name, mode); + toys.exitval=1; + } + return rc; +} + // Open a temporary file to copy an existing file into. int copy_tempfile(int fdin, char *name, char **tempname) { @@ -926,7 +937,7 @@ mode_t string_to_mode(char *modestr, mode_t mode) { - char *whos = "ugoa", *hows = "=+-", *whats = "xwrstX", *whys = "ogu"; + char *whos = "ogua", *hows = "=+-", *whats = "xwrstX", *whys = "ogu"; char *s, *str = modestr; // Handle octal mode @@ -944,16 +955,17 @@ dowho = dohow = dowhat = 0; // Find the who, how, and what stanzas, in that order - while ((s = strchr(whos, *str))) { - dowho |= 1<<(whos-s); + while (*str && (s = strchr(whos, *str))) { + dowho |= 1<<(s-whos); str++; } if (!dowho) dowho = 8; - if (!(s = strchr(hows, *str))) goto barf; + if (!*str || !(s = strchr(hows, *str))) goto barf; dohow = *(str++); + if (!dohow) goto barf; - while ((s = strchr(whats, *str))) { - dowhat |= 1<<(whats-s); + while (*str && (s = strchr(whats, *str))) { + dowhat |= 1<<(s-whats); str++; } @@ -961,8 +973,8 @@ if ((dowhat&32) && (S_ISDIR(mode) || (mode&0111))) dowhat |= 1; // Copy mode from another category? - if (!dowhat && (s = strchr(whys, *str))) { - dowhat = (mode>>(3*(s-str)))&7; + if (!dowhat && *str && (s = strchr(whys, *str))) { + dowhat = (mode>>(3*(s-whys)))&7; str++; }