mirror of https://github.com/skeeto/enchive.git
Before mkdir(2), check if directory exists.
On Cygwin, mkdir(2) reports EACCES if the directory exists but the system call would have failed had it not existed. This is a little odd since EEXIST would be a much more sensible error code, but this odd behavior seems to be permitted by POSIX. If mkdir(2) fails, but the path exists as a directory, then continue as normal.w32-compat
parent
949c649d90
commit
ab0ce78a00
|
@ -242,8 +242,17 @@ static char *storage_directory(char *file);
|
||||||
#if defined(__unix__) || defined(__APPLE__)
|
#if defined(__unix__) || defined(__APPLE__)
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/* Return non-zero if path exists and is a directory. */
|
||||||
|
static int
|
||||||
|
dir_exists(const char *path)
|
||||||
|
{
|
||||||
|
struct stat info;
|
||||||
|
return !stat(path, &info) && S_ISDIR(info.st_mode);
|
||||||
|
}
|
||||||
|
|
||||||
/* Use $XDG_CONFIG_HOME/enchive, or $HOME/.config/enchive. */
|
/* Use $XDG_CONFIG_HOME/enchive, or $HOME/.config/enchive. */
|
||||||
static char *
|
static char *
|
||||||
storage_directory(char *file)
|
storage_directory(char *file)
|
||||||
|
@ -282,16 +291,14 @@ storage_directory(char *file)
|
||||||
s = strchr(path + 1, '/');
|
s = strchr(path + 1, '/');
|
||||||
while (s) {
|
while (s) {
|
||||||
*s = 0;
|
*s = 0;
|
||||||
if (mkdir(path, 0700)) {
|
if (dir_exists(path) || !mkdir(path, 0700)) {
|
||||||
if (errno == EEXIST) {
|
DIR *dir = opendir(path);
|
||||||
DIR *dir = opendir(path);
|
if (dir)
|
||||||
if (dir)
|
closedir(dir);
|
||||||
closedir(dir);
|
else
|
||||||
else
|
fatal("opendir(%s) -- %s", path, strerror(errno));
|
||||||
fatal("%s -- %s", path, strerror(errno));
|
} else {
|
||||||
} else {
|
fatal("mkdir(%s) -- %s", path, strerror(errno));
|
||||||
fatal("%s -- %s", path, strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
*s = '/';
|
*s = '/';
|
||||||
s = strchr(s + 1, '/');
|
s = strchr(s + 1, '/');
|
||||||
|
|
Loading…
Reference in New Issue