diff options
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/config/io/basic_file_stdio.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_file.h | 3 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/fstream.tcc | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/std_fstream.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/filebuf_members.cc | 29 |
6 files changed, 51 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 79feca47fe3..8ef11b77c83 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2001-12-17 Phil Edwards <pme@gcc.gnu.org> + + * include/bits/basic_file.h (__basic_file::fd): New function. + * config/io/basic_file_stdio.h (__basic_file::fd): Define. + * include/bits/std_fstream.h (basic_filebuf::fd): New function. + * include/bits/fstream.tcc (basic_filebuf::fd): Define. + * testsuite/27_io/filebuf_members.cc (test_02): New test. + 2001-12-16 Nathan Sidwell <nathan@codesourcery.com> * po/Makefile.am (.po.mo): Use POSIXLY_CORRECT argument ordering. diff --git a/libstdc++-v3/config/io/basic_file_stdio.h b/libstdc++-v3/config/io/basic_file_stdio.h index edf4d98baa9..b83085240d6 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.h +++ b/libstdc++-v3/config/io/basic_file_stdio.h @@ -134,6 +134,10 @@ namespace std __basic_file<_CharT>::is_open() { return _M_cfile != 0; } template<typename _CharT> + int + __basic_file<_CharT>::fd() { return fileno(_M_cfile) ; } + + template<typename _CharT> __basic_file<_CharT>* __basic_file<_CharT>::close() { diff --git a/libstdc++-v3/include/bits/basic_file.h b/libstdc++-v3/include/bits/basic_file.h index aa624eec448..9c0c1d36441 100644 --- a/libstdc++-v3/include/bits/basic_file.h +++ b/libstdc++-v3/include/bits/basic_file.h @@ -168,6 +168,9 @@ namespace std bool is_open(); + int + fd(); + // NB: Must match FILE specific jump table starting here--this // means all virtual functions starting with the dtor must match, // slot by slot. For glibc-based dystems, this means the _IO_FILE diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index fad16827930..7f90f2a383e 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -139,6 +139,14 @@ namespace std } template<typename _CharT, typename _Traits> + int + basic_filebuf<_CharT, _Traits>:: + fd() + { + return _M_file->fd(); + } + + template<typename _CharT, typename _Traits> typename basic_filebuf<_CharT, _Traits>::__filebuf_type* basic_filebuf<_CharT, _Traits>:: open(const char* __s, ios_base::openmode __mode) diff --git a/libstdc++-v3/include/bits/std_fstream.h b/libstdc++-v3/include/bits/std_fstream.h index 52c62d4b198..1a651b725e3 100644 --- a/libstdc++-v3/include/bits/std_fstream.h +++ b/libstdc++-v3/include/bits/std_fstream.h @@ -97,6 +97,10 @@ namespace std basic_filebuf(__c_file_type* __f, ios_base::openmode __mode, int_type __s = static_cast<int_type>(BUFSIZ)); + // Non-standard member: + int + fd(); + virtual ~basic_filebuf() { diff --git a/libstdc++-v3/testsuite/27_io/filebuf_members.cc b/libstdc++-v3/testsuite/27_io/filebuf_members.cc index 4d61ec10a23..d955ef7ed1f 100644 --- a/libstdc++-v3/testsuite/27_io/filebuf_members.cc +++ b/libstdc++-v3/testsuite/27_io/filebuf_members.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2000 Free Software Foundation, Inc. +// Copyright (C) 2001 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -24,7 +24,6 @@ // the non-portable functionality in the libstdc++-v3 IO library #include <fstream> -#include <cassert> #include <unistd.h> #include <fcntl.h> #include <testsuite_hooks.h> @@ -32,9 +31,9 @@ // verify that std::filebuf doesn't close files that it didn't open // when using the following std::filebuf ctor: // -// std::filebuf(int __fd, -// const char* __unused, -// ios_base::openmode __mode); +// std::filebuf(__c_file_type* __f, +// ios_base::openmode __mode, +// int_type __s); // // thanks to "George T. Talbot" <george@moberg.com> for uncovering // this bug/situation. @@ -78,10 +77,30 @@ test_01() return test; } +int +test_02() +{ + int first_fd = ::open(name_01, O_RDONLY); + VERIFY( first_fd != -1 ); + FILE* first_file = ::fdopen(first_fd, "r"); + VERIFY( first_file != NULL ); + std::filebuf fb (first_file, std::ios_base::in); + + int second_fd = fb.fd(); + + bool test = first_fd == second_fd; + +#ifdef DEBUG_ASSERT + assert(test); +#endif + + return test; +} int main() { test_01(); + test_02(); return 0; } |