New options:

-K #: set SLIP keepalive timeout
-O #: set SLIP outfil timeout
-U #: set SLIP unit number
sighup handler now sets tty disc for non-redial case too.
Implement SIGURG handling (from keepalive).
POSIXing speed settings.
This commit is contained in:
Andrey A. Chernov 1995-09-18 13:33:30 +00:00
parent 68d2b4d6a9
commit 2da5bee280
2 changed files with 113 additions and 30 deletions

View File

@ -31,7 +31,7 @@
.\"
.\" @(#)slattach.8 6.4 (Berkeley) 3/16/91
.\"
.\" $Header: /home/ncvs/src/sbin/slattach/slattach.8,v 1.3 1994/08/23 08:28:31 rich Exp $
.\" $Header: /home/ncvs/src/sbin/slattach/slattach.8,v 1.4 1995/03/12 15:04:16 joerg Exp $
.\"
.Dd April 4, 1993
.Dt SLATTACH 8
@ -41,17 +41,20 @@
.Nd attach serial lines as network interfaces
.Sh SYNOPSIS
.Nm Slattach
.Op \-a
.Op \-c
.Op \-e exit-command
.Op \-f
.Op \-h
.Op \-l
.Op \-n
.Op \-r redial-command
.Op \-s baudrate
.Op \-u unit-command
.Op \-z
.Op Fl a
.Op Fl c
.Op Fl e Ar exit-command
.Op Fl f
.Op Fl h
.Op Fl l
.Op Fl n
.Op Fl r Ar redial-command
.Op Fl s Ar baudrate
.Op Fl u Ar unit-command
.Op Fl z
.Op Fl K Ar keepalive
.Op Fl O Ar outfill
.Op Fl U Ar unit
.Ar ttyname
.Sh DESCRIPTION
.Nm Slattach
@ -60,35 +63,35 @@ and to define the network source and destination addresses.
The following operands are supported by
.Nm slattach :
.Bl -tag -width Ar
.It Ar \-a
.It Fl a
Autoenable the VJ header compression option, if the other end of the link
is capable of VJ header compression then it will be used otherwise normal
headers will be used.
.It Ar \-c
.It Fl c
Enables the VJ header compression option. Note that both ends of the link
must be able to use VJ header compression for this to work.
.It Ar \-e exit-command
.It Fl e Ar exit-command
Specifies a command to be invoked within a shell (sh -c exit-command)
before slattach exits.
.It Ar \-f
.It Fl f
Disables the invocation of daemon() to run slattach in the background.
.It Ar \-h
.It Fl h
Turn on cts/rts style flow control on the slip port, by default no flow
control is done.
.It Ar \-l
.It Fl l
disable modem control (CLOCAL) and ignore carrier detect on the slip
port. By default the redial-command is invoked upon carrier drop and
slattach aborts if no redial-command is specified.
.It Ar \-n
.It Fl n
Throw away ICMP packets. The slip interface will ignore ICMP packets
to prevent slow lines being saturated by ICMP responses.
.It Ar \-r redial-command
.It Fl r Ar redial-command
Specifies a command to be invoked within a shell (sh -c
redial-command) whenever carrier is lost on the line.
.It Ar \-s baudrate
.It Fl s Ar baudrate
Specifies the speed of the connection. If not specified, the
default of 9600 is used.
.It Ar \-u unit-command
.It Fl u Ar unit-command
When the line is switched to slip discipline, run
.Ql sh \-c unit-command <last> <current>
where <last> and <current> are the slip unit numbers when the line was
@ -98,9 +101,23 @@ using more than one slip line. Slattach will abort if the unit number
changes and
.Ql \-u unit-command
was not specified.
.It Ar \-z
.It Fl z
forces redial
redial-cmd upon startup irrespective of carrier.
.It Fl K Ar keepalive
Set SLIP "keep alive" timeout in seconds. If FRAME_END not received in this
timeout, reconnect occurse. Active "out fill" timeout expected from other
side.
Default value is no timeout.
.It Fl O Ar outfill
Set SLIP "out fill" timeout in seconds. It cause at least one FRAME_END
will be sended during this timeout.
Needed for "keep alive" timeout on other side.
Default value is no timeout.
.It Fl U Ar unit
Set SLIP unit number directly. Use with caution, no check for two
interfaces with same number made.
Default is dynamic assignment.
.It Ar ttyname
Specifies the name of the tty device.
.Ar Ttyname
@ -179,6 +196,8 @@ This file contains the numerical process ID of the
process and can be examined by scripts in oder to send a signal to
.Nm slattch .
.Sh SEE ALSO
.Xr startslip 1 ,
.Xr sliplogin 8 ,
.Xr netstat 1 ,
.Xr netintro 4 ,
.Xr ifconfig 8 ,

View File

@ -68,6 +68,7 @@ static char rcsid[] = "$Id";
void sighup_handler(); /* SIGHUP handler */
void sigint_handler(); /* SIGINT handler */
void sigterm_handler(); /* SIGTERM handler */
void sigurg_handler(); /* SIGURG handler */
void exit_handler(int ret); /* run exit_cmd iff specified upon exit. */
void setup_line(int cflag); /* configure terminal settings */
void slip_discipline(); /* switch to slip line discipline */
@ -80,10 +81,13 @@ int flow_control = 0; /* non-zero to enable hardware flow control. */
int modem_control = HUPCL; /* !CLOCAL+HUPCL iff we watch carrier. */
int comstate; /* TIOCMGET current state of serial driver */
int redial_on_startup = 0; /* iff non-zero execute redial_cmd on startup */
int speed = DEFAULT_BAUD; /* baud rate of tty */
speed_t speed = DEFAULT_BAUD; /* baud rate of tty */
int slflags = 0; /* compression flags */
int unit = -1; /* slip device unit number */
int foreground = 0; /* act as demon if zero, else don't fork. */
int keepal = 0; /* keepalive timeout */
int outfill = 0; /* outfill timeout */
int sl_unit = -1; /* unit number */
int exiting = 0; /* allready running exit_handler */
struct termios tty; /* tty configuration/state */
@ -95,7 +99,8 @@ char *config_cmd = 0; /* command to exec if slip unit changes. */
char *exit_cmd = 0; /* command to exec before exiting. */
static char usage_str[] = "\
usage: %s [-acfhlnz] [-e command] [-r command] [-s speed] [-u command] device\n\
usage: %s [-acfhlnz] [-e command] [-r command] [-s speed] [-u command] \\\n\
[-K timeout] [-O timeout] [-U unit] device\n\
-a -- autoenable VJ compression\n\
-c -- enable VJ compression\n\
-e ECMD -- run ECMD before exiting\n\
@ -106,7 +111,11 @@ usage: %s [-acfhlnz] [-e command] [-r command] [-s speed] [-u command] device\n\
-r RCMD -- run RCMD upon loss of carrier\n\
-s # -- set baud rate (default 9600)\n\
-u UCMD -- run 'UCMD <old sl#> <new sl#>' before switch to slip discipline\n\
-z -- run RCMD upon startup irrespective of carrier\n";
-z -- run RCMD upon startup irrespective of carrier\n\
-K # -- set SLIP \"keep alive\" timeout (default 0)\n\
-O # -- set SLIP \"out fill\" timeout (default 0)\n\
-U # -- set SLIP unit number (default is dynamic)\n\
";
int main(int argc, char **argv)
{
@ -115,7 +124,7 @@ int main(int argc, char **argv)
extern int optind;
char *cp;
while ((option = getopt(argc, argv, "ace:fhlnr:s:u:z")) != EOF) {
while ((option = getopt(argc, argv, "ace:fhlnr:s:u:zK:O:U:")) != EOF) {
switch (option) {
case 'a':
slflags |= IFF_LINK2;
@ -152,6 +161,15 @@ int main(int argc, char **argv)
case 'z':
redial_on_startup = 1;
break;
case 'K':
keepal = atoi(optarg);
break;
case 'O':
outfill = atoi(optarg);
break;
case 'U':
sl_unit = atoi(optarg);
break;
default:
fprintf(stderr, "%s: Invalid option -- '%c'\n",
argv[0], option);
@ -282,7 +300,7 @@ void setup_line(int cflag)
{
tty.c_lflag = tty.c_iflag = tty.c_oflag = 0;
tty.c_cflag = CREAD | CS8 | flow_control | modem_control | cflag;
tty.c_ispeed = tty.c_ospeed = speed;
cfsetspeed(&tty, speed);
/* set the line speed and flow control */
if (tcsetattr(fd, TCSAFLUSH, &tty) < 0) {
syslog(LOG_ERR, "tcsetattr(TCSAFLUSH): %m");
@ -308,6 +326,11 @@ void slip_discipline()
exit_handler(1);
}
if (sl_unit >= 0 && ioctl(fd, SLIOCSUNIT, &sl_unit) < 0) {
syslog(LOG_ERR, "ioctl(SLIOCSUNIT): %m");
exit_handler(1);
}
/* find out what unit number we were assigned */
if (ioctl(fd, SLIOCGUNIT, (caddr_t)&tmp_unit) < 0) {
syslog(LOG_ERR, "ioctl(SLIOCGUNIT): %m");
@ -319,6 +342,18 @@ void slip_discipline()
exit_handler(1);
}
if (keepal > 0) {
signal(SIGURG, sigurg_handler);
if (ioctl(fd, SLIOCSKEEPAL, &keepal) < 0) {
syslog(LOG_ERR, "ioctl(SLIOCSKEEPAL): %m");
exit_handler(1);
}
}
if (outfill > 0 && ioctl(fd, SLIOCSOUTFILL, &outfill) < 0) {
syslog(LOG_ERR, "ioctl(SLIOCSOUTFILL): %m");
exit_handler(1);
}
/* open a socket as the handle to the interface */
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s < 0) {
@ -379,6 +414,8 @@ void configure_network()
/* signup_handler() is invoked when carrier drops, eg. before redial. */
void sighup_handler()
{
int ttydisc = TTYDISC;
if(exiting) return;
again:
/* invoke a shell for redial_cmd or punt. */
@ -401,8 +438,14 @@ again:
/* force a redial if no carrier */
goto again;
}
}
} else
setup_line(0);
} else {
if (ioctl(fd, TIOCSETD, &ttydisc) < 0) {
syslog(LOG_ERR, "ioctl(TIOCSETD): %m");
exit_handler(1);
}
setup_line(0); /* restore ospeed from hangup (B0) */
/* If modem control, just wait for carrier before attaching.
If no modem control, just fall through immediately. */
if (!(modem_control & CLOCAL)) {
@ -421,7 +464,6 @@ again:
dev, unit);
}
}
setup_line(0);
slip_discipline();
configure_network();
}
@ -432,6 +474,28 @@ void sigint_handler()
syslog(LOG_NOTICE,"SIGINT on %s (sl%d); exiting",dev,unit);
exit_handler(0);
}
/* Signal handler for SIGURG. */
void sigurg_handler()
{
int ttydisc = TTYDISC;
signal(SIGURG, SIG_IGN);
if(exiting) return;
syslog(LOG_NOTICE,"SIGURG on %s (sl%d); hangup",dev,unit);
if (ioctl(fd, TIOCSETD, &ttydisc) < 0) {
syslog(LOG_ERR, "ioctl(TIOCSETD): %m");
exit_handler(1);
}
cfsetospeed(&tty, B0);
if (tcsetattr(fd, TCSANOW, &tty) < 0) {
syslog(LOG_ERR, "tcsetattr(TCSANOW): %m");
exit_handler(1);
}
/* Need to go to sighup handler in any case */
if (modem_control & CLOCAL)
kill (getpid(), SIGHUP);
}
/* Signal handler for SIGTERM. We just log and exit. */
void sigterm_handler()
{