aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/cpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/posix/cpio.c')
-rw-r--r--toys/posix/cpio.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/toys/posix/cpio.c b/toys/posix/cpio.c
index 312bb939..a442f0d1 100644
--- a/toys/posix/cpio.c
+++ b/toys/posix/cpio.c
@@ -82,12 +82,15 @@ void cpio_main(void)
// In passthrough mode, parent stays in original dir and generates archive
// to pipe, child does chdir to new dir and reads archive from stdin (pipe).
if (TT.pass) {
- if (!(pid = xpopen(0, &pipe, 0))) {
+ if (toys.stacktop) {
+ // xpopen() doesn't return from child due to vfork(), instead restarts
+ // with !toys.stacktop
+ pid = xpopen(0, &pipe, 0);
+ afd = pipe;
+ } else {
+ // child
toys.optflags |= FLAG_i;
xchdir(TT.pass);
- } else {
- toys.optflags |= FLAG_o;
- afd = pipe;
}
}