Date: Tue, 6 Aug 96 10:56 MDT From: gord@enci.ucalgary.ca To: FreeBSD-gnats-submit@freebsd.org Subject: bin/1469: it is difficult to run /usr/sbin/ppp from a script Message-ID: <m0unpQK-0006AVC@walter> Resent-Message-ID: <199608061730.KAA01899@freefall.freebsd.org>
index | next in thread | raw e-mail
>Number: 1469
>Category: bin
>Synopsis: it is difficult to run /usr/sbin/ppp from a script
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Tue Aug 6 10:30:02 PDT 1996
>Last-Modified:
>Originator: Gord Matzigkeit
>Organization:
Profit Press
>Release: FreeBSD 2.1-STABLE i386
>Environment:
FreeBSD walter.profitpress.com 2.1.5-RELEASE
FreeBSD 2.1.5-RELEASE #0: Tue Jul 30 18:58:54 MDT 1996
gord@walter.profitpress.com:/usr/src/sys/compile/PINT
i386
>Description:
For /usr/sbin/ppp, you must choose between running ppp in the background or
connecting to a host immediately in the foreground.
I would like to be able to run ppp from a script so that my script can be
sure that it is connected to the 'net before it continues running:
# Dial up the internet.
ppp -background myprovider || exit 1
do-some-net-command
# Hang up the modem.
kill -HUP `cat /var/run/ppp.tun0.pid`
Another problem is that the current ppp calls its process id file
`/var/run/PPP.server', which may conflict if you have more than one IP
tunnel interface available.
>How-To-Repeat:
>Fix:
I have renamed the PID file from `/var/run/PPP.system' to
`/var/run/ppp.device.pid'.
I have also implemented background mode in the ppp daemon. Here are
the relevant excerpts from the new man page:
SYNOPSIS
ppp [-auto | -background | -direct]
...
Supports on-demand dialup capability. By using auto mode, ppp will act
as a daemon and wait for a packet to be sent over the PPP link. When
this happens, the daemon automatically dials and establishes the connec-
tion.
Supports background PPP connections. In background mode, if ppp success-
fully establishes the connection, it will become a daemon. Otherwise, it
will exit with an error.
Supports server-side PPP connections. Can act as server which accepts
incoming PPP connections.
...
BACKGROUND DIALING
If you want to establish a connection using ppp non-interactively (such
as from a crontab(5) entry or an at(1) script) you should use the
-background option. You must also specify the destination label in
/etc/ppp/ppp.conf to use.
When -background is specified, ppp attempts to establish the connection.
If this attempt fails, ppp exits immediately with a non-zero exit code.
If it succeeds, then ppp becomes a daemon, and returns an exit status of
zero to its caller. The daemon exits automatically if the connection is
dropped by the remote system, or it receives a HUP or TERM signal.
The file /var/run/ppp.tun0.pid contains the process id number of the ppp
program that is using the tunnel device tun0.
Here is the patch:
diff -u ppp/command.c.orig ppp/command.c
--- ppp/command.c.orig Mon Jun 10 09:35:21 1996
+++ ppp/command.c Wed Jul 31 17:36:25 1996
@@ -159,7 +159,7 @@
{
const char *shell;
pid_t shpid;
-
+
if((shell = getenv("SHELL")) == 0) {
shell = _PATH_BSHELL;
}
@@ -200,7 +200,7 @@
execvp(argv[0], argv);
else
execl(shell, shell, NULL);
-
+
fprintf(stdout, "exec() of %s failed\n", argc > 0? argv[0]: shell);
exit(255);
}
@@ -210,9 +210,9 @@
int status;
(void)waitpid(shpid, &status, 0);
}
-
+
TtyCommandMode(1);
-
+
return(0);
}
@@ -778,7 +778,7 @@
if (--argc > 0) {
ParseAddr(argc, argv++,
&DefTriggerAddress.ipaddr,
- &DefTriggerAddress.mask,
+ &DefTriggerAddress.mask,
&DefTriggerAddress.width);
}
}
@@ -984,4 +984,3 @@
}
return(1);
}
-
diff -u ppp/defs.h.orig ppp/defs.h
--- ppp/defs.h.orig Mon Feb 5 14:36:23 1996
+++ ppp/defs.h Wed Jul 31 19:18:36 1996
@@ -59,6 +59,7 @@
#define MODE_AUTO 2 /* Auto calling mode */
#define MODE_DIRECT 4 /* Direct connection mode */
#define MODE_DEDICATED 8 /* Dedicated line mode */
+#define MODE_BACKGROUND 16 /* Background mode. */
#define EX_NORMAL 0
#define EX_START 1
@@ -71,8 +72,11 @@
#define EX_ERRDEAD 8
#define EX_HANGUP 10
#define EX_TERM 11
+#define EX_NODIAL 12
+#define EX_NOLOGIN 13
int mode;
+int BGFiledes[2];
int modem;
int tun_in, tun_out;
diff -u ppp/main.c.orig ppp/main.c
--- ppp/main.c.orig Mon Feb 5 14:36:28 1996
+++ ppp/main.c Wed Jul 31 19:35:44 1996
@@ -69,6 +69,7 @@
static struct termios comtio; /* Command level tty mode */
static int TermMode;
static int server;
+static pid_t BGPid = 0;
struct sockaddr_in ifsin;
char pid_filename[128];
@@ -154,6 +155,8 @@
sleep(1);
if (mode & MODE_AUTO) {
DeleteIfRoutes(1);
+ }
+ if (mode & (MODE_AUTO | MODE_BACKGROUND)) {
unlink(pid_filename);
}
OsInterfaceDown(1);
@@ -169,16 +172,28 @@
static void
Hangup()
{
- LogPrintf(LOG_PHASE, "SIGHUP\n");
- Cleanup(EX_HANGUP);
+ if (BGPid) {
+ kill (BGPid, SIGHUP);
+ exit (EX_HANGUP);
+ }
+ else {
+ LogPrintf(LOG_PHASE, "SIGHUP\n");
+ Cleanup(EX_HANGUP);
+ }
}
static void
CloseSession()
{
- LogPrintf(LOG_PHASE, "SIGTERM\n");
- LcpClose();
- Cleanup(EX_TERM);
+ if (BGPid) {
+ kill (BGPid, SIGINT);
+ exit (EX_TERM);
+ }
+ else {
+ LogPrintf(LOG_PHASE, "SIGTERM\n");
+ LcpClose();
+ Cleanup(EX_TERM);
+ }
}
@@ -204,7 +219,7 @@
void
Usage()
{
- fprintf(stderr, "Usage: ppp [-auto | -direct | -dedicated] [system]\n");
+ fprintf(stderr, "Usage: ppp [-auto | -background | -direct | -dedicated] [system]\n");
exit(EX_START);
}
@@ -219,6 +234,8 @@
cp = *argv + 1;
if (strcmp(cp, "auto") == 0)
mode |= MODE_AUTO;
+ else if (strcmp(cp, "background") == 0)
+ mode |= MODE_BACKGROUND;
else if (strcmp(cp, "direct") == 0)
mode |= MODE_DIRECT;
else if (strcmp(cp, "dedicated") == 0)
@@ -288,7 +305,7 @@
exit(EX_START);
}
- if (mode & (MODE_AUTO|MODE_DIRECT|MODE_DEDICATED))
+ if (mode & (MODE_AUTO|MODE_DIRECT|MODE_DEDICATED|MODE_BACKGROUND))
mode &= ~MODE_INTER;
if (mode & MODE_INTER) {
printf("Interactive mode\n");
@@ -299,6 +316,12 @@
fprintf(stderr, "Destination system must be specified in auto mode.\n");
exit(EX_START);
}
+ } else if (mode & MODE_BACKGROUND) {
+ printf("Background mode\n");
+ if (dstsystem == NULL) {
+ fprintf(stderr, "Destination system must be specified in background mode.\n");
+ exit(EX_START);
+ }
}
tcgetattr(0, &oldtio); /* Save original tty mode */
@@ -349,36 +372,61 @@
#endif
if (!(mode & MODE_INTER)) {
- int port = SERVER_PORT + tunno;
- /*
- * Create server socket and listen at there.
- */
- server = socket(PF_INET, SOCK_STREAM, 0);
- if (server < 0) {
- perror("socket");
- Cleanup(EX_SOCK);
+ int port = SERVER_PORT + tunno;
+ if (mode & MODE_BACKGROUND) {
+ if (pipe (BGFiledes)) {
+ perror("pipe");
+ Cleanup(EX_SOCK);
+ }
+ server = -1;
}
- ifsin.sin_family = AF_INET;
- ifsin.sin_addr.s_addr = INADDR_ANY;
- ifsin.sin_port = htons(port);
- if (bind(server, (struct sockaddr *) &ifsin, sizeof(ifsin)) < 0) {
- perror("bind");
- if (errno == EADDRINUSE)
- fprintf(stderr, "Wait for a while, then try again.\n");
- Cleanup(EX_SOCK);
+ else {
+ /*
+ * Create server socket and listen at there.
+ */
+ server = socket(PF_INET, SOCK_STREAM, 0);
+ if (server < 0) {
+ perror("socket");
+ Cleanup(EX_SOCK);
+ }
+ ifsin.sin_family = AF_INET;
+ ifsin.sin_addr.s_addr = INADDR_ANY;
+ ifsin.sin_port = htons(port);
+ if (bind(server, (struct sockaddr *) &ifsin, sizeof(ifsin)) < 0) {
+ perror("bind");
+ if (errno == EADDRINUSE)
+ fprintf(stderr, "Wait for a while, then try again.\n");
+ Cleanup(EX_SOCK);
+ }
+ listen(server, 5);
}
- listen(server, 5);
DupLog();
if (!(mode & MODE_DIRECT)) {
int fd;
char pid[32];
+ pid_t bgpid;
+
+ bgpid = fork ();
+ if (bgpid == -1) {
+ perror ("fork");
+ Cleanup (EX_SOCK);
+ }
+ if (bgpid) {
+ char c = EX_NORMAL;
- if (fork())
- exit(0);
+ if (mode & MODE_BACKGROUND) {
+ /* Wait for our child to close its pipe before we exit. */
+ BGPid = bgpid;
+ read (BGFiledes[0], &c, 1);
+ if (c == EX_NORMAL)
+ LogPrintf (LOG_CHAT, "PPP enabled.\n");
+ }
+ exit(c);
+ }
- snprintf(pid_filename, sizeof (pid_filename), "%s/PPP.%s",
- _PATH_VARRUN, dstsystem);
+ snprintf(pid_filename, sizeof (pid_filename), "%s/ppp.tun%d.pid",
+ _PATH_VARRUN, tunno);
unlink(pid_filename);
sprintf(pid, "%lu\n", getpid());
@@ -388,12 +436,14 @@
close(fd);
}
}
- LogPrintf(LOG_PHASE, "Listening at %d.\n", port);
+ if (server > 0)
+ LogPrintf(LOG_PHASE, "Listening at %d.\n", port);
+
+ if (mode & (MODE_DIRECT
#ifdef DOTTYINIT
- if (mode & (MODE_DIRECT|MODE_DEDICATED)) { /* } */
-#else
- if (mode & MODE_DIRECT) {
+ |MODE_DEDICATED
#endif
+ )) {
TtyInit();
} else {
setsid(); /* detach control tty */
@@ -414,7 +464,7 @@
}
/*
- * Turn into packet mode, where we speek PPP.
+ * Turn into packet mode, where we speak PPP.
*/
void
PacketMode()
diff -u ppp/modem.c.orig ppp/modem.c
--- ppp/modem.c.orig Mon Feb 5 14:36:30 1996
+++ ppp/modem.c Wed Jul 31 16:48:08 1996
@@ -724,6 +724,7 @@
DialModem()
{
char ScriptBuffer[200];
+ int excode;
strcpy(ScriptBuffer, VarDialScript);
if (DoChat(ScriptBuffer) > 0) {
@@ -734,12 +735,20 @@
return(1);
} else {
fprintf(stderr, "login failed.\n");
+ excode = EX_NOLOGIN;
}
ModemTimeout(); /* Dummy call to check modem status */
}
- else
+ else {
fprintf(stderr, "dial failed.\n");
+ excode = EX_NODIAL;
+ }
HangupModem(0);
+ if (mode & MODE_BACKGROUND) {
+ extern void Cleanup();
+ CloseModem();
+ Cleanup(excode);
+ }
return(0);
}
diff -u ppp/phase.h.orig ppp/phase.h
--- ppp/phase.h.orig Sun Feb 26 05:17:53 1995
+++ ppp/phase.h Wed Jul 31 19:57:52 1996
@@ -26,9 +26,10 @@
#define PHASE_DEAD 0 /* Link is dead */
#define PHASE_ESTABLISH 1 /* Establishing link */
-#define PHASE_AUTHENTICATE 2 /* Beeing authenticate */
+#define PHASE_AUTHENTICATE 2 /* Being authenticated */
#define PHASE_NETWORK 3
#define PHASE_TERMINATE 4 /* Terminating link */
+#define PHASE_OSLINKED 5 /* The OS is linked up */
int phase; /* Curent phase */
diff -u ppp/ppp.8.orig ppp/ppp.8
--- ppp/ppp.8.orig Mon Feb 5 14:36:32 1996
+++ ppp/ppp.8 Wed Jul 31 18:19:18 1996
@@ -9,7 +9,7 @@
Point to Point Protocol (aka iijppp)
.Sh SYNOPSIS
.Nm
-.Op Fl auto \*(Ba Fl direct Fl dedicated
+.Op Fl auto \*(Ba Fl background \*(Ba Fl direct \*(Ba Fl dedicated
.Sh DESCRIPTION
This is a user process
.Em PPP
@@ -31,7 +31,7 @@
the status of connection and close the connection. All functions can
also be optionally password protected for security.
-.It Supports both manual and automatic dialing.
+.It Supports both manual and automatic dialing.
Interactive mode has a
.Dq term
command which enables you to talk to your modem directly. When your
@@ -52,11 +52,17 @@
link. When this happens, the daemon automatically dials and establishes the
connection.
+.It Supports background PPP connections.
+In background mode, if
+.Nm
+successfully establishes the connection, it will become a daemon.
+Otherwise, it will exit with an error.
+
.It Supports server-side PPP connections.
Can act as server which accepts incoming
.Em PPP
-connections.
-
+connections.
+
.It Supports PAP and CHAP authentication.
@@ -69,7 +75,7 @@
.It Supports packet filtering.
User can define four kinds of filters:
.Em ifilter
-for incoming packets,
+for incoming packets,
.Em ofilter
for outgoing packets,
.Em dfilter
@@ -84,14 +90,14 @@
.Em PPP
link.
-.It Supports PPP over TCP capability.
+.It Supports PPP over TCP capability.
-.It Supports IETF draft Predictor-1 compression.
+.It Supports IETF draft Predictor-1 compression.
.Nm
supports not only VJ-compression but also Predictor-1 compression.
Normally, a modem has built-in compression (e.g. v42.bis) and the system
-may receive higher data rates from it as a result of such compression.
+may receive higher data rates from it as a result of such compression.
While this is generally a good thing in most other situations, this
higher speed data imposes a penalty on the system by increasing the
number of serial interrupts the system has to process in talking to the
@@ -118,7 +124,7 @@
.Dl pseudo-device tun 1
-You should set the numeric field to the maximum number of
+You should set the numeric field to the maximum number of
.Em PPP
connections you wish to support.
@@ -130,7 +136,7 @@
.Sh MANUAL DIALING
-%
+%
.Nm
User Process PPP written by Toshiharu OHNO.
@@ -141,7 +147,7 @@
ppp on "your hostname"> help
passwd : Password for security
- quit : Quit the PPP program
+ quit : Quit the PPP program
help : Display this message
ppp on tama> pass <password>
@@ -270,6 +276,39 @@
default route. The string HISADDR represents the IP address of the
remote peer.
+.Sh BACKGROUND DIALING
+
+If you want to establish a connection using
+.Nm ppp non-interactively (such as from a
+.Xr crontab(5)
+entry or an
+.Xr at(1)
+script) you should use the
+.Fl background
+option. You must also specify the destination label in
+.Pa /etc/ppp/ppp.conf
+to use.
+
+When
+.Fl background
+is specified,
+.Nm
+attempts to establish the connection. If this attempt fails,
+.Nm ppp
+exits immediately with a non-zero exit code.
+
+If it succeeds, then
+.Nm ppp
+becomes a daemon, and returns an exit status of zero to its caller.
+The daemon exits automatically if the connection is dropped by the
+remote system, or it receives a HUP or TERM signal.
+
+The file
+.Pa /var/run/ppp.tun0.pid
+contains the process id number of the
+.Nm ppp
+program that is using the tunnel device tun0.
+
.Sh DIAL ON DEMAND
To play with demand dialing, you must use the
@@ -298,7 +337,7 @@
Connected to localhost.spec.co.jp.
Escape character is '^]'.
User Process PPP. Written by Toshiharu OHNO.
- Working as auto mode.
+ Working as auto mode.
PPP on tama> show ipcp
what ?
PPP on tama> pass xxxx
@@ -379,11 +418,11 @@
.Sq filter-name
should be one of ifilter, ofilter, or dfilter.
.It
-There are two actions:
+There are two actions:
.Sq permit
and
.Sq deny .
-If a given packet
+If a given packet
matches the rule, the associated action is taken immediately.
.It
.Sq src_width
@@ -427,7 +466,7 @@
connection request, follow these steps:
.Bl -enum
-.It
+.It
Make sure the modem and (optionally)
.Pa /etc/rc.serial
is configured correctly.
@@ -458,7 +497,7 @@
.Ed
.It
-Create a
+Create a
.Pa /usr/local/bin/ppplogin
file with the following contents:
.Bd -literal -offset indent
@@ -491,7 +530,7 @@
.Dl ppp ON tama> set timeout 600
The timeout period is measured in seconds, the default values for which
-are timeout = 180 or 3 min, lqrtimer = 30sec and retrytimer = 3sec.
+are timeout = 180 or 3 min, lqrtimer = 30sec and retrytimer = 3sec.
To disable the idle timer function,
use the command
.Dq set timeout 0 .
@@ -527,7 +566,7 @@
specifies the IP address that it's willing to use, and if the requested
IP address is acceptable then
.Nm
-returns ACK to the requester. Otherwise,
+returns ACK to the requester. Otherwise,
.Nm
returns NAK to suggest that the peer use a different IP address. When
both sides of the connection agree to accept the received request (and
@@ -563,7 +602,7 @@
.It
This is all fine when each side has a pre-determined IP address, however
it is often the case that one side is acting as a server which controls
-all IP addresses and the other side should obey the direction from it.
+all IP addresses and the other side should obey the direction from it.
.El
In order to allow more flexible behavior, `ifaddr' command allows the
@@ -579,7 +618,7 @@
I'd like to use 192.244.177.38 as my address if it is possible, but I'll
also accept any IP address between 192.244.177.0 and 192.244.177.255.
-.It
+.It
I'd like to make him use 192.244.177.2 as his own address, but I'll also
permit him to use any IP address between 192.244.176.0 and
192.244.191.255.
@@ -718,11 +757,11 @@
.It /var/log/ppp.log
Logging and debugging information file.
-.It /var/spool/lock/Lck..*
+.It /var/spool/lock/Lck..*
tty port locking file.
-.It /var/run/PPP.system
-Holds the pid for ppp -auto system.
+.It /var/run/ppp.tun0.pid
+The process id (pid) of the ppp program connected to the ppp0 device.
.It /etc/services
Get port number if port number is using service name.
>Audit-Trail:
>Unformatted:
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?m0unpQK-0006AVC>
