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
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,
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;
}