-
-/*
- * User requests on pipes and other internally implemented
- * structures.
- */
-/*ARGSUSED*/
-piusrreq(so, req, m, addr)
- struct socket *so;
- int req;
- struct mbuf *m;
- caddr_t addr;
-{
- struct socket *so2 = (struct socket *)so->so_pcb;
-
-COUNT(PIUSRREQ);
- switch (req) {
-
- case PRU_ATTACH:
- break;
-
- case PRU_DETACH:
- so->so_pcb = 0;
- break;
-
- case PRU_CONNECT:
- case PRU_ACCEPT:
- return (EOPNOTSUPP);
-
- case PRU_DISCONNECT:
- if (so2 == 0)
- return (ENOTCONN);
- so->so_pcb = 0;
- so2->so_pcb = 0;
- soisdisconnected(so);
- soisdisconnected(so2);
- break;
-
- case PRU_SHUTDOWN:
- socantsendmore(so);
- if (so2)
- socantrcvmore(so2);
- break;
-
- case PRU_RCVD:
- if (so2 == 0)
- break;
-#define rcv (&so->so_rcv)
-#define snd (&so2->so_snd)
- /*
- * Transfer resources back to send port
- * and wakeup any waiting to write.
- */
- snd->sb_mbmax += rcv->sb_mbmax - rcv->sb_mbcnt;
- rcv->sb_mbmax = rcv->sb_mbcnt;
- snd->sb_hiwat += rcv->sb_hiwat - rcv->sb_cc;
- rcv->sb_hiwat = rcv->sb_cc;
- sbwakeup(snd);
-#undef snd
-#undef rcv
- break;
-
- case PRU_SEND:
-#define rcv (&so2->so_rcv)
-#define snd (&so->so_snd)
- if (so2 == 0)
- panic("pipe send");
- /*
- * Send to paired receive port, and then
- * give it enough resources to hold what it already has.
- * Wake up readers.
- */
- sbappend(rcv, m);
- snd->sb_mbmax -= rcv->sb_mbcnt - rcv->sb_mbmax;
- rcv->sb_mbmax = rcv->sb_mbcnt;
- snd->sb_hiwat -= rcv->sb_cc - rcv->sb_hiwat;
- rcv->sb_hiwat = rcv->sb_cc;
- sbwakeup(rcv);
-#undef snd
-#undef rcv
- break;
-
- case PRU_ABORT:
- return (EOPNOTSUPP);
-
- case PRU_CONTROL:
- return (EOPNOTSUPP);
-
- default:
- panic("piusrreq");
- }
- return (0);
-}