| 1 |
--- avahi-core/iface-pfroute.c.orig 2007-09-03 08:32:41.000000000 -0400 |
|---|
| 2 |
+++ avahi-core/iface-pfroute.c 2008-04-06 15:06:36.000000000 -0400 |
|---|
| 3 |
@@ -125,7 +125,7 @@ static void rtm_addr(struct rt_msghdr *r |
|---|
| 4 |
int raddr_valid = 0; |
|---|
| 5 |
struct ifa_msghdr *ifam = (struct ifa_msghdr *) rtm; |
|---|
| 6 |
char *cp = (char *)(ifam + 1); |
|---|
| 7 |
- int addrs = ifam->ifam_addrs; |
|---|
| 8 |
+ char *cp0; |
|---|
| 9 |
int i; |
|---|
| 10 |
int prefixlen = 0; |
|---|
| 11 |
struct sockaddr *sa =NULL; |
|---|
| 12 |
@@ -135,17 +135,30 @@ static void rtm_addr(struct rt_msghdr *r |
|---|
| 13 |
((struct sockaddr *)cp)->sa_family = AF_INET; |
|---|
| 14 |
#endif |
|---|
| 15 |
|
|---|
| 16 |
- if(((struct sockaddr *)cp)->sa_family != AF_INET && ((struct sockaddr *)cp)->sa_family != AF_INET6) |
|---|
| 17 |
+ for (cp0 = cp, i = 0; i < RTAX_MAX; i++) { |
|---|
| 18 |
+ if (!(ifam->ifam_addrs & (1<<i))) |
|---|
| 19 |
+ continue; |
|---|
| 20 |
+ sa = (struct sockaddr *)cp; |
|---|
| 21 |
+ if (i == RTAX_IFA) |
|---|
| 22 |
+ break; |
|---|
| 23 |
+#ifdef SA_SIZE |
|---|
| 24 |
+ cp += SA_SIZE(sa); |
|---|
| 25 |
+#else |
|---|
| 26 |
+ ADVANCE(cp, sa); |
|---|
| 27 |
+#endif |
|---|
| 28 |
+ } |
|---|
| 29 |
+ |
|---|
| 30 |
+ if(sa->sa_family != AF_INET && sa->sa_family != AF_INET6) |
|---|
| 31 |
return; |
|---|
| 32 |
|
|---|
| 33 |
- if (!(iface = avahi_interface_monitor_get_interface(m, (AvahiIfIndex) ifam->ifam_index, avahi_af_to_proto(((struct sockaddr *)cp)->sa_family)))) |
|---|
| 34 |
+ if (!(iface = avahi_interface_monitor_get_interface(m, (AvahiIfIndex) ifam->ifam_index, avahi_af_to_proto(sa->sa_family)))) |
|---|
| 35 |
return; |
|---|
| 36 |
|
|---|
| 37 |
- raddr.proto = avahi_af_to_proto(((struct sockaddr *)cp)->sa_family); |
|---|
| 38 |
+ raddr.proto = avahi_af_to_proto(sa->sa_family); |
|---|
| 39 |
|
|---|
| 40 |
- for(i = 0; addrs != 0 && i < RTAX_MAX; addrs &= ~(1<<i), i++) |
|---|
| 41 |
+ for(cp = cp0, i = 0; i < RTAX_MAX; i++) |
|---|
| 42 |
{ |
|---|
| 43 |
- if (!(addrs & 1<<i)) |
|---|
| 44 |
+ if (!(ifam->ifam_addrs & (1<<i))) |
|---|
| 45 |
continue; |
|---|
| 46 |
sa = (struct sockaddr *)cp; |
|---|
| 47 |
#ifdef HAVE_SYS_SYSCTL_H |
|---|
| 48 |
@@ -172,6 +185,13 @@ static void rtm_addr(struct rt_msghdr *r |
|---|
| 49 |
break; |
|---|
| 50 |
case RTA_IFA: |
|---|
| 51 |
memcpy(raddr.data.data, &((struct sockaddr_in6 *)sa)->sin6_addr, sizeof(struct in6_addr)); |
|---|
| 52 |
+#ifdef __KAME__ |
|---|
| 53 |
+ if (IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)raddr.data.data)) |
|---|
| 54 |
+ { |
|---|
| 55 |
+ ((struct in6_addr *)raddr.data.data)->s6_addr[2] = 0; |
|---|
| 56 |
+ ((struct in6_addr *)raddr.data.data)->s6_addr[3] = 0; |
|---|
| 57 |
+ } |
|---|
| 58 |
+#endif |
|---|
| 59 |
raddr_valid = 1; |
|---|
| 60 |
default: |
|---|
| 61 |
break; |
|---|
| 62 |
@@ -196,9 +216,12 @@ static void rtm_addr(struct rt_msghdr *r |
|---|
| 63 |
if (!(addriface = avahi_interface_monitor_get_address(m, iface, &raddr))) |
|---|
| 64 |
if (!(addriface = avahi_interface_address_new(m, iface, &raddr, prefixlen))) |
|---|
| 65 |
return; |
|---|
| 66 |
- |
|---|
| 67 |
- |
|---|
| 68 |
- addriface->global_scope = 1; |
|---|
| 69 |
+ if (raddr.proto == AVAHI_PROTO_INET6) |
|---|
| 70 |
+ { |
|---|
| 71 |
+ addriface->global_scope = !(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)raddr.data.data) || IN6_IS_ADDR_MULTICAST((struct in6_addr *)raddr.data.data)); |
|---|
| 72 |
+ } |
|---|
| 73 |
+ else |
|---|
| 74 |
+ addriface->global_scope = 1; |
|---|
| 75 |
} |
|---|
| 76 |
else |
|---|
| 77 |
{ |
|---|