398e1568810418eb5e4656fed4fa0a1f6f8282d4
[my-code/ivac.git] / src / event.c
1 /* event.c -- event management stuff
2  *
3  * author: hackbard@hackdaworld.dyndns.org
4  *
5  */
6
7 #include "event.h"
8
9 int event_init(t_event *event) {
10
11   puts("[event] initializing event system ...");
12
13   event->maxfd=0;
14
15   FD_ZERO(&(event->rfds));
16   FD_ZERO(&(event->rfds_o));
17   FD_ZERO(&(event->wfds));
18   FD_ZERO(&(event->wfds_o));
19
20   return E_SUCCESS;
21 }
22
23 int event_math(int fd,t_event *event,char rw,char ar) {
24
25   if(ar==ADD) {
26     if(rw==READ) FD_SET(fd,&(event->rfds_o));
27     else FD_SET(fd,&(event->wfds_o));
28     if(fd>event->maxfd) event->maxfd=fd;
29   } else {
30     if(rw==READ) FD_CLR(fd,&(event->rfds_o));
31     else FD_CLR(fd,&(event->wfds_o));
32     if(fd==event->maxfd) event->maxfd-=1;
33   }
34
35   printf("[event] %c fd %d to %c file descriptor set\n",ar==ADD?'+':'-',fd,
36                                                         rw==READ?'r':'w');
37
38   return E_SUCCESS;
39 }
40
41 int event_start(t_event *event,void *ptr,
42                 int (*callback0)(t_event *event,void *ptr),
43                 int (*callback1)(t_event *event,void *ptr)) {
44
45   int s_ret;
46
47   /* switch on event system */
48   event->status=ENABLED;
49
50   while(event->status&ENABLED) {
51
52     event->rfds=event->rfds_o;
53     event->wfds=event->wfds_o;
54
55     if((s_ret=select(event->maxfd+1,&(event->rfds),&(event->wfds),NULL,
56                      &(event->timeout)))==-1) {
57       perror("[event] select call");
58       return E_ERROR;
59     }
60
61     if(s_ret) {
62       /* 1+ fd(s) available for reading/writing */
63       if(callback0(event,ptr)==CALLBACK_ERROR) {
64         puts("[event] callback0 returned error");
65         return E_ERROR;
66       }
67     }
68
69     /* usual stuff to be executed */
70     if(callback1(event,ptr)==CALLBACK_ERROR) {
71       puts("[event] callback returned error");
72       return E_ERROR;
73     }
74
75   }
76
77   return E_SUCCESS;
78 }
79
80 int event_stop(t_event *event) {
81
82   puts("[event] shutdown");
83   event->status=DISABLED;
84
85   return E_SUCCESS;
86 }