+
+int mkdir_p(char *dir, mode_t mask)
+{
+ char *l;
+ int ret;
+
+ ret = mkdir(dir, mask);
+ if (!ret || (ret && errno == EEXIST))
+ return 0;
+
+ if (ret && (errno != ENOENT))
+ return -1;
+
+ l = strrchr(dir, '/');
+ if (!l || l == dir)
+ return -1;
+
+ *l = '\0';
+
+ if (mkdir_p(dir, mask))
+ return -1;
+
+ *l = '/';
+
+ ret = mkdir(dir, mask);
+ if (!ret || (ret && errno == EEXIST))
+ return 0;
+ else
+ return -1;
+}