PR libstdc++/12882 (cont)

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
This commit is contained in:
Paolo Carlini 2004-09-21 09:06:08 +00:00 committed by Paolo Carlini
parent fd375c5381
commit dd5d134bc9
4 changed files with 33 additions and 7 deletions

View 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

View 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])
])

View 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;
}

View File

@ -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;
}