summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/fs/fifofs/fifo_vnops.c18
-rw-r--r--sys/kern/uipc_socket.c5
-rw-r--r--sys/sys/socket.h1
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
OpenPOWER on IntegriCloud