From 0bb6f816e363b8dbce4a4f313286e6476fdb6466 Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc@redhat.com>
Date: Fri, 13 Feb 2009 19:13:06 +0000
Subject: [PATCH] Add virFileWriteStr()

Re-factor the code from networkEnableIpForwarding() into a
utility function in preparation for code which writes to
sysfs files.
---
 ChangeLog                |  7 +++++++
 src/libvirt_private.syms |  1 +
 src/network_driver.c     | 26 ++------------------------
 src/util.c               | 24 ++++++++++++++++++++++++
 src/util.h               |  2 ++
 5 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6845ec172f..6aae1c1534 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Feb 13 19:04:57 IST 2009 Mark McLoughlin <markmc@redhat.com>
+
+	* src/libvirt_private.syms, src/util.[ch]: add
+	virFileWriteStr()
+
+	* src/network_driver.c: use it here
+
 Fri Feb 13 19:04:45 IST 2009 Mark McLoughlin <markmc@redhat.com>
 
 	* src/xml.c: fix some error strings
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 4338da7e4b..9e9b3e5187 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -279,6 +279,7 @@ virCondBroadcast;
 
 # util.h
 virFileReadAll;
+virFileWriteStr;
 virStrToLong_i;
 virStrToLong_ll;
 virStrToLong_ull;
diff --git a/src/network_driver.c b/src/network_driver.c
index 4138939112..b256e3d025 100644
--- a/src/network_driver.c
+++ b/src/network_driver.c
@@ -794,33 +794,11 @@ networkRemoveIptablesRules(struct network_driver *driver,
     iptablesSaveRules(driver->iptables);
 }
 
-/* Enable IP Forwarding.
-   Return 0 for success, nonzero for failure.
-   Be careful to preserve any errno value upon failure. */
+/* Enable IP Forwarding. Return 0 for success, nonzero for failure. */
 static int
 networkEnableIpForwarding(void)
 {
-#define PROC_IP_FORWARD "/proc/sys/net/ipv4/ip_forward"
-
-    int fd;
-
-    if ((fd = open(PROC_IP_FORWARD, O_WRONLY|O_TRUNC)) == -1)
-        return 0;
-
-    if (safewrite(fd, "1\n", 2) < 0) {
-        int saved_errno = errno;
-        close (fd);
-        errno = saved_errno;
-        return 0;
-    }
-
-    /* Use errno from failed close only if there was no write error.  */
-    if (close (fd) != 0)
-        return 0;
-
-    return 1;
-
-#undef PROC_IP_FORWARD
+    return virFileWriteStr("/proc/sys/net/ipv4/ip_forward", "1\n");
 }
 
 static int networkStartNetworkDaemon(virConnectPtr conn,
diff --git a/src/util.c b/src/util.c
index 01fe37a6c0..990433a275 100644
--- a/src/util.c
+++ b/src/util.c
@@ -774,6 +774,30 @@ int virFileReadAll(const char *path, int maxlen, char **buf)
     return len;
 }
 
+/* Truncate @path and write @str to it.
+   Return 0 for success, nonzero for failure.
+   Be careful to preserve any errno value upon failure. */
+int virFileWriteStr(const char *path, const char *str)
+{
+    int fd;
+
+    if ((fd = open(path, O_WRONLY|O_TRUNC)) == -1)
+        return -1;
+
+    if (safewrite(fd, str, strlen(str)) < 0) {
+        int saved_errno = errno;
+        close (fd);
+        errno = saved_errno;
+        return -1;
+    }
+
+    /* Use errno from failed close only if there was no write error.  */
+    if (close (fd) != 0)
+        return -1;
+
+    return 0;
+}
+
 int virFileMatchesNameSuffix(const char *file,
                              const char *name,
                              const char *suffix)
diff --git a/src/util.h b/src/util.h
index 4667b92e2f..a79cfa7c77 100644
--- a/src/util.h
+++ b/src/util.h
@@ -56,6 +56,8 @@ int virFileReadLimFD(int fd, int maxlen, char **buf);
 
 int virFileReadAll(const char *path, int maxlen, char **buf);
 
+int virFileWriteStr(const char *path, const char *str);
+
 int virFileMatchesNameSuffix(const char *file,
                              const char *name,
                              const char *suffix);