#include #include #include #include #include #include #include #include #include #include "userfirewall.m" static int ifconfig_ioctl( int fd, const char *ifname, int cmd, struct ifreq &ifr) { strcpy(ifr.ifr_name, ifname); return ioctl(fd, cmd,&ifr); } static void ifconfig_format (struct sockaddr &adr, const char *vname) { char buf[20]; struct sockaddr_in *sin = (struct sockaddr_in*)&adr; ipnum_ip2a (htonl(sin->sin_addr.s_addr),buf); printf ("%s=%s\n",vname,buf); } /* Fetch the inteface configuration from the kernel. Assume the device is already available in the kernel Return -1 if any error. */ int ipinfo_print (const char *ifname) { int ret = -1; int skfd = socket(AF_INET, SOCK_DGRAM, 0); if (skfd != -1){ struct ifreq ifr; if (ifconfig_ioctl(skfd, ifname, SIOCGIFFLAGS, ifr) >= 0){ ret = 0; // In linux 2.1, unconfigured interfaces fail for the // following calls, while with 2.0 and below, they // return 0 values. if (ifconfig_ioctl(skfd,ifname,SIOCGIFADDR, ifr) >= 0){ ifconfig_format (ifr.ifr_addr,"IFINFOADR"); struct sockaddr_in *sin = (struct sockaddr_in*)&ifr.ifr_addr; unsigned long ip = htonl(sin->sin_addr.s_addr); if (ifconfig_ioctl(skfd,ifname, SIOCGIFDSTADDR, ifr) >= 0) { ifconfig_format (ifr.ifr_dstaddr,"ININFODSTADR"); if (ifconfig_ioctl(skfd, ifname,SIOCGIFNETMASK, ifr) >= 0) { struct sockaddr_in *sin = (struct sockaddr_in*)&ifr.ifr_netmask; unsigned long mask = htonl(sin->sin_addr.s_addr); unsigned long net = ip & mask; char bufnet[20]; ipnum_ip2a (net,bufnet); printf ("IFINFONET=%s\n",bufnet); ifconfig_format (ifr.ifr_netmask,"IFINFOMASK"); if (ifconfig_ioctl(skfd, ifname,SIOCGIFBRDADDR, ifr) >= 0) { ifconfig_format (ifr.ifr_broadaddr,"IFINFOBCAST"); } } } } } close (skfd); } return ret; } int main (int argc, char *argv[]) { bool list; glocal.list = false; int ret = (argc, argv,"userfirewall"); fprintf (stderr,MSG_U(I_IFINFOUSAGE ,"ifinfo network-device\n" "\n" "Reports in a shell friendly way the setting of a network device\n")); int ret = -1; if (strcmp(opt,"--list")==0){ glocal.list = true; ret = 1; } return ret; int ret; glocal.ret = -1; if (glocal.list){ ("/proc/net/dev",true); if (noline > 1){ const char *pt = str_skip(line); const char *end = strchr(pt,':'); if (end != NULL){ int len = (int)(end-pt); printf ("%*.*s\n",len,len,pt); } } glocal.ret = 0; return 0; }else{ usage(); } return glocal.ret; int ret; glocal.ret = -1; if (argc != 1){ usage(); }else{ glocal.ret = ipinfo_print (argv[0]); } return glocal.ret; return ret; }