_exit.c 875 B

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