EGong

git clone git://xatko.vsos.ethz.ch/EGong.git
Log | Files | Refs

Waiter.c (1476B)


      1 #include <sys/time.h>
      2 #include <sys/types.h>
      3 #include <unistd.h>
      4 #include <EGong/Util/Waiter.h>
      5 #include <EGong/Interfaces.h>
      6 #include <EGong/Util/Log.h>
      7 #include <EGong/Util/Config.h>
      8 #ifdef _WIN32
      9 	#include <winsock2.h>
     10 #endif
     11 
     12 int(*EGong_waiter_add)(int, unsigned short int)=&EGong_waiter_add_default;
     13 fd_set EGong_waiter_fds;
     14 unsigned int EGong_waiter_highest_fd;
     15 unsigned int EGong_waiter_cnt=0;
     16 int EGong_waiter_init(void){
     17 	FD_ZERO(&EGong_waiter_fds);
     18 	return 0;
     19 }
     20 int EGong_waiter_add_default(int sock, unsigned short int type){
     21 	EGong_waiter_cnt++;
     22 	#ifdef _WIN32
     23 	if(type==EGONG_WAITER_FD){
     24 		do_log("Adding filedescriptors not supported, sorry", LOG_TYPE_NORMAL, LOG_LEVEL_WARNING);
     25 		return 1;
     26 	}
     27 	#endif
     28 	do_log("Adding to waiter...", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG);
     29 	FD_SET(sock, &EGong_waiter_fds);
     30 	if(EGong_waiter_highest_fd<sock){
     31 		EGong_waiter_highest_fd=sock;
     32 	}
     33 	return 0;
     34 }
     35 int EGong_waiter_del(int sock){
     36 	FD_SET(sock, &EGong_waiter_fds);
     37 	EGong_waiter_cnt--;
     38 	return 0;
     39 }
     40 int EGong_waiter_wait(void){
     41 	if(EGong_waiter_cnt==0){
     42 		do_log("Nothing to wait for...", LOG_TYPE_NORMAL, LOG_LEVEL_INFO);
     43 		return 1;	
     44 	}
     45 	do_log("Waiting...", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG);
     46 	struct timeval *tv=NULL;
     47 	#ifdef _WIN32
     48 	struct timeval tv2;
     49 	tv2.tv_sec=2;
     50 	tv2.tv_usec=0;
     51 	tv=&tv2;
     52 	#endif
     53 	if(select(EGong_waiter_highest_fd+1, &EGong_waiter_fds, NULL, NULL, tv)<0){
     54 		do_log("Couldnt select", LOG_TYPE_SIGNAL, LOG_LEVEL_ERROR);
     55 		return -1;
     56 	}
     57 	return 0;
     58 }