1 551445b9 2004-04-21 devnull #include <u.h>
2 551445b9 2004-04-21 devnull #include <libc.h>
3 551445b9 2004-04-21 devnull #include <thread.h>
4 551445b9 2004-04-21 devnull #include <sunrpc.h>
8 551445b9 2004-04-21 devnull MaxRead = 17000,
11 551445b9 2004-04-21 devnull typedef struct SunMsgFd SunMsgFd;
12 551445b9 2004-04-21 devnull struct SunMsgFd
14 551445b9 2004-04-21 devnull SunMsg msg;
18 551445b9 2004-04-21 devnull typedef struct Arg Arg;
19 551445b9 2004-04-21 devnull struct Arg
21 551445b9 2004-04-21 devnull SunSrv *srv;
22 551445b9 2004-04-21 devnull Channel *creply;
23 551445b9 2004-04-21 devnull Channel *csync;
27 551445b9 2004-04-21 devnull static void
28 551445b9 2004-04-21 devnull sunfdread(void *v)
30 551445b9 2004-04-21 devnull uint n, tot;
31 551445b9 2004-04-21 devnull int done;
32 551445b9 2004-04-21 devnull uchar buf[4], *p;
33 551445b9 2004-04-21 devnull Arg arg = *(Arg*)v;
34 551445b9 2004-04-21 devnull SunMsgFd *msg;
36 551445b9 2004-04-21 devnull sendp(arg.csync, 0);
41 551445b9 2004-04-21 devnull n = readn(arg.fd, buf, 4);
42 551445b9 2004-04-21 devnull if(n != 4)
44 551445b9 2004-04-21 devnull n = (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|buf[3];
45 551445b9 2004-04-21 devnull if(arg.srv->chatty) fprint(2, "%.8ux...", n);
46 551445b9 2004-04-21 devnull done = n&0x80000000;
47 551445b9 2004-04-21 devnull n &= ~0x80000000;
48 551445b9 2004-04-21 devnull p = erealloc(p, tot+n);
49 551445b9 2004-04-21 devnull if(readn(arg.fd, p+tot, n) != n)
51 551445b9 2004-04-21 devnull tot += n;
52 551445b9 2004-04-21 devnull if(done){
53 551445b9 2004-04-21 devnull msg = emalloc(sizeof(SunMsgFd));
54 551445b9 2004-04-21 devnull msg->msg.data = p;
55 551445b9 2004-04-21 devnull msg->msg.count = tot;
56 551445b9 2004-04-21 devnull msg->msg.creply = arg.creply;
57 551445b9 2004-04-21 devnull sendp(arg.srv->crequest, msg);
64 551445b9 2004-04-21 devnull static void
65 551445b9 2004-04-21 devnull sunfdwrite(void *v)
67 551445b9 2004-04-21 devnull uchar buf[4];
68 551445b9 2004-04-21 devnull u32int n;
69 551445b9 2004-04-21 devnull Arg arg = *(Arg*)v;
70 551445b9 2004-04-21 devnull SunMsgFd *msg;
72 551445b9 2004-04-21 devnull sendp(arg.csync, 0);
74 551445b9 2004-04-21 devnull while((msg = recvp(arg.creply)) != nil){
75 551445b9 2004-04-21 devnull n = msg->msg.count;
76 551445b9 2004-04-21 devnull buf[0] = (n>>24)|0x80;
77 551445b9 2004-04-21 devnull buf[1] = n>>16;
78 551445b9 2004-04-21 devnull buf[2] = n>>8;
79 551445b9 2004-04-21 devnull buf[3] = n;
80 551445b9 2004-04-21 devnull if(write(arg.fd, buf, 4) != 4
81 551445b9 2004-04-21 devnull || write(arg.fd, msg->msg.data, msg->msg.count) != msg->msg.count)
82 551445b9 2004-04-21 devnull fprint(2, "sunfdwrite: %r\n");
83 551445b9 2004-04-21 devnull free(msg->msg.data);
84 551445b9 2004-04-21 devnull free(msg);
89 551445b9 2004-04-21 devnull sunsrvfd(SunSrv *srv, int fd)
91 551445b9 2004-04-21 devnull Arg *arg;
93 551445b9 2004-04-21 devnull arg = emalloc(sizeof(Arg));
94 551445b9 2004-04-21 devnull arg->fd = fd;
95 551445b9 2004-04-21 devnull arg->srv = srv;
96 551445b9 2004-04-21 devnull arg->csync = chancreate(sizeof(void*), 0);
97 551445b9 2004-04-21 devnull arg->creply = chancreate(sizeof(SunMsg*), 10);
99 551445b9 2004-04-21 devnull proccreate(sunfdread, arg, SunStackSize);
100 551445b9 2004-04-21 devnull proccreate(sunfdwrite, arg, SunStackSize);
101 551445b9 2004-04-21 devnull recvp(arg->csync);
102 551445b9 2004-04-21 devnull recvp(arg->csync);
104 551445b9 2004-04-21 devnull chanfree(arg->csync);
105 551445b9 2004-04-21 devnull free(arg);
106 551445b9 2004-04-21 devnull return 0;