append given basedir argument with '/' if not given
[rxpd] / src / rxpd.h
index 61fa7db..b8885df 100644 (file)
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <event.h>
-
-#define RXPD_COMMANDS   \
-  RXPD_CMD(CHECK)       \
-  RXPD_CMD(APPEND)      \
-  RXPD_CMD(PREPEND)     \
-  RXPD_CMD(REMOVE)      \
-  RXPD_CMD(REPLACE)     \
-  RXPD_CMD(LOAD)        \
-  RXPD_CMD(SAVE)        \
-  RXPD_CMD(DUMP)        \
-  RXPD_CMD(LIST)        \
-  RXPD_CMD(SHUTDOWN)
-
-#define RXPD_CMD(cmd) RXPD_CMD_##cmd,
+#include <pth.h>
+#include <time.h>
+#include <netdb.h>
+
+#define RXPD_COMMANDS                                           \
+  RXPD_CMD(CHECK,       "data against regular expressions")     \
+  RXPD_CMD(APPEND,      "new rules to a list")                  \
+  RXPD_CMD(PREPEND,     "new rules in front of a list")         \
+  RXPD_CMD(REMOVE,      "rules from a list")                    \
+  RXPD_CMD(REPLACE,     "a rule in a list with new rules")      \
+  RXPD_CMD(DELETE,      "a list from memory")                   \
+  RXPD_CMD(LOAD,        "a list from disk")                     \
+  RXPD_CMD(SAVE,        "a list to disk")                       \
+  RXPD_CMD(FETCH,       "a list from a remote server")          \
+  RXPD_CMD(EXPIRE,      "aged rules from a list")               \
+  RXPD_CMD(DUMP,        "rules in a list")                      \
+  RXPD_CMD(LIST,        "all existing lists")                   \
+  RXPD_CMD(VERSION,     "of this rxpd is "PACKAGE_VERSION)      \
+  RXPD_CMD(HELP,        "is what you see right now")            \
+  RXPD_CMD(SHUTDOWN,    "the daemon")
+
+#define RXPD_CMD(cmd, _) RXPD_CMD_##cmd,
 enum rxpd_cmd_e {RXPD_COMMANDS};
 #undef RXPD_CMD
 
 /*
  * characters which are absolutely not allowed in rule filenames
- * for finer control use policies
+ * for finer control use policies, note that this are arbitary
+ * decisions also reserving some chars for later extension
+ */
+#define RXPD_FILE_ILG_CHARS "@&?<>|/: \t\n\r*?\\"
+
+/*
+ * Call a cooperative pth_yield every this much expensive interations
+ * not implemented yet
+ * A higher number favors throughput, lower number improves latency
  */
-#define RXPD_FILE_ILG_CHARS "/: \t\n*?"
+#define RXPD_YIELD_EVERY 500
 
 struct rxpd_base;
 struct rxpd_file;
@@ -77,9 +93,8 @@ struct rxpd_base
   int daemonize;
 
   struct rxpd_file* policy;
-  struct event_base* eventbase;
 
-  //-r          resolve names
+  // TODO
   //FILE* -l log      log hits to logfile
 
   psplayroot files;
@@ -87,7 +102,7 @@ struct rxpd_base
 };
 
 struct rxpd_base*
-rxpd_init (struct event_base* eventbase);
+rxpd_init (void);
 
 void
 rxpd_destroy (void);
@@ -95,6 +110,9 @@ rxpd_destroy (void);
 void
 rxpd_log (struct rxpd_base*, int level, const char* fmt, ...);
 
+void
+rxpd_fail (struct rxpd_base*, const char* fmt, ...);
+
 void
 rxpd_die (const char* fmt, ...);
 
@@ -104,12 +122,15 @@ rxpd_malloc (size_t size);
 char*
 rxpd_strdup (const char* str);
 
+struct rxpd_base*
+rxpd_set_basedir (struct rxpd_base*, const char* basedir);
 
 //
 struct rxpd_rule
 {
   llist node;
   char* string;
+  time_t atime;
   regex_t rx;
 };
 
@@ -135,7 +156,10 @@ struct rxpd_file*
 rxpd_file_new (struct rxpd_base* base, const char* filename);
 
 void
-rxpd_file_delete (PSplay file);
+rxpd_file_delete (struct rxpd_file* file);
+
+struct rxpd_file*
+rxpd_file_rules_delete (struct rxpd_file* self);
 
 int
 rxpd_file_load (struct rxpd_file* self);
@@ -155,6 +179,7 @@ struct rxpd_socket
   int fd;
   struct event ev;
   struct rxpd_base* base;
+  pth_t accepter;
   int (*rxpd_socket_addr)(struct rxpd_connection* conn, char* dst, const char* pfx, size_t size);
 };
 
@@ -172,15 +197,17 @@ rxpd_socket_tcp4addr (struct rxpd_connection* conn, char* dst, const char* pfx,
 void
 rxpd_socket_delete (struct rxpd_socket* self);
 
-void
-rxpd_socket_accept (int sock, short event, void* ptr);
+void *
+rxpd_socket_accept (void* ptr);
 
 struct rxpd_socket*
-rxpd_socket_schedule (struct rxpd_socket* self);
+rxpd_socket_spawn (struct rxpd_socket* self);
 
 struct rxpd_socket*
-rxpd_socket_suspend (struct rxpd_socket* self);
+rxpd_socket_join (struct rxpd_socket* self);
 
+struct rxpd_socket*
+rxpd_socket_cancel (struct rxpd_socket* self);
 
 //
 
@@ -204,7 +231,10 @@ struct rxpd_buffer*
 rxpd_buffer_init (struct rxpd_buffer* self, struct rxpd_connection* conn);
 
 char*
-rxpd_buffer_readline (struct rxpd_buffer* self, int again);
+rxpd_buffer_readline (struct rxpd_buffer* self);
+
+int
+rxpd_buffer_printf (struct rxpd_buffer* self, const char* fmt, ...);
 
 inline static enum rxpd_buffer_state_e
 rxpd_buffer_state (struct rxpd_buffer* self)
@@ -217,7 +247,7 @@ rxpd_buffer_state (struct rxpd_buffer* self)
 struct rxpd_connection
 {
   int fd;
-  struct event ev;
+  pth_t connecter;
   struct rxpd_file* file;
   struct rxpd_socket* socket;
   char* tmp_str;
@@ -229,13 +259,13 @@ struct rxpd_connection
 
 
 struct rxpd_connection*
-rxpd_connection_new (struct rxpd_socket* socket, int accept_fd);
+rxpd_connection_new (struct rxpd_socket* socket, int fd);
 
 void
 rxpd_connection_delete (struct rxpd_connection* self);
 
 struct rxpd_connection*
-rxpd_connection_schedule (struct rxpd_connection* self);
+rxpd_connection_spawn (struct rxpd_connection* self);
 
 int
 rxpd_connection_readline (struct rxpd_connection* self);
@@ -243,11 +273,11 @@ rxpd_connection_readline (struct rxpd_connection* self);
 int
 rxpd_connection_check_policy (struct rxpd_connection* self, char* line);
 
-void
-rxpd_connection_parse_cmd (int fd, short event, void* ptr);
+void*
+rxpd_connection_parse_cmd (void* ptr);
 
 /* generate prototypes for each defined command */
-#define RXPD_CMD(cmd) void rxpd_connection_cmd_##cmd (int fd, short event, void* ptr);
+#define RXPD_CMD(cmd, _) void rxpd_connection_cmd_##cmd (struct rxpd_connection* self);
 RXPD_COMMANDS
 #undef RXPD_CMD