int evl_poll(evl_t *evl, double timeout) { int rv; struct timeval timeout_tv; struct timeval *timeoutp = NULL; if (timeout != -1.0) { timeout_tv.tv_sec = timeout; timeout_tv.tv_usec = (timeout - timeout_tv.tv_sec) * 1000000 + 0.5; timeoutp = &timeout_tv; } if (!(evl_common_get_fdset(evl->e, evl->r, evl_read) && evl_common_get_fdset(evl->e, evl->w, evl_write) && evl_common_get_fdset(evl->e, evl->x, evl_except))) return 0; rv = select(evl_common_upper_bound(evl->e), (fd_set*)evl->r->start, (fd_set*)evl->w->start, (fd_set*)evl->x->start, timeoutp); if (rv < 0 && errno == EINTR) { return 1; /* pretend we succeeded and didn't time out */ } else if (rv < 0) { /* error in select */ return 0; } else if (rv == 0) return 2; /* timeout */ else { run_handlers(evl, evl_read); run_handlers(evl, evl_write); run_handlers(evl, evl_except); return 1; } }
void run_handlers(int type, int code, int value, eventhandler *list) { if (list != NULL) { if ( type == list->type && code == list->code && value == list->value ) { fprintf(stderr, "Executing handler: %s\n", list->cmdline); int pid = fork(); if (pid == 0 ) { system( list->cmdline ); exit(0); } } /* traverse down the chain */ run_handlers(type, code, value, list->next); } }