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