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

📄 tar.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* * Attempt at emulation of Unix tar by calling Plan 9 tar. *  * The differences from Plan 9 tar are: *	In the absence of an "f" flag, the file /dev/tape is used. *	An "f" flag with argument "-" causes use of stdin/stdout *		by passing no "f" flag (nor argument) to Plan 9 tar. *	By default, the "T" flag is passed to Plan 9 tar. *		The "m" flag to this tar inhibits this behavior. */#include <u.h>#include <libc.h>voidusage(void){	fprint(2, "usage: ape/tar [crtx][vfm] [args...] [file...]\n");	exits("usage");}voidmain(int argc, char **argv){	int i, j, verb, vflag, fflag, Tflag, nargc;	char *p, *file, **nargv, *cpu, flagbuf[10], execbuf[128];	Waitmsg *w;	argv++, argc--;	if(argc < 1)		usage();	p = argv[0];	argv++, argc--;	if(*p == '-')		p++;	if(strchr("crtx", *p) == nil)		usage();	verb = *p++;	/* unix defaults */	fflag = 1;	file = "/dev/tape";	Tflag = 1;	vflag = 0;	for(; *p; p++) {		switch(*p) {		default:			usage();		case 'v':			vflag = 1;			break;		case 'f':			if(argc <= 0)				usage();			fflag = 1;			file = argv[0];			argv++, argc--;			if(strcmp(file, "-") == 0) {				/*				 * plan9 doesn't know about "-" meaning stdin/stdout,				 * but it's the default,				 * so rewrite to not use f flag at all.				 */				file = nil;				fflag = 0;			}			break;		case 'm':			Tflag = 0;			break;		case 'p':		/* pretend nothing's wrong */			break;		}	}	nargc = 1 + 1 + fflag + argc + 1;	nargv = malloc(sizeof(char*) * nargc);	if(nargv == nil) {		fprint(2, "ape/tar: out of memory\n");		exits("memory");	}	cpu = getenv("cputype");	if(cpu == nil) {		fprint(2, "ape/tar: need cputype environment variable set\n");		exits("cputype");	}	snprint(execbuf, sizeof execbuf, "/%s/bin/tar", cpu);	nargv[0] = "tar";	sprint(flagbuf, "%c%s%s%s", verb, vflag ? "v" : "", Tflag ? "T" : "", fflag ? "f" : "");	nargv[1] = flagbuf;	i = 2;	if(fflag)		nargv[i++] = file;	for(j=0; j<argc; j++, i++)		nargv[i] = argv[j];	nargv[i++] = nil;	assert(i == nargc);	switch(fork()){	case -1:		fprint(2, "ape/tar: fork failed: %r\n");		exits("fork");	case 0:		exec(execbuf, nargv);		fprint(2, "exec %s fails: %r\n", execbuf);		_exits("exec");	default:		w = wait();		if(w == nil)			exits("wait failed");		if(w->msg[0] == '\0')			exits(nil);		else			exits(w->msg);	}	assert(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -