PR libstdc++/13731 (first part: write)

2004-02-11  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/13731 (first part: write)
	* config/io/basic_file_stdio.h (__basic_file<char>::xwrite):
	New, declare.
	* config/io/basic_file_stdio.cc (__basic_file<char>::xwrite):
	Define it: a wrapper around write() handling partial write.
	(__basic_file<char>::xsputn): Use it.
	(__basic_file<char>::xsputn_2): Likewise.

From-SVN: r77680
This commit is contained in:
Paolo Carlini 2004-02-12 00:05:35 +00:00 committed by Paolo Carlini
parent 888ff7a125
commit 98e9678463
3 changed files with 35 additions and 19 deletions

View File

@ -1,3 +1,13 @@
2004-02-11 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/13731 (first part: write)
* config/io/basic_file_stdio.h (__basic_file<char>::xwrite):
New, declare.
* config/io/basic_file_stdio.cc (__basic_file<char>::xwrite):
Define it: a wrapper around write() handling partial write.
(__basic_file<char>::xsputn): Use it.
(__basic_file<char>::xsputn_2): Likewise.
2004-02-11 Paolo Carlini <pcarlini@suse.de>
Petur Runolfsson <peturr02@ru.is>

View File

@ -200,16 +200,28 @@ namespace std
while (__ret == -1L && errno == EINTR);
return __ret;
}
// Wrapper handling partial write.
streamsize
__basic_file<char>::xwrite(const char* __s, streamsize __n)
{
streamsize __nleft = __n;
while (__nleft > 0)
{
const streamsize __ret = write(this->fd(), __s, __nleft);
if (__ret == -1L && errno == EINTR)
continue;
else if (__ret == -1L)
break;
__nleft -= __ret;
__s += __ret;
}
return __n - __nleft;
}
streamsize
__basic_file<char>::xsputn(const char* __s, streamsize __n)
{
streamsize __ret;
do
__ret = write(this->fd(), __s, __n);
while (__ret == -1L && errno == EINTR);
return __ret;
}
{ return __basic_file<char>::xwrite(__s, __n); }
streamsize
__basic_file<char>::xsputn_2(const char* __s1, streamsize __n1,
@ -228,19 +240,10 @@ namespace std
while (__ret == -1L && errno == EINTR);
#else
if (__n1)
do
__ret = write(this->fd(), __s1, __n1);
while (__ret == -1L && errno == EINTR);
__ret = __basic_file<char>::xwrite(__s1, __n1);
if (__ret == __n1)
{
do
__ret = write(this->fd(), __s2, __n2);
while (__ret == -1L && errno == EINTR);
if (__ret != -1L)
__ret += __n1;
}
__ret += __basic_file<char>::xwrite(__s2, __n2);
#endif
return __ret;
}

View File

@ -83,6 +83,9 @@ namespace std
~__basic_file();
streamsize
xwrite(const char* __s, streamsize __n);
streamsize
xsputn(const char* __s, streamsize __n);