On Tue, Apr 14, 2026 at 11:49:44 +0200, Roman Bogorodskiy wrote:
Peter Krempa wrote:
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.
I intend to support the agent too.
Actually, I'm currently working on implementing a bunch of APIs using the Qemu guest agent in my private branch, and I decided to submit these two changes separately to reduce size of the agent series when it's ready.
Sure, then add the _AGENT flag to virCheckFlags once you'll be adding that support.