version 1.1, 1995/10/18 08:45:39 |
version 1.2, 1996/06/11 12:53:52 |
|
|
|
/* $OpenBSD$ */ |
|
/* $NetBSD: tty.c,v 1.5 1996/06/08 19:48:43 christos Exp $ */ |
|
|
/* |
/* |
* Copyright (c) 1980, 1993 |
* Copyright (c) 1980, 1993 |
* The Regents of the University of California. All rights reserved. |
* The Regents of the University of California. All rights reserved. |
|
|
*/ |
*/ |
|
|
#ifndef lint |
#ifndef lint |
static char sccsid[] = "from: @(#)tty.c 8.1 (Berkeley) 6/6/93"; |
#if 0 |
static char rcsid[] = "$Id$"; |
static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/6/93"; |
|
#else |
|
static char rcsid[] = "$OpenBSD$"; |
|
#endif |
#endif /* not lint */ |
#endif /* not lint */ |
|
|
/* |
/* |
|
|
|
|
#include "rcv.h" |
#include "rcv.h" |
#include "extern.h" |
#include "extern.h" |
|
#include <sys/ioctl.h> |
|
|
static cc_t c_erase; /* Current erase char */ |
static cc_t c_erase; /* Current erase char */ |
static cc_t c_kill; /* Current kill char */ |
static cc_t c_kill; /* Current kill char */ |
|
|
sig_t savettou; |
sig_t savettou; |
sig_t savettin; |
sig_t savettin; |
int errs; |
int errs; |
void ttyint(); |
#ifdef __GNUC__ |
|
/* Avoid longjmp clobbering */ |
|
(void) &saveint; |
|
#endif |
|
|
savetstp = signal(SIGTSTP, SIG_DFL); |
savetstp = signal(SIGTSTP, SIG_DFL); |
savettou = signal(SIGTTOU, SIG_DFL); |
savettou = signal(SIGTTOU, SIG_DFL); |
|
|
{ |
{ |
char ch, canonb[BUFSIZ]; |
char ch, canonb[BUFSIZ]; |
int c; |
int c; |
register char *cp, *cp2; |
char *cp, *cp2; |
void ttystop(); |
#if __GNUC__ |
|
/* Avoid longjmp clobbering */ |
|
(void) &c; |
|
(void) &cp2; |
|
#endif |
|
|
fputs(pr, stdout); |
fputs(pr, stdout); |
fflush(stdout); |
fflush(stdout); |
|
|
fflush(stdout); |
fflush(stdout); |
#else |
#else |
cp = src == NOSTR ? "" : src; |
cp = src == NOSTR ? "" : src; |
while (c = *cp++) { |
while ((c = *cp++) != '\0') { |
if ((c_erase != _POSIX_VDISABLE && c == c_erase) || |
if ((c_erase != _POSIX_VDISABLE && c == c_erase) || |
(c_kill != _POSIX_VDISABLE && c == c_kill)) { |
(c_kill != _POSIX_VDISABLE && c == c_kill)) { |
ch = '\\'; |
ch = '\\'; |
|
|
int s; |
int s; |
{ |
{ |
sig_t old_action = signal(s, SIG_DFL); |
sig_t old_action = signal(s, SIG_DFL); |
|
sigset_t nset; |
|
|
sigsetmask(sigblock(0) & ~sigmask(s)); |
sigemptyset(&nset); |
|
sigaddset(&nset, s); |
|
sigprocmask(SIG_BLOCK, &nset, NULL); |
kill(0, s); |
kill(0, s); |
sigblock(sigmask(s)); |
sigprocmask(SIG_UNBLOCK, &nset, NULL); |
signal(s, old_action); |
signal(s, old_action); |
longjmp(rewrite, 1); |
longjmp(rewrite, 1); |
} |
} |