/* uipc_pipe.c 4.5 81/11/21 */
#include "../h/protosw.h"
#include "../h/socketvar.h"
#include "../net/inet_systm.h" /* XXX */
* Code for pipes and other loopback protocols (single machine, that is.)
struct protosw pipeproto
= {
SOCK_STREAM
, PF_LOCAL
, 0, PR_CONNREQUIRED
|PR_WANTRCVD
,
* Connect a pipe from wso to rso. The protocol control block
* for a pipe is used to store a pointer to the matching socket.
struct socket
*wso
, *rso
;
if (m_reserve(PIPSIZ
) == 0) {
wso
->so_proto
= rso
->so_proto
= &pipeproto
;
wso
->so_pcb
= (caddr_t
)rso
;
rso
->so_pcb
= (caddr_t
)wso
;
wso
->so_snd
.sb_hiwat
= PIPSIZ
;
wso
->so_snd
.sb_mbmax
= 2*PIPSIZ
;
wso
->so_state
|= SS_ISCONNECTED
|SS_CANTRCVMORE
;
rso
->so_rcv
.sb_hiwat
= 0;
rso
->so_rcv
.sb_mbmax
= 0;
rso
->so_state
|= SS_ISCONNECTED
|SS_CANTSENDMORE
;
* User requests on pipes and other internally implemented
piusrreq(so
, req
, m
, addr
)
struct socket
*so2
= (struct socket
*)so
->so_pcb
;
#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
;
printf("pru_rcvd out: ");
#define rcv (&so2->so_rcv)
#define snd (&so->so_snd)
* Send to paired receive port, and then
* give it enough resources to hold what it already has.
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
;
printf("pru_send out: ");
struct sockbuf
*snd
, *rcv
;
printf("snd: (cc,hiwat,mbcnt,mbmax) (%d,%d,%d,%d) ",
snd
->sb_cc
, snd
->sb_hiwat
, snd
->sb_mbcnt
, snd
->sb_mbmax
);
printf("m %x, m->m_len %d\n", snd
->sb_mb
, snd
->sb_mb
? snd
->sb_mb
->m_len
: 0);
printf("rcv: (cc,hiwat,mbcnt,mbmax) (%d,%d,%d,%d) ",
rcv
->sb_cc
, rcv
->sb_hiwat
, rcv
->sb_mbcnt
, rcv
->sb_mbmax
);
printf("m %x, m->m_len %d\n", rcv
->sb_mb
, rcv
->sb_mb
? rcv
->sb_mb
->m_len
: 0);