--- libaitcli/src/aitcli.c 2022/10/13 21:29:15 1.17.2.1 +++ libaitcli/src/aitcli.c 2022/12/05 22:23:38 1.19 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcli.c,v 1.17.2.1 2022/10/13 21:29:15 misho Exp $ +* $Id: aitcli.c,v 1.19 2022/12/05 22:23:38 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -87,25 +87,28 @@ static inline void clrscrEOL(linebuffer_t * __restrict buf) { register int i; + int ign __attribute__((unused)); if (buf && buf->line_prompt) { - write(buf->line_out, K_CR, 1); + ign = write(buf->line_out, K_CR, 1); for (i = 0; i < buf->line_len; i++) - write(buf->line_out, K_SPACE, 1); + ign = write(buf->line_out, K_SPACE, 1); } } static inline void printfEOL(linebuffer_t * __restrict buf, int len, int prompt) { + int ign __attribute__((unused)); + if (buf) { if (prompt && buf->line_prompt) { - write(buf->line_out, K_CR, 1); - write(buf->line_out, buf->line_prompt, buf->line_bol); + ign = write(buf->line_out, K_CR, 1); + ign = write(buf->line_out, buf->line_prompt, buf->line_bol); } - write(buf->line_out, buf->line_buf, len == -1 ? + ign = write(buf->line_out, buf->line_buf, len == -1 ? buf->line_eol - buf->line_bol : len); } } @@ -113,21 +116,25 @@ printfEOL(linebuffer_t * __restrict buf, int len, int static inline void printfCR(linebuffer_t * __restrict buf, int prompt) { + int ign __attribute__((unused)); + if (buf && prompt && buf->line_prompt) { - write(buf->line_out, K_CR, 1); - write(buf->line_out, buf->line_prompt, buf->line_bol); + ign = write(buf->line_out, K_CR, 1); + ign = write(buf->line_out, buf->line_prompt, buf->line_bol); } } static inline void printfNL(linebuffer_t * __restrict buf, int prompt) { + int ign __attribute__((unused)); + if (buf) { - write(buf->line_out, K_ENTER, 1); + ign = write(buf->line_out, K_ENTER, 1); if (prompt) if (prompt && buf->line_prompt) - write(buf->line_out, buf->line_prompt, buf->line_bol); + ign = write(buf->line_out, buf->line_prompt, buf->line_bol); } } @@ -138,6 +145,7 @@ bufCHAR(int idx, void * __restrict cli_buffer) { linebuffer_t *buf = cli_buffer; int pos; + int ign __attribute__((unused)); if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; @@ -155,10 +163,10 @@ bufCHAR(int idx, void * __restrict cli_buffer) buf->line_buf[buf->line_len - 1] = 0; if (buf->line_prompt) - write(buf->line_out, buf->line_keys[idx].key_ch, buf->line_keys[idx].key_len); + ign = write(buf->line_out, buf->line_keys[idx].key_ch, buf->line_keys[idx].key_len); if (buf->line_mode == LINEMODE_INS) { - write(buf->line_out, (const u_char*) buf->line_buf + pos + buf->line_keys[idx].key_len, + ign = write(buf->line_out, (const u_char*) buf->line_buf + pos + buf->line_keys[idx].key_len, buf->line_len - buf->line_eol); printfEOL(buf, -1, 1); } @@ -404,6 +412,7 @@ bufComp(int idx, void * __restrict cli_buffer) register int i, j; struct tagCommand *cmd, *c; int pos, ret = RETCODE_OK; + int ign __attribute__((unused)); if (!cli_buffer || idx < 0 || idx > MAX_BINDKEY) return RETCODE_ERR; @@ -466,7 +475,7 @@ bufComp(int idx, void * __restrict cli_buffer) /* completion show actions ... */ if (j > 1 && c) { printfNL(buf, 0); - write(buf->line_out, szLine, strlen(szLine)); + ign = write(buf->line_out, szLine, strlen(szLine)); printfNL(buf, 1); printfEOL(buf, buf->line_len - 1, 1); printfEOL(buf, -1, 1); @@ -1246,18 +1255,21 @@ cliInit(int fin, int fout, const char *prompt) } /* - * cliInitLine() - Init CLI input line terminal + * cliSetLine() - Set CLI input line terminal * * @cli_buffer = CLI buffer - * return: none + * @old = Old terminal settings + * return: -1 error or 0 ok */ int -cliInitLine(linebuffer_t * __restrict cli_buffer) +cliSetLine(linebuffer_t * __restrict cli_buffer, struct termios * __restrict old) { struct termios t; memset(&t, 0, sizeof t); tcgetattr(cli_buffer->line_in, &t); + if (old) + memcpy(old, &t, sizeof(struct termios)); t.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO | ECHOCTL | ECHOE | ECHOK | ECHOKE | ECHONL | ECHOPRT); t.c_iflag |= IGNBRK; @@ -1267,6 +1279,19 @@ cliInitLine(linebuffer_t * __restrict cli_buffer) } /* + * cliResetLine() - Reset CLI input line terminal + * + * @cli_buffer = CLI buffer + * @old = Original terminal settings + * return: -1 error or 0 ok +*/ +int +cliResetLine(linebuffer_t * __restrict cli_buffer, struct termios * __restrict orig) +{ + return tcsetattr(cli_buffer->line_in, TCSANOW, orig); +} + +/* * cliReadLine() - Read line from opened CLI session * * @cli_buffer = CLI buffer @@ -1538,9 +1563,10 @@ cliLoop(linebuffer_t * __restrict cli_buffer, const ch { char *line; int ret = RETCODE_OK; + struct termios t; /* --- main body of CLI --- */ - cliInitLine(cli_buffer); + cliSetLine(cli_buffer, &t); if (cli_loadHistory(cli_buffer, csHistFile) == RETCODE_ERR) return RETCODE_ERR; @@ -1558,8 +1584,12 @@ cliLoop(linebuffer_t * __restrict cli_buffer, const ch cli_freeLine(cli_buffer); cli_resetHistory(cli_buffer); e_free(line); - } while (cli_buffer->line_kill || ret < 1); + } while (!cli_buffer->line_kill); cli_saveHistory(cli_buffer, csHistFile, HISTORY_LINES); + + /* --- restore tty --- */ + cliResetLine(cli_buffer, &t); + return ret; }