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 + + * 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 * 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 @@ -133,6 +133,10 @@ namespace std bool __basic_file<_CharT>::is_open() { return _M_cfile != 0; } + template + int + __basic_file<_CharT>::fd() { return fileno(_M_cfile) ; } + template __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 @@ -138,6 +138,14 @@ namespace std } } + template + int + basic_filebuf<_CharT, _Traits>:: + fd() + { + return _M_file->fd(); + } + template typename basic_filebuf<_CharT, _Traits>::__filebuf_type* basic_filebuf<_CharT, _Traits>:: 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(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 -#include #include #include #include @@ -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" 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; }