⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subr.c

📁 早期freebsd实现
💻 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 + -