rendered paste body#include <err.h>#include <errno.h>#include <stdlib.h>#include <stdio.h>#include <termios.h>#include <unistd.h>#include <sys/select.h>intmain(void){ struct termios told, tnew; char linebuf[255], *sptr, *eptr; if (tcgetattr(STDIN_FILENO, &told) == -1) err(errno, "tcgetattr"); tnew = told; tnew.c_lflag &= ~(ECHO | ECHONL | ICANON); if (tcsetattr(STDIN_FILENO, TCSADRAIN, &tnew) == -1) err(errno, "tcsetattr"); *linebuf = '\0'; sptr = linebuf; eptr = &linebuf[sizeof(linebuf)]; for (;;) { uint8_t c; fd_set set; FD_ZERO(&set); FD_SET(STDIN_FILENO, &set); if (select(1, &set, NULL, NULL, NULL) != 1) { warn("select"); continue; } if (read(STDIN_FILENO, &c, 1) < 1) break; switch (c) { case 127: if (sptr > linebuf) { --sptr; (void) fputs("\b \b", stdout); (void) fflush(stdout); } break; case 10: *sptr++ = '\r'; *sptr++ = '\n'; *sptr++ = '\0'; goto out; default: /* Account for \r\n\0 we'll add */ if (sptr < eptr - 3) { *sptr++ = c; (void) fputc(c, stdout); (void) fflush(stdout); } } }out: (void) printf("\nString: %s", linebuf); if (tcsetattr(STDIN_FILENO, TCSADRAIN, &told) == -1) err(errno, "tcsetattr"); exit(EXIT_SUCCESS);}