summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--thumbs.c3
-rw-r--r--util.c44
-rw-r--r--util.h2
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 */