448 lines
16 KiB
Diff
448 lines
16 KiB
Diff
|
diff -ur libvirt-1.0.5.old/src/network/bridge_driver.c libvirt-1.0.5/src/network/bridge_driver.c
|
||
|
--- libvirt-1.0.5.old/src/network/bridge_driver.c 2013-05-02 03:18:51.000000000 +0100
|
||
|
+++ libvirt-1.0.5/src/network/bridge_driver.c 2013-05-03 14:20:03.666753641 +0100
|
||
|
@@ -1,4 +1,3 @@
|
||
|
-
|
||
|
/*
|
||
|
* bridge_driver.c: core driver methods for managing network
|
||
|
*
|
||
|
@@ -67,12 +66,6 @@
|
||
|
#include "virdbus.h"
|
||
|
#include "virfile.h"
|
||
|
|
||
|
-#define NETWORK_PID_DIR LOCALSTATEDIR "/run/libvirt/network"
|
||
|
-#define NETWORK_STATE_DIR LOCALSTATEDIR "/lib/libvirt/network"
|
||
|
-
|
||
|
-#define DNSMASQ_STATE_DIR LOCALSTATEDIR "/lib/libvirt/dnsmasq"
|
||
|
-#define RADVD_STATE_DIR LOCALSTATEDIR "/lib/libvirt/radvd"
|
||
|
-
|
||
|
#define VIR_FROM_THIS VIR_FROM_NETWORK
|
||
|
|
||
|
/* Main driver state */
|
||
|
@@ -84,7 +77,10 @@
|
||
|
iptablesContext *iptables;
|
||
|
char *networkConfigDir;
|
||
|
char *networkAutostartDir;
|
||
|
- char *logDir;
|
||
|
+ char *stateDir;
|
||
|
+ char *pidDir;
|
||
|
+ char *dnsmasqStateDir;
|
||
|
+ char *radvdStateDir;
|
||
|
dnsmasqCapsPtr dnsmasqCaps;
|
||
|
};
|
||
|
|
||
|
@@ -133,8 +129,8 @@
|
||
|
{
|
||
|
char *leasefile;
|
||
|
|
||
|
- ignore_value(virAsprintf(&leasefile, DNSMASQ_STATE_DIR "/%s.leases",
|
||
|
- netname));
|
||
|
+ ignore_value(virAsprintf(&leasefile, "%s/%s.leases",
|
||
|
+ driverState->dnsmasqStateDir, netname));
|
||
|
return leasefile;
|
||
|
}
|
||
|
|
||
|
@@ -146,8 +142,8 @@
|
||
|
{
|
||
|
char *conffile;
|
||
|
|
||
|
- ignore_value(virAsprintf(&conffile, DNSMASQ_STATE_DIR "/%s.conf",
|
||
|
- netname));
|
||
|
+ ignore_value(virAsprintf(&conffile, "%s/%s.conf",
|
||
|
+ driverState->dnsmasqStateDir, netname));
|
||
|
return conffile;
|
||
|
}
|
||
|
|
||
|
@@ -166,8 +162,8 @@
|
||
|
{
|
||
|
char *configfile;
|
||
|
|
||
|
- ignore_value(virAsprintf(&configfile, RADVD_STATE_DIR "/%s-radvd.conf",
|
||
|
- netname));
|
||
|
+ ignore_value(virAsprintf(&configfile, "%s/%s-radvd.conf",
|
||
|
+ driverState->radvdStateDir, netname));
|
||
|
return configfile;
|
||
|
}
|
||
|
|
||
|
@@ -187,8 +183,10 @@
|
||
|
int ret = -1;
|
||
|
|
||
|
/* remove the (possibly) existing dnsmasq and radvd files */
|
||
|
- if (!(dctx = dnsmasqContextNew(def->name, DNSMASQ_STATE_DIR)))
|
||
|
+ if (!(dctx = dnsmasqContextNew(def->name,
|
||
|
+ driverState->dnsmasqStateDir))) {
|
||
|
goto cleanup;
|
||
|
+ }
|
||
|
|
||
|
if (!(leasefile = networkDnsmasqLeaseFileName(def->name)))
|
||
|
goto cleanup;
|
||
|
@@ -202,7 +200,8 @@
|
||
|
if (!(configfile = networkDnsmasqConfigFileName(def->name)))
|
||
|
goto no_memory;
|
||
|
|
||
|
- if (!(statusfile = virNetworkConfigFile(NETWORK_STATE_DIR, def->name)))
|
||
|
+ if (!(statusfile
|
||
|
+ = virNetworkConfigFile(driverState->stateDir, def->name)))
|
||
|
goto no_memory;
|
||
|
|
||
|
/* dnsmasq */
|
||
|
@@ -212,7 +211,7 @@
|
||
|
|
||
|
/* radvd */
|
||
|
unlink(radvdconfigfile);
|
||
|
- virPidFileDelete(NETWORK_PID_DIR, radvdpidbase);
|
||
|
+ virPidFileDelete(driverState->pidDir, radvdpidbase);
|
||
|
|
||
|
/* remove status file */
|
||
|
unlink(statusfile);
|
||
|
@@ -279,7 +278,7 @@
|
||
|
if (obj->def->ips && (obj->def->nips > 0)) {
|
||
|
char *radvdpidbase;
|
||
|
|
||
|
- ignore_value(virPidFileReadIfAlive(NETWORK_PID_DIR, obj->def->name,
|
||
|
+ ignore_value(virPidFileReadIfAlive(driverState->pidDir, obj->def->name,
|
||
|
&obj->dnsmasqPid,
|
||
|
dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps)));
|
||
|
|
||
|
@@ -287,7 +286,7 @@
|
||
|
virReportOOMError();
|
||
|
goto cleanup;
|
||
|
}
|
||
|
- ignore_value(virPidFileReadIfAlive(NETWORK_PID_DIR, radvdpidbase,
|
||
|
+ ignore_value(virPidFileReadIfAlive(driverState->pidDir, radvdpidbase,
|
||
|
&obj->radvdPid, RADVD));
|
||
|
VIR_FREE(radvdpidbase);
|
||
|
}
|
||
|
@@ -359,7 +358,9 @@
|
||
|
virStateInhibitCallback callback ATTRIBUTE_UNUSED,
|
||
|
void *opaque ATTRIBUTE_UNUSED)
|
||
|
{
|
||
|
- char *base = NULL;
|
||
|
+ int ret = -1;
|
||
|
+ char *configdir = NULL;
|
||
|
+ char *rundir = NULL;
|
||
|
#ifdef HAVE_FIREWALLD
|
||
|
DBusConnection *sysbus = NULL;
|
||
|
#endif
|
||
|
@@ -373,46 +374,53 @@
|
||
|
}
|
||
|
networkDriverLock(driverState);
|
||
|
|
||
|
+ /* Configuration paths one of
|
||
|
+ * ~/.libvirt/... (old style session/unprivileged)
|
||
|
+ * ~/.config/libvirt/... (new XDG session/unprivileged)
|
||
|
+ * /etc/libvirt/... && /var/(run|lib)/libvirt/... (system/privileged).
|
||
|
+ *
|
||
|
+ * NB: The qemu driver puts its domain state in /var/run, and I
|
||
|
+ * think the network driver should have used /var/run too (instead
|
||
|
+ * of /var/lib), but it's been this way for a long time, and we
|
||
|
+ * probably should change it now.
|
||
|
+ */
|
||
|
if (privileged) {
|
||
|
- if (virAsprintf(&driverState->logDir,
|
||
|
- "%s/log/libvirt/qemu", LOCALSTATEDIR) == -1)
|
||
|
- goto out_of_memory;
|
||
|
-
|
||
|
- if ((base = strdup(SYSCONFDIR "/libvirt")) == NULL)
|
||
|
+ if (!(driverState->networkConfigDir
|
||
|
+ = strdup(SYSCONFDIR "/libvirt/qemu/networks")) ||
|
||
|
+ !(driverState->networkAutostartDir
|
||
|
+ = strdup(SYSCONFDIR "/libvirt/qemu/networks/autostart")) ||
|
||
|
+ !(driverState->stateDir
|
||
|
+ = strdup(LOCALSTATEDIR "/lib/libvirt/network")) ||
|
||
|
+ !(driverState->pidDir
|
||
|
+ = strdup(LOCALSTATEDIR "/run/libvirt/network")) ||
|
||
|
+ !(driverState->dnsmasqStateDir
|
||
|
+ = strdup(LOCALSTATEDIR "/lib/libvirt/dnsmasq")) ||
|
||
|
+ !(driverState->radvdStateDir
|
||
|
+ = strdup(LOCALSTATEDIR "/lib/libvirt/radvd"))) {
|
||
|
goto out_of_memory;
|
||
|
+ }
|
||
|
} else {
|
||
|
- char *userdir = virGetUserCacheDirectory();
|
||
|
-
|
||
|
- if (!userdir)
|
||
|
+ configdir = virGetUserConfigDirectory();
|
||
|
+ rundir = virGetUserRuntimeDirectory();
|
||
|
+ if (!(configdir && rundir))
|
||
|
goto error;
|
||
|
|
||
|
- if (virAsprintf(&driverState->logDir,
|
||
|
- "%s/qemu/log", userdir) == -1) {
|
||
|
- VIR_FREE(userdir);
|
||
|
+ if ((virAsprintf(&driverState->networkConfigDir,
|
||
|
+ "%s/qemu/networks", configdir) < 0) ||
|
||
|
+ (virAsprintf(&driverState->networkAutostartDir,
|
||
|
+ "%s/qemu/networks/autostart", configdir) < 0) ||
|
||
|
+ (virAsprintf(&driverState->stateDir,
|
||
|
+ "%s/network/lib", rundir) < 0) ||
|
||
|
+ (virAsprintf(&driverState->pidDir,
|
||
|
+ "%s/network/run", rundir) < 0) ||
|
||
|
+ (virAsprintf(&driverState->dnsmasqStateDir,
|
||
|
+ "%s/dnsmasq/lib", rundir) < 0) ||
|
||
|
+ (virAsprintf(&driverState->radvdStateDir,
|
||
|
+ "%s/radvd/lib", rundir) < 0)) {
|
||
|
goto out_of_memory;
|
||
|
}
|
||
|
- VIR_FREE(userdir);
|
||
|
-
|
||
|
- userdir = virGetUserConfigDirectory();
|
||
|
- if (virAsprintf(&base, "%s", userdir) == -1) {
|
||
|
- VIR_FREE(userdir);
|
||
|
- goto out_of_memory;
|
||
|
- }
|
||
|
- VIR_FREE(userdir);
|
||
|
}
|
||
|
|
||
|
- /* Configuration paths are either ~/.libvirt/qemu/... (session) or
|
||
|
- * /etc/libvirt/qemu/... (system).
|
||
|
- */
|
||
|
- if (virAsprintf(&driverState->networkConfigDir, "%s/qemu/networks", base) == -1)
|
||
|
- goto out_of_memory;
|
||
|
-
|
||
|
- if (virAsprintf(&driverState->networkAutostartDir, "%s/qemu/networks/autostart",
|
||
|
- base) == -1)
|
||
|
- goto out_of_memory;
|
||
|
-
|
||
|
- VIR_FREE(base);
|
||
|
-
|
||
|
if (!(driverState->iptables = iptablesContextNew())) {
|
||
|
goto out_of_memory;
|
||
|
}
|
||
|
@@ -421,7 +429,7 @@
|
||
|
driverState->dnsmasqCaps = dnsmasqCapsNewFromBinary(DNSMASQ);
|
||
|
|
||
|
if (virNetworkLoadAllState(&driverState->networks,
|
||
|
- NETWORK_STATE_DIR) < 0)
|
||
|
+ driverState->stateDir) < 0)
|
||
|
goto error;
|
||
|
|
||
|
if (virNetworkLoadAllConfigs(&driverState->networks,
|
||
|
@@ -462,18 +470,19 @@
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
- return 0;
|
||
|
+ ret = 0;
|
||
|
+cleanup:
|
||
|
+ VIR_FREE(configdir);
|
||
|
+ VIR_FREE(rundir);
|
||
|
+ return ret;
|
||
|
|
||
|
out_of_memory:
|
||
|
virReportOOMError();
|
||
|
-
|
||
|
error:
|
||
|
if (driverState)
|
||
|
networkDriverUnlock(driverState);
|
||
|
-
|
||
|
- VIR_FREE(base);
|
||
|
networkStateCleanup();
|
||
|
- return -1;
|
||
|
+ goto cleanup;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
@@ -489,7 +498,7 @@
|
||
|
|
||
|
networkDriverLock(driverState);
|
||
|
virNetworkLoadAllState(&driverState->networks,
|
||
|
- NETWORK_STATE_DIR);
|
||
|
+ driverState->stateDir);
|
||
|
virNetworkLoadAllConfigs(&driverState->networks,
|
||
|
driverState->networkConfigDir,
|
||
|
driverState->networkAutostartDir);
|
||
|
@@ -516,9 +525,12 @@
|
||
|
/* free inactive networks */
|
||
|
virNetworkObjListFree(&driverState->networks);
|
||
|
|
||
|
- VIR_FREE(driverState->logDir);
|
||
|
VIR_FREE(driverState->networkConfigDir);
|
||
|
VIR_FREE(driverState->networkAutostartDir);
|
||
|
+ VIR_FREE(driverState->stateDir);
|
||
|
+ VIR_FREE(driverState->pidDir);
|
||
|
+ VIR_FREE(driverState->dnsmasqStateDir);
|
||
|
+ VIR_FREE(driverState->radvdStateDir);
|
||
|
|
||
|
if (driverState->iptables)
|
||
|
iptablesContextFree(driverState->iptables);
|
||
|
@@ -1060,32 +1072,33 @@
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
- if (virFileMakePath(NETWORK_PID_DIR) < 0) {
|
||
|
+ if (virFileMakePath(driverState->pidDir) < 0) {
|
||
|
virReportSystemError(errno,
|
||
|
_("cannot create directory %s"),
|
||
|
- NETWORK_PID_DIR);
|
||
|
+ driverState->pidDir);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
- if (virFileMakePath(NETWORK_STATE_DIR) < 0) {
|
||
|
+ if (virFileMakePath(driverState->stateDir) < 0) {
|
||
|
virReportSystemError(errno,
|
||
|
_("cannot create directory %s"),
|
||
|
- NETWORK_STATE_DIR);
|
||
|
+ driverState->stateDir);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
- if (!(pidfile = virPidFileBuildPath(NETWORK_PID_DIR, network->def->name))) {
|
||
|
+ if (!(pidfile = virPidFileBuildPath(driverState->pidDir,
|
||
|
+ network->def->name))) {
|
||
|
virReportOOMError();
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
- if (virFileMakePath(DNSMASQ_STATE_DIR) < 0) {
|
||
|
+ if (virFileMakePath(driverState->dnsmasqStateDir) < 0) {
|
||
|
virReportSystemError(errno,
|
||
|
_("cannot create directory %s"),
|
||
|
- DNSMASQ_STATE_DIR);
|
||
|
+ driverState->dnsmasqStateDir);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
- dctx = dnsmasqContextNew(network->def->name, DNSMASQ_STATE_DIR);
|
||
|
+ dctx = dnsmasqContextNew(network->def->name, driverState->dnsmasqStateDir);
|
||
|
if (dctx == NULL)
|
||
|
goto cleanup;
|
||
|
|
||
|
@@ -1113,7 +1126,7 @@
|
||
|
* pid
|
||
|
*/
|
||
|
|
||
|
- ret = virPidFileRead(NETWORK_PID_DIR, network->def->name,
|
||
|
+ ret = virPidFileRead(driverState->pidDir, network->def->name,
|
||
|
&network->dnsmasqPid);
|
||
|
if (ret < 0)
|
||
|
goto cleanup;
|
||
|
@@ -1150,8 +1163,10 @@
|
||
|
return networkStartDhcpDaemon(driver, network);
|
||
|
|
||
|
VIR_INFO("Refreshing dnsmasq for network %s", network->def->bridge);
|
||
|
- if (!(dctx = dnsmasqContextNew(network->def->name, DNSMASQ_STATE_DIR)))
|
||
|
+ if (!(dctx = dnsmasqContextNew(network->def->name,
|
||
|
+ driverState->dnsmasqStateDir))) {
|
||
|
goto cleanup;
|
||
|
+ }
|
||
|
|
||
|
/* Look for first IPv4 address that has dhcp defined.
|
||
|
* We only support dhcp-host config on one IPv4 subnetwork
|
||
|
@@ -1375,16 +1390,16 @@
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
- if (virFileMakePath(NETWORK_PID_DIR) < 0) {
|
||
|
+ if (virFileMakePath(driverState->pidDir) < 0) {
|
||
|
virReportSystemError(errno,
|
||
|
_("cannot create directory %s"),
|
||
|
- NETWORK_PID_DIR);
|
||
|
+ driverState->pidDir);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
- if (virFileMakePath(RADVD_STATE_DIR) < 0) {
|
||
|
+ if (virFileMakePath(driverState->radvdStateDir) < 0) {
|
||
|
virReportSystemError(errno,
|
||
|
_("cannot create directory %s"),
|
||
|
- RADVD_STATE_DIR);
|
||
|
+ driverState->radvdStateDir);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
@@ -1393,7 +1408,7 @@
|
||
|
virReportOOMError();
|
||
|
goto cleanup;
|
||
|
}
|
||
|
- if (!(pidfile = virPidFileBuildPath(NETWORK_PID_DIR, radvdpidbase))) {
|
||
|
+ if (!(pidfile = virPidFileBuildPath(driverState->pidDir, radvdpidbase))) {
|
||
|
virReportOOMError();
|
||
|
goto cleanup;
|
||
|
}
|
||
|
@@ -1421,7 +1436,7 @@
|
||
|
if (virCommandRun(cmd, NULL) < 0)
|
||
|
goto cleanup;
|
||
|
|
||
|
- if (virPidFileRead(NETWORK_PID_DIR, radvdpidbase, &network->radvdPid) < 0)
|
||
|
+ if (virPidFileRead(driverState->pidDir, radvdpidbase, &network->radvdPid) < 0)
|
||
|
goto cleanup;
|
||
|
|
||
|
ret = 0;
|
||
|
@@ -1448,7 +1463,7 @@
|
||
|
network->def->name) >= 0) &&
|
||
|
((radvdpidbase = networkRadvdPidfileBasename(network->def->name))
|
||
|
!= NULL)) {
|
||
|
- virPidFileDelete(NETWORK_PID_DIR, radvdpidbase);
|
||
|
+ virPidFileDelete(driverState->pidDir, radvdpidbase);
|
||
|
VIR_FREE(radvdpidbase);
|
||
|
}
|
||
|
network->radvdPid = -1;
|
||
|
@@ -1488,7 +1503,7 @@
|
||
|
network->def->name) >= 0) &&
|
||
|
((radvdpidbase = networkRadvdPidfileBasename(network->def->name))
|
||
|
!= NULL)) {
|
||
|
- virPidFileDelete(NETWORK_PID_DIR, radvdpidbase);
|
||
|
+ virPidFileDelete(driverState->pidDir, radvdpidbase);
|
||
|
VIR_FREE(radvdpidbase);
|
||
|
}
|
||
|
network->radvdPid = -1;
|
||
|
@@ -2572,7 +2587,7 @@
|
||
|
if (!(radvdpidbase = networkRadvdPidfileBasename(network->def->name))) {
|
||
|
virReportOOMError();
|
||
|
} else {
|
||
|
- virPidFileDelete(NETWORK_PID_DIR, radvdpidbase);
|
||
|
+ virPidFileDelete(driverState->pidDir, radvdpidbase);
|
||
|
VIR_FREE(radvdpidbase);
|
||
|
}
|
||
|
}
|
||
|
@@ -2673,7 +2688,8 @@
|
||
|
/* Persist the live configuration now that anything autogenerated
|
||
|
* is setup.
|
||
|
*/
|
||
|
- if ((ret = virNetworkSaveStatus(NETWORK_STATE_DIR, network)) < 0) {
|
||
|
+ if ((ret = virNetworkSaveStatus(driverState->stateDir,
|
||
|
+ network)) < 0) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
@@ -2703,7 +2719,8 @@
|
||
|
if (!virNetworkObjIsActive(network))
|
||
|
return 0;
|
||
|
|
||
|
- stateFile = virNetworkConfigFile(NETWORK_STATE_DIR, network->def->name);
|
||
|
+ stateFile = virNetworkConfigFile(driverState->stateDir,
|
||
|
+ network->def->name);
|
||
|
if (!stateFile)
|
||
|
return -1;
|
||
|
|
||
|
@@ -3368,8 +3385,10 @@
|
||
|
}
|
||
|
|
||
|
/* save current network state to disk */
|
||
|
- if ((ret = virNetworkSaveStatus(NETWORK_STATE_DIR, network)) < 0)
|
||
|
+ if ((ret = virNetworkSaveStatus(driverState->stateDir,
|
||
|
+ network)) < 0) {
|
||
|
goto cleanup;
|
||
|
+ }
|
||
|
}
|
||
|
ret = 0;
|
||
|
cleanup:
|
||
|
@@ -4702,7 +4721,7 @@
|
||
|
/* update sum of 'floor'-s of attached NICs */
|
||
|
net->floor_sum += ifaceBand->in->floor;
|
||
|
/* update status file */
|
||
|
- if (virNetworkSaveStatus(NETWORK_STATE_DIR, net) < 0) {
|
||
|
+ if (virNetworkSaveStatus(driverState->stateDir, net) < 0) {
|
||
|
ignore_value(virBitmapClearBit(net->class_id, class_id));
|
||
|
net->floor_sum -= ifaceBand->in->floor;
|
||
|
iface->data.network.actual->class_id = 0;
|
||
|
@@ -4748,7 +4767,7 @@
|
||
|
ignore_value(virBitmapClearBit(net->class_id,
|
||
|
iface->data.network.actual->class_id));
|
||
|
/* update status file */
|
||
|
- if (virNetworkSaveStatus(NETWORK_STATE_DIR, net) < 0) {
|
||
|
+ if (virNetworkSaveStatus(driverState->stateDir, net) < 0) {
|
||
|
net->floor_sum += ifaceBand->in->floor;
|
||
|
ignore_value(virBitmapSetBit(net->class_id,
|
||
|
iface->data.network.actual->class_id));
|