In preparation for privatizing the virNetworkObj structure, move the guts
of the Get/Set Autostart from the driver into virnetworkobj. Alter the driver
to make the calls to the networkobj code.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/conf/virnetworkobj.c | 74 +++++++++++++++++++++++++++++++++++++++++++++
src/conf/virnetworkobj.h | 11 ++++++-
src/libvirt_private.syms | 2 ++
src/network/bridge_driver.c | 53 ++++----------------------------
src/test/test_driver.c | 6 ++--
5 files changed, 96 insertions(+), 50 deletions(-)
diff --git a/src/conf/virnetworkobj.c b/src/conf/virnetworkobj.c
index 488fffd..a21aa26 100644
--- a/src/conf/virnetworkobj.c
+++ b/src/conf/virnetworkobj.c
@@ -121,6 +121,80 @@ virNetworkObjGetNewDef(virNetworkObjPtr obj)
}
+int
+virNetworkObjGetAutostart(virNetworkObjPtr obj)
+{
+ return obj->autostart;
+}
+
+
+int
+virNetworkObjSetAutostart(virNetworkObjPtr obj,
+ const char *configDir,
+ const char *autostartDir,
+ int autostart)
+{
+ virNetworkDefPtr def = obj->def;
+ char *configFile = NULL;
+ char *autostartLink = NULL;
+ int ret = -1;
+
+ if (!obj->persistent) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("cannot set autostart for transient network
'%s'"),
+ def->name);
+ return -1;
+ }
+
+ autostart = (autostart != 0);
+
+ if (obj->autostart != autostart) {
+ if (configDir && autostartDir) {
+ if (!(configFile = virNetworkConfigFile(configDir, def->name)))
+ goto cleanup;
+
+ if (!(autostartLink = virNetworkConfigFile(autostartDir,
+ def->name)))
+ goto cleanup;
+
+ if (autostart) {
+ if (virFileMakePath(autostartDir) < 0) {
+ virReportSystemError(errno,
+ _("cannot create autostart dir
'%s'"),
+ autostartDir);
+ goto cleanup;
+ }
+
+ if (symlink(configFile, autostartLink) < 0) {
+ virReportSystemError(errno,
+ _("failed to create symlink '%s'
"
+ "to '%s'"),
+ autostartLink, configFile);
+ goto cleanup;
+ }
+ } else {
+ if (unlink(autostartLink) < 0 &&
+ errno != ENOENT && errno != ENOTDIR) {
+ virReportSystemError(errno,
+ _("failed to delete symlink
'%s'"),
+ autostartLink);
+ goto cleanup;
+ }
+ }
+ }
+
+ obj->autostart = autostart;
+ }
+
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(configFile);
+ VIR_FREE(autostartLink);
+ return ret;
+}
+
+
pid_t
virNetworkObjGetDnsmasqPid(virNetworkObjPtr obj)
{
diff --git a/src/conf/virnetworkobj.h b/src/conf/virnetworkobj.h
index 4b7c982..55a5331 100644
--- a/src/conf/virnetworkobj.h
+++ b/src/conf/virnetworkobj.h
@@ -32,7 +32,7 @@ struct _virNetworkObj {
pid_t dnsmasqPid;
pid_t radvdPid;
unsigned int active : 1;
- unsigned int autostart : 1;
+ int autostart;
unsigned int persistent : 1;
virNetworkDefPtr def; /* The current definition */
@@ -56,6 +56,15 @@ virNetworkObjGetDef(virNetworkObjPtr obj);
virNetworkDefPtr
virNetworkObjGetNewDef(virNetworkObjPtr obj);
+int
+virNetworkObjGetAutostart(virNetworkObjPtr obj);
+
+int
+virNetworkObjSetAutostart(virNetworkObjPtr obj,
+ const char *configDir,
+ const char *autostartDir,
+ int autostart);
+
virMacMapPtr
virNetworkObjGetMacMap(virNetworkObjPtr obj);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6b4c37c..b148eeb 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -931,6 +931,7 @@ virNetworkObjFindByName;
virNetworkObjFindByNameLocked;
virNetworkObjFindByUUID;
virNetworkObjFindByUUIDLocked;
+virNetworkObjGetAutostart;
virNetworkObjGetClassIdMap;
virNetworkObjGetDef;
virNetworkObjGetDnsmasqPid;
@@ -954,6 +955,7 @@ virNetworkObjNew;
virNetworkObjRemoveInactive;
virNetworkObjReplacePersistentDef;
virNetworkObjSaveStatus;
+virNetworkObjSetAutostart;
virNetworkObjSetDefTransient;
virNetworkObjSetDnsmasqPid;
virNetworkObjSetFloorSum;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index f8e11e2..029f1b5 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -525,7 +525,7 @@ networkAutostartConfig(virNetworkObjPtr obj,
int ret = -1;
virObjectLock(obj);
- if (obj->autostart &&
+ if (virNetworkObjGetAutostart(obj) &&
!virNetworkObjIsActive(obj) &&
networkStartNetwork(driver, obj) < 0)
goto cleanup;
@@ -3963,7 +3963,7 @@ networkGetAutostart(virNetworkPtr net,
if (virNetworkGetAutostartEnsureACL(net->conn, virNetworkObjGetDef(obj)) < 0)
goto cleanup;
- *autostart = obj->autostart;
+ *autostart = virNetworkObjGetAutostart(obj);
ret = 0;
cleanup:
@@ -3978,63 +3978,22 @@ networkSetAutostart(virNetworkPtr net,
{
virNetworkDriverStatePtr driver = networkGetDriver();
virNetworkObjPtr obj;
- virNetworkDefPtr def;
- char *configFile = NULL, *autostartLink = NULL;
int ret = -1;
if (!(obj = networkObjFromNetwork(net)))
goto cleanup;
- def = virNetworkObjGetDef(obj);
- if (virNetworkSetAutostartEnsureACL(net->conn, def) < 0)
+ if (virNetworkSetAutostartEnsureACL(net->conn,
+ virNetworkObjGetDef(obj)) < 0)
goto cleanup;
- if (!obj->persistent) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- "%s", _("cannot set autostart for transient
network"));
+ if (virNetworkObjSetAutostart(obj, driver->networkConfigDir,
+ driver->networkAutostartDir, autostart) < 0)
goto cleanup;
- }
-
- autostart = (autostart != 0);
- if (obj->autostart != autostart) {
- if ((configFile = virNetworkConfigFile(driver->networkConfigDir,
- def->name)) == NULL)
- goto cleanup;
- if ((autostartLink = virNetworkConfigFile(driver->networkAutostartDir,
- def->name)) == NULL)
- goto cleanup;
-
- if (autostart) {
- if (virFileMakePath(driver->networkAutostartDir) < 0) {
- virReportSystemError(errno,
- _("cannot create autostart directory
'%s'"),
- driver->networkAutostartDir);
- goto cleanup;
- }
-
- if (symlink(configFile, autostartLink) < 0) {
- virReportSystemError(errno,
- _("Failed to create symlink '%s' to
'%s'"),
- autostartLink, configFile);
- goto cleanup;
- }
- } else {
- if (unlink(autostartLink) < 0 && errno != ENOENT && errno
!= ENOTDIR) {
- virReportSystemError(errno,
- _("Failed to delete symlink
'%s'"),
- autostartLink);
- goto cleanup;
- }
- }
-
- obj->autostart = autostart;
- }
ret = 0;
cleanup:
- VIR_FREE(configFile);
- VIR_FREE(autostartLink);
virNetworkObjEndAPI(&obj);
return ret;
}
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index ee473ba..e14fc63 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -3644,7 +3644,7 @@ testNetworkGetAutostart(virNetworkPtr net,
if (!(obj = testNetworkObjFindByName(privconn, net->name)))
goto cleanup;
- *autostart = obj->autostart;
+ *autostart = virNetworkObjGetAutostart(obj);
ret = 0;
cleanup:
@@ -3664,7 +3664,9 @@ testNetworkSetAutostart(virNetworkPtr net,
if (!(obj = testNetworkObjFindByName(privconn, net->name)))
goto cleanup;
- obj->autostart = autostart ? 1 : 0;
+ if (virNetworkObjSetAutostart(obj, NULL, NULL, autostart) < 0)
+ goto cleanup;
+
ret = 0;
cleanup:
--
2.9.3