4 readmsg(Chan *c, void *abuf, int n, int *ninep)
12 if(readn(fd, buf, 3) != 3){
14 print("readn(3) fails: %r\n");
17 if((50 <= buf[0] && buf[0] <= 87 && (buf[0]&1)==0 && GBIT16(buf+1) == 0xFFFF)
18 || buf[0] == 86 /* Tattach */){
20 /* assume message boundaries */
21 n = read(fd, buf+3, n-3);
30 if(read(fd, buf+3, 1) != 1){
32 print("read(1) fails: %r\n");
37 print("msg too large\n");
41 if(readn(fd, buf+4, len-4) != len-4){
42 print("readn(%d) fails: %r\n", len-4);
51 startserveproc(void (*f)(Chan*, uchar*, int), char *name, Chan *c, uchar *b, int nb)
55 switch(pid = rfork(RFMEM|RFPROC)){
66 return -1; /* can't happen */
74 void (*s)(Chan*, uchar*, int);
79 if((nin = readmsg(chan, inbuf, sizeof inbuf, &p9)) < 0)
84 print("unknown 9P type\n");
94 pid = malloc(sizeof(pid)*(conf.nserve-1));
97 for(i=1; i<conf.nserve; i++)
98 pid[i-1] = startserveproc(s, "srv", chan, nil, 0);
100 (*s)(chan, inbuf, nin);
102 /* wait till all other servers for this chan are done */
103 for(npid = conf.nserve-1; npid > 0;){
107 for(i = 0; i < conf.nserve-1; i++)