- cmsg = CMSG_FIRSTHDR (&msg);
- /* be paranoiac */
- if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN (sizeof fd)
- || cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS)
- {
- /* fake errno: at end the file is not available */
- errno = EACCES;
- return -1;
- }
-
- memcpy (&fd, CMSG_DATA (cmsg), sizeof fd);
-
- /* set close-on-exec flag */
- if (!MSG_CMSG_CLOEXEC && (flags & O_CLOEXEC))
- {
- if (set_cloexec_flag (fd, true) < 0)
- {
- int saved_errno = errno;
- (void) close (fd);
- errno = saved_errno;
- return -1;
- }
- }
-
- return fd;
-
-#elif HAVE_UNIXSOCKET_SCM_RIGHTS_BSD43_WAY
- int fd;
-
- msg.msg_accrights = &fd;
- msg.msg_accrightslen = sizeof fd;
- if (recvmsg (sock, &msg, 0) < 0)
+ cmsg = CMSG_FIRSTHDR (&msg);
+ /* be paranoiac */
+ if (len == 0 || cmsg == NULL || cmsg->cmsg_len != CMSG_LEN (sizeof fd)
+ || cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS)
+ {
+ /* fake errno: at end the file is not available */
+ errno = len ? EACCES : ENOTCONN;