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