#define BYTE_LEN 8
#define BYTE_NUM 4
#define NET_SEGMENT_SIZE 64
int strtok_str(uint8_t * p[], int max_p_num, uint8_t * str, const uint8_t * spl) { int in = 0; uint8_t *buf = str; uint8_t *outer_ptr = NULL; uint8_t *inner_ptr = NULL; while ((p[in] = strtok_r(buf, spl, (char **) &outer_ptr)) != NULL) { buf = p[in]; if (in >= max_p_num) { break; } while ((p[in] = strtok_r(buf, spl, (char **) &inner_ptr)) != NULL) { in++; buf = NULL; } buf = NULL; } return in; } static int get_effective_bit(unsigned long num, int *effective_bits) { int r; int i; for (i = 0; i < BYTE_LEN; i++) { r = num % 2; num = num / 2; if (r == 1) { *effective_bits += 1; } } return 0; } int get_net_segment(uint8_t * net_segment, uint8_t * ip_str, uint8_t * netmask_str) { int i; int num; uint8_t *ip_list[BYTE_NUM]; uint8_t *netmask_list[BYTE_NUM]; int effective_bits = 0; for (i = 0; i < BYTE_NUM; i++) { ip_list[i] = NULL; netmask_list[i] = NULL; } if (strtok_str(ip_list, BYTE_NUM, ip_str, ".") != (num = strtok_str(netmask_list, BYTE_NUM, netmask_str, "."))) { ELOG_ERR("strtok_str error in get_net_segment\n"); return -1; } if (num != BYTE_NUM) { ELOG_ERR("error in get_net_segment\n"); return -1; } for (i = 0; i < num; i++) { if (netmask_list[i] == NULL || ip_list[i] == NULL) { ELOG_ERR ("netmask_list[i] == NULL || ip_list[i]==NULL in get_net_segment\n"); return -1; } get_effective_bit(atoi(netmask_list[i]), &effective_bits); if (i != num - 1) { snprintf(net_segment + strlen(net_segment), NET_SEGMENT_SIZE, "%d.", atoi(ip_list[i]) & atoi(netmask_list[i])); } else { snprintf(net_segment + strlen(net_segment), NET_SEGMENT_SIZE, "%d/%d", atoi(ip_list[i]) & atoi(netmask_list[i]), effective_bits); } } ELOG_INFO("net_segment==========%s\n", net_segment); return 0; }