1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2*d30ea906Sjfb8856606 * Copyright(c) 2010-2014 Intel Corporation. 3a9643ea8Slogwang * Copyright (c) 2009, Olivier MATZ <[email protected]> 4a9643ea8Slogwang * All rights reserved. 5a9643ea8Slogwang */ 6a9643ea8Slogwang 7a9643ea8Slogwang #include <stdio.h> 8a9643ea8Slogwang #include <inttypes.h> 9a9643ea8Slogwang #include <stdarg.h> 10a9643ea8Slogwang #include <errno.h> 11a9643ea8Slogwang #include <ctype.h> 12a9643ea8Slogwang #include <string.h> 13a9643ea8Slogwang #include <netinet/in.h> 14a9643ea8Slogwang 15a9643ea8Slogwang #include <cmdline_parse.h> 16a9643ea8Slogwang #include <cmdline_parse_ipaddr.h> 17a9643ea8Slogwang 18a9643ea8Slogwang #include <rte_string_fns.h> 19a9643ea8Slogwang 20a9643ea8Slogwang #include "parse_obj_list.h" 21a9643ea8Slogwang 22a9643ea8Slogwang /* This file is an example of extension of libcmdline. It provides an 23a9643ea8Slogwang * example of objects stored in a list. */ 24a9643ea8Slogwang 25a9643ea8Slogwang struct cmdline_token_ops token_obj_list_ops = { 26a9643ea8Slogwang .parse = parse_obj_list, 27a9643ea8Slogwang .complete_get_nb = complete_get_nb_obj_list, 28a9643ea8Slogwang .complete_get_elt = complete_get_elt_obj_list, 29a9643ea8Slogwang .get_help = get_help_obj_list, 30a9643ea8Slogwang }; 31a9643ea8Slogwang 32a9643ea8Slogwang int 33a9643ea8Slogwang parse_obj_list(cmdline_parse_token_hdr_t *tk, const char *buf, void *res, 34a9643ea8Slogwang unsigned ressize) 35a9643ea8Slogwang { 36a9643ea8Slogwang struct token_obj_list *tk2 = (struct token_obj_list *)tk; 37a9643ea8Slogwang struct token_obj_list_data *tkd = &tk2->obj_list_data; 38a9643ea8Slogwang struct object *o; 39a9643ea8Slogwang unsigned int token_len = 0; 40a9643ea8Slogwang 41a9643ea8Slogwang if (*buf == 0) 42a9643ea8Slogwang return -1; 43a9643ea8Slogwang 44a9643ea8Slogwang if (res && ressize < sizeof(struct object *)) 45a9643ea8Slogwang return -1; 46a9643ea8Slogwang 47a9643ea8Slogwang while(!cmdline_isendoftoken(buf[token_len])) 48a9643ea8Slogwang token_len++; 49a9643ea8Slogwang 50a9643ea8Slogwang SLIST_FOREACH(o, tkd->list, next) { 51a9643ea8Slogwang if (token_len != strnlen(o->name, OBJ_NAME_LEN_MAX)) 52a9643ea8Slogwang continue; 53a9643ea8Slogwang if (strncmp(buf, o->name, token_len)) 54a9643ea8Slogwang continue; 55a9643ea8Slogwang break; 56a9643ea8Slogwang } 57a9643ea8Slogwang if (!o) /* not found */ 58a9643ea8Slogwang return -1; 59a9643ea8Slogwang 60a9643ea8Slogwang /* store the address of object in structure */ 61a9643ea8Slogwang if (res) 62a9643ea8Slogwang *(struct object **)res = o; 63a9643ea8Slogwang 64a9643ea8Slogwang return token_len; 65a9643ea8Slogwang } 66a9643ea8Slogwang 67a9643ea8Slogwang int complete_get_nb_obj_list(cmdline_parse_token_hdr_t *tk) 68a9643ea8Slogwang { 69a9643ea8Slogwang struct token_obj_list *tk2 = (struct token_obj_list *)tk; 70a9643ea8Slogwang struct token_obj_list_data *tkd = &tk2->obj_list_data; 71a9643ea8Slogwang struct object *o; 72a9643ea8Slogwang int ret = 0; 73a9643ea8Slogwang 74a9643ea8Slogwang SLIST_FOREACH(o, tkd->list, next) { 75a9643ea8Slogwang ret ++; 76a9643ea8Slogwang } 77a9643ea8Slogwang return ret; 78a9643ea8Slogwang } 79a9643ea8Slogwang 80a9643ea8Slogwang int complete_get_elt_obj_list(cmdline_parse_token_hdr_t *tk, 81a9643ea8Slogwang int idx, char *dstbuf, unsigned int size) 82a9643ea8Slogwang { 83a9643ea8Slogwang struct token_obj_list *tk2 = (struct token_obj_list *)tk; 84a9643ea8Slogwang struct token_obj_list_data *tkd = &tk2->obj_list_data; 85a9643ea8Slogwang struct object *o; 86a9643ea8Slogwang int i = 0; 87a9643ea8Slogwang unsigned len; 88a9643ea8Slogwang 89a9643ea8Slogwang SLIST_FOREACH(o, tkd->list, next) { 90a9643ea8Slogwang if (i++ == idx) 91a9643ea8Slogwang break; 92a9643ea8Slogwang } 93a9643ea8Slogwang if (!o) 94a9643ea8Slogwang return -1; 95a9643ea8Slogwang 96a9643ea8Slogwang len = strnlen(o->name, OBJ_NAME_LEN_MAX); 97a9643ea8Slogwang if ((len + 1) > size) 98a9643ea8Slogwang return -1; 99a9643ea8Slogwang 100a9643ea8Slogwang if (dstbuf) 101a9643ea8Slogwang snprintf(dstbuf, size, "%s", o->name); 102a9643ea8Slogwang 103a9643ea8Slogwang return 0; 104a9643ea8Slogwang } 105a9643ea8Slogwang 106a9643ea8Slogwang 107a9643ea8Slogwang int get_help_obj_list(__attribute__((unused)) cmdline_parse_token_hdr_t *tk, 108a9643ea8Slogwang char *dstbuf, unsigned int size) 109a9643ea8Slogwang { 110a9643ea8Slogwang snprintf(dstbuf, size, "Obj-List"); 111a9643ea8Slogwang return 0; 112a9643ea8Slogwang } 113