bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

remove.c clean-up


From: Jim Meyering
Subject: remove.c clean-up
Date: Wed, 24 Nov 2004 22:32:26 +0100

I've just checked this in.
There is no change in functionality.

        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.

        * src/remove.c (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.

Index: remove.c
===================================================================
RCS file: /fetish/cu/src/remove.c,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -p -u -r1.118 -r1.119
--- remove.c    21 Oct 2004 10:37:18 -0000      1.118
+++ remove.c    24 Nov 2004 21:30:18 -0000      1.119
@@ -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, ch
               _("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
   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, str
 
   /* 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 
 
   /* 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 con
       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 con
           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 *fi
 }
 
 /* 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)
 {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]