This is the current patch from Luke Leighton <lckl@samba-tng.org> to add a
[tprouty/samba.git] / source / lib / util_sock.c
index ba3c6f71b4e548910878eff6edab56b765b92650..10ed2aaa0b7fe4c220945caec3b583b3d6eec6b9 100644 (file)
@@ -194,6 +194,30 @@ ssize_t read_udp_socket(int fd,char *buf,size_t len)
        return(ret);
 }
 
+/*******************************************************************
+ checks if read data is outstanding.
+ ********************************************************************/
+int read_data_outstanding(int fd, unsigned int time_out)
+{
+       int selrtn;
+       fd_set fds;
+       struct timeval timeout;
+
+       FD_ZERO(&fds);
+       FD_SET(fd, &fds);
+
+       timeout.tv_sec = (time_t) (time_out / 1000);
+       timeout.tv_usec = (long)(1000 * (time_out % 1000));
+
+       selrtn = sys_select_intr(fd + 1, &fds, &timeout);
+
+       if (selrtn <= 0)
+       {
+               return selrtn;
+       }
+       return FD_ISSET(fd, &fds) ? 1 : 0;
+}
+
 /****************************************************************************
  Read data from a socket with a timout in msec.
  mincount = if timeout, minimum to read before returning
@@ -315,13 +339,11 @@ static ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t ma
  time_out = timeout in milliseconds
 ****************************************************************************/
 
-ssize_t read_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned int time_out)
+ssize_t read_with_timeout(int fd, char *buf, size_t mincnt, size_t maxcnt,
+                         unsigned int time_out)
 {
-       fd_set fds;
-       int selrtn;
        ssize_t readret;
        size_t nread = 0;
-       struct timeval timeout;
        
        /* just checking .... */
        if (maxcnt <= 0)
@@ -356,15 +378,8 @@ ssize_t read_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned
           system performance will suffer severely as 
           select always returns true on disk files */
        
-       /* Set initial timeout */
-       timeout.tv_sec = (time_t)(time_out / 1000);
-       timeout.tv_usec = (long)(1000 * (time_out % 1000));
-       
        for (nread=0; nread < mincnt; ) {      
-               FD_ZERO(&fds);
-               FD_SET(fd,&fds);
-               
-               selrtn = sys_select_intr(fd+1,&fds,&timeout);
+               int selrtn = read_data_outstanding(fd, time_out);
                
                if(selrtn <= 0)
                        return selrtn;