aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Villoing <villoing@adacore.com>2007-09-26 12:44:16 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2007-09-26 12:44:16 +0200
commit37d54b99bf0547aaf22ba1929c81354c7ea89514 (patch)
treea9b7b5e8ada88d38fc353bedb861d9539ba2c732
parentda2ac8c26f63fbe1d5d2c4ff23b99e81967873ff (diff)
downloadgcc-37d54b99bf0547aaf22ba1929c81354c7ea89514.zip
gcc-37d54b99bf0547aaf22ba1929c81354c7ea89514.tar.gz
gcc-37d54b99bf0547aaf22ba1929c81354c7ea89514.tar.bz2
g-dirope.adb (Remove_Dir): In case we are removing directories recursively...
2007-09-26 Florian Villoing <villoing@adacore.com> * g-dirope.adb (Remove_Dir): In case we are removing directories recursively, make sure that if an exception is raised during the processing, the current working directory is reset to its initial value before propagating the exception. From-SVN: r128792
-rw-r--r--gcc/ada/g-dirope.adb60
1 files changed, 40 insertions, 20 deletions
diff --git a/gcc/ada/g-dirope.adb b/gcc/ada/g-dirope.adb
index bb8ff93..fe9b5f1 100644
--- a/gcc/ada/g-dirope.adb
+++ b/gcc/ada/g-dirope.adb
@@ -743,32 +743,52 @@ package body GNAT.Directory_Operations is
-- Remove directory and all files and directories that it may contain
else
- Change_Dir (Dir_Name);
- Open (Working_Dir, ".");
+ -- Substantial comments needed. See RH for revision 1.50 ???
- loop
- Read (Working_Dir, Str, Last);
- exit when Last = 0;
+ begin
+ Change_Dir (Dir_Name);
+ Open (Working_Dir, ".");
- if GNAT.OS_Lib.Is_Directory (Str (1 .. Last)) then
- if Str (1 .. Last) /= "." and then Str (1 .. Last) /= ".." then
- Remove_Dir (Str (1 .. Last), True);
- Remove_Dir (Str (1 .. Last));
- end if;
+ loop
+ Read (Working_Dir, Str, Last);
+ exit when Last = 0;
- else
- GNAT.OS_Lib.Delete_File (Str (1 .. Last), Success);
+ if GNAT.OS_Lib.Is_Directory (Str (1 .. Last)) then
+ if Str (1 .. Last) /= "."
+ and then
+ Str (1 .. Last) /= ".."
+ then
+ Remove_Dir (Str (1 .. Last), True);
+ Remove_Dir (Str (1 .. Last));
+ end if;
+
+ else
+ GNAT.OS_Lib.Delete_File (Str (1 .. Last), Success);
- if not Success then
- Change_Dir (Current_Dir);
- raise Directory_Error;
+ if not Success then
+ Change_Dir (Current_Dir);
+ raise Directory_Error;
+ end if;
end if;
- end if;
- end loop;
+ end loop;
+
+ Change_Dir (Current_Dir);
+ Close (Working_Dir);
+ Remove_Dir (Dir_Name);
+
+ exception
+ when others =>
- Change_Dir (Current_Dir);
- Close (Working_Dir);
- Remove_Dir (Dir_Name);
+ -- An exception occurred. We must make sure the current working
+ -- directory is unchanged.
+
+ Change_Dir (Current_Dir);
+
+ -- What if the Change_Dir raises an exception itself, shouldn't
+ -- that be protected? ???
+
+ raise;
+ end;
end if;
end Remove_Dir;