-static unsigned long
-sys_netmask(void)
-{
- struct ifconf ifc;
- struct ifreq *ifr;
- char buf[1024]; /* XXX */
- int i, len, ifreq_size, offset, sockaddr_size, size;
- int sock;
- struct sockaddr_in *sin;
- unsigned long n_addr;
-
- sock = socket(AF_INET, SOCK_DGRAM, 0);
-
- if (sock < 0) return (htonl(IN_CLASSA_NET));
-
- ifc.ifc_len = sizeof(buf);
- ifc.ifc_buf = buf;
-
- if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0)
- {
- close(sock);
- return (htonl(IN_CLASSA_NET));
- }
-
- ifreq_size = sizeof(struct ifreq);
- sockaddr_size = sizeof(struct sockaddr);
-
- offset = 0;
- len = ifc.ifc_len / ifreq_size;
- for (i = 0; i < len; i++)
- {
- ifr = (struct ifreq *)(ifc.ifc_buf + offset);
- offset += IFNAMSIZ;
- offset += sockaddr_size;
-
- size = ifr->ifr_addr.sa_len;
- if (size > sockaddr_size) offset += (size - sockaddr_size);
-
- if (ifr->ifr_addr.sa_family != AF_INET) continue;
- if (ioctl(sock, SIOCGIFFLAGS, (char *)ifr) < 0) continue;
-
- sin = (struct sockaddr_in *)&ifr->ifr_addr;
- if ((ifr->ifr_flags & IFF_UP) &&
- !(ifr->ifr_flags & IFF_LOOPBACK) &&
- (sin->sin_addr.s_addr != 0))
- {
- ioctl(sock, SIOCGIFNETMASK, (char *)ifr);
- n_addr = ((struct sockaddr_in *)&(ifr->ifr_addr))->sin_addr.s_addr;
- close(sock);
- return (n_addr);
- }
- }
-
- close(sock);
- return (htonl(IN_CLASSA_NET));
-}
-
-
-static unsigned long
-sys_address(void)
-{
- struct ifconf ifc;
- struct ifreq *ifr;
- char buf[1024]; /* XXX */
- int i, len, ifreq_size, offset, sockaddr_size, size;
- 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));
- }
-
- ifreq_size = sizeof(struct ifreq);
- sockaddr_size = sizeof(struct sockaddr);
-
- offset = 0;
- len = ifc.ifc_len / ifreq_size;
- for (i = 0; i < len; i++)
- {
- ifr = (struct ifreq *)(ifc.ifc_buf + offset);
- offset += IFNAMSIZ;
- offset += sockaddr_size;
-
- size = ifr->ifr_addr.sa_len;
- if (size > sockaddr_size) offset += (size - sockaddr_size);
-
- 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));
-}
-
-