X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=secnet.git;a=blobdiff_plain;f=secnet.c;h=f9808b78b828baf036cd3359bb5246f84bbbe7b4;hp=274d35a5bc9ff8a5b7860e9f29da1469e42e5a72;hb=5a8a70536e4fa79612405a88c50743976abb2d50;hpb=90a39563035b70196da9c5bdc7c17a63b64449b0 diff --git a/secnet.c b/secnet.c index 274d35a..f9808b7 100644 --- a/secnet.c +++ b/secnet.c @@ -14,6 +14,11 @@ #include "conffile.h" #include "process.h" +#if __APPLE__ +/* apple's poll() does not work on char devs */ +# define USE_SELECT 1 +#endif + /* XXX should be from autoconf */ static const char *configfile="/etc/secnet/secnet.conf"; static const char *sites_key="sites"; @@ -57,7 +62,7 @@ static void parse_options(int argc, char **argv) {"nodetach", 0, 0, 'n'}, {"silent", 0, 0, 'f'}, {"quiet", 0, 0, 'f'}, - {"debug", 1, 0, 'd'}, + {"debug", 0, 0, 'd'}, {"config", 1, 0, 'c'}, {"just-check-config", 0, 0, 'j'}, {"sites-key", 1, 0, 's'}, @@ -82,7 +87,7 @@ static void parse_options(int argc, char **argv) " -s, --sites-key=name configuration key that " "specifies active sites\n" " -n, --nodetach do not run in background\n" - " -d, --debug=item,... set debug options\n" + " -d, --debug output debug messages\n" " --help display this help and exit\n" " --version output version information " "and exit\n" @@ -136,6 +141,7 @@ static void parse_options(int argc, char **argv) break; case '?': + exit(1); break; default: @@ -247,6 +253,41 @@ static void system_phase_hook(void *sst, uint32_t newphase) } } +#if USE_SELECT +static int fakepoll(struct pollfd *fds, int nfds, int timeout) { + fd_set infds[1], outfds[1]; + int maxfd = -1, i, rc; + struct timeval tvtimeout; + FD_ZERO(infds); + FD_ZERO(outfds); + for(i = 0; i < nfds; ++i) { + if(fds[i].events & POLLIN) + FD_SET(fds[i].fd, infds); + if(fds[i].events & POLLOUT) + FD_SET(fds[i].fd, outfds); + if(fds[i].fd > maxfd) + maxfd = fds[i].fd; + } + if(timeout != -1) { + tvtimeout.tv_sec = timeout / 1000; + tvtimeout.tv_usec = 1000 * (timeout % 1000); + } + rc = select(maxfd + 1, infds, outfds, NULL, + timeout == -1 ? NULL : &tvtimeout); + if(rc >= 0) { + for(i = 0; i < nfds; ++i) { + int revents = 0; + if(FD_ISSET(fds[i].fd, infds)) + revents |= POLLIN; + if(FD_ISSET(fds[i].fd, outfds)) + revents |= POLLOUT; + fds[i].revents = revents; + } + } + return rc; +} +#endif + struct timeval tv_now_global; uint64_t now_global; @@ -269,6 +310,12 @@ static void run(void) ((uint64_t)tv_now_global.tv_usec/(uint64_t)1000); idx=0; for (i=reg; i; i=i->next) { + int check; + for (check=0; checknfds; check++) { + if(fds[idx+check].revents & POLLNVAL) { + fatal("run: poll (%s#%d) set POLLNVAL", i->desc, check); + } + } i->after(i->state, fds+idx, i->nfds); idx+=i->nfds; } @@ -292,7 +339,11 @@ static void run(void) } do { if (finished) break; +#if USE_SELECT + rv=fakepoll(fds, idx, timeout); +#else rv=poll(fds, idx, timeout); +#endif if (rv<0) { if (errno!=EINTR) { fatal_perror("run: poll");