X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fivac.git;a=blobdiff_plain;f=src%2Fevent.c;h=bd703a5acbc6318c13c4f3237b90b92a747375a4;hp=d7ea42d8fbfef55ea17f44db8b31c596e4064ffb;hb=4546108a81317af1135683e85b9340715e585339;hpb=4344661d0612465223b516b4c1132260eeba34d1 diff --git a/src/event.c b/src/event.c index d7ea42d..bd703a5 100644 --- a/src/event.c +++ b/src/event.c @@ -6,16 +6,80 @@ #include "event.h" -int event_init(t_ivac *ivac) { +int event_init(t_event *event) { - puts("[ivac] event: initializing event system ..."); + puts("[event] initializing event system ..."); - ivac->event.maxfd=0; + event->maxfd=0; - FD_ZERO(ivac->event.rfds); - FD_ZERO(ivac->event.rfds_c); - FD_ZERO(ivac->event.wfds); - FD_ZERO(ivac->event.wfds_c); + FD_ZERO(&(event->rfds)); + FD_ZERO(&(event->rfds_o)); + FD_ZERO(&(event->wfds)); + FD_ZERO(&(event->wfds_o)); - return SUCCESS; + return E_SUCCESS; +} + +int event_math(int fd,t_event *event,char rw,char ar) { + + if(ar==ADD) { + if(rw==READ) FD_SET(fd,&(event->rfds_o)); + else FD_SET(fd,&(event->wfds_o)); + if(fd>event->maxfd) event->maxfd=fd; + } else { + if(rw==READ) FD_CLR(fd,&(event->rfds_o)); + else FD_CLR(fd,&(event->wfds_o)); + if(fd==event->maxfd) event->maxfd-=1; + } + + printf("[event] %c fd %d to %c file descriptor set\n",ar==ADD?'+':'-',fd, + rw==READ?'r':'w'); + + return E_SUCCESS; +} + +int event_start(t_event *event,void *ptr, + int (*callback0)(t_event *event,void *ptr), + int (*callback1)(t_event *event,void *ptr)) { + + int s_ret; + + /* switch on event system */ + event->status=ENABLED; + + while(event->status&ENABLED) { + + event->rfds=event->rfds_o; + event->wfds=event->wfds_o; + + if((s_ret=select(event->maxfd+1,&(event->rfds),&(event->wfds),NULL, + &(event->timeout)))==-1) { + perror("[event] select call"); + return E_ERROR; + } + + if(s_ret) { + /* 1+ fd(s) available for reading/writing */ + if(callback0(event,ptr)==CALLBACK_ERROR) { + puts("[event] callback0 returned error"); + return E_ERROR; + } + } + + /* usual stuff to be executed */ + if(callback1(event,ptr)==CALLBACK_ERROR) { + puts("[event] callback returned error"); + return E_ERROR; + } + + } + + return E_SUCCESS; +} + +int event_stop(t_event *event) { + + event->status=DISABLED; + + return E_SUCCESS; }