Annotation of researchv8dc/cmd/rm.c, revision 1.1.1.1

1.1       root        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(lstat(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:                }
                     91:                errcode += rmdir(arg, iflg);
                     92:                return;
                     93:        }
                     94: 
                     95:        if(iflg) {
                     96:                printf("%s: ", arg);
                     97:                if(!yes())
                     98:                        return;
                     99:        }
                    100:        else if(!fflg) {
                    101:                if (access(arg, 02)<0) {
                    102:                        printf("rm: %s %o mode ", arg, buf.st_mode&0777);
                    103:                        if(!yes())
                    104:                                return;
                    105:                }
                    106:        }
                    107:        if(unlink(arg) && (fflg==0 || iflg)) {
                    108:                printf("rm: %s not removed\n", arg);
                    109:                ++errcode;
                    110:        }
                    111: }
                    112: 
                    113: dotname(s)
                    114: char *s;
                    115: {
                    116:        if(s[0] == '.')
                    117:                if(s[1] == '.')
                    118:                        if(s[2] == '\0')
                    119:                                return(1);
                    120:                        else
                    121:                                return(0);
                    122:                else if(s[1] == '\0')
                    123:                        return(1);
                    124:        return(0);
                    125: }
                    126: 
                    127: rmdir(f, iflg)
                    128: char *f;
                    129: {
                    130:        int status, i;
                    131: 
                    132:        if(dotname(f))
                    133:                return(0);
                    134:        if(iflg) {
                    135:                printf("%s: ", f);
                    136:                if(!yes())
                    137:                        return(0);
                    138:        }
                    139:        while((i=fork()) == -1)
                    140:                sleep(3);
                    141:        if(i) {
                    142:                wait(&status);
                    143:                return(status);
                    144:        }
                    145:        execl("/bin/rmdir", "rm", f, 0);
                    146:        execl("/usr/bin/rmdir", "rm", f, 0);
                    147:        printf("rm: can't find rmdir\n");
                    148:        exit(1);
                    149: }
                    150: 
                    151: yes()
                    152: {
                    153:        int i, b;
                    154: 
                    155:        i = b = getchar();
                    156:        while(b != '\n' && b != EOF)
                    157:                b = getchar();
                    158:        return(i == 'y');
                    159: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.