blob: 70a9c01f615ee472a450839c6621132ae278fc93 [file] [log] [blame]
/*
* onexit.c
*/
#include <stdlib.h>
#include <unistd.h>
#include "atexit.h"
extern __noreturn (*__exit_handler)(int);
static struct atexit *__atexit_list;
static __noreturn on_exit_exit(int rv)
{
struct atexit *ap;
for ( ap = __atexit_list ; ap ; ap = ap->next ) {
ap->fctn(rv, ap->arg); /* This assumes extra args are harmless */
}
_exit(rv);
}
int on_exit(void (*fctn)(int, void *), void *arg)
{
struct atexit *as = malloc(sizeof(struct atexit));
if ( !as )
return -1;
as->fctn = fctn;
as->arg = arg;
as->next = __atexit_list;
__atexit_list = as;
__exit_handler = on_exit_exit;
return 0;
}