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