* 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.
struct LIFREQ lifreq;
int family;
char strbuf[ISC_STRERRORSIZE];
+ int fd;
REQUIRE(VALID_IFITER(iter));
REQUIRE (iter->pos < (unsigned int) iter->lifc.lifc_len);
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);
}
* 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__,
"%s: getting "
"destination address: %s"),
lifreq.lifr_name, strbuf);
+ close(fd);
return (ISC_R_IGNORE);
}
get_addr(family, &iter->current.dstaddress,
* 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__,
ISC_MSG_GETNETMASK,
"%s: getting netmask: %s"),
lifreq.lifr_name, strbuf);
+ close(fd);
return (ISC_R_IGNORE);
}
get_addr(family, &iter->current.netmask,
}
}
+ close(fd);
return (ISC_R_SUCCESS);
#endif
}