restructured

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3219 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1997-08-28 01:28:07 +00:00
parent 0becc7408b
commit e2c0e660f2

View File

@@ -98,6 +98,7 @@ find_all_addresses (krb5_addresses *res, int loop)
struct ifconf ifconf; struct ifconf ifconf;
int num, j; int num, j;
char *p; char *p;
size_t sz;
fd = socket(AF_INET, SOCK_DGRAM, 0); fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) if (fd < 0)
@@ -117,7 +118,9 @@ find_all_addresses (krb5_addresses *res, int loop)
j = 0; j = 0;
ifreq.ifr_name[0] = '\0'; ifreq.ifr_name[0] = '\0';
for (p = ifconf.ifc_buf; p < ifconf.ifc_buf + ifconf.ifc_len;) { for (p = ifconf.ifc_buf;
p < ifconf.ifc_buf + ifconf.ifc_len;
p += sz) {
struct ifreq *ifr = (struct ifreq *)p; struct ifreq *ifr = (struct ifreq *)p;
/* This is somewhat kludgy, but it seems to work. */ /* This is somewhat kludgy, but it seems to work. */
@@ -127,40 +130,49 @@ find_all_addresses (krb5_addresses *res, int loop)
if(ifr->ifr_addr.sa_len) if(ifr->ifr_addr.sa_len)
sz = sizeof(ifr->ifr_name) + ifr->ifr_addr.sa_len; sz = sizeof(ifr->ifr_name) + ifr->ifr_addr.sa_len;
#endif #endif
if(strncmp(ifreq.ifr_name, ifr->ifr_name, sizeof(ifr->ifr_name)) if(strncmp(ifreq.ifr_name,
&& (loop || strncmp (ifr->ifr_name, "lo", 2))) { ifr->ifr_name,
if(ioctl(fd, SIOCGIFFLAGS, ifr) < 0) { sizeof(ifr->ifr_name)) == 0)
close (fd); continue;
free (res->val);
return errno; if(ioctl(fd, SIOCGIFFLAGS, ifr) < 0) {
} close (fd);
if (ifr->ifr_flags & IFF_UP) { free (res->val);
if(ioctl(fd, SIOCGIFADDR, ifr) < 0) { return errno;
close (fd); }
free (res->val);
return errno; if(!(ifr->ifr_flags & IFF_UP)
} || (loop && ifr->ifr_flags & IFF_LOOPBACK))
switch (ifr->ifr_addr.sa_family) { continue;
/*
* Get the address of the interface. If this fails, it's
* usually because this interface is up, but has no address
* configured. There might be some fatal errors for which
* we should bail out, but now we prefer ignoring them.
*/
if(ioctl(fd, SIOCGIFADDR, ifr) < 0)
continue;
switch (ifr->ifr_addr.sa_family) {
#ifdef AF_INET #ifdef AF_INET
case AF_INET: { case AF_INET: {
unsigned char addr[4]; unsigned char addr[4];
struct sockaddr_in *sin; struct sockaddr_in *sin;
res->val[j].addr_type = AF_INET; res->val[j].addr_type = AF_INET;
/* This is somewhat XXX */ /* This is somewhat XXX */
sin = (struct sockaddr_in*)&ifr->ifr_addr; sin = (struct sockaddr_in*)&ifr->ifr_addr;
memcpy(addr, memcpy(addr, &sin->sin_addr, 4);
&sin->sin_addr, err = krb5_data_copy(&res->val[j].address,
4); addr, 4);
err = krb5_data_copy(&res->val[j].address, if (err) {
addr, 4); close (fd);
if (err) { free (res->val);
close (fd); return ENOMEM;
free (res->val); }
return ENOMEM; ++j;
} break;
++j; }
break;
}
#endif /* AF_INET */ #endif /* AF_INET */
/* /*
@@ -168,27 +180,24 @@ find_all_addresses (krb5_addresses *res, int loop)
*/ */
#if defined(AF_INET6) && defined(HAVE_NETINET_IN6_H) #if defined(AF_INET6) && defined(HAVE_NETINET_IN6_H)
case AF_INET6: { case AF_INET6: {
res->val[j].addr_type = AF_INET6; res->val[j].addr_type = AF_INET6;
err = krb5_data_copy(&res->val[j].address, err = krb5_data_copy(&res->val[j].address,
&ifr->ifr_addr, &ifr->ifr_addr,
sizeof(struct sockaddr_in6)); sizeof(struct sockaddr_in6));
if (err) { if (err) {
close (fd); close (fd);
free (res->val); free (res->val);
return ENOMEM; return ENOMEM;
} }
++j; ++j;
break; break;
}
#endif /* AF_INET6 */
default:
break;
}
}
ifreq = *ifr;
} }
p = p + sz; #endif /* AF_INET6 */
default:
break;
}
ifreq = *ifr;
} }
close (fd); close (fd);
if (j != num) { if (j != num) {