OSDN Git Service

2008-08-20 Thomas Quinot <quinot@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Aug 2008 12:35:11 +0000 (12:35 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 20 Aug 2008 12:35:11 +0000 (12:35 +0000)
* s-fileio.adb (Open) Use C helper function to determine whether a
given errno value corresponds to a "file not found" error.

* sysdep.c (__gnat_is_file_not_found_error): New C helper function.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139283 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/s-fileio.adb
gcc/ada/sysdep.c

index 7c20fb1..1109b22 100644 (file)
@@ -38,7 +38,6 @@ with Interfaces.C_Streams;        use Interfaces.C_Streams;
 
 with System.CRTL;
 with System.Case_Util;            use System.Case_Util;
-with System.OS_Constants;
 with System.OS_Lib;
 with System.Soft_Links;
 
@@ -994,11 +993,25 @@ package body System.File_IO is
 
                --  Should we raise Device_Error for ENOSPC???
 
-               if System.OS_Lib.Errno = System.OS_Constants.ENOENT then
-                  raise Name_Error;
-               else
-                  raise Use_Error;
-               end if;
+               declare
+                  subtype Cint is Interfaces.C.int;
+
+                  function Is_File_Not_Found_Error
+                    (Errno_Value : Cint) return Cint;
+                  --  Non-zero when the given errno value indicates a non-
+                  --  existing file.
+
+                  pragma Import (C, Is_File_Not_Found_Error,
+                    "__gnat_is_file_not_found_error");
+               begin
+                  if Is_File_Not_Found_Error (Cint (System.OS_Lib.Errno))
+                       /= 0
+                  then
+                     raise Name_Error;
+                  else
+                     raise Use_Error;
+                  end if;
+               end;
             end if;
          end if;
       end if;
index a8f24cd..9028fb5 100644 (file)
 
 #ifdef __vxworks
 #include "ioLib.h"
+#include "dosFsLib.h"
+#ifndef __RTP__
+# include "nfsLib.h"
+#endif
 #include "selectLib.h"
 #include "vxWorks.h"
 #endif
+
 #ifdef IN_RTS
 #define POSIX
 #include "tconfig.h"
@@ -53,6 +58,7 @@
 #endif
 
 #include <time.h>
+#include <errno.h>
 
 #if defined (sun) && defined (__SVR4) && !defined (__vxworks)
 /* The declaration is present in <time.h> but conditionalized
@@ -893,3 +899,23 @@ __gnat_get_task_options (void)
 }
 
 #endif
+
+int
+__gnat_is_file_not_found_error (int errno_val) {
+   switch (errno_val) {
+      case ENOENT:
+#ifdef __vxworks
+      /* In the case of VxWorks, we also have to take into account various
+       * filesystem-specific variants of this error.
+       */
+      case S_dosFsLib_FILE_NOT_FOUND:
+#ifndef __RTP__
+      case S_nfsLib_NFSERR_NOENT:
+#endif
+#endif
+         return 1;
+
+      default:
+         return 0;
+   }
+}