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