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?
> 

Reply via email to