1*cb7e3b3cSJoris Giovannangeli /* $OpenBSD: tty.c,v 1.1 2013/09/19 16:12:01 otto Exp $ */ 2*cb7e3b3cSJoris Giovannangeli 3*cb7e3b3cSJoris Giovannangeli /* 4*cb7e3b3cSJoris Giovannangeli * Copyright (c) 2013, Otto Moerbeek <otto@drijf.net> 5*cb7e3b3cSJoris Giovannangeli * 6*cb7e3b3cSJoris Giovannangeli * Permission to use, copy, modify, and distribute this software for any 7*cb7e3b3cSJoris Giovannangeli * purpose with or without fee is hereby granted, provided that the above 8*cb7e3b3cSJoris Giovannangeli * copyright notice and this permission notice appear in all copies. 9*cb7e3b3cSJoris Giovannangeli * 10*cb7e3b3cSJoris Giovannangeli * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11*cb7e3b3cSJoris Giovannangeli * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12*cb7e3b3cSJoris Giovannangeli * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13*cb7e3b3cSJoris Giovannangeli * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14*cb7e3b3cSJoris Giovannangeli * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15*cb7e3b3cSJoris Giovannangeli * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16*cb7e3b3cSJoris Giovannangeli * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17*cb7e3b3cSJoris Giovannangeli */ 18*cb7e3b3cSJoris Giovannangeli 19*cb7e3b3cSJoris Giovannangeli #include <errno.h> 20*cb7e3b3cSJoris Giovannangeli #include <signal.h> 21*cb7e3b3cSJoris Giovannangeli #include <histedit.h> 22*cb7e3b3cSJoris Giovannangeli #include <termios.h> 23*cb7e3b3cSJoris Giovannangeli #include "extern.h" 24*cb7e3b3cSJoris Giovannangeli 25*cb7e3b3cSJoris Giovannangeli struct termios ttysaved, ttyedit; 26*cb7e3b3cSJoris Giovannangeli 27*cb7e3b3cSJoris Giovannangeli static int settty(struct termios *); 28*cb7e3b3cSJoris Giovannangeli 29*cb7e3b3cSJoris Giovannangeli static int 30*cb7e3b3cSJoris Giovannangeli settty(struct termios *t) 31*cb7e3b3cSJoris Giovannangeli { 32*cb7e3b3cSJoris Giovannangeli int ret; 33*cb7e3b3cSJoris Giovannangeli 34*cb7e3b3cSJoris Giovannangeli while ((ret = tcsetattr(0, TCSADRAIN, t) == -1) && errno == EINTR) 35*cb7e3b3cSJoris Giovannangeli continue; 36*cb7e3b3cSJoris Giovannangeli return ret; 37*cb7e3b3cSJoris Giovannangeli } 38*cb7e3b3cSJoris Giovannangeli 39*cb7e3b3cSJoris Giovannangeli int 40*cb7e3b3cSJoris Giovannangeli gettty(struct termios *t) 41*cb7e3b3cSJoris Giovannangeli { 42*cb7e3b3cSJoris Giovannangeli int ret; 43*cb7e3b3cSJoris Giovannangeli 44*cb7e3b3cSJoris Giovannangeli while ((ret = tcgetattr(0, t) == -1) && errno == EINTR) 45*cb7e3b3cSJoris Giovannangeli continue; 46*cb7e3b3cSJoris Giovannangeli return ret; 47*cb7e3b3cSJoris Giovannangeli } 48*cb7e3b3cSJoris Giovannangeli 49*cb7e3b3cSJoris Giovannangeli /* ARGSUSED */ 50*cb7e3b3cSJoris Giovannangeli void 51*cb7e3b3cSJoris Giovannangeli tstpcont(int sig) 52*cb7e3b3cSJoris Giovannangeli { 53*cb7e3b3cSJoris Giovannangeli int save_errno = errno; 54*cb7e3b3cSJoris Giovannangeli 55*cb7e3b3cSJoris Giovannangeli if (sig == SIGTSTP) { 56*cb7e3b3cSJoris Giovannangeli signal(SIGCONT, tstpcont); 57*cb7e3b3cSJoris Giovannangeli gettty(&ttyedit); 58*cb7e3b3cSJoris Giovannangeli settty(&ttysaved); 59*cb7e3b3cSJoris Giovannangeli } else { 60*cb7e3b3cSJoris Giovannangeli signal(SIGTSTP, tstpcont); 61*cb7e3b3cSJoris Giovannangeli settty(&ttyedit); 62*cb7e3b3cSJoris Giovannangeli } 63*cb7e3b3cSJoris Giovannangeli signal(sig, SIG_DFL); 64*cb7e3b3cSJoris Giovannangeli kill(0, sig); 65*cb7e3b3cSJoris Giovannangeli errno = save_errno; 66*cb7e3b3cSJoris Giovannangeli } 67