int intf_loop(intf_t *intf, intf_handler callback, void *arg) { FILE *fp; struct intf_entry *entry; char *p, buf[BUFSIZ], ebuf[BUFSIZ]; int ret; entry = (struct intf_entry *)ebuf; if ((fp = fopen(PROC_DEV_FILE, "r")) == NULL) return (-1); intf->ifc.ifc_buf = (caddr_t)intf->ifcbuf; intf->ifc.ifc_len = sizeof(intf->ifcbuf); if (ioctl(intf->fd, SIOCGIFCONF, &intf->ifc) < 0) { fclose(fp); return (-1); } ret = 0; while (fgets(buf, sizeof(buf), fp) != NULL) { if ((p = strchr(buf, ':')) == NULL) continue; *p = '\0'; for (p = buf; *p == ' '; p++) ; memset(ebuf, 0, sizeof(ebuf)); strlcpy(entry->intf_name, p, sizeof(entry->intf_name)); strlcpy(entry->os_intf_name, p, sizeof(entry->os_intf_name)); strlcpy(entry->pcap_intf_name, p, sizeof(entry->pcap_intf_name)); intf_get_drv_info(intf, entry); entry->intf_len = sizeof(ebuf); if (_intf_get_noalias(intf, entry) < 0) { ret = -1; break; } if (_intf_get_aliases(intf, entry) < 0) { ret = -1; break; } if ((ret = (*callback)(entry, arg)) != 0) break; } if (ferror(fp)) ret = -1; fclose(fp); return (ret); }
int intf_loop(intf_t *intf, intf_handler callback, void *arg) { struct intf_entry *entry; struct ifreq *ifr, *lifr, *pifr; char *p, ebuf[BUFSIZ]; int ret; entry = (struct intf_entry *)ebuf; intf->ifc.ifc_buf = (caddr_t)intf->ifcbuf; intf->ifc.ifc_len = sizeof(intf->ifcbuf); if (ioctl(intf->fd, SIOCGIFCONF, &intf->ifc) < 0) return (-1); pifr = NULL; lifr = (struct ifreq *)&intf->ifc.ifc_buf[intf->ifc.ifc_len]; for (ifr = intf->ifc.ifc_req; ifr < lifr; ifr = NEXTIFR(ifr)) { /* XXX - Linux, Solaris ifaliases */ if ((p = strchr(ifr->ifr_name, ':')) != NULL) *p = '\0'; if (pifr != NULL && strcmp(ifr->ifr_name, pifr->ifr_name) == 0) { if (p) *p = ':'; continue; } memset(ebuf, 0, sizeof(ebuf)); strlcpy(entry->intf_name, ifr->ifr_name, sizeof(entry->intf_name)); strlcpy(entry->os_intf_name, ifr->ifr_name, sizeof(entry->os_intf_name)); strlcpy(entry->pcap_intf_name, ifr->ifr_name, sizeof(entry->pcap_intf_name)); intf_get_drv_info(intf, entry); entry->intf_len = sizeof(ebuf); /* Repair the alias name back up. */ if (p) *p = ':'; if (_intf_get_noalias(intf, entry) < 0) return (-1); if (_intf_get_aliases(intf, entry) < 0) return (-1); if ((ret = (*callback)(entry, arg)) != 0) return (ret); pifr = ifr; } return (0); }
int intf_get(intf_t *intf, struct intf_entry *entry) { if (_intf_get_noalias(intf, entry) < 0) return (-1); #ifndef SIOCLIFADDR intf->ifc.ifc_buf = (caddr_t)intf->ifcbuf; intf->ifc.ifc_len = sizeof(intf->ifcbuf); if (ioctl(intf->fd, SIOCGIFCONF, &intf->ifc) < 0) return (-1); #endif return (_intf_get_aliases(intf, entry)); }
int intf_loop(intf_t *intf, intf_handler callback, void *arg) { struct intf_entry *entry; struct lifreq *lifr, *llifr, *plifr; char *p, ebuf[BUFSIZ]; int ret; entry = (struct intf_entry *)ebuf; intf->lifc.lifc_buf = (caddr_t)intf->ifcbuf; intf->lifc.lifc_len = sizeof(intf->ifcbuf); if (ioctl(intf->fd, SIOCGLIFCONF, &intf->lifc) < 0) return (-1); llifr = (struct lifreq *)&intf->lifc.lifc_buf[intf->lifc.lifc_len]; for (lifr = intf->lifc.lifc_req; lifr < llifr; lifr = NEXTLIFR(lifr)) { /* XXX - Linux, Solaris ifaliases */ if ((p = strchr(lifr->lifr_name, ':')) != NULL) *p = '\0'; for (plifr = intf->lifc.lifc_req; plifr < lifr; plifr = NEXTLIFR(lifr)) { if (strcmp(lifr->lifr_name, plifr->lifr_name) == 0) break; } if (lifr > intf->lifc.lifc_req && plifr < llifr) continue; memset(ebuf, 0, sizeof(ebuf)); strlcpy(entry->intf_name, lifr->lifr_name, sizeof(entry->intf_name)); entry->intf_len = sizeof(ebuf); /* Repair the alias name back up */ if (p) *p = ':'; if (_intf_get_noalias(intf, entry) < 0) return (-1); if (_intf_get_aliases(intf, entry) < 0) return (-1); if ((ret = (*callback)(entry, arg)) != 0) return (ret); } return (0); }
int intf_loop(intf_t *intf, intf_handler callback, void *arg) { struct intf_entry *entry; struct lifreq *lifr, *llifr, *plifr; char *p, ebuf[BUFSIZ]; int ret; entry = (struct intf_entry *)ebuf; /* http://www.unix.com/man-page/opensolaris/7p/if_tcp */ intf->lifc.lifc_family = AF_UNSPEC; intf->lifc.lifc_flags = 0; #ifdef LIFC_UNDER_IPMP intf->lifc.lifc_flags |= LIFC_UNDER_IPMP; #endif intf->lifc.lifc_buf = (caddr_t)intf->ifcbuf; intf->lifc.lifc_len = sizeof(intf->ifcbuf); if (ioctl(intf->fd, SIOCGLIFCONF, &intf->lifc) < 0) return (-1); llifr = (struct lifreq *)&intf->lifc.lifc_buf[intf->lifc.lifc_len]; for (lifr = intf->lifc.lifc_req; lifr < llifr; lifr = NEXTLIFR(lifr)) { /* XXX - Linux, Solaris ifaliases */ if ((p = strchr(lifr->lifr_name, ':')) != NULL) *p = '\0'; for (plifr = intf->lifc.lifc_req; plifr < lifr; plifr = NEXTLIFR(lifr)) { if (strcmp(lifr->lifr_name, plifr->lifr_name) == 0) break; } if (lifr > intf->lifc.lifc_req && plifr < lifr) continue; memset(ebuf, 0, sizeof(ebuf)); strlcpy(entry->intf_name, lifr->lifr_name, sizeof(entry->intf_name)); entry->intf_len = sizeof(ebuf); /* Repair the alias name back up */ if (p) *p = ':'; /* Ignore IPMP interfaces. These are virtual interfaces made up * of physical interfaces. IPMP interfaces do not support things * like packet sniffing; it is necessary to use one of the * underlying physical interfaces instead. This works as long as * the physical interface's test address is on the same subnet * as the IPMP interface's address. */ if (ioctl(intf->fd, SIOCGLIFFLAGS, lifr) >= 0) ; else if (intf->fd6 != -1 && ioctl(intf->fd6, SIOCGLIFFLAGS, lifr) >= 0) ; else return (-1); if (lifr->lifr_flags & IFF_IPMP) { continue; } if (_intf_get_noalias(intf, entry) < 0) return (-1); if (_intf_get_aliases(intf, entry) < 0) return (-1); if ((ret = (*callback)(entry, arg)) != 0) return (ret); } return (0); }