server/: Build a proper interface for handling tunnel classes.
[tripe] / server / tripe.h
index f8e7bb6..fd0f44e 100644 (file)
@@ -611,6 +611,10 @@ typedef struct tunnel_ops {
 struct tunnel { const tunnel_ops *ops; };
 #endif
 
+typedef struct tun_iter {
+  const struct tunnel_node *next;
+} tun_iter;
+
 /* --- Peer statistics --- *
  *
  * Contains various interesting and not-so-interesting statistics about a
@@ -815,11 +819,9 @@ struct admin {
 
 extern sel_state sel;                  /* Global I/O event state */
 extern octet buf_i[PKBUFSZ], buf_o[PKBUFSZ], buf_t[PKBUFSZ], buf_u[PKBUFSZ];
-extern const tunnel_ops *tunnels[];    /* Table of tunnels (0-term) */
-extern const tunnel_ops *tun_default;  /* Default tunnel to use */
 extern udpsocket udpsock[NADDRFAM];    /* The master UDP sockets */
 extern kdata *master;                  /* Default private key */
-extern const char *tag_priv;           /* Default private key tag */
+extern char *tag_priv;                 /* Default private key tag */
 
 #ifndef NTRACE
 extern const trace_opt tr_opts[];      /* Trace options array */
@@ -859,6 +861,20 @@ extern void km_init(const char */*privkr*/, const char */*pubkr*/,
 
 extern int km_reload(void);
 
+/* --- @km_clear@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Forget the currently loaded keyrings.  The @master@ key will
+ *             be cleared, but other keys already loaded will continue to
+ *             exist until their reference count drops to zero.  Call
+ *             @km_init@ to make everything work again.
+ */
+
+extern void km_clear(void);
+
 /* --- @km_findpub@, @km_findpriv@ --- *
  *
  * Arguments:  @const char *tag@ = key tag to load
@@ -1307,17 +1323,6 @@ extern void EXECL_LIKE(0) a_notify(const char */*fmt*/, ...);
 
 extern void a_create(int /*fd_in*/, int /*fd_out*/, unsigned /*f*/);
 
-/* --- @a_quit@ --- *
- *
- * Arguments:  ---
- *
- * Returns:    ---
- *
- * Use:                Shuts things down nicely.
- */
-
-extern void a_quit(void);
-
 /* --- @a_preselect@ --- *
  *
  * Arguments:  ---
@@ -1709,6 +1714,18 @@ extern const addr *p_addr(peer */*p*/);
 
 extern void p_bind(struct addrinfo */*ailist*/);
 
+/* --- @p_unbind@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Unbinds the UDP sockets.  There must not be any active peers,
+ *             and none can be created until the sockets are rebound.
+ */
+
+extern void p_unbind(void);
+
 /* --- @p_init@ --- *
  *
  * Arguments:  ---
@@ -1720,6 +1737,90 @@ extern void p_bind(struct addrinfo */*ailist*/);
 
 extern void p_init(void);
 
+/* --- @p_addtun@ --- *
+ *
+ * Arguments:  @const tunnel_ops *tops@ = tunnel ops to add
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds a tunnel class to the list of known classes.  If there
+ *             is no current default tunnel, then this one is made the
+ *             default.
+ *
+ *             Does nothing if the tunnel class is already known.  So adding
+ *             a bunch of tunnels takes quadratic time, but there will be
+ *             too few to care about.
+ */
+
+extern void p_addtun(const tunnel_ops */*tops*/);
+
+/* --- @p_setdflttun@ --- *
+ *
+ * Arguments:  @const tunnel_ops *tops@ = tunnel ops to set
+ *
+ * Returns:    ---
+ *
+ * Use:                Sets the default tunnel.  It must already be registered.  The
+ *             old default is forgotten.
+ */
+
+extern void p_setdflttun(const tunnel_ops */*tops*/);
+
+/* --- @p_dflttun@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    A pointer to the current default tunnel operations, or null
+ *             if no tunnels are defined.
+ */
+
+extern const tunnel_ops *p_dflttun(void);
+
+/* --- @p_findtun@ --- *
+ *
+ * Arguments:  @const char *name@ = tunnel name
+ *
+ * Returns:    Pointer to the tunnel operations, or null.
+ *
+ * Use:                Finds the operations for a named tunnel class.
+ */
+
+extern const tunnel_ops *p_findtun(const char */*name*/);
+
+/* --- @p_mktuniter@ --- *
+ *
+ * Arguments:  @tuniter *i@ = pointer to iterator to initialize
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes a tunnel iterator.
+ */
+
+extern void p_mktuniter(tun_iter */*i*/);
+
+/* --- @p_nexttun@ --- *
+ *
+ * Arguments:  @tuniter *i@ = pointer to iterator
+ *
+ * Returns:    Pointer to the next tunnel's operations, or null.
+ */
+
+extern const tunnel_ops *p_nexttun(tun_iter */*i*/);
+
+/* --- @FOREACH_TUN@ --- *
+ *
+ * Arguments:  @tops@ = name to bind to each tunnel
+ *             @stuff@ = thing to do for each item
+ *
+ * Use:                Does something for each known tunnel class.
+ */
+
+#define FOREACH_TUN(tops, stuff) do {                                  \
+  tun_iter i_;                                                         \
+  const tunnel_ops *tops;                                              \
+  for (p_mktuniter(&i_); (tops = p_nexttun(&i_)) != 0; ) stuff;                \
+} while (0)
+
 /* --- @p_create@ --- *
  *
  * Arguments:  @peerspec *spec@ = information about this peer
@@ -1891,6 +1992,17 @@ extern void iv_rmreason(void);
 
 extern void lp_init(void);
 
+/* --- @lp_end@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Requests an exit from the main loop.
+ */
+
+extern void lp_end(void);
+
 /* --- @lp_run@ --- *
  *
  * Arguments:  ---