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

1.1       root        1: /*     @(#)subr.c      1.3 90/01/03 NFS Rev 2 Testsuite
                      2:  *     1.6 Lachman ONC Test Suite source
                      3:  *
                      4:  * Useful subroutines shared by all tests
                      5:  */
                      6: 
                      7: #include <sys/param.h>
                      8: #ifndef major
                      9: #include <sys/types.h>
                     10: #endif
                     11: #ifdef SVR3
                     12: #include <sys/sysmacros.h>
                     13: #include <sys/fs/nfs/time.h>
                     14: #else
                     15: #include <sys/time.h>
                     16: #endif
                     17: #include <sys/stat.h>
                     18: #include <stdio.h>
                     19: #include "tests.h"
                     20: 
                     21: char *Myname;
                     22: 
                     23: /*
                     24:  * Build a directory tree "lev" levels deep
                     25:  * with "files" number of files in each directory
                     26:  * and "dirs" fan out.  Starts at the current directory.
                     27:  * "fname" and "dname" are the base of the names used for
                     28:  * files and directories.
                     29:  */
                     30: dirtree(lev, files, dirs, fname, dname, totfiles, totdirs)
                     31:        int lev;
                     32:        int files;
                     33:        int dirs;
                     34:        char *fname;
                     35:        char *dname;
                     36:        int *totfiles;
                     37:        int *totdirs;
                     38: {
                     39:        int fd;
                     40:        int f, d;
                     41:        char name[MAXPATHLEN];
                     42: 
                     43:        if (lev-- == 0) {
                     44:                return;
                     45:        }
                     46:        for ( f = 0; f < files; f++) {
                     47:                sprintf(name, "%s%d", fname, f);
                     48:                if ((fd = creat(name, 0666)) < 0) {
                     49:                        error("creat %s failed", name);
                     50:                        exit(1);
                     51:                }
                     52:                (*totfiles)++;
                     53:                if (close(fd) < 0) {
                     54:                        error("close %d failed", fd);
                     55:                        exit(1);
                     56:                }
                     57:        }
                     58:        for ( d = 0; d < dirs; d++) {
                     59:                sprintf(name, "%s%d", dname, d);
                     60:                if (mkdir(name, 0777) < 0) {
                     61:                        error("mkdir %s failed", name);
                     62:                        exit(1);
                     63:                }
                     64:                (*totdirs)++;
                     65:                if (chdir(name) < 0) {
                     66:                        error("chdir %s failed", name);
                     67:                        exit(1);
                     68:                }
                     69:                dirtree(lev, files, dirs, fname, dname, totfiles, totdirs);
                     70:                if (chdir("..") < 0) {
                     71:                        error("chdir .. failed");
                     72:                        exit(1);
                     73:                }
                     74:        }
                     75: }
                     76: 
                     77: /*
                     78:  * Remove a directory tree starting at the current directory.
                     79:  * "fname" and "dname" are the base of the names used for
                     80:  * files and directories to be removed - don't remove anything else!
                     81:  * "files" and "dirs" are used with fname and dname to generate
                     82:  * the file names to remove.
                     83:  *
                     84:  * This routine will fail if, say after removing known files,
                     85:  * the directory is not empty.
                     86:  *
                     87:  * This is used to test the unlink function and to clean up after tests.
                     88:  */
                     89: rmdirtree(lev, files, dirs, fname, dname, totfiles, totdirs, ignore)
                     90:        int lev;
                     91:        int files;
                     92:        int dirs;
                     93:        char *fname;
                     94:        char *dname;
                     95:        int *totfiles;          /* total removed */
                     96:        int *totdirs;           /* total removed */
                     97:        int ignore;
                     98: {
                     99:        int f, d;
                    100:        char name[MAXPATHLEN];
                    101: 
                    102:        if (lev-- == 0) {
                    103:                return;
                    104:        }
                    105:        for ( f = 0; f < files; f++) {
                    106:                sprintf(name, "%s%d", fname, f);
                    107:                if (unlink(name) < 0 && !ignore) {
                    108:                        error("unlink %s failed", name);
                    109:                        exit(1);
                    110:                }
                    111:                (*totfiles)++;
                    112:        }
                    113:        for ( d = 0; d < dirs; d++) {
                    114:                sprintf(name, "%s%d", dname, d);
                    115:                if (chdir(name) < 0) {
                    116:                        if (ignore)
                    117:                                continue;
                    118:                        error("chdir %s failed", name);
                    119:                        exit(1);
                    120:                }
                    121:                rmdirtree(lev, files, dirs, fname, dname, totfiles, totdirs, ignore);
                    122:                if (chdir("..") < 0) {
                    123:                        error("chdir .. failed");
                    124:                        exit(1);
                    125:                }
                    126:                if (rmdir(name) < 0) {
                    127:                        error("rmdir %s failed", name);
                    128:                        exit(1);
                    129:                }
                    130:                (*totdirs)++;
                    131:        }
                    132: }
                    133: 
                    134: /* VARARGS */
                    135: error(str, ar1, ar2, ar3, ar4, ar5, ar6, ar7, ar8, ar9)
                    136:        char *str;
                    137: {
                    138: #ifdef SVR3
                    139:        char *ret, *getcwd(), path[MAXPATHLEN];
                    140: #else
                    141:        char *ret, *getwd(), path[MAXPATHLEN];
                    142: #endif
                    143: 
                    144: #ifdef SVR3
                    145:        if ((ret = getcwd(path, sizeof(path))) == NULL)
                    146:                fprintf(stderr, "%s: getcwd failed\n", Myname);
                    147:        else
                    148:                fprintf(stderr, "\t%s: (%s) ", Myname, path);
                    149: #else
                    150:        if ((ret = getwd(path)) == NULL)
                    151:                fprintf(stderr, "%s: getwd failed\n", Myname);
                    152:        else
                    153:                fprintf(stderr, "\t%s: (%s) ", Myname, path);
                    154: #endif
                    155: 
                    156:        fprintf(stderr, str, ar1, ar2, ar3, ar4, ar5, ar6, ar7, ar8, ar9);
                    157:        if (errno)
                    158:                perror(" ");
                    159:        else
                    160:                fprintf(stderr, "\n");
                    161:        fflush(stderr);
                    162:        if (ret == NULL)
                    163:                exit(1);
                    164: }
                    165: 
                    166: static struct timeval ts, te;
                    167: 
                    168: /*
                    169:  * save current time in struct ts
                    170:  */
                    171: starttime()
                    172: {
                    173: 
                    174:        gettimeofday(&ts, (struct timezone *)0);
                    175: }
                    176: 
                    177: /*
                    178:  * sets the struct tv to the difference in time between
                    179:  * current time and the time in struct ts.
                    180:  */
                    181: endtime(tv)
                    182:        struct timeval *tv;
                    183: {
                    184: 
                    185:        gettimeofday(&te, (struct timezone *)0);
                    186:        if (te.tv_usec < ts.tv_usec) {
                    187:                te.tv_sec--;
                    188:                te.tv_usec += 1000000;
                    189:        }
                    190:        tv->tv_usec = te.tv_usec - ts.tv_usec;
                    191:        tv->tv_sec = te.tv_sec - ts.tv_sec;
                    192: }
                    193: 
                    194: /*
                    195:  * Set up and move to a test directory
                    196:  */
                    197: testdir(dir)
                    198:        char *dir;
                    199: {
                    200:        struct stat statb;
                    201:        char str[MAXPATHLEN];
                    202:        extern char *getenv();
                    203: 
                    204:        /*
                    205:         *  If dir is non-NULL, use that dir.  If NULL, first
                    206:         *  check for env variable NFSTESTDIR.  If that is not
                    207:         *  set, use the compiled-in TESTDIR.
                    208:         */
                    209:        if (dir == NULL)
                    210:                if ((dir = getenv("NFSTESTDIR")) == NULL)
                    211:                        dir = TESTDIR;
                    212: 
                    213:        if (stat(dir, &statb) == 0) {
                    214:                sprintf(str, "rm -r %s", dir);
                    215:                if (system(str) != 0) {
                    216:                        error("can't remove old test directory %s", dir);
                    217:                        exit(1);
                    218:                }
                    219:        }
                    220: 
                    221:        if (mkdir(dir, 0777) < 0) {
                    222:                error("can't create test directory %s", dir);
                    223:                exit(1);
                    224:        }
                    225:        if (chdir(dir) < 0) {
                    226:                error("can't chdir to test directory %s", dir);
                    227:                exit(1);
                    228:        }
                    229: }
                    230: 
                    231: /*
                    232:  * Move to a test directory
                    233:  */
                    234: mtestdir(dir)
                    235:        char *dir;
                    236: {
                    237:        struct stat statb;
                    238:        char str[MAXPATHLEN];
                    239:        char *getenv();
                    240: 
                    241:        /*
                    242:         *  If dir is non-NULL, use that dir.  If NULL, first
                    243:         *  check for env variable NFSTESTDIR.  If that is not
                    244:         *  set, use the compiled-in TESTDIR.
                    245:         */
                    246:        if (dir == NULL)
                    247:                if ((dir = getenv("NFSTESTDIR")) == NULL)
                    248:                        dir = TESTDIR;
                    249: 
                    250:        if (chdir(dir) < 0) {
                    251:                error("can't chdir to test directory %s", dir);
                    252:                return(-1);
                    253:        }
                    254:        return(0);
                    255: }
                    256: 
                    257: /*
                    258:  *  get parameter at parm, convert to int, and make sure that
                    259:  *  it is at least min.
                    260:  */
                    261: getparm(parm, minimum, label)
                    262:        char *parm, *label;
                    263:        int minimum;
                    264: {
                    265:        int val;
                    266:        
                    267:        val = atoi(parm);
                    268:        if (val < minimum) {
                    269:                error("Illegal %s parameter %d, must be at least %d",
                    270:                      label, val, minimum);
                    271:                exit(1);
                    272:        }
                    273:        return(val);
                    274: }
                    275: 
                    276: /*
                    277:  *  exit point for successful test
                    278:  */
                    279: complete()
                    280: {
                    281: 
                    282:        fprintf(stdout, "\t%s ok.\n", Myname);
                    283:        exit(0);
                    284: }

unix.superglobalmegacorp.com

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