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 static struct cmdline *cl;
23
24 static int
is_comment(char * in)25 is_comment(char *in)
26 {
27 if ((strlen(in) && index("!#%;", in[0])) ||
28 (strncmp(in, "//", 2) == 0) ||
29 (strncmp(in, "--", 2) == 0))
30 return 1;
31
32 return 0;
33 }
34
35 void
cli_init(void)36 cli_init(void)
37 {
38 cl = cmdline_stdin_new(modules_ctx, "");
39 }
40
41 void
cli_exit(void)42 cli_exit(void)
43 {
44 cmdline_stdin_exit(cl);
45 }
46
47 void
cli_process(char * in,char * out,size_t out_size,__rte_unused void * obj)48 cli_process(char *in, char *out, size_t out_size, __rte_unused void *obj)
49 {
50 int rc;
51
52 if (is_comment(in))
53 return;
54
55 rc = cmdline_parse(cl, in);
56 if (rc == CMDLINE_PARSE_AMBIGUOUS)
57 snprintf(out, out_size, MSG_CMD_FAIL, "Ambiguous command");
58 else if (rc == CMDLINE_PARSE_NOMATCH)
59 snprintf(out, out_size, MSG_CMD_FAIL, "Command mismatch");
60 else if (rc == CMDLINE_PARSE_BAD_ARGS)
61 snprintf(out, out_size, MSG_CMD_FAIL, "Bad arguments");
62
63 return;
64
65 }
66
67 int
cli_script_process(const char * file_name,size_t msg_in_len_max,size_t msg_out_len_max,void * obj)68 cli_script_process(const char *file_name, size_t msg_in_len_max, size_t msg_out_len_max, void *obj)
69 {
70 char *msg_in = NULL, *msg_out = NULL;
71 int rc = -EINVAL;
72 FILE *f = NULL;
73
74 /* Check input arguments */
75 if ((file_name == NULL) || (strlen(file_name) == 0) || (msg_in_len_max == 0) ||
76 (msg_out_len_max == 0))
77 return rc;
78
79 msg_in = malloc(msg_in_len_max + 1);
80 msg_out = malloc(msg_out_len_max + 1);
81 if ((msg_in == NULL) || (msg_out == NULL)) {
82 rc = -ENOMEM;
83 goto exit;
84 }
85
86 /* Open input file */
87 f = fopen(file_name, "r");
88 if (f == NULL) {
89 rc = -EIO;
90 goto exit;
91 }
92
93 /* Read file */
94 while (fgets(msg_in, msg_in_len_max, f) != NULL) {
95 msg_out[0] = 0;
96
97 cli_process(msg_in, msg_out, msg_out_len_max, obj);
98
99 if (strlen(msg_out))
100 printf("%s", msg_out);
101 }
102
103 /* Close file */
104 fclose(f);
105 rc = 0;
106
107 exit:
108 free(msg_out);
109 free(msg_in);
110 return rc;
111 }
112