X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_cmd_putval.c;h=d3d2b63001fca7e5202dd093b1ca7155c0c9dd36;hb=6e6c1eecf05ac8bc9e59b0967cb87e578253d5a0;hp=36419c6a55e85da02632bc76b7f2e355206542e1;hpb=3090a8852788aaca0d8063fdf9ac4ba66f048cd8;p=collectd.git diff --git a/src/utils_cmd_putval.c b/src/utils_cmd_putval.c index 36419c6a..d3d2b630 100644 --- a/src/utils_cmd_putval.c +++ b/src/utils_cmd_putval.c @@ -68,7 +68,7 @@ static int set_option (value_list_t *vl, const char *key, const char *value) * public API */ -cmd_status_t cmd_parse_putval (char *buffer, +cmd_status_t cmd_parse_putval (size_t argc, char **argv, cmd_putval_t *ret_putval, cmd_error_handler_t *err) { char *identifier; @@ -83,30 +83,30 @@ cmd_status_t cmd_parse_putval (char *buffer, const data_set_t *ds; value_list_t vl = VALUE_LIST_INIT; - vl.values = NULL; + size_t i; - identifier = NULL; - status = parse_string (&buffer, &identifier); - if (status != 0) + if (argc < 2) { - cmd_error (CMD_PARSE_ERROR, err, "Cannot parse identifier."); + cmd_error (CMD_PARSE_ERROR, err, + "Missing identifier and/or value-list."); return (CMD_PARSE_ERROR); } - assert (identifier != NULL); - /* parse_identifier() modifies its first argument, - * returning pointers into it */ + identifier = argv[0]; + + /* parse_identifier() modifies its first argument, returning pointers into + * it; retain the old value for later. */ identifier_copy = sstrdup (identifier); - status = parse_identifier (identifier_copy, &hostname, + status = parse_identifier (identifier, &hostname, &plugin, &plugin_instance, &type, &type_instance); if (status != 0) { DEBUG ("cmd_handle_putval: Cannot parse identifier `%s'.", - identifier); + identifier_copy); cmd_error (CMD_PARSE_ERROR, err, "Cannot parse identifier `%s'.", - identifier); + identifier_copy); sfree (identifier_copy); return (CMD_PARSE_ERROR); } @@ -139,65 +139,54 @@ cmd_status_t cmd_parse_putval (char *buffer, return (CMD_PARSE_ERROR); } - /* Free identifier_copy */ hostname = NULL; plugin = NULL; plugin_instance = NULL; type = NULL; type_instance = NULL; - sfree (identifier_copy); vl.values_len = ds->ds_num; vl.values = malloc (vl.values_len * sizeof (*vl.values)); if (vl.values == NULL) { cmd_error (CMD_ERROR, err, "malloc failed."); + sfree (identifier_copy); return (CMD_ERROR); } - ret_putval->identifier = strdup (identifier); - if (ret_putval->identifier == NULL) + ret_putval->raw_identifier = identifier_copy; + if (ret_putval->raw_identifier == NULL) { cmd_error (CMD_ERROR, err, "malloc failed."); cmd_destroy_putval (ret_putval); return (CMD_ERROR); } - /* All the remaining fields are part of the optionlist. */ - while (*buffer != 0) + /* All the remaining fields are part of the option list. */ + for (i = 1; i < argc; ++i) { value_list_t *tmp; - char *string = NULL; - char *value = NULL; + char *key = NULL; + char *value = NULL; - status = parse_option (&buffer, &string, &value); - if (status < 0) + status = cmd_parse_option (argv[i], &key, &value, err); + if (status == CMD_OK) { - /* parse_option failed, buffer has been modified. - * => we need to abort */ - cmd_error (CMD_PARSE_ERROR, err, "Misformatted option."); - cmd_destroy_putval (ret_putval); - return (CMD_PARSE_ERROR); - } - else if (status == 0) - { - assert (string != NULL); + assert (key != NULL); assert (value != NULL); - set_option (&vl, string, value); + set_option (&vl, key, value); continue; } - /* else: parse_option but buffer has not been modified. This is - * the default if no `=' is found.. */ - - status = parse_string (&buffer, &string); - if (status != 0) + else if (status != CMD_NO_OPTION) { - cmd_error (CMD_PARSE_ERROR, err, "Misformatted value."); + /* parse_option failed, buffer has been modified. + * => we need to abort */ cmd_destroy_putval (ret_putval); - return (CMD_PARSE_ERROR); + return (status); } - assert (string != NULL); + /* else: cmd_parse_option did not find an option; treat this as a + * value list. */ - status = parse_values (string, &vl, ds); + status = parse_values (argv[i], &vl, ds); if (status != 0) { cmd_error (CMD_PARSE_ERROR, err, "Parsing the values string failed."); @@ -230,7 +219,7 @@ void cmd_destroy_putval (cmd_putval_t *putval) if (putval == NULL) return; - sfree (putval->identifier); + sfree (putval->raw_identifier); for (i = 0; i < putval->vl_num; ++i) {