From: Björn Jacke Date: Sun, 7 Jun 2009 11:55:26 +0000 (+0200) Subject: s3: handle non-POSIX compliant Tru64, NetBSD and FreeBSD errno on O_NOFOLLOW symlink... X-Git-Url: http://git.samba.org/samba.git/?p=kai%2Fsamba.git;a=commitdiff_plain;h=f75f1d62339f0accb4e574645b1d265c75a01b5b s3: handle non-POSIX compliant Tru64, NetBSD and FreeBSD errno on O_NOFOLLOW symlink open calls or should we leave the NetBSD and FreeBSD platforms just broken? Actually these two *want* to have broken platforms as they use different errno's than POSIX demands *interntionally*. The POSIX errno ELOOP for O_NOFOLLOW open calls on symlinks is clear and unambiguous. See http://gnats.netbsd.org/43154 for the interesting NetBSD discussion on that. Autobuild-User(master): Björn Jacke Autobuild-Date(master): Sun Jun 10 16:10:02 CEST 2012 on sn-devel-104 --- diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 4581553be2f..cb43dd28caa 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -291,7 +291,26 @@ static NTSTATUS fd_open(struct connection_struct *conn, fsp->fh->fd = SMB_VFS_OPEN(conn, smb_fname, fsp, flags, mode); if (fsp->fh->fd == -1) { - status = map_nt_error_from_unix(errno); +#ifdef O_NOFOLLOW + int posix_errno = errno; +#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; + } +#endif /* O_NOFOLLOW */ + status = map_nt_error_from_unix(posix_errno); if (errno == EMFILE) { static time_t last_warned = 0L;