On 10/19 09:34, Jeremy Evans wrote:
> Currently, when creating an archive file with pax(1), pax will attempt
> to open a file even if the file will be skipped due to an -s
> replacement with the empty string. With this change, pax will not
> attempt to open files that it knows will be skipped.
> 
> When doing direct copies to a directory (-rw), pax already skips
> the file before attempting to open it. So this makes the behavior
> more consistent.
> 
> My main reason for this change is to be able to silence the following
> warning when backing up:
> 
>   pax: Unable to open /etc/spwd.db to read: Operation not permitted
> 
> One other possible benefit is if you are skipping a lot of files,
> avoiding the open syscall for each file may make pax faster.
> 
> OKs?

Ping.  I still think this is worth doing.  I've tested and it is also
measurably faster (25%) if you are excluding a lot of files:

$ doas time obj/pax -f /dev/null -w -x cpio -s '/^.*$//' /some-path
        2.65 real         1.95 user         0.73 sys
$ doas time pax -f /dev/null -w -x cpio -s '/^.*$//' /some-path
        3.34 real         2.04 user         1.30 sys

OKs?

Thanks,
Jeremy

> 
> Jeremy
> 
> Index: ar_subs.c
> ===================================================================
> RCS file: /cvs/src/bin/pax/ar_subs.c,v
> retrieving revision 1.49
> diff -u -p -r1.49 ar_subs.c
> --- ar_subs.c 28 Jun 2019 13:34:59 -0000      1.49
> +++ ar_subs.c 19 Oct 2021 16:05:31 -0000
> @@ -441,6 +441,23 @@ wr_archive(ARCHD *arcn, int is_app)
>               if (hlk && (chk_lnk(arcn) < 0))
>                       break;
>  
> +             /*
> +              * Modify the name as requested by the user
> +              */
> +             if ((res = mod_name(arcn)) < 0) {
> +                     /*
> +                      * pax finished, purge link table entry and stop
> +                      */
> +                     purg_lnk(arcn);
> +                     break;
> +             } else if (res > 0) {
> +                     /*
> +                      * skipping file, purge link table entry
> +                      */
> +                     purg_lnk(arcn);
> +                     continue;
> +             }
> +
>               if (PAX_IS_REG(arcn->type) || (arcn->type == PAX_HRG)) {
>                       /*
>                        * we will have to read this file. by opening it now we
> @@ -456,20 +473,7 @@ wr_archive(ARCHD *arcn, int is_app)
>                       }
>               }
>  
> -             /*
> -              * Now modify the name as requested by the user
> -              */
> -             if ((res = mod_name(arcn)) < 0) {
> -                     /*
> -                      * name modification says to skip this file, close the
> -                      * file and purge link table entry
> -                      */
> -                     rdfile_close(arcn, &fd);
> -                     purg_lnk(arcn);
> -                     break;
> -             }
> -
> -             if ((res > 0) || (docrc && (set_crc(arcn, fd) < 0))) {
> +             if (docrc && (set_crc(arcn, fd) < 0)) {
>                       /*
>                        * unable to obtain the crc we need, close the file,
>                        * purge link table entry

Reply via email to