tar: make source code a bit more terse, no logic changes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
3f2e963768
commit
45d68c3749
@ -596,34 +596,30 @@ static int FAST_FUNC writeFileToTarball(const char *fileName, struct stat *statb
|
|||||||
/* 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, const char *gzip)
|
static void NOINLINE vfork_compressor(int tar_fd, const char *gzip)
|
||||||
{
|
{
|
||||||
pid_t gzipPid;
|
|
||||||
|
|
||||||
// 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
|
||||||
volatile int vfork_exec_errno = 0;
|
volatile int vfork_exec_errno = 0;
|
||||||
struct fd_pair gzipDataPipe;
|
struct fd_pair data;
|
||||||
# if WAIT_FOR_CHILD
|
# if WAIT_FOR_CHILD
|
||||||
struct fd_pair gzipStatusPipe;
|
struct fd_pair status;
|
||||||
xpiped_pair(gzipStatusPipe);
|
xpiped_pair(status);
|
||||||
# endif
|
# endif
|
||||||
xpiped_pair(gzipDataPipe);
|
xpiped_pair(data);
|
||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
|
signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
|
||||||
|
|
||||||
gzipPid = xvfork();
|
if (xvfork() == 0) {
|
||||||
|
|
||||||
if (gzipPid == 0) {
|
|
||||||
/* child */
|
/* child */
|
||||||
/* NB: close _first_, then move fds! */
|
/* NB: close _first_, then move fds! */
|
||||||
close(gzipDataPipe.wr);
|
close(data.wr);
|
||||||
# if WAIT_FOR_CHILD
|
# if WAIT_FOR_CHILD
|
||||||
close(gzipStatusPipe.rd);
|
close(status.rd);
|
||||||
/* gzipStatusPipe.wr will close only on exec -
|
/* status.wr will close only on exec -
|
||||||
* parent waits for this close to happen */
|
* parent waits for this close to happen */
|
||||||
fcntl(gzipStatusPipe.wr, F_SETFD, FD_CLOEXEC);
|
fcntl(status.wr, F_SETFD, FD_CLOEXEC);
|
||||||
# endif
|
# endif
|
||||||
xmove_fd(gzipDataPipe.rd, 0);
|
xmove_fd(data.rd, 0);
|
||||||
xmove_fd(tar_fd, 1);
|
xmove_fd(tar_fd, 1);
|
||||||
/* exec gzip/bzip2 program/applet */
|
/* exec gzip/bzip2 program/applet */
|
||||||
BB_EXECLP(gzip, gzip, "-f", (char *)0);
|
BB_EXECLP(gzip, gzip, "-f", (char *)0);
|
||||||
@ -632,20 +628,18 @@ static void NOINLINE vfork_compressor(int tar_fd, const char *gzip)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* parent */
|
/* parent */
|
||||||
xmove_fd(gzipDataPipe.wr, tar_fd);
|
xmove_fd(data.wr, tar_fd);
|
||||||
close(gzipDataPipe.rd);
|
close(data.rd);
|
||||||
# if WAIT_FOR_CHILD
|
# if WAIT_FOR_CHILD
|
||||||
close(gzipStatusPipe.wr);
|
close(status.wr);
|
||||||
while (1) {
|
while (1) {
|
||||||
char buf;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
/* Wait until child execs (or fails to) */
|
/* Wait until child execs (or fails to) */
|
||||||
n = full_read(gzipStatusPipe.rd, &buf, 1);
|
char buf;
|
||||||
|
int n = full_read(status.rd, &buf, 1);
|
||||||
if (n < 0 /* && errno == EAGAIN */)
|
if (n < 0 /* && errno == EAGAIN */)
|
||||||
continue; /* try it again */
|
continue; /* try it again */
|
||||||
}
|
}
|
||||||
close(gzipStatusPipe.rd);
|
close(status.rd);
|
||||||
# endif
|
# endif
|
||||||
if (vfork_exec_errno) {
|
if (vfork_exec_errno) {
|
||||||
errno = vfork_exec_errno;
|
errno = vfork_exec_errno;
|
||||||
@ -1155,7 +1149,7 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
if (LONE_DASH(tar_filename)) {
|
if (LONE_DASH(tar_filename)) {
|
||||||
tar_handle->src_fd = tar_fd;
|
tar_handle->src_fd = tar_fd;
|
||||||
tar_handle->seek = seek_by_read;
|
tar_handle->seek = seek_by_read;
|
||||||
} else {
|
} else
|
||||||
if (ENABLE_FEATURE_TAR_AUTODETECT
|
if (ENABLE_FEATURE_TAR_AUTODETECT
|
||||||
&& flags == O_RDONLY
|
&& flags == O_RDONLY
|
||||||
&& !(opt & OPT_ANY_COMPRESS)
|
&& !(opt & OPT_ANY_COMPRESS)
|
||||||
@ -1167,7 +1161,6 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
tar_handle->src_fd = xopen(tar_filename, flags);
|
tar_handle->src_fd = xopen(tar_filename, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (base_dir)
|
if (base_dir)
|
||||||
xchdir(base_dir);
|
xchdir(base_dir);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user