/* A description of a working directory. */
struct wd
{
+ /* The directory's name. */
char const *name;
- int saved;
+
+ /* A negative value if no attempt has been made to save the
+ directory, 0 if it was saved successfully, and a positive errno
+ value if it was not saved successfully. */
+ int err;
+
+ /* The saved version of the directory, if SAVED == 1. */
struct saved_cwd saved_cwd;
};
if (! wd_count)
{
wd[wd_count].name = ".";
- wd[wd_count].saved = 0;
+ wd[wd_count].err = -1;
wd_count++;
}
}
}
wd[wd_count].name = dir;
- wd[wd_count].saved = 0;
+ wd[wd_count].err = -1;
return wd_count++;
}
struct wd *prev = &wd[previous];
struct wd *curr = &wd[i];
- if (! prev->saved)
+ if (prev->err < 0)
{
- int err = 0;
- prev->saved = 1;
+ prev->err = 0;
if (save_cwd (&prev->saved_cwd) != 0)
- err = errno;
+ prev->err = errno;
else if (0 <= prev->saved_cwd.desc)
{
/* Make sure we still have at least one descriptor available. */
prev->saved_cwd.desc = -1;
prev->saved_cwd.name = xgetcwd ();
if (! prev->saved_cwd.name)
- err = errno;
+ prev->err = errno;
}
else
- err = errno;
+ prev->err = errno;
}
-
- if (err)
- FATAL_ERROR ((0, err, _("Cannot save working directory")));
}
- if (curr->saved)
+ if (0 <= curr->err)
{
- if (restore_cwd (&curr->saved_cwd))
- FATAL_ERROR ((0, 0, _("Cannot change working directory")));
+ int err = curr->err;
+ if (err == 0 && restore_cwd (&curr->saved_cwd) != 0)
+ err = errno;
+ if (err)
+ FATAL_ERROR ((0, err, _("Cannot restore working directory")));
}
else
{
--- /dev/null
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2010 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, see <http://www.gnu.org/licenses/>.
+
+# This checks for the --listed-incremental bug reported by J Chapman Flack at
+# http://lists.gnu.org/archive/html/bug-tar/2010-06/msg00000.html
+
+AT_SETUP([no need to save dir with unreadable . and ..])
+AT_KEYWORDS([extract extrac09])
+
+AT_TAR_CHECK([
+mkdir dir
+mkdir dir/sub
+mkdir dir/sub/extract
+genfile --file dir/sub/f
+cd dir/sub
+
+tar -cf archive.tar f
+
+chmod a-r . ..
+tar -xvf archive.tar -C extract f
+status=$?
+chmod a+r . ..
+cmp f extract/f || status=$?
+exit $status
+],
+[0],
+[f
+],
+[],[],[],[gnu])
+
+AT_CLEANUP