Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2023 Marvell.
3 : : */
4 : :
5 : : #include <errno.h>
6 : : #include <stdio.h>
7 : : #include <stdint.h>
8 : : #include <stdlib.h>
9 : : #include <string.h>
10 : :
11 : : #include <cmdline_parse.h>
12 : : #include <cmdline_parse_num.h>
13 : : #include <cmdline_parse_string.h>
14 : : #include <cmdline_socket.h>
15 : : #include <rte_common.h>
16 : :
17 : : #include "module_api.h"
18 : :
19 : : #define CMD_MAX_TOKENS 256
20 : : #define MAX_LINE_SIZE 2048
21 : :
22 : : cmdline_parse_ctx_t modules_ctx[] = {
23 : : (cmdline_parse_inst_t *)&graph_config_cmd_ctx,
24 : : (cmdline_parse_inst_t *)&graph_start_cmd_ctx,
25 : : (cmdline_parse_inst_t *)&graph_stats_cmd_ctx,
26 : : (cmdline_parse_inst_t *)&graph_help_cmd_ctx,
27 : : (cmdline_parse_inst_t *)&mempool_config_cmd_ctx,
28 : : (cmdline_parse_inst_t *)&mempool_help_cmd_ctx,
29 : : (cmdline_parse_inst_t *)ðdev_show_cmd_ctx,
30 : : (cmdline_parse_inst_t *)ðdev_stats_cmd_ctx,
31 : : (cmdline_parse_inst_t *)ðdev_mtu_cmd_ctx,
32 : : (cmdline_parse_inst_t *)ðdev_prom_mode_cmd_ctx,
33 : : (cmdline_parse_inst_t *)ðdev_ip4_cmd_ctx,
34 : : (cmdline_parse_inst_t *)ðdev_ip6_cmd_ctx,
35 : : (cmdline_parse_inst_t *)ðdev_forward_cmd_ctx,
36 : : (cmdline_parse_inst_t *)ðdev_cmd_ctx,
37 : : (cmdline_parse_inst_t *)ðdev_help_cmd_ctx,
38 : : (cmdline_parse_inst_t *)ðdev_rx_cmd_ctx,
39 : : (cmdline_parse_inst_t *)ðdev_rx_help_cmd_ctx,
40 : : (cmdline_parse_inst_t *)&ipv4_lookup_cmd_ctx,
41 : : (cmdline_parse_inst_t *)&ipv4_lookup_help_cmd_ctx,
42 : : (cmdline_parse_inst_t *)&ipv6_lookup_cmd_ctx,
43 : : (cmdline_parse_inst_t *)&ipv6_lookup_help_cmd_ctx,
44 : : (cmdline_parse_inst_t *)&neigh_v4_cmd_ctx,
45 : : (cmdline_parse_inst_t *)&neigh_v6_cmd_ctx,
46 : : (cmdline_parse_inst_t *)&neigh_help_cmd_ctx,
47 : : NULL,
48 : : };
49 : :
50 : : static struct cmdline *cl;
51 : :
52 : : static int
53 : 0 : is_comment(char *in)
54 : : {
55 : 0 : if ((strlen(in) && index("!#%;", in[0])) ||
56 : 0 : (strncmp(in, "//", 2) == 0) ||
57 : 0 : (strncmp(in, "--", 2) == 0))
58 : 0 : return 1;
59 : :
60 : : return 0;
61 : : }
62 : :
63 : : void
64 : 0 : cli_init(void)
65 : : {
66 : 0 : cl = cmdline_stdin_new(modules_ctx, "");
67 : 0 : }
68 : :
69 : : void
70 : 0 : cli_exit(void)
71 : : {
72 : 0 : cmdline_stdin_exit(cl);
73 : 0 : }
74 : :
75 : : void
76 : 0 : cli_process(char *in, char *out, size_t out_size, __rte_unused void *obj)
77 : : {
78 : : int rc;
79 : :
80 : 0 : if (is_comment(in))
81 : : return;
82 : :
83 : 0 : rc = cmdline_parse(cl, in);
84 : 0 : if (rc == CMDLINE_PARSE_AMBIGUOUS)
85 : : snprintf(out, out_size, MSG_CMD_FAIL, "Ambiguous command");
86 : 0 : else if (rc == CMDLINE_PARSE_NOMATCH)
87 : : snprintf(out, out_size, MSG_CMD_FAIL, "Command mismatch");
88 : 0 : else if (rc == CMDLINE_PARSE_BAD_ARGS)
89 : : snprintf(out, out_size, MSG_CMD_FAIL, "Bad arguments");
90 : :
91 : : return;
92 : :
93 : : }
94 : :
95 : : int
96 : 0 : cli_script_process(const char *file_name, size_t msg_in_len_max, size_t msg_out_len_max, void *obj)
97 : : {
98 : : char *msg_in = NULL, *msg_out = NULL;
99 : : int rc = -EINVAL;
100 : : FILE *f = NULL;
101 : :
102 : : /* Check input arguments */
103 : 0 : if ((file_name == NULL) || (strlen(file_name) == 0) || (msg_in_len_max == 0) ||
104 : 0 : (msg_out_len_max == 0))
105 : : return rc;
106 : :
107 : 0 : msg_in = malloc(msg_in_len_max + 1);
108 : 0 : msg_out = malloc(msg_out_len_max + 1);
109 : 0 : if ((msg_in == NULL) || (msg_out == NULL)) {
110 : : rc = -ENOMEM;
111 : 0 : goto exit;
112 : : }
113 : :
114 : : /* Open input file */
115 : 0 : f = fopen(file_name, "r");
116 : 0 : if (f == NULL) {
117 : : rc = -EIO;
118 : 0 : goto exit;
119 : : }
120 : :
121 : : /* Read file */
122 : 0 : while (fgets(msg_in, msg_in_len_max, f) != NULL) {
123 : 0 : msg_out[0] = 0;
124 : :
125 : 0 : cli_process(msg_in, msg_out, msg_out_len_max, obj);
126 : :
127 : 0 : if (strlen(msg_out))
128 : : printf("%s", msg_out);
129 : : }
130 : :
131 : : /* Close file */
132 : 0 : fclose(f);
133 : : rc = 0;
134 : :
135 : 0 : exit:
136 : 0 : free(msg_out);
137 : 0 : free(msg_in);
138 : 0 : return rc;
139 : : }
|