ndb - bug#24011
ndb/src/common/util/socket_io.cpp: Fix problem with cut sockmessages
This commit is contained in:
parent
ba583978ea
commit
1ef8fe5a16
@ -53,10 +53,6 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis,
|
|||||||
if(buflen <= 1)
|
if(buflen <= 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
int sock_flags= fcntl(socket, F_GETFL);
|
|
||||||
if(fcntl(socket, F_SETFL, sock_flags | O_NONBLOCK) == -1)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
fd_set readset;
|
fd_set readset;
|
||||||
FD_ZERO(&readset);
|
FD_ZERO(&readset);
|
||||||
FD_SET(socket, &readset);
|
FD_SET(socket, &readset);
|
||||||
@ -71,43 +67,65 @@ readln_socket(NDB_SOCKET_TYPE socket, int timeout_millis,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(selectRes == -1){
|
if(selectRes == -1){
|
||||||
fcntl(socket, F_SETFL, sock_flags);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[0] = 0;
|
char* ptr = buf;
|
||||||
const int t = recv(socket, buf, buflen, MSG_PEEK);
|
int len = buflen;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
int t;
|
||||||
|
while((t = recv(socket, ptr, len, MSG_PEEK)) == -1 && errno == EINTR);
|
||||||
|
|
||||||
if(t < 1)
|
if(t < 1)
|
||||||
{
|
{
|
||||||
fcntl(socket, F_SETFL, sock_flags);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for(int i = 0; i<t; i++)
|
for(int i = 0; i<t; i++)
|
||||||
{
|
{
|
||||||
if(buf[i] == '\n'){
|
if(ptr[i] == '\n')
|
||||||
recv(socket, buf, i+1, 0);
|
{
|
||||||
buf[i] = 0;
|
/**
|
||||||
|
* Now consume
|
||||||
if(i > 0 && buf[i-1] == '\r'){
|
*/
|
||||||
i--;
|
for (len = 1 + i; len; )
|
||||||
buf[i] = 0;
|
{
|
||||||
|
while ((t = recv(socket, ptr, len, 0)) == -1 && errno == EINTR);
|
||||||
|
if (t < 1)
|
||||||
|
return -1;
|
||||||
|
ptr += t;
|
||||||
|
len -= t;
|
||||||
}
|
}
|
||||||
|
ptr[0]= 0;
|
||||||
fcntl(socket, F_SETFL, sock_flags);
|
return ptr - buf;
|
||||||
return t;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(t == (buflen - 1)){
|
for (int tmp = t; tmp; )
|
||||||
recv(socket, buf, t, 0);
|
{
|
||||||
buf[t] = 0;
|
while ((t = recv(socket, ptr, tmp, 0)) == -1 && errno == EINTR);
|
||||||
fcntl(socket, F_SETFL, sock_flags);
|
if (t < 1)
|
||||||
return buflen;
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ptr += t;
|
||||||
|
len -= t;
|
||||||
|
tmp -= t;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
FD_ZERO(&readset);
|
||||||
|
FD_SET(socket, &readset);
|
||||||
|
timeout.tv_sec = (timeout_millis / 1000);
|
||||||
|
timeout.tv_usec = (timeout_millis % 1000) * 1000;
|
||||||
|
const int selectRes = select(socket + 1, &readset, 0, 0, &timeout);
|
||||||
|
if(selectRes != 1){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} while (len > 0);
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user