37 lines
573 B
C
37 lines
573 B
C
/*
|
|
* onexit.c
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include "atexit.h"
|
|
|
|
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;
|
|
|
|
return 0;
|
|
}
|