changeset 1670:6627c3a1df79

* src/ifaddrs.c (getifaddrs): Return destination address for P2P devices. Also don't bother trying to get the broadcast address for interfaces that don't have a valid broadcast address. Inspired by Kelvin Lawson
author asl
date Thu, 17 Jun 2004 14:19:29 +0000
parents 4c0b0b23f228
children 61d6d4688f20
files packages/net/common/current/ChangeLog packages/net/common/current/src/ifaddrs.c
diffstat 2 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/packages/net/common/current/ChangeLog
+++ b/packages/net/common/current/ChangeLog
@@ -1,3 +1,10 @@
+2004-06-17  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* src/ifaddrs.c (getifaddrs): Return destination address for P2P
+	devices. Also don't bother trying to get the broadcast address for
+	interfaces that don't have a valid broadcast address. Inspired by
+	Kelvin Lawson
+
 2004-06-08  Andrew Lunn  <andrew.lunn@ascom.ch>
 
 	* include/network.h: Added a __THROW to perror so that it matches
--- a/packages/net/common/current/src/ifaddrs.c
+++ b/packages/net/common/current/src/ifaddrs.c
@@ -201,7 +201,8 @@ getifaddrs(struct ifaddrs **pif)
         if ((sa->sa_family == AF_INET) || (sa->sa_family == AF_INET6)) {
           struct sockaddr *sa_netmask = NULL;
           struct sockaddr *sa_broadcast = NULL;
-
+          struct sockaddr *sa_dst = NULL;
+          
           memset(&ifrq,0,sizeof(ifrq));
           strcpy(ifrq.ifr_name,ifr->ifr_name);
           ioctl( sock, SIOCGIFFLAGS, &ifrq );
@@ -228,7 +229,7 @@ getifaddrs(struct ifaddrs **pif)
           data += SA_RLEN(sa_netmask);
 
           memcpy(&ifrq.ifr_addr, ift->ifa_addr,sizeof(struct sockaddr));
-          if (sa->sa_family == AF_INET) {
+          if ((sa->sa_family == AF_INET) && (ift->ifa_flags & IFF_BROADCAST)) {
             if (ioctl(sock, SIOCGIFBRDADDR, &ifrq) == 0) {
               sa_broadcast = &ifrq.ifr_addr;
               ift->ifa_broadaddr = (struct sockaddr *)data;
@@ -236,7 +237,19 @@ getifaddrs(struct ifaddrs **pif)
               data += SA_RLEN(sa_broadcast);
             }
           }
+
+          memcpy(&ifrq.ifr_addr, ift->ifa_addr,sizeof(struct sockaddr));
+          if ((sa->sa_family == AF_INET) && 
+              (ift->ifa_flags & IFF_POINTOPOINT)) {
+            if (ioctl(sock, SIOCGIFDSTADDR, &ifrq) == 0) {
+              sa_dst = &ifrq.ifr_addr;
+              ift->ifa_dstaddr = (struct sockaddr *)data;
+              memcpy(data, sa_dst, SA_LEN(sa_dst));
+              data += SA_RLEN(sa_dst);
+            }
+          }
         }
+        
         if (SA_LEN(sa) < sizeof(*sa))
             ifr = (struct ifreq *)(((char *)sa) + sizeof(*sa));
         else