xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/_exit.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
13e12c5d1SDavid du Colombier #include "lib.h"
23e12c5d1SDavid du Colombier #include "sys9.h"
33e12c5d1SDavid du Colombier #include <stdlib.h>
43e12c5d1SDavid du Colombier #include <string.h>
53e12c5d1SDavid du Colombier #include <unistd.h>
6219b2ee8SDavid du Colombier #include <signal.h>
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier int _finishing = 0;
93e12c5d1SDavid du Colombier int _sessleader = 0;
103e12c5d1SDavid du Colombier 
11*9a747e4fSDavid du Colombier static char exitstatus[ERRMAX];
123e12c5d1SDavid du Colombier 
133e12c5d1SDavid du Colombier void
_exit(int status)143e12c5d1SDavid du Colombier _exit(int status)
153e12c5d1SDavid du Colombier {
163e12c5d1SDavid du Colombier 	_finish(status, 0);
173e12c5d1SDavid du Colombier }
183e12c5d1SDavid du Colombier 
193e12c5d1SDavid du Colombier void
_finish(int status,char * term)203e12c5d1SDavid du Colombier _finish(int status, char *term)
213e12c5d1SDavid du Colombier {
223e12c5d1SDavid du Colombier 	char *cp;
233e12c5d1SDavid du Colombier 
243e12c5d1SDavid du Colombier 	if(_finishing)
253e12c5d1SDavid du Colombier 		_EXITS(exitstatus);
263e12c5d1SDavid du Colombier 	_finishing = 1;
273e12c5d1SDavid du Colombier 	if(status){
283e12c5d1SDavid du Colombier 		cp = _ultoa(exitstatus, status & 0xFF);
293e12c5d1SDavid du Colombier 		*cp = 0;
303e12c5d1SDavid du Colombier 	}else if(term){
31*9a747e4fSDavid du Colombier 		strncpy(exitstatus, term, ERRMAX);
32*9a747e4fSDavid du Colombier 		exitstatus[ERRMAX-1] = '\0';
333e12c5d1SDavid du Colombier 	}
34219b2ee8SDavid du Colombier 	if(_sessleader)
35219b2ee8SDavid du Colombier 		kill(0, SIGTERM);
363e12c5d1SDavid du Colombier 	_EXITS(exitstatus);
373e12c5d1SDavid du Colombier }
383e12c5d1SDavid du Colombier 
393e12c5d1SDavid du Colombier /* emulate: return p+sprintf(p, "%uld", v) */
403e12c5d1SDavid du Colombier #define IDIGIT 15
413e12c5d1SDavid du Colombier char *
_ultoa(char * p,unsigned long v)423e12c5d1SDavid du Colombier _ultoa(char *p, unsigned long v)
433e12c5d1SDavid du Colombier {
443e12c5d1SDavid du Colombier 	char s[IDIGIT];
453e12c5d1SDavid du Colombier 	int n, i;
463e12c5d1SDavid du Colombier 
473e12c5d1SDavid du Colombier 	s[IDIGIT-1] = 0;
483e12c5d1SDavid du Colombier 	for(i = IDIGIT-2; i; i--){
493e12c5d1SDavid du Colombier 		n = v % 10;
503e12c5d1SDavid du Colombier 		s[i] = n + '0';
513e12c5d1SDavid du Colombier 		v = v / 10;
523e12c5d1SDavid du Colombier 		if(v == 0)
533e12c5d1SDavid du Colombier 			break;
543e12c5d1SDavid du Colombier 	}
553e12c5d1SDavid du Colombier 	strcpy(p, s+i);
563e12c5d1SDavid du Colombier 	return p + (IDIGIT-1-i);
573e12c5d1SDavid du Colombier }
58