chiark / gitweb /
server/tripe.c: Formalize the main loop machinery.
[tripe] / server / tripe.h
index 10a03f5fd79900201b2878a97a1bd76d32b00503..bd70bb84b4751476f578fa28ac685a84ab1eca2a 100644 (file)
@@ -676,6 +676,11 @@ typedef struct peer {
 
 typedef struct peer_iter { sym_iter i; } peer_iter;
 
+typedef struct udpsocket {
+  sel_file sf;                         /* Selector for the socket */
+  unsigned port;                       /* Chosen port number */
+} udpsocket;
+
 typedef struct ping {
   struct ping *next, *prev;            /* Links to next and previous */
   peer *p;                             /* Peer so we can free it */
@@ -812,7 +817,7 @@ 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 sel_file udpsock[NADDRFAM];     /* The master UDP sockets */
+extern udpsocket udpsock[NADDRFAM];    /* The master UDP sockets */
 extern kdata *master;                  /* Default private key */
 extern const char *tag_priv;           /* Default private key tag */
 
@@ -1228,7 +1233,9 @@ extern int c_check(const void */*m*/, size_t /*msz*/, buf */*b*/);
  *
  *               * "?PEER" PEER -- peer's name
  *
- *               * "?ERRNO" ERRNO -- system error code
+ *               * "?ERR" CODE -- system error code
+ *
+ *               * "?ERRNO" -- system error code from @errno@
  *
  *               * "[!]..." ... -- @dstr_putf@-like string as single token
  */
@@ -1292,7 +1299,10 @@ extern void EXECL_LIKE(0) a_notify(const char */*fmt*/, ...);
  *
  * Returns:    ---
  *
- * Use:                Creates a new admin connection.
+ * Use:                Creates a new admin connection.  It's safe to call this
+ *             before @a_init@ -- and, indeed, this makes sense if you also
+ *             call @a_switcherr@ to report initialization errors through
+ *             the administration machinery.
  */
 
 extern void a_create(int /*fd_in*/, int /*fd_out*/, unsigned /*f*/);
@@ -1332,6 +1342,50 @@ extern void a_preselect(void);
 
 extern void a_daemon(void);
 
+/* --- @a_listen@ --- *
+ *
+ * Arguments:  @const char *name@ = socket name to create
+ *             @uid_t u@ = user to own the socket
+ *             @gid_t g@ = group to own the socket
+ *             @mode_t m@ = permissions to set on the socket
+ *
+ * Returns:    ---
+ *
+ * Use:                Creates the admin listening socket.
+ */
+
+extern void a_listen(const char */*sock*/,
+                    uid_t /*u*/, gid_t /*g*/, mode_t /*m*/);
+
+/* --- @a_switcherr@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Arrange to report warnings, trace messages, etc. to
+ *             administration clients rather than the standard-error stream.
+ *
+ *             Obviously this makes no sense unless there is at least one
+ *             client established.  Calling @a_listen@ won't help with this,
+ *             because the earliest a new client can connect is during the
+ *             first select-loop iteration, which is too late: some initial
+ *             client must have been added manually using @a_create@.
+ */
+
+extern void a_switcherr(void);
+
+/* --- @a_signals@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Establishes handlers for the obvious signals.
+ */
+
+extern void a_signals(void);
+
 /* --- @a_init@ --- *
  *
  * Arguments:  @const char *sock@ = socket name to create
@@ -1344,8 +1398,7 @@ extern void a_daemon(void);
  * Use:                Creates the admin listening socket.
  */
 
-extern void a_init(const char */*sock*/,
-                  uid_t /*u*/, gid_t /*g*/, mode_t /*m*/);
+extern void a_init(void);
 
 /*----- Mapping with addresses as keys ------------------------------------*/
 
@@ -1634,25 +1687,27 @@ extern void p_setifname(peer */*p*/, const char */*name*/);
 
 extern const addr *p_addr(peer */*p*/);
 
-/* --- @p_init@ --- *
+/* --- @p_bind@ --- *
  *
  * Arguments:  @struct addrinfo *ailist@ = addresses to bind to
  *
  * Returns:    ---
  *
- * Use:                Initializes the peer system; creates the socket.
+ * Use:                Binds to the main UDP sockets.
  */
 
-extern void p_init(struct addrinfo */*ailist*/);
+extern void p_bind(struct addrinfo */*ailist*/);
 
-/* --- @p_port@ --- *
+/* --- @p_init@ --- *
+ *
+ * Arguments:  ---
  *
- * Arguments:  @int i@ = address family index to retrieve
+ * Returns:    ---
  *
- * Returns:    Port number used for socket.
+ * Use:                Initializes the peer system.
  */
 
-extern unsigned p_port(int /*i*/);
+extern void p_init(void);
 
 /* --- @p_create@ --- *
  *
@@ -1774,6 +1829,57 @@ extern void p_mkiter(peer_iter */*i*/);
 
 extern peer *p_next(peer_iter */*i*/);
 
+/*----- The interval timer ------------------------------------------------*/
+
+/* --- @iv_addreason@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Adds an `interval timer reason'; if there are no others, the
+ *             interval timer is engaged.
+ */
+
+extern void iv_addreason(void);
+
+/* --- @iv_rmreason@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Removes an interval timer reason; if there are none left, the
+ *             interval timer is disengaged.
+ */
+
+extern void iv_rmreason(void);
+
+/*----- The main loop -----------------------------------------------------*/
+
+/* --- @lp_init@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Initializes the main loop.  Most importantly, this sets up
+ *             the select multiplexor that everything else hooks onto.
+ */
+
+extern void lp_init(void);
+
+/* --- @lp_run@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    Zero on successful termination; @-1@ if things went wrong.
+ *
+ * Use:                Cranks the main loop until it should be cranked no more.
+ */
+
+extern int lp_run(void);
+
 /*----- Tunnel drivers ----------------------------------------------------*/
 
 #ifdef TUN_LINUX