bool platform_ensure_directory_exists(const utf8 *path) { mode_t mask = getumask(); char buffer[MAX_PATH]; platform_utf8_to_multibyte(path, buffer, MAX_PATH); log_verbose("Create directory: %s", buffer); for (char *p = buffer + 1; *p != '\0'; p++) { if (*p == '/') { // Temporarily truncate *p = '\0'; log_verbose("mkdir(%s)", buffer); if (mkdir(buffer, mask) != 0) { if (errno != EEXIST) { return false; } } // Restore truncation *p = '/'; } } log_verbose("mkdir(%s)", buffer); if (mkdir(buffer, mask) != 0) { if (errno != EEXIST) { return false; } } return true; }
int main(int argc, char *argv[]) { mode_t mode = 0, mask; int mflag = 0, ret = 0; ARGBEGIN { case 'm': mflag = 1; mask = getumask(); mode = parsemode(EARGF(usage()), mode, mask); break; default: usage(); } ARGEND; if (!argc) usage(); for (; *argv; argc--, argv++) { if (mkfifo(*argv, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) < 0) { weprintf("mkfifo %s:", *argv); ret = 1; } else if (mflag) { if (chmod(*argv, mode) < 0) { weprintf("chmod %s:", *argv); ret = 1; } } } return ret; }
bool platform_ensure_directory_exists(const utf8 *path) { mode_t mask = getumask(); wchar_t *wPath = utf8_to_widechar(path); int len = min(MAX_PATH, utf8_length(path)); char buffer[MAX_PATH]; wcstombs(buffer, wPath, len); buffer[len - 1] = '\0'; free(wPath); log_verbose("%s", buffer); const int result = mkdir(buffer, mask); if (result == 0 || (result == -1 && errno == EEXIST)) return true; return false; }