+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
}
/*
- * 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)
}
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;
}
(void) closedir (dir);
+ if (0 == err) {
+ if (rmdir (root) != 0) {
+ err = -1;
+ }
+ }
+
return err;
}
#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);
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,
return;
}
+ /* TODO: do some cleanup if the copy
+ * was started */
(void) remove_tree (user_newhome);
- (void) rmdir (user_newhome);
}
fprintf (stderr,
_