[PATCH] virsh: Ensure the parents of the readline history path exists

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Instead of changing the existed virFileMakePath to accept mode
argument and modifying a pile of its uses, this patch introduces
virFileMakePathWithMode, and use it instead of mkdir() to create
the readline history dir.
---
 src/libvirt_private.syms |    1 +
 src/util/util.c          |   15 +++++++++++----
 src/util/util.h          |    2 ++
 tools/virsh.c            |    3 ++-
 4 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6625fc6..b173590 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1146,6 +1146,7 @@ virFileIsDir;
 virFileLinkPointsTo;
 virFileLock;
 virFileMakePath;
+virFileMakePathWithMode;
 virFileMatchesNameSuffix;
 virFileOpenAs;
 virFileOpenTty;
diff --git a/src/util/util.c b/src/util/util.c
index f886ea7..47b1366 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -1248,7 +1248,7 @@ int virDirCreate(const char *path ATTRIBUTE_UNUSED,
 }
 #endif /* WIN32 */
 
-static int virFileMakePathHelper(char *path)
+static int virFileMakePathHelper(char *path, mode_t mode)
 {
     struct stat st;
     char *p;
@@ -1272,13 +1272,13 @@ static int virFileMakePathHelper(char *path)
     if (p != path) {
         *p = '\0';
 
-        if (virFileMakePathHelper(path) < 0)
+        if (virFileMakePathHelper(path, mode) < 0)
             return -1;
 
         *p = '/';
     }
 
-    if (mkdir(path, 0777) < 0 && errno != EEXIST)
+    if (mkdir(path, mode) < 0 && errno != EEXIST)
         return -1;
 
     return 0;
@@ -1292,13 +1292,20 @@ static int virFileMakePathHelper(char *path)
  */
 int virFileMakePath(const char *path)
 {
+    return virFileMakePathWithMode(path, 0777);
+}
+
+int
+virFileMakePathWithMode(const char *path,
+                        mode_t mode)
+{
     int ret = -1;
     char *tmp;
 
     if ((tmp = strdup(path)) == NULL)
         goto cleanup;
 
-    ret = virFileMakePathHelper(tmp);
+    ret = virFileMakePathHelper(tmp, mode);
 
 cleanup:
     VIR_FREE(tmp);
diff --git a/src/util/util.h b/src/util/util.h
index 0af7e6d..33226b2 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -115,6 +115,8 @@ enum {
 int virDirCreate(const char *path, mode_t mode, uid_t uid, gid_t gid,
                  unsigned int flags) ATTRIBUTE_RETURN_CHECK;
 int virFileMakePath(const char *path) ATTRIBUTE_RETURN_CHECK;
+int virFileMakePathWithMode(const char *path,
+                            mode_t mode) ATTRIBUTE_RETURN_CHECK;
 
 char *virFileBuildPath(const char *dir,
                        const char *name,
diff --git a/tools/virsh.c b/tools/virsh.c
index 9008837..01e7ce0 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -20627,7 +20627,8 @@ static void
 vshReadlineDeinit (vshControl *ctl)
 {
     if (ctl->historyfile != NULL) {
-        if (mkdir(ctl->historydir, 0755) < 0 && errno != EEXIST) {
+        if (virFileMakePathWithMode(ctl->historydir, 0755) < 0 &&
+            errno != EEXIST) {
             char ebuf[1024];
             vshError(ctl, _("Failed to create '%s': %s"),
                      ctl->historydir, virStrerror(errno, ebuf, sizeof(ebuf)));
-- 
1.7.7.3

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]