chiark / gitweb /
Makefiles: Use Final.sd.mk to implementing RECHECK_RM
[secnet.git] / site.c
diff --git a/site.c b/site.c
index 08875133c1cc5fd0ca95677412f88df35c7308ab..191c36463da7cf7bd1d6186a1a1f51ebb0484877 100644 (file)
--- a/site.c
+++ b/site.c
@@ -257,6 +257,7 @@ typedef struct {
 } transport_peers;
 
 /* Basic operations on transport peer address sets */
+static void transport_peers_init(struct site *st, transport_peers *peers);
 static void transport_peers_clear(struct site *st, transport_peers *peers);
 static int transport_peers_valid(transport_peers *peers);
 static void transport_peers_copy(struct site *st, transport_peers *dst,
@@ -787,8 +788,7 @@ static bool_t unpick_msg(struct site *st, uint32_t type,
     if (type_is_msg23(type) && m->remote.extrainfo.size) {
        m->n_pubkeys_accepted_nom = buf_unprepend_uint8(&m->remote.extrainfo);
        if (!m->n_pubkeys_accepted_nom) return False;
-       int ki_nom;
-       for (ki_nom=0; ki_nom<m->n_pubkeys_accepted_nom; ki_nom++) {
+       for (int ki_nom=0; ki_nom<m->n_pubkeys_accepted_nom; ki_nom++) {
            CHECK_AVAIL(&m->remote.extrainfo,KEYIDSZ);
            struct sigkeyid *kid = buf_unprepend(&m->remote.extrainfo,KEYIDSZ);
            if (ki_nom<MAX_SIG_KEYS) m->pubkeys_accepted[ki_nom] = kid;
@@ -1712,8 +1712,9 @@ static void set_link_quality(struct site *st)
 
 static void enter_state_run(struct site *st)
 {
-    slog(st,LOG_STATE,"entering state RUN%s",
-        current_valid(st) ? " (keyed)" : " (unkeyed)");
+    if (st->state!=SITE_STOP)
+       slog(st,LOG_STATE,"entering state RUN%s",
+            current_valid(st) ? " (keyed)" : " (unkeyed)");
     st->state=SITE_RUN;
     st->timeout=0;
 
@@ -2283,14 +2284,13 @@ static bool_t site_incoming(void *sst, struct buffer_if *buf,
     return False;
 }
 
-static void site_control(void *vst, bool_t run)
+static void site_startup(void *vst)
 {
     struct site *st=vst;
-    if (run) enter_state_run(st);
-    else enter_state_stop(st);
+    enter_state_run(st);
 }
 
-static void site_phase_hook(void *sst, uint32_t newphase)
+static void site_phase_shutdown_hook(void *sst, uint32_t newphase)
 {
     struct site *st=sst;
 
@@ -2298,6 +2298,13 @@ static void site_phase_hook(void *sst, uint32_t newphase)
     send_msg7(st,"shutting down");
 }
 
+static void site_phase_run_hook(void *sst, uint32_t newphase)
+{
+    struct site *st=sst;
+    slog(st,LOG_STATE,"entering phase RUN in state %s",
+        state_name(st->state));
+}
+
 static void site_childpersist_clearkeys(void *sst, uint32_t newphase)
 {
     struct site *st=sst;
@@ -2331,7 +2338,7 @@ static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
     st->cl.apply=NULL;
     st->cl.interface=&st->ops;
     st->ops.st=st;
-    st->ops.control=site_control;
+    st->ops.startup=site_startup;
     st->ops.status=site_status;
     st->peerkeys_path=0;
     st->peerkeys_tmpl.buffer=0;
@@ -2513,8 +2520,8 @@ static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
     st->chosen_transform=0;
     st->current.key_timeout=0;
     st->auxiliary_key.key_timeout=0;
-    transport_peers_clear(st,&st->peers);
-    transport_peers_clear(st,&st->setup_peers);
+    transport_peers_init(st,&st->peers);
+    transport_peers_init(st,&st->setup_peers);
     /* XXX mlock these */
     st->dhsecret=safe_malloc(st->dh->len,"site:dhsecret");
     st->sharedsecretlen=st->sharedsecretallocd=0;
@@ -2552,7 +2559,8 @@ static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
 
     enter_state_stop(st);
 
-    add_hook(PHASE_SHUTDOWN,site_phase_hook,st);
+    add_hook(PHASE_SHUTDOWN,site_phase_shutdown_hook,st);
+    add_hook(PHASE_RUN,     site_phase_run_hook,     st);
     add_hook(PHASE_CHILDPERSIST,site_childpersist_clearkeys,st);
 
     return new_closure(&st->cl);
@@ -2730,9 +2738,14 @@ static void transport_data_msgok(struct site *st, const struct comm_addr *a) {
 static int transport_peers_valid(transport_peers *peers) {
     return peers->npeers;
 }
+static void transport_peers_init(struct site *st, transport_peers *peers) {
+    peers->npeers= 0;
+}
 static void transport_peers_clear(struct site *st, transport_peers *peers) {
+    bool_t need_debug=!!peers->npeers;
     peers->npeers= 0;
-    transport_peers_debug(st,peers,"clear",0,0,0);
+    if (need_debug)
+       transport_peers_debug(st,peers,"clear",0,0,0);
 }
 static void transport_peers_copy(struct site *st, transport_peers *dst,
                                 const transport_peers *src) {