tar: fix "tar -cJ" ignoring -J option. closes 7706
function old new delta tar_main 895 938 +43 vfork_compressor 206 191 -15 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 43/-15) Total: 28 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
d598a8d4e6
commit
acb8be7217
@ -160,13 +160,6 @@
|
|||||||
#define block_buf bb_common_bufsiz1
|
#define block_buf bb_common_bufsiz1
|
||||||
|
|
||||||
|
|
||||||
#if !ENABLE_FEATURE_SEAMLESS_GZ && !ENABLE_FEATURE_SEAMLESS_BZ2
|
|
||||||
/* Do not pass gzip flag to writeTarFile() */
|
|
||||||
#define writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude, gzip) \
|
|
||||||
writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if ENABLE_FEATURE_TAR_CREATE
|
#if ENABLE_FEATURE_TAR_CREATE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -621,21 +614,12 @@ static int FAST_FUNC writeFileToTarball(const char *fileName, struct stat *statb
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2
|
#if SEAMLESS_COMPRESSION
|
||||||
# if !(ENABLE_FEATURE_SEAMLESS_GZ && ENABLE_FEATURE_SEAMLESS_BZ2)
|
|
||||||
# define vfork_compressor(tar_fd, gzip) vfork_compressor(tar_fd)
|
|
||||||
# endif
|
|
||||||
/* Don't inline: vfork scares gcc and pessimizes code */
|
/* Don't inline: vfork scares gcc and pessimizes code */
|
||||||
static void NOINLINE vfork_compressor(int tar_fd, int gzip)
|
static void NOINLINE vfork_compressor(int tar_fd, const char *gzip)
|
||||||
{
|
{
|
||||||
pid_t gzipPid;
|
pid_t gzipPid;
|
||||||
# if ENABLE_FEATURE_SEAMLESS_GZ && ENABLE_FEATURE_SEAMLESS_BZ2
|
|
||||||
const char *zip_exec = (gzip == 1) ? "gzip" : "bzip2";
|
|
||||||
# elif ENABLE_FEATURE_SEAMLESS_GZ
|
|
||||||
const char *zip_exec = "gzip";
|
|
||||||
# else /* only ENABLE_FEATURE_SEAMLESS_BZ2 */
|
|
||||||
const char *zip_exec = "bzip2";
|
|
||||||
# endif
|
|
||||||
// On Linux, vfork never unpauses parent early, although standard
|
// On Linux, vfork never unpauses parent early, although standard
|
||||||
// allows for that. Do we want to waste bytes checking for it?
|
// allows for that. Do we want to waste bytes checking for it?
|
||||||
# define WAIT_FOR_CHILD 0
|
# define WAIT_FOR_CHILD 0
|
||||||
@ -649,11 +633,6 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip)
|
|||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
|
signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
|
||||||
|
|
||||||
# if defined(__GNUC__) && __GNUC__
|
|
||||||
/* Avoid vfork clobbering */
|
|
||||||
(void) &zip_exec;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
gzipPid = xvfork();
|
gzipPid = xvfork();
|
||||||
|
|
||||||
if (gzipPid == 0) {
|
if (gzipPid == 0) {
|
||||||
@ -669,7 +648,7 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip)
|
|||||||
xmove_fd(gzipDataPipe.rd, 0);
|
xmove_fd(gzipDataPipe.rd, 0);
|
||||||
xmove_fd(tar_fd, 1);
|
xmove_fd(tar_fd, 1);
|
||||||
/* exec gzip/bzip2 program/applet */
|
/* exec gzip/bzip2 program/applet */
|
||||||
BB_EXECLP(zip_exec, zip_exec, "-f", (char *)0);
|
BB_EXECLP(gzip, gzip, "-f", (char *)0);
|
||||||
vfork_exec_errno = errno;
|
vfork_exec_errno = errno;
|
||||||
_exit(EXIT_FAILURE);
|
_exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -692,16 +671,21 @@ static void NOINLINE vfork_compressor(int tar_fd, int gzip)
|
|||||||
# endif
|
# endif
|
||||||
if (vfork_exec_errno) {
|
if (vfork_exec_errno) {
|
||||||
errno = vfork_exec_errno;
|
errno = vfork_exec_errno;
|
||||||
bb_perror_msg_and_die("can't execute '%s'", zip_exec);
|
bb_perror_msg_and_die("can't execute '%s'", gzip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2 */
|
#endif /* SEAMLESS_COMPRESSION */
|
||||||
|
|
||||||
|
|
||||||
|
#if !SEAMLESS_COMPRESSION
|
||||||
|
/* Do not pass gzip flag to writeTarFile() */
|
||||||
|
#define writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude, gzip) \
|
||||||
|
writeTarFile(tar_fd, verboseFlag, recurseFlags, include, exclude)
|
||||||
|
#endif
|
||||||
/* gcc 4.2.1 inlines it, making code bigger */
|
/* gcc 4.2.1 inlines it, making code bigger */
|
||||||
static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
|
static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
|
||||||
int recurseFlags, const llist_t *include,
|
int recurseFlags, const llist_t *include,
|
||||||
const llist_t *exclude, int gzip)
|
const llist_t *exclude, const char *gzip)
|
||||||
{
|
{
|
||||||
int errorFlag = FALSE;
|
int errorFlag = FALSE;
|
||||||
struct TarBallInfo tbInfo;
|
struct TarBallInfo tbInfo;
|
||||||
@ -714,7 +698,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
|
|||||||
* can avoid including the tarball into itself.... */
|
* can avoid including the tarball into itself.... */
|
||||||
xfstat(tbInfo.tarFd, &tbInfo.tarFileStatBuf, "can't stat tar file");
|
xfstat(tbInfo.tarFd, &tbInfo.tarFileStatBuf, "can't stat tar file");
|
||||||
|
|
||||||
#if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2
|
#if SEAMLESS_COMPRESSION
|
||||||
if (gzip)
|
if (gzip)
|
||||||
vfork_compressor(tbInfo.tarFd, gzip);
|
vfork_compressor(tbInfo.tarFd, gzip);
|
||||||
#endif
|
#endif
|
||||||
@ -749,7 +733,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
|
|||||||
if (errorFlag)
|
if (errorFlag)
|
||||||
bb_error_msg("error exit delayed from previous errors");
|
bb_error_msg("error exit delayed from previous errors");
|
||||||
|
|
||||||
#if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2
|
#if SEAMLESS_COMPRESSION
|
||||||
if (gzip) {
|
if (gzip) {
|
||||||
int status;
|
int status;
|
||||||
if (safe_waitpid(-1, &status, 0) == -1)
|
if (safe_waitpid(-1, &status, 0) == -1)
|
||||||
@ -764,7 +748,7 @@ static NOINLINE int writeTarFile(int tar_fd, int verboseFlag,
|
|||||||
#else
|
#else
|
||||||
int writeTarFile(int tar_fd, int verboseFlag,
|
int writeTarFile(int tar_fd, int verboseFlag,
|
||||||
int recurseFlags, const llist_t *include,
|
int recurseFlags, const llist_t *include,
|
||||||
const llist_t *exclude, int gzip);
|
const llist_t *exclude, const char *gzip);
|
||||||
#endif /* FEATURE_TAR_CREATE */
|
#endif /* FEATURE_TAR_CREATE */
|
||||||
|
|
||||||
#if ENABLE_FEATURE_TAR_FROM
|
#if ENABLE_FEATURE_TAR_FROM
|
||||||
@ -1149,18 +1133,24 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
if (base_dir)
|
if (base_dir)
|
||||||
xchdir(base_dir);
|
xchdir(base_dir);
|
||||||
|
|
||||||
//if (SEAMLESS_COMPRESSION || OPT_COMPRESS)
|
//if (SEAMLESS_COMPRESSION)
|
||||||
// /* We need to know whether child (gzip/bzip/etc) exits abnormally */
|
// /* We need to know whether child (gzip/bzip/etc) exits abnormally */
|
||||||
// signal(SIGCHLD, check_errors_in_children);
|
// signal(SIGCHLD, check_errors_in_children);
|
||||||
|
|
||||||
/* Create an archive */
|
/* Create an archive */
|
||||||
if (opt & OPT_CREATE) {
|
if (opt & OPT_CREATE) {
|
||||||
#if ENABLE_FEATURE_SEAMLESS_GZ || ENABLE_FEATURE_SEAMLESS_BZ2
|
#if SEAMLESS_COMPRESSION
|
||||||
int zipMode = 0;
|
const char *zipMode = NULL;
|
||||||
if (ENABLE_FEATURE_SEAMLESS_GZ && (opt & OPT_GZIP))
|
if (opt & OPT_COMPRESS)
|
||||||
zipMode = 1;
|
zipMode = "compress";
|
||||||
if (ENABLE_FEATURE_SEAMLESS_BZ2 && (opt & OPT_BZIP2))
|
if (opt & OPT_GZIP)
|
||||||
zipMode = 2;
|
zipMode = "gzip";
|
||||||
|
if (opt & OPT_BZIP2)
|
||||||
|
zipMode = "bzip2";
|
||||||
|
if (opt & OPT_LZMA)
|
||||||
|
zipMode = "lzma";
|
||||||
|
if (opt & OPT_XZ)
|
||||||
|
zipMode = "xz";
|
||||||
#endif
|
#endif
|
||||||
/* NB: writeTarFile() closes tar_handle->src_fd */
|
/* NB: writeTarFile() closes tar_handle->src_fd */
|
||||||
return writeTarFile(tar_handle->src_fd, verboseFlag,
|
return writeTarFile(tar_handle->src_fd, verboseFlag,
|
||||||
|
Loading…
Reference in New Issue
Block a user