2008-08-20 Thomas Quinot <quinot@adacore.com>
* 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
This commit is contained in:
parent
d045b07645
commit
d3b1401d07
2 changed files with 45 additions and 6 deletions
|
@ -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;
|
||||
|
|
|
@ -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 <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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue