master xplshn/aruu / cmd / posix / mkdir.c
 1/* See LICENSE file for copyright and license details. */
 2
 3#include <sys/stat.h>
 4
 5#include <errno.h>
 6#include <stdlib.h>
 7
 8#include "util.h"
 9
10static void
11usage(void)
12{
13  eprintf("usage: %s [-p] [-m mode] name ...\n", argv0);
14}
15
16// ?man mkdir: create directories
17// ?man arguments: name ...
18// ?man create directories at specified paths
19int
20main(int argc, char *argv[])
21{
22  mode_t mode, mask;
23  int    pflag = 0, ret = 0;
24
25  mask = umask(0);
26  mode = 0777 & ~mask;
27
28  ARGBEGIN
29  {
30    // ?man -p: create parent directories as needed
31    case 'p':
32      pflag = 1;
33      break;
34    // ?man -m:mode: set file mode bits for created directories
35    case 'm':
36      mode = parsemode(EARGF(usage()), 0777, mask);
37      break;
38    default:
39      usage();
40  }
41  ARGEND
42
43  if (!argc)
44    usage();
45
46  for (; *argv; argc--, argv++) {
47    if (pflag) {
48      if (mkdirp(*argv, mode, 0777 & (~mask | 0300)) < 0)
49        ret = 1;
50    } else if (mkdir(*argv, mode) < 0) {
51      weprintf("mkdir %s:", *argv);
52      ret = 1;
53    }
54  }
55
56  return ret;
57}