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