diff --git a/sql/net_serv.cc b/sql/net_serv.cc
index 93fa7ac938c..08184537896 100644
--- a/sql/net_serv.cc
+++ b/sql/net_serv.cc
@@ -747,7 +747,7 @@ my_real_read(NET *net, ulong *complen)
 #endif /* EXTRA_DEBUG */
 	  }
 #if defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER)
-	  if (vio_should_retry(net->vio))
+	  if (vio_errno(net->vio) == SOCKET_EINTR)
 	  {
 	    DBUG_PRINT("warning",("Interrupted read. Retrying..."));
 	    continue;
diff --git a/vio/viosocket.c b/vio/viosocket.c
index 8d4c2387632..847e036d3b2 100644
--- a/vio/viosocket.c
+++ b/vio/viosocket.c
@@ -333,16 +333,30 @@ my_bool vio_poll_read(Vio *vio,uint timeout)
 }
 
 
-void vio_timeout(Vio *vio __attribute__((unused)),
-		 uint which __attribute__((unused)),
-                 uint timeout __attribute__((unused)))
+void vio_timeout(Vio *vio, uint which, uint timeout)
 {
+/* TODO: some action should be taken if socket timeouts are not supported. */
+#if defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO)
+
 #ifdef __WIN__
-  ulong wait_timeout= (ulong) timeout * 1000;
-  (void) setsockopt(vio->sd, SOL_SOCKET, 
-	which ? SO_SNDTIMEO : SO_RCVTIMEO, (char*) &wait_timeout,
-        sizeof(wait_timeout));
-#endif /* __WIN__ */
+
+  /* Windows expects time in milliseconds as int. */
+  int wait_timeout= (int) timeout * 1000;
+
+#else  /* ! __WIN__ */
+
+  /* POSIX specifies time as struct timeval. */
+  struct timeval wait_timeout;
+  wait_timeout.tv_sec= timeout;
+  wait_timeout.tv_usec= 0;
+
+#endif /* ! __WIN__ */
+
+  /* TODO: return value should be checked. */
+  (void) setsockopt(vio->sd, SOL_SOCKET, which ? SO_SNDTIMEO : SO_RCVTIMEO,
+                    (char*) &wait_timeout, sizeof(wait_timeout));
+
+#endif /* defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO) */
 }