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