| | |
| | | #include <ifaddrs.h> |
| | | #include <linux/if_link.h> |
| | | #include <netpacket/packet.h> |
| | | #include <string.h> |
| | | #include <stdio.h> |
| | | #include <unordered_map> |
| | | #include <string.h> |
| | | #include <memory.h> |
| | | |
| | | #include "../../base/StringUtils.h" |
| | | #include "../../base/string_utils.h" |
| | | #include "../../base/logger.h" |
| | | #include "../network.hpp" |
| | | |
| | |
| | | namespace os { |
| | | using namespace std; |
| | | |
| | | /** |
| | | * |
| | | * @param ifnames |
| | | * @param ifname |
| | | * @param ifnames_max |
| | | * @return |
| | | */ |
| | | |
| | | static int ifname_position(char *ifnames, char *ifname, int ifnames_max) { |
| | | int i, position; |
| | | position = -1; |
| | | for (i = 0; i < ifnames_max; i++) { |
| | | if (strcmp(ifname, &ifnames[i * NI_MAXHOST]) == 0) { |
| | | position = i; |
| | | break; |
| | | } |
| | | } |
| | | return position; |
| | | } |
| | | |
| | | /** |
| | | * |
| | |
| | | FUNCTION_RETURN f_return = FUNC_RET_OK; |
| | | struct ifaddrs *ifaddr, *ifa; |
| | | int family, n = 0; |
| | | unsigned int if_num, if_max; |
| | | unsigned int if_num; |
| | | |
| | | if (getifaddrs(&ifaddr) == -1) { |
| | | LOG_WARN("getifaddrs failed == -1"); |
| | |
| | | if (ifa->ifa_addr == NULL || (ifa->ifa_flags & IFF_LOOPBACK) != 0) { |
| | | continue; |
| | | } |
| | | string if_name(ifa->ifa_name, mstrnlen_s(ifa->ifa_name, NI_MAXHOST)); |
| | | string if_name(ifa->ifa_name, mstrnlen_s(ifa->ifa_name, LCC_ADAPTER_DESCRIPTION_LEN)); |
| | | // if_name_position = ifname_position(ifnames, ifa->ifa_name, if_num); |
| | | // interface name not seen en advance |
| | | OsAdapterInfo *currentAdapter; |
| | | // FIXME not working |
| | | if (adapterByName.find(if_name) == adapterByName.end()) { |
| | | OsAdapterInfo newAdapter; |
| | | memset(&newAdapter, 0, sizeof(OsAdapterInfo)); |
| | | strncpy(&newAdapter.description[0], ifa->ifa_name, NI_MAXHOST); |
| | | mstrlcpy(&newAdapter.description[0], ifa->ifa_name, LCC_ADAPTER_DESCRIPTION_LEN); |
| | | adapterByName[if_name] = newAdapter; |
| | | } |
| | | auto it = adapterByName.find(if_name); |
| | |
| | | family = ifa->ifa_addr->sa_family; |
| | | /* Display interface name and family (including symbolic |
| | | form of the latter for the common families) */ |
| | | #ifdef _DEBUG |
| | | printf("%-8s %s (%d)\n", ifa->ifa_name, |
| | | (family == AF_PACKET) ? "AF_PACKET" |
| | | : (family == AF_INET) ? "AF_INET" : (family == AF_INET6) ? "AF_INET6" : "???", |
| | | family); |
| | | #endif |
| | | LOG_DEBUG("%-8s %s (%d)\n", ifa->ifa_name, |
| | | (family == AF_PACKET) ? "AF_PACKET" |
| | | : (family == AF_INET) ? "AF_INET" : (family == AF_INET6) ? "AF_INET6" : "???", |
| | | family); |
| | | /* For an AF_INET* interface address, display the address |
| | | * || family == AF_INET6*/ |
| | | if (family == AF_INET) { |
| | |
| | | int i; |
| | | for (i = 0; i < 6; i++) { |
| | | currentAdapter->mac_address[i] = s1->sll_addr[i]; |
| | | #ifdef _DEBUG |
| | | printf("%02x:", s1->sll_addr[i]); |
| | | #endif |
| | | LOG_DEBUG("%02x:", s1->sll_addr[i]); |
| | | } |
| | | #ifdef _DEBUG |
| | | printf("\t %s\n", ifa->ifa_name); |
| | | #endif |
| | | LOG_DEBUG("\t %s\n", ifa->ifa_name); |
| | | } |
| | | } |
| | | freeifaddrs(ifaddr); |