1 /* event.c -- event management stuff
3 * author: hackbard@hackdaworld.dyndns.org
9 int event_init(t_event *event,int outfd) {
11 dprintf(outfd,"[event] initializing event system ...\n");
17 FD_ZERO(&(event->rfds));
18 FD_ZERO(&(event->rfds_o));
19 FD_ZERO(&(event->wfds));
20 FD_ZERO(&(event->wfds_o));
25 int event_set_timeout(t_event *event,int sec,int usec) {
27 event->timeout.tv_sec=sec;
28 event->timeout.tv_usec=usec;
33 int event_set_immediately(t_event *event,unsigned char value) {
36 event->immediately=value;
41 int event_math(int fd,t_event *event,char rw,char ar) {
44 if(rw==READ) FD_SET(fd,&(event->rfds_o));
45 else FD_SET(fd,&(event->wfds_o));
46 if(fd>event->maxfd) event->maxfd=fd;
48 if(rw==READ) FD_CLR(fd,&(event->rfds_o));
49 else FD_CLR(fd,&(event->wfds_o));
50 if(fd==event->maxfd) event->maxfd-=1;
53 dprintf(event->outfd,"[event] %c fd %d to %c file descriptor set\n",
54 ar==ADD?'+':'-',fd,rw==READ?'r':'w');
59 int event_start(t_event *event,void *ptr,
60 int (*callback0)(t_event *event,void *ptr),
61 int (*callback1)(t_event *event,void *ptr)) {
65 struct timeval *tv_ptr;
67 /* switch on event system */
68 event->status=ENABLED;
70 while(event->status&ENABLED) {
72 event->rfds=event->rfds_o;
73 event->wfds=event->wfds_o;
76 if((tv.tv_sec==0)&&(tv.tv_usec==0)&&(!(event->immediately))) tv_ptr=NULL;
79 if((s_ret=select(event->maxfd+1,&(event->rfds),&(event->wfds),NULL,
81 perror("[event] select call");
86 /* 1+ fd(s) available for reading/writing */
87 if(callback0(event,ptr)==CALLBACK_ERROR) {
88 dprintf(event->outfd,"[event] callback0 returned error\n");
93 /* usual stuff to be executed */
94 if(callback1(event,ptr)==CALLBACK_ERROR) {
95 dprintf(event->outfd,"[event] callback returned error\n");
104 int event_check(t_event *event,int fd) {
106 if(FD_ISSET(fd,&(event->wfds))|FD_ISSET(fd,&(event->rfds))) return E_FD_YES;
111 int event_stop(t_event *event) {
113 dprintf(event->outfd,"[event] shutdown\n");
114 event->status=DISABLED;