diff options
author | default <nobody@localhost> | 2023-10-22 09:18:25 +0200 |
---|---|---|
committer | default <nobody@localhost> | 2023-10-22 09:18:25 +0200 |
commit | 92fe93362c266c155f236a2f49dc7dee3c5389cc (patch) | |
tree | f61254e1e63c8a272ad9eafb6bc1b4edd274e7b3 /utils.c | |
parent | 0d78deef42cd1e5d461d98d2acefd4266d323046 (diff) |
Also delete the user directory in deluser().
Diffstat (limited to 'utils.c')
-rw-r--r-- | utils.c | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -7,6 +7,7 @@ #include "xs_time.h" #include "xs_openssl.h" #include "xs_random.h" +#include "xs_glob.h" #include "snac.h" @@ -339,6 +340,41 @@ int resetpwd(snac *snac) } +void rm_rf(const char *dir) +/* does an rm -rf (yes, I'm also scared) */ +{ + xs *d = xs_str_cat(xs_dup(dir), "/" "*"); + xs *l = xs_glob(d, 0, 0); + xs_list *p = l; + xs_str *v; + + if (dbglevel >= 1) + printf("Deleting directory %s\n", dir); + + while (xs_list_iter(&p, &v)) { + struct stat st; + + if (stat(v, &st) != -1) { + if (st.st_mode & S_IFDIR) { + rm_rf(v); + } + else { + if (dbglevel >= 1) + printf("Deleting file %s\n", v); + + if (unlink(v) == -1) + printf("ERROR: cannot delete file %s\n", v); + } + } + else + printf("ERROR: stat() fail for %s\n", v); + } + + if (rmdir(dir) == -1) + printf("ERROR: cannot delete directory %s\n", dir); +} + + int deluser(snac *user) /* deletes a user */ { @@ -361,5 +397,7 @@ int deluser(snac *user) } } + rm_rf(user->basedir); + return ret; } |