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
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* 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>
|
#include <sys/param.h>
|
||||||
@ -1355,6 +1355,8 @@ SetVariable(struct cmdargs const *arg)
|
|||||||
VarLoginScript[sizeof VarLoginScript - 1] = '\0';
|
VarLoginScript[sizeof VarLoginScript - 1] = '\0';
|
||||||
break;
|
break;
|
||||||
case VAR_DEVICE:
|
case VAR_DEVICE:
|
||||||
|
if (mode & MODE_INTER)
|
||||||
|
HangupModem(0);
|
||||||
if (modem != -1)
|
if (modem != -1)
|
||||||
LogPrintf(LogWARN, "Cannot change device to \"%s\" when \"%s\" is open\n",
|
LogPrintf(LogWARN, "Cannot change device to \"%s\" when \"%s\" is open\n",
|
||||||
argp, VarDevice);
|
argp, VarDevice);
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* 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:
|
* TODO:
|
||||||
* o Add commands for traffic summary, version display, etc.
|
* o Add commands for traffic summary, version display, etc.
|
||||||
@ -105,10 +105,10 @@ TtyInit(int DontWantInt)
|
|||||||
struct termios newtio;
|
struct termios newtio;
|
||||||
int stat;
|
int stat;
|
||||||
|
|
||||||
stat = fcntl(0, F_GETFL, 0);
|
stat = fcntl(netfd, F_GETFL, 0);
|
||||||
if (stat > 0) {
|
if (stat > 0) {
|
||||||
stat |= O_NONBLOCK;
|
stat |= O_NONBLOCK;
|
||||||
(void) fcntl(0, F_SETFL, stat);
|
(void) fcntl(netfd, F_SETFL, stat);
|
||||||
}
|
}
|
||||||
newtio = oldtio;
|
newtio = oldtio;
|
||||||
newtio.c_lflag &= ~(ECHO | ISIG | ICANON);
|
newtio.c_lflag &= ~(ECHO | ISIG | ICANON);
|
||||||
@ -120,7 +120,7 @@ TtyInit(int DontWantInt)
|
|||||||
newtio.c_cc[VMIN] = 1;
|
newtio.c_cc[VMIN] = 1;
|
||||||
newtio.c_cc[VTIME] = 0;
|
newtio.c_cc[VTIME] = 0;
|
||||||
newtio.c_cflag |= CS8;
|
newtio.c_cflag |= CS8;
|
||||||
tcsetattr(0, TCSADRAIN, &newtio);
|
tcsetattr(netfd, TCSANOW, &newtio);
|
||||||
comtio = newtio;
|
comtio = newtio;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,15 +135,15 @@ TtyCommandMode(int prompt)
|
|||||||
|
|
||||||
if (!(mode & MODE_INTER))
|
if (!(mode & MODE_INTER))
|
||||||
return;
|
return;
|
||||||
tcgetattr(0, &newtio);
|
tcgetattr(netfd, &newtio);
|
||||||
newtio.c_lflag |= (ECHO | ISIG | ICANON);
|
newtio.c_lflag |= (ECHO | ISIG | ICANON);
|
||||||
newtio.c_iflag = oldtio.c_iflag;
|
newtio.c_iflag = oldtio.c_iflag;
|
||||||
newtio.c_oflag |= OPOST;
|
newtio.c_oflag |= OPOST;
|
||||||
tcsetattr(0, TCSADRAIN, &newtio);
|
tcsetattr(netfd, TCSADRAIN, &newtio);
|
||||||
stat = fcntl(0, F_GETFL, 0);
|
stat = fcntl(netfd, F_GETFL, 0);
|
||||||
if (stat > 0) {
|
if (stat > 0) {
|
||||||
stat |= O_NONBLOCK;
|
stat |= O_NONBLOCK;
|
||||||
(void) fcntl(0, F_SETFL, stat);
|
(void) fcntl(netfd, F_SETFL, stat);
|
||||||
}
|
}
|
||||||
TermMode = 0;
|
TermMode = 0;
|
||||||
if (prompt)
|
if (prompt)
|
||||||
@ -158,11 +158,11 @@ TtyTermMode()
|
|||||||
{
|
{
|
||||||
int stat;
|
int stat;
|
||||||
|
|
||||||
tcsetattr(0, TCSADRAIN, &comtio);
|
tcsetattr(netfd, TCSADRAIN, &comtio);
|
||||||
stat = fcntl(0, F_GETFL, 0);
|
stat = fcntl(netfd, F_GETFL, 0);
|
||||||
if (stat > 0) {
|
if (stat > 0) {
|
||||||
stat &= ~O_NONBLOCK;
|
stat &= ~O_NONBLOCK;
|
||||||
(void) fcntl(0, F_SETFL, stat);
|
(void) fcntl(netfd, F_SETFL, stat);
|
||||||
}
|
}
|
||||||
TermMode = 1;
|
TermMode = 1;
|
||||||
}
|
}
|
||||||
@ -172,12 +172,12 @@ TtyOldMode()
|
|||||||
{
|
{
|
||||||
int stat;
|
int stat;
|
||||||
|
|
||||||
stat = fcntl(0, F_GETFL, 0);
|
stat = fcntl(netfd, F_GETFL, 0);
|
||||||
if (stat > 0) {
|
if (stat > 0) {
|
||||||
stat &= ~O_NONBLOCK;
|
stat &= ~O_NONBLOCK;
|
||||||
(void) fcntl(0, F_SETFL, stat);
|
(void) fcntl(netfd, F_SETFL, stat);
|
||||||
}
|
}
|
||||||
tcsetattr(0, TCSANOW, &oldtio);
|
tcsetattr(netfd, TCSADRAIN, &oldtio);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -237,7 +237,7 @@ TerminalCont(int signo)
|
|||||||
{
|
{
|
||||||
pending_signal(SIGCONT, SIG_DFL);
|
pending_signal(SIGCONT, SIG_DFL);
|
||||||
pending_signal(SIGTSTP, TerminalStop);
|
pending_signal(SIGTSTP, TerminalStop);
|
||||||
TtyCommandMode(getpgrp() == tcgetpgrp(0));
|
TtyCommandMode(getpgrp() == tcgetpgrp(netfd));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -378,6 +378,8 @@ main(int argc, char **argv)
|
|||||||
name = strrchr(argv[0], '/');
|
name = strrchr(argv[0], '/');
|
||||||
LogOpen(name ? name + 1 : argv[0]);
|
LogOpen(name ? name + 1 : argv[0]);
|
||||||
|
|
||||||
|
tcgetattr(STDIN_FILENO, &oldtio); /* Save original tty mode */
|
||||||
|
|
||||||
argc--;
|
argc--;
|
||||||
argv++;
|
argv++;
|
||||||
label = ProcessArgs(argc, argv);
|
label = ProcessArgs(argc, argv);
|
||||||
@ -405,7 +407,6 @@ main(int argc, char **argv)
|
|||||||
if (mode & MODE_DIRECT) {
|
if (mode & MODE_DIRECT) {
|
||||||
const char *l;
|
const char *l;
|
||||||
l = label ? label : "default";
|
l = label ? label : "default";
|
||||||
VarTerm = 0;
|
|
||||||
LogPrintf(LogWARN, "Label %s rejected -direct connection\n", l);
|
LogPrintf(LogWARN, "Label %s rejected -direct connection\n", l);
|
||||||
}
|
}
|
||||||
LogClose();
|
LogClose();
|
||||||
@ -427,10 +428,9 @@ main(int argc, char **argv)
|
|||||||
LogPrintf(LogWARN, "OpenTunnel: %s\n", strerror(errno));
|
LogPrintf(LogWARN, "OpenTunnel: %s\n", strerror(errno));
|
||||||
return EX_START;
|
return EX_START;
|
||||||
}
|
}
|
||||||
if (mode & MODE_INTER) {
|
if (mode & MODE_INTER)
|
||||||
fprintf(VarTerm, "Interactive mode\n");
|
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 (label == NULL) {
|
||||||
if (VarTerm)
|
if (VarTerm)
|
||||||
fprintf(VarTerm, "Destination system must be specified in"
|
fprintf(VarTerm, "Destination system must be specified in"
|
||||||
@ -438,8 +438,6 @@ main(int argc, char **argv)
|
|||||||
return EX_START;
|
return EX_START;
|
||||||
}
|
}
|
||||||
|
|
||||||
tcgetattr(0, &oldtio); /* Save original tty mode */
|
|
||||||
|
|
||||||
pending_signal(SIGHUP, CloseSession);
|
pending_signal(SIGHUP, CloseSession);
|
||||||
pending_signal(SIGTERM, CloseSession);
|
pending_signal(SIGTERM, CloseSession);
|
||||||
pending_signal(SIGINT, CloseConnection);
|
pending_signal(SIGINT, CloseConnection);
|
||||||
@ -531,19 +529,23 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
VarTerm = 0; /* We know it's currently stdout */
|
VarTerm = 0; /* We know it's currently stdout */
|
||||||
close(1);
|
close(STDOUT_FILENO);
|
||||||
close(2);
|
close(STDERR_FILENO);
|
||||||
|
|
||||||
if (mode & MODE_DIRECT)
|
if (mode & MODE_DIRECT)
|
||||||
/* fd 0 gets used by OpenModem in DIRECT mode */
|
/* STDIN_FILENO gets used by OpenModem in DIRECT mode */
|
||||||
TtyInit(1);
|
TtyInit(1);
|
||||||
else if (mode & MODE_DAEMON) {
|
else if (mode & MODE_DAEMON) {
|
||||||
setsid();
|
setsid();
|
||||||
close(0);
|
close(STDIN_FILENO);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
close(0);
|
close(STDIN_FILENO);
|
||||||
close(2);
|
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);
|
TtyInit(0);
|
||||||
TtyCommandMode(1);
|
TtyCommandMode(1);
|
||||||
}
|
}
|
||||||
@ -639,7 +641,7 @@ ReadTty(void)
|
|||||||
/*
|
/*
|
||||||
* We are in terminal mode, decode special sequences
|
* 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);
|
LogPrintf(LogDEBUG, "Got %d bytes (reading from the terminal)\n", n);
|
||||||
|
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* 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:
|
* TODO:
|
||||||
*/
|
*/
|
||||||
@ -444,17 +444,17 @@ OpenModem()
|
|||||||
struct cmdargs arg;
|
struct cmdargs arg;
|
||||||
arg.cmd = NULL;
|
arg.cmd = NULL;
|
||||||
arg.data = (const void *)VAR_DEVICE;
|
arg.data = (const void *)VAR_DEVICE;
|
||||||
if (isatty(0)) {
|
if (isatty(STDIN_FILENO)) {
|
||||||
LogPrintf(LogDEBUG, "OpenModem(direct): Modem is a tty\n");
|
LogPrintf(LogDEBUG, "OpenModem(direct): Modem is a tty\n");
|
||||||
cp = ttyname(0);
|
cp = ttyname(STDIN_FILENO);
|
||||||
arg.argc = 1;
|
arg.argc = 1;
|
||||||
arg.argv = (char const *const *)&cp;
|
arg.argv = (char const *const *)&cp;
|
||||||
SetVariable(&arg);
|
SetVariable(&arg);
|
||||||
if (LockModem() == -1) {
|
if (LockModem() == -1) {
|
||||||
close(0);
|
close(STDIN_FILENO);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
modem = 0;
|
modem = STDIN_FILENO;
|
||||||
HaveModem();
|
HaveModem();
|
||||||
} else {
|
} else {
|
||||||
LogPrintf(LogDEBUG, "OpenModem(direct): Modem is not a tty\n");
|
LogPrintf(LogDEBUG, "OpenModem(direct): Modem is not a tty\n");
|
||||||
@ -463,7 +463,7 @@ OpenModem()
|
|||||||
SetVariable(&arg);
|
SetVariable(&arg);
|
||||||
/* We don't call ModemTimeout() with this type of connection */
|
/* We don't call ModemTimeout() with this type of connection */
|
||||||
HaveModem();
|
HaveModem();
|
||||||
return modem = 0;
|
return modem = STDIN_FILENO;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
strncpy(tmpDeviceList, VarDeviceList, sizeof tmpDeviceList - 1);
|
strncpy(tmpDeviceList, VarDeviceList, sizeof tmpDeviceList - 1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user