X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_cmds.c;h=1f53ad1d6a4da8bc966d2c67f024a29d2517ddef;hb=b7c67e8ccfc70f52f8533df9502424de85074eee;hp=7648435b86692d80abcc832e3d9f86fb8a49ea2f;hpb=6108316e4008edce45c6d861b49e339c1360181f;p=collectd.git diff --git a/src/utils_cmds.c b/src/utils_cmds.c index 7648435b..1f53ad1d 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_getval.h" #include "utils_cmd_listval.h" #include "utils_cmd_putval.h" #include "utils_parse_option.h" @@ -36,6 +37,10 @@ #include #include +static cmd_options_t default_options = { + /* identifier_default_host = */ NULL, +}; + /* * private helper functions */ @@ -44,7 +49,7 @@ static cmd_status_t cmd_split (char *buffer, size_t *ret_len, char ***ret_fields, cmd_error_handler_t *err) { - char *string, *field; + char *field; bool in_field, in_quotes; size_t estimate, len; @@ -52,7 +57,7 @@ static cmd_status_t cmd_split (char *buffer, estimate = 0; in_field = false; - for (string = buffer; *string != '\0'; ++string) + for (char *string = buffer; *string != '\0'; ++string) { /* Make a quick worst-case estimate of the number of fields by * counting spaces and ignoring quotation marks. */ @@ -97,7 +102,7 @@ static cmd_status_t cmd_split (char *buffer, field = NULL; in_field = false; in_quotes = false; - for (string = buffer; *string != '\0'; string++) + for (char *string = buffer; *string != '\0'; string++) { if (isspace ((int)string[0])) { @@ -194,10 +199,11 @@ void cmd_error (cmd_status_t status, cmd_error_handler_t *err, va_end (ap); } /* void cmd_error */ -cmd_status_t cmd_parsev (size_t argc, char **argv, - cmd_t *ret_cmd, cmd_error_handler_t *err) +cmd_status_t cmd_parsev (size_t argc, char **argv, cmd_t *ret_cmd, + const cmd_options_t *opts, cmd_error_handler_t *err) { char *command = NULL; + cmd_status_t status; if ((argc < 1) || (argv == NULL) || (ret_cmd == NULL)) { @@ -206,25 +212,34 @@ cmd_status_t cmd_parsev (size_t argc, char **argv, return CMD_ERROR; } + if (opts == NULL) + opts = &default_options; + memset (ret_cmd, 0, sizeof (*ret_cmd)); command = argv[0]; if (strcasecmp ("FLUSH", command) == 0) { ret_cmd->type = CMD_FLUSH; - return cmd_parse_flush (argc - 1, argv + 1, - &ret_cmd->cmd.flush, err); + status = cmd_parse_flush (argc - 1, argv + 1, + &ret_cmd->cmd.flush, opts, err); + } + else if (strcasecmp ("GETVAL", command) == 0) + { + ret_cmd->type = CMD_GETVAL; + status = cmd_parse_getval (argc - 1, argv + 1, + &ret_cmd->cmd.getval, opts, 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); + status = cmd_parse_listval (argc - 1, argv + 1, + &ret_cmd->cmd.listval, opts, err); } else if (strcasecmp ("PUTVAL", command) == 0) { ret_cmd->type = CMD_PUTVAL; - return cmd_parse_putval (argc - 1, argv + 1, - &ret_cmd->cmd.putval, err); + status = cmd_parse_putval (argc - 1, argv + 1, + &ret_cmd->cmd.putval, opts, err); } else { @@ -234,11 +249,13 @@ cmd_status_t cmd_parsev (size_t argc, char **argv, return (CMD_UNKNOWN_COMMAND); } - return (CMD_OK); + if (status != CMD_OK) + ret_cmd->type = CMD_UNKNOWN; + return (status); } /* cmd_status_t cmd_parsev */ -cmd_status_t cmd_parse (char *buffer, - cmd_t *ret_cmd, cmd_error_handler_t *err) +cmd_status_t cmd_parse (char *buffer, cmd_t *ret_cmd, + const cmd_options_t *opts, cmd_error_handler_t *err) { char **fields = NULL; size_t fields_num = 0; @@ -247,7 +264,7 @@ cmd_status_t cmd_parse (char *buffer, if ((status = cmd_split (buffer, &fields_num, &fields, err)) != CMD_OK) return status; - status = cmd_parsev (fields_num, fields, ret_cmd, err); + status = cmd_parsev (fields_num, fields, ret_cmd, opts, err); free (fields); return (status); } /* cmd_status_t cmd_parse */ @@ -265,6 +282,9 @@ void cmd_destroy (cmd_t *cmd) case CMD_FLUSH: cmd_destroy_flush (&cmd->cmd.flush); break; + case CMD_GETVAL: + cmd_destroy_getval (&cmd->cmd.getval); + break; case CMD_LISTVAL: cmd_destroy_listval (&cmd->cmd.listval); break;