From f4e9f3f4250a74bc1afc2ad7a8896a08575a922a3c02d5a875fccc4767ded8bb Mon Sep 17 00:00:00 2001 From: Olaf Hering Date: Wed, 7 Aug 2013 17:12:54 +0000 Subject: [PATCH] - cache FQDN in kvp_daemon to avoid timeouts OBS-URL: https://build.opensuse.org/package/show/Virtualization/hyper-v?expand=0&rev=67 --- hyper-v.changes | 3 ++- hyper-v.tools.hv.hv_kvp_daemon.c | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/hyper-v.changes b/hyper-v.changes index 5ddea92..98e656d 100644 --- a/hyper-v.changes +++ b/hyper-v.changes @@ -1,6 +1,7 @@ ------------------------------------------------------------------- -Wed Aug 7 15:54:19 CEST 2013 - ohering@suse.de +Wed Aug 7 19:04:35 CEST 2013 - ohering@suse.de +- cache FQDN in kvp_daemon to avoid timeouts - use full nlmsghdr in netlink_send - correct payload size in netlink_send - use single send+recv buffer diff --git a/hyper-v.tools.hv.hv_kvp_daemon.c b/hyper-v.tools.hv.hv_kvp_daemon.c index 7a95a86..2d5e806 100644 --- a/hyper-v.tools.hv.hv_kvp_daemon.c +++ b/hyper-v.tools.hv.hv_kvp_daemon.c @@ -89,6 +89,7 @@ static char *processor_arch; static char *os_build; static char *os_version; static char *lic_version = "Unknown version"; +static char full_domain_name[HV_KVP_EXCHANGE_MAX_VALUE_SIZE]; static struct utsname uts_buf; /* @@ -1368,7 +1369,7 @@ setval_error: } -static int +static void kvp_get_domain_name(char *buffer, int length) { struct addrinfo hints, *info ; @@ -1382,12 +1383,12 @@ kvp_get_domain_name(char *buffer, int length) error = getaddrinfo(buffer, NULL, &hints, &info); if (error != 0) { - strcpy(buffer, "getaddrinfo failed\n"); - return error; + snprintf(buffer, length, "getaddrinfo failed: 0x%x %s", + error, gai_strerror(error)); + return; } - strcpy(buffer, info->ai_canonname); + snprintf(buffer, length, "%s", info->ai_canonname); freeaddrinfo(info); - return error; } static int @@ -1452,6 +1453,11 @@ int main(void) * Retrieve OS release information. */ kvp_get_os_info(); + /* + * Cache Fully Qualified Domain Name because getaddrinfo takes an + * unpredicatable amount of time to finish. + */ + kvp_get_domain_name(full_domain_name, sizeof(full_domain_name)); if (kvp_file_init()) { syslog(LOG_ERR, "Failed to initialize the pools"); @@ -1670,8 +1676,7 @@ int main(void) switch (hv_msg->body.kvp_enum_data.index) { case FullyQualifiedDomainName: - kvp_get_domain_name(key_value, - HV_KVP_EXCHANGE_MAX_VALUE_SIZE); + strcpy(key_value, full_domain_name); strcpy(key_name, "FullyQualifiedDomainName"); break; case IntegrationServicesVersion: