1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * 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
parse_obj_list(cmdline_parse_token_hdr_t * tk,const char * buf,void * res,unsigned ressize)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 
complete_get_nb_obj_list(cmdline_parse_token_hdr_t * tk)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 
complete_get_elt_obj_list(cmdline_parse_token_hdr_t * tk,int idx,char * dstbuf,unsigned int size)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)
1014418919fSjohnjiang 		strlcpy(dstbuf, o->name, size);
102a9643ea8Slogwang 
103a9643ea8Slogwang 	return 0;
104a9643ea8Slogwang }
105a9643ea8Slogwang 
106a9643ea8Slogwang 
get_help_obj_list(__rte_unused cmdline_parse_token_hdr_t * tk,char * dstbuf,unsigned int size)107*2d9fd380Sjfb8856606 int get_help_obj_list(__rte_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