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

Reply via email to