xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/_exit.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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
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
203e12c5d1SDavid du Colombier _finish(int status, char *term)
213e12c5d1SDavid du Colombier {
223e12c5d1SDavid du Colombier 	int i, nalive;
233e12c5d1SDavid du Colombier 	char *cp;
243e12c5d1SDavid du Colombier 
253e12c5d1SDavid du Colombier 	if(_finishing)
263e12c5d1SDavid du Colombier 		_EXITS(exitstatus);
273e12c5d1SDavid du Colombier 	_finishing = 1;
283e12c5d1SDavid du Colombier 	if(status){
293e12c5d1SDavid du Colombier 		cp = _ultoa(exitstatus, status & 0xFF);
303e12c5d1SDavid du Colombier 		*cp = 0;
313e12c5d1SDavid du Colombier 	}else if(term){
32*9a747e4fSDavid du Colombier 		strncpy(exitstatus, term, ERRMAX);
33*9a747e4fSDavid du Colombier 		exitstatus[ERRMAX-1] = '\0';
343e12c5d1SDavid du Colombier 	}
35219b2ee8SDavid du Colombier 	if(_sessleader)
36219b2ee8SDavid du Colombier 		kill(0, SIGTERM);
373e12c5d1SDavid du Colombier 	_EXITS(exitstatus);
383e12c5d1SDavid du Colombier }
393e12c5d1SDavid du Colombier 
403e12c5d1SDavid du Colombier /* emulate: return p+sprintf(p, "%uld", v) */
413e12c5d1SDavid du Colombier #define IDIGIT 15
423e12c5d1SDavid du Colombier char *
433e12c5d1SDavid du Colombier _ultoa(char *p, unsigned long v)
443e12c5d1SDavid du Colombier {
453e12c5d1SDavid du Colombier 	char s[IDIGIT];
463e12c5d1SDavid du Colombier 	int n, i;
473e12c5d1SDavid du Colombier 
483e12c5d1SDavid du Colombier 	s[IDIGIT-1] = 0;
493e12c5d1SDavid du Colombier 	for(i = IDIGIT-2; i; i--){
503e12c5d1SDavid du Colombier 		n = v % 10;
513e12c5d1SDavid du Colombier 		s[i] = n + '0';
523e12c5d1SDavid du Colombier 		v = v / 10;
533e12c5d1SDavid du Colombier 		if(v == 0)
543e12c5d1SDavid du Colombier 			break;
553e12c5d1SDavid du Colombier 	}
563e12c5d1SDavid du Colombier 	strcpy(p, s+i);
573e12c5d1SDavid du Colombier 	return p + (IDIGIT-1-i);
583e12c5d1SDavid du Colombier }
59