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 is_comment(char *in) 54 { 55 if ((strlen(in) && index("!#%;", in[0])) || 56 (strncmp(in, "//", 2) == 0) || 57 (strncmp(in, "--", 2) == 0)) 58 return 1; 59 60 return 0; 61 } 62 63 void 64 cli_init(void) 65 { 66 cl = cmdline_stdin_new(modules_ctx, ""); 67 } 68 69 void 70 cli_exit(void) 71 { 72 cmdline_stdin_exit(cl); 73 } 74 75 void 76 cli_process(char *in, char *out, size_t out_size, __rte_unused void *obj) 77 { 78 int rc; 79 80 if (is_comment(in)) 81 return; 82 83 rc = cmdline_parse(cl, in); 84 if (rc == CMDLINE_PARSE_AMBIGUOUS) 85 snprintf(out, out_size, MSG_CMD_FAIL, "Ambiguous command"); 86 else if (rc == CMDLINE_PARSE_NOMATCH) 87 snprintf(out, out_size, MSG_CMD_FAIL, "Command mismatch"); 88 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 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 if ((file_name == NULL) || (strlen(file_name) == 0) || (msg_in_len_max == 0) || 104 (msg_out_len_max == 0)) 105 return rc; 106 107 msg_in = malloc(msg_in_len_max + 1); 108 msg_out = malloc(msg_out_len_max + 1); 109 if ((msg_in == NULL) || (msg_out == NULL)) { 110 rc = -ENOMEM; 111 goto exit; 112 } 113 114 /* Open input file */ 115 f = fopen(file_name, "r"); 116 if (f == NULL) { 117 rc = -EIO; 118 goto exit; 119 } 120 121 /* Read file */ 122 while (fgets(msg_in, msg_in_len_max, f) != NULL) { 123 msg_out[0] = 0; 124 125 cli_process(msg_in, msg_out, msg_out_len_max, obj); 126 127 if (strlen(msg_out)) 128 printf("%s", msg_out); 129 } 130 131 /* Close file */ 132 fclose(f); 133 rc = 0; 134 135 exit: 136 free(msg_out); 137 free(msg_in); 138 return rc; 139 } 140