aboutsummaryrefslogtreecommitdiff
path: root/archival/tar.c
diff options
context:
space:
mode:
Diffstat (limited to 'archival/tar.c')
-rw-r--r--archival/tar.c101
1 files changed, 63 insertions, 38 deletions
diff --git a/archival/tar.c b/archival/tar.c
index 54961ff07..6618c9ecc 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -234,7 +234,7 @@ static HardLinkInfo *findHardLinkInfo(HardLinkInfo *hlInfo, struct stat *statbuf
234} 234}
235 235
236/* Put an octal string into the specified buffer. 236/* Put an octal string into the specified buffer.
237 * The number is zero padded and possibly null terminated. 237 * The number is zero padded and possibly NUL terminated.
238 * Stores low-order bits only if whole value does not fit. */ 238 * Stores low-order bits only if whole value does not fit. */
239static void putOctal(char *cp, int len, off_t value) 239static void putOctal(char *cp, int len, off_t value)
240{ 240{
@@ -285,31 +285,32 @@ static void chksum_and_xwrite(int fd, struct tar_header_t* hp)
285# if ENABLE_FEATURE_TAR_GNU_EXTENSIONS 285# if ENABLE_FEATURE_TAR_GNU_EXTENSIONS
286static void writeLongname(int fd, int type, const char *name, int dir) 286static void writeLongname(int fd, int type, const char *name, int dir)
287{ 287{
288 static const struct { 288 struct prefilled {
289 char mode[8]; /* 100-107 */ 289 char mode[8]; /* 100-107 */
290 char uid[8]; /* 108-115 */ 290 char uid[8]; /* 108-115 */
291 char gid[8]; /* 116-123 */ 291 char gid[8]; /* 116-123 */
292 char size[12]; /* 124-135 */ 292 char size[12]; /* 124-135 */
293 char mtime[12]; /* 136-147 */ 293 char mtime[12]; /* 136-147 */
294 } prefilled = {
295 "0000000",
296 "0000000",
297 "0000000",
298 "00000000000",
299 "00000000000",
300 }; 294 };
301 struct tar_header_t header; 295 struct tar_header_t header;
302 int size; 296 int size;
303 297
298 memset(&header, 0, sizeof(header));
299 header.typeflag = type;
300 strcpy(header.name, "././@LongLink");
301 /* This sets mode/uid/gid/mtime to "00...00<NUL>" strings */
302 memset(header.mode, '0', sizeof(struct prefilled));
303 header.mode [sizeof(header.mode ) - 1] = '\0';
304 header.uid [sizeof(header.uid ) - 1] = '\0';
305 header.gid [sizeof(header.gid ) - 1] = '\0';
306 /* header.size is filled by '0' now, will be corrected below */
307 header.mtime[sizeof(header.mtime) - 1] = '\0';
308
304 dir = !!dir; /* normalize: 0/1 */ 309 dir = !!dir; /* normalize: 0/1 */
305 size = strlen(name) + 1 + dir; /* GNU tar uses strlen+1 */ 310 size = strlen(name) + 1 + dir; /* GNU tar uses strlen+1 */
306 /* + dir: account for possible '/' */ 311 /* + dir: account for possible '/' */
307 312
308 memset(&header, 0, sizeof(header));
309 strcpy(header.name, "././@LongLink");
310 memcpy(header.mode, prefilled.mode, sizeof(prefilled));
311 PUT_OCTAL(header.size, size); 313 PUT_OCTAL(header.size, size);
312 header.typeflag = type;
313 chksum_and_xwrite(fd, &header); 314 chksum_and_xwrite(fd, &header);
314 315
315 /* Write filename[/] and pad the block. */ 316 /* Write filename[/] and pad the block. */
@@ -371,7 +372,7 @@ static int writeTarHeader(struct TarBallInfo *tbInfo,
371 /* If it is larger than 100 bytes, bail out */ 372 /* If it is larger than 100 bytes, bail out */
372 if (header.linkname[sizeof(header.linkname)-1]) { 373 if (header.linkname[sizeof(header.linkname)-1]) {
373 free(lpath); 374 free(lpath);
374 bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); 375 bb_simple_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
375 return FALSE; 376 return FALSE;
376 } 377 }
377# endif 378# endif
@@ -550,7 +551,7 @@ static int FAST_FUNC writeFileToTarball(const char *fileName, struct stat *statb
550 551
551# if !ENABLE_FEATURE_TAR_GNU_EXTENSIONS 552# if !ENABLE_FEATURE_TAR_GNU_EXTENSIONS
552 if (strlen(header_name) >= NAME_SIZE) { 553 if (strlen(header_name) >= NAME_SIZE) {
553 bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); 554 bb_simple_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
554 return TRUE; 555 return TRUE;
555 } 556 }
556# endif 557# endif
@@ -645,8 +646,14 @@ static void NOINLINE vfork_compressor(int tar_fd, const char *gzip)
645 } 646 }
646 xmove_fd(data.rd, 0); 647 xmove_fd(data.rd, 0);
647 xmove_fd(tfd, 1); 648 xmove_fd(tfd, 1);
648 /* exec gzip/bzip2 program/applet */ 649
649 BB_EXECLP(gzip, gzip, "-f", (char *)0); 650 /* exec gzip/bzip2/... program */
651 //BB_EXECLP(gzip, gzip, "-f", (char *)0); - WRONG for "xz",
652 // if xz is an enabled applet, it'll be a version which
653 // can only decompress. We do need to execute external
654 // program, not applet.
655 execlp(gzip, gzip, "-f", (char *)0);
656
650 vfork_exec_errno = errno; 657 vfork_exec_errno = errno;
651 _exit(EXIT_FAILURE); 658 _exit(EXIT_FAILURE);
652 } 659 }
@@ -748,17 +755,17 @@ static NOINLINE int writeTarFile(
748 freeHardLinkInfo(&tbInfo->hlInfoHead); 755 freeHardLinkInfo(&tbInfo->hlInfoHead);
749 756
750 if (errorFlag) 757 if (errorFlag)
751 bb_error_msg("error exit delayed from previous errors"); 758 bb_simple_error_msg("error exit delayed from previous errors");
752 759
753# if SEAMLESS_COMPRESSION 760# if SEAMLESS_COMPRESSION
754 if (gzip) { 761 if (gzip) {
755 int status; 762 int status;
756#if !ENABLE_PLATFORM_MINGW32 763# if !ENABLE_PLATFORM_MINGW32
757 if (safe_waitpid(-1, &status, 0) == -1) 764 if (safe_waitpid(-1, &status, 0) == -1)
758#else 765# else
759 if (safe_waitpid(pid, &status, 0) == -1) 766 if (safe_waitpid(pid, &status, 0) == -1)
760#endif 767# endif
761 bb_perror_msg("waitpid"); 768 bb_simple_perror_msg("waitpid");
762 else if (!WIFEXITED(status) || WEXITSTATUS(status)) 769 else if (!WIFEXITED(status) || WEXITSTATUS(status))
763 /* gzip was killed or has exited with nonzero! */ 770 /* gzip was killed or has exited with nonzero! */
764 errorFlag = TRUE; 771 errorFlag = TRUE;
@@ -798,7 +805,7 @@ static llist_t *append_file_list_to_list(llist_t *list)
798//usage: IF_FEATURE_SEAMLESS_GZ("z") 805//usage: IF_FEATURE_SEAMLESS_GZ("z")
799//usage: IF_FEATURE_SEAMLESS_XZ("J") 806//usage: IF_FEATURE_SEAMLESS_XZ("J")
800//usage: IF_FEATURE_SEAMLESS_BZ2("j") 807//usage: IF_FEATURE_SEAMLESS_BZ2("j")
801//usage: IF_FEATURE_SEAMLESS_LZMA("a") 808//usage: "a"
802//usage: IF_FEATURE_TAR_CREATE("h") 809//usage: IF_FEATURE_TAR_CREATE("h")
803//usage: IF_FEATURE_TAR_NOPRESERVE_TIME("m") 810//usage: IF_FEATURE_TAR_NOPRESERVE_TIME("m")
804//usage: "vokO] " 811//usage: "vokO] "
@@ -837,9 +844,7 @@ static llist_t *append_file_list_to_list(llist_t *list)
837//usage: IF_FEATURE_SEAMLESS_BZ2( 844//usage: IF_FEATURE_SEAMLESS_BZ2(
838//usage: "\n -j (De)compress using bzip2" 845//usage: "\n -j (De)compress using bzip2"
839//usage: ) 846//usage: )
840//usage: IF_FEATURE_SEAMLESS_LZMA( 847//usage: "\n -a (De)compress based on extension"
841//usage: "\n -a (De)compress using lzma"
842//usage: )
843//usage: IF_FEATURE_TAR_CREATE( 848//usage: IF_FEATURE_TAR_CREATE(
844//usage: "\n -h Follow symlinks" 849//usage: "\n -h Follow symlinks"
845//usage: ) 850//usage: )
@@ -856,6 +861,7 @@ static llist_t *append_file_list_to_list(llist_t *list)
856//usage: "$ tar -cf /tmp/tarball.tar /usr/local\n" 861//usage: "$ tar -cf /tmp/tarball.tar /usr/local\n"
857 862
858// Supported but aren't in --help: 863// Supported but aren't in --help:
864// lzma
859// no-recursion 865// no-recursion
860// numeric-owner 866// numeric-owner
861// no-same-permissions 867// no-same-permissions
@@ -869,15 +875,16 @@ enum {
869 IF_FEATURE_TAR_CREATE( OPTBIT_CREATE ,) 875 IF_FEATURE_TAR_CREATE( OPTBIT_CREATE ,)
870 IF_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,) 876 IF_FEATURE_TAR_CREATE( OPTBIT_DEREFERENCE ,)
871 IF_FEATURE_SEAMLESS_BZ2( OPTBIT_BZIP2 ,) 877 IF_FEATURE_SEAMLESS_BZ2( OPTBIT_BZIP2 ,)
872 IF_FEATURE_SEAMLESS_LZMA(OPTBIT_LZMA ,)
873 IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,) 878 IF_FEATURE_TAR_FROM( OPTBIT_INCLUDE_FROM,)
874 IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,) 879 IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,)
875 IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,) 880 IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,)
876 IF_FEATURE_SEAMLESS_XZ( OPTBIT_XZ ,) // 16th bit 881 IF_FEATURE_SEAMLESS_XZ( OPTBIT_XZ ,)
877 IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) 882 IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit
883 OPTBIT_AUTOCOMPRESS_BY_EXT,
878 IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,) 884 IF_FEATURE_TAR_NOPRESERVE_TIME(OPTBIT_NOPRESERVE_TIME,)
879#if ENABLE_FEATURE_TAR_LONG_OPTIONS 885#if ENABLE_FEATURE_TAR_LONG_OPTIONS
880 OPTBIT_STRIP_COMPONENTS, 886 OPTBIT_STRIP_COMPONENTS,
887 IF_FEATURE_SEAMLESS_LZMA(OPTBIT_LZMA ,)
881 OPTBIT_NORECURSION, 888 OPTBIT_NORECURSION,
882 IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,) 889 IF_FEATURE_TAR_TO_COMMAND(OPTBIT_2COMMAND ,)
883 OPTBIT_NUMERIC_OWNER, 890 OPTBIT_NUMERIC_OWNER,
@@ -896,14 +903,15 @@ enum {
896 OPT_CREATE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_CREATE )) + 0, // c 903 OPT_CREATE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_CREATE )) + 0, // c
897 OPT_DEREFERENCE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_DEREFERENCE )) + 0, // h 904 OPT_DEREFERENCE = IF_FEATURE_TAR_CREATE( (1 << OPTBIT_DEREFERENCE )) + 0, // h
898 OPT_BZIP2 = IF_FEATURE_SEAMLESS_BZ2( (1 << OPTBIT_BZIP2 )) + 0, // j 905 OPT_BZIP2 = IF_FEATURE_SEAMLESS_BZ2( (1 << OPTBIT_BZIP2 )) + 0, // j
899 OPT_LZMA = IF_FEATURE_SEAMLESS_LZMA((1 << OPTBIT_LZMA )) + 0, // a
900 OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T 906 OPT_INCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_INCLUDE_FROM)) + 0, // T
901 OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X 907 OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X
902 OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z 908 OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z
903 OPT_XZ = IF_FEATURE_SEAMLESS_XZ( (1 << OPTBIT_XZ )) + 0, // J 909 OPT_XZ = IF_FEATURE_SEAMLESS_XZ( (1 << OPTBIT_XZ )) + 0, // J
904 OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z 910 OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z
911 OPT_AUTOCOMPRESS_BY_EXT = 1 << OPTBIT_AUTOCOMPRESS_BY_EXT, // a
905 OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m 912 OPT_NOPRESERVE_TIME = IF_FEATURE_TAR_NOPRESERVE_TIME((1 << OPTBIT_NOPRESERVE_TIME)) + 0, // m
906 OPT_STRIP_COMPONENTS = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_STRIP_COMPONENTS)) + 0, // strip-components 913 OPT_STRIP_COMPONENTS = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_STRIP_COMPONENTS)) + 0, // strip-components
914 OPT_LZMA = IF_FEATURE_TAR_LONG_OPTIONS(IF_FEATURE_SEAMLESS_LZMA((1 << OPTBIT_LZMA))) + 0, // lzma
907 OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion 915 OPT_NORECURSION = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NORECURSION )) + 0, // no-recursion
908 OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command 916 OPT_2COMMAND = IF_FEATURE_TAR_TO_COMMAND( (1 << OPTBIT_2COMMAND )) + 0, // to-command
909 OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner 917 OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner
@@ -933,9 +941,6 @@ static const char tar_longopts[] ALIGN1 =
933# if ENABLE_FEATURE_SEAMLESS_BZ2 941# if ENABLE_FEATURE_SEAMLESS_BZ2
934 "bzip2\0" No_argument "j" 942 "bzip2\0" No_argument "j"
935# endif 943# endif
936# if ENABLE_FEATURE_SEAMLESS_LZMA
937 "lzma\0" No_argument "a"
938# endif
939# if ENABLE_FEATURE_TAR_FROM 944# if ENABLE_FEATURE_TAR_FROM
940 "files-from\0" Required_argument "T" 945 "files-from\0" Required_argument "T"
941 "exclude-from\0" Required_argument "X" 946 "exclude-from\0" Required_argument "X"
@@ -949,10 +954,14 @@ static const char tar_longopts[] ALIGN1 =
949# if ENABLE_FEATURE_SEAMLESS_Z 954# if ENABLE_FEATURE_SEAMLESS_Z
950 "compress\0" No_argument "Z" 955 "compress\0" No_argument "Z"
951# endif 956# endif
957 "auto-compress\0" No_argument "a"
952# if ENABLE_FEATURE_TAR_NOPRESERVE_TIME 958# if ENABLE_FEATURE_TAR_NOPRESERVE_TIME
953 "touch\0" No_argument "m" 959 "touch\0" No_argument "m"
954# endif 960# endif
955 "strip-components\0" Required_argument "\xf9" 961 "strip-components\0" Required_argument "\xf8"
962# if ENABLE_FEATURE_SEAMLESS_LZMA
963 "lzma\0" No_argument "\xf9"
964# endif
956 "no-recursion\0" No_argument "\xfa" 965 "no-recursion\0" No_argument "\xfa"
957# if ENABLE_FEATURE_TAR_TO_COMMAND 966# if ENABLE_FEATURE_TAR_TO_COMMAND
958 "to-command\0" Required_argument "\xfb" 967 "to-command\0" Required_argument "\xfb"
@@ -1041,13 +1050,13 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
1041 "txC:f:Oopvk" 1050 "txC:f:Oopvk"
1042 IF_FEATURE_TAR_CREATE( "ch" ) 1051 IF_FEATURE_TAR_CREATE( "ch" )
1043 IF_FEATURE_SEAMLESS_BZ2( "j" ) 1052 IF_FEATURE_SEAMLESS_BZ2( "j" )
1044 IF_FEATURE_SEAMLESS_LZMA("a" )
1045 IF_FEATURE_TAR_FROM( "T:*X:*") 1053 IF_FEATURE_TAR_FROM( "T:*X:*")
1046 IF_FEATURE_SEAMLESS_GZ( "z" ) 1054 IF_FEATURE_SEAMLESS_GZ( "z" )
1047 IF_FEATURE_SEAMLESS_XZ( "J" ) 1055 IF_FEATURE_SEAMLESS_XZ( "J" )
1048 IF_FEATURE_SEAMLESS_Z( "Z" ) 1056 IF_FEATURE_SEAMLESS_Z( "Z" )
1057 "a"
1049 IF_FEATURE_TAR_NOPRESERVE_TIME("m") 1058 IF_FEATURE_TAR_NOPRESERVE_TIME("m")
1050 IF_FEATURE_TAR_LONG_OPTIONS("\xf9:") // --strip-components 1059 IF_FEATURE_TAR_LONG_OPTIONS("\xf8:") // --strip-components
1051 "\0" 1060 "\0"
1052 "tt:vv:" // count -t,-v 1061 "tt:vv:" // count -t,-v
1053#if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM 1062#if ENABLE_FEATURE_TAR_LONG_OPTIONS && ENABLE_FEATURE_TAR_FROM
@@ -1076,7 +1085,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
1076 ); 1085 );
1077#if DBG_OPTION_PARSING 1086#if DBG_OPTION_PARSING
1078 bb_error_msg("opt: 0x%08x", opt); 1087 bb_error_msg("opt: 0x%08x", opt);
1079# define showopt(o) bb_error_msg("opt & %s(%x): %x", #o, o, opt & o); 1088# define showopt(o) bb_error_msg("opt & %s(%x):\t%x", #o, o, opt & o);
1080 showopt(OPT_TEST ); 1089 showopt(OPT_TEST );
1081 showopt(OPT_EXTRACT ); 1090 showopt(OPT_EXTRACT );
1082 showopt(OPT_BASEDIR ); 1091 showopt(OPT_BASEDIR );
@@ -1089,14 +1098,15 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
1089 showopt(OPT_CREATE ); 1098 showopt(OPT_CREATE );
1090 showopt(OPT_DEREFERENCE ); 1099 showopt(OPT_DEREFERENCE );
1091 showopt(OPT_BZIP2 ); 1100 showopt(OPT_BZIP2 );
1092 showopt(OPT_LZMA );
1093 showopt(OPT_INCLUDE_FROM ); 1101 showopt(OPT_INCLUDE_FROM );
1094 showopt(OPT_EXCLUDE_FROM ); 1102 showopt(OPT_EXCLUDE_FROM );
1095 showopt(OPT_GZIP ); 1103 showopt(OPT_GZIP );
1096 showopt(OPT_XZ ); 1104 showopt(OPT_XZ );
1097 showopt(OPT_COMPRESS ); 1105 showopt(OPT_COMPRESS );
1106 showopt(OPT_AUTOCOMPRESS_BY_EXT);
1098 showopt(OPT_NOPRESERVE_TIME ); 1107 showopt(OPT_NOPRESERVE_TIME );
1099 showopt(OPT_STRIP_COMPONENTS); 1108 showopt(OPT_STRIP_COMPONENTS);
1109 showopt(OPT_LZMA );
1100 showopt(OPT_NORECURSION ); 1110 showopt(OPT_NORECURSION );
1101 showopt(OPT_2COMMAND ); 1111 showopt(OPT_2COMMAND );
1102 showopt(OPT_NUMERIC_OWNER ); 1112 showopt(OPT_NUMERIC_OWNER );
@@ -1187,7 +1197,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
1187 if (opt & OPT_CREATE) { 1197 if (opt & OPT_CREATE) {
1188 /* Make sure there is at least one file to tar up */ 1198 /* Make sure there is at least one file to tar up */
1189 if (tar_handle->accept == NULL) 1199 if (tar_handle->accept == NULL)
1190 bb_error_msg_and_die("empty archive"); 1200 bb_simple_error_msg_and_die("empty archive");
1191 1201
1192 tar_fd = STDOUT_FILENO; 1202 tar_fd = STDOUT_FILENO;
1193 /* Mimicking GNU tar 1.15.1: */ 1203 /* Mimicking GNU tar 1.15.1: */
@@ -1215,6 +1225,21 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
1215 bb_perror_msg_and_die("can't open '%s'", tar_filename); 1225 bb_perror_msg_and_die("can't open '%s'", tar_filename);
1216 } else { 1226 } else {
1217 tar_handle->src_fd = xopen(tar_filename, flags); 1227 tar_handle->src_fd = xopen(tar_filename, flags);
1228#if ENABLE_FEATURE_TAR_CREATE
1229 if ((OPT_GZIP | OPT_BZIP2 | OPT_XZ | OPT_LZMA) != 0 /* at least one is config-enabled */
1230 && (opt & OPT_AUTOCOMPRESS_BY_EXT)
1231 && flags != O_RDONLY
1232 ) {
1233 if (OPT_GZIP != 0 && is_suffixed_with(tar_filename, "gz"))
1234 opt |= OPT_GZIP;
1235 if (OPT_BZIP2 != 0 && is_suffixed_with(tar_filename, "bz2"))
1236 opt |= OPT_BZIP2;
1237 if (OPT_XZ != 0 && is_suffixed_with(tar_filename, "xz"))
1238 opt |= OPT_XZ;
1239 if (OPT_LZMA != 0 && is_suffixed_with(tar_filename, "lzma"))
1240 opt |= OPT_LZMA;
1241 }
1242#endif
1218 } 1243 }
1219 } 1244 }
1220 1245