From f74cab3a936190a65d57c82fea5b1a05affee60a Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Thu, 30 Jul 2009 11:43:16 +0300 Subject: [PATCH] Fix handling of hard link targets by -c --transform * src/create.c (file_count_links): Transform link target before the look up. * tests/xform-h.at: New test case. * tests/Makefile.am (TESTSUITE_AT): Add xform-h.at. * tests/testsuite.at: Add xform-h.at --- src/create.c | 17 +++++++++---- tests/Makefile.am | 1 + tests/testsuite.at | 2 ++ tests/xform-h.at | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 tests/xform-h.at diff --git a/src/create.c b/src/create.c index a925160..245b6c3 100644 --- a/src/create.c +++ b/src/create.c @@ -1427,19 +1427,26 @@ file_count_links (struct tar_stat_info *st) if (st->stat.st_nlink > 1) { struct link *duplicate; - struct link *lp = xmalloc (offsetof (struct link, name) - + strlen (st->orig_file_name) + 1); + char *linkname = NULL; + struct link *lp; + + assign_string (&linkname, st->orig_file_name); + transform_name (&linkname, XFORM_LINK); + + lp = xmalloc (offsetof (struct link, name) + + strlen (linkname) + 1); lp->ino = st->stat.st_ino; lp->dev = st->stat.st_dev; lp->nlink = st->stat.st_nlink; - strcpy (lp->name, st->orig_file_name); - + strcpy (lp->name, linkname); + free (linkname); + if (! ((link_table || (link_table = hash_initialize (0, 0, hash_link, compare_links, 0))) && (duplicate = hash_insert (link_table, lp)))) xalloc_die (); - + if (duplicate != lp) abort (); lp->nlink--; diff --git a/tests/Makefile.am b/tests/Makefile.am index e44dad7..da6cf0d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -119,6 +119,7 @@ TESTSUITE_AT = \ volume.at\ verbose.at\ version.at\ + xform-h.at\ star/gtarfail.at\ star/gtarfail2.at\ star/multi-fail.at\ diff --git a/tests/testsuite.at b/tests/testsuite.at index a12477d..31ee16b 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -122,6 +122,8 @@ m4_include([append.at]) m4_include([append01.at]) m4_include([append02.at]) +m4_include([xform-h.at]) + m4_include([exclude.at]) m4_include([delete01.at]) diff --git a/tests/xform-h.at b/tests/xform-h.at new file mode 100644 index 0000000..8adf737 --- /dev/null +++ b/tests/xform-h.at @@ -0,0 +1,59 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# When creating archives, tar 1.22 did not apply the --transform option +# to hard links. +# +# Reported by: Jose Miguel Goncalves +# References: +# <4A436D1D.4040408@inov.pt> +# http://lists.gnu.org/archive/html/bug-tar/2009-06/msg00017.html +# + +AT_SETUP([transforming hard links on create]) +AT_KEYWORDS([transform xform xform-h]) + +m4_define([xform],[ +echo "$1" +tar cf archive --transform="s,^basedir/,,$2" basedir +tar tvf archive | sed -n 's/.*test_link link to //p' +]) + +AT_TAR_CHECK([ +mkdir basedir +echo "hello" > basedir/test +ln basedir/test basedir/test_link + +xform(Default transform scope) +xform(Transforming hard links,h) +xform(Not transforming hard links,H) +], +[0], +[Default transform scope +test +Transforming hard links +test +Not transforming hard links +basedir/test +]) + +AT_CLEANUP + +# End of xform-h.at \ No newline at end of file -- 2.45.2