1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-07-26 02:30:35 +02:00
Commit Graph

86 Commits

Author SHA1 Message Date
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
Jim Meyering 175e677c82 Include hash-pjw.h and remove definition of hash_pjw. 2001-10-05 11:46:57 +00:00
Jim Meyering fd90d8dbf8 * src/remove.c: Move true/false definitions and include from here...
* src/system.h: ...to here.
2001-08-31 06:50:44 +00:00
Jim Meyering a5bd412ed0 (dir_name, dir_len): Define to different names
to avoid shadowing warnings due to new declarations from dirname.h.
2001-05-13 15:29:15 +00:00
Jim Meyering 99fa315bf8 Include dirname.h, to get base_name 2001-05-12 09:52:56 +00:00