From 7d0b64505a4bff4e9a3743dd966e70797fc39457 Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Mon, 3 Apr 2006 15:03:43 +0000 Subject: [PATCH] Added getifaddrs() --- lib/ip/Makefile.in | 1 + lib/ip/getifaddrs.c | 71 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 lib/ip/getifaddrs.c diff --git a/lib/ip/Makefile.in b/lib/ip/Makefile.in index 0e8119153..784b8fe29 100644 --- a/lib/ip/Makefile.in +++ b/lib/ip/Makefile.in @@ -22,6 +22,7 @@ libc_FILES=" \ gethnmadr.c \ gethostent.c \ gethostname.c \ + getifaddrs.c \ getnetbyaddr.c \ getnetbyname.c \ getnetent.c \ diff --git a/lib/ip/getifaddrs.c b/lib/ip/getifaddrs.c new file mode 100644 index 000000000..15dd13b54 --- /dev/null +++ b/lib/ip/getifaddrs.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +int +getifaddrs(struct ifaddrs **ifap) +{ + static int fd = -1; + nwio_ipconf_t ipconf; + int flags, err, r; + static struct ifaddrs ifa; + static struct sockaddr_in addr, netmask; + + memset(&ifa, 0, sizeof(ifa)); + memset(&addr, 0, sizeof(addr)); + memset(&netmask, 0, sizeof(netmask)); + ifa.ifa_next = NULL; + ifa.ifa_name = "ip"; + addr.sin_family = netmask.sin_family = AF_INET; + ifa.ifa_addr = (struct sockaddr *) &addr; + ifa.ifa_netmask = (struct sockaddr *) &netmask; + addr.sin_addr.s_addr = 0; + netmask.sin_addr.s_addr = 0; + + if(fd < 0) { + char *ipd; + if(!(ipd=getenv("IP_DEVICE"))) + ipd="/dev/ip"; + if((fd = open(ipd, O_RDWR)) < 0) + return -1; + } + + /* Code taken from commands/simple/ifconfig.c. */ + + if((flags = fcntl(fd, F_GETFL)) < 0 || + fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0 || + ioctl(fd, NWIOGIPCONF, &ipconf)) + return 0; /* Report interface as down. */ + + addr.sin_addr.s_addr = ipconf.nwic_ipaddr; + netmask.sin_addr.s_addr = ipconf.nwic_netmask; + if(addr.sin_addr.s_addr) ifa.ifa_flags = IFF_UP; + + /* Just report on this interface. */ + + *ifap = &ifa; + + return 0; +} + +void +freeifaddrs(struct ifaddrs *ifp) +{ + /* getifaddrs points to static data, so no need to free. */ + ; +} +