summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/com32/lib/onexit.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux-4.02/com32/lib/onexit.c')
-rw-r--r--contrib/syslinux-4.02/com32/lib/onexit.c39
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;
+}