    static struct termios told;
	   struct termios tnew;

	mch_tcgetattr(read_cmd_fd, &told);

    tnew = told;
    if (tmode == TMODE_RAW)
    {
	tnew.c_iflag &= ~(ICRNL | (T_XON == NULL || *T_XON == NUL ? IXON : 0));
	tnew.c_lflag &= ~(ICANON | ECHO | ISIG | ECHOE | IEXTEN);
	tnew.c_oflag &= ~(ONLCR | XTABS);
	tnew.c_oflag &= ~(ONLCR | TAB3);
	tnew.c_oflag &= ~ONLCR;
	tnew.c_cc[VMIN] = 1;		// return after 1 char
	tnew.c_cc[VTIME] = 0;		// don't wait
    }
    else if (tmode == TMODE_SLEEP)
    {
	tnew.c_lflag &= ~(ICANON | ECHO);
	tnew.c_cc[VMIN] = 1;		// return after 1 char
	tnew.c_cc[VTIME] = 0;		// don't wait
    }

    {
	int	n = 10;

	// A signal may cause tcsetattr() to fail (e.g., SIGCONT).  Retry a
	// few times.
	while (tcsetattr(read_cmd_fd, TCSANOW, &tnew) == -1
						   && errno == EINTR && n > 0)
	    --n;
    }
