summaryrefslogtreecommitdiff
path: root/src/remove.c
AgeCommit message (Collapse)Author
2006-03-10Fix a bug whereby a user with write access to a directory being removedJim Meyering
could cause the removal of that directory to fail with an erroneous diagnostic about a directory cycle. Reported by Vineet Chadha. (AD_pop_and_chdir): If the directory we're about to leave (and try to rmdir) is the one whose dev_ino is being used to detect a cycle, reset cycle_check_state.dev_ino to that of the parent.
2006-02-12fix typo in commentJim Meyering
2006-02-11rm -r must remove an empty directory, even if it is inaccessible.Jim Meyering
(close_preserve_errno): New function. (fd_to_subdirp): Don't print a diagnostic in this function. Do it from the callers instead, unless rmdir succeeds. (remove_cwd_entries, remove_dir): Adjust callers.
2006-01-06(rm_1): Remove `static' attribute on local `status'.Jim Meyering
First off, the attribute should have been `volatile' (not static) to avoid longjmp-related risk of clobber. Secondly, now there is no longer any risk of a local variable being clobbered, so there's no need for any attribute at all.
2006-01-05Give a few functions the inline attribute.Jim Meyering
(AD_pop_and_chdir): Use gotos to avoid some duplication. (AD_push): Rewrite an assertion so that the entire computation goes away when assertions are turned off.
2005-12-27(fd_to_subdirp): Open with O_DIRECTORY | O_NOCTTYPaul Eggert
| O_NOFOLLOW too, for consistency with other dir-openers. Use POSIX-preferred O_NONBLOCK rather than O_NDELAY. (is_empty_dir): Likewise.
2005-12-17(is_empty_dir): Open with O_NDELAY, so we don't hang, e.g., on a named pipe.Jim Meyering
(OPEN_NO_FOLLOW_SYMLINK): Remove definition. Use O_NOFOLLOW in place of all uses, since it is guaranteed (system.h) to be defined.
2005-12-17(OPENAT_CWD_RESTORE__REQUIRE): Remove.Paul Eggert
(OPENAT_CWD_RESTORE__ALLOW_FAILURE): Likewise. (fd_to_subdirp): Remove openat_cwd_restore_allow_failure arg; its value is now signified by whether cwd_errno is null. (fd_to_subdirp, remove_dir, rm_1); Change cwd failure indicator from pointer-to-bool to pointer-to-errno-value. All callers changed. (rm_1): Don't bother setting a local cwd failure flag and then ORing it into the caller's. Just set the caller's. (rm): Use cwd failure errno value to print a slightly-better diagnostic.
2005-11-23(rm): Don't assume C99 for-loop syntax.Paul Eggert
2005-11-22whoops. Add back decl/definition of n_lengths.Jim Meyering
2005-11-22(AD_push): Remove debugging cruft.Jim Meyering
2005-11-22tweak commentsJim Meyering
2005-11-22Rewrite. Now, this module is reentrant on systemsJim Meyering
that provide openat (Solaris), and on systems like Linux+procfs where our openat emulation code is reentrant. This also fixes a few low-probability leaks and eliminates some code that could, in very unusual circumstances, cause rm() (via a callee) to exit.
2005-11-17(AD_mark_helper): Make a `char *' parameter `const'.Jim Meyering
(AD_mark_current_as_unremovable): Likewise, but for a local. (rm_1): Likewise.
2005-11-02(remove_entry): Emit a better diagnostic when rmJim Meyering
(without -r) fails to remove a directory on a non-Linux system. This change affects only newer Solaris systems (with priv_* functions like priv_allocset). Reported by Keith Thompson.
2005-09-20(write_protected_non_symlink): Change comment to agree with the code.Jim Meyering
2005-09-19(remove_dir): Return RM_ERROR, not `1',Jim Meyering
when attempting to remove `/' with --preserve-root.
2005-09-19(remove_cwd_entries): Syntactic tweak: move anJim Meyering
assignment out of an if-expression.
2005-07-03Include "lstat.h" rather than rolling our own.Paul Eggert
2005-06-02Don't use "path" or "filename".Paul Eggert
2005-05-19(AD_mark_helper, AD_mark_current_as_unremovable):Jim Meyering
Remove inaccurate-but-harmless `const' attributes.
2005-05-16Fix Cygwin porting problem reported by Eric Blake.Paul Eggert
(DT_IS_DIR): Remove. (DT_IS_KNOWN, DT_MUST_BE): New macros. (remove_entry): Use them.
2005-05-14Include unlinkdir.h.Paul Eggert
(UNLINK_CAN_UNLINK_DIRS): Remove. (remove_entry): Use cannot_unlink_dirs () rather than UNLINK_CAN_UNLINK_DIRS.
2005-05-14Update FSF postal mail address.Jim Meyering
2005-05-14Update FSF postal mail address.Jim Meyering
2005-05-13fix grammar typo in commentJim Meyering
2005-05-13* NEWS: `rm -r' now removes all of the files it should, even onJim Meyering
systems with a buggy readdir affecting file systems inaccessible at configure time. In some unusual circumstances `rm -r' would fail to remove -- or even consider -- all entries in a directory with more than 254 (SunOS) or 338 (Darwin) entries. This could cause trouble even on other types of systems when using an affected file system via e.g., NFS. The underlying cause was a bug in readdir on those systems. Coreutils-5.2.1 and earlier used a configure-time test designed to detect precisely those problem systems, but it would detect the problem and enable remove.c's work-around code only when its configure-time test was run on a losing file system. Obviously, it couldn't detect a problem if the offending file system wasn't tested or even mounted at coreutils configure time. Now, rm itself performs a minimal-cost run-time test to detect the problem. (CONSECUTIVE_READDIR_UNLINK_THRESHOLD): Define. (remove_cwd_entries): When readdir returns NULL for a directory from which we've removed more than CONSECUTIVE_READDIR_UNLINK_THRESHOLD entries, call rewinddir and then resume the readdir/unlink loop. (UNLINK_CAN_UNLINK_DIRS): Rename from ROOT_CAN_UNLINK_DIRS.
2005-03-28(ds_init): Add `void' to make this an ANSI-style function declaration.Jim Meyering
2004-11-24Since the changes of 2004-05-22, the u.saved_cwd member atJim Meyering
the bottom of the active-directory stack was no longer strictly necessary. This change removes that member and uses the newer cwd_state parameter for the final restore_cwd. (struct AD_ent) [u]: Remove now-unnecessary union. [dev_ino]: Rename from `a'. (AD_pop_and_chdir): Add a parameter to play the role of just-removed bottom-of-stack cwd-state member. (AD_pop_and_chdir): No longer return boolean. Adjust caller. (AD_push_initial): Remove CWD parameter. Adjust caller.
2004-10-21Correct my patch of 2004-10-18.Jim Meyering
(rm): Destroy the saved_cwd here (via cwd_state), if necessary, not in remove_dir. Otherwise, removing multiple `.'-relative nonempty directories no longer worked.
2004-10-18Plug a leak that would cause rm or a cross-device mv to fail whenJim Meyering
operating on too many command-line-specified nonempty directories. (remove_dir): Destroy the `struct saved_cwd' on the top of the stack before returning. This usually closes the file descriptor that was used to return to the original working directory. Reported by Cyril Bouthors in http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/3048
2004-09-22(struct dirstack_state) [current_arg_jumpbuf]: Improve the comment.Jim Meyering
2004-07-30(right_justify), full_filename_, AD_pop_and_chdir,Paul Eggert
AD_push, prompt, remove_dir): Use bool when appropriate. (top_dir, pop_dir, full_filename_): Use size_t for sizes.
2004-07-28(remove_dir): If we can't save the state of thePaul Eggert
working directory, pretend we started from "/", not ".". This avoids a bug on hosts like Solaris that don't let you remove the working directory.
2004-06-20Include yesno.h.Jim Meyering
(top_dir): Remove now-unnecessary cast of obstack_base. (pop_dir): Likewise. (full_filename_): Likewise.
2004-06-02rm (without -f) could hang unnecessarily when attempting toJim Meyering
remove a symlink to a file on an off-line NFS-mounted partition. Reported by David Howells in https://bugzilla.redhat.com/124699. (write_protected_non_symlink): New function. Don't invoke euidaccess on symlinks. (prompt): Use write_protected_non_symlink rather than using euidaccess directly, being careful not to call lstat twice for a file.
2004-05-29rm -r would get a failed assertion when run from an inaccessibleJim Meyering
directory and with two or more command line arguments including an absolute-named directory followed by a relative-named directory. (struct cwd_state): Define. (AD_pop_and_chdir): Redesign interface so that a restore_cwd failure can be detected by the caller. Instead of returning a malloc'd directory name, communicate it to caller via a new parameter, and return an indication of whether restore_cwd failed. Update caller. Eliminate an unnecessary call to AC_stack_top. (remove_dir): Change type of cwd_state parameter to `struct cwd_state' so we can now communicate to caller whether/how functions like restore_cwd have failed. Update caller. (rm_1): Fail if we've failed to restore the working directory and the name of the next file to remove is `.'-relative. (rm): Fail if the require_restore_cwd flag is true and we've failed to restore the working directory.
2004-05-28(push_dir): Merge declaration and adjacent assignment into a single statement.Jim Meyering
2004-05-28tweak a commentJim Meyering
2004-05-28(AD_mark_helper): Eliminate unnecessary comparison.Jim Meyering
2004-05-22(rm): Use free rather than XFREE.Jim Meyering
(remove_dir): Use xmalloc, not XMALLOC. (ds_init): Likewise.
2004-05-14(AD_pop_and_chdir): Eliminate an unnecessary call to AC_stack_top.Jim Meyering
2004-05-12(AD_pop_and_chdir): Move lstat-`.' into if-blockJim Meyering
where the result is used. This avoids one unnecessary lstat call per command line argument.
2004-05-10(AD_push): Don't use errno in diagnostic about `changed dev/ino'.Jim Meyering
2004-05-08Fix bug where "rm" gave up too easily, reported by Dan Jacobsen inJim Meyering
<http://mail.gnu.org/archive/html/bug-coreutils/2004-05/msg00013.html>. (remove_entry): Check for errno values like ENOENT that show the file cannot be directory, instead of for errno values like EPERM that show the file might be a directory. This is necessary because, when a single unlink() call has multiple reasons to fail, it can set errno to any of those reasons; it's only the rare errno value like ENOENT that excludes all the other possible reasons to fail even when the file is a directory. (remove_cwd_entries): Don't attempt chdir if the file is known to not be a directory. (remove_dir): Use the same method that remove_cwd_entries uses (for some reason they differed). Don't assert that saved_errno must be EPERM; it might be just about anything.
2004-04-27(rm): Add `extern' keyword.Jim Meyering
2004-04-20(is_empty_dir): Clarify comment.Jim Meyering
2004-04-18(full_filename_): Don't leak upon failed realloc.Jim Meyering
2004-04-18(readdir_ignoring_dotdirs): Move function to system.h, renaming it. Update ↵Jim Meyering
uses.
2004-04-17(ds_init, ds_free): Declare functions to be `static'.Jim Meyering