Currently, bhyve driver uses mainly constants for path, e.g.
BHYVE_CONFIG_DIR. Move these paths to the driver configuration
object. This is a preparation work for the session mode support
which uses different paths.

Signed-off-by: Roman Bogorodskiy <[email protected]>
---
 src/bhyve/bhyve_conf.c    | 12 +++++++
 src/bhyve/bhyve_domain.c  |  7 ++--
 src/bhyve/bhyve_domain.h  |  4 ++-
 src/bhyve/bhyve_driver.c  | 76 ++++++++++++++++++++++-----------------
 src/bhyve/bhyve_process.c | 24 +++++++------
 src/bhyve/bhyve_utils.h   | 10 +++---
 6 files changed, 82 insertions(+), 51 deletions(-)

diff --git a/src/bhyve/bhyve_conf.c b/src/bhyve/bhyve_conf.c
index f9a657f402..e0439af6fa 100644
--- a/src/bhyve/bhyve_conf.c
+++ b/src/bhyve/bhyve_conf.c
@@ -57,12 +57,19 @@ virBhyveDriverConfigNew(void)
     if (!(cfg = virObjectNew(virBhyveDriverConfigClass)))
         return NULL;
 
+    cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt");
+
     cfg->firmwareDir = g_strdup(DATADIR "/uefi-firmware");
     cfg->libDir = g_strdup_printf("%s/lib/libvirt/bhyve", LOCALSTATEDIR);
     cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
 
     cfg->ubootPath = g_strdup(DATADIR "/u-boot/u-boot-bhyve-arm64/u-boot.bin");
 
+    cfg->configDir = g_strdup_printf("%s/bhyve", cfg->configBaseDir);
+    cfg->autostartDir = g_strdup_printf("%s/bhyve/autostart", 
cfg->configBaseDir);
+    cfg->stateDir = g_strdup_printf("%s/libvirt/bhyve", RUNSTATEDIR);
+    cfg->logDir = g_strdup_printf("%s/log/libvirt/bhyve", LOCALSTATEDIR);
+
     cfg->bhyveloadTimeout = 300;
     cfg->bhyveloadTimeoutKill = 15;
 
@@ -114,9 +121,14 @@ virBhyveDriverConfigDispose(void *obj)
 {
     struct _virBhyveDriverConfig *cfg = obj;
 
+    g_free(cfg->autostartDir);
+    g_free(cfg->configBaseDir);
+    g_free(cfg->configDir);
     g_free(cfg->firmwareDir);
     g_free(cfg->libDir);
+    g_free(cfg->logDir);
     g_free(cfg->nvramDir);
+    g_free(cfg->stateDir);
 
     g_free(cfg->ubootPath);
 }
diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c
index 3ecb1d52cb..3588557979 100644
--- a/src/bhyve/bhyve_domain.c
+++ b/src/bhyve/bhyve_domain.c
@@ -799,14 +799,15 @@ virBhyveDomainObjStopWorker(virDomainObj *dom)
 }
 
 int
-bhyveDomainNamePathsCleanup(const char *name,
+bhyveDomainNamePathsCleanup(virBhyveDriverConfig *cfg,
+                            const char *name,
                             bool bestEffort)
 {
     g_autofree char *cfg_file = NULL;
     g_autofree char *autostart_link = NULL;
 
-    cfg_file = virDomainConfigFile(BHYVE_CONFIG_DIR, name);
-    autostart_link = virDomainConfigFile(BHYVE_AUTOSTART_DIR, name);
+    cfg_file = virDomainConfigFile(cfg->configDir, name);
+    autostart_link = virDomainConfigFile(cfg->autostartDir, name);
 
     if (virFileExists(cfg_file) &&
         unlink(cfg_file) < 0) {
diff --git a/src/bhyve/bhyve_domain.h b/src/bhyve/bhyve_domain.h
index c9fa776651..1bf6bace71 100644
--- a/src/bhyve/bhyve_domain.h
+++ b/src/bhyve/bhyve_domain.h
@@ -54,7 +54,9 @@ extern virXMLNamespace virBhyveDriverDomainXMLNamespace;
 
 int virBhyveDomainObjStartWorker(virDomainObj *dom);
 void virBhyveDomainObjStopWorker(virDomainObj *dom);
-int bhyveDomainNamePathsCleanup(const char *name, bool bestEffort);
+int bhyveDomainNamePathsCleanup(virBhyveDriverConfig *cfg,
+                                const char *name,
+                                bool bestEffort);
 int bhyveValidateLifecycleAction(virDomainLifecycleAction onPoweroff,
                                  virDomainLifecycleAction onReboot,
                                  virDomainLifecycleAction onCrash);
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index cf4e918472..7e8cc572e4 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -387,10 +387,12 @@ bhyveDomainGetAutostart(virDomainPtr domain, int 
*autostart)
 static int
 bhyveDomainSetAutostart(virDomainPtr domain, int autostart)
 {
+    struct _bhyveConn *privconn = domain->conn->privateData;
     virDomainObj *vm;
     char *configFile = NULL;
     char *autostartLink = NULL;
     int ret = -1;
+    g_autoptr(virBhyveDriverConfig) cfg = NULL;
 
     if (!(vm = bhyveDomObjFromDomain(domain)))
         goto cleanup;
@@ -406,15 +408,17 @@ bhyveDomainSetAutostart(virDomainPtr domain, int 
autostart)
 
     autostart = (autostart != 0);
 
+    cfg = virBhyveDriverGetConfig(privconn);
+
     if (vm->autostart != autostart) {
-        configFile = virDomainConfigFile(BHYVE_CONFIG_DIR, vm->def->name);
-        autostartLink = virDomainConfigFile(BHYVE_AUTOSTART_DIR, 
vm->def->name);
+        configFile = virDomainConfigFile(cfg->configDir, vm->def->name);
+        autostartLink = virDomainConfigFile(cfg->autostartDir, vm->def->name);
 
         if (autostart) {
-            if (g_mkdir_with_parents(BHYVE_AUTOSTART_DIR, 0777) < 0) {
+            if (g_mkdir_with_parents(cfg->autostartDir, 0777) < 0) {
                 virReportSystemError(errno,
                                      _("cannot create autostart directory 
%1$s"),
-                                     BHYVE_AUTOSTART_DIR);
+                                     cfg->autostartDir);
                 goto cleanup;
             }
 
@@ -541,6 +545,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flag
     virDomainObj *vm = NULL;
     virObjectEvent *event = NULL;
     g_autoptr(virCaps) caps = NULL;
+    g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn);
     unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE |
                                VIR_DOMAIN_DEF_PARSE_ABI_UPDATE;
 
@@ -579,7 +584,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char 
*xml, unsigned int flag
     vm->persistent = 1;
 
     if (virDomainDefSave(vm->newDef ? vm->newDef : vm->def,
-                         privconn->xmlopt, BHYVE_CONFIG_DIR) < 0) {
+                         privconn->xmlopt, cfg->configDir) < 0) {
         virDomainObjListRemove(privconn->domains, vm);
         goto cleanup;
     }
@@ -612,6 +617,7 @@ bhyveDomainUndefineFlags(virDomainPtr domain, unsigned int 
flags)
     virObjectEvent *event = NULL;
     virDomainObj *vm;
     g_autofree char *nvram_path = NULL;
+    g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn);
     int ret = -1;
 
     virCheckFlags(VIR_DOMAIN_UNDEFINE_NVRAM |
@@ -656,8 +662,8 @@ bhyveDomainUndefineFlags(virDomainPtr domain, unsigned int 
flags)
         }
     }
 
-    if (virDomainDeleteConfig(BHYVE_CONFIG_DIR,
-                              BHYVE_AUTOSTART_DIR,
+    if (virDomainDeleteConfig(cfg->configDir,
+                              cfg->autostartDir,
                               vm) < 0)
         goto cleanup;
 
@@ -1268,6 +1274,7 @@ bhyveDomainSetMetadata(virDomainPtr dom,
     virConnectPtr conn = dom->conn;
     struct _bhyveConn *privconn = conn->privateData;
     virDomainObj *vm;
+    g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn);
     int ret = -1;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
@@ -1280,8 +1287,8 @@ bhyveDomainSetMetadata(virDomainPtr dom,
         goto cleanup;
 
     ret = virDomainObjSetMetadata(vm, type, metadata, key, uri,
-                                  privconn->xmlopt, BHYVE_STATE_DIR,
-                                  BHYVE_CONFIG_DIR, flags);
+                                  privconn->xmlopt, cfg->stateDir,
+                                  cfg->configDir, flags);
 
     if (ret == 0) {
         virObjectEvent *ev = NULL;
@@ -1370,13 +1377,13 @@ bhyveStateCleanup(void)
     virObjectUnref(bhyve_driver->xmlopt);
     virSysinfoDefFree(bhyve_driver->hostsysinfo);
     virObjectUnref(bhyve_driver->domainEventState);
-    virObjectUnref(bhyve_driver->config);
     virPortAllocatorRangeFree(bhyve_driver->remotePorts);
 
     if (bhyve_driver->lockFD != -1)
-        virPidFileRelease(BHYVE_STATE_DIR, "driver", bhyve_driver->lockFD);
+        virPidFileRelease(bhyve_driver->config->stateDir, "driver", 
bhyve_driver->lockFD);
 
     virMutexDestroy(&bhyve_driver->lock);
+    virObjectUnref(bhyve_driver->config);
     VIR_FREE(bhyve_driver->pidfile);
     VIR_FREE(bhyve_driver);
 
@@ -1391,6 +1398,7 @@ bhyveStateInitialize(bool privileged,
                      void *opaque G_GNUC_UNUSED)
 {
     virDomainDriverAutoStartConfig autostartCfg;
+    virBhyveDriverConfig *cfg;
 
     if (root != NULL) {
         virReportError(VIR_ERR_INVALID_ARG, "%s",
@@ -1435,40 +1443,40 @@ bhyveStateInitialize(bool privileged,
 
     bhyve_driver->hostsysinfo = virSysinfoRead();
 
-    if (!(bhyve_driver->config = virBhyveDriverConfigNew()))
+    if (!(bhyve_driver->config = cfg = virBhyveDriverConfigNew()))
         goto cleanup;
 
     if (virBhyveLoadDriverConfig(bhyve_driver->config, SYSCONFDIR 
"/libvirt/bhyve.conf") < 0)
         goto cleanup;
 
-    if (g_mkdir_with_parents(BHYVE_LOG_DIR, 0777) < 0) {
+    if (g_mkdir_with_parents(cfg->logDir, 0777) < 0) {
         virReportSystemError(errno,
                              _("Failed to mkdir %1$s"),
-                             BHYVE_LOG_DIR);
+                             cfg->logDir);
         goto cleanup;
     }
 
-    if (g_mkdir_with_parents(BHYVE_STATE_DIR, 0777) < 0) {
+    if (g_mkdir_with_parents(cfg->stateDir, 0777) < 0) {
         virReportSystemError(errno,
                              _("Failed to mkdir %1$s"),
-                             BHYVE_STATE_DIR);
+                             cfg->stateDir);
         goto cleanup;
     }
 
     if ((bhyve_driver->lockFD =
-         virPidFileAcquire(BHYVE_STATE_DIR, "driver", getpid())) < 0)
+         virPidFileAcquire(cfg->stateDir, "driver", getpid())) < 0)
         goto cleanup;
 
     if (virDomainObjListLoadAllConfigs(bhyve_driver->domains,
-                                       BHYVE_STATE_DIR,
+                                       cfg->stateDir,
                                        NULL, true,
                                        bhyve_driver->xmlopt,
                                        NULL, NULL) < 0)
         goto cleanup;
 
     if (virDomainObjListLoadAllConfigs(bhyve_driver->domains,
-                                       BHYVE_CONFIG_DIR,
-                                       BHYVE_AUTOSTART_DIR, false,
+                                       cfg->configDir,
+                                       cfg->autostartDir, false,
                                        bhyve_driver->xmlopt,
                                        NULL, NULL) < 0)
         goto cleanup;
@@ -1476,7 +1484,7 @@ bhyveStateInitialize(bool privileged,
     virBhyveProcessReconnectAll(bhyve_driver);
 
     autostartCfg = (virDomainDriverAutoStartConfig) {
-        .stateDir = BHYVE_STATE_DIR,
+        .stateDir = cfg->stateDir,
         .callback = bhyveAutostartDomain,
         .opaque = bhyve_driver,
     };
@@ -2335,6 +2343,7 @@ bhyveDomainSetMemoryParameters(virDomainPtr domain,
     virDomainDef *persistentDef = NULL;
     virDomainObj *vm = NULL;
     int ret = -1;
+    g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn);
     unsigned long long hard_limit = 0;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
@@ -2373,14 +2382,14 @@ bhyveDomainSetMemoryParameters(virDomainPtr domain,
             goto endjob;
 
         def->mem.hard_limit = hard_limit;
-        if (virDomainObjSave(vm, privconn->xmlopt, BHYVE_STATE_DIR) < 0)
+        if (virDomainObjSave(vm, privconn->xmlopt, cfg->stateDir) < 0)
             VIR_WARN("Failed to save status on vm %s", vm->def->name);
     }
 
     if (persistentDef) {
         persistentDef->mem.hard_limit = hard_limit;
 
-        if (virDomainDefSave(persistentDef, privconn->xmlopt, 
BHYVE_CONFIG_DIR) < 0)
+        if (virDomainDefSave(persistentDef, privconn->xmlopt, cfg->configDir) 
< 0)
             goto endjob;
     }
 
@@ -2697,6 +2706,7 @@ bhyveDomainRenameCallback(virDomainObj *vm,
     g_autofree char *old_dom_name = NULL;
     g_autofree char *new_dom_cfg_file = NULL;
     g_autofree char *new_dom_autostart_link = NULL;
+    g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn);
 
     virCheckFlags(0, ret);
 
@@ -2708,13 +2718,13 @@ bhyveDomainRenameCallback(virDomainObj *vm,
 
     new_dom_name = g_strdup(new_name);
 
-    new_dom_cfg_file = virDomainConfigFile(BHYVE_CONFIG_DIR, new_dom_name);
+    new_dom_cfg_file = virDomainConfigFile(cfg->configDir, new_dom_name);
 
-    if (bhyveDomainNamePathsCleanup(new_name, false) < 0)
+    if (bhyveDomainNamePathsCleanup(cfg, new_name, false) < 0)
         goto cleanup;
 
     if (vm->autostart) {
-        new_dom_autostart_link = virDomainConfigFile(BHYVE_AUTOSTART_DIR, 
new_dom_name);
+        new_dom_autostart_link = virDomainConfigFile(cfg->autostartDir, 
new_dom_name);
 
         if (symlink(new_dom_cfg_file, new_dom_autostart_link) < 0) {
             virReportSystemError(errno,
@@ -2728,7 +2738,7 @@ bhyveDomainRenameCallback(virDomainObj *vm,
     old_dom_name = g_steal_pointer(&vm->def->name);
     vm->def->name = g_steal_pointer(&new_dom_name);
 
-    if (virDomainDefSave(vm->def, privconn->xmlopt, BHYVE_CONFIG_DIR) < 0)
+    if (virDomainDefSave(vm->def, privconn->xmlopt, cfg->configDir) < 0)
         goto cleanup;
 
     event_old = virDomainEventLifecycleNew(vm->def->id, old_dom_name, 
vm->def->uuid,
@@ -2750,9 +2760,9 @@ bhyveDomainRenameCallback(virDomainObj *vm,
         }
 
         virErrorPreserveLast(&err);
-        bhyveDomainNamePathsCleanup(new_dom_name, true);
+        bhyveDomainNamePathsCleanup(cfg, new_dom_name, true);
     } else {
-        bhyveDomainNamePathsCleanup(old_dom_name, true);
+        bhyveDomainNamePathsCleanup(cfg, old_dom_name, true);
     }
 
     virErrorRestore(&err);
@@ -2865,6 +2875,7 @@ bhyveDomainSetLifecycleAction(virDomainPtr domain,
     virDomainObj *vm = NULL;
     virDomainDef *def = NULL;
     virDomainDef *persistentDef = NULL;
+    g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn);
     int ret = -1;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
@@ -2893,7 +2904,7 @@ bhyveDomainSetLifecycleAction(virDomainPtr domain,
         bhyveDomainModifyLifecycleAction(def, type, action);
 
         if (virDomainObjSave(vm, privconn->xmlopt,
-                             BHYVE_STATE_DIR) < 0)
+                             cfg->stateDir) < 0)
             goto endjob;
     }
 
@@ -2901,7 +2912,7 @@ bhyveDomainSetLifecycleAction(virDomainPtr domain,
         bhyveDomainModifyLifecycleAction(persistentDef, type, action);
 
         if (virDomainDefSave(persistentDef, privconn->xmlopt,
-                             BHYVE_CONFIG_DIR) < 0)
+                             cfg->configDir) < 0)
             goto endjob;
     }
 
@@ -2923,6 +2934,7 @@ bhyveDomainAgentSetResponseTimeout(virDomainPtr domain,
     virDomainObj *vm = NULL;
     bhyveDomainObjPrivate *priv = NULL;
     struct _bhyveConn *privconn = domain->conn->privateData;
+    g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn);
     int ret = -1;
 
     virCheckFlags(0, -1);
@@ -2950,7 +2962,7 @@ bhyveDomainAgentSetResponseTimeout(virDomainPtr domain,
     priv->agentTimeout = timeout;
 
     if (virDomainObjIsActive(vm)) {
-        if (virDomainObjSave(vm, privconn->xmlopt, BHYVE_STATE_DIR) < 0)
+        if (virDomainObjSave(vm, privconn->xmlopt, cfg->stateDir) < 0)
             VIR_WARN("Failed to save status on vm %s", vm->def->name);
     }
 
diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c
index 65cf61c578..4144f8230e 100644
--- a/src/bhyve/bhyve_process.c
+++ b/src/bhyve/bhyve_process.c
@@ -32,6 +32,7 @@
 #include <net/if.h>
 #include <net/if_tap.h>
 
+#include "bhyve_conf.h"
 #include "bhyve_device.h"
 #include "bhyve_driver.h"
 #include "bhyve_capabilities.h"
@@ -98,9 +99,12 @@ bhyveNetCleanup(virDomainObj *vm)
 }
 
 static void
-virBhyveFormatDevMapFile(const char *vm_name, char **fn_out)
+virBhyveFormatDevMapFile(virBhyveDriverConfig *cfg,
+                         const char *vm_name,
+                         char **fn_out)
 {
-    *fn_out = g_strdup_printf("%s/grub_bhyve-%s-device.map", BHYVE_STATE_DIR, 
vm_name);
+    *fn_out = g_strdup_printf("%s/grub_bhyve-%s-device.map",
+                              cfg->stateDir, vm_name);
 }
 
 static int
@@ -307,8 +311,9 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver,
     virTimeBackOffVar timebackoff;
     int ret = -1, rc;
     bool vmm_appeared = false;
+    g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(driver);
 
-    logfile = g_strdup_printf("%s/%s.log", BHYVE_LOG_DIR, vm->def->name);
+    logfile = g_strdup_printf("%s/%s.log", cfg->logDir, vm->def->name);
     if ((logfd = open(logfile, O_WRONLY | O_APPEND | O_CREAT,
                       S_IRUSR | S_IWUSR)) < 0) {
         virReportSystemError(errno,
@@ -318,7 +323,7 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver,
     }
 
     VIR_FREE(driver->pidfile);
-    if (!(driver->pidfile = virPidFileBuildPath(BHYVE_STATE_DIR,
+    if (!(driver->pidfile = virPidFileBuildPath(cfg->stateDir,
                                                 vm->def->name))) {
         virReportSystemError(errno,
                              "%s", _("Failed to build pidfile path"));
@@ -351,7 +356,7 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver,
          * domain is ready to be started, so we can build
          * and execute bhyveload command */
 
-        virBhyveFormatDevMapFile(vm->def->name, &devmap_file);
+        virBhyveFormatDevMapFile(cfg, vm->def->name, &devmap_file);
 
         if (!(load_cmd = virBhyveProcessBuildLoadCmd(driver, vm->def,
                                                      devmap_file, &devicemap)))
@@ -417,8 +422,7 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver,
     if (virBhyveDomainObjStartWorker(vm) < 0)
         goto cleanup;
 
-    if (virDomainObjSave(vm, driver->xmlopt,
-                         BHYVE_STATE_DIR) < 0)
+    if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0)
         goto cleanup;
 
     if (bhyveSetResourceLimits(driver, vm) < 0)
@@ -729,8 +733,8 @@ virBhyveProcessStopImpl(struct _bhyveConn *driver,
 
     if (vm_started)
         bhyveProcessStopHook(driver, vm, VIR_HOOK_BHYVE_OP_RELEASE);
-    virPidFileDelete(BHYVE_STATE_DIR, vm->def->name);
-    bhyveProcessRemoveDomainStatus(BHYVE_STATE_DIR, vm->def->name);
+    virPidFileDelete(driver->config->stateDir, vm->def->name);
+    bhyveProcessRemoveDomainStatus(driver->config->stateDir, vm->def->name);
 
     if (restoreDef)
         virDomainObjRemoveTransientDef(vm);
@@ -891,7 +895,7 @@ virBhyveProcessReconnect(virDomainObj *vm,
                              VIR_DOMAIN_SHUTOFF_UNKNOWN);
         virDomainObjRemoveTransientDef(vm);
         ignore_value(virDomainObjSave(vm, data->driver->xmlopt,
-                                      BHYVE_STATE_DIR));
+                                      data->driver->config->stateDir));
     }
 
     virObjectUnlock(vm);
diff --git a/src/bhyve/bhyve_utils.h b/src/bhyve/bhyve_utils.h
index 19369047fe..5d04b42195 100644
--- a/src/bhyve/bhyve_utils.h
+++ b/src/bhyve/bhyve_utils.h
@@ -29,18 +29,18 @@
 #include "hypervisor/virclosecallbacks.h"
 #include "virportallocator.h"
 
-#define BHYVE_AUTOSTART_DIR    SYSCONFDIR "/libvirt/bhyve/autostart"
-#define BHYVE_CONFIG_DIR       SYSCONFDIR "/libvirt/bhyve"
-#define BHYVE_STATE_DIR        RUNSTATEDIR "/libvirt/bhyve"
-#define BHYVE_LOG_DIR          LOCALSTATEDIR "/log/libvirt/bhyve"
-
 typedef struct _virBhyveDriverConfig virBhyveDriverConfig;
 struct _virBhyveDriverConfig {
     virObject parent;
 
+    char *autostartDir;
+    char *configBaseDir;
+    char *configDir;
     char *firmwareDir;
     char *libDir;
+    char *logDir;
     char *nvramDir;
+    char *stateDir;
 
     char *ubootPath;
 
-- 
2.55.0

Reply via email to