summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2010-11-24 23:07:46 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2010-11-24 23:08:07 -0800
commit649b747913d2b289e904b5f1d222af886acd209c (patch)
tree1fad429b2af14e4e472074d71d086c9085b75cb3
parentbb971a1e8a25cf2316d1cf5da309eb77b4975f0f (diff)
downloadtar-649b747913d2b289e904b5f1d222af886acd209c.tar.gz
tar: work around NetBSD and Tru64 symlink incompatibility with POSIX
Problem reported by Bruno Haible in <http://lists.gnu.org/archive/html/bug-gnulib/2010-11/msg00306.html>. * src/extract.c (maybe_recoverable): Also treat EFTYPE (if defined) and ENOTSUP like ELOOP.
-rw-r--r--src/extract.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/extract.c b/src/extract.c
index c52c9ce8..aaea56ed 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -609,9 +609,18 @@ maybe_recoverable (char *file_name, bool regular, bool *interdir_made)
switch (e)
{
case ELOOP:
+
/* With open ("symlink", O_NOFOLLOW|...), POSIX says errno == ELOOP,
- but FreeBSD through at least 8.1 uses errno == EMLINK. */
+ but some operating systems do not conform to the standard. */
+#ifdef EFTYPE
+ /* NetBSD uses errno == EFTYPE; see <http://gnats.netbsd.org/43154>. */
+ case EFTYPE:
+#endif
+ /* FreeBSD 8.1 uses errno == EMLINK. */
case EMLINK:
+ /* Tru64 5.1B uses errno == ENOTSUP. */
+ case ENOTSUP:
+
if (! regular
|| old_files_option != OVERWRITE_OLD_FILES || dereference_option)
break;