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