@@ -167,6 +167,7 @@ int JackClientSocket::Close()
167167int JackClientSocket::Read (void * data, int len)
168168{
169169 int res;
170+ uint8_t * udata = (uint8_t *)data;
170171
171172#if defined(__sun__) || defined(sun)
172173 if (fTimeOut > 0 ) {
@@ -193,30 +194,32 @@ int JackClientSocket::Read(void* data, int len)
193194 }
194195#endif
195196
196- if ((res = read (fSocket , data, len)) != len) {
197- if (errno == EWOULDBLOCK || errno == EAGAIN) {
198- jack_log (" JackClientSocket::Read time out" );
199- // For a non blocking socket, a read failure is not considered as an error
200- return 0 ;
201- } else if (res != 0 ) {
202- jack_error (" Cannot read socket fd = %d res = %d err = %s" , fSocket , res, strerror (errno));
203- // return 0;
204- return -1 ;
205- } else if (errno == 0 || errno == ENOTCONN) {
206- // aborted reading due to shutdown
207- return JACK_REQUEST_ERR_ABORTED;
208- } else {
197+ while (len != 0 && (res = read (fSocket , udata, len)) != len) {
198+ if (res <= 0 ) {
199+ if (errno == EWOULDBLOCK || errno == EAGAIN) {
200+ jack_log (" JackClientSocket::Read time out on socket fd = %d" , fSocket );
201+ // For a non blocking socket, a read failure is not considered as an error
202+ memset (data, 0 , len);
203+ return 0 ;
204+ }
205+ if (errno == 0 || errno == ENOTCONN) {
206+ // aborted reading due to shutdown
207+ return JACK_REQUEST_ERR_ABORTED;
208+ }
209209 jack_error (" Cannot read socket fd = %d err = %s" , fSocket , strerror (errno));
210210 return -1 ;
211211 }
212- } else {
213- return 0 ;
212+ udata += res;
213+ len -= res ;
214214 }
215+
216+ return 0 ;
215217}
216218
217219int JackClientSocket::Write (void * data, int len)
218220{
219221 int res;
222+ uint8_t * udata = (uint8_t *)data;
220223
221224#if defined(__sun__) || defined(sun)
222225 if (fTimeOut > 0 ) {
@@ -243,21 +246,24 @@ int JackClientSocket::Write(void* data, int len)
243246 }
244247#endif
245248
246- if ((res = write (fSocket , data, len)) != len) {
247- if (errno == EWOULDBLOCK || errno == EAGAIN) {
248- jack_log (" JackClientSocket::Write time out" );
249- return 0 ; // For a non blocking socket, a write failure is not considered as an error
250- } else if (res != 0 ) {
251- jack_error (" Cannot write socket fd = %ld err = %s" , fSocket , strerror (errno));
252- // return 0;
253- return -1 ;
254- } else {
249+ while (len != 0 && (res = write (fSocket , udata, len)) != len) {
250+ if (res <= 0 ) {
251+ if (errno == EWOULDBLOCK || errno == EAGAIN) {
252+ jack_log (" JackClientSocket::Write time out on socket fd = %d" , fSocket );
253+ return 0 ; // For a non blocking socket, a write failure is not considered as an error
254+ }
255+ if (errno == 0 || errno == ENOTCONN) {
256+ // aborted reading due to shutdown
257+ return JACK_REQUEST_ERR_ABORTED;
258+ }
255259 jack_error (" Cannot write socket fd = %ld err = %s" , fSocket , strerror (errno));
256260 return -1 ;
257261 }
258- } else {
259- return 0 ;
262+ udata += res;
263+ len -= res ;
260264 }
265+
266+ return 0 ;
261267}
262268
263269JackServerSocket::JackServerSocket (): fSocket ( -1 )
0 commit comments