diff -u openvpn_trunk/route.c openvpn_patched/route.c
--- openvpn_trunk/route.c       2009-01-29 15:00:04.525034400 +0100
+++ openvpn_patched/route.c     2009-01-29 15:03:41.116012000 +0100
@@ -45,7 +45,7 @@
 
 static void add_route (struct route *r, const struct tuntap *tt, unsigned int 
flags, const struct env_set *es);
 static void delete_route (const struct route *r, const struct tuntap *tt, 
unsigned int flags, const struct env_set *es);
-static bool get_default_gateway (in_addr_t *ret);
+static bool get_default_gateway (in_addr_t *ret, char *gw_if_name);
 
 struct route_option_list *
 new_route_option_list (struct gc_arena *a)
@@ -298,7 +298,7 @@
       rl->spec.remote_host_defined = true;
     }
 
-  rl->spec.net_gateway_defined = get_default_gateway (&rl->spec.net_gateway);
+  rl->spec.net_gateway_defined = get_default_gateway (&rl->spec.net_gateway, 
rl->spec.net_gateway_ifname);
   if (rl->spec.net_gateway_defined)
     {
       setenv_route_addr (es, "net_gateway", rl->spec.net_gateway, -1);
@@ -362,6 +362,7 @@
 add_route3 (in_addr_t network,
            in_addr_t netmask,
            in_addr_t gateway,
+           char * gateway_ifname,
            const struct tuntap *tt,
            unsigned int flags,
            const struct env_set *es)
@@ -372,6 +373,7 @@
   r.network = network;
   r.netmask = netmask;
   r.gateway = gateway;
+  r.gateway_ifname = gateway_ifname;
   add_route (&r, tt, flags, es);
 }
 
@@ -418,6 +420,7 @@
            add_route3 (rl->spec.remote_host,
                        ~0,
                        rl->spec.net_gateway,
+                       rl->spec.net_gateway_ifname,
                        tt,
                        flags,
                        es);
@@ -428,6 +431,7 @@
              add_route3 (0x00000000,
                          0x80000000,
                          rl->spec.remote_endpoint,
+                         NULL,
                          tt,
                          flags,
                          es);
@@ -436,6 +440,7 @@
              add_route3 (0x80000000,
                          0x80000000,
                          rl->spec.remote_endpoint,
+                         NULL,
                          tt,
                          flags,
                          es);
@@ -454,6 +459,7 @@
              add_route3 (0,
                          0,
                          rl->spec.remote_endpoint,
+                         NULL,
                          tt,
                          flags,
                          es);
@@ -511,6 +517,7 @@
          add_route3 (0,
                      0,
                      rl->spec.net_gateway,
+                     rl->spec.net_gateway_ifname,
                      tt,
                      flags,
                      es);
@@ -678,18 +685,24 @@
 
 #if defined(TARGET_LINUX)
 #ifdef CONFIG_FEATURE_IPROUTE
-  buf_printf (&buf, IPROUTE_PATH " route add %s/%d via %s",
+  buf_printf (&buf, IPROUTE_PATH " route add %s/%d",
              network,
-             count_netmask_bits(netmask),
-             gateway);
+             count_netmask_bits(netmask));
+  if (r->gateway)
+    argv_printf_cat (&argv, "via %s", gateway);
+  else
+    argv_printf_cat (&argv, "dev %s", r->gateway_ifname);
   if (r->metric_defined)
     buf_printf (&buf, " metric %d", r->metric);
 
 #else
-  buf_printf (&buf, ROUTE_PATH " add -net %s netmask %s gw %s",
+  buf_printf (&buf, ROUTE_PATH " add -net %s netmask %s",
              network,
-             netmask,
-             gateway);
+             netmask);
+  if (r->gateway)
+    argv_printf_cat (&argv, "gw %s", gateway);
+  else
+    argv_printf_cat (&argv, "dev %s", r->gateway_ifname);
   if (r->metric_defined)
     buf_printf (&buf, " metric %d", r->metric);
 #endif  /*CONFIG_FEATURE_IPROUTE*/
@@ -1014,7 +1027,7 @@
 }
 
 static bool
-get_default_gateway (in_addr_t *gateway)
+get_default_gateway (in_addr_t *gateway, char *gw_ifname)
 {
   struct gc_arena gc = gc_new ();
   int i;
@@ -1242,7 +1255,7 @@
 #elif defined(TARGET_LINUX)
 
 static bool
-get_default_gateway (in_addr_t *gateway)
+get_default_gateway (in_addr_t *gateway, char *gw_if_name)
 {
   struct gc_arena gc = gc_new ();
   bool ret = false;
@@ -1283,6 +1296,10 @@
                  if (!net && !mask && metric < lowest_metric)
                    {
                      best_gw = gw;
+                     if (gw_if_name)
+                               {
+                         sscanf (line, "%" IFNAME_MAXLEN_STR "s\t", 
gw_if_name);
+                               }
                      lowest_metric = metric;
                      best_count = count;
                    }
@@ -1292,7 +1309,7 @@
        }
       fclose (fp);
 
-      if (best_gw)
+      if (best_count)
        {
          *gateway = best_gw;
          ret = true;
@@ -1370,7 +1387,7 @@
         ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
 
 static bool
-get_default_gateway (in_addr_t *ret)
+get_default_gateway (in_addr_t *ret, char *gw_if_name)
 {
   struct gc_arena gc = gc_new ();
   int s, seq, l, pid, rtm_addrs, i;
@@ -1527,7 +1544,7 @@
         ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
 
 static bool
-get_default_gateway (in_addr_t *ret)
+get_default_gateway (in_addr_t *ret, char *gw_if_name)
 {
   struct gc_arena gc = gc_new ();
   int s, seq, l, pid, rtm_addrs, i;
@@ -1683,7 +1700,7 @@
         ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
 
 static bool
-get_default_gateway (in_addr_t *ret)
+get_default_gateway (in_addr_t *ret, char *gw_if_name)
 {
   struct gc_arena gc = gc_new ();
   int s, seq, l, rtm_addrs, i;
@@ -1782,7 +1799,7 @@
 #else
 
 static bool
-get_default_gateway (in_addr_t *ret)
+get_default_gateway (in_addr_t *ret, char *gw_if_name)
 {
   return false;
 }
diff -u openvpn_trunk/route.h openvpn_patched/route.h
--- openvpn_trunk/route.h       2009-01-29 15:00:04.650032800 +0100
+++ openvpn_patched/route.h     2009-01-29 15:03:46.100323200 +0100
@@ -48,11 +48,15 @@
  */
 #define ROUTE_DELETE_FIRST  2
 
+#define IFNAME_MAXLEN 32
+#define IFNAME_MAXLEN_STR "32"
+
 struct route_special_addr
 {
   in_addr_t remote_endpoint;
   bool remote_endpoint_defined;
   in_addr_t net_gateway;
+  char net_gateway_ifname[IFNAME_MAXLEN];
   bool net_gateway_defined;
   in_addr_t remote_host;
   bool remote_host_defined;
@@ -79,6 +83,7 @@
   in_addr_t network;
   in_addr_t netmask;
   in_addr_t gateway;
+  char * gateway_ifname;
   bool metric_defined;
   int metric;
 };

---------------------------------------------------------------------
http://www.nosoftwarepatents.com         Innovation, not litigation !
---
David Balažic                 mailto:david.bala...@hermes-softlab.com
HERMES Softlab                http://www.hermes-softlab.com
Zagrebska cesta 104           Phone: +386 2 450 8947 
SI-2000 Maribor
Slovenija
---------------------------------------------------------------------
"Be excellent to each other." -
Bill S. Preston, Esq. & "Ted" Theodore Logan
---------------------------------------------------------------------

Reply via email to