From ea9509b9e8ef9f3100a829858e8a67a90c1b1d5b Mon Sep 17 00:00:00 2001 From: Osier Yang Date: Tue, 10 Jul 2012 19:24:04 +0800 Subject: [PATCH] virsh: Ensure the parents of the readline history path exists 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 6625fc6525..b1735906b4 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 f886ea7007..47b13662f3 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; @@ -1291,6 +1291,13 @@ static int virFileMakePathHelper(char *path) * is set appropriately). */ int virFileMakePath(const char *path) +{ + return virFileMakePathWithMode(path, 0777); +} + +int +virFileMakePathWithMode(const char *path, + mode_t mode) { int ret = -1; char *tmp; @@ -1298,7 +1305,7 @@ int virFileMakePath(const char *path) 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 0af7e6d853..33226b2475 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 90088374da..01e7ce0f82 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)));