Three bugfixes in mkdir(1)

1) Any path passed to mkdir -p beginning with '/' failed, because
   it would cut out the first '/' immediately, passing "" to mkdir.
2) Running mkdir -p with a path/to/dir without trailing '/' would
   not create the directory.
   This is due to a wrong flag-check I added in the main-loop.
   It should now work as expected.
3) With the p-flag given, don't report an error in case the last
   dir also exists.
This commit is contained in:
FRIGN 2015-03-13 12:15:30 +01:00
parent b12041365d
commit c82425e128

10
mkdir.c
View File

@ -11,7 +11,7 @@ mkdirp(char *path)
{ {
char *p; char *p;
for (p = path; *p; p++) { for (p = path + (*path == '/'); *p; p++) {
if (*p != '/') if (*p != '/')
continue; continue;
*p = '\0'; *p = '\0';
@ -56,9 +56,11 @@ main(int argc, char *argv[])
for (; *argv; argc--, argv++) { for (; *argv; argc--, argv++) {
if (pflag && mkdirp(*argv) < 0) { if (pflag && mkdirp(*argv) < 0) {
ret = 1; ret = 1;
} else if (!pflag && mkdir(*argv, S_IRWXU | S_IRWXG | S_IRWXO) < 0) { } else if (mkdir(*argv, S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
weprintf("mkdir %s:", *argv); if (!(pflag && errno == EEXIST)) {
ret = 1; weprintf("mkdir %s:", *argv);
ret = 1;
}
} else if (mflag && chmod(*argv, mode) < 0) { } else if (mflag && chmod(*argv, mode) < 0) {
weprintf("chmod %s:", *argv); weprintf("chmod %s:", *argv);
ret = 1; ret = 1;