| 
									
										
										
										
											2011-05-26 05:47:58 +01:00
										 |  |  | /* See LICENSE file for copyright and license details. */ | 
					
						
							|  |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							| 
									
										
										
										
											2014-11-13 19:54:28 +01:00
										 |  |  | #include <unistd.h>
 | 
					
						
							| 
									
										
										
										
											2014-11-13 18:29:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-26 05:47:58 +01:00
										 |  |  | #include "util.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-26 15:09:26 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2015-01-26 15:30:56 +01:00
										 |  |  | mkdirp(char *path) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	char *p = path; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	do { | 
					
						
							|  |  |  | 		if (*p && (p = strchr(&p[1], '/'))) | 
					
						
							|  |  |  | 			*p = '\0'; | 
					
						
							| 
									
										
										
										
											2015-01-26 15:09:26 +00:00
										 |  |  | 		if (mkdir(path, S_IRWXU|S_IRWXG|S_IRWXO) < 0 && errno != EEXIST) { | 
					
						
							|  |  |  | 			weprintf("mkdir %s:", path); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-01-26 15:30:56 +01:00
										 |  |  | 		if (p) | 
					
						
							|  |  |  | 			*p = '/'; | 
					
						
							|  |  |  | 	} while (p); | 
					
						
							| 
									
										
										
										
											2015-01-26 15:09:26 +00:00
										 |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2015-01-26 15:30:56 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2011-05-26 05:47:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-14 20:20:47 +02:00
										 |  |  | static void | 
					
						
							|  |  |  | usage(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-08-31 22:51:25 +01:00
										 |  |  | 	eprintf("usage: %s [-pm] directory...\n", argv0); | 
					
						
							| 
									
										
										
										
											2013-06-14 20:20:47 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-26 05:47:58 +01:00
										 |  |  | int | 
					
						
							|  |  |  | main(int argc, char *argv[]) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-11-13 21:24:47 +01:00
										 |  |  | 	int pflag = 0; | 
					
						
							|  |  |  | 	int mflag = 0; | 
					
						
							| 
									
										
										
										
											2013-08-31 22:51:25 +01:00
										 |  |  | 	int mode; | 
					
						
							| 
									
										
										
										
											2015-01-26 15:09:26 +00:00
										 |  |  | 	int r = 0; | 
					
						
							| 
									
										
										
										
											2013-06-14 20:20:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ARGBEGIN { | 
					
						
							|  |  |  | 	case 'p': | 
					
						
							| 
									
										
										
										
											2014-11-13 21:24:47 +01:00
										 |  |  | 		pflag = 1; | 
					
						
							| 
									
										
										
										
											2013-06-14 20:20:47 +02:00
										 |  |  | 		break; | 
					
						
							| 
									
										
										
										
											2013-08-31 22:51:25 +01:00
										 |  |  | 	case 'm': | 
					
						
							| 
									
										
										
										
											2014-11-13 21:24:47 +01:00
										 |  |  | 		mflag = 1; | 
					
						
							| 
									
										
										
										
											2013-10-20 10:49:59 +02:00
										 |  |  | 		mode = estrtol(EARGF(usage()), 8); | 
					
						
							| 
									
										
										
										
											2013-08-31 22:51:25 +01:00
										 |  |  | 		break; | 
					
						
							| 
									
										
										
										
											2013-06-14 20:20:47 +02:00
										 |  |  | 	default: | 
					
						
							|  |  |  | 		usage(); | 
					
						
							|  |  |  | 	} ARGEND; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-31 23:04:49 +01:00
										 |  |  | 	if (argc < 1) | 
					
						
							|  |  |  | 		usage(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-13 18:29:30 +01:00
										 |  |  | 	for (; argc > 0; argc--, argv++) { | 
					
						
							|  |  |  | 		if (pflag) { | 
					
						
							| 
									
										
										
										
											2015-01-26 15:09:26 +00:00
										 |  |  | 			if (mkdirp(argv[0]) < 0) | 
					
						
							|  |  |  | 				r = 1; | 
					
						
							| 
									
										
										
										
											2014-11-19 20:59:37 +01:00
										 |  |  | 		} else if (mkdir(argv[0], S_IRWXU|S_IRWXG|S_IRWXO) < 0) { | 
					
						
							| 
									
										
										
										
											2015-01-26 15:09:26 +00:00
										 |  |  | 			weprintf("mkdir %s:", argv[0]); | 
					
						
							|  |  |  | 			r = 1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (mflag) { | 
					
						
							|  |  |  | 			if (chmod(argv[0], mode) < 0) { | 
					
						
							|  |  |  | 				weprintf("chmod %s:", argv[0]); | 
					
						
							|  |  |  | 				r = 1; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2011-05-26 05:47:58 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-06-14 20:20:47 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-02 23:46:04 +01:00
										 |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2011-05-26 05:47:58 +01:00
										 |  |  | } |