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