Update of /cvsroot/playerstage/code/player/client_libs/libplayerc
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12516
Modified Files:
Tag: release-2-0-patches
client.c
Log Message:
made reads robust to EINTR
Index: client.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc/client.c,v
retrieving revision 1.61.2.2
retrieving revision 1.61.2.3
diff -C2 -d -r1.61.2.2 -r1.61.2.3
*** client.c 25 Sep 2006 17:00:15 -0000 1.61.2.2
--- client.c 19 Dec 2006 18:00:31 -0000 1.61.2.3
***************
*** 111,125 ****
struct pollfd ufd;
int ret;
!
ufd.fd = s;
ufd.events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL;
!
ret = poll (&ufd, 1, timeout);
if (ret <= 0)
{
! PLAYERC_ERR2("poll call failed with error [%d:%s]", errno,
strerror(errno));
! return ret;
}
!
return recv(s,buf,len,flags);
}
--- 111,130 ----
struct pollfd ufd;
int ret;
!
ufd.fd = s;
ufd.events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL;
!
ret = poll (&ufd, 1, timeout);
if (ret <= 0)
{
! if(errno == EINTR)
! return(0);
! else
! {
! PLAYERC_ERR2("poll call failed with error [%d:%s]", errno,
strerror(errno));
! return ret;
! }
}
!
return recv(s,buf,len,flags);
}
***************
*** 219,225 ****
return -1;
}
! /*
* INADDR_ANY indicates that any network interface (IP address)
! * for the local host may be used (presumably the OS will choose the
* right one).
*
--- 224,230 ----
return -1;
}
! /*
* INADDR_ANY indicates that any network interface (IP address)
! * for the local host may be used (presumably the OS will choose the
* right one).
*
***************
*** 230,235 ****
clientaddr.sin_port = 0;
! if(bind(client->sock,
! (struct sockaddr*)&clientaddr, sizeof(clientaddr)) < -1)
{
PLAYERC_ERR1("bind call failed with error [%s]", strerror(errno));
--- 235,240 ----
clientaddr.sin_port = 0;
! if(bind(client->sock,
! (struct sockaddr*)&clientaddr, sizeof(clientaddr)) < -1)
{
PLAYERC_ERR1("bind call failed with error [%s]", strerror(errno));
***************
*** 257,261 ****
memcpy(&client->server.sin_addr, entp->h_addr_list[0], entp->h_length);
client->server.sin_port = htons(client->port);
!
// Connect the socket
/*
--- 262,266 ----
memcpy(&client->server.sin_addr, entp->h_addr_list[0], entp->h_length);
client->server.sin_port = htons(client->port);
!
// Connect the socket
/*
***************
*** 271,275 ****
gettimeofday(&last,NULL);
puts("calling connect");
! ret = connect(client->sock, (struct sockaddr*)&client->server,
sizeof(client->server));
gettimeofday(&curr,NULL);
--- 276,280 ----
gettimeofday(&last,NULL);
puts("calling connect");
! ret = connect(client->sock, (struct sockaddr*)&client->server,
sizeof(client->server));
gettimeofday(&curr,NULL);
***************
*** 283,287 ****
timer.it_interval.tv_usec = 0;
timer.it_value.tv_sec = (int)floor(client->request_timeout);
! timer.it_value.tv_usec =
(int)rint(fmod(client->request_timeout,timer.it_value.tv_sec)*1e6);
if(setitimer(ITIMER_REAL, &timer, NULL) != 0)
--- 288,292 ----
timer.it_interval.tv_usec = 0;
timer.it_value.tv_sec = (int)floor(client->request_timeout);
! timer.it_value.tv_usec =
(int)rint(fmod(client->request_timeout,timer.it_value.tv_sec)*1e6);
if(setitimer(ITIMER_REAL, &timer, NULL) != 0)
***************
*** 304,308 ****
puts("calling connect");
! ret = connect(client->sock, (struct sockaddr*)&client->server,
sizeof(client->server));
puts("done");
--- 309,313 ----
puts("calling connect");
! ret = connect(client->sock, (struct sockaddr*)&client->server,
sizeof(client->server));
puts("done");
***************
*** 351,356 ****
return -1;
}
!
!
// Get the banner
if (timed_recv(client->sock, banner, sizeof(banner), 0, 2000) <
sizeof(banner))
--- 356,361 ----
return -1;
}
!
!
// Get the banner
if (timed_recv(client->sock, banner, sizeof(banner), 0, 2000) <
sizeof(banner))
***************
*** 387,391 ****
/* Clean out buffers */
client->read_xdrdata_len = 0;
!
/* TODO: re-establish replacement rules, delivery modes, etc. */
--- 392,396 ----
/* Clean out buffers */
client->read_xdrdata_len = 0;
!
/* TODO: re-establish replacement rules, delivery modes, etc. */
***************
*** 502,506 ****
return -1;
}
!
if (client->qlen > 0)
--- 507,511 ----
return -1;
}
!
if (client->qlen > 0)
***************
*** 518,524 ****
if (count < 0)
{
! PLAYERC_ERR1("poll returned error [%s]", strerror(errno));
! //playerc_client_disconnect(client);
! return(playerc_client_disconnect_retry(client));
}
if (count > 0 && (fd.revents & POLLHUP))
--- 523,534 ----
if (count < 0)
{
! if(errno == EINTR)
! return(0);
! else
! {
! PLAYERC_ERR1("poll returned error [%s]", strerror(errno));
! //playerc_client_disconnect(client);
! return(playerc_client_disconnect_retry(client));
! }
}
if (count > 0 && (fd.revents & POLLHUP))
***************
*** 558,565 ****
break;
case PLAYER_MSGTYPE_SYNCH:
- client->lasttime = client->datatime;
- client->datatime = header.timestamp;
return client->id;
case PLAYER_MSGTYPE_DATA:
if (client->mode == PLAYER_DATAMODE_PUSH)
// If in push mode, handle and return
--- 568,575 ----
break;
case PLAYER_MSGTYPE_SYNCH:
return client->id;
case PLAYER_MSGTYPE_DATA:
+ client->lasttime = client->datatime;
+ client->datatime = header.timestamp;
if (client->mode == PLAYER_DATAMODE_PUSH)
// If in push mode, handle and return
***************
*** 904,911 ****
return -1;
}
!
while(client->read_xdrdata_len < PLAYERXDR_MSGHDR_SIZE)
{
! nbytes = timed_recv(client->sock,
client->read_xdrdata + client->read_xdrdata_len,
PLAYERXDR_MAX_MESSAGE_SIZE - client->read_xdrdata_len,
--- 914,921 ----
return -1;
}
!
while(client->read_xdrdata_len < PLAYERXDR_MSGHDR_SIZE)
{
! nbytes = timed_recv(client->sock,
client->read_xdrdata + client->read_xdrdata_len,
PLAYERXDR_MAX_MESSAGE_SIZE - client->read_xdrdata_len,
***************
*** 913,922 ****
if (nbytes <= 0)
{
! PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
! //playerc_client_disconnect(client);
! if(playerc_client_disconnect_retry(client) < 0)
! return(-1);
! else
continue;
}
client->read_xdrdata_len += nbytes;
--- 923,937 ----
if (nbytes <= 0)
{
! if(errno == EINTR)
continue;
+ else
+ {
+ PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
+ //playerc_client_disconnect(client);
+ if(playerc_client_disconnect_retry(client) < 0)
+ return(-1);
+ else
+ continue;
+ }
}
client->read_xdrdata_len += nbytes;
***************
*** 938,942 ****
// Slide over the header
! memmove(client->read_xdrdata,
client->read_xdrdata + PLAYERXDR_MSGHDR_SIZE,
client->read_xdrdata_len - PLAYERXDR_MSGHDR_SIZE);
--- 953,957 ----
// Slide over the header
! memmove(client->read_xdrdata,
client->read_xdrdata + PLAYERXDR_MSGHDR_SIZE,
client->read_xdrdata_len - PLAYERXDR_MSGHDR_SIZE);
***************
*** 945,949 ****
while(client->read_xdrdata_len < header->size)
{
! nbytes = timed_recv(client->sock,
client->read_xdrdata + client->read_xdrdata_len,
PLAYERXDR_MAX_MESSAGE_SIZE - client->read_xdrdata_len,
--- 960,964 ----
while(client->read_xdrdata_len < header->size)
{
! nbytes = timed_recv(client->sock,
client->read_xdrdata + client->read_xdrdata_len,
PLAYERXDR_MAX_MESSAGE_SIZE - client->read_xdrdata_len,
***************
*** 951,963 ****
if (nbytes <= 0)
{
! PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
! //playerc_client_disconnect(client);
! if(playerc_client_disconnect_retry(client) < 0)
! return(-1);
! else
{
! /* Need to start over; the easiest way is to recursively call
! * myself. Might be problematic... */
! return(playerc_client_readpacket(client,header,data));
}
}
--- 966,982 ----
if (nbytes <= 0)
{
! if(errno == EINTR)
! continue;
{
! PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
! //playerc_client_disconnect(client);
! if(playerc_client_disconnect_retry(client) < 0)
! return(-1);
! else
! {
! /* Need to start over; the easiest way is to recursively call
! * myself. Might be problematic... */
! return(playerc_client_readpacket(client,header,data));
! }
}
}
***************
*** 986,990 ****
// Slide over the body
! memmove(client->read_xdrdata,
client->read_xdrdata + header->size,
client->read_xdrdata_len - header->size);
--- 1005,1009 ----
// Slide over the body
! memmove(client->read_xdrdata,
client->read_xdrdata + header->size,
client->read_xdrdata_len - header->size);
***************
*** 1056,1060 ****
length = PLAYERXDR_MSGHDR_SIZE + encode_msglen;
bytes = PLAYERXDR_MSGHDR_SIZE + encode_msglen;
! do
{
ret = send(client->sock, &client->write_xdrdata[length-bytes],
--- 1075,1079 ----
length = PLAYERXDR_MSGHDR_SIZE + encode_msglen;
bytes = PLAYERXDR_MSGHDR_SIZE + encode_msglen;
! do
{
ret = send(client->sock, &client->write_xdrdata[length-bytes],
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit