+ case SIOCGKEEP: {
+ int keep = (so->so_options & SO_KEEPALIVE) != 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);
+ splx(s);
+ }
+ if (flags & FWRITE)
+ u.u_error = (*so->so_proto->pr_usrreq)(so, PRU_SHUTDOWN, (struct mbuf *)0, 0);
+ return;
+ }