xref: /inferno-os/appl/lib/exception.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Exception;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsythinclude "exception.m";
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsythgetexc(pid: int): (int, string, string)
8*37da2899SCharles.Forsyth{
9*37da2899SCharles.Forsyth	loadsys();
10*37da2899SCharles.Forsyth	if(pid < 0)
11*37da2899SCharles.Forsyth		pid = sys->pctl(0, nil);
12*37da2899SCharles.Forsyth	f := "/prog/"+string pid+"/exception";
13*37da2899SCharles.Forsyth	if((fd := sys->open(f, Sys->OREAD)) == nil)
14*37da2899SCharles.Forsyth		return (0, nil, nil);
15*37da2899SCharles.Forsyth	b := array[8192] of byte;
16*37da2899SCharles.Forsyth	if((n := sys->read(fd, b, len b)) < 0)
17*37da2899SCharles.Forsyth		return (0, nil, nil);
18*37da2899SCharles.Forsyth	s := string b[0: n];
19*37da2899SCharles.Forsyth	if(s == nil)
20*37da2899SCharles.Forsyth		return (0, nil, nil);
21*37da2899SCharles.Forsyth	(m, l) := sys->tokenize(s, " ");
22*37da2899SCharles.Forsyth	if(m < 3)
23*37da2899SCharles.Forsyth		return (0, nil, nil);
24*37da2899SCharles.Forsyth	pc := int hd l;	l = tl l;
25*37da2899SCharles.Forsyth	mod := hd l;	l = tl l;
26*37da2899SCharles.Forsyth	exc := hd l;	l = tl l;
27*37da2899SCharles.Forsyth	for( ; l != nil; l = tl l)
28*37da2899SCharles.Forsyth		exc += " " + hd l;
29*37da2899SCharles.Forsyth	return (pc, mod, exc);
30*37da2899SCharles.Forsyth}
31*37da2899SCharles.Forsyth
32*37da2899SCharles.Forsythsetexcmode(mode: int): int
33*37da2899SCharles.Forsyth{
34*37da2899SCharles.Forsyth	loadsys();
35*37da2899SCharles.Forsyth	pid := sys->pctl(0, nil);
36*37da2899SCharles.Forsyth	f := "/prog/" + string pid + "/ctl";
37*37da2899SCharles.Forsyth	if(mode == NOTIFYLEADER)
38*37da2899SCharles.Forsyth		return write(f, "exceptions notifyleader");
39*37da2899SCharles.Forsyth	else if(mode == PROPAGATE)
40*37da2899SCharles.Forsyth		return write(f, "exceptions propagate");
41*37da2899SCharles.Forsyth	else
42*37da2899SCharles.Forsyth		return -1;
43*37da2899SCharles.Forsyth}
44*37da2899SCharles.Forsyth
45*37da2899SCharles.Forsythloadsys()
46*37da2899SCharles.Forsyth{
47*37da2899SCharles.Forsyth	if(sys == nil)
48*37da2899SCharles.Forsyth		sys = load Sys Sys->PATH;
49*37da2899SCharles.Forsyth}
50*37da2899SCharles.Forsyth
51*37da2899SCharles.Forsythwrite(f: string, s: string): int
52*37da2899SCharles.Forsyth{
53*37da2899SCharles.Forsyth	if((fd := sys->open(f, Sys->OWRITE)) == nil)
54*37da2899SCharles.Forsyth		return -1;
55*37da2899SCharles.Forsyth	b := array of byte s;
56*37da2899SCharles.Forsyth	if((n := sys->write(fd, b, len b)) != len b)
57*37da2899SCharles.Forsyth		return -1;
58*37da2899SCharles.Forsyth	return 0;
59*37da2899SCharles.Forsyth}
60