diff options
Diffstat (limited to 'src/pacman')
| -rw-r--r-- | src/pacman/util.c | 35 | 
1 files changed, 20 insertions, 15 deletions
diff --git a/src/pacman/util.c b/src/pacman/util.c index 9617e6f2..f1f098f8 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -121,33 +121,38 @@ int getcols()  /* does the same thing as 'mkdir -p' */  int makepath(const char *path)  { -	char *orig, *str, *ptr; -	char full[PATH_MAX+1] = ""; -	mode_t oldmask; - -	oldmask = umask(0000); +	/* A bit of pointer hell here. Descriptions: +	 * orig - a copy of path so we can safely butcher it with strsep +	 * str - the current position in the path string (after the delimiter) +	 * ptr - the original position of str after calling strsep +	 * incr - incrementally generated path for use in stat/mkdir call +	 */ +	char *orig, *str, *ptr, *incr; +	mode_t oldmask = umask(0000); +	int ret = 0;  	orig = strdup(path); +	incr = calloc(strlen(orig) + 1, sizeof(char));  	str = orig;  	while((ptr = strsep(&str, "/"))) {  		if(strlen(ptr)) {  			struct stat buf; - -			/* TODO we should use strncat */ -			strcat(full, "/"); -			strcat(full, ptr); -			if(stat(full, &buf)) { -				if(mkdir(full, 0755)) { -					free(orig); -					umask(oldmask); -					return(1); +			/* we have another path component- append the newest component to +			 * existing string and create one more level of dir structure */ +			strcat(incr, "/"); +			strcat(incr, ptr); +			if(stat(incr, &buf)) { +				if(mkdir(incr, 0755)) { +					ret = 1; +					break;  				}  			}  		}  	}  	free(orig); +	free(incr);  	umask(oldmask); -	return(0); +	return(ret);  }  /* does the same thing as 'rm -rf' */  | 
