aboutsummaryrefslogtreecommitdiff
path: root/sbin/slattach/slattach.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/slattach/slattach.c')
-rw-r--r--sbin/slattach/slattach.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/sbin/slattach/slattach.c b/sbin/slattach/slattach.c
index b8cffd091fe1..66b8e1577075 100644
--- a/sbin/slattach/slattach.c
+++ b/sbin/slattach/slattach.c
@@ -81,6 +81,12 @@
* rid of redundant syslog()'s to minimize console log output. Improved
* logging of improper command line options or number of command
* arguments. Removed spurious newline characters from syslog() calls.
+ *
+ * gjung@gjbsd.franken.de
+ *
+ * sighup_handler changed to set CLOCAL before running redial_cmd.
+ * added flag exiting, so exit_handler is not run twice.
+ *
*/
#ifndef lint
@@ -135,8 +141,11 @@ int speed = DEFAULT_BAUD;
int slflags = 0; /* compression flags */
int unit = -1; /* slip device unit number */
int foreground = 0;
+int exiting = 0; /* allready running exit_handler */
FILE *console;
+struct termios tty;
+
char devname[32];
char hostname[MAXHOSTNAMELEN];
char *redial_cmd = 0; /* command to exec upon shutdown. */
@@ -281,8 +290,6 @@ int main(int argc, char **argv)
void setup_line()
{
- struct termios tty;
-
tty.c_lflag = tty.c_iflag = tty.c_oflag = 0;
tty.c_cflag = CREAD | CS8 | flow_control | modem_control;
tty.c_ispeed = tty.c_ospeed = speed;
@@ -343,6 +350,7 @@ void attach_line()
/* Signal handler for SIGHUP when carrier is dropped. */
void sighup_handler()
{
+ if(exiting) return;
again:
/* reset discipline */
if (ioctl(fd, TIOCSETD, &ttydisc) < 0) {
@@ -353,9 +361,21 @@ again:
if (redial_cmd) {
syslog(LOG_NOTICE,"SIGHUP on %s (sl%d); running %s",
dev,unit,redial_cmd);
+ if (!(modem_control & CLOCAL)) {
+ tty.c_cflag |= CLOCAL;
+ if (tcsetattr(fd, TCSAFLUSH, &tty) < 0) {
+ syslog(LOG_ERR, "tcsetattr(TCSAFLUSH): %m");
+ exit_handler(1);
+ }
+ }
system(redial_cmd);
/* Now check again for carrier (dial command is done): */
if (!(modem_control & CLOCAL)) {
+ tty.c_cflag &= ~CLOCAL;
+ if (tcsetattr(fd, TCSAFLUSH, &tty) < 0) {
+ syslog(LOG_ERR, "tcsetattr(TCSAFLUSH): %m");
+ exit_handler(1);
+ }
ioctl(fd, TIOCMGET, &comstate);
if (!(comstate & TIOCM_CD)) { /* check for carrier */
/* force a redial if no carrier */
@@ -405,18 +425,22 @@ again:
/* Signal handler for SIGINT. We just log and exit. */
void sigint_handler()
{
+ if(exiting) return;
syslog(LOG_NOTICE,"sl%d on %s caught SIGINT, exiting.",unit,dev);
exit_handler(0);
}
/* Signal handler for SIGTERM. We just log and exit. */
void sigterm_handler()
{
+ if(exiting) return;
syslog(LOG_NOTICE,"SIGTERM on %s (sl%d); exiting",dev,unit);
exit_handler(0);
}
/* Run config_cmd if specified before exiting. */
void exit_handler(int ret)
{
+ if(exiting) return;
+ exiting = 1;
/*
* First close the slip line in case exit_cmd wants it (like to hang
* up a modem or something).