/* Terminal Mixer - multi-point multi-user access to terminal applications Copyright (C) 2007 LluĂ­s Batlle i Rossell Please find the license in the provided COPYING file. */ #include #include #include #include #include #include #include #include #include #include "main.h" static int is_tios_saved = 0; static struct termios saved_tios; void prepare_user_terminal() { int res; struct termios tios; res = tcgetattr(1, &tios); if (res == -1) error("tcgetatttr"); memcpy(&saved_tios, &tios, sizeof(struct termios)); is_tios_saved = 1; cfmakeraw(&tios); tios.c_lflag &= ~ECHO; res = tcsetattr(0, TCSANOW, &tios); if (res == -1) error("tcsetatttr"); } void restore_user_terminal() { int res; res = tcsetattr(0, TCSANOW, &saved_tios); if (res == -1) { /* cannot call error(), because it calls finish(), then * restore_user_terminal() */ fprintf(stderr,"tcsetatttr failed: %s", strerror(errno)); exit(-1); } } void finish(int ret) { if (is_tios_saved) restore_user_terminal(); exit(ret); }