#include <mLib/arena.h>
#include <mLib/base64.h>
#include <mLib/bres.h>
+#include <mLib/daemonize.h>
#include <mLib/dstr.h>
#include <mLib/env.h>
#include <mLib/fdflags.h>
#include <mLib/sub.h>
#include <mLib/trace.h>
#include <mLib/tv.h>
+#include <mLib/versioncmp.h>
#include <catacomb/buf.h>
typedef struct tunnel_ops {
const char *name; /* Name of this tunnel driver */
void (*init)(void); /* Initializes the system */
- tunnel *(*create)(struct peer */*p*/); /* Initializes a new tunnel */
- const char *(*ifname)(tunnel */*t*/); /* Returns tunnel's interface name */
+ tunnel *(*create)(struct peer */*p*/, char **/*ifn*/);
+ /* Initializes a new tunnel */
+ void (*setifname)(tunnel */*t*/, const char */*ifn*/);
+ /* Notifies ifname change */
void (*inject)(tunnel */*t*/, buf */*b*/); /* Sends packet through if */
void (*destroy)(tunnel */*t*/); /* Destroys a tunnel */
} tunnel_ops;
admin_bgop bg; /* Background operation header */
ping ping; /* Ping pending response */
struct timeval pingtime; /* Time last ping was sent */
-} admin_pingop;
+} admin_pingop;
+
+typedef struct admin_service {
+ sym_base _b; /* Hash table base structure */
+ char *version; /* The provided version */
+ struct admin *prov; /* Which client provides me */
+ struct admin_service *next, *prev; /* Client's list of services */
+} admin_service;
+
+typedef struct admin_svcop {
+ admin_bgop bg; /* Background operation header */
+ struct admin *prov; /* Client servicing this job */
+ unsigned short index; /* This job's index */
+ struct admin_svcop *next, *prev; /* Links for provider's jobs */
+} admin_svcop;
+
+typedef struct admin_jobentry {
+ unsigned short seq; /* Zero if unused */
+ union {
+ admin_svcop *op; /* Operation, if slot in use, ... */
+ uint32 next; /* ... or index of next free slot */
+ } u;
+} admin_jobentry;
+
+typedef struct admin_jobtable {
+ uint32 n, sz; /* Used slots and table size */
+ admin_svcop *active; /* List of active jobs */
+ uint32 free; /* Index of first free slot */
+ admin_jobentry *v; /* And the big array of entries */
+} admin_jobtable;
typedef struct admin {
struct admin *next, *prev; /* Links to next and previous */
oqueue out; /* Output buffer list */
oqueue delay; /* Delayed output buffer list */
admin_bgop *bg; /* Backgrounded operations */
+ admin_service *svcs; /* Which services I provide */
+ admin_jobtable j; /* Table of outstanding jobs */
selbuf b; /* Line buffer for commands */
sel_file w; /* Selector for write buffering */
} admin;
extern int seq_check(seqwin */*s*/, uint32 /*q*/, const char */*service*/);
-/* --- @versioncmp@ --- *
- *
- * Arguments: @const char *va, *vb@ = two version strings
- *
- * Returns: Less than, equal to, or greater than zero, according to
- * whether @va@ is less than, equal to, or greater than @vb@.
- *
- * Use: Compares version number strings.
- *
- * The algorithm is an extension of the Debian version
- * comparison algorithm. A version number consists of three
- * components:
- *
- * [EPOCH :] MAIN [- SUB]
- *
- * The MAIN part may contain colons or hyphens if there is an
- * EPOCH or SUB, respectively. Version strings are compared
- * componentwise: first epochs, then main parts, and finally
- * subparts.
- *
- * The component comparison is done as follows. First, the
- * initial subsequence of nondigit characters is extracted from
- * each string, and these are compared lexicographically, using
- * ASCII ordering, except that letters precede non-letters. If
- * both are the same, an initial sequence of digits is extracted
- * from the remaining parts of the version strings, and these
- * are compared numerically (an empty sequence being considered
- * to have the value zero). This process is repeated until we
- * have a winner or until both strings are exhausted.
- */
-
-extern int versioncmp(const char */*va*/, const char */*vb*/);
-
/*----- That's all, folks -------------------------------------------------*/
#ifdef __cplusplus