help-tar
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-tar] Global header contents as environment variables of the ex


From: Sergey Poznyakoff
Subject: Re: [Help-tar] Global header contents as environment variables of the external program called with --to-command option
Date: Tue, 25 Feb 2014 21:24:37 +0200

Dmitry Ivankov <address@hidden> ha escrit:

> appears as environment variable
> "TAR_HEADER_ORG.project.property" which is incorrect name. I believe
> there are also other forbidden symbols (except '.') to use in a header
> keyword name.

Yes, you are right.  Replacing dots with some other character does not
seem a feasible solution, so it would be better to revamp the
implementation as in the attached patch (don't forget to revert
the previous one before applying it).

Regards,
Sergey

>From 27d8eee06203d37da741d85c4c42ad5cb78384d8 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <address@hidden>
Date: Tue, 25 Feb 2014 21:13:38 +0200
Subject: [PATCH] Pass extended global headers to the environment of
 --to-command and --checkpoint

* NEWS: Update.
* doc/tar.1: Document TAR_HEADER_ envars.
* doc/tar.texi: Likewise.
* src/common.h (xheader_iterate_global): New prototype.
* src/system.c (stat_to_env): Call xheader_iterate_global
to pass global headers to the environment.
* src/xheader.c (xheader_iterate_global): New function.
---
 NEWS          | 13 +++++++++++--
 doc/tar.1     | 15 +++++++++++++--
 doc/tar.texi  | 38 ++++++++++++++++++++++++++++++++++++++
 src/common.h  |  2 ++
 src/system.c  | 19 +++++++++++++++++++
 src/xheader.c | 11 +++++++++++
 6 files changed, 94 insertions(+), 4 deletions(-)

diff --git a/NEWS b/NEWS
index fa24142..67d53a3 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU tar NEWS - User visible changes. 2014-02-21
+GNU tar NEWS - User visible changes. 2014-02-25
 Please send GNU tar bug reports to <address@hidden>

 
@@ -67,7 +67,16 @@ speed up archivation.
 This release includes official tar(1) and rmt(8) manpages.
 Distribution maintainers are kindly asked to use these instead of the
 home-made pages they provided so far.
-
+
+* Environment variables for --to-command and --checkpoint options
+
+If the archive being processed is a POSIX.1-2001 archive with global
+extended headers, the number of these headers is passed in the
+environment variable TAR_HEADER_COUNT.  The name and value of each
+header are passed in variables TAR_HEADER_NAME_<n> and
+TAR_HEADER_VALUE_<n>, correspondingly, where <n> is the ordinal
+number of that header (starting at 0).
+
 
 version 1.27.1 - Sergey Poznyakoff, 2013-11-17

diff --git a/doc/tar.1 b/doc/tar.1
index cd133d9..ef0315c 100644
--- a/doc/tar.1
+++ b/doc/tar.1
@@ -13,7 +13,7 @@
 .\"
 .\" You should have received a copy of the GNU General Public License
 .\" along with this program.  If not, see <http://www.gnu.org/licenses/>.
-.TH TAR 1 "February 22, 2014" "TAR" "GNU TAR Manual"
+.TH TAR 1 "February 25, 2014" "TAR" "GNU TAR Manual"
 .SH NAME
 tar \- an archiving utility
 .SH SYNOPSIS
@@ -448,9 +448,20 @@ Format of the archive being processed.  One of:
 .BR posix ,
 .BR ustar ,
 .BR v7 .
+.TP
 .B TAR_SUBCOMMAND
 A short option (with a leading dash) describing the operation \fBtar\fR is
-executing.
+executing.
+.TP
+\fBTAR_HEADER_COUNT
+Number of global extended headers in the archive (only for
+POSIX.1-2001 archives).
+.TP
+\fBTAR_HEADER_NAME_\fIN\fR
+Name of the \fIN\fRth extended header (\fIN\fR starts at 0).
+.TP
+\fBTAR_HEADER_VALUE_\fIN\fR
+Value of the \fIN\fRth extended header.
 .RE
 .SS Handling of file attributes
 .TP
diff --git a/doc/tar.texi b/doc/tar.texi
index e3df0c9..c8d521b 100644
--- a/doc/tar.texi
+++ b/doc/tar.texi
@@ -4196,6 +4196,25 @@ Format of the archive being processed. @xref{Formats}, 
for a complete
 list of archive format names.
 @end table

address@hidden TAR_HEADER_COUNT, checkpoint script environment
+If the archive being processed is a POSIX.1-2001 archive
+(@pxref{posix}) with global extended headers, these headers
+are passed to the environment in the following way.  The
+variable @env{TAR_HEADER_COUNT} is set to the total
+number of headers.  The headers are assigned ordinal numbers
+starting from 0.  Then, two environment variables are
+created for each header (@var{n} stands for the header ordinal
+number):
+
address@hidden @env
address@hidden address@hidden, checkpoint script environment
address@hidden address@hidden
+The name of the @var{n}th variable.
address@hidden address@hidden, checkpoint script environment
address@hidden address@hidden
+The value of the @var{n}th variable.
address@hidden table
+
 These environment variables can also be passed as arguments to the
 command, provided that they are properly escaped, for example:

@@ -5778,6 +5797,25 @@ Format of the archive being processed. @xref{Formats}, 
for a complete
 list of archive format names.
 @end table

address@hidden TAR_HEADER_COUNT, checkpoint script environment
+If the archive being processed is a POSIX.1-2001 archive
+(@pxref{posix}) with global extended headers, these headers
+are passed to the environment in the following way.  The
+variable @env{TAR_HEADER_COUNT} is set to the total
+number of headers.  The headers are assigned ordinal numbers
+starting from 0.  Then, two environment variables are
+created for each header (@var{n} stands for the header ordinal
+number):
+
address@hidden @env
address@hidden address@hidden, to-command environment
address@hidden address@hidden
+The name of the @var{n}th variable.
address@hidden address@hidden, to-command environment
address@hidden address@hidden
+The value of the @var{n}th variable.
address@hidden table
+
 These variables are defined prior to executing the command, so you can
 pass them as arguments, if you prefer.  For example, if the command
 @var{proc} takes the member name and size as its arguments, then you
diff --git a/src/common.h b/src/common.h
index edf787c..c11db69 100644
--- a/src/common.h
+++ b/src/common.h
@@ -784,6 +784,8 @@ void update_archive (void);

 void xheader_decode (struct tar_stat_info *stat);
 void xheader_decode_global (struct xheader *xhdr);
+void xheader_iterate_global (int (*fn) (const char *, const char *, void *),
+                            void *);
 void xheader_store (char const *keyword, struct tar_stat_info *st,
                    void const *data);
 void xheader_read (struct xheader *xhdr, union block *header, off_t size);
diff --git a/src/system.c b/src/system.c
index 9414233..d21aa47 100644
--- a/src/system.c
+++ b/src/system.c
@@ -672,9 +672,25 @@ chr_to_env (char const *envar, char c)
     xalloc_die ();
 }

+static int
+hdr_to_env (const char *name, const char *value, void *data)
+{
+  unsigned long *n = data;
+  char *var = xasprintf ("TAR_HEADER_NAME_%lu", *n);
+  str_to_env (var, name);
+  free (var);
+  var = xasprintf ("TAR_HEADER_VALUE_%lu", *n);
+  str_to_env (var, value);
+  free (var);
+  ++*n;
+  return 0;
+}
+
 static void
 stat_to_env (char *name, char type, struct tar_stat_info *st)
 {
+  unsigned long hc = 0;
+
   str_to_env ("TAR_VERSION", PACKAGE_VERSION);
   str_to_env ("TAR_ARCHIVE", *archive_name_cursor);
   dec_to_env ("TAR_VOLUME", archive_name_cursor - archive_name_array + 1);
@@ -695,6 +711,9 @@ stat_to_env (char *name, char type, struct tar_stat_info 
*st)
   dec_to_env ("TAR_UID", st->stat.st_uid);
   dec_to_env ("TAR_GID", st->stat.st_gid);

+  xheader_iterate_global (hdr_to_env, &hc);
+  dec_to_env ("TAR_HEADER_COUNT", hc);
+
   switch (type)
     {
     case 'b':
diff --git a/src/xheader.c b/src/xheader.c
index c94c6d3..3858126 100644
--- a/src/xheader.c
+++ b/src/xheader.c
@@ -782,6 +782,17 @@ xheader_decode_global (struct xheader *xhdr)
     }
 }

+void
+xheader_iterate_global (int (*fn) (const char *, const char *, void *),
+                       void *data)
+{
+  struct keyword_list *kp;
+  for (kp = global_header_override_list; kp; kp = kp->next)
+    if (fn (kp->pattern, kp->value, data))
+      break;
+}
+
+
 static void
 xheader_init (struct xheader *xhdr)
 {
--
1.7.12.1


reply via email to

[Prev in Thread] Current Thread [Next in Thread]