From 6108316e4008edce45c6d861b49e339c1360181f Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Sun, 5 Jun 2016 18:08:47 +0200 Subject: [PATCH] command parser: Add support for the LISTVAL command. Implement the generic interface for LISTVAL and switch the LISTVAL implementation to use the generic interface. --- src/unixsock.c | 2 +- src/utils_cmd_listval.c | 56 ++++++++++++++++++++++------------------- src/utils_cmd_listval.h | 9 ++++++- src/utils_cmds.c | 10 ++++++++ src/utils_cmds.h | 8 +++++- 5 files changed, 56 insertions(+), 29 deletions(-) diff --git a/src/unixsock.c b/src/unixsock.c index 3098aa83..897ebfc5 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -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) { diff --git a/src/utils_cmd_listval.c b/src/utils_cmd_listval.c index afbd01d0..b31cb1eb 100644 --- a/src/utils_cmd_listval.c +++ b/src/utils_cmd_listval.c @@ -33,6 +33,20 @@ #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]); \ @@ -49,49 +63,39 @@ 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, ×, &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 : */ diff --git a/src/utils_cmd_listval.h b/src/utils_cmd_listval.h index fc125bc1..5d2866de 100644 --- a/src/utils_cmd_listval.h +++ b/src/utils_cmd_listval.h @@ -29,7 +29,14 @@ #include -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 */ diff --git a/src/utils_cmds.c b/src/utils_cmds.c index f5494a4c..7648435b 100644 --- a/src/utils_cmds.c +++ b/src/utils_cmds.c @@ -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; diff --git a/src/utils_cmds.h b/src/utils_cmds.h index 21564cb8..12bf6a85 100644 --- a/src/utils_cmds.h +++ b/src/utils_cmds.h @@ -34,10 +34,12 @@ 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" @@ -50,6 +52,9 @@ typedef struct { size_t identifiers_num; } 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; -- 2.30.2