1*5b21ffb2SSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause
2*5b21ffb2SSunil Kumar Kori * Copyright(c) 2023 Marvell.
3*5b21ffb2SSunil Kumar Kori */
4*5b21ffb2SSunil Kumar Kori
5*5b21ffb2SSunil Kumar Kori #include <errno.h>
6*5b21ffb2SSunil Kumar Kori #include <stdio.h>
7*5b21ffb2SSunil Kumar Kori #include <stdint.h>
8*5b21ffb2SSunil Kumar Kori #include <stdlib.h>
9*5b21ffb2SSunil Kumar Kori #include <string.h>
10*5b21ffb2SSunil Kumar Kori
11*5b21ffb2SSunil Kumar Kori #include <cmdline_parse.h>
12*5b21ffb2SSunil Kumar Kori #include <cmdline_parse_num.h>
13*5b21ffb2SSunil Kumar Kori #include <cmdline_parse_string.h>
14*5b21ffb2SSunil Kumar Kori #include <cmdline_socket.h>
15*5b21ffb2SSunil Kumar Kori #include <rte_common.h>
16*5b21ffb2SSunil Kumar Kori
17*5b21ffb2SSunil Kumar Kori #include "module_api.h"
18*5b21ffb2SSunil Kumar Kori
19*5b21ffb2SSunil Kumar Kori #define CMD_MAX_TOKENS 256
20*5b21ffb2SSunil Kumar Kori #define MAX_LINE_SIZE 2048
21*5b21ffb2SSunil Kumar Kori
22*5b21ffb2SSunil Kumar Kori static struct cmdline *cl;
23*5b21ffb2SSunil Kumar Kori
24*5b21ffb2SSunil Kumar Kori static int
is_comment(char * in)25*5b21ffb2SSunil Kumar Kori is_comment(char *in)
26*5b21ffb2SSunil Kumar Kori {
27*5b21ffb2SSunil Kumar Kori if ((strlen(in) && index("!#%;", in[0])) ||
28*5b21ffb2SSunil Kumar Kori (strncmp(in, "//", 2) == 0) ||
29*5b21ffb2SSunil Kumar Kori (strncmp(in, "--", 2) == 0))
30*5b21ffb2SSunil Kumar Kori return 1;
31*5b21ffb2SSunil Kumar Kori
32*5b21ffb2SSunil Kumar Kori return 0;
33*5b21ffb2SSunil Kumar Kori }
34*5b21ffb2SSunil Kumar Kori
35*5b21ffb2SSunil Kumar Kori void
cli_init(void)36*5b21ffb2SSunil Kumar Kori cli_init(void)
37*5b21ffb2SSunil Kumar Kori {
38*5b21ffb2SSunil Kumar Kori cl = cmdline_stdin_new(modules_ctx, "");
39*5b21ffb2SSunil Kumar Kori }
40*5b21ffb2SSunil Kumar Kori
41*5b21ffb2SSunil Kumar Kori void
cli_exit(void)42*5b21ffb2SSunil Kumar Kori cli_exit(void)
43*5b21ffb2SSunil Kumar Kori {
44*5b21ffb2SSunil Kumar Kori cmdline_stdin_exit(cl);
45*5b21ffb2SSunil Kumar Kori }
46*5b21ffb2SSunil Kumar Kori
47*5b21ffb2SSunil Kumar Kori void
cli_process(char * in,char * out,size_t out_size,__rte_unused void * obj)48*5b21ffb2SSunil Kumar Kori cli_process(char *in, char *out, size_t out_size, __rte_unused void *obj)
49*5b21ffb2SSunil Kumar Kori {
50*5b21ffb2SSunil Kumar Kori int rc;
51*5b21ffb2SSunil Kumar Kori
52*5b21ffb2SSunil Kumar Kori if (is_comment(in))
53*5b21ffb2SSunil Kumar Kori return;
54*5b21ffb2SSunil Kumar Kori
55*5b21ffb2SSunil Kumar Kori rc = cmdline_parse(cl, in);
56*5b21ffb2SSunil Kumar Kori if (rc == CMDLINE_PARSE_AMBIGUOUS)
57*5b21ffb2SSunil Kumar Kori snprintf(out, out_size, MSG_CMD_FAIL, "Ambiguous command");
58*5b21ffb2SSunil Kumar Kori else if (rc == CMDLINE_PARSE_NOMATCH)
59*5b21ffb2SSunil Kumar Kori snprintf(out, out_size, MSG_CMD_FAIL, "Command mismatch");
60*5b21ffb2SSunil Kumar Kori else if (rc == CMDLINE_PARSE_BAD_ARGS)
61*5b21ffb2SSunil Kumar Kori snprintf(out, out_size, MSG_CMD_FAIL, "Bad arguments");
62*5b21ffb2SSunil Kumar Kori
63*5b21ffb2SSunil Kumar Kori return;
64*5b21ffb2SSunil Kumar Kori
65*5b21ffb2SSunil Kumar Kori }
66*5b21ffb2SSunil Kumar Kori
67*5b21ffb2SSunil Kumar Kori int
cli_script_process(const char * file_name,size_t msg_in_len_max,size_t msg_out_len_max,void * obj)68*5b21ffb2SSunil Kumar Kori cli_script_process(const char *file_name, size_t msg_in_len_max, size_t msg_out_len_max, void *obj)
69*5b21ffb2SSunil Kumar Kori {
70*5b21ffb2SSunil Kumar Kori char *msg_in = NULL, *msg_out = NULL;
71*5b21ffb2SSunil Kumar Kori int rc = -EINVAL;
72*5b21ffb2SSunil Kumar Kori FILE *f = NULL;
73*5b21ffb2SSunil Kumar Kori
74*5b21ffb2SSunil Kumar Kori /* Check input arguments */
75*5b21ffb2SSunil Kumar Kori if ((file_name == NULL) || (strlen(file_name) == 0) || (msg_in_len_max == 0) ||
76*5b21ffb2SSunil Kumar Kori (msg_out_len_max == 0))
77*5b21ffb2SSunil Kumar Kori return rc;
78*5b21ffb2SSunil Kumar Kori
79*5b21ffb2SSunil Kumar Kori msg_in = malloc(msg_in_len_max + 1);
80*5b21ffb2SSunil Kumar Kori msg_out = malloc(msg_out_len_max + 1);
81*5b21ffb2SSunil Kumar Kori if ((msg_in == NULL) || (msg_out == NULL)) {
82*5b21ffb2SSunil Kumar Kori rc = -ENOMEM;
83*5b21ffb2SSunil Kumar Kori goto exit;
84*5b21ffb2SSunil Kumar Kori }
85*5b21ffb2SSunil Kumar Kori
86*5b21ffb2SSunil Kumar Kori /* Open input file */
87*5b21ffb2SSunil Kumar Kori f = fopen(file_name, "r");
88*5b21ffb2SSunil Kumar Kori if (f == NULL) {
89*5b21ffb2SSunil Kumar Kori rc = -EIO;
90*5b21ffb2SSunil Kumar Kori goto exit;
91*5b21ffb2SSunil Kumar Kori }
92*5b21ffb2SSunil Kumar Kori
93*5b21ffb2SSunil Kumar Kori /* Read file */
94*5b21ffb2SSunil Kumar Kori while (fgets(msg_in, msg_in_len_max, f) != NULL) {
95*5b21ffb2SSunil Kumar Kori msg_out[0] = 0;
96*5b21ffb2SSunil Kumar Kori
97*5b21ffb2SSunil Kumar Kori cli_process(msg_in, msg_out, msg_out_len_max, obj);
98*5b21ffb2SSunil Kumar Kori
99*5b21ffb2SSunil Kumar Kori if (strlen(msg_out))
100*5b21ffb2SSunil Kumar Kori printf("%s", msg_out);
101*5b21ffb2SSunil Kumar Kori }
102*5b21ffb2SSunil Kumar Kori
103*5b21ffb2SSunil Kumar Kori /* Close file */
104*5b21ffb2SSunil Kumar Kori fclose(f);
105*5b21ffb2SSunil Kumar Kori rc = 0;
106*5b21ffb2SSunil Kumar Kori
107*5b21ffb2SSunil Kumar Kori exit:
108*5b21ffb2SSunil Kumar Kori free(msg_out);
109*5b21ffb2SSunil Kumar Kori free(msg_in);
110*5b21ffb2SSunil Kumar Kori return rc;
111*5b21ffb2SSunil Kumar Kori }
112