chiark / gitweb /
util: Use BSD queue.h for phase hook lists
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 30 Sep 2014 17:17:43 +0000 (18:17 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 21 Oct 2014 00:07:10 +0000 (01:07 +0100)
We are about to touch this code and would like something clearer to
work with.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
secnet.c
secnet.h
util.c

index 024744c..30db8e1 100644 (file)
--- 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);
 
index 7fbe157..54f5d07 100644 (file)
--- 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 (file)
--- 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; i<NR_PHASES; i++)
+       LIST_INIT(&hooks[i]);
+}
+
 bool_t add_hook(uint32_t phase, hook_fn *fn, void *state)
 {
     struct phase_hook *h;
@@ -227,8 +234,7 @@ bool_t add_hook(uint32_t phase, hook_fn *fn, void *state)
     h=safe_malloc(sizeof(*h),"add_hook");
     h->fn=fn;
     h->state=state;
-    h->next=hooks[phase];
-    hooks[phase]=h;
+    LIST_INSERT_HEAD(&hooks[phase],h,entry);
     return True;
 }