sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

mkdirp.c (717B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <sys/stat.h>
      3 
      4 #include <errno.h>
      5 #include <limits.h>
      6 
      7 #include "../util.h"
      8 
      9 int
     10 mkdirp(const char *path, mode_t mode, mode_t pmode)
     11 {
     12 	char tmp[PATH_MAX], *p;
     13 	struct stat st;
     14 
     15 	if (stat(path, &st) == 0) {
     16 		if (S_ISDIR(st.st_mode))
     17 			return 0;
     18 		errno = ENOTDIR;
     19 		weprintf("%s:", path);
     20 		return -1;
     21 	}
     22 
     23 	estrlcpy(tmp, path, sizeof(tmp));
     24 	for (p = tmp + (tmp[0] == '/'); *p; p++) {
     25 		if (*p != '/')
     26 			continue;
     27 		*p = '\0';
     28 		if (mkdir(tmp, pmode) < 0 && errno != EEXIST) {
     29 			weprintf("mkdir %s:", tmp);
     30 			return -1;
     31 		}
     32 		*p = '/';
     33 	}
     34 	if (mkdir(tmp, mode) < 0 && errno != EEXIST) {
     35 		weprintf("mkdir %s:", tmp);
     36 		return -1;
     37 	}
     38 	return 0;
     39 }