int mkdir_p_internal(const char *prefix, const char *path, mode_t mode, mkdir_func_t _mkdir) { int r; /* Like mkdir -p */ r = mkdir_parents_internal(prefix, path, mode, _mkdir); if (r < 0) return r; r = _mkdir(path, mode); if (r < 0 && (errno != EEXIST || is_dir(path, true) <= 0)) return -errno; return 0; }
static int mkdir_p_internal(const char *prefix, const char *path, mode_t mode, bool apply) { int r; /* Like mkdir -p */ r = mkdir_parents_internal(prefix, path, mode, apply); if (r < 0) return r; r = label_mkdir(path, mode, apply); if (r < 0 && (errno != EEXIST || is_dir(path) <= 0)) return -errno; return 0; }
int mkdir_parents(const char *path, mode_t mode) { return mkdir_parents_internal(NULL, path, mode, mkdir_errno_wrapper); }
int mkdir_parents_label(const char *path, mode_t mode) { return mkdir_parents_internal(NULL, path, mode, mkdir_label); }
int mkdir_parents_prefix(const char *prefix, const char *path, mode_t mode) { return mkdir_parents_internal(prefix, path, mode, true); }
int mkdir_parents(const char *path, mode_t mode) { return mkdir_parents_internal(NULL, path, mode, false); }