]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Create file in virFileWriteStr() if it doesn't exist
authorJean-Baptiste Rouault <jean-baptiste.rouault@diateam.net>
Fri, 3 Dec 2010 09:47:08 +0000 (10:47 +0100)
committerEric Blake <eblake@redhat.com>
Fri, 3 Dec 2010 15:08:22 +0000 (08:08 -0700)
This patch adds a mode_t parameter to virFileWriteStr().
If mode is different from 0, virFileWriteStr() will try
to create the file if it doesn't exist.

* src/util/util.h (virFileWriteStr): Alter signature.
* src/util/util.c (virFileWriteStr): Allow file creation.
* src/network/bridge_driver.c (networkEnableIpForwarding)
(networkDisableIPV6): Adjust clients.
* src/node_device/node_device_driver.c
(nodeDeviceVportCreateDelete): Likewise.
* src/util/cgroup.c (virCgroupSetValueStr): Likewise.
* src/util/pci.c (pciBindDeviceToStub, pciUnBindDeviceFromStub):
Likewise.

src/network/bridge_driver.c
src/node_device/node_device_driver.c
src/util/cgroup.c
src/util/pci.c
src/util/util.c
src/util/util.h

index 54890f93cbbcd82e991ce2350c26251458752c6e..62639e426fb6d518bef1672fd9b7a10ecc55c601 100644 (file)
@@ -1024,7 +1024,7 @@ networkReloadIptablesRules(struct network_driver *driver)
 static int
 networkEnableIpForwarding(void)
 {
-    return virFileWriteStr("/proc/sys/net/ipv4/ip_forward", "1\n");
+    return virFileWriteStr("/proc/sys/net/ipv4/ip_forward", "1\n", 0);
 }
 
 #define SYSCTL_PATH "/proc/sys"
@@ -1045,7 +1045,7 @@ static int networkDisableIPV6(virNetworkObjPtr network)
         goto cleanup;
     }
 
-    if (virFileWriteStr(field, "1") < 0) {
+    if (virFileWriteStr(field, "1", 0) < 0) {
         virReportSystemError(errno,
                              _("cannot enable %s"), field);
         goto cleanup;
@@ -1057,7 +1057,7 @@ static int networkDisableIPV6(virNetworkObjPtr network)
         goto cleanup;
     }
 
-    if (virFileWriteStr(field, "0") < 0) {
+    if (virFileWriteStr(field, "0", 0) < 0) {
         virReportSystemError(errno,
                              _("cannot disable %s"), field);
         goto cleanup;
@@ -1069,7 +1069,7 @@ static int networkDisableIPV6(virNetworkObjPtr network)
         goto cleanup;
     }
 
-    if (virFileWriteStr(field, "1") < 0) {
+    if (virFileWriteStr(field, "1", 0) < 0) {
         virReportSystemError(errno,
                              _("cannot enable %s"), field);
         goto cleanup;
index 448cfd32c2fdab6e6061cac37289e12b89d98c04..a6c6042a467cccb004509cc8f51174e98cce7a9c 100644 (file)
@@ -454,7 +454,7 @@ nodeDeviceVportCreateDelete(const int parent_host,
         goto cleanup;
     }
 
-    if (virFileWriteStr(operation_path, vport_name) == -1) {
+    if (virFileWriteStr(operation_path, vport_name, 0) == -1) {
         virReportSystemError(errno,
                              _("Write of '%s' to '%s' during "
                                "vport create/delete failed"),
index 2758a8fde74094758cd02be5ca3dbb85e9970805..3ba6325b3df9a48771716575abaf1e5755b485e3 100644 (file)
@@ -288,7 +288,7 @@ static int virCgroupSetValueStr(virCgroupPtr group,
         return rc;
 
     VIR_DEBUG("Set value '%s' to '%s'", keypath, value);
-    rc = virFileWriteStr(keypath, value);
+    rc = virFileWriteStr(keypath, value, 0);
     if (rc < 0) {
         DEBUG("Failed to write value '%s': %m", value);
         rc = -errno;
index d38cefabe6888674ae21176e560c393c65d65d78..095ad3f1eff20a8a64785b10dd121a5956ec6b53 100644 (file)
@@ -849,7 +849,7 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver)
      * bound by the stub.
      */
     pciDriverFile(path, sizeof(path), driver, "new_id");
-    if (virFileWriteStr(path, dev->id) < 0) {
+    if (virFileWriteStr(path, dev->id, 0) < 0) {
         virReportSystemError(errno,
                              _("Failed to add PCI device ID '%s' to %s"),
                              dev->id, driver);
@@ -862,7 +862,7 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver)
      * your root filesystem.
      */
     pciDeviceFile(path, sizeof(path), dev->name, "driver/unbind");
-    if (virFileExists(path) && virFileWriteStr(path, dev->name) < 0) {
+    if (virFileExists(path) && virFileWriteStr(path, dev->name, 0) < 0) {
         virReportSystemError(errno,
                              _("Failed to unbind PCI device '%s'"), dev->name);
         return -1;
@@ -875,7 +875,7 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver)
     if (!virFileLinkPointsTo(path, drvdir)) {
         /* Xen's pciback.ko wants you to use new_slot first */
         pciDriverFile(path, sizeof(path), driver, "new_slot");
-        if (virFileExists(path) && virFileWriteStr(path, dev->name) < 0) {
+        if (virFileExists(path) && virFileWriteStr(path, dev->name, 0) < 0) {
             virReportSystemError(errno,
                                  _("Failed to add slot for PCI device '%s' to %s"),
                                  dev->name, driver);
@@ -883,7 +883,7 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver)
         }
 
         pciDriverFile(path, sizeof(path), driver, "bind");
-        if (virFileWriteStr(path, dev->name) < 0) {
+        if (virFileWriteStr(path, dev->name, 0) < 0) {
             virReportSystemError(errno,
                                  _("Failed to bind PCI device '%s' to %s"),
                                  dev->name, driver);
@@ -895,7 +895,7 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver)
      * ID table so that 'drivers_probe' works below.
      */
     pciDriverFile(path, sizeof(path), driver, "remove_id");
-    if (virFileExists(path) && virFileWriteStr(path, dev->id) < 0) {
+    if (virFileExists(path) && virFileWriteStr(path, dev->id, 0) < 0) {
         virReportSystemError(errno,
                              _("Failed to remove PCI ID '%s' from %s"),
                              dev->id, driver);
@@ -936,7 +936,7 @@ pciUnBindDeviceFromStub(pciDevice *dev, const char *driver)
     pciDeviceFile(path, sizeof(path), dev->name, "driver");
     if (virFileExists(drvdir) && virFileLinkPointsTo(path, drvdir)) {
         pciDriverFile(path, sizeof(path), driver, "unbind");
-        if (virFileWriteStr(path, dev->name) < 0) {
+        if (virFileWriteStr(path, dev->name, 0) < 0) {
             virReportSystemError(errno,
                                  _("Failed to bind PCI device '%s' to %s"),
                                  dev->name, driver);
@@ -946,7 +946,7 @@ pciUnBindDeviceFromStub(pciDevice *dev, const char *driver)
 
     /* Xen's pciback.ko wants you to use remove_slot on the specific device */
     pciDriverFile(path, sizeof(path), driver, "remove_slot");
-    if (virFileExists(path) && virFileWriteStr(path, dev->name) < 0) {
+    if (virFileExists(path) && virFileWriteStr(path, dev->name, 0) < 0) {
         virReportSystemError(errno,
                              _("Failed to remove slot for PCI device '%s' to %s"),
                              dev->name, driver);
@@ -961,7 +961,7 @@ pciUnBindDeviceFromStub(pciDevice *dev, const char *driver)
      */
     pciDriverFile(path, sizeof(path), driver, "remove_id");
     if (!virFileExists(drvdir) || virFileExists(path)) {
-        if (virFileWriteStr(PCI_SYSFS "drivers_probe", dev->name) < 0) {
+        if (virFileWriteStr(PCI_SYSFS "drivers_probe", dev->name, 0) < 0) {
             virReportSystemError(errno,
                                  _("Failed to trigger a re-probe for PCI device '%s'"),
                                  dev->name);
index f6050dee21ea06bb43b3e674e731791f686c50ae..79ca5d3e8a8ebbdd6ad49cea42edc3a7a9578c57 100644 (file)
@@ -1125,20 +1125,23 @@ int virFileReadAll(const char *path, int maxlen, char **buf)
     return len;
 }
 
-/* Truncate @path and write @str to it.
+/* Truncate @path and write @str to it.  If @mode is 0, ensure that
+   @path exists; otherwise, use @mode if @path must be created.
    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 virFileWriteStr(const char *path, const char *str, mode_t mode)
 {
     int fd;
 
-    if ((fd = open(path, O_WRONLY|O_TRUNC)) == -1)
+    if (mode)
+        fd = open(path, O_WRONLY|O_TRUNC|O_CREAT, mode);
+    else
+        fd = open(path, O_WRONLY|O_TRUNC);
+    if (fd == -1)
         return -1;
 
     if (safewrite(fd, str, strlen(str)) < 0) {
-        int saved_errno = errno;
         VIR_FORCE_CLOSE(fd);
-        errno = saved_errno;
         return -1;
     }
 
index deaf8bbc255b1a28bac9b7c90d1f533be24325eb..ef4fc1349dfda0bc588491d403c67ade20c9369c 100644 (file)
@@ -97,7 +97,8 @@ int virFileReadLimFD(int fd, int maxlen, char **buf) ATTRIBUTE_RETURN_CHECK;
 
 int virFileReadAll(const char *path, int maxlen, char **buf) ATTRIBUTE_RETURN_CHECK;
 
-int virFileWriteStr(const char *path, const char *str) ATTRIBUTE_RETURN_CHECK;
+int virFileWriteStr(const char *path, const char *str, mode_t mode)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
 
 int virFileMatchesNameSuffix(const char *file,
                              const char *name,