Package: tar
Version: 1.27-1
Severity: normal
Tags: patch

As discussed in #726963, here is a patch to make tar be able to
replicate the 1.26 output.

-- 
see shy jo
From e36454201ec81374bf4d2d09877e6c345a6fddab Mon Sep 17 00:00:00 2001
From: Joey Hess <[email protected]>
Date: Sun, 27 Oct 2013 13:16:52 -0400
Subject: [PATCH] add PRISTINE_TAR_COMPAT

---
 debian/patches/longlink-hack.diff |  72 -------------------------
 debian/patches/pristine-tar.diff  | 108 ++++++++++++++++++++++++++++++++++++++
 debian/patches/series             |   2 +-
 3 files changed, 109 insertions(+), 73 deletions(-)
 delete mode 100644 debian/patches/longlink-hack.diff
 create mode 100644 debian/patches/pristine-tar.diff

diff --git a/debian/patches/longlink-hack.diff b/debian/patches/longlink-hack.diff
deleted file mode 100644
index b6bc385..0000000
--- a/debian/patches/longlink-hack.diff
+++ /dev/null
@@ -1,72 +0,0 @@
-diff --git a/src/common.h b/src/common.h
-index eb801bb..4aaace5 100644
---- a/src/common.h
-+++ b/src/common.h
-@@ -907,4 +907,6 @@ void finish_deferred_unlinks (void);
- /* Module exit.c */
- extern void (*fatal_exit_hook) (void);
- 
-+GLOBAL int debian_longlink_hack;
-+
- _GL_INLINE_HEADER_END
-diff --git a/src/create.c b/src/create.c
-index e14e13d..3a84c79 100644
---- a/src/create.c
-+++ b/src/create.c
-@@ -27,6 +27,8 @@
- #include "common.h"
- #include <hash.h>
- 
-+extern int debian_longlink_hack;
-+
- /* Error number to use when an impostor is discovered.
-    Pretend the impostor isn't there.  */
- enum { IMPOSTOR_ERRNO = ENOENT };
-@@ -724,7 +726,7 @@ write_header_name (struct tar_stat_info *st)
-       return write_short_name (st);
-     }
-   else if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT)
--	   < strlen (st->file_name))
-+	   < strlen (st->file_name) + debian_longlink_hack)
-     return write_long_name (st);
-   else
-     return write_short_name (st);
-@@ -1476,7 +1478,7 @@ dump_hard_link (struct tar_stat_info *st)
- 	  block_ordinal = current_block_ordinal ();
- 	  assign_string (&st->link_name, link_name);
- 	  if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT)
--	      < strlen (link_name))
-+	      < strlen (link_name) + debian_longlink_hack)
- 	    write_long_link (st);
- 
- 	  st->stat.st_size = 0;
-diff --git a/src/tar.c b/src/tar.c
-index 4f5017d..e9a5126 100644
---- a/src/tar.c
-+++ b/src/tar.c
-@@ -1246,6 +1246,16 @@ expand_pax_option (struct tar_args *targs, const char *arg)
-   return res;
- }
- 
-+/* Debian specific environment variable used by pristine-tar to enable use of
-+ * longlinks for filenames exactly 100 bytes long. */
-+void debian_longlink_hack_init () {
-+ char *s=getenv ("TAR_LONGLINK_100");
-+ if (s && strcmp(s, "1") == 0)
-+	 debian_longlink_hack=1;
-+ else
-+	 debian_longlink_hack=0;
-+}
-+
- 
- static uintmax_t
- parse_owner_group (char *arg, uintmax_t field_max, char const **name_option)
-@@ -2626,6 +2636,8 @@ main (int argc, char **argv)
-   filename_terminator = '\n';
-   set_quoting_style (0, DEFAULT_QUOTING_STYLE);
- 
-+  debian_longlink_hack_init ();
-+
-   /* Make sure we have first three descriptors available */
-   stdopen ();
- 
diff --git a/debian/patches/pristine-tar.diff b/debian/patches/pristine-tar.diff
new file mode 100644
index 0000000..f350acc
--- /dev/null
+++ b/debian/patches/pristine-tar.diff
@@ -0,0 +1,108 @@
+diff --git a/src/common.h b/src/common.h
+index eb801bb..30f8cf5 100644
+--- a/src/common.h
++++ b/src/common.h
+@@ -907,4 +907,7 @@ void finish_deferred_unlinks (void);
+ /* Module exit.c */
+ extern void (*fatal_exit_hook) (void);
+ 
++GLOBAL int debian_longlink_hack;
++GLOBAL int pristine_tar_compat;
++
+ _GL_INLINE_HEADER_END
+diff --git a/src/create.c b/src/create.c
+index e14e13d..d6e8ea7 100644
+--- a/src/create.c
++++ b/src/create.c
+@@ -27,6 +27,9 @@
+ #include "common.h"
+ #include <hash.h>
+ 
++extern int debian_longlink_hack;
++extern int pristine_tar_compat;
++
+ /* Error number to use when an impostor is discovered.
+    Pretend the impostor isn't there.  */
+ enum { IMPOSTOR_ERRNO = ENOENT };
+@@ -534,6 +537,11 @@ write_short_name (struct tar_stat_info *st)
+   return header;
+ }
+ 
++#define FILL(field,byte) do {            \
++  memset(field, byte, sizeof(field)-1);  \
++  (field)[sizeof(field)-1] = 0;          \
++} while (0)
++
+ /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block.  */
+ static void
+ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
+@@ -544,6 +552,10 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
+   char *tmpname;
+ 
+   header = start_private_header ("././@LongLink", size, start_time.tv_sec);
++  if (pristine_tar_compat) {
++	  FILL (header->header.mtime, '0');
++	  FILL (header->header.mode, '0');
++  }
+   uid_to_uname (0, &tmpname);
+   UNAME_TO_CHARS (tmpname, header->header.uname);
+   free (tmpname);
+@@ -724,7 +736,7 @@ write_header_name (struct tar_stat_info *st)
+       return write_short_name (st);
+     }
+   else if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT)
+-	   < strlen (st->file_name))
++	   < strlen (st->file_name) + debian_longlink_hack)
+     return write_long_name (st);
+   else
+     return write_short_name (st);
+@@ -1476,7 +1488,7 @@ dump_hard_link (struct tar_stat_info *st)
+ 	  block_ordinal = current_block_ordinal ();
+ 	  assign_string (&st->link_name, link_name);
+ 	  if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT)
+-	      < strlen (link_name))
++	      < strlen (link_name) + debian_longlink_hack)
+ 	    write_long_link (st);
+ 
+ 	  st->stat.st_size = 0;
+diff --git a/src/tar.c b/src/tar.c
+index 4f5017d..b72e25b 100644
+--- a/src/tar.c
++++ b/src/tar.c
+@@ -1246,6 +1246,26 @@ expand_pax_option (struct tar_args *targs, const char *arg)
+   return res;
+ }
+ 
++/* Debian specific environment variable used by pristine-tar to enable use of
++ * longlinks for filenames exactly 100 bytes long. */
++void debian_longlink_hack_init (void) {
++ char *s=getenv ("TAR_LONGLINK_100");
++ if (s && strcmp(s, "1") == 0)
++	 debian_longlink_hack=1;
++ else
++	 debian_longlink_hack=0;
++}
++
++/* pristine-tar sets this environment variable to force fields in longlinks
++ * to be zeroed as was the case in tar 1.26. */
++void pristine_tar_compat_init (void) {
++ char *s=getenv ("PRISTINE_TAR_COMPAT");
++ if (s && strcmp(s, "1") == 0)
++	 pristine_tar_compat=1;
++ else
++	 pristine_tar_compat=0;
++}
++
+ 
+ static uintmax_t
+ parse_owner_group (char *arg, uintmax_t field_max, char const **name_option)
+@@ -2626,6 +2646,9 @@ main (int argc, char **argv)
+   filename_terminator = '\n';
+   set_quoting_style (0, DEFAULT_QUOTING_STYLE);
+ 
++  debian_longlink_hack_init ();
++  pristine_tar_compat_init ();
++
+   /* Make sure we have first three descriptors available */
+   stdopen ();
+ 
diff --git a/debian/patches/series b/debian/patches/series
index 1dfef41..5974cbb 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,2 @@
-longlink-hack.diff
+pristine-tar.diff
 listed03-linux-only
-- 
1.8.4.rc0

Attachment: signature.asc
Description: Digital signature

Reply via email to