* libmisc/copydir.c (remove_tree): As we always use remove_tree
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sat, 24 May 2008 15:35:15 +0000 (15:35 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sat, 24 May 2008 15:35:15 +0000 (15:35 +0000)
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
libmisc/copydir.c
src/userdel.c
src/usermod.c

index 2bb4fe6cf1d4f60d4fb4f01610f06e8b49c494fc..4773f9a1fcea7103f98ae05215d085709628775a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-05-24  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * 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  <nicolas.francois@centraliens.net>
 
        * libmisc/copydir.c (remove_tree): Make sure unlink is successful
index 7bbe9684724646f9eebe4c66675408d668925e97..b30df3d27dd8903c300a09c9f8a4dd81ff3d6ef2 100644 (file)
@@ -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;
 }
 
index 91ea5e073e40250982f9aec4652baf08afa58f05..66a300b1474c8f849d4cebe5fc0d956287ef041c 100644 (file)
@@ -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);
index 28fd5823b915f7ba79e30be8efa25ca4bb879354..c09907a95236f59cc9d10e2b39393882ebf7dc86 100644 (file)
@@ -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,
                                 _