Print this page
3769 Implement SOCK_NONBLOCK flag to socket()
Reviewed-by: Robert Mustacchi <rm@joyent.com>

*** 107,116 **** --- 107,120 ---- int fd; int error; int type; type = type_w_flags & SOCK_TYPE_MASK; + type_w_flags &= ~SOCK_TYPE_MASK; + if (type_w_flags & ~(SOCK_CLOEXEC|SOCK_NDELAY|SOCK_NONBLOCK)) + return (set_errno(EINVAL)); + if (devpath != NULL) { char *buf; size_t kdevpathlen = 0; buf = kmem_alloc(MAXPATHLEN, KM_SLEEP);
*** 138,147 **** --- 142,159 ---- } /* * Now fill in the entries that falloc reserved */ + if (type_w_flags & SOCK_NDELAY) { + so->so_state |= SS_NDELAY; + fp->f_flag |= FNDELAY; + } + if (type_w_flags & SOCK_NONBLOCK) { + so->so_state |= SS_NONBLOCK; + fp->f_flag |= FNONBLOCK; + } mutex_exit(&fp->f_tlock); setf(fd, fp); if ((type_w_flags & SOCK_CLOEXEC) != 0) { f_setfd(fd, FD_CLOEXEC); }
*** 486,508 **** socket_destroy(nso); eprintsoline(nso, error); goto done; } /* * fill in the entries that falloc reserved */ mutex_exit(&nfp->f_tlock); setf(nfd, nfp); releasef(svs[0]); releasef(svs[1]); /* * If FD_CLOEXEC was set on the filedescriptor we're * swapping out, we should set it on the new one too. */ - VERIFY(f_getfd_error(svs[0], &orig_flags) == 0); if (orig_flags & FD_CLOEXEC) { f_setfd(nfd, FD_CLOEXEC); } /* --- 498,532 ---- socket_destroy(nso); eprintsoline(nso, error); goto done; } /* + * copy over FNONBLOCK and FNDELAY flags should they exist + */ + if (so1->so_state & SS_NONBLOCK) + nfp->f_flag |= FNONBLOCK; + if (so1->so_state & SS_NDELAY) + nfp->f_flag |= FNDELAY; + + /* * fill in the entries that falloc reserved */ mutex_exit(&nfp->f_tlock); setf(nfd, nfp); + /* + * get the original flags before we release + */ + VERIFY(f_getfd_error(svs[0], &orig_flags) == 0); + releasef(svs[0]); releasef(svs[1]); /* * If FD_CLOEXEC was set on the filedescriptor we're * swapping out, we should set it on the new one too. */ if (orig_flags & FD_CLOEXEC) { f_setfd(nfd, FD_CLOEXEC); } /*