diff options
author | Brian Somers <brian@FreeBSD.org> | 1997-12-30 23:22:31 +0000 |
---|---|---|
committer | Brian Somers <brian@FreeBSD.org> | 1997-12-30 23:22:31 +0000 |
commit | 2a279fed14e3dfaf763520f24bee051a708cb892 (patch) | |
tree | dc0ee19b85a869510ccd8b0e1fddb6b539c3286d /usr.sbin | |
parent | 0c5e04a2b185cbe1efaef8da3fbec0caa9b8ee91 (diff) | |
download | src-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.c | 4 | ||||
-rw-r--r-- | usr.sbin/ppp/main.c | 58 | ||||
-rw-r--r-- | usr.sbin/ppp/modem.c | 12 |
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); |