On Sat, Apr 11, 2026 at 15:35:12 +0200, Roman Bogorodskiy wrote:
Implement the domainInterfaceAddresses and domainGetHostname APIs. These APIs could use multiple sources of information, though for bhyve only the 'lease' source is supported.
These would go better if split to 2 patches.
Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> --- src/bhyve/bhyve_driver.c | 149 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+)
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index a7bd16704e..33a772ccdb 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c
[...]
+static int +bhyveDomainGetHostnameLease(virDomainObj *vm, + char **hostname) +{ + char macaddr[VIR_MAC_STRING_BUFLEN]; + g_autoptr(virConnect) conn = NULL; + virNetworkDHCPLeasePtr *leases = NULL; + int n_leases; + size_t i, j; + int ret = -1; + + if (virDomainObjBeginJob(vm, VIR_JOB_QUERY) < 0) + return -1; + + if (virDomainObjCheckActive(vm) < 0) + goto endjob; + + if (!(conn = virGetConnectNetwork())) + goto endjob; + + for (i = 0; i < vm->def->nnets; i++) { + g_autoptr(virNetwork) network = NULL; + virDomainNetDef *net = vm->def->nets[i]; + + if (net->type != VIR_DOMAIN_NET_TYPE_NETWORK) + continue; + + virMacAddrFormat(&net->mac, macaddr); + network = virNetworkLookupByName(conn, net->data.network.name); + + if (!network) + goto endjob; + + if ((n_leases = virNetworkGetDHCPLeases(network, macaddr, + &leases, 0)) < 0) + goto endjob; + + for (j = 0; j < n_leases; j++) { + virNetworkDHCPLeasePtr lease = leases[j]; + if (lease->hostname && !*hostname) + *hostname = g_strdup(lease->hostname); + + virNetworkDHCPLeaseFree(lease); + } + + VIR_FREE(leases); + + if (*hostname) + break; + } + + ret = 0; + endjob: + virDomainObjEndJob(vm); + return ret; +} + +static char * +bhyveDomainGetHostname(virDomainPtr domain, + unsigned int flags) +{ + virDomainObj *vm = NULL; + char *hostname = NULL; + + virCheckFlags(VIR_DOMAIN_GET_HOSTNAME_LEASE | + VIR_DOMAIN_GET_HOSTNAME_AGENT, NULL);
IMO you shouldn't allow the _AGENT flag here ...
+ + VIR_EXCLUSIVE_FLAGS_RET(VIR_DOMAIN_GET_HOSTNAME_LEASE, + VIR_DOMAIN_GET_HOSTNAME_AGENT, + NULL); + + if (!(flags & VIR_DOMAIN_GET_HOSTNAME_AGENT)) + flags |= VIR_DOMAIN_GET_HOSTNAME_LEASE; + + if (!(vm = bhyveDomObjFromDomain(domain))) + return NULL; + + if (virDomainGetHostnameEnsureACL(domain->conn, vm->def) < 0) + goto cleanup; + + if (flags & VIR_DOMAIN_GET_HOSTNAME_AGENT) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("getting hostname from agent is not supported")); + goto cleanup;
... if you intend to not support it. At this point it doesn't matter that much (just one extra error message for the translators). I'm working on an API to probe supported flags though at which point it would matter as this would signal that the _AGENT option is supported.
+ } else if (flags & VIR_DOMAIN_GET_HOSTNAME_LEASE) { + if (bhyveDomainGetHostnameLease(vm, &hostname) < 0) + goto cleanup; + } + + if (!hostname) { + virReportError(VIR_ERR_NO_HOSTNAME, + _("no hostname found for domain %1$s"), + vm->def->name); + goto cleanup; + }
With the handling of _AGENT fixed: Reviewed-by: Peter Krempa <pkrempa@redhat.com>