diff options
author | Juan Cespedes <cespedes@coco.thehackers.org> | 2009-07-03 11:55:44 +0200 |
---|---|---|
committer | Juan Cespedes <cespedes@coco.thehackers.org> | 2009-07-03 11:55:44 +0200 |
commit | 61da33723c5fb09762e38bd39a26ee15d62ffebc (patch) | |
tree | ebfece2b8b14d918468073e55b628165702ad753 /libltrace.c | |
parent | 8d1b92ba755f6d6229f5e230fc43d958b13836f8 (diff) | |
download | ltrace-61da33723c5fb09762e38bd39a26ee15d62ffebc.tar.gz |
Added different callback handlers for each event
Diffstat (limited to 'libltrace.c')
-rw-r--r-- | libltrace.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/libltrace.c b/libltrace.c index 731ead2..6827257 100644 --- a/libltrace.c +++ b/libltrace.c @@ -119,34 +119,38 @@ ltrace_init(int argc, char **argv) { } } -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; - - { - int i; +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; +} - 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); } } |