We will need to remove temporary directories in libalpm, therefore move this helper function to the common utilities. Signed-off-by: Jonas Witschel <diabonas@gmx.de> --- src/common/util-common.c | 42 ++++++++++++++++++++++++++++++++++++++++ src/common/util-common.h | 2 ++ src/pacman/util.c | 40 -------------------------------------- src/pacman/util.h | 1 - 4 files changed, 44 insertions(+), 41 deletions(-) diff --git a/src/common/util-common.c b/src/common/util-common.c index 3aa0eac9..098ea890 100644 --- a/src/common/util-common.c +++ b/src/common/util-common.c @@ -21,6 +21,8 @@ #include <errno.h> #include <stdlib.h> #include <string.h> +#include <dirent.h> +#include <unistd.h> #include "util-common.h" @@ -197,3 +199,43 @@ char *strndup(const char *s, size_t n) return (char *)memcpy(new, s, len); } #endif + +/* does the same thing as 'rm -rf' */ +int rmrf(const char *path) +{ + int errflag = 0; + struct dirent *dp; + DIR *dirp; + + if(!unlink(path)) { + return 0; + } else { + switch(errno) { + case ENOENT: + return 0; + case EPERM: + case EISDIR: + break; + default: + /* not a directory */ + return 1; + } + + dirp = opendir(path); + if(!dirp) { + return 1; + } + for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { + if(strcmp(dp->d_name, "..") != 0 && strcmp(dp->d_name, ".") != 0) { + char name[PATH_MAX]; + snprintf(name, PATH_MAX, "%s/%s", path, dp->d_name); + errflag += rmrf(name); + } + } + closedir(dirp); + if(rmdir(path)) { + errflag++; + } + return errflag; + } +} diff --git a/src/common/util-common.h b/src/common/util-common.h index 3434e1eb..6ab1150a 100644 --- a/src/common/util-common.h +++ b/src/common/util-common.h @@ -36,6 +36,8 @@ size_t strtrim(char *str); char *strndup(const char *s, size_t n); #endif +int rmrf(const char *path); + #define ARRAYSIZE(a) (sizeof (a) / sizeof (a[0])) #endif /* PM_UTIL_COMMON_H */ diff --git a/src/pacman/util.c b/src/pacman/util.c index 8f6290db..14fce9e6 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -247,46 +247,6 @@ unsigned short getcols(void) return c; } -/* does the same thing as 'rm -rf' */ -int rmrf(const char *path) -{ - int errflag = 0; - struct dirent *dp; - DIR *dirp; - - if(!unlink(path)) { - return 0; - } else { - switch(errno) { - case ENOENT: - return 0; - case EPERM: - case EISDIR: - break; - default: - /* not a directory */ - return 1; - } - - dirp = opendir(path); - if(!dirp) { - return 1; - } - for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { - if(strcmp(dp->d_name, "..") != 0 && strcmp(dp->d_name, ".") != 0) { - char name[PATH_MAX]; - snprintf(name, PATH_MAX, "%s/%s", path, dp->d_name); - errflag += rmrf(name); - } - } - closedir(dirp); - if(rmdir(path)) { - errflag++; - } - return errflag; - } -} - /* output a string, but wrap words properly with a specified indentation */ void indentprint(const char *str, unsigned short indent, unsigned short cols) diff --git a/src/pacman/util.h b/src/pacman/util.h index a1fbef46..1dd36882 100644 --- a/src/pacman/util.h +++ b/src/pacman/util.h @@ -53,7 +53,6 @@ int check_syncdbs(size_t need_repos, int check_valid); int sync_syncdbs(int level, alpm_list_t *syncs); unsigned short getcols(void); void columns_cache_reset(void); -int rmrf(const char *path); void indentprint(const char *str, unsigned short indent, unsigned short cols); char *strreplace(const char *str, const char *needle, const char *replace); void string_display(const char *title, const char *string, unsigned short cols); -- 2.22.0