summaryrefslogtreecommitdiffstats
path: root/c/src/libnetworking/kern/uipc_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/libnetworking/kern/uipc_socket.c')
-rw-r--r--c/src/libnetworking/kern/uipc_socket.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/c/src/libnetworking/kern/uipc_socket.c b/c/src/libnetworking/kern/uipc_socket.c
index 04489f4017..49a5a65653 100644
--- a/c/src/libnetworking/kern/uipc_socket.c
+++ b/c/src/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);