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 }