]> andersk Git - gssapi-openssh.git/blobdiff - openssh/log.c
Re-import of OpenSSH 3.7.1p2 (Chase\!)
[gssapi-openssh.git] / openssh / log.c
index 686a2a43cbd9413d1b56af5e02945b14f1a98d10..9bce2555baa9f55c50578b2943b3844941733dce 100644 (file)
@@ -34,7 +34,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: log.c,v 1.29 2003/09/23 20:17:11 markus Exp $");
+RCSID("$OpenBSD: log.c,v 1.28 2003/05/24 09:02:22 djm Exp $");
 
 #include "log.h"
 #include "xmalloc.h"
@@ -183,6 +183,83 @@ debug3(const char *fmt,...)
        va_end(args);
 }
 
+/* Fatal cleanup */
+
+struct fatal_cleanup {
+       struct fatal_cleanup *next;
+       void (*proc) (void *);
+       void *context;
+};
+
+static struct fatal_cleanup *fatal_cleanups = NULL;
+
+/* Registers a cleanup function to be called by fatal() before exiting. */
+
+void
+fatal_add_cleanup(void (*proc) (void *), void *context)
+{
+       struct fatal_cleanup *cu;
+
+       cu = xmalloc(sizeof(*cu));
+       cu->proc = proc;
+       cu->context = context;
+       cu->next = fatal_cleanups;
+       fatal_cleanups = cu;
+}
+
+/* Removes a cleanup frunction to be called at fatal(). */
+
+void
+fatal_remove_cleanup(void (*proc) (void *context), void *context)
+{
+       struct fatal_cleanup **cup, *cu;
+
+       for (cup = &fatal_cleanups; *cup; cup = &cu->next) {
+               cu = *cup;
+               if (cu->proc == proc && cu->context == context) {
+                       *cup = cu->next;
+                       xfree(cu);
+                       return;
+               }
+       }
+       fatal("fatal_remove_cleanup: no such cleanup function: 0x%lx 0x%lx",
+           (u_long) proc, (u_long) context);
+}
+
+/* Remove all cleanups, to be called after fork() */
+void
+fatal_remove_all_cleanups(void)
+{
+       struct fatal_cleanup *cu, *next_cu;
+
+       for (cu = fatal_cleanups; cu; cu = next_cu) {
+               next_cu = cu->next;
+               xfree(cu);
+       }
+       fatal_cleanups = NULL;
+}
+
+/* Cleanup and exit */
+void
+fatal_cleanup(void)
+{
+       struct fatal_cleanup *cu, *next_cu;
+       static int called = 0;
+
+       if (called)
+               exit(255);
+       called = 1;
+       /* Call cleanup functions. */
+       for (cu = fatal_cleanups; cu; cu = next_cu) {
+               next_cu = cu->next;
+               debug("Calling cleanup 0x%lx(0x%lx)",
+                   (u_long) cu->proc, (u_long) cu->context);
+               (*cu->proc) (cu->context);
+       }
+       exit(255);
+}
+
+
 /*
  * Initialize the log.
  */
This page took 4.874866 seconds and 4 git commands to generate.