xref: /freebsd/crypto/openssh/sshtty.c (revision a4bf5fb987611aeb78c422312b63b185e39982d7)
1b15c8340SDag-Erling Smørgrav /* $OpenBSD: sshtty.c,v 1.14 2010/01/09 05:04:24 djm Exp $ */
21e8db6e2SBrian Feldman /*
31e8db6e2SBrian Feldman  * Author: Tatu Ylonen <ylo@cs.hut.fi>
41e8db6e2SBrian Feldman  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
51e8db6e2SBrian Feldman  *                    All rights reserved
61e8db6e2SBrian Feldman  *
71e8db6e2SBrian Feldman  * As far as I am concerned, the code I have written for this software
81e8db6e2SBrian Feldman  * can be used freely for any purpose.  Any derived versions of this
91e8db6e2SBrian Feldman  * software must be clearly marked as such, and if the derived work is
101e8db6e2SBrian Feldman  * incompatible with the protocol description in the RFC file, it must be
111e8db6e2SBrian Feldman  * called by a name other than "ssh" or "Secure Shell".
121e8db6e2SBrian Feldman  */
131e8db6e2SBrian Feldman /*
141e8db6e2SBrian Feldman  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
151e8db6e2SBrian Feldman  * Copyright (c) 2001 Kevin Steves.  All rights reserved.
161e8db6e2SBrian Feldman  *
171e8db6e2SBrian Feldman  * Redistribution and use in source and binary forms, with or without
181e8db6e2SBrian Feldman  * modification, are permitted provided that the following conditions
191e8db6e2SBrian Feldman  * are met:
201e8db6e2SBrian Feldman  * 1. Redistributions of source code must retain the above copyright
211e8db6e2SBrian Feldman  *    notice, this list of conditions and the following disclaimer.
221e8db6e2SBrian Feldman  * 2. Redistributions in binary form must reproduce the above copyright
231e8db6e2SBrian Feldman  *    notice, this list of conditions and the following disclaimer in the
241e8db6e2SBrian Feldman  *    documentation and/or other materials provided with the distribution.
251e8db6e2SBrian Feldman  *
261e8db6e2SBrian Feldman  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
271e8db6e2SBrian Feldman  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
281e8db6e2SBrian Feldman  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
291e8db6e2SBrian Feldman  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
301e8db6e2SBrian Feldman  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
311e8db6e2SBrian Feldman  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
321e8db6e2SBrian Feldman  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
331e8db6e2SBrian Feldman  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
341e8db6e2SBrian Feldman  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
351e8db6e2SBrian Feldman  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
361e8db6e2SBrian Feldman  */
371e8db6e2SBrian Feldman 
381e8db6e2SBrian Feldman #include "includes.h"
39761efaa7SDag-Erling Smørgrav 
40761efaa7SDag-Erling Smørgrav #include <sys/types.h>
41761efaa7SDag-Erling Smørgrav #include <stdio.h>
42761efaa7SDag-Erling Smørgrav #include <termios.h>
43761efaa7SDag-Erling Smørgrav #include <pwd.h>
441e8db6e2SBrian Feldman 
45d74d50a8SDag-Erling Smørgrav #include "sshpty.h"
461e8db6e2SBrian Feldman 
471e8db6e2SBrian Feldman static struct termios _saved_tio;
481e8db6e2SBrian Feldman static int _in_raw_mode = 0;
491e8db6e2SBrian Feldman 
50d4af9e69SDag-Erling Smørgrav struct termios *
get_saved_tio(void)511e8db6e2SBrian Feldman get_saved_tio(void)
521e8db6e2SBrian Feldman {
53d4af9e69SDag-Erling Smørgrav 	return _in_raw_mode ? &_saved_tio : NULL;
541e8db6e2SBrian Feldman }
551e8db6e2SBrian Feldman 
561e8db6e2SBrian Feldman void
leave_raw_mode(int quiet)57b15c8340SDag-Erling Smørgrav leave_raw_mode(int quiet)
581e8db6e2SBrian Feldman {
591e8db6e2SBrian Feldman 	if (!_in_raw_mode)
601e8db6e2SBrian Feldman 		return;
61b15c8340SDag-Erling Smørgrav 	if (tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio) == -1) {
62b15c8340SDag-Erling Smørgrav 		if (!quiet)
631e8db6e2SBrian Feldman 			perror("tcsetattr");
64b15c8340SDag-Erling Smørgrav 	} else
651e8db6e2SBrian Feldman 		_in_raw_mode = 0;
661e8db6e2SBrian Feldman }
671e8db6e2SBrian Feldman 
681e8db6e2SBrian Feldman void
enter_raw_mode(int quiet)69b15c8340SDag-Erling Smørgrav enter_raw_mode(int quiet)
701e8db6e2SBrian Feldman {
711e8db6e2SBrian Feldman 	struct termios tio;
721e8db6e2SBrian Feldman 
731e8db6e2SBrian Feldman 	if (tcgetattr(fileno(stdin), &tio) == -1) {
74b15c8340SDag-Erling Smørgrav 		if (!quiet)
751e8db6e2SBrian Feldman 			perror("tcgetattr");
761e8db6e2SBrian Feldman 		return;
771e8db6e2SBrian Feldman 	}
781e8db6e2SBrian Feldman 	_saved_tio = tio;
791e8db6e2SBrian Feldman 	tio.c_iflag |= IGNPAR;
801e8db6e2SBrian Feldman 	tio.c_iflag &= ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXANY | IXOFF);
81d95e11bfSDag-Erling Smørgrav #ifdef IUCLC
82d95e11bfSDag-Erling Smørgrav 	tio.c_iflag &= ~IUCLC;
83d95e11bfSDag-Erling Smørgrav #endif
841e8db6e2SBrian Feldman 	tio.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL);
851e8db6e2SBrian Feldman #ifdef IEXTEN
861e8db6e2SBrian Feldman 	tio.c_lflag &= ~IEXTEN;
871e8db6e2SBrian Feldman #endif
881e8db6e2SBrian Feldman 	tio.c_oflag &= ~OPOST;
891e8db6e2SBrian Feldman 	tio.c_cc[VMIN] = 1;
901e8db6e2SBrian Feldman 	tio.c_cc[VTIME] = 0;
91b15c8340SDag-Erling Smørgrav 	if (tcsetattr(fileno(stdin), TCSADRAIN, &tio) == -1) {
92b15c8340SDag-Erling Smørgrav 		if (!quiet)
931e8db6e2SBrian Feldman 			perror("tcsetattr");
94b15c8340SDag-Erling Smørgrav 	} else
951e8db6e2SBrian Feldman 		_in_raw_mode = 1;
961e8db6e2SBrian Feldman }
97