APPEND/PREPEND commands
[rxpd] / rxpd.h
diff --git a/rxpd.h b/rxpd.h
index 2d4fe85..7aca557 100644 (file)
--- a/rxpd.h
+++ b/rxpd.h
 #include "llist.h"
 #include "psplay.h"
 
+#include <errno.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stdarg.h>
 #include <unistd.h>
 #include <regex.h>
 #include <sys/stat.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(END)                                 \
+#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,
-enum {RXPD_COMMANDS};
+enum rxpd_cmd_e {RXPD_COMMANDS};
 #undef RXPD_CMD
 
 struct rxpd_base;
 struct rxpd_file;
 struct rxpd_rule;
 struct rxpd_socket;
+struct rxpd_buffer;
 struct rxpd_connection;
 
 struct rxpd_base
@@ -97,17 +100,21 @@ rxpd_rule_delete (struct rxpd_rule*);
 //
 struct rxpd_file
 {
-  psplay node;
+  psplay node;          // key points to basename part of filename
+  const char* filename; // full filename
   //TODO later     struct stat last_stat;
   llist rules;
 };
 
-int
-rxpd_file_load (struct rxpd_base* base, const char* filename);
+struct rxpd_file*
+rxpd_file_new (struct rxpd_base* base, const char* filename);
 
 void
 rxpd_file_delete (PSplay file);
 
+int
+rxpd_file_load (struct rxpd_file* self);
+
 int
 rxpd_file_cmp (const void* A, const void* B);
 
@@ -136,7 +143,7 @@ void
 rxpd_socket_accept (int sock, short event, void* ptr);
 
 struct rxpd_socket*
-rxpd_socket_activate (struct rxpd_socket* self);
+rxpd_socket_schedule (struct rxpd_socket* self);
 
 struct rxpd_socket*
 rxpd_socket_suspend (struct rxpd_socket* self);
@@ -144,35 +151,75 @@ rxpd_socket_suspend (struct rxpd_socket* self);
 
 //
 
+enum rxpd_buffer_state_e
+  {
+    RXPD_OK,            // operational
+    RXPD_EOF,           // connection closed
+    RXPD_ERROR          // some other error
+  };
+
+struct rxpd_buffer
+{
+  struct rxpd_connection* conn;
+  enum rxpd_buffer_state_e state;
+  char* eol;
+  char* eob;
+  char buffer[4096];
+};
+
+struct rxpd_buffer*
+rxpd_buffer_init (struct rxpd_buffer* self, struct rxpd_connection* conn);
+
+char*
+rxpd_buffer_readline (struct rxpd_buffer* self, int again);
+
+inline static enum rxpd_buffer_state_e
+rxpd_buffer_state (struct rxpd_buffer* self)
+{
+  return self->state;
+}
+
+
+//
 struct rxpd_connection
 {
   llist node;
   int fd;
   struct event ev;
   struct rxpd_base* base;
+  struct rxpd_file* file;
+  llist tmp_list;
 
-  struct sockaddr_in peer_addr;
-  
-  char* eol;
-  char* eob;
-  char buffer[4096];
+  struct sockaddr peer_addr;
+
+  struct rxpd_buffer in;
+  struct rxpd_buffer out;
 };
 
 
 struct rxpd_connection*
-rxpd_connection_new (struct rxpd_base* base);
+rxpd_connection_new (struct rxpd_base* base, int accept_fd);
 
 void
 rxpd_connection_delete (struct rxpd_connection* self);
 
+
+struct rxpd_connection*
+rxpd_connection_schedule (struct rxpd_connection* self);
+
+
+struct rxpd_connection*
+rxpd_connection_suspend (struct rxpd_connection* self);
+
+
 int
 rxpd_connection_readline (struct rxpd_connection* self);
 
 void
-rxpd_connection_parse_cmd (int sock, short event, void* ptr);
+rxpd_connection_parse_cmd (int fd, short event, void* ptr);
 
 /* generate prototypes for each defined command */
-#define RXPD_CMD(cmd) void rxpd_connection_cmd_##cmd (int sock, short event, void* ptr);
+#define RXPD_CMD(cmd) void rxpd_connection_cmd_##cmd (int fd, short event, void* ptr);
 RXPD_COMMANDS
 #undef RXPD_CMD