+static void trpiperead(struct socket *sk, struct dcpeer *peer)
+{
+ dctransgotdata(peer->transfer, peer);
+}
+
+static void trpipewrite(struct socket *sk, struct dcpeer *peer)
+{
+ transread(peer->sk, peer);
+}
+
+static void trpipeerr(struct socket *sk, int errno, struct dcpeer *peer)
+{
+ peer->state = PEER_SYNC;
+ dctransgotdata(peer->transfer, peer);
+ peerdetach(peer);
+ if(peer->state != PEER_CMD)
+ peer->close = 1;
+}
+
+static struct socket *mktrpipe(struct dcpeer *peer)
+{
+ struct socket *sk;
+
+ sk = netsockpipe();
+ sk->data = peer;
+ sk->readcb = (void (*)(struct socket *, void *))trpiperead;
+ sk->writecb = (void (*)(struct socket *, void *))trpipewrite;
+ sk->errcb = (void (*)(struct socket *, int, void *))trpipeerr;
+ return(sk);
+}
+