mkdir.c 856 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <lib9.h>
  2. static void
  3. usage(void)
  4. {
  5. fprint(2, "usage: mkdir [-p] dir ...\n");
  6. exits("usage");
  7. }
  8. static int
  9. mkdirp(char *s, int pflag)
  10. {
  11. char *p;
  12. if(!pflag) {
  13. if(access(s, 0) == 0){
  14. fprint(2, "mkdir: %s already exists\n", s);
  15. exits("exists");
  16. }
  17. return mkdir(s);
  18. }
  19. /* create intermediate directories */
  20. p = strchr(s+1, '/');
  21. while(p != nil) {
  22. *p = '\0';
  23. if(access(s, 0) != 0 && mkdir(s) != 0)
  24. return -1;
  25. *p = '/';
  26. p = strchr(p+1, '/');
  27. }
  28. /* create final directory */
  29. if(access(s, 0) == 0)
  30. return 0;
  31. return mkdir(s);
  32. }
  33. void
  34. main(int argc, char **argv)
  35. {
  36. int pflag;
  37. pflag = 0;
  38. ARGBEGIN{
  39. case 'p':
  40. pflag++;
  41. break;
  42. default:
  43. usage();
  44. }ARGEND
  45. for(; *argv; argv++){
  46. if(mkdirp(*argv, pflag) < 0){
  47. fprint(2, "mkdir: can't create %s\n", *argv);
  48. perror(0);
  49. exits("error");
  50. }
  51. }
  52. exits(0);
  53. }