/* 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); } }