diff options
Diffstat (limited to 'libglusterfs/src/common-utils.c')
| -rw-r--r-- | libglusterfs/src/common-utils.c | 72 | 
1 files changed, 72 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index b1afa082844..3bd7c3d8fa2 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -3558,3 +3558,75 @@ err:                  GF_FREE (absolute_path);          return ret;  } + +/* This is an utility function which will recursively delete + * a folder and its contents. + * + * @param delete_path folder to be deleted. + * + * @return 0 on success and -1 on failure. + */ +int +recursive_rmdir (const char *delete_path) +{ +        int             ret             = -1; +        char            path[PATH_MAX]  = {0,}; +        struct stat     st              = {0,}; +        DIR            *dir             = NULL; +        struct dirent  *entry           = NULL; +        xlator_t       *this            = NULL; + +        this = THIS; +        GF_ASSERT (this); +        GF_VALIDATE_OR_GOTO (this->name, delete_path, out); + +        dir = opendir (delete_path); +        if (!dir) { +                gf_log (this->name, GF_LOG_DEBUG, "Failed to open directory %s." +                        " Reason : %s", delete_path, strerror (errno)); +                ret = 0; +                goto out; +        } + +        GF_FOR_EACH_ENTRY_IN_DIR (entry, dir); +        while (entry) { +                snprintf (path, PATH_MAX, "%s/%s", delete_path, entry->d_name); +                ret = lstat (path, &st); +                if (ret == -1) { +                        gf_log (this->name, GF_LOG_DEBUG, "Failed to stat " +                                "entry %s : %s", path, strerror (errno)); +                        goto out; +                } + +                if (S_ISDIR (st.st_mode)) +                        ret = recursive_rmdir (path); +                else +                        ret = unlink (path); + +                if (ret) { +                        gf_log (this->name, GF_LOG_DEBUG, " Failed to remove " +                                "%s. Reason : %s", path, strerror (errno)); +                } + +                gf_log (this->name, GF_LOG_DEBUG, "%s %s", +                                ret ? "Failed to remove":"Removed", +                                entry->d_name); + +                GF_FOR_EACH_ENTRY_IN_DIR (entry, dir); +        } + +        ret = closedir (dir); +        if (ret) { +                gf_log (this->name, GF_LOG_DEBUG, "Failed to close dir %s. " +                        "Reason : %s", delete_path, strerror (errno)); +        } + +        ret = rmdir (delete_path); +        if (ret) { +                gf_log (this->name, GF_LOG_DEBUG, "Failed to rmdir: %s,err: %s", +                        delete_path, strerror (errno)); +        } + +out: +        return ret; +}  | 
