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)));