From 2fb4c551e8a87cbdfff014a8c9c4ebd6f138d01e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B6rn=20Jacke?= Date: Sun, 10 Jun 2012 20:17:44 +0200 Subject: [PATCH] s4/pvfs: handle non-POSIX compliant Tru64, NetBSD and FreeBSD errno on O_NOFOLLOW symlink open calls see also f75f1d62339f0accb4e574645b1d265c75a01b5b --- source4/ntvfs/posix/pvfs_sys.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/source4/ntvfs/posix/pvfs_sys.c b/source4/ntvfs/posix/pvfs_sys.c index 9112848bfe..5775d0bb77 100644 --- a/source4/ntvfs/posix/pvfs_sys.c +++ b/source4/ntvfs/posix/pvfs_sys.c @@ -405,11 +405,32 @@ int pvfs_sys_unlink(struct pvfs_state *pvfs, const char *filename, bool allow_ov static bool contains_symlink(const char *path) { int fd = open(path, PVFS_NOFOLLOW | O_RDONLY); + int posix_errno = errno; if (fd != -1) { close(fd); return false; } - return (errno == ELOOP); + +#if defined(ENOTSUP) && defined(OSF1) + /* handle special Tru64 errno */ + if (errno == ENOTSUP) { + posix_errno = ELOOP; + } +#endif /* ENOTSUP */ + +#ifdef EFTYPE + /* fix broken NetBSD errno */ + if (errno == EFTYPE) { + posix_errno = ELOOP; + } +#endif /* EFTYPE */ + + /* fix broken FreeBSD errno */ + if (errno == EMLINK) { + posix_errno = ELOOP; + } + + return (posix_errno == ELOOP); } /* -- 2.34.1