/* pathcode/fget_mkdirhier.c. Generated from mkdirhier.c.in by configure. */ /* ** Copyright 1998-2002 University of Illinois Board of Trustees ** Copyright 1998-2002 Mark D. Roth ** All rights reserved. ** ** fget_mkdirhier.c - recursive directory creation ** ** Mark D. Roth ** Campus Information Technologies and Educational Services ** University of Illinois at Urbana-Champaign */ #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef STDC_HEADERS # include #endif /* ** fget_mkdirhier() - create all directories in a given path ** returns: ** 0 success ** 1 no directories needed to be created ** -1 (and sets errno) error */ int fget_mkdirhier(char *path, fget_mkdirhier_printfunc_t *printfunc, void *state) { char src[MAXPATHLEN], dst[MAXPATHLEN] = ""; char *dirp, *nextp = src; int retval = 1; if (strlcpy(src, path, sizeof(src)) > sizeof(src)) { errno = ENAMETOOLONG; return -1; } while ((dirp = strsep(&nextp, "/")) != NULL) { if (*dirp == '\0') continue; if (dst[0] != '\0' || path[0] == '/') strcat(dst, "/"); strcat(dst, dirp); if (mkdir(dst, 0755) == -1) { if (errno != EEXIST) return -1; } else { if (printfunc != NULL) (*printfunc)(state, dst); retval = 0; } } return retval; } #ifdef TEST_MKDIRHIER static void mkdirhier_print(void *state, char *dir) { printf("creating directory: %s\n", dir); } int main(int argc, char *argv[]) { if (fget_mkdirhier(argv[1], mkdirhier_print, NULL) == -1) perror("fget_mkdirhier()"); } #endif /* TEST_MKDIRHIER */