Author: aurel32
Date: 2008-02-12 21:52:09 +0000 (Tue, 12 Feb 2008)
New Revision: 2811

Modified:
   glibc-package/trunk/debian/patches/any/cvs-rfc3484.diff
Log:
Add missing parts


Modified: glibc-package/trunk/debian/patches/any/cvs-rfc3484.diff
===================================================================
--- glibc-package/trunk/debian/patches/any/cvs-rfc3484.diff     2008-02-12 
21:37:08 UTC (rev 2810)
+++ glibc-package/trunk/debian/patches/any/cvs-rfc3484.diff     2008-02-12 
21:52:09 UTC (rev 2811)
@@ -1,5 +1,8 @@
 2007-11-12  Ulrich Drepper  <[EMAIL PROTECTED]>
 
+       * include/ifaddrs.c (struct in6addrinfo): Add prefixlen field.
+       * sysdeps/unix/sysv/linux/check_pf.c (make_request): Always return
+       list of interfaces.  Also store prefix length.
        * sysdeps/posix/getaddrinfo.c (sort_result): Add prefixlen element.
        (rfc3484_sort): In rule 9, for IPv4 addresses count only matching
        prefix if source and destination address are in the same subnet.
@@ -260,3 +263,171 @@
                    }
                }
              else if (errno == EAFNOSUPPORT && af == AF_INET6
+===================================================================
+RCS file: /cvs/glibc/libc/include/ifaddrs.h,v
+retrieving revision 1.5
+retrieving revision 1.6
+diff -u -r1.5 -r1.6
+--- libc/include/ifaddrs.h     2006/09/24 16:49:19     1.5
++++ libc/include/ifaddrs.h     2007/11/12 23:55:15     1.6
+@@ -12,7 +12,9 @@
+     in6ai_deprecated = 1,
+     in6ai_temporary = 2,
+     in6ai_homeaddress = 4
+-  } flags;
++  } flags:8;
++  uint8_t prefixlen;
++  uint16_t :16;
+   uint32_t addr[4];
+ };
+ 
+===================================================================
+RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/check_pf.c,v
+retrieving revision 1.12
+retrieving revision 1.13
+diff -u -r1.12 -r1.13
+--- libc/sysdeps/unix/sysv/linux/check_pf.c    2007/08/29 16:49:45     1.12
++++ libc/sysdeps/unix/sysv/linux/check_pf.c    2007/11/12 23:55:31     1.13
+@@ -145,92 +145,69 @@
+             struct rtattr *rta = IFA_RTA (ifam);
+             size_t len = nlmh->nlmsg_len - NLMSG_LENGTH (sizeof (*ifam));
+ 
+-            switch (ifam->ifa_family)
++            if (ifam->ifa_family != AF_INET
++                && ifam->ifa_family != AF_INET6)
++              continue;
++
++            const void *local = NULL;
++            const void *address = NULL;
++            while (RTA_OK (rta, len))
+               {
+-                const void *local;
+-                const void *address;
+-
+-              case AF_INET:
+-                local = NULL;
+-                address = NULL;
+-                while (RTA_OK (rta, len))
++                switch (rta->rta_type)
+                   {
+-                    switch (rta->rta_type)
+-                      {
+-                      case IFA_LOCAL:
+-                        local = RTA_DATA (rta);
+-                        break;
+-
+-                      case IFA_ADDRESS:
+-                        address = RTA_DATA (rta);
+-                        goto out_v4;
+-                      }
+-
+-                    rta = RTA_NEXT (rta, len);
++                  case IFA_LOCAL:
++                    local = RTA_DATA (rta);
++                    break;
++
++                  case IFA_ADDRESS:
++                    address = RTA_DATA (rta);
++                    goto out;
+                   }
+ 
+-                if (local != NULL)
++                rta = RTA_NEXT (rta, len);
++              }
++
++            if (local != NULL)
++              {
++                address = local;
++              out:
++                if (ifam->ifa_family != AF_INET)
+                   {
+-                  out_v4:
+-                    if (*(const in_addr_t *) (address ?: local)
++                    if (*(const in_addr_t *) address
+                         != htonl (INADDR_LOOPBACK))
+                       *seen_ipv4 = true;
+                   }
+-                break;
+-
+-              case AF_INET6:
+-                local = NULL;
+-                address = NULL;
+-                while (RTA_OK (rta, len))
+-                  {
+-                    switch (rta->rta_type)
+-                      {
+-                      case IFA_LOCAL:
+-                        local = RTA_DATA (rta);
+-                        break;
+-
+-                      case IFA_ADDRESS:
+-                        address = RTA_DATA (rta);
+-                        goto out_v6;
+-                      }
+-
+-                    rta = RTA_NEXT (rta, len);
+-                  }
+-
+-                if (local != NULL)
++                else
+                   {
+-                  out_v6:
+-                    if (!IN6_IS_ADDR_LOOPBACK (address ?: local))
++                    if (!IN6_IS_ADDR_LOOPBACK (address))
+                       *seen_ipv6 = true;
+                   }
++              }
+ 
+-                if (ifam->ifa_flags & (IFA_F_DEPRECATED
+-                                       | IFA_F_TEMPORARY
+-                                       | IFA_F_HOMEADDRESS
+-                                       | IFA_F_OPTIMISTIC))
+-                  {
+-                    struct in6ailist *newp = alloca (sizeof (*newp));
+-                    newp->info.flags = (((ifam->ifa_flags
+-                                          & (IFA_F_DEPRECATED
+-                                             | IFA_F_OPTIMISTIC))
+-                                         ? in6ai_deprecated : 0)
+-                                        | ((ifam->ifa_flags
+-                                            & IFA_F_TEMPORARY)
+-                                           ? in6ai_temporary : 0)
+-                                        | ((ifam->ifa_flags
+-                                            & IFA_F_HOMEADDRESS)
+-                                           ? in6ai_homeaddress : 0));
+-                    memcpy (newp->info.addr, address ?: local,
+-                            sizeof (newp->info.addr));
+-                    newp->next = in6ailist;
+-                    in6ailist = newp;
+-                    ++in6ailistlen;
+-                  }
+-                break;
+-              default:
+-                /* Ignore.  */
+-                break;
++            struct in6ailist *newp = alloca (sizeof (*newp));
++            newp->info.flags = (((ifam->ifa_flags
++                                  & (IFA_F_DEPRECATED
++                                     | IFA_F_OPTIMISTIC))
++                                 ? in6ai_deprecated : 0)
++                                | ((ifam->ifa_flags
++                                    & IFA_F_TEMPORARY)
++                                   ? in6ai_temporary : 0)
++                                | ((ifam->ifa_flags
++                                    & IFA_F_HOMEADDRESS)
++                                   ? in6ai_homeaddress : 0));
++            newp->info.prefixlen = ifam->ifa_prefixlen;
++            if (ifam->ifa_family == AF_INET)
++              {
++                newp->info.addr[0] = 0;
++                newp->info.addr[1] = 0;
++                newp->info.addr[2] = htonl (0xffff);
++                newp->info.addr[3] = *(const in_addr_t *) address;
+               }
++            else
++              memcpy (newp->info.addr, address, sizeof (newp->info.addr));
++            newp->next = in6ailist;
++            in6ailist = newp;
++            ++in6ailistlen;
+           }
+         else if (nlmh->nlmsg_type == NLMSG_DONE)
+           /* We found the end, leave the loop.  */


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to