diff options
author | Kozlov Dmitry <dima@server> | 2010-09-06 18:27:02 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2010-09-06 18:27:02 +0400 |
commit | 45243dd2f2be49cd91be1dc28932e6c9040db6a1 (patch) | |
tree | 652896ecd889d58d4a3c9d3232c85ff831b31699 /accel-pptpd/triton/event.c | |
parent | af5a96e2d04056b065a36ecbd140a16d0685c7e6 (diff) | |
download | accel-ppp-45243dd2f2be49cd91be1dc28932e6c9040db6a1.tar.gz accel-ppp-45243dd2f2be49cd91be1dc28932e6c9040db6a1.zip |
working on radius module
Diffstat (limited to 'accel-pptpd/triton/event.c')
-rw-r--r-- | accel-pptpd/triton/event.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/accel-pptpd/triton/event.c b/accel-pptpd/triton/event.c new file mode 100644 index 00000000..17483ec7 --- /dev/null +++ b/accel-pptpd/triton/event.c @@ -0,0 +1,103 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include "triton_p.h" + +static int max_events = 1024; +static struct _triton_event_t **events; + +struct event_handler_t +{ + struct list_head entry; + triton_event_func func; +}; + +int event_init(void) +{ + events = malloc(max_events * sizeof(void *)); + if (!events) { + fprintf(stderr,"event:cann't allocate memory\n"); + return -1; + } + + memset(events, 0, max_events * sizeof(void *)); + + return 0; +} + +int triton_event_register_handler(int ev_id, triton_event_func func) +{ + struct _triton_event_t *ev; + struct event_handler_t *h; + + if (ev_id >= max_events) + return -1; + + ev = events[ev_id]; + if (!ev) { + ev = malloc(sizeof(*ev)); + if (!ev) { + triton_log_error("event: out of memory\n"); + return -1; + } + INIT_LIST_HEAD(&ev->handlers); + events[ev_id] = ev; + } + + h = malloc(sizeof(*h)); + if (!h) { + triton_log_error("event: out of memory\n"); + return -1; + } + + h->func = func; + list_add_tail(&h->entry, &ev->handlers); + + return 0; +} + +/*int triton_event_unregister_handler(int ev_id, triton_event_func func) +{ + struct _triton_event_t *ev; + struct event_handler_t *h; + + if (ev_id >= max_events) + return -1; + + ev = events[ev_id]; + if (!ev) { + return -1; + } + + list_for_each_entry(h, &ev->handlers, entry) { + if (h->func == func) { + if (ev->in_progress) + h->func = NULL; + else { + list_del(&h->entry); + free(h); + } + return 0; + } + } + + return -1; +}*/ + +void triton_event_fire(int ev_id, void *arg) +{ + struct _triton_event_t *ev; + struct event_handler_t *h; + + if (ev_id >= max_events) + return; + + ev = events[ev_id]; + if (!ev) + return; + + list_for_each_entry(h, &ev->handlers, entry) + h->func(arg); +} + |