diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a728fed383..72367c6cc7 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1874,6 +1874,7 @@ virFileIsExecutable; virFileIsLink; virFileLinkPointsTo; virFileLock; +virFileMakeParentPath; virFileMakePath; virFileMakePathWithMode; virFileMatchesNameSuffix; diff --git a/src/util/virutil.c b/src/util/virutil.c index 1dcc5dfc12..a728903413 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -1360,6 +1360,34 @@ cleanup: return ret; } +int +virFileMakeParentPath(const char *path) +{ + char *p; + char *tmp; + int ret = -1; + + VIR_DEBUG("path=%s", path); + + if (!(tmp = strdup(path))) { + errno = ENOMEM; + return -1; + } + + if ((p = strrchr(tmp, '/')) == NULL) { + errno = EINVAL; + goto cleanup; + } + *p = '\0'; + + ret = virFileMakePathHelper(tmp, 0777); + + cleanup: + VIR_FREE(tmp); + return ret; +} + + /* Build up a fully qualified path for a config file to be * associated with a persistent guest or network */ char * diff --git a/src/util/virutil.h b/src/util/virutil.h index 750006ac49..8f2d48118a 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -123,6 +123,7 @@ int virDirCreate(const char *path, mode_t mode, uid_t uid, gid_t gid, int virFileMakePath(const char *path) ATTRIBUTE_RETURN_CHECK; int virFileMakePathWithMode(const char *path, mode_t mode) ATTRIBUTE_RETURN_CHECK; +int virFileMakeParentPath(const char *path) ATTRIBUTE_RETURN_CHECK; char *virFileBuildPath(const char *dir, const char *name,