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