]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
use family specific socket to lookup interface flags, etc.
authorMark Andrews <marka@isc.org>
Mon, 28 Oct 2002 06:12:13 +0000 (06:12 +0000)
committerMark Andrews <marka@isc.org>
Mon, 28 Oct 2002 06:12:13 +0000 (06:12 +0000)
lib/isc/unix/ifiter_ioctl.c

index 43b5e603c0020d5f672bc1f32978c2f68f3953d3..91beb830a461339711698116f6860d92d1c93d6f 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: ifiter_ioctl.c,v 1.34 2002/08/16 00:05:57 marka Exp $ */
+/* $Id: ifiter_ioctl.c,v 1.35 2002/10/28 06:12:13 marka Exp $ */
 
 /*
  * Obtain the list of network interfaces using the SIOCGLIFCONF ioctl.
@@ -549,6 +549,7 @@ internal_current6(isc_interfaceiter_t *iter) {
        struct LIFREQ lifreq;
        int family;
        char strbuf[ISC_STRERRORSIZE];
+       int fd;
 
        REQUIRE(VALID_IFITER(iter));
        REQUIRE (iter->pos < (unsigned int) iter->lifc.lifc_len);
@@ -597,16 +598,26 @@ internal_current6(isc_interfaceiter_t *iter) {
 
        iter->current.flags = 0;
 
+       fd = socket(family, SOCK_DGRAM, 0);
+       if (fd < 0) {
+               isc__strerror(errno, strbuf, sizeof(strbuf));
+               UNEXPECTED_ERROR(__FILE__, __LINE__,
+                                "%s: socket: %s",
+                                lifreq.lifr_name, strbuf);
+               return (ISC_R_IGNORE);
+       }
+
        /*
         * Ignore the HP/UX warning about "interger overflow during
         * conversion.  It comes from its own macro definition,
         * and is really hard to shut up.
         */
-       if (ioctl(iter->socket, SIOCGLIFFLAGS, (char *) &lifreq) < 0) {
+       if (ioctl(fd, SIOCGLIFFLAGS, (char *) &lifreq) < 0) {
                isc__strerror(errno, strbuf, sizeof(strbuf));
                UNEXPECTED_ERROR(__FILE__, __LINE__,
                                 "%s: getting interface flags: %s",
                                 lifreq.lifr_name, strbuf);
+               close(fd);
                return (ISC_R_IGNORE);
        }
 
@@ -628,7 +639,7 @@ internal_current6(isc_interfaceiter_t *iter) {
                 * conversion.  It comes from its own macro definition,
                 * and is really hard to shut up.
                 */
-               if (ioctl(iter->socket, SIOCGLIFDSTADDR, (char *)&lifreq)
+               if (ioctl(fd, SIOCGLIFDSTADDR, (char *)&lifreq)
                    < 0) {
                        isc__strerror(errno, strbuf, sizeof(strbuf));
                        UNEXPECTED_ERROR(__FILE__, __LINE__,
@@ -638,6 +649,7 @@ internal_current6(isc_interfaceiter_t *iter) {
                                               "%s: getting "
                                               "destination address: %s"),
                                         lifreq.lifr_name, strbuf);
+                       close(fd);
                        return (ISC_R_IGNORE);
                }
                get_addr(family, &iter->current.dstaddress,
@@ -656,7 +668,7 @@ internal_current6(isc_interfaceiter_t *iter) {
                 * conversion.  It comes from its own macro definition,
                 * and is really hard to shut up.
                 */
-               if (ioctl(iter->socket, SIOCGLIFNETMASK, (char *)&lifreq)
+               if (ioctl(fd, SIOCGLIFNETMASK, (char *)&lifreq)
                    < 0) {
                        isc__strerror(errno, strbuf, sizeof(strbuf));
                        UNEXPECTED_ERROR(__FILE__, __LINE__,
@@ -665,6 +677,7 @@ internal_current6(isc_interfaceiter_t *iter) {
                                               ISC_MSG_GETNETMASK,
                                               "%s: getting netmask: %s"),
                                         lifreq.lifr_name, strbuf);
+                       close(fd);
                        return (ISC_R_IGNORE);
                }
                get_addr(family, &iter->current.netmask,
@@ -689,6 +702,7 @@ internal_current6(isc_interfaceiter_t *iter) {
        }
        }
 
+       close(fd);
        return (ISC_R_SUCCESS);
 #endif
 }