1: int make_dirs(char *new_path, int perms)
2: { 3: char *saved_path, *cp;
4: int saved_ch;
5: struct stat st;
6: int rc;
7:
8: cp = saved_path = strdup(new_path);
9: while (*cp && *cp == '/') ++cp;
10:
11: while (1) { 12: while (*cp && *cp != '/') ++cp;
13: if ((saved_ch = *cp) != 0)
14: *cp = 0;
15:
16: if ((rc = stat(saved_path, &st)) >= 0) { 17: if (!S_ISDIR(st.st_mode)) { 18: errno = ENOTDIR;
19: rc = -1;
20: break;
21: }
22: }
23: else { 24: if (errno != ENOENT ) { 25: break;
26: }
27:
28: if ((rc = mkdir(saved_path, perms)) < 0 ) { 29: if (errno != EEXIST)
30: break;
31:
32: if ((rc = stat(saved_path, &st)) < 0)
33: break;
34:
35: if (!S_ISDIR(st.st_mode)) { 36: errno = ENOTDIR;
37: rc = -1;
38: break;
39: }
40: }
41: }
42:
43: if (saved_ch != 0)
44: *cp = saved_ch;
45:
46: while (*cp && *cp == '/') ++cp;
47: if (*cp == 0)
48: break;
49: }
50:
51: free(saved_path);
52: return rc;
53: }