version 1.4, 2019/05/08 21:30:11 |
version 1.5, 2021/05/17 11:52:10 |
|
|
{ |
{ |
struct stat sb; |
struct stat sb; |
char *slash; |
char *slash; |
int done = 0; |
int done; |
|
|
slash = path; |
slash = path; |
|
|
while (!done) { |
for (;;) { |
slash += strspn(slash, "/"); |
slash += strspn(slash, "/"); |
slash += strcspn(slash, "/"); |
slash += strcspn(slash, "/"); |
|
|
done = (*slash == '\0'); |
done = (*slash == '\0'); |
*slash = '\0'; |
*slash = '\0'; |
|
|
if (stat(path, &sb)) { |
if (mkdir(path, 0777) != 0) { |
if (errno != ENOENT || (mkdir(path, 0777) && |
int mkdir_errno = errno; |
errno != EEXIST)) { |
|
ERR("%s: stat", path); |
if (stat(path, &sb) == -1) { |
|
/* Not there; use mkdir()s errno */ |
|
errno = mkdir_errno; |
return (-1); |
return (-1); |
} |
} |
} else if (!S_ISDIR(sb.st_mode)) { |
if (!S_ISDIR(sb.st_mode)) { |
errno = ENOTDIR; |
/* Is there, but isn't a directory */ |
ERR("%s: stat", path); |
errno = ENOTDIR; |
return (-1); |
return (-1); |
|
} |
} |
} |
|
|
|
if (done) |
|
break; |
|
|
*slash = '/'; |
*slash = '/'; |
} |
} |