From d3b1401d07ff4874964a8b534dfd8cd94dc978ae Mon Sep 17 00:00:00 2001 From: Thomas Quinot Date: Wed, 20 Aug 2008 14:35:11 +0200 Subject: [PATCH] 2008-08-20 Thomas Quinot * 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. From-SVN: r139283 --- gcc/ada/s-fileio.adb | 25 +++++++++++++++++++------ gcc/ada/sysdep.c | 26 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/gcc/ada/s-fileio.adb b/gcc/ada/s-fileio.adb index 7c20fb18f389..1109b2295af4 100644 --- a/gcc/ada/s-fileio.adb +++ b/gcc/ada/s-fileio.adb @@ -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; diff --git a/gcc/ada/sysdep.c b/gcc/ada/sysdep.c index a8f24cd71e55..9028fb585890 100644 --- a/gcc/ada/sysdep.c +++ b/gcc/ada/sysdep.c @@ -35,9 +35,14 @@ #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 +#include #if defined (sun) && defined (__SVR4) && !defined (__vxworks) /* The declaration is present in 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; + } +} -- 2.47.2