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

📄 tarread.c

📁 早期freebsd实现
💻 C
字号:
/* tarread.c *//* Copyright (c) 1985, by Carnegie-Mellon University */#include <stdio.h>#include <v2tov3.h>#include <sys\types.h>#include <sys\stat.h>#include "tar.h"char usage[] = "tarread: usage: tarread tx[vwz] tarfile\n";union hblock hbuf;int verbose = 0;int confirm = 0;int binary = 0;char cmd;main(argc, argv)int argc;char *argv[];{	FILE *fp;	char *cp;	if (argc != 3) {		fprintf(stderr, usage);		exit(1);	}	for (cp = argv[1]; *cp; cp++)		switch (*cp) {			case 't':			case 'x':				cmd = *cp;				break;			case 'v':				verbose++;				break;			case 'z':				binary++;				break;			case 'w':				confirm++;				break;			default:				fprintf(stderr, "tarread: unknown switch %c\n", *cp);				fprintf(stderr, usage);				exit(1);		}	if ((fp = fopen(argv[2], "rb")) == NULL) {		fprintf(stderr, "tarrread: cannot open %s\n", argv[2]);		exit(1);	}	for (;;) {		if (fread(&hbuf, sizeof(hbuf), 1, fp) != 1) {			perror("fread");			exit(1);		}		if (!proc_file(fp))			break;	}}int proc_file(fp)FILE *fp;{	char name[NAMSIZ];	unsigned short mode;	short uid, gid;	long size, mtime;	char c;	int confrmd;	long skip;	if (hbuf.dbuf.name[0] == '\0')		return (NULL);	strcpy(name, hbuf.dbuf.name);	if (sscanf(hbuf.dbuf.mode, "%o", &mode) != 1)		fprintf("Couldn't read mode\n");	if (sscanf(hbuf.dbuf.uid, "%o", &uid) != 1)		fprintf("Couldn't read uid\n");	if (sscanf(hbuf.dbuf.gid, "%o", &gid) != 1)		fprintf("Couldn't read gid\n");	if (sscanf(hbuf.dbuf.size, "%12lo %12lo", &size, &mtime) != 2)		fprintf("Couldn't read size or mtime\n");	skip = (size + TBLOCK - 1) / TBLOCK * TBLOCK;	switch (cmd) {		case 't':			if (verbose)				printf("%8o %d/%d\t %6ld %.24s %s\n", mode,					uid, gid, size, ctime(&mtime), name);			else				printf("%s\n", name);			break;		case 'x':			if (verbose)				printf("x %s: ", name);			confrmd = 1;			if (confirm) {				confrmd = 0;				if ((c = getchar()) == 'y')					confrmd++;				while (c != '\n')					c = getchar();				if(!confrmd)					break;			}			if(extract(name, size, mode, mtime, fp))				skip = 0;						if (verbose)				printf("\n");			break;	}	if (fseek(fp, skip, 1)) {		perror("fseek");		exit(1);	}	return (1);}int extract(fname, size, mode, mtime, ifp)char *fname;long size;unsigned short mode;long mtime;FILE *ifp;{	FILE *ofp;	char fbuf[TBLOCK];	long copied, left;	char *s, *np, *strchr();	struct stat sbuf;	for(np = fname; s = strchr(np, '/'); np = s+1) {		*s = '\0';		if(stat(fname, &sbuf)) {			if(mkdir(fname))				perror("mkdir");		} else if(!(sbuf.st_mode & S_IFDIR)) {			fprintf(stderr, "\n%s: Not a directory", fname);			*s = '/';			fprintf(stderr, "\ntar: %s - cannot create", fname);			return (0);		}		*s = '/';	}	if(!*np)		return (0);	if (binary) {		if ((ofp = fopen(fname, "wb")) == NULL) {			perror("extract:");			return (0);		}	} else {		if ((ofp = fopen(fname, "w")) == NULL) {			perror("extract:");			return (0);		}	}		for(copied = 0; copied < size; copied += TBLOCK) {		if(fread(fbuf, TBLOCK, 1, ifp) != 1) {			perror("fread");			exit(1);		}		left = size - copied;		if(fwrite(fbuf, (int)min(left, TBLOCK), 1, ofp) != 1) {			perror("fwrite");			exit(1);		}	}	if(fclose(ofp)) {		perror("fclose");		exit(1);	}	/*	 * Now, set modification time.	 */	{#include <sys\utime.h>	    struct utimbuf utim;	    utim.modtime = mtime;	    if (utime(fname, &utim) == -1) {		perror("utime");		exit(1);	    }	}	return (1);}

⌨️ 快捷键说明

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