#define _XOPEN_SOURCE 500 #include #include "core.h" int mkdir_p(const char *path, mode_t mode) { /* Adapted from http://stackoverflow.com/a/2336245/119527 */ const size_t len = strlen(path); char _path[PATH_MAX]; char *p; errno = 0; /* Copy string so its mutable */ if (len > sizeof(_path)-1) { errno = ENAMETOOLONG; return -1; } strcpy(_path, path); /* Iterate the string */ for (p = _path + 1; *p; p++) { if (*p == '/') { /* Temporarily truncate */ *p = '\0'; if (mkdir(_path, mode) != 0) { if (errno != EEXIST) return -1; } *p = '/'; } } if (mkdir(_path, mode) != 0) { if (errno != EEXIST) return -1; } return 0; } int unlink_cb( const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) { TRACE ("Removing %s\n", fpath); int rv = remove(fpath); if (rv) perror(fpath); return rv; } int rm_r(const char *path) { return nftw(path, unlink_cb, 64, FTW_DEPTH | FTW_PHYS); } /* Inline extern functions. */ int utf8_encode(const uint32_t utf, unsigned char *out);