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

📄 tar.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	/* It is a bad idea to store the archive we are in the process of creating,	 * so check the device and inode to be sure that this particular file isn't	 * the new tarball */	if (tbInfo->statBuf.st_dev == statbuf->st_dev &&			tbInfo->statBuf.st_ino == statbuf->st_ino) {		error_msg("%s: file is the archive; skipping", fileName);		return( TRUE);	}	header_name = fileName;	while (header_name[0] == '/') {		static int alreadyWarned=FALSE;		if (alreadyWarned==FALSE) {			error_msg("Removing leading '/' from member names");			alreadyWarned=TRUE;		}		header_name++;	}	if (strlen(fileName) >= NAME_SIZE) {		error_msg(name_longer_than_foo, NAME_SIZE);		return ( TRUE);	}	if (header_name[0] == '\0')		return TRUE;# if defined CONFIG_FEATURE_TAR_EXCLUDE	if (exclude_file(tbInfo->excludeList, header_name)) {		return SKIP;	}# endif //CONFIG_FEATURE_TAR_EXCLUDE	if (writeTarHeader(tbInfo, header_name, fileName, statbuf)==FALSE) {		return( FALSE);	} 	/* Now, if the file is a regular file, copy it out to the tarball */	if ((tbInfo->hlInfo == NULL)	&&  (S_ISREG(statbuf->st_mode))) {		int  inputFileFd;		char buffer[BUFSIZ];		ssize_t size=0, readSize=0;		/* open the file we want to archive, and make sure all is well */		if ((inputFileFd = open(fileName, O_RDONLY)) < 0) {			error_msg("%s: Cannot open: %s", fileName, strerror(errno));			return( FALSE);		}				/* write the file to the archive */		while ( (size = full_read(inputFileFd, buffer, sizeof(buffer))) > 0 ) {			if (full_write(tbInfo->tarFd, buffer, size) != size ) {				/* Output file seems to have a problem */				error_msg(io_error, fileName, strerror(errno)); 				return( FALSE);			}			readSize+=size;		}		if (size == -1) {			error_msg(io_error, fileName, strerror(errno)); 			return( FALSE);		}		/* Pad the file up to the tar block size */		for (; (readSize%TAR_BLOCK_SIZE) != 0; readSize++) {			write(tbInfo->tarFd, "\0", 1);		}		close( inputFileFd);	}	return( TRUE);}static int writeTarFile(const char* tarName, int verboseFlag, char **argv,		char** excludeList){	int tarFd=-1;	int errorFlag=FALSE;	ssize_t size;	struct TarBallInfo tbInfo;	tbInfo.verboseFlag = verboseFlag;	tbInfo.hlInfoHead = NULL;	/* Make sure there is at least one file to tar up.  */	if (*argv == NULL)		error_msg_and_die("Cowardly refusing to create an empty archive");	/* Open the tar file for writing.  */	if (tarName == NULL)		tbInfo.tarFd = fileno(stdout);	else		tbInfo.tarFd = open (tarName, O_WRONLY | O_CREAT | O_TRUNC, 0644);	if (tbInfo.tarFd < 0) {		perror_msg( "Error opening '%s'", tarName);		freeHardLinkInfo(&tbInfo.hlInfoHead);		return ( FALSE);	}	tbInfo.excludeList=excludeList;	/* Store the stat info for the tarball's file, so	 * can avoid including the tarball into itself....  */	if (fstat(tbInfo.tarFd, &tbInfo.statBuf) < 0)		error_msg_and_die(io_error, tarName, strerror(errno)); 	/* Read the directory/files and iterate over them one at a time */	while (*argv != NULL) {		if (! recursive_action(*argv++, TRUE, FALSE, FALSE,					writeFileToTarball, writeFileToTarball, 					(void*) &tbInfo)) {			errorFlag = TRUE;		}	}	/* Write two empty blocks to the end of the archive */	for (size=0; size<(2*TAR_BLOCK_SIZE); size++) {		write(tbInfo.tarFd, "\0", 1);	}	/* To be pedantically correct, we would check if the tarball	 * is smaller than 20 tar blocks, and pad it if it was smaller,	 * but that isn't necessary for GNU tar interoperability, and	 * so is considered a waste of space */	/* Hang up the tools, close up shop, head home */	close(tarFd);	if (errorFlag) {		error_msg("Error exit delayed from previous errors");		freeHardLinkInfo(&tbInfo.hlInfoHead);		return(FALSE);	}	freeHardLinkInfo(&tbInfo.hlInfoHead);	return( TRUE);}#endif //tar_createvoid append_file_to_list(const char *new_name, char ***list, int *list_count){	*list = realloc(*list, sizeof(char *) * (*list_count + 2));	(*list)[*list_count] = xstrdup(new_name);	(*list_count)++;	(*list)[*list_count] = NULL;}void append_file_list_to_list(char *filename, char ***name_list, int *num_of_entries){	FILE *src_stream;	char *line;		src_stream = xfopen(filename, "r");	while ((line = get_line_from_file(src_stream)) != NULL) {		chomp (line);		append_file_to_list(line, name_list, num_of_entries);		free(line);	}	fclose(src_stream);}#ifdef CONFIG_FEATURE_TAR_EXCLUDE/* * Create a list of names that are in the include list AND NOT in the exclude lists */char **list_and_not_list(char **include_list, char **exclude_list){	char **new_include_list = NULL;	int new_include_count = 0;	int include_count = 0;	int exclude_count;	if (include_list == NULL) {		return(NULL);	}		while (include_list[include_count] != NULL) {		int found = FALSE;		exclude_count = 0;		while (exclude_list[exclude_count] != NULL) {			if (strcmp(include_list[include_count], exclude_list[exclude_count]) == 0) {				found = TRUE;				break;			}			exclude_count++;		}		if (! found) {			new_include_list = realloc(new_include_list, sizeof(char *) * (include_count + 2));			new_include_list[new_include_count] = include_list[include_count];			new_include_count++;		} else {			free(include_list[include_count]);		}		include_count++;	}	new_include_list[new_include_count] = NULL;	return(new_include_list);}#endifint tar_main(int argc, char **argv){	enum untar_funct_e {		/* This is optional */		untar_unzip = 1,		/* Require one and only one of these */		untar_list = 2,		untar_create = 4,		untar_extract = 8	};	FILE *src_stream = NULL;	FILE *uncompressed_stream = NULL;	char **include_list = NULL;	char **exclude_list = NULL;	char *src_filename = NULL;	char *dst_prefix = NULL;	int opt;	unsigned short untar_funct = 0;	unsigned short untar_funct_required = 0;	unsigned short extract_function = 0;	int include_list_count = 0;#ifdef CONFIG_FEATURE_TAR_EXCLUDE	int exclude_list_count = 0;#endif#ifdef CONFIG_FEATURE_TAR_GZIP	int gunzip_pid;	int gz_fd = 0;#endif	if (argc < 2) {		show_usage();	}	/* Prepend '-' to the first argument if required */	if (argv[1][0] != '-') {		char *tmp = xmalloc(strlen(argv[1]) + 2);		tmp[0] = '-';		strcpy(tmp + 1, argv[1]);		argv[1] = tmp;	}	while ((opt = getopt(argc, argv, "ctxT:X:C:f:Opvz")) != -1) {		switch (opt) {		/* One and only one of these is required */		case 'c':			untar_funct_required |= untar_create;			break;		case 't':			untar_funct_required |= untar_list;			extract_function |= extract_list |extract_unconditional;			break;		case 'x':			untar_funct_required |= untar_extract;			extract_function |= (extract_all_to_fs | extract_unconditional | extract_create_leading_dirs);			break;		/* These are optional */		/* Exclude or Include files listed in <filename>*/#ifdef CONFIG_FEATURE_TAR_EXCLUDE		case 'X':			append_file_list_to_list(optarg, &exclude_list, &exclude_list_count);			break;#endif		case 'T':			// by default a list is an include list			append_file_list_to_list(optarg, &include_list, &include_list_count);			break;		case 'C':	// Change to dir <optarg>			/* Make sure dst_prefix ends in a '/' */			dst_prefix = concat_path_file(optarg, "/");			break;		case 'f':	// archive filename			if (strcmp(optarg, "-") == 0) {				src_filename = NULL;			} else {				src_filename = xstrdup(optarg);			}			break;		case 'O':			extract_function |= extract_to_stdout;			break;		case 'p':			break;		case 'v':			if (extract_function & extract_list) {				extract_function |= extract_verbose_list;			}			extract_function |= extract_list;			break;#ifdef CONFIG_FEATURE_TAR_GZIP		case 'z':			untar_funct |= untar_unzip;			break;#endif		default:			show_usage();		}	}	/* Make sure the valid arguments were passed */	if (untar_funct_required == 0) {		error_msg_and_die("You must specify one of the `-ctx' options");	}	if ((untar_funct_required != untar_create) && 			(untar_funct_required != untar_extract) &&			(untar_funct_required != untar_list)) {		error_msg_and_die("You may not specify more than one `ctx' option.");	}	untar_funct |= untar_funct_required;	/* Setup an array of filenames to work with */	while (optind < argc) {		append_file_to_list(argv[optind], &include_list, &include_list_count);		optind++;	}	if (extract_function & (extract_list | extract_all_to_fs)) {		if (dst_prefix == NULL) {			dst_prefix = xstrdup("./");		}		/* Setup the source of the tar data */		if (src_filename != NULL) {			src_stream = xfopen(src_filename, "r");		} else {			src_stream = stdin;		}#ifdef CONFIG_FEATURE_TAR_GZIP		/* Get a binary tree of all the tar file headers */		if (untar_funct & untar_unzip) {			uncompressed_stream = gz_open(src_stream, &gunzip_pid);		} else#endif // CONFIG_FEATURE_TAR_GZIP			uncompressed_stream = src_stream;				/* extract or list archive */		unarchive(uncompressed_stream, stdout, &get_header_tar, extract_function, dst_prefix, include_list, exclude_list);		fclose(uncompressed_stream);	}#ifdef CONFIG_FEATURE_TAR_CREATE	/* create an archive */	else if (untar_funct & untar_create) {		int verboseFlag = FALSE;#ifdef CONFIG_FEATURE_TAR_GZIP		if (untar_funct & untar_unzip) {			error_msg_and_die("Creation of compressed tarfile not internally support by tar, pipe to busybox gunzip");		}#endif // CONFIG_FEATURE_TAR_GZIP		if (extract_function & extract_verbose_list) {			verboseFlag = TRUE;		}		writeTarFile(src_filename, verboseFlag, include_list, exclude_list);	}#endif // CONFIG_FEATURE_TAR_CREATE	/* Cleanups */#ifdef CONFIG_FEATURE_TAR_GZIP	if (untar_funct & untar_unzip) {		fclose(src_stream);		close(gz_fd);		gz_close(gunzip_pid);	}#endif // CONFIG_FEATURE_TAR_GZIP#ifdef CONFIG_FEATURE_CLEAN_UP	if (src_filename) {		free(src_filename);	}#endif	return(EXIT_SUCCESS);}

⌨️ 快捷键说明

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