X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Futils%2Fos.c;h=7858825e1c889ad040b028284b9c4725c29a8068;hp=08cb188d172355126d16f80ed4ae096aad47ff06;hb=e9495f7a2897fcb4a16220a0baa0acd6a053da7d;hpb=4bac3d2beaba1071e0863d3d496377c515c13bac diff --git a/src/utils/os.c b/src/utils/os.c index 08cb188..7858825 100644 --- a/src/utils/os.c +++ b/src/utils/os.c @@ -36,7 +36,10 @@ #include #include +#include + #include +#include #include #include @@ -86,5 +89,56 @@ sdb_mkdir_all(const char *pathname, mode_t mode) return status; } /* sdb_mkdir_all */ +int +sdb_remove_all(const char *pathname) +{ + struct stat st; + + if ((! pathname) || (! *pathname)) { + errno = EINVAL; + return -1; + } + + memset(&st, 0, sizeof(st)); + if (stat(pathname, &st)) + return -1; + + if (S_ISDIR(st.st_mode)) { + DIR *d = opendir(pathname); + + if (! d) + return -1; + + while (42) { + struct dirent de; + struct dirent *res = NULL; + + char filename[strlen(pathname) + sizeof(de.d_name) + 2]; + + memset(&de, 0, sizeof(de)); + if (readdir_r(d, &de, &res)) { + closedir(d); + return -1; + } + + if (! res) + break; + + if ((de.d_name[0] == '.') && ((de.d_name[1] == '\0') + || ((de.d_name[1] == '.')&& (de.d_name[2] == '\0')))) + continue; + + snprintf(filename, sizeof(filename), + "%s/%s", pathname, de.d_name); + if (sdb_remove_all(filename)) { + closedir(d); + return -1; + } + } + closedir(d); + } + return remove(pathname); +} /* sdb_remove_all */ + /* vim: set tw=78 sw=4 ts=4 noexpandtab : */