- 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;
- }
-
- 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;
- }