]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/13731 (first part: write)
authorPaolo Carlini <pcarlini@suse.de>
Thu, 12 Feb 2004 00:05:35 +0000 (00:05 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 12 Feb 2004 00:05:35 +0000 (00:05 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/config/io/basic_file_stdio.cc
libstdc++-v3/config/io/basic_file_stdio.h

index 9eef2c647e735a0dc87144e425dcb0c6e0955e4b..5926b918e7c19b136196af8654320a73f0f97068 100644 (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>
 
index 8cba0db48170ce18901ed02ff4596062a0c8a3f7..1419fdedf4bf5e5e4da6d27bc0ee46331605895b 100644 (file)
@@ -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;
   }
index 57ff4326e6b190498d5f9c153ca4186e26450dce..9c0ccfd1bad82023a55ff0ad970d13f5ccad0f68 100644 (file)
@@ -83,6 +83,9 @@ namespace std
 
       ~__basic_file();
 
+      streamsize 
+      xwrite(const char* __s, streamsize __n);
+
       streamsize 
       xsputn(const char* __s, streamsize __n);