mirror of https://github.com/flysand7/ciabatta.git
86 lines
1.8 KiB
C
86 lines
1.8 KiB
C
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
|
|
// Exit routines
|
|
#define ATEXIT_FUNC_COUNT 64
|
|
#define ATQEXIT_FUNC_COUNT 64
|
|
static void (*atexit_funcs [ATEXIT_FUNC_COUNT])(void);
|
|
static void (*atqexit_funcs[ATQEXIT_FUNC_COUNT])(void);
|
|
static int atexit_func_count;
|
|
static int atqexit_func_count;
|
|
|
|
static char **get_command_args(int *argcp);
|
|
|
|
// TODO: Instead of using static arrays, allocate this memory dynamically
|
|
static char cmdline[4096];
|
|
static char *cmdargs[1024];
|
|
extern int main(int argc, char** argv);
|
|
|
|
|
|
void _start() {
|
|
srand(0);
|
|
setlocale(LC_ALL, "C");
|
|
|
|
int argc;
|
|
char **argv = get_command_args(&argc);
|
|
int exit_code = main(argc, argv);
|
|
|
|
exit(exit_code);
|
|
}
|
|
|
|
_Noreturn void quick_exit(int status) {
|
|
while(atqexit_func_count--) {
|
|
atqexit_funcs[atqexit_func_count]();
|
|
}
|
|
_exit(status);
|
|
}
|
|
|
|
_Noreturn void exit(int status) {
|
|
while(atexit_func_count--) {
|
|
atexit_funcs[atqexit_func_count]();
|
|
}
|
|
// _close_io();
|
|
_exit(status);
|
|
}
|
|
|
|
_Noreturn void _Exit(int status) {
|
|
_exit(status);
|
|
}
|
|
|
|
_Noreturn void abort(void) {
|
|
// raise(SIGABRT);
|
|
_exit(-69);
|
|
}
|
|
|
|
int atexit(void (*func)(void)) {
|
|
if (atexit_func_count >= ATEXIT_FUNC_COUNT) {
|
|
return 0;
|
|
}
|
|
atexit_funcs[atexit_func_count++] = func;
|
|
return 1;
|
|
}
|
|
|
|
int at_quick_exit(void (*func)(void)) {
|
|
if(atqexit_func_count >= ATQEXIT_FUNC_COUNT) {
|
|
return 0;
|
|
}
|
|
atqexit_funcs[atqexit_func_count++] = func;
|
|
return 1;
|
|
}
|
|
|
|
static char **get_command_args(int *argcp) {
|
|
int fd = open("/proc/self/cmdline", O_RDONLY);
|
|
ssize_t size = read(fd, cmdline, sizeof cmdline);
|
|
ssize_t i = 0;
|
|
ssize_t cmd_idx = 0;
|
|
while(i != size) {
|
|
cmdargs[cmd_idx] = &cmdline[i];
|
|
while(cmdline[i] != 0) {
|
|
++i;
|
|
}
|
|
++i;
|
|
}
|
|
return cmdargs;
|
|
}
|