From ca1b60e3bdb19eca981e5ccf4e07100aafddb007 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Tue, 11 Mar 2014 20:44:55 -0500 Subject: Move mkpathat to lib, remove redundant function used by patch. --- toys/posix/mkdir.c | 49 ------------------------------------------------- toys/posix/patch.c | 8 ++------ 2 files changed, 2 insertions(+), 55 deletions(-) (limited to 'toys/posix') diff --git a/toys/posix/mkdir.c b/toys/posix/mkdir.c index 25dfb0de..5cbc28db 100644 --- a/toys/posix/mkdir.c +++ b/toys/posix/mkdir.c @@ -25,55 +25,6 @@ GLOBALS( char *arg_mode; ) -// flags: 1=make last dir (with mode lastmode, otherwise skips last component) -// 2=make path (already exists is ok) -// 4=verbose -// returns 0 = path ok, 1 = error -int mkpathat(int atfd, char *dir, mode_t lastmode, int flags) -{ - struct stat buf; - char *s; - - // mkdir -p one/two/three is not an error if the path already exists, - // but is if "three" is a file. The others we dereference and catch - // not-a-directory along the way, but the last one we must explicitly - // test for. Might as well do it up front. - - if (!fstatat(atfd, dir, &buf, 0) && !S_ISDIR(buf.st_mode)) { - errno = EEXIST; - return 1; - } - - // Skip leading / of absolute paths - while (*dir == '/') dir++; - - for (s=dir; ;s++) { - char save = 0; - mode_t mode = (0777&~toys.old_umask)|0300; - - // Skip leading / of absolute paths. - if (*s == '/' && (flags&2)) { - save = *s; - *s = 0; - } else if (*s) continue; - - // Use the mode from the -m option only for the last directory. - if (!save) { - if (flags&1) mode = lastmode; - else break; - } - - if (mkdirat(atfd, dir, mode)) { - if (!(flags&2) || errno != EEXIST) return 1; - } else if (flags&4) - fprintf(stderr, "%s: created directory '%s'\n", toys.which->name, dir); - - if (!(*s = save)) break; - } - - return 0; -} - void mkdir_main(void) { char **s; diff --git a/toys/posix/patch.c b/toys/posix/patch.c index ae24ff94..27828015 100644 --- a/toys/posix/patch.c +++ b/toys/posix/patch.c @@ -385,12 +385,8 @@ void patch_main(void) if ((!strcmp(oldname, "/dev/null") || !oldsum) && access(name, F_OK)) { printf("creating %s\n", name); - s = strrchr(name, '/'); - if (s) { - *s = 0; - xmkpath(name, -1); - *s = '/'; - } + if (mkpathat(AT_FDCWD, name, 0, 2)) + perror_exit("mkpath %s", name); TT.filein = xcreate(name, O_CREAT|O_EXCL|O_RDWR, 0666); } else { printf("patching %s\n", name); -- cgit v1.2.3