#include <NetInfo/config.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <libc.h>
#include <unistd.h>
unsigned long sys_address(void)
{
struct ifconf ifc;
struct ifreq *ifr;
char buf[1024];
int offset, addrlen, extra, delta;
int sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) return (htonl(INADDR_LOOPBACK));
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0)
{
close(sock);
return (htonl(INADDR_LOOPBACK));
}
delta = sizeof(struct ifreq);
addrlen = delta - IFNAMSIZ;
extra = 0;
offset = 0;
while (offset <= ifc.ifc_len)
{
ifr = (struct ifreq *)(ifc.ifc_buf + offset);
#ifndef _NO_SOCKADDR_LENGTH_
extra = ifr->ifr_addr.sa_len - addrlen;
if (extra < 0) extra = 0;
#endif
offset = offset + delta + extra;
if (ifr->ifr_addr.sa_family != AF_INET) continue;
if (ioctl(sock, SIOCGIFFLAGS, ifr) < 0) continue;
if ((ifr->ifr_flags & IFF_UP) && (!(ifr->ifr_flags & IFF_LOOPBACK)))
{
close(sock);
return (((struct sockaddr_in *)&(ifr->ifr_addr))->sin_addr.s_addr);
}
}
close(sock);
return (htonl(INADDR_LOOPBACK));
}