As it was failing when local host is using FQDN for hostnames. The
logic to do so follows libvirt's implementation for the same thing.
This fixes an issue where unit tests would falsely fail on workstations
that have FQDN hostnames.
---
src/libvirt-php.c | 38 ++++++++++++++++++++++++++++++++++----
1 file changed, 34 insertions(+), 4 deletions(-)
diff --git a/src/libvirt-php.c b/src/libvirt-php.c
index 4ef06b2..c019d99 100644
--- a/src/libvirt-php.c
+++ b/src/libvirt-php.c
@@ -1146,13 +1146,43 @@ int is_local_connection(virConnectPtr conn)
{
#ifndef EXTWIN
int ret;
- char *hostname;
+ char *lv_hostname = NULL, *result = NULL;
char name[1024];
+ struct addrinfo hints, *info = NULL;
- hostname = virConnectGetHostname(conn);
+ name[1023] = '\0';
gethostname(name, 1024);
- ret = strcmp(name, hostname) == 0;
- free(hostname);
+
+ if (strcmp(name, "localhost") == 0)
+ return 1;
+
+ lv_hostname = virConnectGetHostname(conn);
+
+ /* gethostname gave us FQDN, compare */
+ if (strchr(name, '.') && strcmp(name, lv_hostname) == 0)
+ return 1;
+
+ /* need to get FQDN of the local name */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_CANONNAME|AI_CANONIDN;
+ hints.ai_family = AF_UNSPEC;
+
+ /* could not get FQDN or got localhost, use whatever gethostname gave us */
+ if (getaddrinfo(name, NULL, &hints, &info) != 0 ||
+ info->ai_canonname == NULL ||
+ strcmp(info->ai_canonname, "localhost") == 0)
+ result = strdup(name);
+ else
+ result = strdup(info->ai_canonname);
+
+ ret = strcmp(result, lv_hostname) == 0;
+
+ freeaddrinfo(info);
+ if (lv_hostname)
+ free(lv_hostname);
+ if (result)
+ free(result);
+
return ret;
#else
// Libvirt daemon doesn't work on Windows systems so always return 0 (FALSE)
--
2.13.3