Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 324388
b: refs/heads/master
c: af73301
h: refs/heads/master
v: v3
  • Loading branch information
K. Y. Srinivasan authored and Greg Kroah-Hartman committed Aug 17, 2012
1 parent 8fd1dc0 commit 0d6eca4
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 53 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0ecaa1985e39344ab308190063f8a60cb2a96155
refs/heads/master: af733015c9f59a0993cb9a64e6904aed8612e8b3
94 changes: 42 additions & 52 deletions trunk/tools/hv/hv_kvp_daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -491,17 +491,50 @@ void kvp_get_os_info(void)
return;
}

static int kvp_process_ip_address(void *addrp,
int family, char *buffer,
int length, int *offset)
{
struct sockaddr_in *addr;
struct sockaddr_in6 *addr6;
int addr_length;
char tmp[50];
const char *str;

if (family == AF_INET) {
addr = (struct sockaddr_in *)addrp;
str = inet_ntop(family, &addr->sin_addr, tmp, 50);
addr_length = INET_ADDRSTRLEN;
} else {
addr6 = (struct sockaddr_in6 *)addrp;
str = inet_ntop(family, &addr6->sin6_addr.s6_addr, tmp, 50);
addr_length = INET6_ADDRSTRLEN;
}

if ((length - *offset) < addr_length + 1)
return 1;
if (str == NULL) {
strcpy(buffer, "inet_ntop failed\n");
return 1;
}
if (*offset == 0)
strcpy(buffer, tmp);
else
strcat(buffer, tmp);
strcat(buffer, ";");

*offset += strlen(str) + 1;
return 0;
}

static int
kvp_get_ip_address(int family, char *if_name, int op,
void *out_buffer, int length)
{
struct ifaddrs *ifap;
struct ifaddrs *curp;
int ipv4_len = strlen("255.255.255.255") + 1;
int ipv6_len = strlen("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")+1;
int offset = 0;
const char *str;
char tmp[50];
int error = 0;
char *buffer;
struct hv_kvp_ipaddr_value *ip_buffer;
Expand Down Expand Up @@ -556,55 +589,12 @@ kvp_get_ip_address(int family, char *if_name, int op,
continue;
}

if ((curp->ifa_addr->sa_family == AF_INET) &&
((family == AF_INET) || (family == 0))) {
struct sockaddr_in *addr =
(struct sockaddr_in *) curp->ifa_addr;

str = inet_ntop(AF_INET, &addr->sin_addr, tmp, 50);
if (str == NULL) {
strcpy(buffer, "inet_ntop failed\n");
error = 1;
goto getaddr_done;
}
if (offset == 0)
strcpy(buffer, tmp);
else
strcat(buffer, tmp);
strcat(buffer, ";");

offset += strlen(str) + 1;
if ((length - offset) < (ipv4_len + 1))
goto getaddr_done;

} else if ((family == AF_INET6) || (family == 0)) {

/*
* We only support AF_INET and AF_INET6
* and the list of addresses is separated by a ";".
*/
struct sockaddr_in6 *addr =
(struct sockaddr_in6 *) curp->ifa_addr;

str = inet_ntop(AF_INET6,
&addr->sin6_addr.s6_addr,
tmp, 50);
if (str == NULL) {
strcpy(buffer, "inet_ntop failed\n");
error = 1;
goto getaddr_done;
}
if (offset == 0)
strcpy(buffer, tmp);
else
strcat(buffer, tmp);
strcat(buffer, ";");
offset += strlen(str) + 1;
if ((length - offset) < (ipv6_len + 1))
goto getaddr_done;

}

error = kvp_process_ip_address(curp->ifa_addr,
curp->ifa_addr->sa_family,
buffer,
length, &offset);
if (error)
goto getaddr_done;

curp = curp->ifa_next;
}
Expand Down

0 comments on commit 0d6eca4

Please sign in to comment.