Allow "set device" to close the open modem if we're in
interactive mode. Use `netfd' in fcntl() and tc[gs]etattr() calls rather than the hard coded descriptor 0. Use _FILENO constants from unistd.h This un-breaks things after my recent `close(0)' in interactive mode. Close STDIN_FILENO, and open _PATH_TTY O_RDONLY as `netfd'. This has the effect of allowing `show route' to output more than about a page of data (on FreeBSD, not OpenBSD....). I have no idea why, except that it was a direct consequence of the tcsetattr() in TtyCommandMode(). My previous fix (closing descriptor 0) `fixed' this because all calls to tcsetattr() failed :-(
This commit is contained in:
parent
0c5e04a2b1
commit
2a279fed14
@ -17,7 +17,7 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: command.c,v 1.122 1997/12/30 02:45:41 brian Exp $
|
||||
* $Id: command.c,v 1.123 1997/12/30 20:02:32 brian Exp $
|
||||
*
|
||||
*/
|
||||
#include <sys/param.h>
|
||||
@ -1355,6 +1355,8 @@ SetVariable(struct cmdargs const *arg)
|
||||
VarLoginScript[sizeof VarLoginScript - 1] = '\0';
|
||||
break;
|
||||
case VAR_DEVICE:
|
||||
if (mode & MODE_INTER)
|
||||
HangupModem(0);
|
||||
if (modem != -1)
|
||||
LogPrintf(LogWARN, "Cannot change device to \"%s\" when \"%s\" is open\n",
|
||||
argp, VarDevice);
|
||||
|
@ -17,7 +17,7 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: main.c,v 1.113 1997/12/28 02:46:26 brian Exp $
|
||||
* $Id: main.c,v 1.114 1997/12/28 21:55:04 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
* o Add commands for traffic summary, version display, etc.
|
||||
@ -105,10 +105,10 @@ TtyInit(int DontWantInt)
|
||||
struct termios newtio;
|
||||
int stat;
|
||||
|
||||
stat = fcntl(0, F_GETFL, 0);
|
||||
stat = fcntl(netfd, F_GETFL, 0);
|
||||
if (stat > 0) {
|
||||
stat |= O_NONBLOCK;
|
||||
(void) fcntl(0, F_SETFL, stat);
|
||||
(void) fcntl(netfd, F_SETFL, stat);
|
||||
}
|
||||
newtio = oldtio;
|
||||
newtio.c_lflag &= ~(ECHO | ISIG | ICANON);
|
||||
@ -120,7 +120,7 @@ TtyInit(int DontWantInt)
|
||||
newtio.c_cc[VMIN] = 1;
|
||||
newtio.c_cc[VTIME] = 0;
|
||||
newtio.c_cflag |= CS8;
|
||||
tcsetattr(0, TCSADRAIN, &newtio);
|
||||
tcsetattr(netfd, TCSANOW, &newtio);
|
||||
comtio = newtio;
|
||||
}
|
||||
|
||||
@ -135,15 +135,15 @@ TtyCommandMode(int prompt)
|
||||
|
||||
if (!(mode & MODE_INTER))
|
||||
return;
|
||||
tcgetattr(0, &newtio);
|
||||
tcgetattr(netfd, &newtio);
|
||||
newtio.c_lflag |= (ECHO | ISIG | ICANON);
|
||||
newtio.c_iflag = oldtio.c_iflag;
|
||||
newtio.c_oflag |= OPOST;
|
||||
tcsetattr(0, TCSADRAIN, &newtio);
|
||||
stat = fcntl(0, F_GETFL, 0);
|
||||
tcsetattr(netfd, TCSADRAIN, &newtio);
|
||||
stat = fcntl(netfd, F_GETFL, 0);
|
||||
if (stat > 0) {
|
||||
stat |= O_NONBLOCK;
|
||||
(void) fcntl(0, F_SETFL, stat);
|
||||
(void) fcntl(netfd, F_SETFL, stat);
|
||||
}
|
||||
TermMode = 0;
|
||||
if (prompt)
|
||||
@ -158,11 +158,11 @@ TtyTermMode()
|
||||
{
|
||||
int stat;
|
||||
|
||||
tcsetattr(0, TCSADRAIN, &comtio);
|
||||
stat = fcntl(0, F_GETFL, 0);
|
||||
tcsetattr(netfd, TCSADRAIN, &comtio);
|
||||
stat = fcntl(netfd, F_GETFL, 0);
|
||||
if (stat > 0) {
|
||||
stat &= ~O_NONBLOCK;
|
||||
(void) fcntl(0, F_SETFL, stat);
|
||||
(void) fcntl(netfd, F_SETFL, stat);
|
||||
}
|
||||
TermMode = 1;
|
||||
}
|
||||
@ -172,12 +172,12 @@ TtyOldMode()
|
||||
{
|
||||
int stat;
|
||||
|
||||
stat = fcntl(0, F_GETFL, 0);
|
||||
stat = fcntl(netfd, F_GETFL, 0);
|
||||
if (stat > 0) {
|
||||
stat &= ~O_NONBLOCK;
|
||||
(void) fcntl(0, F_SETFL, stat);
|
||||
(void) fcntl(netfd, F_SETFL, stat);
|
||||
}
|
||||
tcsetattr(0, TCSANOW, &oldtio);
|
||||
tcsetattr(netfd, TCSADRAIN, &oldtio);
|
||||
}
|
||||
|
||||
void
|
||||
@ -237,7 +237,7 @@ TerminalCont(int signo)
|
||||
{
|
||||
pending_signal(SIGCONT, SIG_DFL);
|
||||
pending_signal(SIGTSTP, TerminalStop);
|
||||
TtyCommandMode(getpgrp() == tcgetpgrp(0));
|
||||
TtyCommandMode(getpgrp() == tcgetpgrp(netfd));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -378,6 +378,8 @@ main(int argc, char **argv)
|
||||
name = strrchr(argv[0], '/');
|
||||
LogOpen(name ? name + 1 : argv[0]);
|
||||
|
||||
tcgetattr(STDIN_FILENO, &oldtio); /* Save original tty mode */
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
label = ProcessArgs(argc, argv);
|
||||
@ -405,7 +407,6 @@ main(int argc, char **argv)
|
||||
if (mode & MODE_DIRECT) {
|
||||
const char *l;
|
||||
l = label ? label : "default";
|
||||
VarTerm = 0;
|
||||
LogPrintf(LogWARN, "Label %s rejected -direct connection\n", l);
|
||||
}
|
||||
LogClose();
|
||||
@ -427,10 +428,9 @@ main(int argc, char **argv)
|
||||
LogPrintf(LogWARN, "OpenTunnel: %s\n", strerror(errno));
|
||||
return EX_START;
|
||||
}
|
||||
if (mode & MODE_INTER) {
|
||||
if (mode & MODE_INTER)
|
||||
fprintf(VarTerm, "Interactive mode\n");
|
||||
netfd = STDOUT_FILENO;
|
||||
} else if ((mode & MODE_OUTGOING_DAEMON) && !(mode & MODE_DEDICATED))
|
||||
else if ((mode & MODE_OUTGOING_DAEMON) && !(mode & MODE_DEDICATED))
|
||||
if (label == NULL) {
|
||||
if (VarTerm)
|
||||
fprintf(VarTerm, "Destination system must be specified in"
|
||||
@ -438,8 +438,6 @@ main(int argc, char **argv)
|
||||
return EX_START;
|
||||
}
|
||||
|
||||
tcgetattr(0, &oldtio); /* Save original tty mode */
|
||||
|
||||
pending_signal(SIGHUP, CloseSession);
|
||||
pending_signal(SIGTERM, CloseSession);
|
||||
pending_signal(SIGINT, CloseConnection);
|
||||
@ -531,19 +529,23 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
VarTerm = 0; /* We know it's currently stdout */
|
||||
close(1);
|
||||
close(2);
|
||||
close(STDOUT_FILENO);
|
||||
close(STDERR_FILENO);
|
||||
|
||||
if (mode & MODE_DIRECT)
|
||||
/* fd 0 gets used by OpenModem in DIRECT mode */
|
||||
/* STDIN_FILENO gets used by OpenModem in DIRECT mode */
|
||||
TtyInit(1);
|
||||
else if (mode & MODE_DAEMON) {
|
||||
setsid();
|
||||
close(0);
|
||||
close(STDIN_FILENO);
|
||||
}
|
||||
} else {
|
||||
close(0);
|
||||
close(2);
|
||||
close(STDIN_FILENO);
|
||||
if ((netfd = open(_PATH_TTY, O_RDONLY)) < 0) {
|
||||
fprintf(stderr, "Cannot open %s for intput !\n", _PATH_TTY);
|
||||
return 2;
|
||||
}
|
||||
close(STDERR_FILENO);
|
||||
TtyInit(0);
|
||||
TtyCommandMode(1);
|
||||
}
|
||||
@ -639,7 +641,7 @@ ReadTty(void)
|
||||
/*
|
||||
* We are in terminal mode, decode special sequences
|
||||
*/
|
||||
n = read(fileno(VarTerm), &ch, 1);
|
||||
n = read(netfd, &ch, 1);
|
||||
LogPrintf(LogDEBUG, "Got %d bytes (reading from the terminal)\n", n);
|
||||
|
||||
if (n > 0) {
|
||||
|
@ -17,7 +17,7 @@
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Id: modem.c,v 1.71 1997/12/24 09:29:08 brian Exp $
|
||||
* $Id: modem.c,v 1.72 1997/12/28 02:56:43 brian Exp $
|
||||
*
|
||||
* TODO:
|
||||
*/
|
||||
@ -444,17 +444,17 @@ OpenModem()
|
||||
struct cmdargs arg;
|
||||
arg.cmd = NULL;
|
||||
arg.data = (const void *)VAR_DEVICE;
|
||||
if (isatty(0)) {
|
||||
if (isatty(STDIN_FILENO)) {
|
||||
LogPrintf(LogDEBUG, "OpenModem(direct): Modem is a tty\n");
|
||||
cp = ttyname(0);
|
||||
cp = ttyname(STDIN_FILENO);
|
||||
arg.argc = 1;
|
||||
arg.argv = (char const *const *)&cp;
|
||||
SetVariable(&arg);
|
||||
if (LockModem() == -1) {
|
||||
close(0);
|
||||
close(STDIN_FILENO);
|
||||
return -1;
|
||||
}
|
||||
modem = 0;
|
||||
modem = STDIN_FILENO;
|
||||
HaveModem();
|
||||
} else {
|
||||
LogPrintf(LogDEBUG, "OpenModem(direct): Modem is not a tty\n");
|
||||
@ -463,7 +463,7 @@ OpenModem()
|
||||
SetVariable(&arg);
|
||||
/* We don't call ModemTimeout() with this type of connection */
|
||||
HaveModem();
|
||||
return modem = 0;
|
||||
return modem = STDIN_FILENO;
|
||||
}
|
||||
} else {
|
||||
strncpy(tmpDeviceList, VarDeviceList, sizeof tmpDeviceList - 1);
|
||||
|
Loading…
x
Reference in New Issue
Block a user