xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/_exit.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 #include "lib.h"
2 #include "sys9.h"
3 #include <stdlib.h>
4 #include <string.h>
5 #include <unistd.h>
6 #include <signal.h>
7 
8 int _finishing = 0;
9 int _sessleader = 0;
10 
11 static char exitstatus[ERRMAX];
12 
13 void
14 _exit(int status)
15 {
16 	_finish(status, 0);
17 }
18 
19 void
20 _finish(int status, char *term)
21 {
22 	int i, nalive;
23 	char *cp;
24 
25 	if(_finishing)
26 		_EXITS(exitstatus);
27 	_finishing = 1;
28 	if(status){
29 		cp = _ultoa(exitstatus, status & 0xFF);
30 		*cp = 0;
31 	}else if(term){
32 		strncpy(exitstatus, term, ERRMAX);
33 		exitstatus[ERRMAX-1] = '\0';
34 	}
35 	if(_sessleader)
36 		kill(0, SIGTERM);
37 	_EXITS(exitstatus);
38 }
39 
40 /* emulate: return p+sprintf(p, "%uld", v) */
41 #define IDIGIT 15
42 char *
43 _ultoa(char *p, unsigned long v)
44 {
45 	char s[IDIGIT];
46 	int n, i;
47 
48 	s[IDIGIT-1] = 0;
49 	for(i = IDIGIT-2; i; i--){
50 		n = v % 10;
51 		s[i] = n + '0';
52 		v = v / 10;
53 		if(v == 0)
54 			break;
55 	}
56 	strcpy(p, s+i);
57 	return p + (IDIGIT-1-i);
58 }
59