PR libstdc++/12882 (cont)
authorPaolo Carlini <pcarlini@suse.de>
Tue, 21 Sep 2004 09:06:08 +0000 (09:06 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 21 Sep 2004 09:06:08 +0000 (09:06 +0000)
2004-09-21  Paolo Carlini  <pcarlini@suse.de>

PR libstdc++/12882 (cont)
* acinclude.m4 (GLIBCXX_CHECK_LFS): Check for fstat64 too.
* configure: Regenerate.
* config/io/basic_file_stdio.cc (__basic_file<>::showmanyc): When
_GLIBCXX_USE_LFS use fstat64 and lseek64, thus providing a non
trivial showmanyc for large files too.

From-SVN: r87797

libstdc++-v3/ChangeLog
libstdc++-v3/acinclude.m4
libstdc++-v3/config/io/basic_file_stdio.cc
libstdc++-v3/configure

index d32dc805d698e7c978c29452e1b0f0cefb9d2479..6452377a92235e31b77cc5efad5ba8dcaf0a3d91 100644 (file)
@@ -1,3 +1,12 @@
+2004-09-21  Paolo Carlini  <pcarlini@suse.de>
+
+       PR libstdc++/12882 (cont)
+       * acinclude.m4 (GLIBCXX_CHECK_LFS): Check for fstat64 too.
+       * configure: Regenerate.
+       * config/io/basic_file_stdio.cc (__basic_file<>::showmanyc): When
+       _GLIBCXX_USE_LFS use fstat64 and lseek64, thus providing a non
+       trivial showmanyc for large files too.
+
 2004-09-17  Jonathan Wakely  <redi@gcc.gnu.org>
 
        * include/bits/stl_algo.h (remove): Remove too restrictive
index 97b20a724f01d86bd08a4c8ab5596f03f133dc1b..6e531007cac8e4ec5cd25aad1ebe823552d853cb 100644 (file)
@@ -573,12 +573,15 @@ AC_DEFUN([GLIBCXX_CHECK_LFS], [
     AC_TRY_LINK(
       [#include <unistd.h>
        #include <stdio.h>
+       #include <sys/stat.h>
       ],
       [FILE* fp;
        fopen64("t", "w");
        fseeko64(fp, 0, SEEK_CUR);
        ftello64(fp);
-       lseek64(1, 0, SEEK_CUR);],      
+       lseek64(1, 0, SEEK_CUR);
+       struct stat64 buf;
+       fstat64(1, &buf);],
       [glibcxx_cv_LFS=yes],
       [glibcxx_cv_LFS=no])
   ])
index 0a4e154ebbc9c054c953cc076a27775ef08f33d6..c5cbf04b8dae5b41b73f7eb5091245fb2a0accdf 100644 (file)
@@ -68,7 +68,7 @@
 # endif
 #endif
 
-#include <limits> // For <off_t>::max() and min()
+#include <limits> // For <off_t>::max() and min() and <streamsize>::max()
 
 namespace __gnu_internal
 {
@@ -315,8 +315,8 @@ namespace std
 #ifdef _GLIBCXX_USE_LFS
     return lseek64(this->fd(), __off, __way);
 #else
-    if (__off > std::numeric_limits<off_t>::max()
-       || __off < std::numeric_limits<off_t>::min())
+    if (__off > numeric_limits<off_t>::max()
+       || __off < numeric_limits<off_t>::min())
       return -1L;
     return lseek(this->fd(), __off, __way);
 #endif
@@ -352,10 +352,21 @@ namespace std
 
 #if defined(_GLIBCXX_HAVE_S_ISREG) || defined(_GLIBCXX_HAVE_S_IFREG)
     // Regular files.
+#ifdef _GLIBCXX_USE_LFS
+    struct stat64 __buffer;
+    const int __err = fstat64(this->fd(), &__buffer);
+    if (!__err && _GLIBCXX_ISREG(__buffer.st_mode))
+      {
+       const streamoff __off = __buffer.st_size - lseek64(this->fd(), 0,
+                                                          ios_base::cur);
+       return std::min(__off, streamoff(numeric_limits<streamsize>::max()));
+      }
+#else
     struct stat __buffer;
-    int __ret = fstat(this->fd(), &__buffer);
-    if (!__ret && _GLIBCXX_ISREG(__buffer.st_mode))
-       return __buffer.st_size - lseek(this->fd(), 0, ios_base::cur);
+    const int __err = fstat(this->fd(), &__buffer);
+    if (!__err && _GLIBCXX_ISREG(__buffer.st_mode))
+      return __buffer.st_size - lseek(this->fd(), 0, ios_base::cur);
+#endif
 #endif
     return 0;
   }
index 140d681cdf01976cc0e89299814f6a0ee9e86393..92492dbe5e5066e100a43a8b4bb70a3903517fe8 100755 (executable)
@@ -30148,6 +30148,7 @@ cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #include <unistd.h>
        #include <stdio.h>
+       #include <sys/stat.h>
 
 int
 main ()
@@ -30157,6 +30158,8 @@ FILE* fp;
        fseeko64(fp, 0, SEEK_CUR);
        ftello64(fp);
        lseek64(1, 0, SEEK_CUR);
+       struct stat64 buf;
+       fstat64(1, &buf);
   ;
   return 0;
 }