diff options
Diffstat (limited to 'contrib/syslinux-4.02/com32/lib/onexit.c')
-rw-r--r-- | contrib/syslinux-4.02/com32/lib/onexit.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/com32/lib/onexit.c b/contrib/syslinux-4.02/com32/lib/onexit.c new file mode 100644 index 0000000..d409e82 --- /dev/null +++ b/contrib/syslinux-4.02/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; +} |