home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OpenStep 4.2
/
Openstep-4.2-Intel-User.iso
/
usr
/
template
/
client
/
etc
/
ppp
/
Examples
/
Persistent_Connection
< prev
next >
Wrap
Text File
|
1995-11-06
|
3KB
|
126 lines
#! /usr/bin/perl
# ip-down -- executed by pppd on connection death
#
# This particular implementation of ip-down attempts to re-establish
# the ppp connection. It does this by first forking and having the
# parent die (returning control to the invoking pppd for final
# cleanup).
#
# The child waits until the specified port (pppd passes the path to
# the port's device as argument 2) is available and launches pppd (or
# whatever is specfied by $PATH_pppd.
#
# This script requires "syslog.pl" (included with perl). Because of
# this, it also requires "syslog.ph"; "syslog.ph" can be
# manufactured using the h2ph script included with the perl
# distribution. Under NeXTSTEP, one can create syslog.ph by:
#
# h2ph < /usr/include/bsd/sys/syslog.h > syslog.ph
#
# 'syslog.ph' should either be copied into your machines perl library
# (wherever syslog.pl resides), or you should add wherever syslog.ph
# resides to Perl's library search path.
#
# Removing all references to syslog (including openlog() and
# closelog()) will also work, but will render this script's execution
# completely silent.
#
# By default, this script logs to the default target for ppp's logs --
# LOCAL2.
#
# hacqued by: <bbum@friday.com>, jan 30 1995
#
# Please send any changes/improvements to <bbum@friday.com>. And
# please try not to laugh at this code... or, at least, tell me why
# you are laughing so I won't make the same mistakes twice.
# ABSOLUTE path to PPP daemon (or whatever you want executed after the
# port becomes available).
$PATH_pppd = "/usr/etc/pppd";
# number of seconds to sleep between checking for port availability
$lock_sleep = 2;
require "syslog.pl";
FORK: {
if ($pid = fork) {
# this is the parent. It must die so the old pppd can
# clean-up and exit.
exit;
} elsif ($! =~ /No more process/) {
# oops! ran out of processes. This is supposed to be a
# recoverable error, so sleep and try again.
sleep 5;
redo FORK;
} elsif (!defined($pid)) {
# fork error -- log it and die.
&openlog("pppd/ip-down", 'cons,pid', LOG_LOCAL2);
&syslog('warning',
"Fork() error '$!'");
&closelog;
die "can't fork: $!\n";
}
}
# everything from here down is the child.
&openlog("pppd/ip-down", 'cons,pid', LOG_LOCAL2);
if ( ! @ARGV ) {
# no arguments -- exec specified thing (assume the process
# being called has a clue about what port it should use)
&syslog('info', "No device specified. Executing '$PATH_pppd'.");
&closelog;
exec $PATH_pppd;
## NOT REACHED: exec never returns
}
# (assume-- it will if pppd starts ip-down)
# ARGV contains:
# interface-name tty-device speed local-IP-address
# remote-IP-address
($interface_name,
$tty_device,
$speed,
$local_IP_address,
$remote_IP_address) = @ARGV;
# find the raw device name
@path = split ('/', $tty_device);
$device = pop @path;
# Generate path to lock file -- assumes NeXT style device locking
$lock = "/usr/spool/uucp/LCK/LCK..$device";
# log some info.
&syslog('info',
"Reconnecting '$interface_name' ($local_IP_address:$remote_IP_address) through '$tty_device' at '$speed' baud.");
# check for lock
if ( -e $lock) {
&syslog('info',
"'$device' locked. Waiting for unlock.");
# loop until unlocked
while ( -e $lock ) {
sleep $lock_sleep;
}
}
#### port available -- log and execute
&syslog('info',
"Port '$device' available. Launching '$PATH_pppd'");
&closelog;
exec $PATH_pppd;
### NOT REACHED