#include #include #include #include #include #include #include #include #include #include "utils.h" #include "log.h" /****************************************************************************** * mutable_array ******************************************************************************/ void mutable_array_init(struct mutable_array *array) { memset(array, 0, sizeof(mutable_array)); array->num = 0; array->size = sizeof(array->elems) / sizeof(array->elems[0]); } void mutable_array_add_elem(struct mutable_array *array, uint64_t elem) { if (array->num < array->size) { array->elems[array->num] = elem; array->num++; } else { LOG_ERROR("%s: fixed num array add elem too much !!!", LOG_TAG_UTILS); } } void mutable_array_del_elem(struct mutable_array *array, uint64_t elem) { for (int i = 0; i < array->num; i++) { if (array->elems[i] == elem) { if (i + 1 != array->size) { memmove(&(array->elems[i]), &(array->elems[i + 1]), sizeof(array->elems[0]) * (array->num - i - 1)); } i--; array->num--; } } } int mutable_array_is_full(struct mutable_array *array) { if (array->num == array->size) { return 1; } else { return 0; } } int mutable_array_count_elem(struct mutable_array *array) { if (array) { return array->num; } else { return 0; } } int mutable_array_exist_elem(struct mutable_array *array, uint64_t elem) { for (int i = 0; i < array->num; i++) { if (array->elems[i] == elem) { return 1; } } return 0; } int mutable_array_index_elem(struct mutable_array *array, int index) { if (index >= array->num) { assert(0); } return array->elems[index]; } /****************************************************************************** * device ******************************************************************************/ int get_ip_by_device_name(const char *dev_name, char *ip_str) { int fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd == -1) { return -1; } struct ifreq ifr; memset(&ifr, 0, sizeof(struct ifreq)); ifr.ifr_addr.sa_family = AF_INET; strcpy(ifr.ifr_name, dev_name); if (ioctl(fd, SIOCGIFADDR, &ifr) != 0) { close(fd); return -1; } strcpy(ip_str, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); close(fd); return 0; } int get_mac_by_device_name(const char *dev_name, char *mac_str) { int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); if (fd == -1) { return -1; } struct ifreq ifr; memset(&ifr, 0, sizeof(struct ifreq)); strcpy(ifr.ifr_name, dev_name); if (ioctl(fd, SIOCGIFHWADDR, &ifr) != 0) { close(fd); return -1; } u_char *mac = (u_char *)ifr.ifr_hwaddr.sa_data; sprintf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); close(fd); return 0; } int str_to_mac(const char *mac_str, u_char mac[]) { if (sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", &(mac[0]), &(mac[1]), &(mac[2]), &(mac[3]), &(mac[4]), &(mac[5])) == 6) { return 0; } else { return -1; } }