diff --git a/srcs/open_dhcp/query.cpp b/srcs/open_dhcp/query.cpp index e69cbec..3c146cc 100644 --- a/srcs/open_dhcp/query.cpp +++ b/srcs/open_dhcp/query.cpp @@ -23,6 +23,7 @@ using namespace std; #include "config.h" #include "proto.h" #include "user_errno.h" +#include "uthash/uthash.h" extern data2 cfig; extern bool kRunning; @@ -372,7 +373,7 @@ static int add_dhcpd_rangeset(data19 *req, const char *pRequest) { cJSON_AddNumberToObject(pEx_range, "status", ret); cJSON_AddStringToObject(pEx_range, "message", getErrorEnumDesc(ret)); cJSON_AddItemToArray(pExpandArray, pEx_range); - break; + continue; } cJSON_AddNumberToObject(pEx_range, "status", ERR_SUCCESS); @@ -392,12 +393,21 @@ static int add_dhcpd_rangeset(data19 *req, const char *pRequest) { return ERR_SUCCESS; } +struct hash_map{ + unsigned int key; + unsigned int value; + UT_hash_handle hh; +}; + static int delete_dhcpd_rangeset(data19 *req, const char *pRequest) { char logBuff[512]; const char *pStrContent; char *fp; cJSON *pRspRoot; cJSON *pdelArray; + data13 dhcpRanges[MAX_DHCP_RANGES]; + hash_map *delMap = nullptr; + int resCount = 0; dzlog_debug("Input: %s\n", pRequest); @@ -438,10 +448,9 @@ static int delete_dhcpd_rangeset(data19 *req, const char *pRequest) { cJSON_AddItemToObject(pRspRoot, "rangeSet", pdelArray); for (int i = 0; i < cJSON_GetArraySize(pdhcp_range); i++) { - cJSON *pdelRange = cJSON_GetArrayItem(pdhcp_range, i); - cJSON *pdel_Item = cJSON_CreateObject(); - char del_range[256]; - bool deleted_flag = false; + cJSON *pdelRange = cJSON_GetArrayItem(pdhcp_range, i); + char del_range[256]; + auto *delItem = (struct hash_map*)malloc(sizeof(hash_map)); if (!pdelRange) { continue; @@ -457,48 +466,62 @@ static int delete_dhcpd_rangeset(data19 *req, const char *pRequest) { st_addr = htonl(inet_addr(start)); en_addr = htonl(inet_addr(end)); - cJSON_AddStringToObject(pdel_Item, "dhcpRange", pdelRange->valuestring); - if (st_addr && en_addr && st_addr <= en_addr) { - MYBYTE m = 0; + HASH_FIND_INT(delMap, &st_addr, delItem); + if (delItem == nullptr){ + hash_map *s = (struct hash_map*)malloc(sizeof(struct hash_map)); + s->key = st_addr; + s->value = en_addr; + HASH_ADD_INT(delMap, key, s); + } + } - for (; m < cfig.rangeCount && cfig.dhcpRanges[m].rangeStart; m++) { - if (!deleted_flag) { - if ((st_addr == cfig.dhcpRanges[m].rangeStart) && (en_addr == cfig.dhcpRanges[m].rangeEnd)) { - deleted_flag = true; - if (m == cfig.rangeCount - 1) { - memset(&cfig.dhcpRanges[m], 0, sizeof(struct data19)); - } - continue; - } else if (st_addr == cfig.dhcpRanges[m].rangeStart || en_addr == cfig.dhcpRanges[m].rangeEnd) { - deleted_flag = false; - break; - } - } else { - cfig.dhcpRanges[m].rangeSetInd = m-1; - memcpy(&(cfig.dhcpRanges[m - 1]), &(cfig.dhcpRanges[m]), sizeof(struct data19)); - } + for(int i = 0; i < cfig.rangeCount; i++){ + cJSON *pdel_Item = cJSON_CreateObject(); + hash_map *delRange; + char del_range[256]; + char saddr[128]; + char eaddr[128]; + memset(del_range, 0, 256); + + HASH_FIND_INT(delMap, &cfig.dhcpRanges[i].rangeStart, delRange); + if(delRange != nullptr){ + IP2String(saddr, ntohl(delRange->key)); + IP2String(eaddr, ntohl(delRange->value)); + + sprintf(del_range, "%s-%s", saddr, eaddr); + cJSON_AddStringToObject(pdel_Item, "dhcpRange", del_range); + //judge whether the input has error + if(delRange->key && delRange->value && + (delRange->key == cfig.dhcpRanges[i].rangeStart) && (delRange->value == cfig.dhcpRanges[i].rangeEnd)){ + cJSON_AddNumberToObject(pdel_Item, "status", ERR_SUCCESS); + cJSON_AddStringToObject(pdel_Item, "message", getErrorEnumDesc(ERR_SUCCESS)); + cJSON_AddItemToArray(pdelArray, pdel_Item); + + } else { + memcpy(&dhcpRanges[resCount], &cfig.dhcpRanges[i], sizeof(struct data13)); + resCount++; + cJSON_AddNumberToObject(pdel_Item, "status", ERR_INPUT_PARAMS); + cJSON_AddStringToObject(pdel_Item, "message", getErrorEnumDesc(ERR_INPUT_PARAMS)); + cJSON_AddItemToArray(pdelArray, pdel_Item); } } else { - cJSON_AddNumberToObject(pdel_Item, "status", ERR_INPUT_PARAMS); - cJSON_AddStringToObject(pdel_Item, "message", getErrorEnumDesc(ERR_INPUT_PARAMS)); - cJSON_AddItemToArray(pdelArray, pdel_Item); - break; + //write to dhcpRanges + memcpy(&dhcpRanges[resCount], &cfig.dhcpRanges[i], sizeof(struct data13)); + resCount++; } - - if (deleted_flag) { - cfig.rangeCount--; - } else { - cJSON_AddNumberToObject(pdel_Item, "status", ERR_INPUT_PARAMS); - cJSON_AddStringToObject(pdel_Item, "message", getErrorEnumDesc(ERR_INPUT_PARAMS)); - cJSON_AddItemToArray(pdelArray, pdel_Item); - break; - } - - cJSON_AddNumberToObject(pdel_Item, "status", ERR_SUCCESS); - cJSON_AddStringToObject(pdel_Item, "message", getErrorEnumDesc(ERR_SUCCESS)); - cJSON_AddItemToArray(pdelArray, pdel_Item); } + //rewite cfig.dhcpRanges + for(int i = 0; i < cfig.rangeCount; i++){ + if(i < resCount){ + memcpy(&cfig.dhcpRanges[i], &dhcpRanges[i], sizeof(struct data13)); + } else { + memset(&cfig.dhcpRanges[i], 0, sizeof(struct data13)); + } + } + + cfig.rangeCount = resCount; + const char *pStrPro = proto_create_new(pRspRoot, 200); fp += sprintf(fp, "%s", pStrPro); @@ -509,12 +532,11 @@ static int delete_dhcpd_rangeset(data19 *req, const char *pRequest) { return ERR_SUCCESS; } - static void revert(unsigned int* num) { - unsigned int v = *((unsigned int *)num) ; + unsigned int v = *num ; v = ((v & 0x000000FF) << 24) | ((v & 0x0000FF00) << 8) | ((v & 0x00FF0000) >> 8) | ((v & 0xFF000000) >> 24) ; - *((unsigned int *)num) = v ; + *num = v ; } static int query_dhcpd_rangeset(data19 *req){