xref: /plan9-contrib/sys/src/9k/boot/nopsession.c (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
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