aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2004-02-12 00:05:35 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2004-02-12 00:05:35 +0000
commit98e9678463509813df378103858be0d3f6b126d7 (patch)
treeae25e5d86ff8f84df1b0806c734abe00d461a9ef
parent888ff7a12521748dbdfc5e550b3a4e0a0a311857 (diff)
downloadgcc-98e9678463509813df378103858be0d3f6b126d7.zip
gcc-98e9678463509813df378103858be0d3f6b126d7.tar.gz
gcc-98e9678463509813df378103858be0d3f6b126d7.tar.bz2
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
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/config/io/basic_file_stdio.cc41
-rw-r--r--libstdc++-v3/config/io/basic_file_stdio.h3
3 files changed, 35 insertions, 19 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 9eef2c6..5926b91 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,4 +1,14 @@
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>
PR libstdc++/14078
diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc
index 8cba0db..1419fde 100644
--- a/libstdc++-v3/config/io/basic_file_stdio.cc
+++ b/libstdc++-v3/config/io/basic_file_stdio.cc
@@ -200,16 +200,28 @@ namespace std
while (__ret == -1L && errno == EINTR);
return __ret;
}
-
- streamsize
- __basic_file<char>::xsputn(const char* __s, streamsize __n)
+
+ // Wrapper handling partial write.
+ streamsize
+ __basic_file<char>::xwrite(const char* __s, streamsize __n)
{
- streamsize __ret;
- do
- __ret = write(this->fd(), __s, __n);
- while (__ret == -1L && errno == EINTR);
- return __ret;
+ 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)
+ { 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;
}
diff --git a/libstdc++-v3/config/io/basic_file_stdio.h b/libstdc++-v3/config/io/basic_file_stdio.h
index 57ff432..9c0ccfd 100644
--- a/libstdc++-v3/config/io/basic_file_stdio.h
+++ b/libstdc++-v3/config/io/basic_file_stdio.h
@@ -84,6 +84,9 @@ namespace std
~__basic_file();
streamsize
+ xwrite(const char* __s, streamsize __n);
+
+ streamsize
xsputn(const char* __s, streamsize __n);
streamsize