Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 945183
Collapse All | Expand All

(-)dnsmasq.h.orig (-1 / +7 lines)
Lines 1659-1665 Link Here
1659
#endif
1659
#endif
1660
1660
1661
/* bpf.c or netlink.c */
1661
/* bpf.c or netlink.c */
1662
int iface_enumerate(int family, void *parm, int (callback)());
1662
typedef union {
1663
	int (*af_unspec)(int family, char *addrp, char *mac, size_t maclen, void *parmv);
1664
	int (*af_inet)(struct in_addr local, int if_index, char *label, struct in_addr netmask, struct in_addr broadcast, void *vparam);
1665
	int (*af_inet6)(struct in6_addr *local, int prefix, int scope, int if_index, int flags, unsigned int preferred, unsigned int valid, void *vparam);
1666
	int (*af_local)(int index, unsigned int type, char *mac, size_t maclen, void *parm);
1667
} callback_t;
1668
int iface_enumerate(int family, void *parm, callback_t callback);
1663
1669
1664
/* dbus.c */
1670
/* dbus.c */
1665
#ifdef HAVE_DBUS
1671
#ifdef HAVE_DBUS
(-)arp.c.orig (-1 / +1 lines)
Lines 152-158 Link Here
152
	 if (arp->status != ARP_EMPTY)
152
	 if (arp->status != ARP_EMPTY)
153
	   arp->status = ARP_MARK;
153
	   arp->status = ARP_MARK;
154
       
154
       
155
       iface_enumerate(AF_UNSPEC, NULL, filter_mac);
155
       iface_enumerate(AF_UNSPEC, NULL, (callback_t){.af_unspec=filter_mac});
156
       
156
       
157
       /* Remove all unconfirmed entries to old list. */
157
       /* Remove all unconfirmed entries to old list. */
158
       for (arp = arps, up = &arps; arp; arp = tmp)
158
       for (arp = arps, up = &arps; arp; arp = tmp)
(-)bpf.c.orig (-7 / +7 lines)
Lines 47-53 Link Here
47
47
48
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
48
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
49
49
50
int arp_enumerate(void *parm, int (*callback)())
50
int arp_enumerate(void *parm, callback_t callback)
51
{
51
{
52
  int mib[6];
52
  int mib[6];
53
  size_t needed;
53
  size_t needed;
Lines 91-97 Link Here
91
      rtm = (struct rt_msghdr *)next;
91
      rtm = (struct rt_msghdr *)next;
92
      sin2 = (struct sockaddr_inarp *)(rtm + 1);
92
      sin2 = (struct sockaddr_inarp *)(rtm + 1);
93
      sdl = (struct sockaddr_dl *)((char *)sin2 + SA_SIZE(sin2));
93
      sdl = (struct sockaddr_dl *)((char *)sin2 + SA_SIZE(sin2));
94
      if (!(*callback)(AF_INET, &sin2->sin_addr, LLADDR(sdl), sdl->sdl_alen, parm))
94
      if (!callback.af_unspec(AF_INET, &sin2->sin_addr, LLADDR(sdl), sdl->sdl_alen, parm))
95
	return 0;
95
	return 0;
96
    }
96
    }
97
97
Lines 107-113 Link Here
107
107
108
  if (family == AF_UNSPEC)
108
  if (family == AF_UNSPEC)
109
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
109
#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
110
    return  arp_enumerate(parm, callback);
110
    return  arp_enumerate(parm, callback.af_unspec);
111
#else
111
#else
112
  return 0; /* need code for Solaris and MacOS*/
112
  return 0; /* need code for Solaris and MacOS*/
113
#endif
113
#endif
Lines 147-153 Link Here
147
		broadcast = ((struct sockaddr_in *) addrs->ifa_broadaddr)->sin_addr; 
147
		broadcast = ((struct sockaddr_in *) addrs->ifa_broadaddr)->sin_addr; 
148
	      else 
148
	      else 
149
		broadcast.s_addr = 0;	      
149
		broadcast.s_addr = 0;	      
150
	      if (!((*callback)(addr, iface_index, NULL, netmask, broadcast, parm)))
150
	      if (!callback.af_inet(addr, iface_index, NULL, netmask, broadcast, parm))
151
		goto err;
151
		goto err;
152
	    }
152
	    }
153
	  else if (family == AF_INET6)
153
	  else if (family == AF_INET6)
Lines 212-219 Link Here
212
		  addr->s6_addr[3] = 0;
212
		  addr->s6_addr[3] = 0;
213
		} 
213
		} 
214
	     
214
	     
215
	      if (!((*callback)(addr, prefix, scope_id, iface_index, flags,
215
	      if (!callback.af_inet6(addr, prefix, scope_id, iface_index, flags,
216
				(int) preferred, (int)valid, parm)))
216
				(unsigned int) preferred, (unsigned int)valid, parm))
217
		goto err;	      
217
		goto err;	      
218
	    }
218
	    }
219
219
Lines 223-229 Link Here
223
	      /* Assume ethernet again here */
223
	      /* Assume ethernet again here */
224
	      struct sockaddr_dl *sdl = (struct sockaddr_dl *) addrs->ifa_addr;
224
	      struct sockaddr_dl *sdl = (struct sockaddr_dl *) addrs->ifa_addr;
225
	      if (sdl->sdl_alen != 0 && 
225
	      if (sdl->sdl_alen != 0 && 
226
		  !((*callback)(iface_index, ARPHRD_ETHER, LLADDR(sdl), sdl->sdl_alen, parm)))
226
		  !callback.af_local(iface_index, ARPHRD_ETHER, LLADDR(sdl), sdl->sdl_alen, parm))
227
		goto err;
227
		goto err;
228
	    }
228
	    }
229
#endif 
229
#endif 
(-)dhcp.c.orig (-2 / +2 lines)
Lines 317-323 Link Here
317
	  match.ind = iface_index;
317
	  match.ind = iface_index;
318
	  
318
	  
319
	  if (!daemon->if_addrs ||
319
	  if (!daemon->if_addrs ||
320
	      !iface_enumerate(AF_INET, &match, check_listen_addrs) ||
320
	      !iface_enumerate(AF_INET, &match, (callback_t){.af_inet=check_listen_addrs}) ||
321
	      !match.matched)
321
	      !match.matched)
322
	    return;
322
	    return;
323
	  
323
	  
Lines 330-336 Link Here
330
      if (relay_upstream4(iface_index, mess, (size_t)sz))
330
      if (relay_upstream4(iface_index, mess, (size_t)sz))
331
	return;
331
	return;
332
      
332
      
333
      if (!iface_enumerate(AF_INET, &parm, complete_context))
333
      if (!iface_enumerate(AF_INET, &parm, (callback_t){.af_inet=complete_context}))
334
	return;
334
	return;
335
335
336
      /* Check for a relay again after iface_enumerate/complete_context has had
336
      /* Check for a relay again after iface_enumerate/complete_context has had
(-)dhcp6.c.orig (-4 / +4 lines)
Lines 239-245 Link Here
239
	  relay_upstream6(if_index, (size_t)sz, &from.sin6_addr, from.sin6_scope_id, now))
239
	  relay_upstream6(if_index, (size_t)sz, &from.sin6_addr, from.sin6_scope_id, now))
240
	return;
240
	return;
241
      
241
      
242
      if (!iface_enumerate(AF_INET6, &parm, complete_context6))
242
      if (!iface_enumerate(AF_INET6, &parm, (callback_t){.af_inet6=complete_context6}))
243
	return;
243
	return;
244
      
244
      
245
      /* Check for a relay again after iface_enumerate/complete_context has had
245
      /* Check for a relay again after iface_enumerate/complete_context has had
Lines 617-623 Link Here
617
	newnow = now - 946684800;
617
	newnow = now - 946684800;
618
#endif      
618
#endif      
619
      
619
      
620
      iface_enumerate(AF_LOCAL, &newnow, make_duid1);
620
      iface_enumerate(AF_LOCAL, &newnow, (callback_t){.af_local=make_duid1});
621
      
621
      
622
      if(!daemon->duid)
622
      if(!daemon->duid)
623
	die("Cannot create DHCPv6 server DUID: %s", NULL, EC_MISC);
623
	die("Cannot create DHCPv6 server DUID: %s", NULL, EC_MISC);
Lines 667-673 Link Here
667
667
668
static int construct_worker(struct in6_addr *local, int prefix, 
668
static int construct_worker(struct in6_addr *local, int prefix, 
669
			    int scope, int if_index, int flags, 
669
			    int scope, int if_index, int flags, 
670
			    int preferred, int valid, void *vparam)
670
			    unsigned int preferred, unsigned int valid, void *vparam)
671
{
671
{
672
  char ifrn_name[IFNAMSIZ];
672
  char ifrn_name[IFNAMSIZ];
673
  struct in6_addr start6, end6;
673
  struct in6_addr start6, end6;
Lines 801-807 Link Here
801
    if (context->flags & CONTEXT_CONSTRUCTED)
801
    if (context->flags & CONTEXT_CONSTRUCTED)
802
      context->flags |= CONTEXT_GC;
802
      context->flags |= CONTEXT_GC;
803
   
803
   
804
  iface_enumerate(AF_INET6, &param, construct_worker);
804
  iface_enumerate(AF_INET6, &param, (callback_t){.af_inet6=construct_worker});
805
805
806
  for (up = &daemon->dhcp6, context = daemon->dhcp6; context; context = tmp)
806
  for (up = &daemon->dhcp6, context = daemon->dhcp6; context; context = tmp)
807
    {
807
    {
(-)lease.c.orig (-3 / +3 lines)
Lines 407-413 Link Here
407
#ifdef HAVE_DHCP6
407
#ifdef HAVE_DHCP6
408
static int find_interface_v6(struct in6_addr *local,  int prefix,
408
static int find_interface_v6(struct in6_addr *local,  int prefix,
409
			     int scope, int if_index, int flags, 
409
			     int scope, int if_index, int flags, 
410
			     int preferred, int valid, void *vparam)
410
			     unsigned int preferred, unsigned int valid, void *vparam)
411
{
411
{
412
  struct dhcp_lease *lease;
412
  struct dhcp_lease *lease;
413
413
Lines 464-472 Link Here
464
  for (lease = leases; lease; lease = lease->next)
464
  for (lease = leases; lease; lease = lease->next)
465
    lease->new_prefixlen = lease->new_interface = 0;
465
    lease->new_prefixlen = lease->new_interface = 0;
466
466
467
  iface_enumerate(AF_INET, &now, find_interface_v4);
467
  iface_enumerate(AF_INET, &now, (callback_t){.af_inet=find_interface_v4});
468
#ifdef HAVE_DHCP6
468
#ifdef HAVE_DHCP6
469
  iface_enumerate(AF_INET6, &now, find_interface_v6);
469
  iface_enumerate(AF_INET6, &now, (callback_t){.af_inet6=find_interface_v6});
470
#endif
470
#endif
471
471
472
  for (lease = leases; lease; lease = lease->next)
472
  for (lease = leases; lease; lease = lease->next)
(-)netlink.c.orig (-6 / +6 lines)
Lines 151-157 Link Here
151
   family = AF_LOCAL finds MAC addresses.
151
   family = AF_LOCAL finds MAC addresses.
152
   returns 0 on failure, 1 on success, -1 when restart is required
152
   returns 0 on failure, 1 on success, -1 when restart is required
153
*/
153
*/
154
int iface_enumerate(int family, void *parm, int (*callback)())
154
int iface_enumerate(int family, void *parm, callback_t callback)
155
{
155
{
156
  struct sockaddr_nl addr;
156
  struct sockaddr_nl addr;
157
  struct nlmsghdr *h;
157
  struct nlmsghdr *h;
Lines 247-253 Link Here
247
		      }
247
		      }
248
		    
248
		    
249
		    if (addr.s_addr && callback_ok)
249
		    if (addr.s_addr && callback_ok)
250
		      if (!((*callback)(addr, ifa->ifa_index, label,  netmask, broadcast, parm)))
250
		      if (!callback.af_inet(addr, ifa->ifa_index, label,  netmask, broadcast, parm))
251
			callback_ok = 0;
251
			callback_ok = 0;
252
		  }
252
		  }
253
		else if (ifa->ifa_family == AF_INET6)
253
		else if (ifa->ifa_family == AF_INET6)
Lines 288-296 Link Here
288
		      flags |= IFACE_PERMANENT;
288
		      flags |= IFACE_PERMANENT;
289
    		    
289
    		    
290
		    if (addrp && callback_ok)
290
		    if (addrp && callback_ok)
291
		      if (!((*callback)(addrp, (int)(ifa->ifa_prefixlen), (int)(ifa->ifa_scope), 
291
		      if (!callback.af_inet6(addrp, (int)(ifa->ifa_prefixlen), (int)(ifa->ifa_scope), 
292
					(int)(ifa->ifa_index), flags, 
292
					(int)(ifa->ifa_index), flags, 
293
					(int) preferred, (int)valid, parm)))
293
					(unsigned int)preferred, (unsigned int)valid, parm))
294
			callback_ok = 0;
294
			callback_ok = 0;
295
		  }
295
		  }
296
	      }
296
	      }
Lines 318-324 Link Here
318
318
319
	    if (!(neigh->ndm_state & (NUD_NOARP | NUD_INCOMPLETE | NUD_FAILED)) &&
319
	    if (!(neigh->ndm_state & (NUD_NOARP | NUD_INCOMPLETE | NUD_FAILED)) &&
320
		inaddr && mac && callback_ok)
320
		inaddr && mac && callback_ok)
321
	      if (!((*callback)(neigh->ndm_family, inaddr, mac, maclen, parm)))
321
	      if (!callback.af_unspec(neigh->ndm_family, inaddr, mac, maclen, parm))
322
		callback_ok = 0;
322
		callback_ok = 0;
323
	  }
323
	  }
324
#ifdef HAVE_DHCP6
324
#ifdef HAVE_DHCP6
Lines 342-348 Link Here
342
	      }
342
	      }
343
343
344
	    if (mac && callback_ok && !((link->ifi_flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) && 
344
	    if (mac && callback_ok && !((link->ifi_flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) && 
345
		!((*callback)((int)link->ifi_index, (unsigned int)link->ifi_type, mac, maclen, parm)))
345
		!callback.af_local((int)link->ifi_index, (unsigned int)link->ifi_type, mac, maclen, parm))
346
	      callback_ok = 0;
346
	      callback_ok = 0;
347
	  }
347
	  }
348
#endif
348
#endif
(-)network.c.orig (-3 / +3 lines)
Lines 596-602 Link Here
596
596
597
static int iface_allowed_v6(struct in6_addr *local, int prefix, 
597
static int iface_allowed_v6(struct in6_addr *local, int prefix, 
598
			    int scope, int if_index, int flags, 
598
			    int scope, int if_index, int flags, 
599
			    int preferred, int valid, void *vparam)
599
			    unsigned int preferred, unsigned int valid, void *vparam)
600
{
600
{
601
  union mysockaddr addr;
601
  union mysockaddr addr;
602
  struct in_addr netmask; /* dummy */
602
  struct in_addr netmask; /* dummy */
Lines 833-844 Link Here
833
833
834
  param.spare = spare;
834
  param.spare = spare;
835
  
835
  
836
  ret = iface_enumerate(AF_INET6, &param, iface_allowed_v6);
836
  ret = iface_enumerate(AF_INET6, &param, (callback_t){.af_inet6=iface_allowed_v6});
837
  if (ret < 0)
837
  if (ret < 0)
838
    goto again;
838
    goto again;
839
  else if (ret)
839
  else if (ret)
840
    {
840
    {
841
      ret = iface_enumerate(AF_INET, &param, iface_allowed_v4);
841
      ret = iface_enumerate(AF_INET, &param, (callback_t){.af_inet=iface_allowed_v4});
842
      if (ret < 0)
842
      if (ret < 0)
843
	goto again;
843
	goto again;
844
    }
844
    }
(-)radv.c.orig (-7 / +7 lines)
Lines 58-64 Link Here
58
			unsigned int preferred, unsigned int valid, void *vparam);
58
			unsigned int preferred, unsigned int valid, void *vparam);
59
static int iface_search(struct in6_addr *local,  int prefix,
59
static int iface_search(struct in6_addr *local,  int prefix,
60
			int scope, int if_index, int flags, 
60
			int scope, int if_index, int flags, 
61
			int prefered, int valid, void *vparam);
61
			unsigned int prefered, unsigned int valid, void *vparam);
62
static int add_lla(int index, unsigned int type, char *mac, size_t maclen, void *parm);
62
static int add_lla(int index, unsigned int type, char *mac, size_t maclen, void *parm);
63
static void new_timeout(struct dhcp_context *context, char *iface_name, time_t now);
63
static void new_timeout(struct dhcp_context *context, char *iface_name, time_t now);
64
static unsigned int calc_lifetime(struct ra_interface *ra);
64
static unsigned int calc_lifetime(struct ra_interface *ra);
Lines 307-313 Link Here
307
307
308
  /* If no link-local address then we can't advertise since source address of
308
  /* If no link-local address then we can't advertise since source address of
309
     advertisement must be link local address: RFC 4861 para 6.1.2. */
309
     advertisement must be link local address: RFC 4861 para 6.1.2. */
310
  if (!iface_enumerate(AF_INET6, &parm, add_prefixes) ||
310
  if (!iface_enumerate(AF_INET6, &parm, (callback_t){.af_inet6=add_prefixes}) ||
311
      parm.link_pref_time == 0)
311
      parm.link_pref_time == 0)
312
    return;
312
    return;
313
313
Lines 449-455 Link Here
449
      put_opt6_long(mtu);
449
      put_opt6_long(mtu);
450
    }
450
    }
451
     
451
     
452
  iface_enumerate(AF_LOCAL, &send_iface, add_lla);
452
  iface_enumerate(AF_LOCAL, &send_iface, (callback_t){.af_local=add_lla});
453
 
453
 
454
  /* RDNSS, RFC 6106, use relevant DHCP6 options */
454
  /* RDNSS, RFC 6106, use relevant DHCP6 options */
455
  (void)option_filter(parm.tags, NULL, daemon->dhcp_opts6);
455
  (void)option_filter(parm.tags, NULL, daemon->dhcp_opts6);
Lines 823-829 Link Here
823
	  param.iface = context->if_index;
823
	  param.iface = context->if_index;
824
	  new_timeout(context, param.name, now);
824
	  new_timeout(context, param.name, now);
825
	}
825
	}
826
      else if (iface_enumerate(AF_INET6, &param, iface_search))
826
      else if (iface_enumerate(AF_INET6, &param, (callback_t){.af_inet6=iface_search}))
827
	/* There's a context overdue, but we can't find an interface
827
	/* There's a context overdue, but we can't find an interface
828
	   associated with it, because it's for a subnet we dont 
828
	   associated with it, because it's for a subnet we dont 
829
	   have an interface on. Probably we're doing DHCP on
829
	   have an interface on. Probably we're doing DHCP on
Lines 856-862 Link Here
856
                    aparam.iface = param.iface;
856
                    aparam.iface = param.iface;
857
                    aparam.alias_ifs = NULL;
857
                    aparam.alias_ifs = NULL;
858
                    aparam.num_alias_ifs = 0;
858
                    aparam.num_alias_ifs = 0;
859
                    iface_enumerate(AF_LOCAL, &aparam, send_ra_to_aliases);
859
                    iface_enumerate(AF_LOCAL, &aparam, (callback_t){.af_local=send_ra_to_aliases});
860
                    my_syslog(MS_DHCP | LOG_INFO, "RTR-ADVERT(%s) %s => %d alias(es)",
860
                    my_syslog(MS_DHCP | LOG_INFO, "RTR-ADVERT(%s) %s => %d alias(es)",
861
                              param.name, daemon->addrbuff, aparam.num_alias_ifs);
861
                              param.name, daemon->addrbuff, aparam.num_alias_ifs);
862
862
Lines 871-877 Link Here
871
                           those. */
871
                           those. */
872
                        aparam.max_alias_ifs = aparam.num_alias_ifs;
872
                        aparam.max_alias_ifs = aparam.num_alias_ifs;
873
                        aparam.num_alias_ifs = 0;
873
                        aparam.num_alias_ifs = 0;
874
                        iface_enumerate(AF_LOCAL, &aparam, send_ra_to_aliases);
874
                        iface_enumerate(AF_LOCAL, &aparam, (callback_t){.af_local=send_ra_to_aliases});
875
                        for (; aparam.num_alias_ifs; aparam.num_alias_ifs--)
875
                        for (; aparam.num_alias_ifs; aparam.num_alias_ifs--)
876
                          {
876
                          {
877
                            my_syslog(MS_DHCP | LOG_INFO, "RTR-ADVERT(%s) %s => i/f %d",
877
                            my_syslog(MS_DHCP | LOG_INFO, "RTR-ADVERT(%s) %s => i/f %d",
Lines 920-926 Link Here
920
920
921
static int iface_search(struct in6_addr *local,  int prefix,
921
static int iface_search(struct in6_addr *local,  int prefix,
922
			int scope, int if_index, int flags, 
922
			int scope, int if_index, int flags, 
923
			int preferred, int valid, void *vparam)
923
			unsigned int preferred, unsigned int valid, void *vparam)
924
{
924
{
925
  struct search_param *param = vparam;
925
  struct search_param *param = vparam;
926
  struct dhcp_context *context;
926
  struct dhcp_context *context;

Return to bug 945183