Lines 404-409
update_ifinfo_nd_flags(struct ifinfo *ifi)
Link Here
|
404 |
return (0); |
404 |
return (0); |
405 |
} |
405 |
} |
406 |
|
406 |
|
|
|
407 |
#define MAX_SYSCTL_TRY 5 |
407 |
struct ifinfo * |
408 |
struct ifinfo * |
408 |
update_ifinfo(struct ifilist_head_t *ifi_head, int ifindex) |
409 |
update_ifinfo(struct ifilist_head_t *ifi_head, int ifindex) |
409 |
{ |
410 |
{ |
Lines 416-441
update_ifinfo(struct ifilist_head_t *ifi_head, int
Link Here
|
416 |
char *lim; |
417 |
char *lim; |
417 |
int mib[] = { CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_IFLIST, 0 }; |
418 |
int mib[] = { CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_IFLIST, 0 }; |
418 |
int error; |
419 |
int error; |
|
|
420 |
int ntry = 0; |
419 |
|
421 |
|
420 |
syslog(LOG_DEBUG, "<%s> enter", __func__); |
422 |
syslog(LOG_DEBUG, "<%s> enter", __func__); |
421 |
|
423 |
|
422 |
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), NULL, &len, NULL, 0) < |
424 |
do { |
423 |
0) { |
425 |
/* |
424 |
syslog(LOG_ERR, |
426 |
* We'll try to get addresses several times in case that |
425 |
"<%s> sysctl: NET_RT_IFLIST size get failed", __func__); |
427 |
* the number of addresses is unexpectedly increased during |
426 |
exit(1); |
428 |
* the two sysctl calls. This should rarely happen. |
427 |
} |
429 |
* Portability note: since FreeBSD does not add margin of |
428 |
if ((msg = malloc(len)) == NULL) { |
430 |
* memory at the first sysctl, the possibility of failure on |
429 |
syslog(LOG_ERR, "<%s> malloc failed", __func__); |
431 |
* the second sysctl call is a bit higher. |
430 |
exit(1); |
432 |
*/ |
431 |
} |
|
|
432 |
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), msg, &len, NULL, 0) < |
433 |
0) { |
434 |
syslog(LOG_ERR, |
435 |
"<%s> sysctl: NET_RT_IFLIST get failed", __func__); |
436 |
exit(1); |
437 |
} |
438 |
|
433 |
|
|
|
434 |
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), NULL, &len, NULL, |
435 |
0) < 0) { |
436 |
syslog(LOG_ERR, |
437 |
"<%s> sysctl: NET_RT_IFLIST size get failed", |
438 |
__func__); |
439 |
exit(1); |
440 |
} |
441 |
if ((msg = malloc(len)) == NULL) { |
442 |
syslog(LOG_ERR, "<%s> malloc failed", __func__); |
443 |
exit(1); |
444 |
} |
445 |
if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), msg, &len, NULL, |
446 |
0) < 0) { |
447 |
if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) { |
448 |
free(msg); |
449 |
syslog(LOG_ERR, |
450 |
"<%s> sysctl: NET_RT_IFLIST get failed", |
451 |
__func__); |
452 |
exit(1); |
453 |
} |
454 |
free(msg); |
455 |
msg = NULL; |
456 |
} |
457 |
} while (msg == NULL); |
458 |
|
439 |
lim = msg + len; |
459 |
lim = msg + len; |
440 |
for (ifm = (struct if_msghdr *)msg; |
460 |
for (ifm = (struct if_msghdr *)msg; |
441 |
ifm != NULL && ifm < (struct if_msghdr *)lim; |
461 |
ifm != NULL && ifm < (struct if_msghdr *)lim; |