X-Git-Url: http://git.thejh.net/?p=libjh.git;a=blobdiff_plain;f=fs.c;h=8ffaa3fdd3377c235833b563409e3ef6da1f6358;hp=1e8a31fa97fe52ce36d5be1d655199bd5dd9dc27;hb=0fa47e6453747e3ef4ab707a5bcb34980a465a75;hpb=3b41b5c082c2c3719fbbcfc4e381fee04879dc1d diff --git a/fs.c b/fs.c index 1e8a31f..8ffaa3f 100644 --- a/fs.c +++ b/fs.c @@ -1,5 +1,4 @@ // Copyright (2013) Jann Horn -// This code is licensed under the AGPLv3. HEADER #include HEADER #include @@ -30,3 +29,24 @@ PUBLIC_FN int dir_foreach(char *path, dir_iterator *iter, void *data) { errno = errno_; return feach_res; } + +PUBLIC_FN int mkdir_maybe(const char *path, mode_t mode) { + int r = mkdir(path, mode); + if (r && errno != EEXIST) { + return r; + } + return 0; +} + +HEADER // requires stdio.h +HEADER #define FDIR_FOREACH(dir, element_name, code) { \ +HEADER struct dirent element_name; \ +HEADER struct dirent *__jh_fdir_foreach_res; \ +HEADER while (1) { \ +HEADER int __jh_fdir_foreach_rd_res = readdir_r(dir, &element_name, &__jh_fdir_foreach_res); \ +HEADER if(__jh_fdir_foreach_rd_res) {*(char*)0 = 0; /*crash, boom – EBADF happened (probably)*/} \ +HEADER if (__jh_fdir_foreach_res == NULL) goto end; \ +HEADER {code} \ +HEADER } \ +HEADER end:; \ +HEADER }