--- /dev/null
+# Master configuration file for the CH driver.
+# All settings described here are optional - if omitted, sensible
+# defaults are used.
#include "configmake.h"
#include "vircommand.h"
+#include "virconf.h"
#include "virfile.h"
#include "virlog.h"
#include "virobject.h"
return g_steal_pointer(&caps);
}
+int virCHDriverConfigLoadFile(virCHDriverConfig *cfg G_GNUC_UNUSED,
+ const char *filename)
+{
+ g_autoptr(virConf) conf = NULL;
+
+ /* Just check the file is readable before opening it, otherwise
+ * libvirt emits an error.
+ */
+ if (access(filename, R_OK) == -1) {
+ VIR_INFO("Could not read ch config file %s", filename);
+ return 0;
+ }
+
+ if (!(conf = virConfReadFile(filename, 0)))
+ return -1;
+
+ return 0;
+}
+
/**
* virCHDriverGetCapabilities:
*
cfg->logDir = g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR);
cfg->stateDir = g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR);
cfg->saveDir = g_strdup_printf("%s/lib/libvirt/ch/save", LOCALSTATEDIR);
+ cfg->configDir = g_strdup_printf("%s/lib/libvirt/ch", LOCALSTATEDIR);
} else {
g_autofree char *rundir = NULL;
configbasedir = virGetUserConfigDirectory();
cfg->saveDir = g_strdup_printf("%s/ch/save", configbasedir);
+ cfg->configDir = g_strdup_printf("%s/ch", configbasedir);
}
return cfg;
GObject parent;
char *stateDir;
+ char *configDir;
char *logDir;
char *saveDir;
uint32_t unused[11];
};
+int virCHDriverConfigLoadFile(virCHDriverConfig *cfg,
+ const char *filename);
virCaps *virCHDriverCapsInit(void);
virCaps *virCHDriverGetCapabilities(virCHDriver *driver,
bool refresh);
virStateInhibitCallback callback G_GNUC_UNUSED,
void *opaque G_GNUC_UNUSED)
{
+ g_autofree char *driverConf = NULL;
int ret = VIR_DRV_STATE_INIT_ERROR;
int rv;
if (!(ch_driver->config = virCHDriverConfigNew(privileged)))
goto cleanup;
+ driverConf = g_strdup_printf("%s/ch.conf", ch_driver->config->configDir);
+
+ if (virCHDriverConfigLoadFile(ch_driver->config, driverConf) < 0)
+ goto cleanup;
+
if (!(ch_driver->hostdevMgr = virHostdevManagerGetDefault()))
goto cleanup;
--- /dev/null
+(* /etc/libvirt/ch.conf *)
+
+module Libvirtd_ch =
+ autoload xfm
+
+ let eol = del /[ \t]*\n/ "\n"
+ let value_sep = del /[ \t]*=[ \t]*/ " = "
+ let indent = del /[ \t]*/ ""
+
+ let array_sep = del /,[ \t\n]*/ ", "
+ let array_start = del /\[[ \t\n]*/ "[ "
+ let array_end = del /\]/ "]"
+
+ let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""
+ let bool_val = store /0|1/
+ let int_val = store /[0-9]+/
+ let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ ""
+ let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end
+
+ let str_entry (kw:string) = [ key kw . value_sep . str_val ]
+ let bool_entry (kw:string) = [ key kw . value_sep . bool_val ]
+ let int_entry (kw:string) = [ key kw . value_sep . int_val ]
+ let str_array_entry (kw:string) = [ key kw . value_sep . str_array_val ]
+
+ (* Config entry grouped by function - same order as example config *)
+ let config_entry = bool_entry "placeholder"
+
+ (* Each entry in the config is one of the following three ... *)
+ let entry = config_entry
+ let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
+ let empty = [ label "#empty" . eol ]
+
+ let record = indent . entry . eol
+
+ let lns = ( record | comment | empty ) *
+
+ let filter = incl "/etc/libvirt/ch.conf"
+ . Util.stdexcl
+
+ let xfm = transform lns filter