123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #define _XOPEN_SOURCE 500
- #include <ftw.h>
- #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);
|