[libstdc++] Add fd() member function to filebufs

Phil Edwards pedwards@disaster.jaj.com
Mon Dec 17 09:12:00 GMT 2001


This has been discussed endlessly on libstdc++.  Here is the simplest,
most straightforward solution; it's my original patch (mostly).

Those who disagree with this approach (including myself *grin*) have been
doing so on a conceptual basis, not an implementation one; so this patch
is /technically/ sound.  Benjamin asked me to go ahead and check it in,
since there were no disagreements on the technical issues.

Note that this only works in the default --enable-cstdio=stdio case.
Hooks are in place for the libio case, but the libio case will not compile
without a definition for fd() in place.  Since the libio case already
doesn't compile, and has not done so for many moons, I didn't investigate
the libio/glibc code.

Tested on i686/linux.  Applied to mainline.


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.


Index: config/io/basic_file_stdio.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/io/basic_file_stdio.h,v
retrieving revision 1.1
diff -u -3 -p -r1.1 basic_file_stdio.h
--- basic_file_stdio.h	2001/08/08 02:48:58	1.1
+++ basic_file_stdio.h	2001/12/17 17:05:45
@@ -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()
     { 
Index: include/bits/basic_file.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/basic_file.h,v
retrieving revision 1.11
diff -u -3 -p -r1.11 basic_file.h
--- basic_file.h	2001/11/23 16:29:01	1.11
+++ basic_file.h	2001/12/17 17:05:46
@@ -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
Index: include/bits/fstream.tcc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/fstream.tcc,v
retrieving revision 1.17
diff -u -3 -p -r1.17 fstream.tcc
--- fstream.tcc	2001/10/29 19:29:29	1.17
+++ fstream.tcc	2001/12/17 17:05:46
@@ -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)
Index: include/bits/std_fstream.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/bits/std_fstream.h,v
retrieving revision 1.12
diff -u -3 -p -r1.12 std_fstream.h
--- std_fstream.h	2001/11/02 17:38:10	1.12
+++ std_fstream.h	2001/12/17 17:05:46
@@ -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() 
       { 
Index: testsuite/27_io/filebuf_members.cc
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/27_io/filebuf_members.cc,v
retrieving revision 1.10
diff -u -3 -p -r1.10 filebuf_members.cc
--- filebuf_members.cc	2001/08/07 03:38:33	1.10
+++ filebuf_members.cc	2001/12/17 17:05:46
@@ -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;
 }



More information about the Libstdc++ mailing list