POSIX extended format headers do not include PID by default

The intent is to make binary-equivalent PAX archives easy to create.  If
POSIXLY_CORRECT is set, the POSIX standard default is used, which embeds
the pid.

* src/common.h (posixly_correct): New global.
* src/tar.c (decode_options): Detect the POSIXLY_CORRECT environment
variable.
* src/buffer.c (add_chunk_header): Change filenames of multipart files to
omit the pid.
* src/xheader.c (HEADER_TEMPLATE): New macro.
(xheader_xhdr_name, xheader_ghdr_name): Use HEADER_TEMPLATE to select
the template for the POSIX extended header name.
* doc/tar.texi: Document the change.

Signed-off-by: Zachary Vance <za3k@za3k.com>
This commit is contained in:
Zachary Vance
2019-03-28 13:37:07 +02:00
committed by Sergey Poznyakoff
parent 66162927eb
commit ef0f882382
5 changed files with 73 additions and 27 deletions
+1 -1
View File
@@ -1731,7 +1731,7 @@ add_chunk_header (struct bufmap *map)
st.stat.st_uid = getuid ();
st.stat.st_gid = getgid ();
st.orig_file_name = xheader_format_name (&st,
"%d/GNUFileParts.%p/%f.%n",
"%d/GNUFileParts/%f.%n",
volno);
st.file_name = st.orig_file_name;
st.archive_file_size = st.stat.st_size = map->sizeleft;
+3
View File
@@ -340,6 +340,9 @@ GLOBAL const char *volume_label_option;
/* Other global variables. */
/* Force POSIX-compliance */
GLOBAL bool posixly_correct;
/* File descriptor for archive file. */
GLOBAL int archive;
+2
View File
@@ -2230,6 +2230,8 @@ decode_options (int argc, char **argv)
args.version_control_string = 0;
args.compress_autodetect = false;
posixly_correct = getenv ("POSIXLY_CORRECT") != NULL;
subcommand_option = UNKNOWN_SUBCOMMAND;
archive_format = DEFAULT_FORMAT;
blocking_factor = DEFAULT_BLOCKING;
+22 -5
View File
@@ -369,29 +369,46 @@ xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n)
return buf;
}
/* Table of templates for the names of POSIX extended headers.
Indexed by the the type of the header (per-file or global)
and POSIX compliance mode (0 or q depending on whether
POSIXLY_CORRECT environment variable is set. */
static const char *header_template[][2] = {
/* Individual header templates: */
{ "%d/PaxHeaders/%f", "%d/PaxHeaders.%p/%f" },
/* Global header templates: */
{ "/GlobalHead.%n", "/GlobalHead.%p.%n" }
};
/* Indices to the above table */
enum {
pax_file_header,
pax_global_header
};
/* Return the name for the POSIX extended header T */
#define HEADER_TEMPLATE(t) header_template[t][posixly_correct]
char *
xheader_xhdr_name (struct tar_stat_info *st)
{
if (!exthdr_name)
assign_string (&exthdr_name, "%d/PaxHeaders.%p/%f");
assign_string (&exthdr_name, HEADER_TEMPLATE (pax_file_header));
return xheader_format_name (st, exthdr_name, 0);
}
#define GLOBAL_HEADER_TEMPLATE "/GlobalHead.%p.%n"
char *
xheader_ghdr_name (void)
{
if (!globexthdr_name)
{
size_t len;
const char *global_header_template = HEADER_TEMPLATE (pax_global_header);
const char *tmp = getenv ("TMPDIR");
if (!tmp)
tmp = "/tmp";
len = strlen (tmp) + sizeof (GLOBAL_HEADER_TEMPLATE); /* Includes nul */
len = strlen (tmp) + strlen (global_header_template) + 1;
globexthdr_name = xmalloc (len);
strcpy(globexthdr_name, tmp);
strcat(globexthdr_name, GLOBAL_HEADER_TEMPLATE);
strcat(globexthdr_name, global_header_template);
}
return xheader_format_name (NULL, globexthdr_name, global_header_count + 1);