Use "dnsmasq --version" to obtain dnsmasq's version id and save the major/minor values. This is a separate patch since other patches will depend on it. --- src/conf/network_conf.h | 2 ++ src/network/bridge_driver.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 3e46304..cfc49af 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -218,6 +218,8 @@ struct _virNetworkObj { unsigned int active : 1; unsigned int autostart : 1; unsigned int persistent : 1; + unsigned int dnsmasqMajor; + unsigned int dnsmasqMinor; virNetworkDefPtr def; /* The current definition */ virNetworkDefPtr newDef; /* New definition to activate at shutdown */ diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 0c4c794..19610f2 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -968,21 +968,51 @@ cleanup: return ret; } +#define DNSMASQ_VERSION_PREFIX "Dnsmasq version " + static int networkStartDhcpDaemon(virNetworkObjPtr network) { virCommandPtr cmd = NULL; + const char *cmdname = DNSMASQ; + char *tmp, *version = NULL; + unsigned int major = 0, minor = 0; char *pidfile = NULL; char *testconfigstr = NULL; int ret = -1; dnsmasqContext *dctx = NULL; if (!virNetworkDefGetIpByIndex(network->def, AF_UNSPEC, 0)) { - /* no IPv6 addresses, so we don't need to run radvd */ + /* no IP addresses, so we don't need to run */ ret = 0; goto cleanup; } - VIR_INFO("starting dhcp daemon (dnsmasq)"); + + if (!virFileIsExecutable(cmdname)) { + VIR_WARN("file %s missing or not executable", cmdname); + goto cleanup; + } + VIR_INFO("starting dhcp daemon (%s)", cmdname); + + cmd = virCommandNew(cmdname); + virCommandAddArg(cmd, "--version"); + virCommandSetOutputBuffer(cmd, &version); + if (virCommandRun(cmd, NULL) < 0) + goto cleanup; + virCommandFree(cmd); + cmd = NULL; + + if ((version!=NULL) && + (strncmp(version, DNSMASQ_VERSION_PREFIX, strlen(DNSMASQ_VERSION_PREFIX))==0)) { + tmp = version + strlen(DNSMASQ_VERSION_PREFIX); + if (virStrToLong_ui(tmp, &tmp, 10, &major) >= 0) { + if ((*tmp == '.') && + virStrToLong_ui(tmp + 1, &tmp, 10, &minor) >= 0) { + network->dnsmasqMajor = major; + network->dnsmasqMinor = minor; + } + } + } if (virFileMakePath(NETWORK_PID_DIR) < 0) { virReportSystemError(errno, @@ -1043,6 +1073,7 @@ networkStartDhcpDaemon(virNetworkObjPtr network) ret = 0; cleanup: VIR_FREE(pidfile); + VIR_FREE(version); virCommandFree(cmd); dnsmasqContextFree(dctx); return ret; -- 1.7.11.7 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list