diff options
author | hpa <hpa> | 2004-11-10 22:31:50 +0000 |
---|---|---|
committer | hpa <hpa> | 2004-11-10 22:31:50 +0000 |
commit | 17f967640cef484f83d755c9dd016a946711236f (patch) | |
tree | 00bf0c0f2926cd6a9761eb372b55d090305aca44 /com32/lib/onexit.c | |
parent | c67a2ac96611fa6aeb9ff3602c5e0c8265f1cc9d (diff) | |
download | syslinux-17f967640cef484f83d755c9dd016a946711236f.tar.gz |
Very first cut at a klibc-derived C library for com32
Diffstat (limited to 'com32/lib/onexit.c')
-rw-r--r-- | com32/lib/onexit.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/com32/lib/onexit.c b/com32/lib/onexit.c new file mode 100644 index 00000000..70a9c01f --- /dev/null +++ b/com32/lib/onexit.c @@ -0,0 +1,39 @@ +/* + * 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; +} |