diff options
-rw-r--r-- | sys/fs/fifofs/fifo_vnops.c | 18 | ||||
-rw-r--r-- | sys/kern/uipc_socket.c | 5 | ||||
-rw-r--r-- | sys/sys/socket.h | 1 |
3 files changed, 10 insertions, 14 deletions
diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c index 0f97c17..8ecd33e 100644 --- a/sys/fs/fifofs/fifo_vnops.c +++ b/sys/fs/fifofs/fifo_vnops.c @@ -312,7 +312,7 @@ fifo_read(ap) struct uio *uio = ap->a_uio; struct socket *rso = ap->a_vp->v_fifoinfo->fi_readsock; struct thread *td = uio->uio_td; - int error; + int error, flags; #ifdef DIAGNOSTIC if (uio->uio_rw != UIO_READ) @@ -320,14 +320,11 @@ fifo_read(ap) #endif if (uio->uio_resid == 0) return (0); - if (ap->a_ioflag & IO_NDELAY) - rso->so_state |= SS_NBIO; VOP_UNLOCK(ap->a_vp, 0, td); + flags = (ap->a_ioflag & IO_NDELAY) ? MSG_NBIO : 0; error = soreceive(rso, (struct sockaddr **)0, uio, (struct mbuf **)0, - (struct mbuf **)0, (int *)0); + (struct mbuf **)0, &flags); vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY, td); - if (ap->a_ioflag & IO_NDELAY) - rso->so_state &= ~SS_NBIO; return (error); } @@ -346,20 +343,17 @@ fifo_write(ap) { struct socket *wso = ap->a_vp->v_fifoinfo->fi_writesock; struct thread *td = ap->a_uio->uio_td; - int error; + int error, flags; #ifdef DIAGNOSTIC if (ap->a_uio->uio_rw != UIO_WRITE) panic("fifo_write mode"); #endif - if (ap->a_ioflag & IO_NDELAY) - wso->so_state |= SS_NBIO; VOP_UNLOCK(ap->a_vp, 0, td); + flags = (ap->a_ioflag & IO_NDELAY) ? MSG_NBIO : 0; error = sosend(wso, (struct sockaddr *)0, ap->a_uio, 0, - (struct mbuf *)0, 0, td); + (struct mbuf *)0, flags, td); vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY, td); - if (ap->a_ioflag & IO_NDELAY) - wso->so_state &= ~SS_NBIO; return (error); } diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 6735e49..ece519b 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -600,7 +600,7 @@ restart: snderr(EMSGSIZE); if (space < resid + clen && (atomic || space < so->so_snd.sb_lowat || space < clen)) { - if (so->so_state & SS_NBIO) + if ((so->so_state & SS_NBIO) || (flags & MSG_NBIO)) snderr(EWOULDBLOCK); sbunlock(&so->so_snd); error = sbwait(&so->so_snd); @@ -898,7 +898,8 @@ restart: } if (uio->uio_resid == 0) goto release; - if ((so->so_state & SS_NBIO) || (flags & MSG_DONTWAIT)) { + if ((so->so_state & SS_NBIO) || + (flags & (MSG_DONTWAIT|MSG_NBIO))) { error = EWOULDBLOCK; goto release; } diff --git a/sys/sys/socket.h b/sys/sys/socket.h index de96518..6efdaee 100644 --- a/sys/sys/socket.h +++ b/sys/sys/socket.h @@ -393,6 +393,7 @@ struct msghdr { #if __BSD_VISIBLE #define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ #define MSG_EOF 0x100 /* data completes connection */ +#define MSG_NBIO 0x4000 /* FIONBIO mode, used by fifofs */ #define MSG_COMPAT 0x8000 /* used in sendit() */ #endif |