-
-pi_splice(pso, so)
- struct socket *pso, *so;
-{
-
- if (pso->so_proto != &pipeproto) {
- struct socket *tso;
- tso = pso; pso = so; so = tso;
- }
- if (pso->so_proto != &pipeproto)
- return (EOPNOTSUPP);
- /* check types and buffer space */
- /* merge buffers */
- return (0);
-}
-
-/*
- * User requests on pipes and other internally implemented
- * structures.
- */
-/*ARGSUSED*/
-pi_usrreq(so, req, m, addr)
- struct socket *so;
- int req;
- struct mbuf *m;
- caddr_t addr;
-{
- struct socket *so2 = (struct socket *)so->so_pcb;
-
- switch (req) {
-
- case PRU_ATTACH:
- case PRU_DETACH:
- break;
-
- case PRU_CONNECT:
- return (EOPNOTSUPP);
-
- case PRU_DISCONNECT:
- if (so2 == 0)
- return (ENOTCONN);
- so->so_pcb = 0;
- soisdisconnected(so);
- break;
-
- case PRU_FLUSH:
- return (EOPNOTSUPP);
-
- case PRU_SHUTDOWN:
- so->so_state |= SS_CANTSENDMORE;
- sowwakeup(so);
- if (so2) {
- so2->so_state |= SS_CANTRCVMORE;
- sorwakeup(so2);
- }
- break;
-
- case PRU_RCVD:
- if (so->so_rcv.sb_cc == 0 && so2 && so2->so_snd.sb_cc) {
- so->so_rcv.sb_cc = so2->so_snd.sb_cc;
- so->so_rcv.sb_mbcnt = so2->so_snd.sb_mbcnt;
- so->so_rcv.sb_mb = so2->so_rcv.sb_mb;
- so2->so_snd.sb_cc = 0;
- so2->so_snd.sb_mbcnt = 0;
- so2->so_snd.sb_mb = 0;
- sorwakeup(so);
- sowwakeup(so2);
- }
- break;
-
- case PRU_SEND:
- sbappend(&so->so_snd, m);
- sorwakeup(so2);
- break;
-
- case PRU_ABORT:
- return (EOPNOTSUPP);
-
- case PRU_CONTROL:
- return (EOPNOTSUPP);
-
- default:
- panic("pi_usrreq");
- }
- return (0);
-}