home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / rm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  2.5 KB  |  163 lines

  1. int    errcode;
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <sys/dir.h>
  7.  
  8. char    *sprintf();
  9.  
  10. main(argc, argv)
  11. char *argv[];
  12. {
  13.     register char *arg;
  14.     int fflg, iflg, rflg;
  15.  
  16.     fflg = 0;
  17.     if (isatty(0) == 0)
  18.         fflg++;
  19.     iflg = 0;
  20.     rflg = 0;
  21.     if(argc>1 && argv[1][0]=='-') {
  22.         arg = *++argv;
  23.         argc--;
  24.         while(*++arg != '\0')
  25.             switch(*arg) {
  26.             case 'f':
  27.                 fflg++;
  28.                 break;
  29.             case 'i':
  30.                 iflg++;
  31.                 break;
  32.             case 'r':
  33.                 rflg++;
  34.                 break;
  35.             default:
  36.                 printf("rm: unknown option %s\n", *argv);
  37.                 exit(1);
  38.             }
  39.     }
  40.     while(--argc > 0) {
  41.         if(!strcmp(*++argv, "..")) {
  42.             fprintf(stderr, "rm: cannot remove `..'\n");
  43.             continue;
  44.         }
  45.         rm(*argv, fflg, rflg, iflg, 0);
  46.     }
  47.  
  48.     exit(errcode);
  49. }
  50.  
  51. rm(arg, fflg, rflg, iflg, level)
  52. char arg[];
  53. {
  54.     struct stat buf;
  55.     struct direct direct;
  56.     char name[100];
  57.     int d;
  58.  
  59.     if(stat(arg, &buf)) {
  60.         if (fflg==0) {
  61.             printf("rm: %s nonexistent\n", arg);
  62.             ++errcode;
  63.         }
  64.         return;
  65.     }
  66.     if ((buf.st_mode&S_IFMT) == S_IFDIR) {
  67.         if(rflg) {
  68.             if (access(arg, 02) < 0) {
  69.                 if (fflg==0)
  70.                     printf("%s not changed\n", arg);
  71.                 errcode++;
  72.                 return;
  73.             }
  74.             if(iflg && level!=0) {
  75.                 printf("directory %s: ", arg);
  76.                 if(!yes())
  77.                     return;
  78.             }
  79.             if((d=open(arg, 0)) < 0) {
  80.                 printf("rm: %s: cannot read\n", arg);
  81.                 exit(1);
  82.             }
  83.             while(read(d, (char *)&direct, sizeof(direct)) == sizeof(direct)) {
  84.                 if(direct.d_ino != 0 && !dotname(direct.d_name)) {
  85.                     sprintf(name, "%s/%.14s", arg, direct.d_name);
  86.                     rm(name, fflg, rflg, iflg, level+1);
  87.                 }
  88.             }
  89.             close(d);
  90.             errcode += rmdir(arg, iflg);
  91.             return;
  92.         }
  93.         printf("rm: %s directory\n", arg);
  94.         ++errcode;
  95.         return;
  96.     }
  97.  
  98.     if(iflg) {
  99.         printf("%s: ", arg);
  100.         if(!yes())
  101.             return;
  102.     }
  103.     else if(!fflg) {
  104.         if (access(arg, 02)<0) {
  105.             printf("rm: %s %o mode ", arg, buf.st_mode&0777);
  106.             if(!yes())
  107.                 return;
  108.         }
  109.     }
  110.     if(unlink(arg) && (fflg==0 || iflg)) {
  111.         printf("rm: %s not removed\n", arg);
  112.         ++errcode;
  113.     }
  114. }
  115.  
  116. dotname(s)
  117. char *s;
  118. {
  119.     if(s[0] == '.')
  120.         if(s[1] == '.')
  121.             if(s[2] == '\0')
  122.                 return(1);
  123.             else
  124.                 return(0);
  125.         else if(s[1] == '\0')
  126.             return(1);
  127.     return(0);
  128. }
  129.  
  130. rmdir(f, iflg)
  131. char *f;
  132. {
  133.     int status, i;
  134.  
  135.     if(dotname(f))
  136.         return(0);
  137.     if(iflg) {
  138.         printf("%s: ", f);
  139.         if(!yes())
  140.             return(0);
  141.     }
  142.     while((i=fork()) == -1)
  143.         sleep(3);
  144.     if(i) {
  145.         wait(&status);
  146.         return(status);
  147.     }
  148.     execl("/bin/rmdir", "rmdir", f, 0);
  149.     execl("/usr/bin/rmdir", "rmdir", f, 0);
  150.     printf("rm: can't find rmdir\n");
  151.     exit(1);
  152. }
  153.  
  154. yes()
  155. {
  156.     int i, b;
  157.  
  158.     i = b = getchar();
  159.     while(b != '\n' && b != EOF)
  160.         b = getchar();
  161.     return(i == 'y');
  162. }
  163.