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));