diff options
Diffstat (limited to 'tar/bsdtar.c')
-rw-r--r-- | tar/bsdtar.c | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/tar/bsdtar.c b/tar/bsdtar.c index af41be5e4e26..75249d1052c3 100644 --- a/tar/bsdtar.c +++ b/tar/bsdtar.c @@ -70,24 +70,20 @@ __FBSDID("$FreeBSD: src/usr.bin/tar/bsdtar.c,v 1.93 2008/11/08 04:43:24 kientzle #include "bsdtar.h" #include "err.h" -/* - * Per POSIX.1-1988, tar defaults to reading/writing archives to/from - * the default tape device for the system. Pick something reasonable here. - */ -#ifdef __linux -#define _PATH_DEFTAPE "/dev/st0" +#if ARCHIVE_VERSION_NUMBER < 4000000 && !defined(_PATH_DEFTAPE) +// Libarchive 4.0 and later will NOT define _PATH_DEFTAPE +// but will honor it if it's set in the build. +// Until then, we'll continue to set it by default on certain platforms: +#if defined(__linux) +#define _PATH_DEFTAPE "/dev/st0" +#elif defined(_WIN32) && !defined(__CYGWIN__) +#define _PATH_DEFTAPE "\\\\.\\tape0" +#elif !defined(__APPLE__) +#define _PATH_DEFTAPE "/dev/tape" #endif -#if defined(_WIN32) && !defined(__CYGWIN__) -#define _PATH_DEFTAPE "\\\\.\\tape0" -#endif -#if defined(__APPLE__) -#undef _PATH_DEFTAPE -#define _PATH_DEFTAPE "-" /* Mac OS has no tape support, default to stdio. */ #endif -#ifndef _PATH_DEFTAPE -#define _PATH_DEFTAPE "/dev/tape" -#endif +#define _PATH_STDIO "-" #ifdef __MINGW32__ int _CRT_glob = 0; /* Disable broken CRT globbing. */ @@ -217,8 +213,21 @@ main(int argc, char **argv) /* Default: open tape drive. */ bsdtar->filename = getenv("TAPE"); - if (bsdtar->filename == NULL) - bsdtar->filename = _PATH_DEFTAPE; +#if defined(_PATH_DEFTAPE) + if (bsdtar->filename == NULL) { +#if defined(_WIN32) && !defined(__CYGWIN__) + int tapeExists = !_access(_PATH_DEFTAPE, 0); +#else + int tapeExists = !access(_PATH_DEFTAPE, F_OK); +#endif + if (tapeExists) { + bsdtar->filename = _PATH_DEFTAPE; + } + } +#endif + if (bsdtar->filename == NULL) { + bsdtar->filename = _PATH_STDIO; + } /* Default block size settings. */ bsdtar->bytes_per_block = DEFAULT_BYTES_PER_BLOCK; @@ -542,6 +551,10 @@ main(int argc, char **argv) bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA; bsdtar->flags |= OPTFLAG_NO_MAC_METADATA; break; + case OPTION_NO_READ_SPARSE: + bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_SPARSE; + bsdtar->flags |= OPTFLAG_NO_READ_SPARSE; + break; case OPTION_NO_SAFE_WRITES: bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_SAFE_WRITES; break; @@ -649,6 +662,10 @@ main(int argc, char **argv) case 'r': /* SUSv2 */ set_mode(bsdtar, opt); break; + case OPTION_READ_SPARSE: + bsdtar->readdisk_flags &= ~ARCHIVE_READDISK_NO_SPARSE; + bsdtar->flags |= OPTFLAG_READ_SPARSE; + break; case 'S': /* NetBSD pax-as-tar */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE; break; @@ -796,8 +813,14 @@ main(int argc, char **argv) "Must specify one of -c, -r, -t, -u, -x"); /* Check boolean options only permitted in certain modes. */ - if (bsdtar->flags & OPTFLAG_AUTO_COMPRESS) - only_mode(bsdtar, "-a", "c"); + if (bsdtar->flags & OPTFLAG_AUTO_COMPRESS) { + only_mode(bsdtar, "-a", "cx"); + if (bsdtar->mode == 'x') { + bsdtar->flags &= ~OPTFLAG_AUTO_COMPRESS; + lafe_warnc(0, + "Ignoring option -a in mode -x"); + } + } if (bsdtar->readdisk_flags & ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS) only_mode(bsdtar, "--one-file-system", "cru"); if (bsdtar->flags & OPTFLAG_FAST_READ) |