diff -ruN postgresql-7.4.13-old/src/pgcluster/pglb/recovery.c postgresql-7.4.13/src/pgcluster/pglb/recovery.c
--- postgresql-7.4.13-old/src/pgcluster/pglb/recovery.c	2006-08-22 14:36:21.000000000 +0200
+++ postgresql-7.4.13/src/pgcluster/pglb/recovery.c	2006-08-22 14:36:43.000000000 +0200
@@ -108,7 +108,7 @@
 		FD_ZERO(&rmask);
 		FD_SET(fd,&rmask);
 		rtn = select(fd+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-		if (rtn && FD_ISSET(fd, &rmask))
+		if ((rtn > 0) && FD_ISSET(fd, &rmask))
 		{
 			receive_recovery(fd);
 		}
diff -ruN postgresql-7.4.13-old/src/pgcluster/pgrp/cascade.c postgresql-7.4.13/src/pgcluster/pgrp/cascade.c
--- postgresql-7.4.13-old/src/pgcluster/pgrp/cascade.c	2006-08-22 14:36:21.000000000 +0200
+++ postgresql-7.4.13/src/pgcluster/pgrp/cascade.c	2006-08-22 14:36:43.000000000 +0200
@@ -713,7 +713,7 @@
 	FD_ZERO(&wmask);
 	FD_SET(sock,&wmask);
 	rtn = select(sock+1, (fd_set *)NULL, &wmask, (fd_set *)NULL, &timeout);
-	if (rtn && FD_ISSET(sock, &wmask))
+	if ((rtn > 0) && FD_ISSET(sock, &wmask))
 	{
 		for (;;)
 		{
diff -ruN postgresql-7.4.13-old/src/pgcluster/pgrp/main.c postgresql-7.4.13/src/pgcluster/pgrp/main.c
--- postgresql-7.4.13-old/src/pgcluster/pgrp/main.c	2006-08-22 14:36:21.000000000 +0200
+++ postgresql-7.4.13/src/pgcluster/pgrp/main.c	2006-08-22 14:36:43.000000000 +0200
@@ -217,7 +217,7 @@
 			FD_ZERO(&rmask);
 			FD_SET(sock,&rmask);
 			rtn = select(sock+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-			if (rtn && FD_ISSET(sock, &rmask))
+			if ((rtn > 0) && FD_ISSET(sock, &rmask))
 			{
 				Idle_Flag = BUSY_MODE;
 #ifdef PRINT_DEBUG
@@ -388,7 +388,7 @@
 		FD_ZERO(&rmask);
 		FD_SET(fd,&rmask);
 		rtn = select(fd+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-		if (rtn && FD_ISSET(fd, &rmask))
+		if ((rtn > 0) && FD_ISSET(fd, &rmask))
 		{
 			Idle_Flag = BUSY_MODE;
 			/*
diff -ruN postgresql-7.4.13-old/src/pgcluster/pgrp/recovery.c postgresql-7.4.13/src/pgcluster/pgrp/recovery.c
--- postgresql-7.4.13-old/src/pgcluster/pgrp/recovery.c	2006-08-22 14:36:21.000000000 +0200
+++ postgresql-7.4.13/src/pgcluster/pgrp/recovery.c	2006-08-22 14:36:43.000000000 +0200
@@ -192,7 +192,7 @@
 	for(;;)
 	{
 		rtn = select(host->recovery_sock+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-		if (rtn && FD_ISSET(host->recovery_sock, &rmask))
+		if ((rtn > 0) && FD_ISSET(host->recovery_sock, &rmask))
 		{
 			read_size = read_packet(host->recovery_sock, packet);
 			return read_size;
@@ -779,7 +779,7 @@
 		 * read packet from target cluster server
 		 */
 		rtn = select(sock+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-		if (rtn && FD_ISSET(sock, &rmask))
+		if ((rtn > 0) && FD_ISSET(sock, &rmask))
 		{
 			read_size = read_packet(sock, &packet);
 		}
@@ -939,7 +939,7 @@
 		FD_ZERO(&rmask);
 		FD_SET(fd,&rmask);
 		rtn = select(fd+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-		if (rtn && FD_ISSET(fd, &rmask))
+		if ((rtn > 0) && FD_ISSET(fd, &rmask))
 		{
 			Idle_Flag = BUSY_MODE;
 			pgrecovery_loop(fd);
diff -ruN postgresql-7.4.13-old/src/pgcluster/pgrp/replicate.c postgresql-7.4.13/src/pgcluster/pgrp/replicate.c
--- postgresql-7.4.13-old/src/pgcluster/pgrp/replicate.c	2006-08-22 14:36:21.000000000 +0200
+++ postgresql-7.4.13/src/pgcluster/pgrp/replicate.c	2006-08-22 14:37:13.000000000 +0200
@@ -2236,9 +2236,6 @@
 		buf_size = 1;
 	}
 
-	timeout.tv_sec = PGR_SEND_TIMEOUT;
-	timeout.tv_usec = 0;
-
 	/*
 	 * Wait for something to happen.
 	 */
@@ -2248,16 +2245,29 @@
 #ifdef MSG_NOSIGNAL
 	flag |= MSG_NOSIGNAL;
 #endif
-	FD_ZERO(&wmask);
-	FD_SET(dest,&wmask);
-	rtn = select(dest+1, (fd_set *)NULL, &wmask, (fd_set *)NULL, &timeout);
-	if (rtn && FD_ISSET(dest, &wmask))
+
+	for (;;)
 	{
+		/* man 2 select: "select()  may  update  the timeout argument" */
+		timeout.tv_sec = PGR_SEND_TIMEOUT;
+		timeout.tv_usec = 0;
+
+		FD_ZERO(&wmask);
+		FD_SET(dest,&wmask);
+		rtn = select(dest+1, (fd_set *)NULL, &wmask, (fd_set *)NULL, &timeout);
+		if ( rtn < 0 )
+		{
+			if (errno == EINTR) 
+				continue;
+
+			show_error("%s:select failed ,errno is %s",func , strerror(errno));
+			return STATUS_ERROR;
+		}
+		if ((rtn > 0) && FD_ISSET(dest, &wmask))
+		{
 #ifdef PRINT_DEBUG
-		show_debug("%s:PGRreturn_result[%s]",func,send_ptr);
+			show_debug("%s:PGRreturn_result[%s]",func,send_ptr);
 #endif			
-		for (;;)
-		{
 			s = send(dest,send_ptr + send_size,buf_size - send_size ,flag); 
 			if (s < 0){
 				show_error("%s:send error: %d(%s)",func,errno,strerror(errno));
@@ -2375,7 +2385,7 @@
 		FD_ZERO(&rmask);
 		FD_SET(dest,&rmask);
 		rtn = select(dest+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-		if (rtn && FD_ISSET(dest, &rmask))
+		if ((rtn > 0) && FD_ISSET(dest, &rmask))
 		{
 			memset(&header,0,sizeof(ReplicateHeader));
 			answer = PGRread_packet(dest,&header);
diff -ruN postgresql-7.4.13-old/src/pgcluster/pgrp/rlog.c postgresql-7.4.13/src/pgcluster/pgrp/rlog.c
--- postgresql-7.4.13-old/src/pgcluster/pgrp/rlog.c	2006-08-22 14:36:21.000000000 +0200
+++ postgresql-7.4.13/src/pgcluster/pgrp/rlog.c	2006-08-22 14:36:43.000000000 +0200
@@ -658,7 +658,7 @@
 		FD_ZERO(&rmask);
 		FD_SET(RLog_Recv_Sock,&rmask);
 		rtn = select(RLog_Recv_Sock+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-		if (rtn && FD_ISSET(RLog_Recv_Sock, &rmask))
+		if ((rtn > 0) && FD_ISSET(RLog_Recv_Sock, &rmask))
 		{
 			Idle_Flag = BUSY_MODE ;
 			addrlen = sizeof(addr);
@@ -939,7 +939,7 @@
 		FD_ZERO(&rmask);
 		FD_SET(sock,&rmask);
 		rtn = select(sock+1, &rmask, (fd_set *)NULL, (fd_set *)NULL, &timeout);
-		if (rtn && FD_ISSET(sock, &rmask))
+		if ((rtn > 0) && FD_ISSET(sock, &rmask))
 		{
 			return (recv_message(sock, (char*)result, size));
 		}
@@ -1120,7 +1120,7 @@
 	FD_ZERO(&wmask);
 	FD_SET(sock,&wmask);
 	rtn = select(sock+1, (fd_set *)NULL, &wmask, (fd_set *)NULL, &timeout);
-	if (rtn && FD_ISSET(sock, &wmask))
+	if ((rtn > 0) && FD_ISSET(sock, &wmask))
 	{
 		for (;;)
 		{
