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