commit - 558ba8f4df93cb7f0a4b1ea88dd93b3828da5a2f
commit + aeb54c0efed03187235820c73b7feef2260951cf
blob - 5bfa67735a08d26d1f5ed4952ae4bb3e4cd26c23
blob + 11421d97d441bf4e3bf46624673bcea3f8726e63
--- src/cmd/mkdir.C
+++ src/cmd/mkdir.C
#include <u.h>
#include <libc.h>
+char *e;
+
void
+usage(void)
+{
+ fprint(2, "usage: mkdir [-p] dir...\n");
+ exits("usage");
+}
+
+int
+makedir(char *s)
+{
+ int f;
+
+ if(access(s, AEXIST) == 0){
+ fprint(2, "mkdir: %s already exists\n", s);
+ e = "error";
+ return -1;
+ }
+ f = create(s, OREAD, DMDIR | 0777L);
+ if(f < 0){
+ fprint(2, "mkdir: can't create %s: %r\n", s);
+ e = "error";
+ return -1;
+ }
+ close(f);
+ return 0;
+}
+
+void
+mkdirp(char *s)
+{
+ char *p;
+
+ for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){
+ *p = 0;
+ if(access(s, AEXIST) != 0 && makedir(s) < 0)
+ return;
+ *p = '/';
+ }
+ if(access(s, AEXIST) != 0)
+ makedir(s);
+}
+
+
+void
main(int argc, char *argv[])
{
- int i, f;
- char *e;
+ int i, pflag;
- e = nil;
- for(i=1; i<argc; i++){
- if(access(argv[i], 0) == AEXIST){
- fprint(2, "mkdir: %s already exists\n", argv[i]);
- e = "error";
- continue;
- }
- f = create(argv[i], OREAD, DMDIR | 0777L);
- if(f < 0){
- fprint(2, "mkdir: can't create %s: %r\n", argv[i]);
- e = "error";
- continue;
- }
- close(f);
+ pflag = 0;
+ ARGBEGIN{
+ default:
+ usage();
+ case 'p':
+ pflag = 1;
+ break;
+ }ARGEND
+
+ for(i=0; i<argc; i++){
+ if(pflag)
+ mkdirp(argv[i]);
+ else
+ makedir(argv[i]);
}
exits(e);
}