diff options
author | Alexander Pyhalov <apyhalov@gmail.com> | 2014-10-14 23:43:21 +0400 |
---|---|---|
committer | Gert Doering <gert@greenie.muc.de> | 2014-12-31 10:22:48 +0100 |
commit | b6dc199077079310d9f26fa8b366f4e71d32f6c9 (patch) | |
tree | 71181c9197a3d220d004b1db548a266abb0ce3a2 /src | |
parent | 77f8a56a1acc1d5e7f042c9bc393e83541155483 (diff) | |
download | openvpn-b6dc199077079310d9f26fa8b366f4e71d32f6c9.tar.gz openvpn-b6dc199077079310d9f26fa8b366f4e71d32f6c9.tar.xz openvpn-b6dc199077079310d9f26fa8b366f4e71d32f6c9.zip |
Default gateway can't be determined on illumos/Solaris platforms
The logic which is used on BSD is preserved. The only distinction
is that illumos doesn't provide sa_len field in sockaddr structures.
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <1413315802-62359-4-git-send-email-alp@rsu.ru>
URL: http://article.gmane.org/gmane.network.openvpn.devel/9128
Signed-off-by: Gert Doering <gert@greenie.muc.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/openvpn/route.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/openvpn/route.c b/src/openvpn/route.c index cc85e4d..c7e9ddd 100644 --- a/src/openvpn/route.c +++ b/src/openvpn/route.c @@ -2601,7 +2601,7 @@ get_default_gateway (struct route_gateway_info *rgi) gc_free (&gc); } -#elif defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY) +#elif defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY)||defined(TARGET_SOLARIS) #include <sys/types.h> #include <sys/socket.h> @@ -2629,6 +2629,8 @@ get_default_gateway (struct route_gateway_info *rgi) struct sockaddr *gate = NULL, *sa; struct rt_msghdr *rtm_aux; +#if defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY) + #define NEXTADDR(w, u) \ if (rtm_addrs & (w)) {\ l = ROUNDUP(u.sa_len); memmove(cp, &(u), l); cp += l;\ @@ -2636,6 +2638,18 @@ get_default_gateway (struct route_gateway_info *rgi) #define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) +#else /* TARGET_SOLARIS */ + +#define NEXTADDR(w, u) \ + if (rtm_addrs & (w)) {\ + l = ROUNDUP(sizeof(struct sockaddr_in)); memmove(cp, &(u), l); cp += l;\ + } + +#define ADVANCE(x, n) (x += ROUNDUP(sizeof(struct sockaddr_in))) + +#endif + + #define rtm m_rtmsg.m_rtm CLEAR(*rgi); @@ -2655,9 +2669,12 @@ get_default_gateway (struct route_gateway_info *rgi) rtm.rtm_addrs = rtm_addrs; so_dst.sa_family = AF_INET; - so_dst.sa_len = sizeof(struct sockaddr_in); so_mask.sa_family = AF_INET; + +#if defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY) + so_dst.sa_len = sizeof(struct sockaddr_in); so_mask.sa_len = sizeof(struct sockaddr_in); +#endif NEXTADDR(RTA_DST, so_dst); NEXTADDR(RTA_NETMASK, so_mask); |