diff options
author | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-11 23:18:05 +0000 |
---|---|---|
committer | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-11-11 23:18:05 +0000 |
commit | c3b8e7f75c83c7e13cb3997d1dcac387daf89f1f (patch) | |
tree | b453888a589082dd78db7efe37b82197810bdf37 /libstdc++-v3/config/io | |
parent | c005ac22c1e5ae043731a536182b05cb3315447b (diff) | |
download | gcc-c3b8e7f75c83c7e13cb3997d1dcac387daf89f1f.tar.gz |
2002-11-11 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/6746
* include/bits/fstream.tcc (filebuf::open): Set input pointers.
* config/io/basic_file_stdio.cc (__basic_file::_M_open_mode): Set
__p_mode as well.
(__basic_file::open): Set to non-block for input.
* testsuite/27_io/istream_unformatted.cc (test12): Add.
(test13): Same.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59030 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/config/io')
-rw-r--r-- | libstdc++-v3/config/io/basic_file_stdio.cc | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index 93ca6bc5de4..ff23d983ae8 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -32,6 +32,7 @@ // #include <bits/basic_file.h> +#include <fcntl.h> namespace std { @@ -43,8 +44,8 @@ namespace std { this->close(); } void - __basic_file<char>::_M_open_mode(ios_base::openmode __mode, int&, int&, - char* __c_mode) + __basic_file<char>::_M_open_mode(ios_base::openmode __mode, int& __p_mode, + int&, char* __c_mode) { bool __testb = __mode & ios_base::binary; bool __testi = __mode & ios_base::in; @@ -52,18 +53,39 @@ namespace std bool __testt = __mode & ios_base::trunc; bool __testa = __mode & ios_base::app; + // Set __c_mode for use in fopen. + // Set __p_mode for use in open. if (!__testi && __testo && !__testt && !__testa) - strcpy(__c_mode, "w"); + { + strcpy(__c_mode, "w"); + __p_mode = (O_WRONLY | O_CREAT); + } if (!__testi && __testo && !__testt && __testa) - strcpy(__c_mode, "a"); + { + strcpy(__c_mode, "a"); + __p_mode |= O_WRONLY | O_CREAT | O_APPEND; + } if (!__testi && __testo && __testt && !__testa) - strcpy(__c_mode, "w"); + { + strcpy(__c_mode, "w"); + __p_mode |= O_WRONLY | O_CREAT | O_TRUNC; + } + if (__testi && !__testo && !__testt && !__testa) - strcpy(__c_mode, "r"); + { + strcpy(__c_mode, "r"); + __p_mode |= O_RDONLY | O_NONBLOCK; + } if (__testi && __testo && !__testt && !__testa) - strcpy(__c_mode, "r+"); + { + strcpy(__c_mode, "r+"); + __p_mode |= O_RDWR | O_CREAT; + } if (__testi && __testo && __testt && !__testa) - strcpy(__c_mode, "w+"); + { + strcpy(__c_mode, "w+"); + __p_mode |= O_RDWR | O_CREAT | O_TRUNC; + } if (__testb) strcat(__c_mode, "b"); } @@ -128,6 +150,11 @@ namespace std if ((_M_cfile = fopen(__name, __c_mode))) { _M_cfile_created = true; + + // Set input to nonblocking for fifos. + if (__mode & ios_base::in) + fcntl(this->fd(), F_SETFL, O_NONBLOCK); + __ret = this; } } |