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