command dispatcher
authorChristian Thaeter <ct@pipapo.org>
Fri, 5 Oct 2007 09:35:23 +0000 (11:35 +0200)
committerChristian Thaeter <ct@pipapo.org>
Fri, 5 Oct 2007 09:35:23 +0000 (11:35 +0200)
rxpd.c

diff --git a/rxpd.c b/rxpd.c
index 22b1e85..e87e72c 100644 (file)
--- a/rxpd.c
+++ b/rxpd.c
@@ -461,70 +461,112 @@ rxpd_connection_suspend (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)
 {
   printf ("parse cmd\n");
   struct rxpd_connection* self = (struct rxpd_connection*) ptr;
 
   char* line;
-  line = rxpd_buffer_readline (&self->in, 0);
-  printf ("got line '%s'\n", line);
+  while (!(line = rxpd_buffer_readline (&self->in, 0)) && (rxpd_buffer_state (&self->in) == RXPD_OK));
 
+  if (!line)
+    {
+      printf ("got no data\n");
+      close (fd);
+      return;
+    }
 
-  // TODO policy check
 
-  //if (rxpd_buffer_state (&self->in) != RXPD_EOF)
-  //  event_add (&self->ev, NULL);
-}
 
-void
-rxpd_connection_cmd_CHECK (int sock, short event, void* ptr)
-{
+  static const struct cmd_table
+  {
+    enum rxpd_cmd_e nr;
+    const char* cmd;
+    size_t sz;
+  } cmds[] =
+    {
+#define RXPD_CMD(cmd) {RXPD_CMD_##cmd, #cmd":", sizeof (#cmd)},
+      RXPD_COMMANDS
+#undef RXPD_CMD
+      {0, NULL, 0}
+    };
+
+  const struct cmd_table* i;
+  for (i = cmds; i->cmd; ++i)
+    if (strncmp (line, i->cmd, i->sz) == 0)
+      break;
+  if (!i->cmd)
+    {
+      printf ("no command\n");
+      rxpd_connection_delete (self);
+      return;
+    }
+  // TODO policy check
+
+  // dispatch
+  switch (i->nr)
+    {
+#define RXPD_CMD(cmd)                                                           \
+case RXPD_CMD_##cmd:                                                            \
+  event_set (&self->ev, self->fd, EV_READ, rxpd_connection_cmd_##cmd, self);    \
+  break;
+      RXPD_COMMANDS
+#undef RXPD_CMD
+    }
+  rxpd_connection_activate (self);
 }
 
 void
-rxpd_connection_cmd_APPEND (int sock, short event, void* ptr)
+rxpd_connection_cmd_CHECK (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
 void
-rxpd_connection_cmd_PREPEND (int sock, short event, void* ptr)
+rxpd_connection_cmd_APPEND (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
 void
-rxpd_connection_cmd_REMOVE (int sock, short event, void* ptr)
+rxpd_connection_cmd_PREPEND (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
 void
-rxpd_connection_cmd_REPLACE (int sock, short event, void* ptr)
+rxpd_connection_cmd_REMOVE (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
 void
-rxpd_connection_cmd_LOAD (int sock, short event, void* ptr)
+rxpd_connection_cmd_REPLACE (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
 void
-rxpd_connection_cmd_SAVE (int sock, short event, void* ptr)
+rxpd_connection_cmd_LOAD (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
 void
-rxpd_connection_cmd_DUMP (int sock, short event, void* ptr)
+rxpd_connection_cmd_SAVE (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
 void
-rxpd_connection_cmd_LIST (int sock, short event, void* ptr)
+rxpd_connection_cmd_DUMP (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
 void
-rxpd_connection_cmd_END (int sock, short event, void* ptr)
+rxpd_connection_cmd_LIST (int fd, short event, void* ptr)
 {
+  printf ("%s\n", __func__);
 }
 
-