From 8655d6d5b6bc65487c7540eac81e52c27f06c564 Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Sun, 3 Nov 2013 09:48:18 -0700 Subject: [PATCH] merge patch from Joey Hess into working tree --- .../{longlink-hack.diff => pristine-tar.diff} | 56 ++++- debian/patches/pristine_tar_compat | 216 ------------------ debian/patches/series | 2 +- 3 files changed, 47 insertions(+), 227 deletions(-) rename debian/patches/{longlink-hack.diff => pristine-tar.diff} (51%) delete mode 100644 debian/patches/pristine_tar_compat diff --git a/debian/patches/longlink-hack.diff b/debian/patches/pristine-tar.diff similarity index 51% rename from debian/patches/longlink-hack.diff rename to debian/patches/pristine-tar.diff index b6bc385c..f350acce 100644 --- a/debian/patches/longlink-hack.diff +++ b/debian/patches/pristine-tar.diff @@ -1,28 +1,53 @@ diff --git a/src/common.h b/src/common.h -index eb801bb..4aaace5 100644 +index eb801bb..30f8cf5 100644 --- a/src/common.h +++ b/src/common.h -@@ -907,4 +907,6 @@ void finish_deferred_unlinks (void); +@@ -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..3a84c79 100644 +index e14e13d..d6e8ea7 100644 --- a/src/create.c +++ b/src/create.c -@@ -27,6 +27,8 @@ +@@ -27,6 +27,9 @@ #include "common.h" #include +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 }; -@@ -724,7 +726,7 @@ write_header_name (struct tar_stat_info *st) +@@ -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) @@ -31,7 +56,7 @@ index e14e13d..3a84c79 100644 return write_long_name (st); else return write_short_name (st); -@@ -1476,7 +1478,7 @@ dump_hard_link (struct tar_stat_info *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) @@ -41,31 +66,42 @@ index e14e13d..3a84c79 100644 st->stat.st_size = 0; diff --git a/src/tar.c b/src/tar.c -index 4f5017d..e9a5126 100644 +index 4f5017d..b72e25b 100644 --- a/src/tar.c +++ b/src/tar.c -@@ -1246,6 +1246,16 @@ expand_pax_option (struct tar_args *targs, const char *arg) +@@ -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 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 +2636,8 @@ main (int argc, char **argv) +@@ -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/pristine_tar_compat b/debian/patches/pristine_tar_compat deleted file mode 100644 index e15d4f61..00000000 --- a/debian/patches/pristine_tar_compat +++ /dev/null @@ -1,216 +0,0 @@ -From e36454201ec81374bf4d2d09877e6c345a6fddab Mon Sep 17 00:00:00 2001 -From: Joey Hess -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 -- --+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 -+ -++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 - diff --git a/debian/patches/series b/debian/patches/series index f3d235b4..9264bdca 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,3 +1,3 @@ -longlink-hack.diff +pristine-tar.diff listed03-linux-only pristine_tar_compat -- 2.47.2