This should make things work properly for apps that are linked against libc_r and use filedescriptor passing.
Can someone review and approve it please? Index: uthread_recvmsg.c =================================================================== RCS file: /home/ncvs/src/lib/libc_r/uthread/uthread_recvmsg.c,v retrieving revision 1.11 diff -u -r1.11 uthread_recvmsg.c --- uthread_recvmsg.c 19 Dec 2002 11:39:20 -0000 1.11 +++ uthread_recvmsg.c 23 Nov 2003 02:34:28 -0000 @@ -44,6 +44,9 @@ _recvmsg(int fd, struct msghdr *msg, int flags) { struct pthread *curthread = _get_curthread(); + struct cmsghdr *cmsgp; + int count, i, j; + int *fds; int ret; if ((ret = _FD_LOCK(fd, FD_READ, NULL)) == 0) { @@ -70,6 +73,27 @@ } } _FD_UNLOCK(fd, FD_READ); + /* If file descriptors were passed then initialize them. */ + if (msg != NULL && (cmsgp = msg->msg_control) != NULL && + cmsgp->cmsg_level == SOL_SOCKET && + cmsgp->cmsg_type == SCM_RIGHTS) { + fds = (int *)CMSG_DATA(cmsgp); + count = (msg->msg_controllen - CMSG_LEN(0)) / sizeof(int); + for (i = 0; i < count; i++) { + /* + * XXX: If this fails we're screwing + * the user pretty badly by doing this + * but what other choice do we have? + */ + if (_thread_fd_table_init(fds[i]) != 0) { + for (j = 0; j < count; j++) { + __sys_close(fds[j]); + fds[j] = -1; + } + break; + } + } + } } return (ret); } -- - Alfred Perlstein - Research Engineering Development Inc. - email: [EMAIL PROTECTED] cell: 408-480-4684 _______________________________________________ [EMAIL PROTECTED] mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-current To unsubscribe, send any mail to "[EMAIL PROTECTED]"