From 112abd0325805abd987e68e4a3741aa037f11572 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 28 Mar 2004 15:01:11 +0000 Subject: [PATCH] Initial release --- src/mkdir.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/mkdir.c diff --git a/src/mkdir.c b/src/mkdir.c new file mode 100644 index 0000000..39f99aa --- /dev/null +++ b/src/mkdir.c @@ -0,0 +1,96 @@ +/* mkdir.c */ + + + +#include +#include +#include +extern int optind; +extern char * optarg; +#include +#include + + +/* mkdir */ +static int _mkdir_p(mode_t mode, char * pathname); +static int _mkdir(int flagp, mode_t mode, int argc, char * argv[]) +{ + int res = 0; + int i; + + for(i = 0; i < argc; i++) + { + if(flagp == 1) + { + if(_mkdir_p(mode, argv[i]) != 0) + res = 2; + } + if(mkdir(argv[i], mode) == -1) + { + fprintf(stderr, "%s", "mkdir: "); + perror(argv[i]); + res = 2; + } + } + return res; +} + +static int _mkdir_p(mode_t mode, char * pathname) +{ + char * p; + char c; + + for(p = pathname; *p != '\0'; p++) + { + if(*p != '/') + continue; + c = *p; + *p = '\0'; + if(mkdir(pathname, mode) == -1) + { + fprintf(stderr, "%s", "mkdir: "); + perror(pathname); + return 2; + } + *p = c; + } + return 0; +} + + +/* usage */ +static int _usage(void) +{ + fprintf(stderr, "%s", "Usage: mkdir [-p][-m mode] dir...\n\ + -p create any missing intermediate pathname components\n\ + -m file permission bits of the newly-created directory\n"); + return 1; +} + + +/* main */ +int main(int argc, char * argv[]) +{ + mode_t mode = 0777; + int flagp = 0; + int o; + + while((o = getopt(argc, argv, "pm:")) != -1) + { + switch(o) + { + case 'm': + /* FIXME */ + mode = strtol(optarg, NULL, 8); + break; + case 'p': + flagp = 1; + break; + case '?': + return _usage(); + } + } + if(argc == optind) + return _usage(); + return _mkdir(flagp, mode, argc - optind, &argv[optind]); +}