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