Interesting. Can we take bath approaches? Is there a reason to not expose either error?
> pax does not exit with an error if the processed > archive is truncated: > > # (cd / && tar zcf - bsd | dd count=128 2>/dev/null | tar tzf -) > bsd > gzip: stdin: Input/output error > tar: End of archive volume 1 reached > gzip: stdout: Broken pipe > tar: Failed write to archive volume: 1: Broken pipe > # echo $? > 0 > > > There's two ways to fix this. > 1) take the exit code of gzip into account: > > Index: ar_io.c > =================================================================== > RCS file: /cvs/src/bin/pax/ar_io.c,v > retrieving revision 1.44 > diff -u -p -p -u -r1.44 ar_io.c > --- ar_io.c 11 Jan 2014 05:36:26 -0000 1.44 > +++ ar_io.c 28 Mar 2014 14:09:37 -0000 > @@ -337,8 +337,11 @@ ar_close(void) > (void)close(arfd); > > /* Do not exit before child to ensure data integrity */ > - if (zpid > 0) > + if (zpid > 0) { > waitpid(zpid, &status, 0); > + if (WIFEXITED(status) && WEXITSTATUS(status)) > + exit_val = 1; > + } > > if (vflag && (artyp == ISTAPE)) { > (void)fputs("done.\n", listf); > > 2) > call paxwarn with 1 on truncated reads. > Which will also work for non-gzipped tar files. > > Index: ar_io.c > =================================================================== > RCS file: /cvs/src/bin/pax/ar_io.c,v > retrieving revision 1.44 > diff -u -p -p -u -r1.44 ar_io.c > --- ar_io.c 11 Jan 2014 05:36:26 -0000 1.44 > +++ ar_io.c 3 Apr 2014 22:04:07 -0000 > @@ -567,7 +570,7 @@ ar_read(char *buf, int cnt) > if (res < 0) > syswarn(1, errno, "Failed read on archive volume %d", arvol); > else > - paxwarn(0, "End of archive volume %d reached", arvol); > + paxwarn(1, "End of archive volume %d reached", arvol); > return(res); > } > > Is there a historic reason for this? >