#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";
{"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'},
" -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"
break;
case '?':
+ exit(1);
break;
default:
}
}
+#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;
((uint64_t)tv_now_global.tv_usec/(uint64_t)1000);
idx=0;
for (i=reg; i; i=i->next) {
+ int check;
+ for (check=0; check<i->nfds; 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;
}
}
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");