Blame


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>
5 551445b9 2004-04-21 devnull
6 551445b9 2004-04-21 devnull enum
7 551445b9 2004-04-21 devnull {
8 cbeb0b26 2006-04-01 devnull MaxRead = 17000
9 551445b9 2004-04-21 devnull };
10 551445b9 2004-04-21 devnull
11 551445b9 2004-04-21 devnull typedef struct SunMsgFd SunMsgFd;
12 551445b9 2004-04-21 devnull struct SunMsgFd
13 551445b9 2004-04-21 devnull {
14 551445b9 2004-04-21 devnull SunMsg msg;
15 551445b9 2004-04-21 devnull int fd;
16 551445b9 2004-04-21 devnull };
17 551445b9 2004-04-21 devnull
18 551445b9 2004-04-21 devnull typedef struct Arg Arg;
19 551445b9 2004-04-21 devnull struct Arg
20 551445b9 2004-04-21 devnull {
21 551445b9 2004-04-21 devnull SunSrv *srv;
22 551445b9 2004-04-21 devnull Channel *creply;
23 551445b9 2004-04-21 devnull Channel *csync;
24 551445b9 2004-04-21 devnull int fd;
25 551445b9 2004-04-21 devnull };
26 551445b9 2004-04-21 devnull
27 551445b9 2004-04-21 devnull static void
28 551445b9 2004-04-21 devnull sunfdread(void *v)
29 551445b9 2004-04-21 devnull {
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;
35 551445b9 2004-04-21 devnull
36 551445b9 2004-04-21 devnull sendp(arg.csync, 0);
37 551445b9 2004-04-21 devnull
38 551445b9 2004-04-21 devnull p = nil;
39 551445b9 2004-04-21 devnull tot = 0;
40 551445b9 2004-04-21 devnull for(;;){
41 551445b9 2004-04-21 devnull n = readn(arg.fd, buf, 4);
42 551445b9 2004-04-21 devnull if(n != 4)
43 551445b9 2004-04-21 devnull break;
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)
50 551445b9 2004-04-21 devnull break;
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);
58 551445b9 2004-04-21 devnull p = nil;
59 551445b9 2004-04-21 devnull tot = 0;
60 551445b9 2004-04-21 devnull }
61 551445b9 2004-04-21 devnull }
62 551445b9 2004-04-21 devnull }
63 551445b9 2004-04-21 devnull
64 551445b9 2004-04-21 devnull static void
65 551445b9 2004-04-21 devnull sunfdwrite(void *v)
66 551445b9 2004-04-21 devnull {
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;
71 551445b9 2004-04-21 devnull
72 551445b9 2004-04-21 devnull sendp(arg.csync, 0);
73 551445b9 2004-04-21 devnull
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);
85 551445b9 2004-04-21 devnull }
86 551445b9 2004-04-21 devnull }
87 551445b9 2004-04-21 devnull
88 551445b9 2004-04-21 devnull int
89 551445b9 2004-04-21 devnull sunsrvfd(SunSrv *srv, int fd)
90 551445b9 2004-04-21 devnull {
91 551445b9 2004-04-21 devnull Arg *arg;
92 551445b9 2004-04-21 devnull
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);
98 551445b9 2004-04-21 devnull
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);
103 551445b9 2004-04-21 devnull
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;
107 551445b9 2004-04-21 devnull }