+ case FIONBIO: {
+ int nbio;
+ if (copyin(cmdp, (caddr_t)&nbio, sizeof (nbio))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ if (nbio)
+ so->so_options |= SO_NONBLOCKING;
+ else
+ so->so_options &= ~SO_NONBLOCKING;
+ return;
+ }
+
+ case FIOASYNC: {
+ int async;
+ if (copyin(cmdp, (caddr_t)&async, sizeof (async))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ if (async)
+ ;
+ else
+ ;
+ return;
+ }
+
+ case SIOCSKEEP: {
+ int keep;
+ if (copyin(cmdp, (caddr_t)&keep, sizeof (keep))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ if (keep)
+ so->so_options &= ~SO_NOKEEPALIVE;
+ else
+ so->so_options |= SO_NOKEEPALIVE;
+ return;
+ }
+
+ case SIOCGKEEP: {
+ int keep = (so->so_options & SO_NOKEEPALIVE) == 0;
+ if (copyout((caddr_t)&keep, cmdp, sizeof (keep)))
+ u.u_error = EFAULT;
+ return;
+ }
+
+ case SIOCSLINGER: {
+ int linger;
+ if (copyin(cmdp, (caddr_t)&linger, sizeof (linger))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ so->so_linger = linger;
+ if (so->so_linger)
+ so->so_options &= ~SO_DONTLINGER;
+ else
+ so->so_options |= SO_DONTLINGER;
+ return;
+ }
+
+ case SIOCGLINGER: {
+ int linger = so->so_linger;
+ if (copyout((caddr_t)&linger, cmdp, sizeof (linger))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ }
+ case SIOCSPGRP: {
+ int pgrp;
+ if (copyin(cmdp, (caddr_t)&pgrp, sizeof (pgrp))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ so->so_pgrp = pgrp;
+ return;
+ }
+
+ case SIOCGPGRP: {
+ int pgrp = so->so_pgrp;
+ if (copyout((caddr_t)&pgrp, cmdp, sizeof (pgrp))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ }
+
+ case SIOCDONE: {
+ int flags;
+ if (copyin(cmdp, (caddr_t)&flags, sizeof (flags))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ flags++;
+ if (flags & FREAD) {
+ int s = splimp();
+ socantrcvmore(so);
+ sbflush(&so->so_rcv);
+ }
+ if (flags & FWRITE)
+ u.u_error = (*so->so_proto->pr_usrreq)(so, PRU_SHUTDOWN, (struct mbuf *)0, 0);
+ return;
+ }
+
+ case SIOCSENDOOB: {
+ char oob;
+ struct mbuf *m;
+ if (copyin(cmdp, (caddr_t)&oob, sizeof (oob))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ m = m_get(M_DONTWAIT);
+ if (m == 0) {
+ u.u_error = ENOBUFS;
+ return;
+ }
+ m->m_off = MMINOFF;
+ m->m_len = 1;
+ *mtod(m, caddr_t) = oob;
+ (*so->so_proto->pr_usrreq)(so, PRU_SENDOOB, m, 0);
+ return;
+ }
+
+ case SIOCRCVOOB: {
+ struct mbuf *m = m_get(M_DONTWAIT);
+ if (m == 0) {
+ u.u_error = ENOBUFS;
+ return;
+ }
+ m->m_off = MMINOFF; *mtod(m, caddr_t) = 0;
+ (*so->so_proto->pr_usrreq)(so, PRU_RCVOOB, m, 0);
+ if (copyout(mtod(m, caddr_t), cmdp, sizeof (char))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ m_free(m);
+ return;
+ }
+
+ case SIOCATMARK: {
+ int atmark = (so->so_state&SS_RCVATMARK) != 0;
+ if (copyout((caddr_t)&atmark, cmdp, sizeof (atmark))) {
+ u.u_error = EFAULT;
+ return;
+ }
+ return;
+ }