Index: net/common/current/ChangeLog =================================================================== RCS file: /cvs/ecos/ecos-opt/net/net/common/current/ChangeLog,v retrieving revision 1.63 diff -u -r1.63 ChangeLog --- net/common/current/ChangeLog 8 Jun 2004 17:58:20 -0000 1.63 +++ net/common/current/ChangeLog 17 Jun 2004 14:17:58 -0000 @@ -1,3 +1,10 @@ +2004-06-17 Andrew Lunn + + * 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 * include/network.h: Added a __THROW to perror so that it matches Index: net/common/current/src/ifaddrs.c =================================================================== RCS file: /cvs/ecos/ecos-opt/net/net/common/current/src/ifaddrs.c,v retrieving revision 1.5 diff -u -r1.5 ifaddrs.c --- net/common/current/src/ifaddrs.c 16 Sep 2003 22:05:06 -0000 1.5 +++ net/common/current/src/ifaddrs.c 17 Jun 2004 14:17:59 -0000 @@ -201,7 +201,8 @@ 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 @@ 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 @@ 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