renamed inet.* -> network.*; bugfixes; began input system ...
[my-code/ivac.git] / src / event.c
index d7ea42d..bd703a5 100644 (file)
@@ -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;
 }