Commit Graph

90 Commits

Author SHA1 Message Date
Jim Meyering 4f78b3f40f (remove_dir): Give a diagnostic upon failed save_cwd,
now that that function no longer calls `error'.
2003-07-12 16:22:39 +00:00
Jim Meyering 64521cfa9a It appears that the `#pragma alloca' included via "system.h" is
adequate, since join.c uses alloca, yet lacked an in-file #pragma.

Remove `#pragma alloca'.
2003-07-12 11:38:43 +00:00
Jim Meyering 87c13cce86 (HAVE_WORKING_READDIR): Define to 0 if not defined.
(IF_READDIR_NEEDS_REWINDDIR): Remove.
(remove_cwd_entries): Rewrite to avoid IF_READDIR_NEEDS_REWINDDIR,
which was a bit weird because it couldn't be emulated by a function.
2003-05-04 07:10:21 +00:00
Jim Meyering 4ed5c260a3 Work around nasty readdir bug with Darwin6.5 and hfs file system.
(IF_READDIR_NEEDS_REWINDDIR): Define.
[! HAVE_WORKING_READDIR] (remove_cwd_entries): If readdir has just
returned NULL and there has been at least one successful unlink or
rmdir call since the opendir or previous rewinddir, then call
rewinddir and reiterate the loop.
2003-05-02 12:53:02 +00:00
Jim Meyering 4f6fe96afe Factor out common code.
(readdir_ignoring_dotdirs): New function.
(is_empty_dir): Use it here.
(remove_cwd_entries): Use it here.
2003-05-02 10:44:32 +00:00
Jim Meyering be897d7f42 (is_empty_dir): Don't closedir (NULL). 2003-04-13 09:10:50 +00:00
Jim Meyering bb726ef20b (is_empty_dir): Don't let a failing closedir
clobber errno.  Spotted by Arnold Robbins.
2003-03-30 15:02:55 +00:00
Jim Meyering 5151ce79b2 (rm): Put two local variables in static storage,
so they can't be clobbered by the potential longjmp.
2003-03-16 10:16:14 +00:00
Jim Meyering 25697ff274 (AD_stack_pop): Cast sizeof... to int before changing its sign.
This avoids a warning from gcc on 64-bit systems.
(pop_dir): Reverse order of sign change and cast, to be consistent
with the above.
2003-03-09 07:14:19 +00:00
Jim Meyering e628a56597 (AD_pop_and_chdir): Call error here, now that restore_cwd no longer does it. 2003-03-04 21:30:27 +00:00
Jim Meyering 4756c070ad (remove_cwd_entries): Include the full filename of
the offending file, not just the basename.
2003-03-03 20:03:43 +00:00
Jim Meyering 1678b8382e (remove_cwd_entries) [!ROOT_CAN_UNLINK_DIRS]: Give an
accurate diagnostic when failing to remove a file owned by some other
user.  Reported by Ivo Timmermans via Michael Stone.
This fixes Debian bug# 178471.
2003-03-03 07:55:33 +00:00
Jim Meyering 49eda1bead Include "euidaccess.h".
Remove declaration of euidaccess.
2003-02-14 07:41:27 +00:00
Jim Meyering c59a8e2d32 (remove_entry) [ROOT_CAN_UNLINK_DIRS && HAVE_STRUCT_DIRENT_D_TYPE]: If a file
has d_type == DT_UNKNOWN it may still be a directory -- or not (e.g., with
FreeBSD on an NFS-mounted file system), so resort to calling lstat to find out.
2003-01-21 18:49:49 +00:00
Jim Meyering 8df5caa414 Rename type: DS -> Dirstack_state. 2003-01-20 15:43:03 +00:00
Jim Meyering 3c7f4321a0 Remove some unnecessary parentheses. 2003-01-20 15:40:25 +00:00
Jim Meyering d31fd7a77e tweak comment 2003-01-07 16:36:45 +00:00
Jim Meyering 1ef6e79882 add a comment 2003-01-07 16:06:56 +00:00
Jim Meyering 8b6b22bcef rm could be tricked into mistakenly reporting a cycle.
* src/remove.c: [cycle_check_state]: New global.
(remove_cwd_entries): Adapt to new semantics of cycle_check.
(rm): Call cycle_check_init and cycle_check_free for each file.

When rm detects a cycle, don't abort the entire command,
but rather just the affected command line argument.
* src/remove.c: Include <setjmp.h>
(struct dirstack_state) [current_arg_jumpbuf]: New member.
(remove_cwd_entries): Call longjmp if we detect a cycle.
(rm): Call setjmp here.

* src/remove.c (cycle_check, is_power_of_two): Remove functions.
Instead, include cycle-check.h and use it.
2003-01-04 10:07:44 +00:00
Jim Meyering a3e6d3aa63 Don't include trailing /. in diagnostics about directories.
(full_filename_): When FILENAME is just `.'
and there is a nonempty directory-name part, don't append `/.'.
2003-01-04 09:45:54 +00:00
Jim Meyering b09da5c9d0 (remove_cwd_entries): Fix typos in comment. 2003-01-04 09:42:53 +00:00
Jim Meyering 818c25f686 (struct dirstack_state): Define.
To be used in place of these file-scoped globals ...
(dir_stack, len_stack, Active_dir): Remove globals.
(ds_init, ds_free): New functions.
(full_filename): Define.
(full_filename_): Rename from full_filename.



Begin to make AD_* functions more generic.

(AD_push_initial): Don't set status to RM_OK here.
(AD_push): Likewise.
(AD_INIT_OTHER_MEMBERS): Define.
(remove_dir): Define the `status' member manually after each
call to AD_push or AD_push_initial.
2003-01-04 09:41:24 +00:00
Jim Meyering a4efa35cd7 [S_ISLNK]: Don't define. It's already defined in sys2.h. 2003-01-04 08:44:11 +00:00
Jim Meyering a5f14f167e Remove all uses of `PARAMS'. 2002-12-15 20:54:29 +00:00
Jim Meyering b7e390ca09 (PARAMS): Remove definition. 2002-12-15 20:53:36 +00:00
Jim Meyering d0d7266488 (remove_entry) [ROOT_CAN_UNLINK_DIRS]: With `rm -i DIR',
don't recurse into directory, DIR.
2002-10-05 19:54:25 +00:00
Jim Meyering 37f7bae4f0 (prompt): Change comment to give a better note to translators. 2002-09-06 08:00:30 +00:00
Jim Meyering 649a00e9b8 (is_empty_dir): Detect and diagnose readdir failures.
Always close directory handle.
2002-08-29 10:42:12 +00:00
Jim Meyering 1f8ece552f (remove_cwd_entries): Use closedir (not CLOSEDIR) when ignoring any return value. 2002-08-29 10:13:57 +00:00
Jim Meyering 9a9e0503a2 (remove_cwd_entries): Detect and diagnose readdir
failures.  On some systems (at least EMC Celerra and Solaris5.8),
this appears to be necessary.
2002-08-29 09:42:43 +00:00
Jim Meyering cd79080f4a (remove_cwd_entries): Use CLOSEDIR, not closedir.
Give a diagnostic and fail if closedir fails.
2002-08-28 06:52:07 +00:00
Jim Meyering db6dff2e6e rm would prompt for non-dangling symlinks
(prompt): When not interactive, don't prompt for a symlink.
2002-07-22 06:59:26 +00:00
Jim Meyering ab4c1d5532 Under some circumstances, rm would fail due to a lack of
permissions, but give a misleading diagnostic like this:
rm: cannot chdir from `.' to `foo': Not a directory

(remove_dir): Detect the case in which unlinking a
non-directory fails with EPERM, and give an appropriate diagnostic.
2002-07-14 11:46:41 +00:00
Jim Meyering 2afe4a1677 (prompt): Fix test for write-protectedness to also
check errno == EACCES.  Otherwise, `rm dangling-symlink' would
mistakenly prompt.
2002-07-04 12:06:49 +00:00
Jim Meyering 9eea5b03dd (AD_mark_current_as_unremovable): Replace dead code with an assertion. 2002-06-29 11:50:38 +00:00
Jim Meyering 6e78c788f0 (prompt): Add a comment to help translators work
around the problem of making the translations of the adjective
`write-protected' and the corresponding run-time-variable noun
(e.g., file, directory, symlink, etc.) consistent.  From Paul Eggert.
2002-06-25 08:21:07 +00:00
Jim Meyering 7e6aff288f (rm): Fix typo in assertion. 2002-06-12 08:00:50 +00:00
Jim Meyering b965b62436 (remove_entry): Use DT_IS_DIR only if
HAVE_STRUCT_DIRENT_D_TYPE is defined.
2002-06-07 14:39:09 +00:00
Jim Meyering fb205872c1 Merge in all changes from no-recursion branch.
* src/remove.c (enum Ternary): Define type.
(prompt): Add a parameter.  Adjust callers.
(remove_entry): Attempt rmdir here, only if a directory is
`known' to be empty.  Significant rework.
(remove_dir): Propagate failure `up' also when rmdir fails.

In interactive mode, prompt only once about an empty directory.
* src/remove.c (enum Prompt_action): Define.
(prompt): Two new parameters.  Adjust all callers.

Performance.
* src/remove.c (remove_entry) [!ROOT_CAN_UNLINK_DIRS]:
Don't call rmdir here.

* src/remove.c (AD_pop_and_chdir): Don't use errno (it's not valid)
in diagnostic for changed dev/ino.
(remove_entry): Tweak diagnostic.

* src/remove.c (ROOT_CAN_UNLINK_DIRS): Define.
(AD_pop_and_chdir): Propagate status as we traverse back `up' the tree.
(DO_UNLINK, DO_RMDIR): Define.
(remove_entry) [ROOT_CAN_UNLINK_DIRS]: Add code so this works also on
systems where root can use `unlink' to remove directories.

* src/remove.c: Include file-type.h.
Include file type in prompt when asking whether to remove file.
Based on a patch from Paul Eggert.

* src/remove.c (prompt): Add comment.

* src/remove.c (remove_dir): Fix another (known) leak.

* src/remove.c (hash_freer): New function.
(AD_mark_helper): Use it.
(AD_mark_as_unremovable): xstrdup the filename argument.
(remove_dir): Free directory name.

* src/remove.c (remove_entry): Fail also when trying to remove a
directory without the --recursive option.
Change a diagnostic, s/unlink/remove/, now that it can apply also
to a directory.

* src/remove.c (is_empty_dir): New function.
(prompt): New function, factored out of...
(remove_entry): ...here.  Call it.
(remove_dir): Call prompt before rmdir.

* src/remove.c (remove_entry): Add support for prompting (e.g., -i).

* src/remove.h (UPDATE_STATUS): New macro.
* src/remove.c [AD_ent] (status): New member.  This lets us propagate
the status from a subdirectory to its parent via AD_pop_and_chdir.
(AD_push_initial): Set it.
(AD_push): Likewise.
(remove_cwd_entries): Change return type to enum RM_status, and
adjust all callers.
(rm): Use UPDATE_STATUS rather than open-coding it.

* src/remove.c (remove_entry): New function, factored out of...
(remove_cwd_entries): ...here, and...
(rm_1): ...here.

* src/remove.c (remove_cwd_entries): Add support for --verbose.
(remove_dir): Likewise.
(rm_1): Likewise.

* src/remove.c (rm): Free cwd_state, if necessary.

* src/remove.c (rm_1): Remove now useless (always true)
user_specified_name parameter.  Adjust sole caller.

* src/remove.c (rm): New function.  This interface allows
one to remove multiple arguments at a time.  This is important in
that it allows us to hide the remove_init/remove_fini functions and
the cwd_state parameter.
(rm_1): Renamed from rm.
(remove_init, remove_fini): Remove functions.  Each body is now
part of `rm'.
2002-06-02 20:49:03 +00:00
Jim Meyering ebc0c4c72f Add FIXME comment. 2002-05-03 11:46:59 +00:00
Jim Meyering 8a2075ba7d (cycle_check): Add a comment. 2002-04-27 06:46:18 +00:00
Jim Meyering a6050a7291 (cycle_check): New function containing code factored
out of remove_dir.  The sole difference is that upon detecting a
cycle, rm now dies unconditionally.  Before, in interactive mode,
it would ask the user whether to continue.
(remove_dir): Call cycle_check.
2002-04-27 06:33:08 +00:00
Jim Meyering 0199003cf9 Remove hash table, active_dir_map, used to detect directory cycles.
Instead, detect them lazily with just O(1) memory.
Suggestion from Andi Kleen.

(is_power_of_two): New function.
(print_nth_dir, make_active_dir_ent): Remove functions.
(hash_active_dir_ent, hash_compare_active_dir_ents): Likewise.
(remove_dir): Check for cycles here, ...
(rm): ... and don't check for cycles here.

(rm): Call fspec_get_full_mode here, rather than
fspec_get_filetype_mode.  We want to get the dev/ino earlier, and
at the same time as when we get the file type, to avoid the risk
that an attacker would change e.g. a directory to a symlink before
we record its dev/ino.
2002-04-25 16:40:04 +00:00
Jim Meyering d3de1d0186 (rm): Call exit with EXIT_FAILURE, not `1'. 2002-04-22 09:42:00 +00:00
Jim Meyering 8fd6feded9 (rm, remove_init, remove_fini): Don't use or even
initialize the active_dir_map unless --recursive (-r) is specified.
2002-04-22 07:35:20 +00:00
Jim Meyering c4f4cfbf11 * src/copy.c (copy_reg): Use a more concise diagnostic for
reporting replaced files.  This avoids a bug in the code,
which mishandled ino_t wider than long.
* src/remove.c (remove_dir): Likewise, twice.
2002-03-10 08:17:20 +00:00
Jim Meyering 3f81b8e189 (rm) Add comment on new parameter. 2002-03-09 21:02:05 +00:00
Jim Meyering 2c929257dc Don't allow a malicious user to trick another user's rm process into
removing unintended files.  In one scenario, if root is removing a
hierarchy that is writable by the malicious user, that user may trick
root into removing all of `/'.  Reported by Wojciech Purczynski.

(remove_dir): After chdir `..', call lstat to get the
dev/inode of "." and fail if they aren't the same as the old numbers.
(remove_cwd_entries): New parameter, `cwd_dev_ino'.
(remove_dir): Likewise.
(rm): Likewise.
Adjust all callers.
2002-03-08 16:45:31 +00:00
Jim Meyering 61d5f094fd (rm): Add a comment. 2002-02-01 23:30:23 +00:00
Jim Meyering 4d13e6fa55 Use opaque type, Hash_table, not `struct hash_table'. 2001-11-23 08:10:49 +00:00