From e7b6f8e3aecf2699ecd1e18f905e14a2841c5e00 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Fri, 7 Nov 2014 13:03:18 +0200 Subject: [PATCH] Honor the pax-option overrides when creating archive. Changes proposed by Denis Excoffier. * NEWS: Fix typos. * doc/tar.texi: Fix typos. Improve recipe for creation of binary equivalent archives. * src/create.c (write_extended): Use the value of the --mtime option (if specified) as the default for exthdr.mtime. * src/xheader.c (xheader_store): Create the header if at least one override is supplied in --pax-option. --- NEWS | 6 +++--- doc/tar.texi | 19 ++++++++++++++++++- src/create.c | 2 +- src/xheader.c | 6 +++--- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index 32bc881..c3385f8 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -GNU tar NEWS - User visible changes. 2014-07-27 +GNU tar NEWS - User visible changes. 2014-11-07 Please send GNU tar bug reports to @@ -369,7 +369,7 @@ Modification times in ustar header blocks of extended headers are set to mtimes of the corresponding archive members. This can be overridden by the - --pax-opion='exthdr.mtime=STRING' + --pax-option='exthdr.mtime=STRING' command line option. The STRING is either number of seconds since the Epoch or a "Time reference" (see below). @@ -379,7 +379,7 @@ headers are set to the time when tar was invoked. This can be overridden by the - --pax-opion='globexthdr.mtime=STRING' + --pax-option='globexthdr.mtime=STRING' command line option. The STRING is either number of seconds since the Epoch or a "Time reference" (see below). diff --git a/doc/tar.texi b/doc/tar.texi index 0adcfc0..119ae16 100644 --- a/doc/tar.texi +++ b/doc/tar.texi @@ -9930,7 +9930,8 @@ will use the following default value: This keyword defines the value of the @samp{mtime} field that is written into the ustar header blocks for the extended headers. By default, the @samp{mtime} field is set to the modification time -of the archive member described by that extended headers. +of the archive member described by that extended header (or to the +value of the @option{--mtime} option, if supplied). @item globexthdr.name=@var{string} This keyword allows user control over the name that is written into @@ -10023,6 +10024,22 @@ same contents: --pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0 @end smallexample +@noindent +If you extract files from such an archive and recreate the archive +from them, you will also need to eliminate changes due to ctime, as +shown in examples below: + +@smallexample +--pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0,ctime:=0 +@end smallexample + +@noindent +or + +@smallexample +--pax-option=exthdr.name=%d/PaxHeaders/%f,atime:=0,delete=ctime +@end smallexample + @node Checksumming @subsection Checksumming Problems diff --git a/src/create.c b/src/create.c index e2f4ede..0d1a5ff 100644 --- a/src/create.c +++ b/src/create.c @@ -706,7 +706,7 @@ write_extended (bool global, struct tar_stat_info *st, union block *old_header) { type = XHDTYPE; p = xheader_xhdr_name (st); - t = st->stat.st_mtime; + t = set_mtime_option ? mtime_option.tv_sec : st->stat.st_mtime; } xheader_write (type, p, t, &st->xhdr); free (p); diff --git a/src/xheader.c b/src/xheader.c index 361f684..b7a54a6 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -813,11 +813,11 @@ xheader_store (char const *keyword, struct tar_stat_info *st, t = locate_handler (keyword); if (!t || !t->coder) return; - if (xheader_keyword_deleted_p (keyword) - || xheader_keyword_override_p (keyword)) + if (xheader_keyword_deleted_p (keyword)) return; xheader_init (&st->xhdr); - t->coder (st, keyword, &st->xhdr, data); + if (!xheader_keyword_override_p (keyword)) + t->coder (st, keyword, &st->xhdr, data); } void -- 2.44.0