diff options
author | Jim Meyering <jim@meyering.net> | 2004-11-24 21:30:18 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2004-11-24 21:30:18 +0000 |
commit | 3475a2d9935f5b90e7178b6b68ebe46d5f44710c (patch) | |
tree | 3a4e07487a8574ec87e3bdd32e83b856bd0df285 | |
parent | c2a83409775a52569440e62fc6e25f198e1241d3 (diff) | |
download | coreutils-3475a2d9935f5b90e7178b6b68ebe46d5f44710c.tar.xz |
Since the changes of 2004-05-22, the u.saved_cwd member at
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.
-rw-r--r-- | src/remove.c | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/src/remove.c b/src/remove.c index 8f381ae5d..c54b5eac9 100644 --- a/src/remove.c +++ b/src/remove.c @@ -100,17 +100,10 @@ struct AD_ent because the user declined. */ enum RM_status status; - union - { - /* The directory's dev/ino. Used to ensure that `chdir some-subdir', then - `chdir ..' takes us back to the same directory from which we started). - (valid for all but the bottommost entry on the stack. */ - struct dev_ino a; - - /* Enough information to restore the initial working directory. - (valid only for the bottommost entry on the stack) */ - struct saved_cwd saved_cwd; - } u; + /* The directory's dev/ino. Used to ensure that `chdir some-subdir', then + `chdir ..' takes us back to the same directory from which we started). + (valid for all but the bottommost entry on the stack. */ + struct dev_ino dev_ino; }; extern char *program_name; @@ -374,11 +367,15 @@ AD_stack_pop (Dirstack_state *ds) /* chdir `up' one level. Whenever using chdir '..', verify that the post-chdir dev/ino numbers for `.' match the saved ones. + If they don't match, exit nonzero. Set *PREV_DIR to the name (in malloc'd storage) of the directory (usually now empty) from which we're coming. - Return true if successful. */ -static bool -AD_pop_and_chdir (Dirstack_state *ds, char **prev_dir) + If we're at the bottom of the AD stack (about to return + to the initial working directory), then use CWD. + If that restore_cwd fails, set CWD_STATE->saved_errno. */ +static void +AD_pop_and_chdir (Dirstack_state *ds, char **prev_dir, + struct cwd_state *cwd_state) { enum RM_status old_status = AD_stack_top(ds)->status; struct AD_ent *top; @@ -412,20 +409,22 @@ AD_pop_and_chdir (Dirstack_state *ds, char **prev_dir) _("cannot lstat `.' in %s"), quote (full_filename ("."))); /* Ensure that post-chdir dev/ino match the stored ones. */ - if ( ! SAME_INODE (sb, top->u.a)) + if ( ! SAME_INODE (sb, top->dev_ino)) error (EXIT_FAILURE, 0, _("%s changed dev/ino"), quote (full_filename ("."))); } else { - if (restore_cwd (&top->u.saved_cwd) != 0) + if (restore_cwd (&cwd_state->saved_cwd) != 0) { - /* failed to return to initial working directory */ - return false; + /* We've failed to return to the initial working directory. + That failure may be harmless if x->require_restore_cwd is false, + but we do have to remember that fact, including the errno value, + so we can give an accurate diagnostic when reporting the failure + to remove a subsequent relative-named command-line argument. */ + cwd_state->saved_errno = errno; } } - - return true; } /* Initialize *HT if it is NULL. @@ -467,10 +466,10 @@ AD_mark_current_as_unremovable (Dirstack_state *ds) AD_mark_helper (&top->unremovable, curr); } -/* Push the initial cwd info onto the stack. +/* Push an initial dummy entry onto the stack. This will always be the bottommost entry on the stack. */ static void -AD_push_initial (Dirstack_state *ds, struct saved_cwd const *cwd) +AD_push_initial (Dirstack_state *ds) { struct AD_ent *top; @@ -479,8 +478,13 @@ AD_push_initial (Dirstack_state *ds, struct saved_cwd const *cwd) /* Fill in the new values. */ top = AD_stack_top (ds); - top->u.saved_cwd = *cwd; top->unremovable = NULL; + + /* These should never be used. + Give them values that might look suspicious + in a debugger or in a diagnostic. */ + top->dev_ino.st_dev = TYPE_MAXIMUM (dev_t); + top->dev_ino.st_ino = TYPE_MAXIMUM (ino_t); } /* Push info about the current working directory (".") onto the @@ -509,8 +513,8 @@ AD_push (Dirstack_state *ds, char const *dir, /* Fill in the new values. */ top = AD_stack_top (ds); - top->u.a.st_dev = sb.st_dev; - top->u.a.st_ino = sb.st_ino; + top->dev_ino.st_dev = sb.st_dev; + top->dev_ino.st_ino = sb.st_ino; top->unremovable = NULL; } @@ -1022,7 +1026,7 @@ remove_dir (Dirstack_state *ds, char const *dir, struct cwd_state **cwd_state, else (*cwd_state)->saved_errno = 0; - AD_push_initial (ds, &(*cwd_state)->saved_cwd); + AD_push_initial (ds); AD_INIT_OTHER_MEMBERS (); } @@ -1105,14 +1109,7 @@ remove_dir (Dirstack_state *ds, char const *dir, struct cwd_state **cwd_state, returned from, after nominally removing all of its contents. */ char *empty_dir; - if (! AD_pop_and_chdir (ds, &empty_dir)) - (*cwd_state)->saved_errno = errno; - - /* Note: the above may have failed due to restore_cwd failure. - That failure may be harmless if x->require_restore_cwd is false, - but we do have to remember that fact, including the errno value, - so we can give an accurate diagnostic when reporting the failure - to remove a subsequent relative-named command-line argument. */ + AD_pop_and_chdir (ds, &empty_dir, *cwd_state); /* Try to remove D only if remove_cwd_entries succeeded. */ if (tmp_status == RM_OK) @@ -1194,7 +1191,9 @@ rm_1 (Dirstack_state *ds, char const *filename, } /* Remove all files and/or directories specified by N_FILES and FILE. - Apply the options in X. */ + Apply the options in X. If X->require_restore_cwd is false, then + this function may return RM_OK even though it is unable to restore + the initial working directory. */ extern enum RM_status rm (size_t n_files, char const *const *file, struct rm_options const *x) { |