From a7d39b0ab8fabb4f6417bb69a4e70d9da598d1aa Mon Sep 17 00:00:00 2001 From: Bert Münnich Date: Wed, 28 Oct 2015 23:21:12 +0100 Subject: Simplified r_mkdir() --- thumbs.c | 3 ++- util.c | 44 +++++++++++++++----------------------------- util.h | 2 +- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/thumbs.c b/thumbs.c index f10a1aa..c4cc130 100644 --- a/thumbs.c +++ b/thumbs.c @@ -92,7 +92,8 @@ void tns_cache_write(Imlib_Image im, const char *filepath, bool force) { if ((dirend = strrchr(cfile, '/')) != NULL) { *dirend = '\0'; - err = r_mkdir(cfile); + if ((err = r_mkdir(cfile)) == -1) + error(0, errno, "%s", cfile); *dirend = '/'; } if (err == 0) { diff --git a/util.c b/util.c index 620c8b6..5271a1d 100644 --- a/util.c +++ b/util.c @@ -181,37 +181,23 @@ char* r_readdir(r_dir_t *rdir) return NULL; } -int r_mkdir(const char *path) +int r_mkdir(char *path) { - char *dir, *d; - struct stat stats; - int err = 0; + char c, *s = path; + struct stat st; - if (*path == '\0') - return -1; - - if (stat(path, &stats) == 0) - return S_ISDIR(stats.st_mode) ? 0 : -1; - - d = dir = (char*) emalloc(strlen(path) + 1); - strcpy(dir, path); - - while (d != NULL && err == 0) { - d = strchr(d + 1, '/'); - if (d != NULL) - *d = '\0'; - if (access(dir, F_OK) < 0 && errno == ENOENT) { - if (mkdir(dir, 0755) < 0) { - error(0, errno, "%s", dir); - err = -1; - } - } else if (stat(dir, &stats) < 0 || !S_ISDIR(stats.st_mode)) { - err = -1; + while (*s != '\0') { + if (*s == '/') { + s++; + continue; } - if (d != NULL) - *d = '/'; + for (; *s != '\0' && *s != '/'; s++); + c = *s; + *s = '\0'; + if (mkdir(path, 0755) == -1) + if (errno != EEXIST || stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) + return -1; + *s = c; } - free(dir); - - return err; + return 0; } diff --git a/util.h b/util.h index 8359dc8..91b76d1 100644 --- a/util.h +++ b/util.h @@ -74,6 +74,6 @@ void size_readable(float*, const char**); int r_opendir(r_dir_t*, const char*); int r_closedir(r_dir_t*); char* r_readdir(r_dir_t*); -int r_mkdir(const char *); +int r_mkdir(char*); #endif /* UTIL_H */ -- cgit v1.2.3-54-g00ecf