diff options
Diffstat (limited to 'lib/isc/unix/ifiter_getifaddrs.c')
-rw-r--r-- | lib/isc/unix/ifiter_getifaddrs.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/lib/isc/unix/ifiter_getifaddrs.c b/lib/isc/unix/ifiter_getifaddrs.c index ba04b447efe3..547a83f07937 100644 --- a/lib/isc/unix/ifiter_getifaddrs.c +++ b/lib/isc/unix/ifiter_getifaddrs.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ifiter_getifaddrs.c,v 1.11 2008/03/20 23:47:00 tbox Exp $ */ +/* $Id: ifiter_getifaddrs.c,v 1.13 2009/09/24 23:48:13 tbox Exp $ */ /*! \file * \brief @@ -55,6 +55,7 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { isc_interfaceiter_t *iter; isc_result_t result; char strbuf[ISC_STRERRORSIZE]; + int trys, ret; REQUIRE(mctx != NULL); REQUIRE(iterp != NULL); @@ -73,22 +74,31 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) { * Only open "/proc/net/if_inet6" if we have never seen a IPv6 * address returned by getifaddrs(). */ - if (!seenv6) + if (!seenv6) { iter->proc = fopen("/proc/net/if_inet6", "r"); - else + if (iter->proc == NULL) { + isc__strerror(errno, strbuf, sizeof(strbuf)); + isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, + ISC_LOGMODULE_SOCKET, ISC_LOG_WARNING, + "failed to open /proc/net/if_inet6"); + } + } else iter->proc = NULL; iter->valid = ISC_R_FAILURE; #endif - if (getifaddrs(&iter->ifaddrs) < 0) { + /* If interrupted, try again */ + for (trys = 0; trys < 3; trys++) { + if ((ret = getifaddrs(&iter->ifaddrs)) >= 0) + break; + if (errno != EINTR) + break; + } + if (ret < 0) { isc__strerror(errno, strbuf, sizeof(strbuf)); - UNEXPECTED_ERROR(__FILE__, __LINE__, - isc_msgcat_get(isc_msgcat, - ISC_MSGSET_IFITERGETIFADDRS, - ISC_MSG_GETIFADDRS, - "getting interface " - "addresses: getifaddrs: %s"), - strbuf); + UNEXPECTED_ERROR(__FILE__, __LINE__, isc_msgcat_get(isc_msgcat, + ISC_MSGSET_IFITERGETIFADDRS, ISC_MSG_GETIFADDRS, + "getting interface addresses: getifaddrs: %s"), strbuf); result = ISC_R_UNEXPECTED; goto failure; } |