X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_kvargs%2Frte_kvargs.c;h=d92a5f9dcd924bc21ca2d3abf4ad2c2dde79704d;hb=e9ff01b36d4bb3a1cedce67616818abb7da5d915;hp=f3689564d82aa73b2540bae598ea237c6a5da289;hpb=ef8e5447e3a63dd2a0fc025a143aa7bd83d0e602;p=dpdk.git diff --git a/lib/librte_kvargs/rte_kvargs.c b/lib/librte_kvargs/rte_kvargs.c index f3689564d8..d92a5f9dcd 100644 --- a/lib/librte_kvargs/rte_kvargs.c +++ b/lib/librte_kvargs/rte_kvargs.c @@ -1,39 +1,9 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2010-2013 Intel Corporation. All rights reserved. - * Copyright(c) 2014 6WIND S.A. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2013 Intel Corporation. + * Copyright(c) 2014 6WIND S.A. */ + #include -#include -#include #include #include @@ -41,55 +11,18 @@ #include "rte_kvargs.h" -/* - * Add a key-value pair at the end of a given key/value list. - * Return an error if the list is full or if the key is duplicated. - */ -static int -rte_kvargs_add_pair(struct rte_kvargs *kvlist, char *key, char *val) -{ - unsigned i; - struct rte_kvargs_pair* entry; - - /* is the list full? */ - if (kvlist->count >= RTE_KVARGS_MAX) { - RTE_LOG(ERR, PMD, "Couldn't add %s, key/value list is full\n", key); - return -1; - } - - /* Check if the key is duplicated */ - for (i = 0; i < kvlist->count; i++) { - entry = &kvlist->pairs[i]; - if (strcmp(entry->key, key) == 0) { - RTE_LOG(ERR, PMD, "Couldn't add %s, duplicated key\n", key); - return -1; - } - } - - entry = &kvlist->pairs[kvlist->count]; - entry->key = key; - entry->value = val; - kvlist->count++; - return 0; -} - /* * Receive a string with a list of arguments following the pattern - * key=value;key=value;... and insert them into the list. + * key=value,key=value,... and insert them into the list. * strtok() is used so the params string will be copied to be modified. */ static int rte_kvargs_tokenize(struct rte_kvargs *kvlist, const char *params) { - unsigned i, count; - char *pairs[RTE_KVARGS_MAX]; - char *pair[2]; - - /* If params are empty, nothing to do */ - if (params == NULL || params[0] == 0) { - RTE_LOG(ERR, PMD, "Cannot parse empty arguments\n"); - return -1; - } + unsigned i; + char *str; + char *ctx1 = NULL; + char *ctx2 = NULL; /* Copy the const char *params to a modifiable string * to pass to rte_strsplit @@ -100,27 +33,29 @@ rte_kvargs_tokenize(struct rte_kvargs *kvlist, const char *params) return -1; } - count = rte_strsplit(kvlist->str, strnlen(kvlist->str, MAX_ARG_STRLEN), pairs, - RTE_KVARGS_MAX, RTE_KVARGS_PAIRS_DELIM); + /* browse each key/value pair and add it in kvlist */ + str = kvlist->str; + while ((str = strtok_r(str, RTE_KVARGS_PAIRS_DELIM, &ctx1)) != NULL) { - for (i = 0; i < count; i++) { - pair[0] = NULL; - pair[1] = NULL; - - rte_strsplit(pairs[i], strnlen(pairs[i], MAX_ARG_STRLEN), pair, 2, - RTE_KVARGS_KV_DELIM); + i = kvlist->count; + if (i >= RTE_KVARGS_MAX) { + RTE_LOG(ERR, PMD, "Cannot parse arguments: list full\n"); + return -1; + } - if (pair[0] == NULL || pair[1] == NULL || pair[0][0] == 0 - || pair[1][0] == 0) { + kvlist->pairs[i].key = strtok_r(str, RTE_KVARGS_KV_DELIM, &ctx2); + kvlist->pairs[i].value = strtok_r(NULL, RTE_KVARGS_KV_DELIM, &ctx2); + if (kvlist->pairs[i].key == NULL || kvlist->pairs[i].value == NULL) { RTE_LOG(ERR, PMD, "Cannot parse arguments: wrong key or value\n" "params=<%s>\n", params); return -1; } - if (rte_kvargs_add_pair(kvlist, pair[0], pair[1]) < 0) - return -1; + kvlist->count++; + str = NULL; } + return 0; } @@ -129,13 +64,14 @@ rte_kvargs_tokenize(struct rte_kvargs *kvlist, const char *params) * into a list of valid keys. */ static int -is_valid_key(const char *valid[], const char *key_match) +is_valid_key(const char * const valid[], const char *key_match) { - const char **valid_ptr; + const char * const *valid_ptr; - for (valid_ptr = valid; *valid_ptr != NULL; valid_ptr++) - if (strstr(key_match, *valid_ptr) != NULL) + for (valid_ptr = valid; *valid_ptr != NULL; valid_ptr++) { + if (strcmp(key_match, *valid_ptr) == 0) return 1; + } return 0; } @@ -145,7 +81,7 @@ is_valid_key(const char *valid[], const char *key_match) */ static int check_for_valid_keys(struct rte_kvargs *kvlist, - const char *valid[]) + const char * const valid[]) { unsigned i, ret; struct rte_kvargs_pair *pair; @@ -177,7 +113,7 @@ rte_kvargs_count(const struct rte_kvargs *kvlist, const char *key_match) ret = 0; for (i = 0; i < kvlist->count; i++) { pair = &kvlist->pairs[i]; - if (strcmp(pair->key, key_match) == 0) + if (key_match == NULL || strcmp(pair->key, key_match) == 0) ret++; } @@ -198,8 +134,8 @@ rte_kvargs_process(const struct rte_kvargs *kvlist, for (i = 0; i < kvlist->count; i++) { pair = &kvlist->pairs[i]; - if (strstr(pair->key, key_match) != NULL) { - if ((*handler)(pair->value, opaque_arg) < 0) + if (key_match == NULL || strcmp(pair->key, key_match) == 0) { + if ((*handler)(pair->key, pair->value, opaque_arg) < 0) return -1; } } @@ -210,18 +146,20 @@ rte_kvargs_process(const struct rte_kvargs *kvlist, void rte_kvargs_free(struct rte_kvargs *kvlist) { - if (kvlist->str != NULL) - free(kvlist->str); + if (!kvlist) + return; + + free(kvlist->str); free(kvlist); } /* - * Parse the arguments "key=value;key=value;..." string and return + * Parse the arguments "key=value,key=value,..." string and return * an allocated structure that contains a key/value list. Also * check if only valid keys were used. */ struct rte_kvargs * -rte_kvargs_parse(const char *args, const char *valid_keys[]) +rte_kvargs_parse(const char *args, const char * const valid_keys[]) { struct rte_kvargs *kvlist;