From cd9a4232e5bc98afd8c3ae80f0b2230ab669c0db Mon Sep 17 00:00:00 2001 From: Matthias Bolte Date: Wed, 6 Jul 2011 15:39:21 +0200 Subject: [PATCH] Reduce code duplication in virFileMakePath(Helper) 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 | 46 ++++++++++++++-------------------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/src/util/util.c b/src/util/util.c index 4710fc5015..0472e3944f 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,15 @@ 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; - - if ((parent = 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; - } + char *tmp; - if (mkdir(path, 0777) < 0 && errno != EEXIST) + if ((tmp = strdup(path)) == NULL) goto cleanup; - ret = 0; + ret = virFileMakePathHelper(tmp); cleanup: - VIR_FREE(parent); + VIR_FREE(tmp); return ret; } -- GitLab