From 5944f452b0e615a172a9f058877671ff6272abb8 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Thu, 30 Jul 2009 23:48:04 +0300 Subject: [PATCH] Fix hard links recognition with -c --remove-files * src/create.c (dump_hard_link): Always look up in the link table if remove_files_option is set. Patch suggested by Theodore Ts'o . (check_links): Remove extra newline from the warning message. * tests/link02.at, tests/link03.at: New testcases. * tests/Makefile.am (TESTSUITE_AT): Add link02.at and link03.at * tests/testsuite.at: Include link02.at and link03.at --- src/create.c | 4 ++-- tests/Makefile.am | 2 ++ tests/link01.at | 4 ++-- tests/link02.at | 52 ++++++++++++++++++++++++++++++++++++++++++ tests/link03.at | 56 ++++++++++++++++++++++++++++++++++++++++++++++ tests/testsuite.at | 2 ++ 6 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 tests/link02.at create mode 100644 tests/link03.at diff --git a/src/create.c b/src/create.c index 245b6c3..1031cc2 100644 --- a/src/create.c +++ b/src/create.c @@ -1377,7 +1377,7 @@ static Hash_table *link_table; static bool dump_hard_link (struct tar_stat_info *st) { - if (link_table && st->stat.st_nlink > 1) + if (link_table && (st->stat.st_nlink > 1 || remove_files_option)) { struct link lp; struct link *duplicate; @@ -1468,7 +1468,7 @@ check_links (void) { if (lp->nlink) { - WARN ((0, 0, _("Missing links to %s.\n"), quote (lp->name))); + WARN ((0, 0, _("Missing links to %s."), quote (lp->name))); } } } diff --git a/tests/Makefile.am b/tests/Makefile.am index da6cf0d..2001834 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -77,6 +77,8 @@ TESTSUITE_AT = \ indexfile.at\ ignfail.at\ link01.at\ + link02.at\ + link03.at\ listed01.at\ listed02.at\ long01.at\ diff --git a/tests/link01.at b/tests/link01.at index 2bec558..5faf42e 100644 --- a/tests/link01.at +++ b/tests/link01.at @@ -1,7 +1,7 @@ # Process this file with autom4te to create testsuite. -*- Autotest -*- # Test suite for GNU tar. -# Copyright (C) 2004, 2007 Free Software Foundation, Inc. +# Copyright (C) 2004, 2007, 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 @@ -31,7 +31,7 @@ # http://lists.gnu.org/archive/html/bug-tar/2004-07/msg00009.html AT_SETUP([link count gt 2]) -AT_KEYWORDS([link01]) +AT_KEYWORDS([hardlinks link01]) AT_TAR_CHECK([ mkdir directory diff --git a/tests/link02.at b/tests/link02.at new file mode 100644 index 0000000..756d48f --- /dev/null +++ b/tests/link02.at @@ -0,0 +1,52 @@ +# 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. + +# Tar 1.22 failed to recognize last hard link when creating an archive with +# the --remove-files option. +# +# Reported by: "Theodore Y. Ts'o" , +# Carl Worth +# References: +# +# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=188663 +# <1248955024.1545.1.camel@yoom.home.cworth.org> +# http://lists.gnu.org/archive/html/bug-tar/2009-07/msg00015.html + +AT_SETUP([preserve hard links with --remove-files]) +AT_KEYWORDS([hardlinks link02]) + +AT_TAR_CHECK([ +genfile -l 64 -f file1 +link file1 file2 +link file2 file3 +link file3 file4 +tar -c -f archive --remove-files file1 file2 file3 file4 +tar tfv archive | sed -n 's/.*file[[2-4]] link to //p' +], +[0], +[file1 +file1 +file1 +]) + +AT_CLEANUP + +# End of link02.at + diff --git a/tests/link03.at b/tests/link03.at new file mode 100644 index 0000000..af5b97c --- /dev/null +++ b/tests/link03.at @@ -0,0 +1,56 @@ +# 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. + +# Make sure -l option works correctly in conjunction with --remove-files +# See also link02.at + +AT_SETUP([working -l with --remove-files]) +AT_KEYWORDS([hardlinks link03]) + +m4_define([create_files],[ +genfile -l 64 -f file1 +link file1 file2 +link file2 file3 +link file3 file4 +]) + +AT_TAR_CHECK([ +create_files +echo archive.1 +tar -c -f archive.1 -l --remove-files file1 file2 file3 file4 +create_files +echo archive.2 +tar -c -f archive.2 -l --remove-files file1 file2 file3 +echo testing archive.2 +tar tfv archive.2 | sed -n 's/.*file[[2-3]] link to //p' +], +[0], +[archive.1 +archive.2 +testing archive.2 +file1 +file1 +], +[tar: Missing links to `file1'. +]) + +AT_CLEANUP + + diff --git a/tests/testsuite.at b/tests/testsuite.at index 31ee16b..634133b 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -159,6 +159,8 @@ m4_include([chtype.at]) m4_include([ignfail.at]) m4_include([link01.at]) +m4_include([link02.at]) +m4_include([link03.at]) m4_include([longv7.at]) m4_include([long01.at]) -- 2.45.2