11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* $OpenBSD: sshtty.c,v 1.14 2010/01/09 05:04:24 djm Exp $ */
21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Author: Tatu Ylonen <ylo@cs.hut.fi>
41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *                    All rights reserved
61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * As far as I am concerned, the code I have written for this software
81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * can be used freely for any purpose.  Any derived versions of this
91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * software must be clearly marked as such, and if the derived work is
101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * incompatible with the protocol description in the RFC file, it must be
111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * called by a name other than "ssh" or "Secure Shell".
121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*
141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 2001 Markus Friedl.  All rights reserved.
151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 2001 Kevin Steves.  All rights reserved.
161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Redistribution and use in source and binary forms, with or without
181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * modification, are permitted provided that the following conditions
191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * are met:
201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1. Redistributions of source code must retain the above copyright
211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer.
221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 2. Redistributions in binary form must reproduce the above copyright
231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer in the
241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    documentation and/or other materials provided with the distribution.
251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h"
391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/types.h>
411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <stdio.h>
421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <termios.h>
431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <pwd.h>
441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "sshpty.h"
461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstatic struct termios _saved_tio;
481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstatic int _in_raw_mode = 0;
491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstruct termios *
511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodget_saved_tio(void)
521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return _in_raw_mode ? &_saved_tio : NULL;
541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodleave_raw_mode(int quiet)
581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (!_in_raw_mode)
601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return;
611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio) == -1) {
621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if (!quiet)
631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			perror("tcsetattr");
641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	} else
651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		_in_raw_mode = 0;
661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid
691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodenter_raw_mode(int quiet)
701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	struct termios tio;
721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (tcgetattr(fileno(stdin), &tio) == -1) {
741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if (!quiet)
751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			perror("tcgetattr");
761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return;
771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	_saved_tio = tio;
791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	tio.c_iflag |= IGNPAR;
801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	tio.c_iflag &= ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXANY | IXOFF);
811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef IUCLC
821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	tio.c_iflag &= ~IUCLC;
831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	tio.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL);
851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef IEXTEN
861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	tio.c_lflag &= ~IEXTEN;
871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	tio.c_oflag &= ~OPOST;
891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	tio.c_cc[VMIN] = 1;
901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	tio.c_cc[VTIME] = 0;
911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (tcsetattr(fileno(stdin), TCSADRAIN, &tio) == -1) {
921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if (!quiet)
931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			perror("tcsetattr");
941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	} else
951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		_in_raw_mode = 1;
961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
97