Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include "lib.h"
#include "sys9.h"
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

int _finishing = 0;
int _sessleader = 0;

static char exitstatus[ERRMAX];

void
_exit(int status)
{
        _finish(status, 0);
}

void
_finish(int status, char *term)
{
        char *cp;

        if(_finishing)
                _EXITS(exitstatus);
        _finishing = 1;
        if(status){
                cp = _ultoa(exitstatus, status & 0xFF);
                *cp = 0;
        }else if(term){
                strncpy(exitstatus, term, ERRMAX);
                exitstatus[ERRMAX-1] = '\0';
        }
        if(_sessleader)
                kill(0, SIGTERM);
        _EXITS(exitstatus);
}

/* emulate: return p+sprintf(p, "%uld", v) */
#define IDIGIT 15
char *
_ultoa(char *p, unsigned long v)
{
        char s[IDIGIT];
        int n, i;

        s[IDIGIT-1] = 0;
        for(i = IDIGIT-2; i; i--){
                n = v % 10;
                s[i] = n + '0';
                v = v / 10;
                if(v == 0)
                        break;
        }
        strcpy(p, s+i);
        return p + (IDIGIT-1-i);
}