Annotation of 43BSDReno/sys/nfs/TEST/unix-tests/basic/test6.c, revision 1.1.1.1

1.1       root        1: /*     @(#)test6.c     1.4 90/01/03 NFS Rev 2 Testsuite
                      2:  *     1.4 Lachman ONC Test Suite source
                      3:  *
                      4:  * Test readdir
                      5:  *
                      6:  * Uses the following important system/library calls against the server:
                      7:  *
                      8:  *     chdir()
                      9:  *     mkdir()         (for initial directory creation if not -m)
                     10:  *     creat()
                     11:  *     unlink()
                     12:  *     opendir(), rewinddir(), readdir(), closedir()
                     13:  */
                     14: 
                     15: #include <sys/param.h>
                     16: #ifndef major
                     17: #include <sys/types.h>
                     18: #endif
                     19: #ifdef SVR3
                     20: #include <sys/fs/nfs/time.h>
                     21: #include <dirent.h>
                     22: #else
                     23: #include <sys/time.h>
                     24: #ifndef vax
                     25: #include <sys/dir.h>
                     26: #else
                     27: #include <dirent.h>
                     28: #endif
                     29: #endif
                     30: #include <stdio.h>
                     31: #include "tests.h"
                     32: 
                     33: int Tflag = 0;         /* print timing */
                     34: int Hflag = 0;         /* print help message */
                     35: int Fflag = 0;         /* test function only;  set count to 1, negate -t */
                     36: int Nflag = 0;         /* Suppress directory operations */
                     37: int Iflag = 0;         /* Ignore non-test files dir entries */
                     38: 
                     39: #define MAXFILES 512           /* maximum files allowed for this test */
                     40: #define BITMOD  8              /* bits per u_char */
                     41: #ifdef SVR3
                     42: unchar bitmap[MAXFILES / BITMOD];
                     43: #else
                     44: u_char bitmap[MAXFILES / BITMOD];
                     45: #endif
                     46: #define BIT(x)    (bitmap[(x) / BITMOD] &   (1 << ((x) % BITMOD)) )
                     47: #define SETBIT(x) (bitmap[(x) / BITMOD] |=  (1 << ((x) % BITMOD)) )
                     48: #define CLRBIT(x) (bitmap[(x) / BITMOD] &= ~(1 << ((x) % BITMOD)) )
                     49: 
                     50: usage()
                     51: {
                     52:        fprintf(stdout, "usage: %s [-htfni] [files count fname]\n", Myname);
                     53:        fprintf(stdout, "  Flags:  h    Help - print this usage info\n");
                     54:        fprintf(stdout, "          t    Print execution time statistics\n");
                     55:        fprintf(stdout, "          f    Test function only (negate -t)\n");
                     56:        fprintf(stdout, "          n    Suppress test directory create operations\n");
                     57:        fprintf(stdout, "          i    Ignore non-test files dir entries\n");
                     58: }
                     59: 
                     60: main(argc, argv)
                     61:        int argc;
                     62:        char *argv[];
                     63: {
                     64: #ifdef SVR3
                     65:        struct dirent *dp;
                     66: #else
                     67: #ifndef vax
                     68:        struct direct *dp;
                     69: #else
                     70:        struct dirent *dp;
                     71: #endif
                     72: #endif
                     73:        char *fname = FNAME;
                     74:        int files = 200;        /* number of files in each dir */
                     75:        int fi;
                     76:        int count = 200;        /* times to read dir */
                     77:        int ct;
                     78:        int entries = 0;
                     79:        int totfiles = 0;
                     80:        int totdirs = 0;
                     81:        DIR *dir;
                     82:        struct timeval time;
                     83:        char *p, str[MAXPATHLEN];
                     84:        char *opts;
                     85:        int err, i, dot, dotdot;
                     86:        int nmoffset;
                     87: 
                     88:        umask(0);
                     89:        setbuf(stdout, NULL);
                     90:        Myname = *argv++;
                     91:        argc--;
                     92:        while (argc && **argv == '-') {
                     93:                for (opts = &argv[0][1]; *opts; opts++) {
                     94:                        switch (*opts) {
                     95:                                case 'h':       /* help */
                     96:                                        usage();
                     97:                                        exit(1);
                     98: 
                     99:                                case 't':       /* time */
                    100:                                        Tflag++;
                    101:                                        break;
                    102:                                
                    103:                                case 'f':       /* funtionality */
                    104:                                        Fflag++;
                    105:                                        break;
                    106:                                
                    107:                                case 'n':       /* No Test Directory create */
                    108:                                        Nflag++;
                    109:                                        break;
                    110: 
                    111:                                case 'i':       /* ignore spurious files */
                    112:                                        Iflag++;
                    113:                                        break;
                    114: 
                    115:                                default:
                    116:                                        error("unknown option '%c'", *opts);
                    117:                                        usage();
                    118:                                        exit(1);
                    119:                        }
                    120:                }
                    121:                argc--;
                    122:                argv++;
                    123:        }
                    124: 
                    125:        if (argc) {
                    126:                files = getparm(*argv, 1, "files");
                    127:                argv++;
                    128:                argc--;
                    129:        }
                    130:        if (argc) {
                    131:                count = getparm(*argv, 1, "count");
                    132:                argv++;
                    133:                argc--;
                    134:        }
                    135:        if (argc) {
                    136:                fname = *argv;
                    137:                argv++;
                    138:                argc--;
                    139:        }
                    140:        if (argc) {
                    141:                usage();
                    142:                exit(1);
                    143:        }
                    144: 
                    145:        nmoffset = strlen(fname);
                    146: 
                    147:        if (Fflag) {
                    148:                Tflag = 0;
                    149:                count = 1;
                    150:        }
                    151: 
                    152:        if (count > files) {
                    153:                error("count (%d) can't be greater than files (%d)",
                    154:                        count, files);
                    155:                exit(1);
                    156:        }
                    157: 
                    158:        if (files > MAXFILES) {
                    159:                error("too many files requested (max is %d)", MAXFILES);
                    160:                exit(1);
                    161:        }
                    162: 
                    163:        fprintf(stdout, "%s: readdir\n", Myname);
                    164: 
                    165:        if (!Nflag)
                    166:                testdir(NULL);
                    167:        else
                    168:                mtestdir(NULL);
                    169: 
                    170:        dirtree(1, files, 0, fname, DNAME, &totfiles, &totdirs);
                    171: 
                    172:        if (Tflag) {
                    173:                starttime();
                    174:        }
                    175: 
                    176:        if ((dir = opendir(".")) == NULL) {
                    177:                error("can't opendir %s", ".");
                    178:                exit(1);
                    179:        }
                    180: 
                    181:        for (ct = 0; ct < count; ct++) {
                    182:                rewinddir(dir);
                    183:                dot = 0;
                    184:                dotdot = 0;
                    185:                err = 0;
                    186:                for (i = 0; i < sizeof(bitmap); i++)
                    187:                        bitmap[i] = 0;
                    188:                while ((dp = readdir(dir)) != NULL) {
                    189:                        entries++;
                    190:                        if (strcmp(".", dp->d_name) == 0) {
                    191:                                if (dot) {
                    192:                                        /* already read dot */
                    193:                                        error("'.' dir entry read twice");
                    194:                                        exit(1);
                    195:                                }
                    196:                                dot++;
                    197:                                continue;
                    198:                        } else if (strcmp("..", dp->d_name) == 0) {
                    199:                                if (dotdot) {
                    200:                                        /* already read dotdot */
                    201:                                        error("'..' dir entry read twice");
                    202:                                        exit(1);
                    203:                                }
                    204:                                dotdot++;
                    205:                                continue;
                    206:                        }
                    207: 
                    208:                        /*
                    209:                         * at this point, should have entry of the form
                    210:                         *  fname%d
                    211:                         */
                    212:                        /* If we don't have our own directory, ignore
                    213:                           such errors (if Iflag set). */
                    214:                        if (strncmp(dp->d_name, fname, nmoffset)) {
                    215:                                if (Iflag)
                    216:                                        continue;
                    217:                                else {
                    218:                                        error("unexpected dir entry '%s'",
                    219:                                                dp->d_name);
                    220:                                        exit(1);
                    221:                                }
                    222:                        }
                    223: 
                    224:                        /* get ptr to numeric part of name */
                    225:                        p = dp->d_name + nmoffset;
                    226:                        fi = atoi(p);
                    227:                        if (fi < 0 || fi >= MAXFILES) {
                    228:                                error("unexpected dir entry '%s'",
                    229:                                        dp->d_name);
                    230:                                exit(1);
                    231:                        }
                    232:                        if (BIT(fi)) {
                    233:                                error("duplicate '%s' dir entry read",
                    234:                                        dp->d_name);
                    235:                                err++;
                    236:                        } else
                    237:                                SETBIT(fi);
                    238:                }       /* end readdir loop */
                    239:                if (!dot) {
                    240:                        error("didn't read '.' dir entry, pass %d", ct);
                    241:                        err++;
                    242:                }
                    243:                if (!dotdot) {
                    244:                        error("didn't read '..' dir entry, pass %d", ct);
                    245:                        err++;
                    246:                }
                    247:                for (fi = 0; fi < ct; fi++) {
                    248:                        if (BIT(fi)) {
                    249:                                sprintf(str, "%s%d", fname, fi);
                    250:                                error("unlinked '%s' dir entry read pass %d",
                    251:                                        str, ct);
                    252:                                err++;
                    253:                        }
                    254:                }
                    255:                for (fi = ct; fi < files; fi++) {
                    256:                        if (!BIT(fi)) {
                    257:                                sprintf(str, "%s%d", fname, fi);
                    258:                                error("\
                    259: didn't read expected '%s' dir entry, pass %d", str, ct);
                    260:                                err++;
                    261:                        }
                    262:                }
                    263:                if (err) {
                    264:                        error("Test failed with %d errors", err);
                    265:                        exit(1);
                    266:                }
                    267:                sprintf(str, "%s%d", fname, ct);
                    268:                if (unlink(str) < 0) {
                    269:                        error("can't unlink %s", str);
                    270:                        exit(1);
                    271:                }
                    272:        }
                    273: 
                    274:        closedir(dir);
                    275: 
                    276:        if (Tflag) {
                    277:                endtime(&time);
                    278:        }
                    279:        fprintf(stdout, "\t%d entries read, %d files",
                    280:                entries, files);
                    281:        if (Tflag) {
                    282:                fprintf(stdout, " in %d.%-2d seconds",
                    283:                    time.tv_sec, time.tv_usec / 10000);
                    284:        }
                    285:        fprintf(stdout, "\n");
                    286:        rmdirtree(1, files, 0, fname, DNAME, &totfiles, &totdirs, 1);
                    287:        complete();
                    288: }

unix.superglobalmegacorp.com

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