void list_interfaces(const char* name) { if (name != NULL) { list_interface(name); return; } // get a list of all interfaces BNetworkRoster& roster = BNetworkRoster::Default(); BNetworkInterface interface; uint32 cookie = 0; while (roster.GetNextInterface(&cookie, interface) == B_OK) { list_interface(interface.Name()); } }
void list_interfaces(int socket, const char* name) { if (name != NULL) { list_interface(socket, name); return; } // get a list of all interfaces ifconf config; config.ifc_len = sizeof(config.ifc_value); if (ioctl(socket, SIOCGIFCOUNT, &config, sizeof(struct ifconf)) < 0) return; uint32 count = (uint32)config.ifc_value; if (count == 0) { fprintf(stderr, "%s: There are no interfaces yet!\n", kProgramName); return; } void *buffer = malloc(count * sizeof(struct ifreq)); if (buffer == NULL) { fprintf(stderr, "%s: Out of memory.\n", kProgramName); return; } config.ifc_len = count * sizeof(struct ifreq); config.ifc_buf = buffer; if (ioctl(socket, SIOCGIFCONF, &config, sizeof(struct ifconf)) < 0) return; ifreq *interface = (ifreq *)buffer; for (uint32 i = 0; i < count; i++) { list_interface(socket, interface->ifr_name); interface = (ifreq *)((addr_t)interface + IF_NAMESIZE + interface->ifr_addr.sa_len); } free(buffer); }