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
<tytso@mit.edu>.
(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
This commit is contained in:
Sergey Poznyakoff
2009-07-30 23:48:04 +03:00
parent f74cab3a93
commit 5944f452b0
6 changed files with 116 additions and 4 deletions

View File

@@ -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)));
}
}
}

View File

@@ -77,6 +77,8 @@ TESTSUITE_AT = \
indexfile.at\
ignfail.at\
link01.at\
link02.at\
link03.at\
listed01.at\
listed02.at\
long01.at\

View File

@@ -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

52
tests/link02.at Normal file
View File

@@ -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" <tytso@mit.edu>,
# Carl Worth <cworth@cworth.org>
# References:
# <E194EAe-0001lE-00@think.thunk.org>
# 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

56
tests/link03.at Normal file
View File

@@ -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

View File

@@ -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])