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-5-git-send-email-alp@rsu.ru>
URL: http://article.gmane.org/gmane.network.openvpn.devel/9129
Signed-off-by: Gert Doering <gert@greenie.muc.de>
... | ... |
@@ -2626,7 +2626,7 @@ get_default_gateway (struct route_gateway_info *rgi) |
2626 | 2626 |
gc_free (&gc); |
2627 | 2627 |
} |
2628 | 2628 |
|
2629 |
-#elif defined(TARGET_DARWIN) || \ |
|
2629 |
+#elif defined(TARGET_DARWIN) || defined(TARGET_SOLARIS) || \ |
|
2630 | 2630 |
defined(TARGET_FREEBSD) || defined(TARGET_DRAGONFLY) || \ |
2631 | 2631 |
defined(TARGET_OPENBSD) || defined(TARGET_NETBSD) |
2632 | 2632 |
|
... | ... |
@@ -2661,12 +2661,21 @@ struct rtmsg { |
2661 | 2661 |
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) |
2662 | 2662 |
#endif |
2663 | 2663 |
|
2664 |
+#if defined(TARGET_SOLARIS) |
|
2665 |
+#define NEXTADDR(w, u) \ |
|
2666 |
+ if (rtm_addrs & (w)) {\ |
|
2667 |
+ l = ROUNDUP(sizeof(struct sockaddr_in)); memmove(cp, &(u), l); cp += l;\ |
|
2668 |
+ } |
|
2669 |
+ |
|
2670 |
+#define ADVANCE(x, n) (x += ROUNDUP(sizeof(struct sockaddr_in))) |
|
2671 |
+#else |
|
2664 | 2672 |
#define NEXTADDR(w, u) \ |
2665 | 2673 |
if (rtm_addrs & (w)) {\ |
2666 | 2674 |
l = ROUNDUP(u.sa_len); memmove(cp, &(u), l); cp += l;\ |
2667 | 2675 |
} |
2668 | 2676 |
|
2669 | 2677 |
#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len)) |
2678 |
+#endif |
|
2670 | 2679 |
|
2671 | 2680 |
#define max(a,b) ((a) > (b) ? (a) : (b)) |
2672 | 2681 |
|
... | ... |
@@ -2703,9 +2712,12 @@ get_default_gateway (struct route_gateway_info *rgi) |
2703 | 2703 |
rtm.rtm_addrs = rtm_addrs; |
2704 | 2704 |
|
2705 | 2705 |
so_dst.sa_family = AF_INET; |
2706 |
- so_dst.sa_len = sizeof(struct sockaddr_in); |
|
2707 | 2706 |
so_mask.sa_family = AF_INET; |
2707 |
+ |
|
2708 |
+#ifndef TARGET_SOLARIS |
|
2709 |
+ so_dst.sa_len = sizeof(struct sockaddr_in); |
|
2708 | 2710 |
so_mask.sa_len = sizeof(struct sockaddr_in); |
2711 |
+#endif |
|
2709 | 2712 |
|
2710 | 2713 |
NEXTADDR(RTA_DST, so_dst); |
2711 | 2714 |
NEXTADDR(RTA_NETMASK, so_mask); |
... | ... |
@@ -2829,7 +2841,12 @@ get_default_gateway (struct route_gateway_info *rgi) |
2829 | 2829 |
for (cp = buffer; cp <= buffer + ifc.ifc_len - sizeof(struct ifreq); ) |
2830 | 2830 |
{ |
2831 | 2831 |
ifr = (struct ifreq *)cp; |
2832 |
+#if defined(TARGET_SOLARIS) |
|
2833 |
+ const size_t len = sizeof(ifr->ifr_name) + sizeof(ifr->ifr_addr); |
|
2834 |
+#else |
|
2832 | 2835 |
const size_t len = sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len); |
2836 |
+#endif |
|
2837 |
+ |
|
2833 | 2838 |
if (!ifr->ifr_addr.sa_family) |
2834 | 2839 |
break; |
2835 | 2840 |
if (!strncmp(ifr->ifr_name, rgi->iface, IFNAMSIZ)) |