From 6124b59affcdacce1859158322cca8d55d4bc597 Mon Sep 17 00:00:00 2001 From: nekral-guest Date: Sat, 24 May 2008 15:35:15 +0000 Subject: [PATCH] * libmisc/copydir.c (remove_tree): As we always use remove_tree followed by rmdir to remove the directory itself, delete also the root directory in remove_tree. * src/userdel.c, src/usermod.c: Do not call rmdir after remove_tree. --- ChangeLog | 8 ++++++++ libmisc/copydir.c | 18 +++++++++++------- src/userdel.c | 3 +-- src/usermod.c | 7 ++++--- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2bb4fe6c..4773f9a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-05-24 Nicolas François + + * libmisc/copydir.c (remove_tree): As we always use remove_tree + followed by rmdir to remove the directory itself, delete also the + root directory in remove_tree. + * src/userdel.c, src/usermod.c: Do not call rmdir after + remove_tree. + 2008-05-24 Nicolas François * libmisc/copydir.c (remove_tree): Make sure unlink is successful diff --git a/libmisc/copydir.c b/libmisc/copydir.c index 7bbe9684..b30df3d2 100644 --- a/libmisc/copydir.c +++ b/libmisc/copydir.c @@ -557,10 +557,11 @@ static int copy_file (const char *src, const char *dst, } /* - * remove_tree - remove files in a directory tree + * remove_tree - delete a directory tree * * remove_tree() walks a directory tree and deletes all the files * and directories. + * At the end, it deletes the root directory itself. */ int remove_tree (const char *root) @@ -617,20 +618,17 @@ int remove_tree (const char *root) } if (S_ISDIR (sb.st_mode)) { - /* * Recursively delete this directory. */ - if (remove_tree (new_name) != 0) { err = -1; break; } - if (rmdir (new_name) != 0) { - err = -1; - break; - } } else { + /* + * Delete the file. + */ if (unlink (new_name) != 0) { err = -1; break; @@ -639,6 +637,12 @@ int remove_tree (const char *root) } (void) closedir (dir); + if (0 == err) { + if (rmdir (root) != 0) { + err = -1; + } + } + return err; } diff --git a/src/userdel.c b/src/userdel.c index 91ea5e07..66a300b1 100644 --- a/src/userdel.c +++ b/src/userdel.c @@ -794,8 +794,7 @@ int main (int argc, char **argv) #endif if (rflg) { - if (remove_tree (user_home) - || rmdir (user_home)) { + if (remove_tree (user_home) != 0) { fprintf (stderr, _("%s: error removing directory %s\n"), Prog, user_home); diff --git a/src/usermod.c b/src/usermod.c index 28fd5823..c09907a9 100644 --- a/src/usermod.c +++ b/src/usermod.c @@ -1288,12 +1288,12 @@ static void move_home (void) if (copy_tree (user_home, user_newhome, uflg ? (long int)user_newid : -1, gflg ? (long int)user_newgid : -1) == 0) { - if (remove_tree (user_home) != 0 || - rmdir (user_home) != 0) + if (remove_tree (user_home) != 0) { fprintf (stderr, _ ("%s: warning: failed to completely remove old home directory %s"), Prog, user_home); + } #ifdef WITH_AUDIT audit_logger (AUDIT_USER_CHAUTHTOK, Prog, @@ -1304,8 +1304,9 @@ static void move_home (void) return; } + /* TODO: do some cleanup if the copy + * was started */ (void) remove_tree (user_newhome); - (void) rmdir (user_newhome); } fprintf (stderr, _