From 4de4d7ffb00cd2dedd19dc9a600376e22f09d799 Mon Sep 17 00:00:00 2001 From: Timo Wischer Date: Tue, 23 Oct 2018 15:16:15 +0200 Subject: [PATCH] JackSocket: Continue read/write if only partly done If a message was only written partly this has not to be interpreted as a fatal error. With this change it tries to continue reading/writing as long as there are bytes read/written. In addition errno is only valid in case of a return value of -1. Therefore errno will only be read on a negative error value, now. Change-Id: I4b46142c480e016b187bc606b248176eb23aefd8 Signed-off-by: Timo Wischer --- posix/JackSocket.cpp | 60 ++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/posix/JackSocket.cpp b/posix/JackSocket.cpp index be43d011..230142dd 100644 --- a/posix/JackSocket.cpp +++ b/posix/JackSocket.cpp @@ -166,6 +166,8 @@ int JackClientSocket::Close() int JackClientSocket::Read(void* data, int len) { + int pos = 0; + uint8_t* buffer = (uint8_t*)data; int res; #if defined(__sun__) || defined(sun) @@ -193,25 +195,31 @@ int JackClientSocket::Read(void* data, int len) } #endif - if ((res = read(fSocket, data, len)) != len) { - if (errno == EWOULDBLOCK || errno == EAGAIN) { - jack_error("JackClientSocket::Read time out"); - return 0; // For a non blocking socket, a read failure is not considered as an error - } else if (res != 0) { - jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno)); - //return 0; - return -1; - } else { - jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno)); + while ((res = read(fSocket, &buffer[pos], len)) != len) { + if (res < 0) { + if (errno == EWOULDBLOCK || errno == EAGAIN) { + jack_error("JackClientSocket::Read time out"); + return 0; // For a non blocking socket, a read failure is not considered as an error + } else { + jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno)); + return -1; + } + } else if (res == 0) { + jack_error("Cannot read socket fd = %d err = connection closed", fSocket); return -1; } - } else { - return 0; + + pos += res; + len -= res; } + + return 0; } int JackClientSocket::Write(void* data, int len) { + int pos = 0; + uint8_t* buffer = (uint8_t*)data; int res; #if defined(__sun__) || defined(sun) @@ -239,21 +247,25 @@ int JackClientSocket::Write(void* data, int len) } #endif - if ((res = write(fSocket, data, len)) != len) { - if (errno == EWOULDBLOCK || errno == EAGAIN) { - jack_log("JackClientSocket::Write time out"); - return 0; // For a non blocking socket, a write failure is not considered as an error - } else if (res != 0) { - jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno)); - //return 0; - return -1; - } else { - jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno)); + while ((res = write(fSocket, &buffer[pos], len)) != len) { + if (res < 0) { + if (errno == EWOULDBLOCK || errno == EAGAIN) { + jack_log("JackClientSocket::Write time out"); + return 0; // For a non blocking socket, a write failure is not considered as an error + } else { + jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno)); + return -1; + } + } else if (res == 0) { + jack_error("Cannot write socket fd = %ld err = connection closed", fSocket); return -1; } - } else { - return 0; + + pos += res; + len -= res; } + + return 0; } JackServerSocket::JackServerSocket(): fSocket( -1)