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__);
}
-