X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=secnet.c;h=f56fac235089940704eacb8802a24e2728af1ba8;hp=bef236dda9a2b466fad8636e7d51749b7eaaa5e6;hb=698280de07c723fed8c707e56bce81b66fee9c52;hpb=fe5e9cc422cd72526ccfceffbc7e5af8ac83b407 diff --git a/secnet.c b/secnet.c index bef236d..f56fac2 100644 --- a/secnet.c +++ b/secnet.c @@ -1,7 +1,7 @@ -extern char version[]; - #include "secnet.h" #include +#include +#include #include #include #include @@ -27,26 +27,18 @@ cstring_t require_root_privileges_explanation=NULL; static pid_t secnet_pid; -/* from log.c */ -extern uint32_t message_level; -extern bool_t secnet_is_daemon; -extern struct log_if *system_log; - -/* from process.c */ -extern void start_signal_handling(void); - /* Structures dealing with poll() call */ struct poll_interest { beforepoll_fn *before; afterpoll_fn *after; void *state; - uint32_t max_nfds; - uint32_t nfds; + int32_t max_nfds; + int32_t nfds; cstring_t desc; struct poll_interest *next; }; static struct poll_interest *reg=NULL; -static uint32_t total_nfds=10; +static int32_t total_nfds=10; static bool_t finished=False; @@ -229,7 +221,7 @@ static void setup(dict_t *config) } void register_for_poll(void *st, beforepoll_fn *before, - afterpoll_fn *after, uint32_t max_nfds, cstring_t desc) + afterpoll_fn *after, int32_t max_nfds, cstring_t desc) { struct poll_interest *i; @@ -240,6 +232,7 @@ void register_for_poll(void *st, beforepoll_fn *before, i->max_nfds=max_nfds; i->nfds=0; i->desc=desc; + assert(total_nfds < INT_MAX - max_nfds); total_nfds+=max_nfds; i->next=reg; reg=i; @@ -254,31 +247,29 @@ static void system_phase_hook(void *sst, uint32_t newphase) } } +struct timeval tv_now_global; +uint64_t now_global; + static void run(void) { - struct timeval tv_now; - uint64_t now; struct poll_interest *i; int rv, nfds, remain, idx; int timeout; struct pollfd *fds; - fds=alloca(sizeof(*fds)*total_nfds); - if (!fds) { - fatal("run: couldn't alloca"); - } + fds=safe_malloc(sizeof(*fds)*total_nfds, "run"); Message(M_NOTICE,"%s [%d]: starting\n",version,secnet_pid); do { - if (gettimeofday(&tv_now, NULL)!=0) { + if (gettimeofday(&tv_now_global, NULL)!=0) { fatal_perror("main loop: gettimeofday"); } - now=((uint64_t)tv_now.tv_sec*(uint64_t)1000)+ - ((uint64_t)tv_now.tv_usec/(uint64_t)1000); + now_global=((uint64_t)tv_now_global.tv_sec*(uint64_t)1000)+ + ((uint64_t)tv_now_global.tv_usec/(uint64_t)1000); idx=0; for (i=reg; i; i=i->next) { - i->after(i->state, fds+idx, i->nfds, &tv_now, &now); + i->after(i->state, fds+idx, i->nfds, &tv_now_global, &now_global); idx+=i->nfds; } remain=total_nfds; @@ -286,7 +277,7 @@ static void run(void) timeout=-1; for (i=reg; i; i=i->next) { nfds=remain; - rv=i->before(i->state, fds+idx, &nfds, &timeout, &tv_now, &now); + rv=i->before(i->state, fds+idx, &nfds, &timeout, &tv_now_global, &now_global); if (rv!=0) { /* XXX we need to handle this properly: increase the nfds available */ @@ -309,6 +300,7 @@ static void run(void) } } while (rv<0); } while (!finished); + free(fds); } static void droppriv(void)