diff -pru tar-1.13-lzma/src/common.h tar-1.13-autodetect/src/common.h --- tar-1.13-lzma/src/common.h 2008-09-30 19:13:47.000000000 +0200 +++ tar-1.13-autodetect/src/common.h 2008-09-30 20:24:55.000000000 +0200 @@ -126,6 +126,13 @@ GLOBAL int after_date_option; GLOBAL int atime_preserve_option; /* Boolean value. */ +GLOBAL int autodetect_option_used; +GLOBAL int archive_is_bz2; +GLOBAL int archive_is_gz; +GLOBAL int archive_is_lzma; +GLOBAL int archive_is_z; + +/* Boolean value. */ GLOBAL int backup_option; /* Type of backups being made. */ diff -pru tar-1.13-lzma/src/tar.c tar-1.13-autodetect/src/tar.c --- tar-1.13-lzma/src/tar.c 2008-09-30 19:47:17.000000000 +0200 +++ tar-1.13-autodetect/src/tar.c 2008-09-30 20:30:12.000000000 +0200 @@ -20,6 +20,8 @@ /* Patched to integrate lzma as compression filter (option --lzma) */ +/* Patched to autodetect compression method based on file extension */ + #include "system.h" #include @@ -166,6 +168,7 @@ struct option long_options[] = {"after-date", required_argument, NULL, 'N'}, {"append", no_argument, NULL, 'r'}, {"atime-preserve", no_argument, &atime_preserve_option, 1}, + {"auto-compress", no_argument, NULL, 'a'}, {"backup", optional_argument, NULL, BACKUP_OPTION}, {"block-compress", no_argument, NULL, OBSOLETE_BLOCK_COMPRESS}, {"block-number", no_argument, NULL, 'R'}, @@ -352,6 +355,7 @@ Archive format selection:\n\ PATTERN at list/extract time, a globbing PATTERN\n\ -o, --old-archive, --portability write a V7 format archive\n\ --posix write a POSIX conformant archive\n\ + -a, --auto-compress autodetect compression based on file suffix\n\ --lzma filter the archive through lzma\n\ -j, --bzip2, --bunzip2 filter the archive through bzip2\n\ -z, --gzip, --ungzip filter the archive through gzip\n\ @@ -430,7 +434,7 @@ Report bugs to .\n"), Y per-block gzip compression */ #define OPTION_STRING \ - "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hijklmoprstuvwxz" + "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zab:cdf:g:hijklmoprstuvwxz" static void set_subcommand_option (enum subcommand subcommand) @@ -470,6 +474,7 @@ decode_options (int argc, char *const *a owner_option = -1; group_option = -1; + int autodetect_option_used; backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX"); @@ -550,6 +555,10 @@ decode_options (int argc, char *const *a input_files++; break; + case 'a': + autodetect_option_used = 1; + break; + case 'A': set_subcommand_option (CAT_SUBCOMMAND); break; @@ -610,6 +619,54 @@ decode_options (int argc, char *const *a xrealloc (archive_name_array, sizeof (const char *) * allocated_archive_names); } + { + if (autodetect_option_used) { + { + ssize_t len=strlen(optarg); + if (len>=3 && strcmp(optarg+len-3,".gz")==0) archive_is_gz=1; + } + { + ssize_t len=strlen(optarg); + if (len>=4 && strcmp(optarg+len-4,".tgz")==0) archive_is_gz=1; + } + { + ssize_t len=strlen(optarg); + if (len>=4 && strcmp(optarg+len-4,".taz")==0) archive_is_gz=1; + } + { + ssize_t len=strlen(optarg); + if (len>=4 && strcmp(optarg+len-4,".bz2")==0) archive_is_bz2=1; + } + { + ssize_t len=strlen(optarg); + if (len>=4 && strcmp(optarg+len-4,".tbz")==0) archive_is_bz2=1; + } + { + ssize_t len=strlen(optarg); + if (len>=4 && strcmp(optarg+len-4,".tz2")==0) archive_is_bz2=1; + } + { + ssize_t len=strlen(optarg); + if (len>=5 && strcmp(optarg+len-5,".tbz2")==0) archive_is_bz2=1; + } + { + ssize_t len=strlen(optarg); + if (len>=5 && strcmp(optarg+len-5,".lzma")==0) archive_is_lzma=1; + } + { + ssize_t len=strlen(optarg); + if (len>=4 && strcmp(optarg+len-4,".tlz")==0) archive_is_lzma=1; + } + { + ssize_t len=strlen(optarg); + if (len>=4 && strcmp(optarg+len-4,".taZ")==0) archive_is_z=1; + } + { + ssize_t len=strlen(optarg); + if (len>=2 && strcmp(optarg+len-2,".Z")==0) archive_is_z=1; + } + } + } archive_name_array[archive_names++] = optarg; break; @@ -1008,6 +1065,11 @@ decode_options (int argc, char *const *a #endif /* not DEVICE_PREFIX */ } + /* Set the compression program to use */ + if (autodetect_option_used && archive_is_gz) use_compress_program_option="gzip"; + if (autodetect_option_used && archive_is_bz2) use_compress_program_option="bzip2"; + if (autodetect_option_used && archive_is_lzma) use_compress_program_option="lzma"; + if (autodetect_option_used && archive_is_z) use_compress_program_option="compress"; /* Process trivial options. */