} 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,
int ncomms;
struct resolver_if *resolver;
struct log_if *log;
- struct hash_if *defhash;
struct random_if *random;
struct privcache_if *privkeys;
struct sigprivkey_if *privkey_fixed;
int logcl_enoent)
{
struct peer_keyset *atsuffix=
- keyset_load(file,&st->scratch,st->log,logcl_enoent,st->defhash);
+ keyset_load(file,&st->scratch,st->log,logcl_enoent);
if (!atsuffix) return;
if (st->peerkeys_current &&
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;
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;
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;
crypto operations, but that's a task for another day. */
}
-static void setup_sethash(struct site *st, dict_t *dict,
- struct cloc loc,
- sig_sethash_fn *sethash, void *sigkey_st) {
- if (!st->defhash)
- cfgfatal(loc,"site","other settings imply `hash' key is needed");
- sethash(sigkey_st,st->defhash);
-}
-#define SETUP_SETHASH(k) do{ \
- if ((k)->sethash) \
- setup_sethash(st,dict,loc, (k)->sethash,(k)->st); \
-}while(0)
-
static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
list_t *args)
{
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;
st->resolver=find_cl_if(dict,"resolver",CL_RESOLVER,True,"site",loc);
st->random=find_cl_if(dict,"random",CL_RANDOMSRC,True,"site",loc);
- st->defhash=find_cl_if(dict,"hash",CL_HASH,True,"site",loc);
-
st->privkeys=find_cl_if(dict,"key-cache",CL_PRIVCACHE,False,"site",loc);
if (!st->privkeys) {
st->privkey_fixed=
find_cl_if(dict,"local-key",CL_SIGPRIVKEY,True,"site",loc);
- SETUP_SETHASH(st->privkey_fixed);
}
struct sigpubkey_if *fixed_pubkey
pathprefix_template_init(&st->peerkeys_tmpl,st->peerkeys_path,
PEERKEYS_SUFFIX_MAXLEN + 1 /* nul */);
st->peerkeys_current=keyset_load(st->peerkeys_path,
- &st->scratch,st->log,M_ERR,
- st->defhash);
+ &st->scratch,st->log,M_ERR);
if (fixed_pubkey) {
fixed_pubkey->dispose(fixed_pubkey->st);
}
} else {
assert(fixed_pubkey);
- SETUP_SETHASH(fixed_pubkey);
NEW(st->peerkeys_current);
st->peerkeys_current->refcount=1;
st->peerkeys_current->nkeys=1;
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;
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);
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) {