History

20110329-1346

forsyth committed 15 years ago

Commit ce72ccb1 parent 1d6e8112 files · +49 −6Browse files

Unified · Split

2 files
  1. CHANGES +1 −0
  2. utils/mkdir/mkdir.c +48 −6
CHANGES+1−0
@@ -1,4 +1,5 @@
11 20110329
2+ utils/mkdir/mkdir.c - add -p option [mechiel, issue 250]
23 emu/Linux/mkfile - try searching -lpthread after -lrt for sem_* [issue 247]
34 emu/port/devfs-posix.c - treat unix domain sockets as files (open/read/write/close) [npe, rsc, issue 254]
45 emu/port/devfs-posix.c - use volatile correctly; slight code tidy
utils/mkdir/mkdir.c+48−6
@@ -1,14 +1,56 @@
11 #include <lib9.h>
22
3−void
4−main(int argc, char **argv)
3+static void
4+usage(void)
5+{
6+ fprint(2, "usage: mkdir [-p] dir ...\n");
7+ exits("usage");
8+}
9+
10+static int
11+mkdirp(char *s, int pflag)
512 {
6− for(argv++; *argv; argv++){
7− if(access(*argv, 0) == 0){
8− fprint(2, "mkdir: %s already exists\n", *argv);
13+ char *p;
14+
15+ if(!pflag) {
16+ if(access(s, 0) == 0){
17+ fprint(2, "mkdir: %s already exists\n", s);
918 exits("exists");
1019 }
11− if(mkdir(*argv) < 0){
20+ return mkdir(s);
21+ }
22+
23+ /* create intermediate directories */
24+ p = strchr(s+1, '/');
25+ while(p != nil) {
26+ *p = '\0';
27+ if(access(s, 0) != 0 && mkdir(s) != 0)
28+ return -1;
29+ *p = '/';
30+ p = strchr(p+1, '/');
31+ }
32+
33+ /* create final directory */
34+ if(access(s, 0) == 0)
35+ return 0;
36+ return mkdir(s);
37+}
38+
39+void
40+main(int argc, char **argv)
41+{
42+ int pflag;
43+
44+ pflag = 0;
45+ ARGBEGIN{
46+ case 'p':
47+ pflag++;
48+ break;
49+ default:
50+ usage();
51+ }ARGEND
52+ for(; *argv; argv++){
53+ if(mkdirp(*argv, pflag) < 0){
1254 fprint(2, "mkdir: can't create %s\n", *argv);
1355 perror(0);
1456 exits("error");