Diff for /embedaddon/dnsmasq/src/bpf.c between versions 1.1.1.3 and 1.1.1.4

version 1.1.1.3, 2016/11/02 09:57:01 version 1.1.1.4, 2021/03/17 00:56:46
Line 1 Line 1
/* dnsmasq is Copyright (c) 2000-2016 Simon Kelley/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley
   
    This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
Line 31 Line 31
 #  include <net/if_var.h>   #  include <net/if_var.h> 
 #endif  #endif
 #include <netinet/in_var.h>  #include <netinet/in_var.h>
#ifdef HAVE_IPV6#include <netinet6/in6_var.h>
#  include <netinet6/in6_var.h> 
#endif 
   
 #ifndef SA_SIZE  #ifndef SA_SIZE
 #define SA_SIZE(sa)                                             \  #define SA_SIZE(sa)                                             \
Line 44 Line 42
   
 #ifdef HAVE_BSD_NETWORK  #ifdef HAVE_BSD_NETWORK
 static int del_family = 0;  static int del_family = 0;
static struct all_addr del_addr;static union all_addr del_addr;
 #endif  #endif
   
 #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)  #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
Line 105  int arp_enumerate(void *parm, int (*callback)()) Line 103  int arp_enumerate(void *parm, int (*callback)())
 int iface_enumerate(int family, void *parm, int (*callback)())  int iface_enumerate(int family, void *parm, int (*callback)())
 {  {
   struct ifaddrs *head, *addrs;    struct ifaddrs *head, *addrs;
  int errsav, fd = -1, ret = 0;  int errsave, fd = -1, ret = 0;
   
   if (family == AF_UNSPEC)    if (family == AF_UNSPEC)
 #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)  #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
Line 121  int iface_enumerate(int family, void *parm, int (*call Line 119  int iface_enumerate(int family, void *parm, int (*call
   if (getifaddrs(&head) == -1)    if (getifaddrs(&head) == -1)
     return 0;      return 0;
   
#if defined(HAVE_BSD_NETWORK) && defined(HAVE_IPV6)#if defined(HAVE_BSD_NETWORK)
   if (family == AF_INET6)    if (family == AF_INET6)
     fd = socket(PF_INET6, SOCK_DGRAM, 0);      fd = socket(PF_INET6, SOCK_DGRAM, 0);
 #endif  #endif
Line 141  int iface_enumerate(int family, void *parm, int (*call Line 139  int iface_enumerate(int family, void *parm, int (*call
               struct in_addr addr, netmask, broadcast;                struct in_addr addr, netmask, broadcast;
               addr = ((struct sockaddr_in *) addrs->ifa_addr)->sin_addr;                addr = ((struct sockaddr_in *) addrs->ifa_addr)->sin_addr;
 #ifdef HAVE_BSD_NETWORK  #ifdef HAVE_BSD_NETWORK
              if (del_family == AF_INET && del_addr.addr.addr4.s_addr == addr.s_addr)              if (del_family == AF_INET && del_addr.addr4.s_addr == addr.s_addr)
                 continue;                  continue;
 #endif  #endif
               netmask = ((struct sockaddr_in *) addrs->ifa_netmask)->sin_addr;                netmask = ((struct sockaddr_in *) addrs->ifa_netmask)->sin_addr;
Line 152  int iface_enumerate(int family, void *parm, int (*call Line 150  int iface_enumerate(int family, void *parm, int (*call
               if (!((*callback)(addr, iface_index, NULL, netmask, broadcast, parm)))                if (!((*callback)(addr, iface_index, NULL, netmask, broadcast, parm)))
                 goto err;                  goto err;
             }              }
 #ifdef HAVE_IPV6  
           else if (family == AF_INET6)            else if (family == AF_INET6)
             {              {
               struct in6_addr *addr = &((struct sockaddr_in6 *) addrs->ifa_addr)->sin6_addr;                struct in6_addr *addr = &((struct sockaddr_in6 *) addrs->ifa_addr)->sin6_addr;
Line 162  int iface_enumerate(int family, void *parm, int (*call Line 159  int iface_enumerate(int family, void *parm, int (*call
               u32 valid = 0xffffffff, preferred = 0xffffffff;                u32 valid = 0xffffffff, preferred = 0xffffffff;
               int flags = 0;                int flags = 0;
 #ifdef HAVE_BSD_NETWORK  #ifdef HAVE_BSD_NETWORK
              if (del_family == AF_INET6 && IN6_ARE_ADDR_EQUAL(&del_addr.addr.addr6, addr))              if (del_family == AF_INET6 && IN6_ARE_ADDR_EQUAL(&del_addr.addr6, addr))
                 continue;                  continue;
 #endif  #endif
 #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)  #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
               struct in6_ifreq ifr6;                struct in6_ifreq ifr6;
   
               memset(&ifr6, 0, sizeof(ifr6));                memset(&ifr6, 0, sizeof(ifr6));
              strncpy(ifr6.ifr_name, addrs->ifa_name, sizeof(ifr6.ifr_name));              safe_strncpy(ifr6.ifr_name, addrs->ifa_name, sizeof(ifr6.ifr_name));
                               
               ifr6.ifr_addr = *((struct sockaddr_in6 *) addrs->ifa_addr);                ifr6.ifr_addr = *((struct sockaddr_in6 *) addrs->ifa_addr);
               if (fd != -1 && ioctl(fd, SIOCGIFAFLAG_IN6, &ifr6) != -1)                if (fd != -1 && ioctl(fd, SIOCGIFAFLAG_IN6, &ifr6) != -1)
Line 219  int iface_enumerate(int family, void *parm, int (*call Line 216  int iface_enumerate(int family, void *parm, int (*call
                                 (int) preferred, (int)valid, parm)))                                  (int) preferred, (int)valid, parm)))
                 goto err;                               goto err;             
             }              }
 #endif /* HAVE_IPV6 */  
   
 #ifdef HAVE_DHCP6        #ifdef HAVE_DHCP6      
           else if (family == AF_LINK)            else if (family == AF_LINK)
Line 237  int iface_enumerate(int family, void *parm, int (*call Line 233  int iface_enumerate(int family, void *parm, int (*call
   ret = 1;    ret = 1;
   
  err:   err:
  errsav = errno;  errsave = errno;
   freeifaddrs(head);     freeifaddrs(head); 
   if (fd != -1)    if (fd != -1)
     close(fd);      close(fd);
  errno = errsav;  errno = errsave;
   
   return ret;    return ret;
 }  }
Line 426  void route_sock(void) Line 422  void route_sock(void)
                {                 {
                  del_family = sa->sa_family;                   del_family = sa->sa_family;
                  if (del_family == AF_INET)                   if (del_family == AF_INET)
                   del_addr.addr.addr4 = ((struct sockaddr_in *)sa)->sin_addr;                   del_addr.addr4 = ((struct sockaddr_in *)sa)->sin_addr;
#ifdef HAVE_IPV6 
                  else if (del_family == AF_INET6)                   else if (del_family == AF_INET6)
                   del_addr.addr.addr6 = ((struct sockaddr_in6 *)sa)->sin6_addr;                   del_addr.addr6 = ((struct sockaddr_in6 *)sa)->sin6_addr;
#endif 
                  else                   else
                    del_family = 0;                     del_family = 0;
                }                 }

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>