[MEDIUM] signals: add support for registering functions and tasks

The two new functions below make it possible to register any number
of functions or tasks to a system signal. They will be called in the
registration order when the signal is received.

    struct sig_handler *signal_register_fct(int sig, void (*fct)(struct sig_handler *), int arg);
    struct sig_handler *signal_register_task(int sig, struct task *task, int reason);
diff --git a/include/types/signal.h b/include/types/signal.h
index b863d23..598001e 100644
--- a/include/types/signal.h
+++ b/include/types/signal.h
@@ -1,7 +1,8 @@
 /*
+ * include/types/signal.h
  * Asynchronous signal delivery functions descriptors.
  *
- * Copyright 2000-2009 Willy Tarreau <w@1wt.eu>
+ * Copyright 2000-2010 Willy Tarreau <w@1wt.eu>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -10,11 +11,39 @@
  *
  */
 
+#ifndef _TYPES_SIGNAL_H
+#define _TYPES_SIGNAL_H
+
+
 #include <signal.h>
 #include <common/config.h>
+#include <common/mini-clist.h>
 #include <common/standard.h>
 
+/* flags for -> flags */
+#define SIG_F_ONE_SHOOT         0x0001  /* unregister handler before calling it */
+#define SIG_F_TYPE_FCT          0x0002  /* handler is a function + arg */
+#define SIG_F_TYPE_TASK         0x0004  /* handler is a task + reason */
+
+/* those are highly dynamic and stored in pools */
+struct sig_handler {
+	struct list list;
+	void *handler;                  /* function to call or task to wake up */
+	int arg;                        /* arg to pass to function, or signals*/
+	int flags;                      /* SIG_F_* */
+};
+
+/* one per signal */
 struct signal_descriptor {
-	int count;  /* number of times raised */
-	void (*handler)(int sig);
+	int count;                      /* number of times raised */
+	struct list handlers;           /* sig_handler */
 };
+
+#endif /* _TYPES_SIGNAL_H */
+
+/*
+ * Local variables:
+ *  c-indent-level: 8
+ *  c-basic-offset: 8
+ * End:
+ */