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:
Brian Somers 1997-12-30 23:22:31 +00:00
parent 0c5e04a2b1
commit 2a279fed14
3 changed files with 39 additions and 35 deletions

View File

@ -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);

View File

@ -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) {

View File

@ -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);