123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #define _XOPEN_SOURCE 500
- #include <ftw.h>
- #include "core.h"
- #include "lmdb.h"
- /*
- * The message corresponding to the rc is found by
- * warning_msg[rc - LSUP_MIN_WARNING].
- */
- char *warning_msg[] = {
- "No action or change of state occurred.",
- "No result.",
- "End of the loop reached.",
- };
- /*
- * The message corresponding to the rc is found by
- * err_msg[rc - LSUP_MIN_ERROR].
- */
- char *err_msg[] = {
- "LSUP runtime error.",
- "Error parsing input.",
- "Invalid input.",
- "MDB transaction error.",
- "Database error.",
- "Not implemented.",
- "Input/Output error.",
- "Memory error.",
- };
- 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)
- {
- log_debug ("Removing %s", 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); }
- const char *
- LSUP_strerror (LSUP_rc rc)
- {
- if (rc >= LSUP_MIN_ERROR && rc <= LSUP_MAX_ERROR)
- return err_msg[rc - LSUP_MIN_ERROR];
- if (rc >= LSUP_MIN_WARNING && rc <= LSUP_MAX_WARNING)
- return warning_msg[rc - LSUP_MIN_WARNING];
- return mdb_strerror (rc);
- }
- /* Inline extern functions. */
- int utf8_encode(const uint32_t utf, unsigned char *out);
|