📄 ifrename.c
字号:
int * active, char * string, size_t len, int linenum){ size_t n; /* Verify validity of string */ if(len >= sizeof(ifnode->mac_filter)) { fprintf(stderr, "MAC address too long at line %d\n", linenum); return(-1); } n = strspn(string, "0123456789ABCDEFabcdef:*"); if(n < len) { fprintf(stderr, "Error: Invalid MAC address `%s' at line %d\n", string, linenum); return(-1); } /* Copy as filter in all cases */ memcpy(ifnode->mac_filter, string, len + 1); /* Check the type of MAC address */ if (strchr(ifnode->mac_filter, '*') != NULL) { /* This is a wilcard. Usual format : "01:23:45:*" * Unfortunately, we can't do proper parsing. */ ifnode->active[SELECT_MAC] = HAS_MAC_FILTER; active[SELECT_MAC] = HAS_MAC_FILTER; } else { /* Not a wildcard : "01:23:45:67:89:AB" */ if(iw_ether_aton(ifnode->mac_filter, &ifnode->mac) != 1) { fprintf(stderr, "Error: Invalid MAC address `%s' at line %d\n", ifnode->mac_filter, linenum); return(-1); } /* Check that it's not NULL */ if(!memcmp(&ifnode->mac, &zero_mac, 6)) { fprintf(stderr, "Warning: MAC address is null at line %d, this is dangerous...\n", linenum); } ifnode->active[SELECT_MAC] = HAS_MAC_EXACT; if(active[SELECT_MAC] == 0) active[SELECT_MAC] = HAS_MAC_EXACT; } if(verbose) fprintf(stderr, "Parsing : Added %s MAC address `%s' from line %d.\n", ifnode->active[SELECT_MAC] == HAS_MAC_FILTER ? "filter" : "exact", ifnode->mac_filter, linenum); return(0);}/*------------------------------------------------------------------*//* * Compare the mac address of two mappings */static intmapping_cmpmac(struct if_mapping * ifnode, struct if_mapping * target){ /* Check for wildcard matching */ if(ifnode->active[SELECT_MAC] == HAS_MAC_FILTER) /* Do wildcard matching, case insensitive */ return(fnmatch(ifnode->mac_filter, target->mac_filter, FNM_CASEFOLD)); else /* Exact matching, in hex */ return(memcmp(&ifnode->mac.ether_addr_octet, &target->mac.ether_addr_octet, 6));}/*------------------------------------------------------------------*//* * Extract the MAC address and Link Type of an interface */static intmapping_getmac(int skfd, const char * ifname, struct if_mapping * target, int flag){ int ret; /* Extract MAC address */ ret = iw_get_mac_addr(skfd, ifname, &target->mac, &target->hw_type); if(ret < 0) { fprintf(stderr, "Error: Can't read MAC address on interface `%s' : %s\n", ifname, strerror(errno)); return(-1); } /* Check the type of comparison */ if((flag == HAS_MAC_FILTER) || verbose) { /* Convert to ASCII */ iw_ether_ntop(&target->mac, target->mac_filter); } target->active[SELECT_MAC] = flag; target->active[SELECT_ARP] = 1; if(verbose) fprintf(stderr, "Querying %s : Got MAC address `%s' and ARP/Link Type `%d'.\n", ifname, target->mac_filter, target->hw_type); return(0);}/*------------------------------------------------------------------*//* * Add a ARP/Link type selector to a mapping */static intmapping_addarp(struct if_mapping * ifnode, int * active, char * string, size_t len, int linenum){ size_t n; unsigned int type; /* Verify validity of string, convert to int */ n = strspn(string, "0123456789"); if((n < len) || (sscanf(string, "%d", &type) != 1)) { fprintf(stderr, "Error: Invalid ARP/Link Type `%s' at line %d\n", string, linenum); return(-1); } ifnode->hw_type = (unsigned short) type; ifnode->active[SELECT_ARP] = 1; active[SELECT_ARP] = 1; if(verbose) fprintf(stderr, "Parsing : Added ARP/Link Type `%d' from line %d.\n", ifnode->hw_type, linenum); return(0);}/*------------------------------------------------------------------*//* * Compare the ARP/Link type of two mappings */static intmapping_cmparp(struct if_mapping * ifnode, struct if_mapping * target){ return(!(ifnode->hw_type == target->hw_type));}/*------------------------------------------------------------------*//* * Extract the ARP/Link type of an interface */static intmapping_getarp(int skfd, const char * ifname, struct if_mapping * target, int flag){ /* We may have already extracted the MAC address */ if(target->active[SELECT_MAC]) return(0); /* Otherwise just do it */ return(mapping_getmac(skfd, ifname, target, flag));}/*------------------------------------------------------------------*//* * Add a Driver name selector to a mapping */static intmapping_adddriver(struct if_mapping * ifnode, int * active, char * string, size_t len, int linenum){ /* Plain string, minimal verification */ if(len >= sizeof(ifnode->driver)) { fprintf(stderr, "Driver name too long at line %d\n", linenum); return(-1); } /* Copy */ memcpy(ifnode->driver, string, len + 1); /* Activate */ ifnode->active[SELECT_DRIVER] = 1; active[SELECT_DRIVER] = 1; if(verbose) fprintf(stderr, "Parsing : Added Driver name `%s' from line %d.\n", ifnode->driver, linenum); return(0);}/*------------------------------------------------------------------*//* * Compare the Driver name of two mappings */static intmapping_cmpdriver(struct if_mapping * ifnode, struct if_mapping * target){ /* Do wildcard matching, case insensitive */ return(fnmatch(ifnode->driver, target->driver, FNM_CASEFOLD));}/*------------------------------------------------------------------*//* * Add a Bus-Info selector to a mapping */static intmapping_addbusinfo(struct if_mapping * ifnode, int * active, char * string, size_t len, int linenum){#if 0 size_t n;#endif /* Verify validity of string */ if(len >= sizeof(ifnode->bus_info)) { fprintf(stderr, "Bus Info too long at line %d\n", linenum); return(-1); }#if 0 /* Hum... This doesn's seem true for non-PCI bus-info */ n = strspn(string, "0123456789ABCDEFabcdef:.*"); if(n < len) { fprintf(stderr, "Error: Invalid Bus Info `%s' at line %d\n", string, linenum); return(-1); }#endif /* Copy */ memcpy(ifnode->bus_info, string, len + 1); /* Activate */ ifnode->active[SELECT_BUSINFO] = 1; active[SELECT_BUSINFO] = 1; if(verbose) fprintf(stderr, "Parsing : Added Bus Info `%s' from line %d.\n", ifnode->bus_info, linenum); return(0);}/*------------------------------------------------------------------*//* * Compare the Bus-Info of two mappings */static intmapping_cmpbusinfo(struct if_mapping * ifnode, struct if_mapping * target){ /* Do wildcard matching, case insensitive */ return(fnmatch(ifnode->bus_info, target->bus_info, FNM_CASEFOLD));}/*------------------------------------------------------------------*//* * Add a Firmare revision selector to a mapping */static intmapping_addfirmware(struct if_mapping * ifnode, int * active, char * string, size_t len, int linenum){ /* Verify validity of string */ if(len >= sizeof(ifnode->fw_version)) { fprintf(stderr, "Firmware revision too long at line %d\n", linenum); return(-1); } /* Copy */ memcpy(ifnode->fw_version, string, len + 1); /* Activate */ ifnode->active[SELECT_FIRMWARE] = 1; active[SELECT_FIRMWARE] = 1; if(verbose) fprintf(stderr, "Parsing : Added Firmware Revision `%s' from line %d.\n", ifnode->fw_version, linenum); return(0);}/*------------------------------------------------------------------*//* * Compare the Bus-Info of two mappings */static intmapping_cmpfirmware(struct if_mapping * ifnode, struct if_mapping * target){ /* Do wildcard matching, case insensitive */ return(fnmatch(ifnode->fw_version, target->fw_version, FNM_CASEFOLD));}/*------------------------------------------------------------------*//* * Extract the Driver name and Bus-Info from a live interface */static intmapping_getdriverbusinfo(int skfd, const char * ifname, struct if_mapping * target, int flag){ struct ifreq ifr; struct ethtool_drvinfo drvinfo; int ret; /* Avoid "Unused parameter" warning */ flag = flag; /* We may come here twice or more, so do the job only once */ if(target->active[SELECT_DRIVER] || target->active[SELECT_BUSINFO] || target->active[SELECT_FIRMWARE]) return(0); /* Prepare request */ bzero(&ifr, sizeof(struct ifreq)); bzero(&drvinfo, sizeof(struct ethtool_drvinfo)); strncpy(ifr.ifr_name, ifname, IFNAMSIZ); drvinfo.cmd = ETHTOOL_GDRVINFO; ifr.ifr_data = (caddr_t) &drvinfo; /* Do it */ ret = ioctl(skfd, SIOCETHTOOL, &ifr); if(ret < 0) { /* Most drivers don't support that, keep quiet for now */ if(verbose) fprintf(stderr, "Error: Can't read driver/bus-info on interface `%s' : %s\n", ifname, strerror(errno)); return(-1); } /* Copy over */ strcpy(target->driver, drvinfo.driver); strcpy(target->bus_info, drvinfo.bus_info); strcpy(target->fw_version, drvinfo.fw_version); /* Activate */ target->active[SELECT_DRIVER] = 1; target->active[SELECT_BUSINFO] = 1; target->active[SELECT_FIRMWARE] = 1; if(verbose) fprintf(stderr, "Querying %s : Got Driver name `%s', Bus Info `%s' and Firmware `%s'.\n", ifname, target->driver, target->bus_info, target->fw_version); return(0);}/*------------------------------------------------------------------*//* * Add a Base Address selector to a mapping */static intmapping_addbaseaddr(struct if_mapping * ifnode, int * active, char * string, size_t len, int linenum){ size_t n; unsigned int address; /* Verify validity of string */ n = strspn(string, "0123456789ABCDEFabcdefx"); if((n < len) || (sscanf(string, "0x%X", &address) != 1)) { fprintf(stderr, "Error: Invalid Base Address `%s' at line %d\n", string, linenum); return(-1); } /* Copy */ ifnode->base_addr = (unsigned short) address; /* Activate */ ifnode->active[SELECT_BASEADDR] = 1; active[SELECT_BASEADDR] = 1; if(verbose) fprintf(stderr, "Parsing : Added Base Address `0x%X' from line %d.\n", ifnode->base_addr, linenum); return(0);}/*------------------------------------------------------------------*//* * Compare the Base Address of two mappings */static intmapping_cmpbaseaddr(struct if_mapping * ifnode, struct if_mapping * target){ /* Do wildcard matching, case insensitive */ return(!(ifnode->base_addr == target->base_addr));}/*------------------------------------------------------------------*//* * Add a IRQ selector to a mapping */static intmapping_addirq(struct if_mapping * ifnode, int * active, char * string, size_t len, int linenum){ size_t n; unsigned int irq; /* Verify validity of string */ n = strspn(string, "0123456789"); if((n < len) || (sscanf(string, "%d", &irq) != 1)) { fprintf(stderr, "Error: Invalid Base Address `%s' at line %d\n", string, linenum); return(-1); } /* Copy */ ifnode->irq = (unsigned char) irq; /* Activate */ ifnode->active[SELECT_IRQ] = 1; active[SELECT_IRQ] = 1; if(verbose) fprintf(stderr, "Parsing : Added IRQ `%d' from line %d.\n", ifnode->irq, linenum); return(0);}/*------------------------------------------------------------------*//* * Compare the IRQ of two mappings */static intmapping_cmpirq(struct if_mapping * ifnode, struct if_mapping * target){ /* Do wildcard matching, case insensitive */ return(!(ifnode->irq == target->irq));}/*------------------------------------------------------------------*//* * Extract the Driver name and Bus-Info from a live interface */static intmapping_getbaseaddrirq(int skfd, const char * ifname, struct if_mapping * target, int flag){ struct ifreq ifr; struct ifmap map; /* hardware setup */ int ret; /* Avoid "Unused parameter" warning */ flag = flag; /* We may come here twice, so do the job only once */ if(target->active[SELECT_BASEADDR] || target->active[SELECT_IRQ]) return(0); /* Prepare request */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -