Move stat and mkdir to virFileMakePathHelper.
Also use the stat result to detect whether the existing path
is a directory and set errno accordingly if it's not.
---
src/util/util.c | 44 ++++++++++++++------------------------------
1 files changed, 14 insertions(+), 30 deletions(-)
diff --git a/src/util/util.c b/src/util/util.c
index 4710fc5..d944123 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -1013,11 +1013,17 @@ int virDirCreate(const char *path ATTRIBUTE_UNUSED,
static int virFileMakePathHelper(char *path)
{
struct stat st;
- char *p = NULL;
+ char *p;
- if (stat(path, &st) >= 0)
- return 0;
- else if (errno != ENOENT)
+ if (stat(path, &st) >= 0) {
+ if (S_ISDIR(st.st_mode))
+ return 0;
+
+ errno = ENOTDIR;
+ return -1;
+ }
+
+ if (errno != ENOENT)
return -1;
if ((p = strrchr(path, '/')) == NULL) {
@@ -1049,39 +1055,17 @@ static int virFileMakePathHelper(char *path)
int virFileMakePath(const char *path)
{
int ret = -1;
- struct stat st;
- char *parent = NULL;
- char *p;
-
- if (stat(path, &st) >= 0)
- return 0;
- else if (errno != ENOENT)
- goto cleanup;
+ char *tmp;
- if ((parent = strdup(path)) == NULL) {
+ if ((tmp = strdup(path)) == NULL) {
errno = ENOMEM;
goto cleanup;
}
- if ((p = strrchr(parent, '/')) == NULL) {
- errno = EINVAL;
- goto cleanup;
- }
-
- if (p != parent) {
- *p = '\0';
-
- if (virFileMakePathHelper(parent) < 0)
- goto cleanup;
- }
-
- if (mkdir(path, 0777) < 0 && errno != EEXIST)
- goto cleanup;
-
- ret = 0;
+ ret = virFileMakePathHelper(tmp);
cleanup:
- VIR_FREE(parent);
+ VIR_FREE(tmp);
return ret;
}
--
1.7.4.1