From: Ian Jackson Date: Tue, 30 Sep 2014 17:17:43 +0000 (+0100) Subject: util: Use BSD queue.h for phase hook lists X-Git-Tag: base.ipv6-polypath-fixes.v1~28 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=commitdiff_plain;h=a614cf7728a54738ca80d920afc6cbe14d5dfda8;ds=sidebyside util: Use BSD queue.h for phase hook lists We are about to touch this code and would like something clearer to work with. Signed-off-by: Ian Jackson --- diff --git a/secnet.c b/secnet.c index 024744c..30db8e1 100644 --- a/secnet.c +++ b/secnet.c @@ -475,6 +475,8 @@ int main(int argc, char **argv) { dict_t *config; + phase_hooks_init(); + enter_phase(PHASE_GETOPTS); parse_options(argc,argv); diff --git a/secnet.h b/secnet.h index 7fbe157..54f5d07 100644 --- a/secnet.h +++ b/secnet.h @@ -268,6 +268,8 @@ bool_t remove_hook(uint32_t phase, hook_fn *f, void *state); extern uint32_t current_phase; extern void enter_phase(uint32_t new_phase); +void phase_hooks_init(void); /* for main() only */ + /* Some features (like netlink 'soft' routes) require that secnet retain root privileges. They should indicate that here when appropriate. */ diff --git a/util.c b/util.c index 3ae5ff4..0f24282 100644 --- a/util.c +++ b/util.c @@ -53,10 +53,10 @@ uint32_t current_phase=0; struct phase_hook { hook_fn *fn; void *state; - struct phase_hook *next; + LIST_ENTRY(phase_hook) entry; }; -static struct phase_hook *hooks[NR_PHASES]={NULL,}; +static LIST_HEAD(, phase_hook) hooks[NR_PHASES]; char *safe_strdup(const char *s, const char *message) { @@ -211,15 +211,22 @@ void enter_phase(uint32_t new_phase) { struct phase_hook *i; - if (hooks[new_phase]) + if (!LIST_EMPTY(&hooks[new_phase])) Message(M_DEBUG_PHASE,"Running hooks for %s...\n", phases[new_phase]); current_phase=new_phase; - for (i=hooks[new_phase]; i; i=i->next) + LIST_FOREACH(i, &hooks[new_phase], entry) i->fn(i->state, new_phase); Message(M_DEBUG_PHASE,"Now in %s\n",phases[new_phase]); } +void phase_hooks_init(void) +{ + int i; + for (i=0; ifn=fn; h->state=state; - h->next=hooks[phase]; - hooks[phase]=h; + LIST_INSERT_HEAD(&hooks[phase],h,entry); return True; }