[9] | 1 | #include <errno.h>
|
---|
| 2 | #include <stdio.h>
|
---|
| 3 | #include <string.h>
|
---|
| 4 | #include <stdlib.h>
|
---|
| 5 | #include <fcntl.h>
|
---|
| 6 | #include <ifaddrs.h>
|
---|
| 7 | #include <sys/ioctl.h>
|
---|
| 8 | #include <sys/socket.h>
|
---|
| 9 | #include <sys/types.h>
|
---|
| 10 | #include <netinet/in.h>
|
---|
| 11 |
|
---|
| 12 | #include <net/gen/in.h>
|
---|
| 13 | #include <net/gen/ip_io.h>
|
---|
| 14 | #include <net/gen/tcp.h>
|
---|
| 15 | #include <net/gen/tcp_io.h>
|
---|
| 16 | #include <net/gen/udp.h>
|
---|
| 17 | #include <net/gen/udp_io.h>
|
---|
| 18 |
|
---|
| 19 | int
|
---|
| 20 | getifaddrs(struct ifaddrs **ifap)
|
---|
| 21 | {
|
---|
| 22 | static int fd = -1;
|
---|
| 23 | nwio_ipconf_t ipconf;
|
---|
| 24 | int flags, err, r;
|
---|
| 25 | static struct ifaddrs ifa;
|
---|
| 26 | static struct sockaddr_in addr, netmask;
|
---|
| 27 |
|
---|
| 28 | memset(&ifa, 0, sizeof(ifa));
|
---|
| 29 | memset(&addr, 0, sizeof(addr));
|
---|
| 30 | memset(&netmask, 0, sizeof(netmask));
|
---|
| 31 | ifa.ifa_next = NULL;
|
---|
| 32 | ifa.ifa_name = "ip";
|
---|
| 33 | addr.sin_family = netmask.sin_family = AF_INET;
|
---|
| 34 | ifa.ifa_addr = (struct sockaddr *) &addr;
|
---|
| 35 | ifa.ifa_netmask = (struct sockaddr *) &netmask;
|
---|
| 36 | addr.sin_addr.s_addr = 0;
|
---|
| 37 | netmask.sin_addr.s_addr = 0;
|
---|
| 38 |
|
---|
| 39 | if(fd < 0) {
|
---|
| 40 | char *ipd;
|
---|
| 41 | if(!(ipd=getenv("IP_DEVICE")))
|
---|
| 42 | ipd="/dev/ip";
|
---|
| 43 | if((fd = open(ipd, O_RDWR)) < 0)
|
---|
| 44 | return -1;
|
---|
| 45 | }
|
---|
| 46 |
|
---|
| 47 | /* Code taken from commands/simple/ifconfig.c. */
|
---|
| 48 |
|
---|
| 49 | if((flags = fcntl(fd, F_GETFL)) < 0 ||
|
---|
| 50 | fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0 ||
|
---|
| 51 | ioctl(fd, NWIOGIPCONF, &ipconf))
|
---|
| 52 | return 0; /* Report interface as down. */
|
---|
| 53 |
|
---|
| 54 | addr.sin_addr.s_addr = ipconf.nwic_ipaddr;
|
---|
| 55 | netmask.sin_addr.s_addr = ipconf.nwic_netmask;
|
---|
| 56 | if(addr.sin_addr.s_addr) ifa.ifa_flags = IFF_UP;
|
---|
| 57 |
|
---|
| 58 | /* Just report on this interface. */
|
---|
| 59 |
|
---|
| 60 | *ifap = &ifa;
|
---|
| 61 |
|
---|
| 62 | return 0;
|
---|
| 63 | }
|
---|
| 64 |
|
---|
| 65 | void
|
---|
| 66 | freeifaddrs(struct ifaddrs *ifp)
|
---|
| 67 | {
|
---|
| 68 | /* getifaddrs points to static data, so no need to free. */
|
---|
| 69 | ;
|
---|
| 70 | }
|
---|
| 71 |
|
---|