+ switch (cmd) {
+
+ case FIONBIO:
+ if (*(int *)data)
+ so->so_state |= SS_NBIO;
+ else
+ so->so_state &= ~SS_NBIO;
+ return;
+
+ case FIOASYNC:
+ if (*(int *)data)
+ so->so_state |= SS_ASYNC;
+ else
+ so->so_state &= ~SS_ASYNC;
+ return;
+
+ case SIOCSKEEP:
+ if (*(int *)data)
+ so->so_options &= ~SO_KEEPALIVE;
+ else
+ so->so_options |= SO_KEEPALIVE;
+ return;
+
+ case SIOCGKEEP:
+ *(int *)data = (so->so_options & SO_KEEPALIVE) != 0;
+ return;
+
+ case SIOCSLINGER:
+ so->so_linger = *(int *)data;
+ if (so->so_linger)
+ so->so_options &= ~SO_DONTLINGER;
+ else
+ so->so_options |= SO_DONTLINGER;
+ return;
+
+ case SIOCGLINGER:
+ *(int *)data = so->so_linger;
+ return;
+
+ case SIOCSPGRP:
+ so->so_pgrp = *(int *)data;
+ return;
+
+ case SIOCGPGRP:
+ *(int *)data = so->so_pgrp;
+ return;
+
+ case SIOCDONE: {
+ int flags = *(int *)data;
+
+ flags++;
+ if (flags & FREAD) {
+ int s = splimp();
+ socantrcvmore(so);
+ sbflush(&so->so_rcv);
+ splx(s);
+ }
+ if (flags & FWRITE)
+ u.u_error = (*so->so_proto->pr_usrreq)(so, PRU_SHUTDOWN, (struct mbuf *)0, 0);
+ return;
+ }
+
+ case SIOCSENDOOB: {
+ char oob = *(char *)data;
+ struct mbuf *m;