diff options
| author | Martin Matuska <mm@FreeBSD.org> | 2017-03-02 21:02:17 +0000 | 
|---|---|---|
| committer | Martin Matuska <mm@FreeBSD.org> | 2017-03-02 21:02:17 +0000 | 
| commit | 4b729aff5b4c807ecf8795452187ca06d5eb042d (patch) | |
| tree | fefc76886e467f8a662770c4f394a8b76ebaf606 /tar/bsdtar.c | |
| parent | b2ee1181b4555230a015f1b8f27a1e7ec3c2bb6e (diff) | |
Diffstat (limited to 'tar/bsdtar.c')
| -rw-r--r-- | tar/bsdtar.c | 119 | 
1 files changed, 87 insertions, 32 deletions
| diff --git a/tar/bsdtar.c b/tar/bsdtar.c index 93bf60a94da8..a9252a5c7c26 100644 --- a/tar/bsdtar.c +++ b/tar/bsdtar.c @@ -137,7 +137,6 @@ main(int argc, char **argv)  	char			 compression, compression2;  	const char		*compression_name, *compression2_name;  	const char		*compress_program; -	char			 option_a, option_o;  	char			 possible_help_request;  	char			 buff[16]; @@ -150,7 +149,7 @@ main(int argc, char **argv)  	bsdtar->fd = -1; /* Mark as "unused" */  	bsdtar->gid = -1;  	bsdtar->uid = -1; -	option_a = option_o = 0; +	bsdtar->flags = 0;  	compression = compression2 = '\0';  	compression_name = compression2_name = NULL;  	compress_program = NULL; @@ -233,6 +232,14 @@ main(int argc, char **argv)  	if (getenv(COPYFILE_DISABLE_VAR))  		bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_MAC_COPYFILE;  #endif +#if defined(__APPLE__) +	/* +	 * On Mac OS ACLs are archived with copyfile() (--mac-metadata) +	 * Translation to NFSv4 ACLs has to be requested explicitly with --acls +	 */ +	bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_ACL; +#endif +  	bsdtar->matching = archive_match_new();  	if (bsdtar->matching == NULL)  		lafe_errc(1, errno, "Out of memory"); @@ -252,7 +259,12 @@ main(int argc, char **argv)  	while ((opt = bsdtar_getopt(bsdtar)) != -1) {  		switch (opt) {  		case 'a': /* GNU tar */ -			option_a = 1; /* Record it and resolve it later. */ +			bsdtar->flags |= OPTFLAG_AUTO_COMPRESS; +			break; +		case OPTION_ACLS: /* GNU tar */ +			bsdtar->extract_flags |= ARCHIVE_EXTRACT_ACL; +			bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_ACL; +			bsdtar->flags |= OPTFLAG_ACLS;  			break;  		case 'B': /* GNU tar */  			/* libarchive doesn't need this; just ignore it. */ @@ -285,24 +297,26 @@ main(int argc, char **argv)  			set_mode(bsdtar, opt);  			break;  		case OPTION_CHECK_LINKS: /* GNU tar */ -			bsdtar->option_warn_links = 1; +			bsdtar->flags |= OPTFLAG_WARN_LINKS;  			break;  		case OPTION_CHROOT: /* NetBSD */ -			bsdtar->option_chroot = 1; +			bsdtar->flags |= OPTFLAG_CHROOT;  			break;  		case OPTION_CLEAR_NOCHANGE_FFLAGS:  			bsdtar->extract_flags |=  			    ARCHIVE_EXTRACT_CLEAR_NOCHANGE_FFLAGS;  			break; -		case OPTION_DISABLE_COPYFILE: /* Mac OS X */ -			bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_MAC_COPYFILE; -			break;  		case OPTION_EXCLUDE: /* GNU tar */  			if (archive_match_exclude_pattern(  			    bsdtar->matching, bsdtar->argument) != ARCHIVE_OK)  				lafe_errc(1, 0,  				    "Couldn't exclude %s\n", bsdtar->argument);  			break; +		case OPTION_FFLAGS: +			bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS; +			bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_FFLAGS; +			bsdtar->flags |= OPTFLAG_FFLAGS; +			break;  		case OPTION_FORMAT: /* GNU tar, others */  			cset_set_format(bsdtar->cset, bsdtar->argument);  			break; @@ -344,7 +358,7 @@ main(int argc, char **argv)  			    ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED;  			break;  		case OPTION_IGNORE_ZEROS: -			bsdtar->option_ignore_zeros = 1; +			bsdtar->flags |= OPTFLAG_IGNORE_ZEROS;  			break;  		case 'I': /* GNU tar */  			/* @@ -398,7 +412,7 @@ main(int argc, char **argv)  			break;  	        case 'l': /* SUSv2 and GNU tar beginning with 1.16 */  			/* GNU tar 1.13  used -l for --one-file-system */ -			bsdtar->option_warn_links = 1; +			bsdtar->flags |= OPTFLAG_WARN_LINKS;  			break;  		case OPTION_LRZIP:  		case OPTION_LZ4: @@ -421,8 +435,13 @@ main(int argc, char **argv)  		case 'm': /* SUSv2 */  			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_TIME;  			break; +		case OPTION_MAC_METADATA: /* Mac OS X */ +			bsdtar->readdisk_flags |= ARCHIVE_READDISK_MAC_COPYFILE; +			bsdtar->extract_flags |= ARCHIVE_EXTRACT_MAC_METADATA; +			bsdtar->flags |= OPTFLAG_MAC_METADATA; +			break;  		case 'n': /* GNU tar */ -			bsdtar->option_no_subdirs = 1; +			bsdtar->flags |= OPTFLAG_NO_SUBDIRS;  			break;  	        /*  		 * Selecting files by time: @@ -466,6 +485,21 @@ main(int argc, char **argv)  			bsdtar->extract_flags |=  			    ARCHIVE_EXTRACT_NO_HFS_COMPRESSION;  			break; +		case OPTION_NO_ACLS: /* GNU tar */ +			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_ACL; +			bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_ACL; +			bsdtar->flags |= OPTFLAG_NO_ACLS; +			break; +		case OPTION_NO_FFLAGS: +			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS; +			bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_FFLAGS; +			bsdtar->flags |= OPTFLAG_NO_FFLAGS; +			break; +		case OPTION_NO_MAC_METADATA: /* Mac OS X */ +			bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_MAC_COPYFILE; +			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA; +			bsdtar->flags |= OPTFLAG_NO_MAC_METADATA; +			break;  		case OPTION_NO_SAME_OWNER: /* GNU tar */  			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;  			break; @@ -476,23 +510,24 @@ main(int argc, char **argv)  			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS;  			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA;  			break; -		case OPTION_NO_XATTR: /* Issue #131 */ +		case OPTION_NO_XATTRS: /* GNU tar */  			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_XATTR;  			bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_XATTR; +			bsdtar->flags |= OPTFLAG_NO_XATTRS;  			break;  		case OPTION_NULL: /* GNU tar */ -			bsdtar->option_null++; +			bsdtar->flags |= OPTFLAG_NULL;  			break;  		case OPTION_NUMERIC_OWNER: /* GNU tar */  			bsdtar->uname = "";  			bsdtar->gname = ""; -			bsdtar->option_numeric_owner++; +			bsdtar->flags |= OPTFLAG_NUMERIC_OWNER;  			break;  		case 'O': /* GNU tar */ -			bsdtar->option_stdout = 1; +			bsdtar->flags |= OPTFLAG_STDOUT;  			break;  		case 'o': /* SUSv2 and GNU conflict here, but not fatally */ -			option_o = 1; /* Record it and resolve it later. */ +			bsdtar->flags |= OPTFLAG_O;  			break;  	        /*  		 * Selecting files by time: @@ -548,7 +583,7 @@ main(int argc, char **argv)  #endif  		case 'P': /* GNU tar */  			bsdtar->extract_flags &= ~SECURITY; -			bsdtar->option_absolute_paths = 1; +			bsdtar->flags |= OPTFLAG_ABSOLUTE_PATHS;  			break;  		case 'p': /* GNU tar, star */  			bsdtar->extract_flags |= ARCHIVE_EXTRACT_PERM; @@ -564,7 +599,7 @@ main(int argc, char **argv)  			cset_set_format(bsdtar->cset, "pax");  			break;  		case 'q': /* FreeBSD GNU tar --fast-read, NetBSD -q */ -			bsdtar->option_fast_read = 1; +			bsdtar->flags |= OPTFLAG_FAST_READ;  			break;  		case 'r': /* SUSv2 */  			set_mode(bsdtar, opt); @@ -601,11 +636,11 @@ main(int argc, char **argv)  			bsdtar->verbose++;  			break;  		case OPTION_TOTALS: /* GNU tar */ -			bsdtar->option_totals++; +			bsdtar->flags |= OPTFLAG_TOTALS;  			break;  		case 'U': /* GNU tar */  			bsdtar->extract_flags |= ARCHIVE_EXTRACT_UNLINK; -			bsdtar->option_unlink_first = 1; +			bsdtar->flags |= OPTFLAG_UNLINK_FIRST;  			break;  		case 'u': /* SUSv2 */  			set_mode(bsdtar, opt); @@ -643,7 +678,7 @@ main(int argc, char **argv)  			break;  #endif  		case 'w': /* SUSv2 */ -			bsdtar->option_interactive = 1; +			bsdtar->flags |= OPTFLAG_INTERACTIVE;  			break;  		case 'X': /* GNU tar */  			if (archive_match_exclude_pattern_from_file( @@ -655,6 +690,11 @@ main(int argc, char **argv)  		case 'x': /* SUSv2 */  			set_mode(bsdtar, opt);  			break; +		case OPTION_XATTRS: /* GNU tar */ +			bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR; +			bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_XATTR; +			bsdtar->flags |= OPTFLAG_XATTRS; +			break;  		case 'y': /* FreeBSD version of GNU tar */  			if (compression != '\0')  				lafe_errc(1, 0, @@ -703,11 +743,11 @@ main(int argc, char **argv)  		    "Must specify one of -c, -r, -t, -u, -x");  	/* Check boolean options only permitted in certain modes. */ -	if (option_a) +	if (bsdtar->flags & OPTFLAG_AUTO_COMPRESS)  		only_mode(bsdtar, "-a", "c");  	if (bsdtar->readdisk_flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS)  		only_mode(bsdtar, "--one-file-system", "cru"); -	if (bsdtar->option_fast_read) +	if (bsdtar->flags & OPTFLAG_FAST_READ)  		only_mode(bsdtar, "--fast-read", "xt");  	if (bsdtar->extract_flags & ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED)  		only_mode(bsdtar, "--hfsCompression", "x"); @@ -715,9 +755,23 @@ main(int argc, char **argv)  		only_mode(bsdtar, "--nopreserveHFSCompression", "x");  	if (bsdtar->readdisk_flags & ARCHIVE_READDISK_HONOR_NODUMP)  		only_mode(bsdtar, "--nodump", "cru"); -	if (bsdtar->readdisk_flags & ARCHIVE_READDISK_NO_XATTR) -		only_mode(bsdtar, "--no-xattr", "crux"); -	if (option_o > 0) { +	if (bsdtar->flags & OPTFLAG_ACLS) +		only_mode(bsdtar, "--acls", "crux"); +	if (bsdtar->flags & OPTFLAG_NO_ACLS) +		only_mode(bsdtar, "--no-acls", "crux"); +	if (bsdtar->flags & OPTFLAG_XATTRS) +		only_mode(bsdtar, "--xattrs", "crux"); +	if (bsdtar->flags & OPTFLAG_NO_XATTRS) +		only_mode(bsdtar, "--no-xattrs", "crux"); +	if (bsdtar->flags & OPTFLAG_FFLAGS) +		only_mode(bsdtar, "--fflags", "crux"); +	if (bsdtar->flags & OPTFLAG_NO_FFLAGS) +		only_mode(bsdtar, "--no-fflags", "crux"); +	if (bsdtar->flags & OPTFLAG_MAC_METADATA) +		only_mode(bsdtar, "--mac-metadata", "crux"); +	if (bsdtar->flags & OPTFLAG_NO_MAC_METADATA) +		only_mode(bsdtar, "--no-mac-metadata", "crux"); +	if (bsdtar->flags & OPTFLAG_O) {  		switch (bsdtar->mode) {  		case 'c':  			/* @@ -730,7 +784,7 @@ main(int argc, char **argv)  			break;  		case 'x':  			/* POSIX-compatible behavior. */ -			bsdtar->option_no_owner = 1; +			bsdtar->flags |= OPTFLAG_NO_OWNER;  			bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_OWNER;  			break;  		default: @@ -738,16 +792,17 @@ main(int argc, char **argv)  			break;  		}  	} -	if (bsdtar->option_no_subdirs) +	if (bsdtar->flags & OPTFLAG_NO_SUBDIRS)  		only_mode(bsdtar, "-n", "cru"); -	if (bsdtar->option_stdout) +	if (bsdtar->flags & OPTFLAG_STDOUT)  		only_mode(bsdtar, "-O", "xt"); -	if (bsdtar->option_unlink_first) +	if (bsdtar->flags & OPTFLAG_UNLINK_FIRST)  		only_mode(bsdtar, "-U", "x"); -	if (bsdtar->option_warn_links) +	if (bsdtar->flags & OPTFLAG_WARN_LINKS)  		only_mode(bsdtar, "--check-links", "cr"); -	if (option_a && cset_auto_compress(bsdtar->cset, bsdtar->filename)) { +	if ((bsdtar->flags & OPTFLAG_AUTO_COMPRESS) && +	    cset_auto_compress(bsdtar->cset, bsdtar->filename)) {  		/* Ignore specified compressions if auto-compress works. */  		compression = '\0';  		compression2 = '\0'; | 
