Added different callback handlers for each event
diff --git a/libltrace.c b/libltrace.c
index 731ead2..6827257 100644
--- a/libltrace.c
+++ b/libltrace.c
@@ -119,34 +119,38 @@
 	}
 }
 
-static int num_ltrace_callbacks = 0;
-static void (**ltrace_callbacks)(Event *) = NULL;
+static int num_ltrace_callbacks[EVENT_MAX];
+static callback_func * ltrace_callbacks[EVENT_MAX];
 
 void
-ltrace_add_callback(void (*func)(Event *)) {
-	ltrace_callbacks = realloc(ltrace_callbacks, (num_ltrace_callbacks+1)*sizeof(*ltrace_callbacks));
-	ltrace_callbacks[num_ltrace_callbacks++] = func;
+ltrace_add_callback(callback_func func, Event_type type) {
+	ltrace_callbacks[type] = realloc(ltrace_callbacks[type], (num_ltrace_callbacks[type]+1)*sizeof(callback_func));
+	ltrace_callbacks[type][num_ltrace_callbacks[type]++] = func;
+}
 
-	{
-		int i;
-
-		printf("*** Added callback\n");
-		printf("\tThere are %d callbacks:\n", num_ltrace_callbacks);
-		for (i=0; i<num_ltrace_callbacks; i++) {
-			printf("\t\t%10p\n", ltrace_callbacks[i]);
-		}
+static void
+dispatch_callbacks(Event * ev) {
+	int i;
+	/* Ignoring case 1: signal into a dying tracer */
+	if (ev->type==EVENT_SIGNAL && 
+			exiting && ev->e_un.signum == SIGSTOP) {
+		return;
+	}
+	/* Ignoring case 2: process being born before a clone event */
+	if (ev->proc && ev->proc->state == STATE_IGNORED) {
+		return;
+	}
+	for (i=0; i<num_ltrace_callbacks[ev->type]; i++) {
+		ltrace_callbacks[ev->type][i](ev);
 	}
 }
 
 void
 ltrace_main(void) {
-	int i;
 	Event * ev;
 	while (1) {
 		ev = next_event();
-		for (i=0; i<num_ltrace_callbacks; i++) {
-			ltrace_callbacks[i](ev);
-		}
+		dispatch_callbacks(ev);
 		handle_event(ev);
 	}
 }