Browse code

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-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>

Alexander Pyhalov authored on 2014/10/15 04:43:22
Showing 1 changed files
... ...
@@ -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))