- if ((fd = device_open(console, O_RDWR | O_NOCTTY)) < 0) {
- message(log, "can't open %s\n", console);
- return;
- }
- ioctl(fd, TCGETS, &tty);
- tty.c_cflag &= CBAUD | CBAUDEX | CSIZE | CSTOPB | PARENB | PARODD;
- tty.c_cflag |= HUPCL | CLOCAL;
-
- tty.c_cc[VINTR] = 3;
- tty.c_cc[VQUIT] = 28;
- tty.c_cc[VERASE] = 127;
- tty.c_cc[VKILL] = 24;
- tty.c_cc[VEOF] = 4;
- tty.c_cc[VTIME] = 0;
- tty.c_cc[VMIN] = 1;
- tty.c_cc[VSTART] = 17;
- tty.c_cc[VSTOP] = 19;
- tty.c_cc[VSUSP] = 26;
-
- /* Set pre and post processing */
- tty.c_iflag = IGNPAR | ICRNL | IXON | IXANY;
- tty.c_oflag = OPOST | ONLCR;
- tty.c_lflag = ISIG | ICANON | ECHO | ECHOCTL | ECHOPRT | ECHOKE;
-
- /* Now set the terminal line. */
- ioctl(fd, TCSETS, &tty);
- close(fd);
+ tcgetattr(fd, &tty);
+
+ /* Make it be sane */
+ tty.c_cflag &= CBAUD|CBAUDEX|CSIZE|CSTOPB|PARENB|PARODD;
+ tty.c_cflag |= HUPCL|CLOCAL;
+
+ /* input modes */
+ tty.c_iflag = IGNPAR|ICRNL|IXON|IXOFF|IXANY;
+
+ /* use line dicipline 0 */
+ tty.c_line = 0;
+
+ /* output modes */
+ tty.c_oflag = OPOST|ONLCR;
+
+ /* local modes */
+ tty.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOCTL|ECHOPRT|ECHOKE|IEXTEN;
+
+ /* control chars */
+ memcpy(tty.c_cc, control_characters, sizeof(control_characters));
+
+ tcsetattr(fd, TCSANOW, &tty);