Patchwork iov: Fix do_send_recv() for MinGW (also fixes a build breakage)

login
register
mail settings
Submitter Stefan Weil
Date July 11, 2012, 5:09 a.m.
Message ID <1341983345-25255-1-git-send-email-sw@weilnetz.de>
Download mbox | patch
Permalink /patch/170351/
State Accepted
Headers show

Comments

Stefan Weil - July 11, 2012, 5:09 a.m.
Commit 25e5e4c7 broke compilation for non POSIX hosts (e.g. MinGW)
because it partially replaced "ret" by "count".

It also changed the handling of EINTR in a wrong way.

The patch restores the old code for these two changes.

Signed-off-by: Stefan Weil <sw@weilnetz.de>
---
 iov.c |   11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)
Michael Tokarev - July 11, 2012, 5:25 a.m.
On 11.07.2012 09:09, Stefan Weil wrote:
> Commit 25e5e4c7 broke compilation for non POSIX hosts (e.g. MinGW)
> because it partially replaced "ret" by "count".
> 
> It also changed the handling of EINTR in a wrong way.
> 
> The patch restores the old code for these two changes.
> 
> Signed-off-by: Stefan Weil <sw@weilnetz.de>

Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>

Granted, I never _ever_ tested or even compiled this
part.   Should have been.  Thank you Stefan!

/mjt
Kevin Wolf - July 11, 2012, 12:39 p.m.
Am 11.07.2012 07:25, schrieb Michael Tokarev:
> On 11.07.2012 09:09, Stefan Weil wrote:
>> Commit 25e5e4c7 broke compilation for non POSIX hosts (e.g. MinGW)
>> because it partially replaced "ret" by "count".
>>
>> It also changed the handling of EINTR in a wrong way.
>>
>> The patch restores the old code for these two changes.
>>
>> Signed-off-by: Stefan Weil <sw@weilnetz.de>
> 
> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
> 
> Granted, I never _ever_ tested or even compiled this
> part.   Should have been.  Thank you Stefan!

Then I guess you should not have sent a pull request. :-)

Kevin
Paolo Bonzini - July 11, 2012, 1:15 p.m.
Il 11/07/2012 14:39, Kevin Wolf ha scritto:
> Am 11.07.2012 07:25, schrieb Michael Tokarev:
>> On 11.07.2012 09:09, Stefan Weil wrote:
>>> Commit 25e5e4c7 broke compilation for non POSIX hosts (e.g. MinGW)
>>> because it partially replaced "ret" by "count".
>>>
>>> It also changed the handling of EINTR in a wrong way.
>>>
>>> The patch restores the old code for these two changes.
>>>
>>> Signed-off-by: Stefan Weil <sw@weilnetz.de>
>>
>> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
>>
>> Granted, I never _ever_ tested or even compiled this
>> part.   Should have been.  Thank you Stefan!
> 
> Then I guess you should not have sent a pull request. :-)

Not that Anthony would have tested mingw...

Paolo
Anthony Liguori - July 11, 2012, 1:50 p.m.
On 07/11/2012 08:15 AM, Paolo Bonzini wrote:
> Il 11/07/2012 14:39, Kevin Wolf ha scritto:
>> Am 11.07.2012 07:25, schrieb Michael Tokarev:
>>> On 11.07.2012 09:09, Stefan Weil wrote:
>>>> Commit 25e5e4c7 broke compilation for non POSIX hosts (e.g. MinGW)
>>>> because it partially replaced "ret" by "count".
>>>>
>>>> It also changed the handling of EINTR in a wrong way.
>>>>
>>>> The patch restores the old code for these two changes.
>>>>
>>>> Signed-off-by: Stefan Weil<sw@weilnetz.de>
>>>
>>> Signed-off-by: Michael Tokarev<mjt@tls.msk.ru>
>>>
>>> Granted, I never _ever_ tested or even compiled this
>>> part.   Should have been.  Thank you Stefan!
>>
>> Then I guess you should not have sent a pull request. :-)
>
> Not that Anthony would have tested mingw...

Nope.  It's not efficient to rely on the maintainer to do your testing for you. 
  If you modify code in a non-trivial way, you should attempt to test it.

Anyway, I'll apply this patch ASAP.

Regards,

Anthony Liguori

>
> Paolo
>
>

Patch

diff --git a/iov.c b/iov.c
index 7cc08f0..b333061 100644
--- a/iov.c
+++ b/iov.c
@@ -114,9 +114,9 @@  do_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt, bool do_send)
 #else
     /* else send piece-by-piece */
     /*XXX Note: windows has WSASend() and WSARecv() */
-    unsigned i;
-    size_t count = 0;
-    for (i = 0; i < iov_cnt; ++i) {
+    unsigned i = 0;
+    ssize_t ret = 0;
+    while (i < iov_cnt) {
         ssize_t r = do_send
             ? send(sockfd, iov[i].iov_base, iov[i].iov_len, 0)
             : recv(sockfd, iov[i].iov_base, iov[i].iov_len, 0);
@@ -130,12 +130,13 @@  do_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt, bool do_send)
             /* else it is some "other" error,
              * only return if there was no data processed. */
             if (ret == 0) {
-                return -1;
+                ret = -1;
             }
             break;
         }
+        i++;
     }
-    return count;
+    return ret;
 #endif
 }