xref: /dpdk/app/graph/cli.c (revision 0f32dac4bbf74761972249090523f4581ca13126)
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