rendered paste body/* Fetch the inteface configuration from the kernel. */
static int
if_fetch(char *ifname, struct interface *ife)
{
struct ifreq ifr;
memset((char *) ife, 0, sizeof(struct interface));
strcpy(ife->name, ifname);
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) return(-1);
ife->flags = ifr.ifr_flags;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFADDR, &ifr) < 0) {
memset(&ife->addr, 0, sizeof(struct sockaddr));
} else ife->addr = ifr.ifr_addr;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) {
memset(ife->hwaddr, 0, 32);
} else memcpy(ife->hwaddr,ifr.ifr_hwaddr.sa_data,8);
ife->type=ifr.ifr_hwaddr.sa_family;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) {
ife->metric = 0;
} else ife->metric = ifr.ifr_metric;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0) {
ife->mtu = 0;
} else ife->mtu = ifr.ifr_mtu;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
memset(&ife->map, 0, sizeof(struct ifmap));
} else memcpy(&ife->map,&ifr.ifr_map,sizeof(struct ifmap));
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFDSTADDR, &ifr) < 0) {
memset(&ife->dstaddr, 0, sizeof(struct sockaddr));
} else ife->dstaddr = ifr.ifr_dstaddr;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFBRDADDR, &ifr) < 0) {
memset(&ife->broadaddr, 0, sizeof(struct sockaddr));
} else ife->broadaddr = ifr.ifr_broadaddr;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFNETMASK, &ifr) < 0) {
memset(&ife->netmask, 0, sizeof(struct sockaddr));
} else ife->netmask = ifr.ifr_netmask;
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
memset(&ife->map, 0, sizeof(struct ifmap));
}
else ife->map = ifr.ifr_map;
if_getstats(ifname,ife);
return(0);
}
static void
if_print(char *ifname)
{
char buff[1024];
struct interface ife;
struct ifconf ifc;
struct ifreq *ifr;
int i;
if (ifname == (char *)NULL) {
ifc.ifc_len = sizeof(buff);
ifc.ifc_buf = buff;
if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno));
return;
}
ifr = ifc.ifc_req;
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
if (if_fetch(ifr->ifr_name, &ife) < 0) {
fprintf(stderr, "%s: unknown interface.\n",
ifr->ifr_name);
continue;
}
if (((ife.flags & IFF_UP) == 0) && !opt_a) continue;
ife_print(&ife);
}
} else {
if (if_fetch(ifname, &ife) < 0)
fprintf(stderr, "%s: unknown interface.\n", ifname);
else ife_print(&ife);
}
}