]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cstreams.c: Only enable large file support on know supported platforms.
authorPascal Obry <obry@adacore.com>
Fri, 1 Aug 2014 08:24:09 +0000 (08:24 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 1 Aug 2014 08:24:09 +0000 (10:24 +0200)
2014-08-01  Pascal Obry  <obry@adacore.com>

        * cstreams.c: Only enable large file support on know supported
        platforms. Add missing defines/includes.

From-SVN: r213420

gcc/ada/ChangeLog
gcc/ada/cstreams.c

index 1c81d98d2daeb878088873f54f65d90a041966d6..aa296dac64d47e328d8be4337b52f13492887e95 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-01  Pascal Obry  <obry@adacore.com>
+
+       * cstreams.c: Only enable large file support on know supported
+       platforms. Add missing defines/includes.
+
 2014-08-01  Ed Schonberg  <schonberg@adacore.com>
 
        * einfo.ads, einfo.adb New flags No_Predicate_On_Actual and
index a58d9e5f76e8defa1815f61c7dd17fd352b2f3e0..23f74801cbd8d2f68aa53615f3ad664f3c2415f7 100644 (file)
 
 /* Routines required for implementing routines in Interfaces.C.Streams.  */
 
+#define _LARGEFILE_SOURCE
 #define _FILE_OFFSET_BITS 64
 /* the define above will make off_t a 64bit type on GNU/Linux */
 
 #include <stdio.h>
 #include <sys/types.h>
 
+#ifdef _AIX
+/* needed to avoid conflicting declarations */
+#include <unistd.h>
+#include <sys/mman.h>
+#endif
+
 #ifdef __vxworks
 #include "vxWorks.h"
 #endif
@@ -268,7 +275,10 @@ __gnat_fseek64 (FILE *stream, __int64 offset, int origin)
   return _fseeki64 (stream, offset, origin);
 }
 
-#else
+#elif defined(linux) || defined(sun) \
+  || defined (__FreeBSD__) || defined(__APPLE__)
+/* section for platforms having ftello/fseeko */
+
 __int64
 __gnat_ftell64 (FILE *stream)
 {
@@ -286,6 +296,26 @@ __gnat_fseek64 (FILE *stream, __int64 offset, int origin)
   else
     return -1;
 }
+
+#else
+
+__int64
+__gnat_ftell64 (FILE *stream)
+{
+  return (__int64)ftell (stream);
+}
+
+int
+__gnat_fseek64 (FILE *stream, __int64 offset, int origin)
+{
+  /* make sure that the offset is not bigger than the OS off_t, if so return
+     with error as this mean that we are trying to handle files larger than
+     2Gb on a patform not supporting it. */
+  if ((off_t)offset == offset)
+    return fseek (stream, (off_t) offset, origin);
+  else
+    return -1;
+}
 #endif
 
 #ifdef __cplusplus