diff options
-rw-r--r-- | gcc/ada/g-dirope.adb | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/gcc/ada/g-dirope.adb b/gcc/ada/g-dirope.adb index bb8ff93fb20..fe9b5f17aa6 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; |