aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorBrian Somers <brian@FreeBSD.org>1997-12-30 23:22:31 +0000
committerBrian Somers <brian@FreeBSD.org>1997-12-30 23:22:31 +0000
commit2a279fed14e3dfaf763520f24bee051a708cb892 (patch)
treedc0ee19b85a869510ccd8b0e1fddb6b539c3286d /usr.sbin
parent0c5e04a2b185cbe1efaef8da3fbec0caa9b8ee91 (diff)
downloadsrc-2a279fed14e3dfaf763520f24bee051a708cb892.tar.gz
src-2a279fed14e3dfaf763520f24bee051a708cb892.zip
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 :-(
Notes
Notes: svn path=/head/; revision=32129
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/ppp/command.c4
-rw-r--r--usr.sbin/ppp/main.c58
-rw-r--r--usr.sbin/ppp/modem.c12
3 files changed, 39 insertions, 35 deletions
diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c
index 51d73d879375..d195f89c2ee9 100644
--- a/usr.sbin/ppp/command.c
+++ b/usr.sbin/ppp/command.c
@@ -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);
diff --git a/usr.sbin/ppp/main.c b/usr.sbin/ppp/main.c
index 2e303f658392..f782e7f7197d 100644
--- a/usr.sbin/ppp/main.c
+++ b/usr.sbin/ppp/main.c
@@ -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) {
diff --git a/usr.sbin/ppp/modem.c b/usr.sbin/ppp/modem.c
index 8c5e9d72ebcc..b3f03b964c85 100644
--- a/usr.sbin/ppp/modem.c
+++ b/usr.sbin/ppp/modem.c
@@ -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);