-void free_node(node_t *n)
-{
-cp
- if(n->queue)
- list_delete_list(n->queue);
- if(n->name)
- free(n->name);
- if(n->hostname)
- free(n->hostname);
- if(n->key)
- free(n->key);
- if(n->subnet_tree)
- free_subnet_tree(n->subnet_tree);
- if(n->edge_tree)
- free_edge_tree(n->edge_tree);
- free(n);
-cp
+void free_node(node_t *n) {
+ if(n->subnet_tree)
+ free_subnet_tree(n->subnet_tree);
+
+ if(n->edge_tree)
+ free_edge_tree(n->edge_tree);
+
+ sockaddrfree(&n->address);
+
+ cipher_close(n->incipher);
+ digest_close(n->indigest);
+ cipher_close(n->outcipher);
+ digest_close(n->outdigest);
+
+ ecdsa_free(n->ecdsa);
+ sptps_stop(&n->sptps);
+
+ timeout_del(&n->mtutimeout);
+
+ if(n->hostname)
+ free(n->hostname);
+
+ if(n->name)
+ free(n->name);
+
+ if(n->late)
+ free(n->late);
+
+ free(n);
+}
+
+void node_add(node_t *n) {
+ digest_create(sha256, n->name, strlen(n->name), &n->id);
+
+ splay_insert(node_tree, n);
+ splay_insert(node_id_tree, n);
+}
+
+void node_del(node_t *n) {
+ for splay_each(subnet_t, s, n->subnet_tree)
+ subnet_del(n, s);
+
+ for splay_each(edge_t, e, n->edge_tree)
+ edge_del(e);
+
+ splay_delete(node_id_tree, n);
+ splay_delete(node_tree, n);
+}
+
+node_t *lookup_node(char *name) {
+ node_t n = {NULL};
+
+ n.name = name;
+
+ return splay_search(node_tree, &n);