📄 subr.c
字号:
/* @(#)subr.c 1.3 90/01/03 NFS Rev 2 Testsuite * 1.6 Lachman ONC Test Suite source * * Useful subroutines shared by all tests */#include <sys/param.h>#ifndef major#include <sys/types.h>#endif#ifdef SVR3#include <sys/sysmacros.h>#include <sys/fs/nfs/time.h>#else#include <sys/time.h>#endif#include <sys/stat.h>#include <stdio.h>#include "tests.h"char *Myname;/* * Build a directory tree "lev" levels deep * with "files" number of files in each directory * and "dirs" fan out. Starts at the current directory. * "fname" and "dname" are the base of the names used for * files and directories. */dirtree(lev, files, dirs, fname, dname, totfiles, totdirs) int lev; int files; int dirs; char *fname; char *dname; int *totfiles; int *totdirs;{ int fd; int f, d; char name[MAXPATHLEN]; if (lev-- == 0) { return; } for ( f = 0; f < files; f++) { sprintf(name, "%s%d", fname, f); if ((fd = creat(name, 0666)) < 0) { error("creat %s failed", name); exit(1); } (*totfiles)++; if (close(fd) < 0) { error("close %d failed", fd); exit(1); } } for ( d = 0; d < dirs; d++) { sprintf(name, "%s%d", dname, d); if (mkdir(name, 0777) < 0) { error("mkdir %s failed", name); exit(1); } (*totdirs)++; if (chdir(name) < 0) { error("chdir %s failed", name); exit(1); } dirtree(lev, files, dirs, fname, dname, totfiles, totdirs); if (chdir("..") < 0) { error("chdir .. failed"); exit(1); } }}/* * Remove a directory tree starting at the current directory. * "fname" and "dname" are the base of the names used for * files and directories to be removed - don't remove anything else! * "files" and "dirs" are used with fname and dname to generate * the file names to remove. * * This routine will fail if, say after removing known files, * the directory is not empty. * * This is used to test the unlink function and to clean up after tests. */rmdirtree(lev, files, dirs, fname, dname, totfiles, totdirs, ignore) int lev; int files; int dirs; char *fname; char *dname; int *totfiles; /* total removed */ int *totdirs; /* total removed */ int ignore;{ int f, d; char name[MAXPATHLEN]; if (lev-- == 0) { return; } for ( f = 0; f < files; f++) { sprintf(name, "%s%d", fname, f); if (unlink(name) < 0 && !ignore) { error("unlink %s failed", name); exit(1); } (*totfiles)++; } for ( d = 0; d < dirs; d++) { sprintf(name, "%s%d", dname, d); if (chdir(name) < 0) { if (ignore) continue; error("chdir %s failed", name); exit(1); } rmdirtree(lev, files, dirs, fname, dname, totfiles, totdirs, ignore); if (chdir("..") < 0) { error("chdir .. failed"); exit(1); } if (rmdir(name) < 0) { error("rmdir %s failed", name); exit(1); } (*totdirs)++; }}/* VARARGS */error(str, ar1, ar2, ar3, ar4, ar5, ar6, ar7, ar8, ar9) char *str;{#ifdef SVR3 char *ret, *getcwd(), path[MAXPATHLEN];#else char *ret, *getwd(), path[MAXPATHLEN];#endif#ifdef SVR3 if ((ret = getcwd(path, sizeof(path))) == NULL) fprintf(stderr, "%s: getcwd failed\n", Myname); else fprintf(stderr, "\t%s: (%s) ", Myname, path);#else if ((ret = getwd(path)) == NULL) fprintf(stderr, "%s: getwd failed\n", Myname); else fprintf(stderr, "\t%s: (%s) ", Myname, path);#endif fprintf(stderr, str, ar1, ar2, ar3, ar4, ar5, ar6, ar7, ar8, ar9); if (errno) perror(" "); else fprintf(stderr, "\n"); fflush(stderr); if (ret == NULL) exit(1);}static struct timeval ts, te;/* * save current time in struct ts */starttime(){ gettimeofday(&ts, (struct timezone *)0);}/* * sets the struct tv to the difference in time between * current time and the time in struct ts. */endtime(tv) struct timeval *tv;{ gettimeofday(&te, (struct timezone *)0); if (te.tv_usec < ts.tv_usec) { te.tv_sec--; te.tv_usec += 1000000; } tv->tv_usec = te.tv_usec - ts.tv_usec; tv->tv_sec = te.tv_sec - ts.tv_sec;}/* * Set up and move to a test directory */testdir(dir) char *dir;{ struct stat statb; char str[MAXPATHLEN]; extern char *getenv(); /* * If dir is non-NULL, use that dir. If NULL, first * check for env variable NFSTESTDIR. If that is not * set, use the compiled-in TESTDIR. */ if (dir == NULL) if ((dir = getenv("NFSTESTDIR")) == NULL) dir = TESTDIR; if (stat(dir, &statb) == 0) { sprintf(str, "rm -r %s", dir); if (system(str) != 0) { error("can't remove old test directory %s", dir); exit(1); } } if (mkdir(dir, 0777) < 0) { error("can't create test directory %s", dir); exit(1); } if (chdir(dir) < 0) { error("can't chdir to test directory %s", dir); exit(1); }}/* * Move to a test directory */mtestdir(dir) char *dir;{ struct stat statb; char str[MAXPATHLEN]; char *getenv(); /* * If dir is non-NULL, use that dir. If NULL, first * check for env variable NFSTESTDIR. If that is not * set, use the compiled-in TESTDIR. */ if (dir == NULL) if ((dir = getenv("NFSTESTDIR")) == NULL) dir = TESTDIR; if (chdir(dir) < 0) { error("can't chdir to test directory %s", dir); return(-1); } return(0);}/* * get parameter at parm, convert to int, and make sure that * it is at least min. */getparm(parm, minimum, label) char *parm, *label; int minimum;{ int val; val = atoi(parm); if (val < minimum) { error("Illegal %s parameter %d, must be at least %d", label, val, minimum); exit(1); } return(val);}/* * exit point for successful test */complete(){ fprintf(stdout, "\t%s ok.\n", Myname); exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -