command parser: Add support for the LISTVAL command.
authorSebastian Harl <sh@tokkee.org>
Sun, 5 Jun 2016 16:08:47 +0000 (18:08 +0200)
committerSebastian Harl <sh@tokkee.org>
Sun, 25 Sep 2016 10:42:45 +0000 (12:42 +0200)
Implement the generic interface for LISTVAL and switch the LISTVAL
implementation to use the generic interface.

src/unixsock.c
src/utils_cmd_listval.c
src/utils_cmd_listval.h
src/utils_cmds.c
src/utils_cmds.h

index 3098aa8..897ebfc 100644 (file)
@@ -301,7 +301,7 @@ static void *us_handle_client (void *arg)
                }
                else if (strcasecmp (fields[0], "listval") == 0)
                {
-                       handle_listval (fhout, buffer);
+                       cmd_handle_listval (fhout, buffer);
                }
                else if (strcasecmp (fields[0], "putnotif") == 0)
                {
index afbd01d..b31cb1e 100644 (file)
 #include "utils_cache.h"
 #include "utils_parse_option.h"
 
+cmd_status_t cmd_parse_listval (size_t argc, char **argv,
+    cmd_listval_t *ret_listval __attribute__((unused)),
+    cmd_error_handler_t *err)
+{
+  if (argc != 0)
+  {
+    cmd_error (CMD_PARSE_ERROR, err,
+       "Garbage after end of command: `%s'.", argv[0]);
+    return (CMD_PARSE_ERROR);
+  }
+
+  return (CMD_OK);
+} /* cmd_status_t cmd_parse_listval */
+
 #define free_everything_and_return(status) do { \
     for (size_t j = 0; j < number; j++) { \
       sfree(names[j]); \
       char errbuf[1024]; \
       WARNING ("handle_listval: failed to write to socket #%i: %s", \
           fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
-      free_everything_and_return (-1); \
+      free_everything_and_return (CMD_ERROR); \
     } \
     fflush(fh); \
   } while (0)
 
-int handle_listval (FILE *fh, char *buffer)
+cmd_status_t cmd_handle_listval (FILE *fh, char *buffer)
 {
-  char *command;
+  cmd_error_handler_t err = { cmd_error_fh, fh };
+  cmd_status_t status;
+  cmd_t cmd;
+
   char **names = NULL;
   cdtime_t *times = NULL;
   size_t number = 0;
-  int status;
 
   DEBUG ("utils_cmd_listval: handle_listval (fh = %p, buffer = %s);",
       (void *) fh, buffer);
 
-  command = NULL;
-  status = parse_string (&buffer, &command);
-  if (status != 0)
-  {
-    print_to_socket (fh, "-1 Cannot parse command.\n");
-    free_everything_and_return (-1);
-  }
-  assert (command != NULL);
-
-  if (strcasecmp ("LISTVAL", command) != 0)
-  {
-    print_to_socket (fh, "-1 Unexpected command: `%s'.\n", command);
-    free_everything_and_return (-1);
-  }
-
-  if (*buffer != 0)
+  if ((status = cmd_parse (buffer, &cmd, &err)) != CMD_OK)
+    return (status);
+  if (cmd.type != CMD_LISTVAL)
   {
-    print_to_socket (fh, "-1 Garbage after end of command: %s\n", buffer);
-    free_everything_and_return (-1);
+    cmd_error (CMD_UNKNOWN_COMMAND, &err,
+       "Unexpected command: `%s'.", CMD_TO_STRING (cmd.type));
+    free_everything_and_return (CMD_UNKNOWN_COMMAND);
   }
 
   status = uc_get_names (&names, &times, &number);
   if (status != 0)
   {
     DEBUG ("command listval: uc_get_names failed with status %i", status);
-    print_to_socket (fh, "-1 uc_get_names failed.\n");
-    free_everything_and_return (-1);
+    cmd_error (CMD_ERROR, &err, "uc_get_names failed.");
+    free_everything_and_return (CMD_ERROR);
   }
 
   print_to_socket (fh, "%i Value%s found\n",
@@ -100,7 +104,7 @@ int handle_listval (FILE *fh, char *buffer)
     print_to_socket (fh, "%.3f %s\n", CDTIME_T_TO_DOUBLE (times[i]),
                names[i]);
 
-  free_everything_and_return (0);
-} /* int handle_listval */
+  free_everything_and_return (CMD_OK);
+} /* cmd_status_t cmd_handle_listval */
 
 /* vim: set sw=2 sts=2 ts=8 : */
index fc125bc..5d2866d 100644 (file)
 
 #include <stdio.h>
 
-int handle_listval (FILE *fh, char *buffer);
+#include "utils_cmds.h"
+
+cmd_status_t cmd_parse_listval (size_t argc, char **argv,
+    cmd_listval_t *ret_listval, cmd_error_handler_t *err);
+
+cmd_status_t cmd_handle_listval (FILE *fh, char *buffer);
+
+void cmd_destroy_listval (cmd_listval_t *listval);
 
 #endif /* UTILS_CMD_LISTVAL_H */
 
index f5494a4..7648435 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "utils_cmds.h"
 #include "utils_cmd_flush.h"
+#include "utils_cmd_listval.h"
 #include "utils_cmd_putval.h"
 #include "utils_parse_option.h"
 #include "daemon/common.h"
@@ -213,6 +214,12 @@ cmd_status_t cmd_parsev (size_t argc, char **argv,
                return cmd_parse_flush (argc - 1, argv + 1,
                                &ret_cmd->cmd.flush, err);
        }
+       else if (strcasecmp ("LISTVAL", command) == 0)
+       {
+               ret_cmd->type = CMD_LISTVAL;
+               return cmd_parse_listval (argc - 1, argv + 1,
+                               &ret_cmd->cmd.listval, err);
+       }
        else if (strcasecmp ("PUTVAL", command) == 0)
        {
                ret_cmd->type = CMD_PUTVAL;
@@ -258,6 +265,9 @@ void cmd_destroy (cmd_t *cmd)
                case CMD_FLUSH:
                        cmd_destroy_flush (&cmd->cmd.flush);
                        break;
+               case CMD_LISTVAL:
+                       cmd_destroy_listval (&cmd->cmd.listval);
+                       break;
                case CMD_PUTVAL:
                        cmd_destroy_putval (&cmd->cmd.putval);
                        break;
index 21564cb..12bf6a8 100644 (file)
 typedef enum {
        CMD_UNKNOWN = 0,
        CMD_FLUSH   = 1,
-       CMD_PUTVAL  = 2,
+       CMD_LISTVAL = 2,
+       CMD_PUTVAL  = 3,
 } cmd_type_t;
 #define CMD_TO_STRING(type) \
        ((type) == CMD_FLUSH) ? "FLUSH" \
+               : ((type) == CMD_LISTVAL) ? "LISTVAL" \
                : ((type) == CMD_PUTVAL) ? "PUTVAL" \
                : "UNKNOWN"
 
@@ -51,6 +53,9 @@ typedef struct {
 } cmd_flush_t;
 
 typedef struct {
+} cmd_listval_t;
+
+typedef struct {
        /* The raw identifier as provided by the user. */
        char *identifier;
 
@@ -71,6 +76,7 @@ typedef struct {
        cmd_type_t type;
        union {
                cmd_flush_t flush;
+               cmd_listval_t listval;
                cmd_putval_t putval;
        } cmd;
 } cmd_t;