Implement the domain{Get,Set}Time APIs for getting and setting
domain time.Signed-off-by: Roman Bogorodskiy <[email protected]> --- src/bhyve/bhyve_driver.c | 93 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 2e7a534396..f99ce3bb8b 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -2375,6 +2375,97 @@ bhyveDomainGetFSInfo(virDomainPtr dom, return ret; } +static int +bhyveDomainGetTime(virDomainPtr domain, + long long *seconds, + unsigned int *nseconds, + unsigned int flags) +{ + virDomainObj *vm = NULL; + qemuAgent *agent; + int ret = -1; + int rv; + + virCheckFlags(0, ret); + + if (!(vm = bhyveDomObjFromDomain(domain))) + return ret; + + if (virDomainGetTimeEnsureACL(domain->conn, vm->def) < 0) + goto cleanup; + + if (virDomainObjBeginAgentJob(vm, VIR_AGENT_JOB_QUERY) < 0) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto endjob; + + if (bhyveDomainEnsureAgent(vm, true) < 0) + goto endjob; + + agent = bhyveDomainObjEnterAgent(vm); + rv = qemuAgentGetTime(agent, seconds, nseconds); + bhyveDomainObjExitAgent(vm, agent); + + if (rv < 0) + goto endjob; + + ret = 0; + + endjob: + virDomainObjEndAgentJob(vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + +static int +bhyveDomainSetTime(virDomainPtr domain, + long long seconds, + unsigned int nseconds, + unsigned int flags) +{ + virDomainObj *vm = NULL; + qemuAgent *agent; + bool rtcSync = flags & VIR_DOMAIN_TIME_SYNC; + int ret = -1; + int rv; + + virCheckFlags(VIR_DOMAIN_TIME_SYNC, ret); + + if (!(vm = bhyveDomObjFromDomain(domain))) + return ret; + + if (virDomainSetTimeEnsureACL(domain->conn, vm->def) < 0) + goto cleanup; + + if (virDomainObjBeginAgentJob(vm, VIR_AGENT_JOB_MODIFY) < 0) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto endjob; + + if (bhyveDomainEnsureAgent(vm, true) < 0) + goto endjob; + + agent = bhyveDomainObjEnterAgent(vm); + rv = qemuAgentSetTime(agent, seconds, nseconds, rtcSync); + bhyveDomainObjExitAgent(vm, agent); + + if (rv < 0) + goto endjob; + + ret = 0; + + endjob: + virDomainObjEndAgentJob(vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + static virHypervisorDriver bhyveHypervisorDriver = { .name = "bhyve", .connectURIProbe = bhyveConnectURIProbe, @@ -2447,6 +2538,8 @@ static virHypervisorDriver bhyveHypervisorDriver = { .domainGetMemoryParameters = bhyveDomainGetMemoryParameters, /* 12.4.0 */ .domainSetMemoryParameters = bhyveDomainSetMemoryParameters, /* 12.4.0 */ .domainGetFSInfo = bhyveDomainGetFSInfo, /* 12.5.0 */ + .domainGetTime = bhyveDomainGetTime, /* 12.6.0 */ + .domainSetTime = bhyveDomainSetTime, /* 12.6.0 */ }; -- 2.52.0
