199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 299a2dd95SBruce Richardson * Copyright (c) 2020 Dmitry Kozlyuk 399a2dd95SBruce Richardson */ 499a2dd95SBruce Richardson 599a2dd95SBruce Richardson #ifndef _CMDLINE_PRIVATE_H_ 699a2dd95SBruce Richardson #define _CMDLINE_PRIVATE_H_ 799a2dd95SBruce Richardson 899a2dd95SBruce Richardson #include <stdarg.h> 999a2dd95SBruce Richardson 1099a2dd95SBruce Richardson #include <rte_common.h> 1199a2dd95SBruce Richardson #include <rte_os_shim.h> 1299a2dd95SBruce Richardson #ifdef RTE_EXEC_ENV_WINDOWS 1399a2dd95SBruce Richardson #include <rte_windows.h> 14*a71cdcc5SGregory Etelson #ifndef LINE_MAX 15*a71cdcc5SGregory Etelson /** 16*a71cdcc5SGregory Etelson * The LINE_MAX value is derived from POSIX. 17*a71cdcc5SGregory Etelson * Windows environment may not have POSIX definitions. 18*a71cdcc5SGregory Etelson */ 19*a71cdcc5SGregory Etelson #define LINE_MAX 2048 20*a71cdcc5SGregory Etelson #endif 21f43809d2SDmitry Kozlyuk #else 22f43809d2SDmitry Kozlyuk #include <termios.h> 2399a2dd95SBruce Richardson #endif 2499a2dd95SBruce Richardson 2599a2dd95SBruce Richardson #include <cmdline.h> 2699a2dd95SBruce Richardson 27*a71cdcc5SGregory Etelson #define RDLINE_BUF_SIZE LINE_MAX 28f8f8dc28SDmitry Kozlyuk #define RDLINE_PROMPT_SIZE 32 29f8f8dc28SDmitry Kozlyuk #define RDLINE_VT100_BUF_SIZE 8 30f8f8dc28SDmitry Kozlyuk #define RDLINE_HISTORY_BUF_SIZE BUFSIZ 31f8f8dc28SDmitry Kozlyuk #define RDLINE_HISTORY_MAX_LINE 64 32f8f8dc28SDmitry Kozlyuk 33f8f8dc28SDmitry Kozlyuk struct rdline { 34f1d0993eSStephen Hemminger volatile enum rdline_status status; 35f8f8dc28SDmitry Kozlyuk /* rdline bufs */ 36f8f8dc28SDmitry Kozlyuk struct cirbuf left; 37f8f8dc28SDmitry Kozlyuk struct cirbuf right; 38f8f8dc28SDmitry Kozlyuk char left_buf[RDLINE_BUF_SIZE+2]; /* reserve 2 chars for the \n\0 */ 39f8f8dc28SDmitry Kozlyuk char right_buf[RDLINE_BUF_SIZE]; 40f8f8dc28SDmitry Kozlyuk 41f8f8dc28SDmitry Kozlyuk char prompt[RDLINE_PROMPT_SIZE]; 42f8f8dc28SDmitry Kozlyuk unsigned int prompt_size; 43f8f8dc28SDmitry Kozlyuk 44f8f8dc28SDmitry Kozlyuk char kill_buf[RDLINE_BUF_SIZE]; 45f8f8dc28SDmitry Kozlyuk unsigned int kill_size; 46f8f8dc28SDmitry Kozlyuk 47f8f8dc28SDmitry Kozlyuk /* history */ 48f8f8dc28SDmitry Kozlyuk struct cirbuf history; 49f8f8dc28SDmitry Kozlyuk char history_buf[RDLINE_HISTORY_BUF_SIZE]; 50f8f8dc28SDmitry Kozlyuk int history_cur_line; 51f8f8dc28SDmitry Kozlyuk 52f8f8dc28SDmitry Kozlyuk /* callbacks and func pointers */ 53f8f8dc28SDmitry Kozlyuk rdline_write_char_t *write_char; 54f8f8dc28SDmitry Kozlyuk rdline_validate_t *validate; 55f8f8dc28SDmitry Kozlyuk rdline_complete_t *complete; 56f8f8dc28SDmitry Kozlyuk 57f8f8dc28SDmitry Kozlyuk /* vt100 parser */ 58f8f8dc28SDmitry Kozlyuk struct cmdline_vt100 vt100; 59f8f8dc28SDmitry Kozlyuk 60f8f8dc28SDmitry Kozlyuk /* opaque pointer */ 61f8f8dc28SDmitry Kozlyuk void *opaque; 62f8f8dc28SDmitry Kozlyuk }; 63f8f8dc28SDmitry Kozlyuk 6499a2dd95SBruce Richardson #ifdef RTE_EXEC_ENV_WINDOWS 6599a2dd95SBruce Richardson struct terminal { 6699a2dd95SBruce Richardson DWORD input_mode; 6799a2dd95SBruce Richardson DWORD output_mode; 6899a2dd95SBruce Richardson int is_console_input; 6999a2dd95SBruce Richardson int is_console_output; 7099a2dd95SBruce Richardson }; 71f43809d2SDmitry Kozlyuk #endif 7299a2dd95SBruce Richardson 7399a2dd95SBruce Richardson struct cmdline { 7499a2dd95SBruce Richardson int s_in; 7599a2dd95SBruce Richardson int s_out; 7699a2dd95SBruce Richardson cmdline_parse_ctx_t *ctx; 7799a2dd95SBruce Richardson struct rdline rdl; 7899a2dd95SBruce Richardson char prompt[RDLINE_PROMPT_SIZE]; 79f43809d2SDmitry Kozlyuk #ifdef RTE_EXEC_ENV_WINDOWS 8099a2dd95SBruce Richardson struct terminal oldterm; 8199a2dd95SBruce Richardson char repeated_char; 8299a2dd95SBruce Richardson WORD repeat_count; 83f43809d2SDmitry Kozlyuk #else 84f43809d2SDmitry Kozlyuk struct termios oldterm; 8599a2dd95SBruce Richardson #endif 86f43809d2SDmitry Kozlyuk }; 8799a2dd95SBruce Richardson 8899a2dd95SBruce Richardson /* Disable buffering and echoing, save previous settings to oldterm. */ 8999a2dd95SBruce Richardson void terminal_adjust(struct cmdline *cl); 9099a2dd95SBruce Richardson 9199a2dd95SBruce Richardson /* Restore terminal settings form oldterm. */ 9299a2dd95SBruce Richardson void terminal_restore(const struct cmdline *cl); 9399a2dd95SBruce Richardson 9499a2dd95SBruce Richardson /* Read one character from input. */ 9599a2dd95SBruce Richardson ssize_t cmdline_read_char(struct cmdline *cl, char *c); 9699a2dd95SBruce Richardson 97f1d0993eSStephen Hemminger /* Force current cmdline read to unblock. */ 98f1d0993eSStephen Hemminger void cmdline_cancel(struct cmdline *cl); 99f1d0993eSStephen Hemminger 10099a2dd95SBruce Richardson /* vdprintf(3) */ 10199a2dd95SBruce Richardson __rte_format_printf(2, 0) 10299a2dd95SBruce Richardson int cmdline_vdprintf(int fd, const char *format, va_list op); 10399a2dd95SBruce Richardson 104f8f8dc28SDmitry Kozlyuk int rdline_init(struct rdline *rdl, 105f8f8dc28SDmitry Kozlyuk rdline_write_char_t *write_char, 106f8f8dc28SDmitry Kozlyuk rdline_validate_t *validate, 107f8f8dc28SDmitry Kozlyuk rdline_complete_t *complete, 108f8f8dc28SDmitry Kozlyuk void *opaque); 109f8f8dc28SDmitry Kozlyuk 11099a2dd95SBruce Richardson #endif 111