diff options
Diffstat (limited to 'c/src/lib/libnetworking/kern/uipc_socket.c')
-rw-r--r-- | c/src/lib/libnetworking/kern/uipc_socket.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/c/src/lib/libnetworking/kern/uipc_socket.c b/c/src/lib/libnetworking/kern/uipc_socket.c index 04489f4017..49a5a65653 100644 --- a/c/src/lib/libnetworking/kern/uipc_socket.c +++ b/c/src/lib/libnetworking/kern/uipc_socket.c @@ -979,6 +979,31 @@ sosetopt(so, level, optname, m0) so->so_state &= ~SS_PRIV; break; + case SO_SNDWAKEUP: + case SO_RCVWAKEUP: + { + /* RTEMS addition. */ + struct sockwakeup *sw; + struct sockbuf *sb; + + if (m == NULL + || m->m_len != sizeof (struct sockwakeup)) { + error = EINVAL; + goto bad; + } + sw = mtod(m, struct sockwakeup *); + sb = (optname == SO_SNDWAKEUP + ? &so->so_snd + : &so->so_rcv); + sb->sb_wakeup = sw->sw_pfn; + sb->sb_wakeuparg = sw->sw_arg; + if (sw->sw_pfn) + sb->sb_flags |= SB_ASYNC; + else + sb->sb_flags &=~ SB_ASYNC; + break; + } + default: error = ENOPROTOOPT; break; @@ -1076,6 +1101,23 @@ sogetopt(so, level, optname, mp) break; } + case SO_SNDWAKEUP: + case SO_RCVWAKEUP: + { + struct sockbuf *sb; + struct sockwakeup *sw; + + /* RTEMS additions. */ + sb = (optname == SO_SNDWAKEUP + ? &so->so_snd + : &so->so_rcv); + m->m_len = sizeof (struct sockwakeup); + sw = mtod(m, struct sockwakeup *); + sw->sw_pfn = sb->sb_wakeup; + sw->sw_arg = sb->sb_wakeuparg; + break; + } + default: (void)m_free(m); return (ENOPROTOOPT); |