From: Björn Jacke Date: Sun, 10 Jun 2012 18:17:44 +0000 (+0200) Subject: s4/pvfs: handle non-POSIX compliant Tru64, NetBSD and FreeBSD errno on O_NOFOLLOW... X-Git-Tag: samba-4.0.0beta2~242 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=2fb4c551e8a87cbdfff014a8c9c4ebd6f138d01e;p=thirdparty%2Fsamba.git s4/pvfs: handle non-POSIX compliant Tru64, NetBSD and FreeBSD errno on O_NOFOLLOW symlink open calls see also f75f1d62339f0accb4e574645b1d265c75a01b5b --- diff --git a/source4/ntvfs/posix/pvfs_sys.c b/source4/ntvfs/posix/pvfs_sys.c index 9112848bfef..5775d0bb779 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); } /*