Improved network function
This commit is contained in:
parent
fc30c7d54b
commit
79cb575548
@ -736,48 +736,50 @@ int capwap_ipv4_mapped_ipv6(struct sockaddr_storage* source, struct sockaddr_sto
|
|||||||
|
|
||||||
/* Convert string into address */
|
/* Convert string into address */
|
||||||
int capwap_address_from_string(const char* ip, struct sockaddr_storage* address) {
|
int capwap_address_from_string(const char* ip, struct sockaddr_storage* address) {
|
||||||
|
char* pos;
|
||||||
|
char* buffer;
|
||||||
struct addrinfo hints;
|
struct addrinfo hints;
|
||||||
struct addrinfo* info = NULL;
|
struct addrinfo* info = NULL;
|
||||||
char* service = NULL;
|
char* service = NULL;
|
||||||
char buffer[256];
|
|
||||||
char* pos;
|
|
||||||
int length;
|
|
||||||
|
|
||||||
ASSERT(ip != NULL);
|
ASSERT(ip != NULL);
|
||||||
ASSERT(address != NULL);
|
ASSERT(address != NULL);
|
||||||
|
|
||||||
/* Init */
|
/* Init */
|
||||||
memset(address, 0, sizeof(struct sockaddr_storage));
|
memset(address, 0, sizeof(struct sockaddr_storage));
|
||||||
length = strlen(ip);
|
if (!*ip) {
|
||||||
if ((length == 0) || (length >= sizeof(buffer))) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* */
|
||||||
|
buffer = capwap_duplicate_string(ip);
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
memset(&hints, 0, sizeof(struct addrinfo));
|
memset(&hints, 0, sizeof(struct addrinfo));
|
||||||
hints.ai_family = AF_UNSPEC;
|
hints.ai_family = AF_UNSPEC;
|
||||||
hints.ai_flags = 0;
|
hints.ai_flags = 0;
|
||||||
|
|
||||||
/* Parsing ipv6 address */
|
/* Parsing address */
|
||||||
strcpy(buffer, ip);
|
pos = buffer;
|
||||||
pos = &buffer[0];
|
|
||||||
if (*pos == '[') {
|
if (*pos == '[') {
|
||||||
char* temp = pos + 1;
|
char* temp = pos + 1;
|
||||||
|
|
||||||
pos = temp;
|
pos = temp;
|
||||||
hints.ai_family = AF_INET6;
|
hints.ai_family = AF_INET6;
|
||||||
hints.ai_flags |= AI_NUMERICHOST;
|
hints.ai_flags |= AI_NUMERICHOST;
|
||||||
|
|
||||||
temp = strchr(temp, ']');
|
temp = strchr(temp, ']');
|
||||||
if (!temp) {
|
if (!temp) {
|
||||||
|
capwap_free(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*temp = 0;
|
*temp = 0;
|
||||||
if (*(temp + 1) == ':') {
|
if (*(temp + 1) == ':') {
|
||||||
service = temp + 2;
|
service = temp + 2;
|
||||||
hints.ai_flags |= AI_NUMERICSERV;
|
hints.ai_flags |= AI_NUMERICSERV;
|
||||||
} else if (*(temp + 1)) {
|
} else if (*(temp + 1)) {
|
||||||
|
capwap_free(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -788,15 +790,18 @@ int capwap_address_from_string(const char* ip, struct sockaddr_storage* address)
|
|||||||
hints.ai_flags |= AI_NUMERICSERV;
|
hints.ai_flags |= AI_NUMERICSERV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parsing address */
|
/* Parsing address */
|
||||||
if (getaddrinfo(pos, service, &hints, &info)) {
|
if (getaddrinfo(pos, service, &hints, &info)) {
|
||||||
|
capwap_free(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy address */
|
/* Copy address */
|
||||||
memcpy(address, info->ai_addr, info->ai_addrlen);
|
memcpy(address, info->ai_addr, info->ai_addrlen);
|
||||||
|
|
||||||
freeaddrinfo(info);
|
freeaddrinfo(info);
|
||||||
|
capwap_free(buffer);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user