[PATCH] pppd: Add ipv6-pre-up-script option

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This option allow a user to specify the path to a script
that will be run before the interface is brought up,
similarly to the existing ip-pre-up script.

Signed-off-by: Tomas Paukrt <tomaspaukrt@xxxxxxxx>
---
 pppd/ipv6cp.c       | 21 ++++++++++++++-------
 pppd/main.c         |  1 +
 pppd/options.c      |  4 ++++
 pppd/pathnames.h    |  1 +
 pppd/pppd-private.h |  1 +
 5 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/pppd/ipv6cp.c b/pppd/ipv6cp.c
index a36b1d9..9b0ef9d 100644
--- a/pppd/ipv6cp.c
+++ b/pppd/ipv6cp.c
@@ -322,7 +322,7 @@ struct protent ipv6cp_protent = {
 };
 
 static void ipv6cp_clear_addrs (int, eui64_t, eui64_t);
-static void ipv6cp_script (char *);
+static void ipv6cp_script (char *, int);
 static void ipv6cp_script_done (void *);
 
 /*
@@ -1235,6 +1235,7 @@ ipv6_demand_conf(int u)
 	eui64_magic_nz(wo->ourid);
     }
 
+    ipv6cp_script(path_ipv6preup, 1);
     if (!sif6up(u))
 	return 0;
     if (!sif6addr(u, wo->ourid, wo->hisid))
@@ -1342,6 +1343,9 @@ ipv6cp_up(fsm *f)
 	sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);
 
     } else {
+	/* run the pre-up script, if any, and wait for it to finish */
+	ipv6cp_script(path_ipv6preup, 1);
+
 	/* bring the interface up for IPv6 */
 	if (!sif6up(f->unit)) {
 	    if (debug)
@@ -1381,7 +1385,7 @@ ipv6cp_up(fsm *f)
      */
     if (ipv6cp_script_state == s_down && ipv6cp_script_pid == 0) {
 	ipv6cp_script_state = s_up;
-	ipv6cp_script(path_ipv6up);
+	ipv6cp_script(path_ipv6up, 0);
     }
 }
 
@@ -1432,7 +1436,7 @@ ipv6cp_down(fsm *f)
     /* Execute the ipv6-down script */
     if (ipv6cp_script_state == s_up && ipv6cp_script_pid == 0) {
 	ipv6cp_script_state = s_down;
-	ipv6cp_script(path_ipv6down);
+	ipv6cp_script(path_ipv6down, 0);
     }
 }
 
@@ -1470,13 +1474,13 @@ ipv6cp_script_done(void *arg)
     case s_up:
 	if (ipv6cp_fsm[0].state != OPENED) {
 	    ipv6cp_script_state = s_down;
-	    ipv6cp_script(path_ipv6down);
+	    ipv6cp_script(path_ipv6down, 0);
 	}
 	break;
     case s_down:
 	if (ipv6cp_fsm[0].state == OPENED) {
 	    ipv6cp_script_state = s_up;
-	    ipv6cp_script(path_ipv6up);
+	    ipv6cp_script(path_ipv6up, 0);
 	}
 	break;
     }
@@ -1488,7 +1492,7 @@ ipv6cp_script_done(void *arg)
  * interface-name tty-name speed local-LL remote-LL.
  */
 static void
-ipv6cp_script(char *script)
+ipv6cp_script(char *script, int wait)
 {
     char strspeed[32], strlocal[64], strremote[64];
     char *argv[8];
@@ -1506,7 +1510,10 @@ ipv6cp_script(char *script)
     argv[6] = ipparam;
     argv[7] = NULL;
 
-    ipv6cp_script_pid = run_program(script, argv, 0, ipv6cp_script_done,
+    if (wait)
+      run_program(script, argv, 0, NULL, NULL, 1);
+    else
+      ipv6cp_script_pid = run_program(script, argv, 0, ipv6cp_script_done,
 				    NULL, 0);
 }
 
diff --git a/pppd/main.c b/pppd/main.c
index c42b69f..53250e7 100644
--- a/pppd/main.c
+++ b/pppd/main.c
@@ -372,6 +372,7 @@ main(int argc, char *argv[])
 #ifdef PPP_WITH_IPV6CP
     strlcpy(path_ipv6up, PPP_PATH_IPV6UP, MAXPATHLEN);
     strlcpy(path_ipv6down, PPP_PATH_IPV6DOWN, MAXPATHLEN);
+    strlcpy(path_ipv6preup, PPP_PATH_IPV6PREUP, MAXPATHLEN);
 #endif
     link_stats_valid = 0;
     link_stats_print = 1;
diff --git a/pppd/options.c b/pppd/options.c
index 2cdfaf2..8c3e74b 100644
--- a/pppd/options.c
+++ b/pppd/options.c
@@ -138,6 +138,7 @@ int	dfl_route_metric = -1;	/* metric of the default route to set over the PPP li
 #ifdef PPP_WITH_IPV6CP
 char	path_ipv6up[MAXPATHLEN];   /* pathname of ipv6-up script */
 char	path_ipv6down[MAXPATHLEN]; /* pathname of ipv6-down script */
+char	path_ipv6preup[MAXPATHLEN]; /* pathname of ipv6-pre-up script */
 #endif
 
 unsigned int  maxoctets = 0;    /* default - no limit */
@@ -349,6 +350,9 @@ struct option general_options[] = {
     { "ipv6-down-script", o_string, path_ipv6down,
       "Set pathname of ipv6-down script",
       OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
+    { "ipv6-pre-up-script", o_string, path_ipv6preup,
+      "Set pathname of ipv6-pre-up script",
+      OPT_PRIV|OPT_STATIC, NULL, MAXPATHLEN },
 #endif
 
 #ifdef PPP_WITH_MULTILINK
diff --git a/pppd/pathnames.h b/pppd/pathnames.h
index d08e8ef..b488236 100644
--- a/pppd/pathnames.h
+++ b/pppd/pathnames.h
@@ -119,6 +119,7 @@
 #ifdef PPP_WITH_IPV6CP
 #define PPP_PATH_IPV6UP         PPP_PATH_CONFDIR "/ipv6-up"
 #define PPP_PATH_IPV6DOWN       PPP_PATH_CONFDIR "/ipv6-down"
+#define PPP_PATH_IPV6PREUP      PPP_PATH_CONFDIR "/ipv6-pre-up"
 #endif
 
 #define PPP_PATH_PPPDB          PPP_PATH_VARRUN  "/pppd2.tdb"
diff --git a/pppd/pppd-private.h b/pppd/pppd-private.h
index a38f58a..bcee1fd 100644
--- a/pppd/pppd-private.h
+++ b/pppd/pppd-private.h
@@ -211,6 +211,7 @@ extern int  option_priority;    /* priority of current options */
 #ifdef PPP_WITH_IPV6CP
 extern char	path_ipv6up[]; /* pathname of ipv6-up script */
 extern char	path_ipv6down[]; /* pathname of ipv6-down script */
+extern char	path_ipv6preup[]; /* pathname of ipv6-pre-up script */
 #endif
 
 #if defined(PPP_WITH_EAPTLS) || defined(PPP_WITH_PEAP)
-- 
2.7.4
 





[Index of Archives]     [Linux Audio Users]     [Linux for Hams]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Fedora Users]

  Powered by Linux