virMutexUnlock(&driver->lock);
}
+static dnsmasqCapsPtr
+networkGetDnsmasqCaps(virNetworkDriverStatePtr driver)
+{
+ dnsmasqCapsPtr ret;
+ ret = virObjectRef(driver->dnsmasqCaps);
+ return ret;
+}
+
+static int
+networkDnsmasqCapsRefresh(virNetworkDriverStatePtr driver)
+{
+ dnsmasqCapsPtr caps;
+
+ if (!(caps = dnsmasqCapsNewFromBinary(DNSMASQ)))
+ return -1;
+
+ virObjectUnref(driver->dnsmasqCaps);
+ driver->dnsmasqCaps = caps;
+ return 0;
+}
+
static int networkStateCleanup(void);
static int networkStartNetwork(virNetworkDriverStatePtr driver,
void *opaque)
{
virNetworkDriverStatePtr driver = opaque;
+ dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
int ret = -1;
virObjectLock(obj);
ignore_value(virPidFileReadIfAlive(driver->pidDir,
obj->def->name,
&obj->dnsmasqPid,
- dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps)));
+ dnsmasqCapsGetBinaryPath(dnsmasq_caps)));
radvdpidbase = networkRadvdPidfileBasename(obj->def->name);
if (!radvdpidbase)
goto cleanup;
ret = 0;
cleanup:
virObjectUnlock(obj);
+ virObjectUnref(dnsmasq_caps);
return ret;
}
char *pidfile,
dnsmasqContext *dctx)
{
+ dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
virCommandPtr cmd = NULL;
int ret = -1;
char *configfile = NULL;
network->dnsmasqPid = -1;
if (networkDnsmasqConfContents(network, pidfile, &configstr,
- dctx, driver->dnsmasqCaps) < 0)
+ dctx, dnsmasq_caps) < 0)
goto cleanup;
if (!configstr)
goto cleanup;
LIBEXECDIR)))
goto cleanup;
- cmd = virCommandNew(dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps));
+ cmd = virCommandNew(dnsmasqCapsGetBinaryPath(dnsmasq_caps));
virCommandAddArgFormat(cmd, "--conf-file=%s", configfile);
/* Libvirt gains full control of leases database */
virCommandAddArgFormat(cmd, "--leasefile-ro");
*cmdout = cmd;
ret = 0;
cleanup:
+ virObjectUnref(dnsmasq_caps);
VIR_FREE(configfile);
VIR_FREE(configstr);
VIR_FREE(leaseshelper_path);
if (dctx == NULL)
goto cleanup;
- if (dnsmasqCapsRefresh(&driver->dnsmasqCaps, NULL) < 0)
+ if (networkDnsmasqCapsRefresh(driver) < 0)
goto cleanup;
ret = networkBuildDhcpDaemonCommandLine(driver, network, &cmd, pidfile, dctx);
networkStartRadvd(virNetworkDriverStatePtr driver,
virNetworkObjPtr network)
{
+ dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
char *pidfile = NULL;
char *radvdpidbase = NULL;
char *configfile = NULL;
network->radvdPid = -1;
/* Is dnsmasq handling RA? */
- if (DNSMASQ_RA_SUPPORT(driver->dnsmasqCaps)) {
+ if (DNSMASQ_RA_SUPPORT(dnsmasq_caps)) {
ret = 0;
goto cleanup;
}
ret = 0;
cleanup:
+ virObjectUnref(dnsmasq_caps);
virCommandFree(cmd);
VIR_FREE(configfile);
VIR_FREE(radvdpidbase);
networkRefreshRadvd(virNetworkDriverStatePtr driver,
virNetworkObjPtr network)
{
+ dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
char *radvdpidbase;
/* Is dnsmasq handling RA? */
- if (DNSMASQ_RA_SUPPORT(driver->dnsmasqCaps)) {
+ if (DNSMASQ_RA_SUPPORT(dnsmasq_caps)) {
+ virObjectUnref(dnsmasq_caps);
if (network->radvdPid <= 0)
return 0;
/* radvd should not be running but in case it is */
network->radvdPid = -1;
return 0;
}
+ virObjectUnref(dnsmasq_caps);
/* if there's no running radvd, just start it */
if (network->radvdPid <= 0 || (kill(network->radvdPid, 0) < 0))