1*9ef1f84bSDavid du Colombier #include <u.h>
2*9ef1f84bSDavid du Colombier #include <libc.h>
3*9ef1f84bSDavid du Colombier #include <auth.h>
4*9ef1f84bSDavid du Colombier #include <fcall.h>
5*9ef1f84bSDavid du Colombier #include "../boot/boot.h"
6*9ef1f84bSDavid du Colombier
7*9ef1f84bSDavid du Colombier static Fcall hdr;
8*9ef1f84bSDavid du Colombier
9*9ef1f84bSDavid du Colombier static void
rpc(int fd,int type)10*9ef1f84bSDavid du Colombier rpc(int fd, int type)
11*9ef1f84bSDavid du Colombier {
12*9ef1f84bSDavid du Colombier int n, l;
13*9ef1f84bSDavid du Colombier char buf[128], *p;
14*9ef1f84bSDavid du Colombier
15*9ef1f84bSDavid du Colombier hdr.type = type;
16*9ef1f84bSDavid du Colombier hdr.tag = NOTAG;
17*9ef1f84bSDavid du Colombier n = convS2M(&hdr, buf);
18*9ef1f84bSDavid du Colombier if(write(fd, buf, n) != n)
19*9ef1f84bSDavid du Colombier fatal("write rpc");
20*9ef1f84bSDavid du Colombier
21*9ef1f84bSDavid du Colombier print("...");
22*9ef1f84bSDavid du Colombier p = buf;
23*9ef1f84bSDavid du Colombier l = 0;
24*9ef1f84bSDavid du Colombier while(l < 3) {
25*9ef1f84bSDavid du Colombier n = read(fd, p, 3);
26*9ef1f84bSDavid du Colombier if(n <= 0)
27*9ef1f84bSDavid du Colombier fatal("read rpc");
28*9ef1f84bSDavid du Colombier if(n == 2 && l == 0 && buf[0] == 'O' && buf[1] == 'K')
29*9ef1f84bSDavid du Colombier continue;
30*9ef1f84bSDavid du Colombier p += n;
31*9ef1f84bSDavid du Colombier l += n;
32*9ef1f84bSDavid du Colombier }
33*9ef1f84bSDavid du Colombier if(convM2S(buf, &hdr, n) == 0){
34*9ef1f84bSDavid du Colombier print("%ux %ux %ux\n", buf[0], buf[1], buf[2]);
35*9ef1f84bSDavid du Colombier fatal("rpc format");
36*9ef1f84bSDavid du Colombier }
37*9ef1f84bSDavid du Colombier if(hdr.tag != NOTAG)
38*9ef1f84bSDavid du Colombier fatal("rpc tag not NOTAG");
39*9ef1f84bSDavid du Colombier if(hdr.type == Rerror){
40*9ef1f84bSDavid du Colombier print("error %s;", hdr.ename);
41*9ef1f84bSDavid du Colombier fatal("remote error");
42*9ef1f84bSDavid du Colombier }
43*9ef1f84bSDavid du Colombier if(hdr.type != type+1)
44*9ef1f84bSDavid du Colombier fatal("not reply");
45*9ef1f84bSDavid du Colombier }
46*9ef1f84bSDavid du Colombier
47*9ef1f84bSDavid du Colombier void
nop(int fd)48*9ef1f84bSDavid du Colombier nop(int fd)
49*9ef1f84bSDavid du Colombier {
50*9ef1f84bSDavid du Colombier print("nop");
51*9ef1f84bSDavid du Colombier rpc(fd, Tnop);
52*9ef1f84bSDavid du Colombier }
53