Set errno=0 in read_block. On Win32 there is no errno and this makes the
authorJeetu Golani <jeetu.golani@gmail.com>
Thu, 22 Apr 2010 17:53:27 +0000 (23:23 +0530)
committerJeetu Golani <jeetu.golani@gmail.com>
Thu, 22 Apr 2010 17:53:27 +0000 (23:23 +0530)
do..while loop execute only once. Also set the return value to -1 in
_xcb_open if control reaches the end - if all goes well it shouldn't
reach there.

src/xcb_in.c
src/xcb_util.c

index 8689344..b481295 100644 (file)
@@ -297,15 +297,12 @@ static int read_block(const int fd, void *buf, const ssize_t len)
             fd_set fds;
             FD_ZERO(&fds);
             FD_SET(fd, &fds);
-#ifndef _WIN32
+
+           /* Initializing errno here makes sure that for Win32 this loop will execute only once */
+           errno = 0;  
            do {
                ret = select(fd + 1, &fds, 0, 0, 0);
            } while (ret == -1 && errno == EINTR);
-#else
-           /* the do while loop used for the non-windows version isn't required*/
-           /* for windows since there are no signals in Windows hence no EINTR*/           
-           ret = select(fd + 1, &fds, 0, 0, 0);
-#endif /* !_WIN32 */
 #endif /* USE_POLL */
         }
         if(ret <= 0)
index 2be59d2..e08a320 100644 (file)
@@ -180,10 +180,10 @@ static int _xcb_open(char *host, char *protocol, const int display)
     fd = _xcb_open_abstract(protocol, file, filelen);
     if (fd >= 0 || (errno != ENOENT && errno != ECONNREFUSED))
         return fd;
-
 #endif
     return  _xcb_open_unix(protocol, file);
 #endif /* !_WIN32 */
+    return -1; /* if control reaches here then something has gone wrong */
 }
 
 static int _xcb_socket(int family, int type, int proto)