]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/gsocket.cpp
determine the slider event type more precisely (i.e. generate LINE/PAGE UP/DOWN and...
[wxWidgets.git] / src / unix / gsocket.cpp
index 874098d3b648c7a006486039d1a17cf4dd0336d7..b4294370c14042e16660dd27e53b526a10231a41 100644 (file)
@@ -23,7 +23,7 @@
 #endif
 
 #if defined(__VISAGECPP__)
-#define BSD_SELECT /* use Berkley Sockets select */
+#define BSD_SELECT /* use Berkeley Sockets select */
 #endif
 
 #if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__)
@@ -613,6 +613,7 @@ GSocket *GSocket::WaitConnection()
     m_error = GSOCK_MEMERR;
     return NULL;
   }
+
   err = _GAddress_translate_from(connection->m_peer, &from, fromlen);
   if (err != GSOCK_NOERROR)
   {
@@ -620,6 +621,7 @@ GSocket *GSocket::WaitConnection()
     m_error = err;
     return NULL;
   }
+
 #if defined(__EMX__) || defined(__VISAGECPP__)
   ioctl(connection->m_fd, FIONBIO, (char*)&arg, sizeof(arg));
 #else
@@ -633,10 +635,13 @@ GSocket *GSocket::WaitConnection()
 bool GSocket::SetReusable()
 {
     /* socket must not be null, and must not be in use/already bound */
-    if (this && m_fd == INVALID_SOCKET) {
+    if (this && m_fd == INVALID_SOCKET)
+    {
         m_reusable = true;
+
         return true;
     }
+
     return false;
 }
 
@@ -725,9 +730,7 @@ GSocketError GSocket::Connect(GSocketStream stream)
    */
 
   if (m_non_blocking || ret == 0)
-  {
     gs_gui_functions->Enable_Events(this);
-  }
 
   if (ret == -1)
   {
@@ -778,6 +781,7 @@ GSocketError GSocket::Connect(GSocketStream stream)
      */
     Close();
     m_error = GSOCK_IOERR;
+
     return GSOCK_IOERR;
   }
 
@@ -875,14 +879,22 @@ int GSocket::Read(char *buffer, int size)
      * re-enabled! */
     ret = -1;
   }
-  else {
+  else
+  {
     /* Read the data */
     if (m_stream)
       ret = Recv_Stream(buffer, size);
     else
       ret = Recv_Dgram(buffer, size);
 
-    if (ret == -1) {
+    /* If recv returned zero, then the connection is lost, and errno is not set.
+     * Otherwise, recv has returned an error (-1), in which case we have lost the
+     * socket only if errno does _not_ indicate that there may be more data to read.
+     */
+    if (ret == 0)
+      m_error = GSOCK_IOERR;
+    else if (ret == -1)
+    {
       if ((errno == EWOULDBLOCK) || (errno == EAGAIN))
         m_error = GSOCK_WOULDBLOCK;
       else
@@ -945,6 +957,7 @@ int GSocket::Write(const char *buffer, int size)
      * will further OUTPUT events be posted.
      */
     Enable(GSOCK_OUTPUT);
+
     return -1;
   }
 
@@ -1026,7 +1039,12 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags)
           result |= GSOCK_CONNECTION_FLAG;
           m_detected |= GSOCK_CONNECTION_FLAG;
         }
-        else if ((errno != EWOULDBLOCK) && (errno != EAGAIN) && (errno != EINTR))
+        /* If recv returned zero, then the connection is lost, and errno is not set.
+         * Otherwise, recv has returned an error (-1), in which case we have lost the
+         * socket only if errno does _not_ indicate that there may be more data to read.
+         */
+        else if (num == 0 ||
+                 (errno != EWOULDBLOCK) && (errno != EAGAIN) && (errno != EINTR))
         {
           m_detected = GSOCK_LOST_FLAG;
           m_establishing = false;
@@ -1083,10 +1101,8 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags)
   }
   else
   {
-
     assert(this);
     return flags & m_detected;
-
   }
 }
 
@@ -1199,9 +1215,8 @@ GSocketError GSocket::GetSockOpt(int level, int optname,
                                 void *optval, int *optlen)
 {
     if (getsockopt(m_fd, level, optname, (char*)optval, (SOCKOPTLEN_T*)optlen) == 0)
-    {
         return GSOCK_NOERROR;
-    }
+
     return GSOCK_OPTERR;
 }
 
@@ -1209,9 +1224,8 @@ GSocketError GSocket::SetSockOpt(int level, int optname,
                                 const void *optval, int optlen)
 {
     if (setsockopt(m_fd, level, optname, (const char*)optval, optlen) == 0)
-    {
         return GSOCK_NOERROR;
-    }
+
     return GSOCK_OPTERR;
 }
 
@@ -1259,6 +1273,7 @@ GSocketError GSocket::Input_Timeout()
       m_error = GSOCK_TIMEDOUT;
       return GSOCK_TIMEDOUT;
     }
+
     if (ret == -1)
     {
       GSocket_Debug(( "GSocket_Input_Timeout, select returned -1\n" ));
@@ -1270,6 +1285,7 @@ GSocketError GSocket::Input_Timeout()
       return GSOCK_TIMEDOUT;
     }
   }
+
   return GSOCK_NOERROR;
 }
 
@@ -1300,6 +1316,7 @@ GSocketError GSocket::Output_Timeout()
       m_error = GSOCK_TIMEDOUT;
       return GSOCK_TIMEDOUT;
     }
+
     if (ret == -1)
     {
       GSocket_Debug(( "GSocket_Output_Timeout, select returned -1\n" ));
@@ -1310,10 +1327,13 @@ GSocketError GSocket::Output_Timeout()
       m_error = GSOCK_TIMEDOUT;
       return GSOCK_TIMEDOUT;
     }
-    if ( ! wxFD_ISSET(m_fd, &writefds) ) {
+
+    if ( ! wxFD_ISSET(m_fd, &writefds) )
+    {
         GSocket_Debug(( "GSocket_Output_Timeout is buggy!\n" ));
     }
-    else {
+    else
+    {
         GSocket_Debug(( "GSocket_Output_Timeout seems correct\n" ));
     }
   }
@@ -1331,7 +1351,9 @@ int GSocket::Recv_Stream(char *buffer, int size)
   do
   {
     ret = recv(m_fd, buffer, size, GSOCKET_MSG_NOSIGNAL);
-  } while (ret == -1 && errno == EINTR); /* Loop until not interrupted */
+  }
+  while (ret == -1 && errno == EINTR); /* Loop until not interrupted */
+
   return ret;
 }
 
@@ -1347,7 +1369,8 @@ int GSocket::Recv_Dgram(char *buffer, int size)
   do
   {
     ret = recvfrom(m_fd, buffer, size, 0, &from, (WX_SOCKLEN_T *) &fromlen);
-  } while (ret == -1 && errno == EINTR); /* Loop until not interrupted */
+  }
+  while (ret == -1 && errno == EINTR); /* Loop until not interrupted */
 
   if (ret == -1)
     return -1;
@@ -1362,6 +1385,7 @@ int GSocket::Recv_Dgram(char *buffer, int size)
       return -1;
     }
   }
+
   err = _GAddress_translate_from(m_peer, &from, fromlen);
   if (err != GSOCK_NOERROR)
   {
@@ -1383,7 +1407,8 @@ int GSocket::Send_Stream(const char *buffer, int size)
   do
   {
     ret = send(m_fd, (char *)buffer, size, GSOCKET_MSG_NOSIGNAL);
-  } while (ret == -1 && errno == EINTR); /* Loop until not interrupted */
+  }
+  while (ret == -1 && errno == EINTR); /* Loop until not interrupted */
 
   UNMASK_SIGNAL();
 
@@ -1414,7 +1439,8 @@ int GSocket::Send_Dgram(const char *buffer, int size)
   do
   {
     ret = sendto(m_fd, (char *)buffer, size, 0, addr, len);
-  } while (ret == -1 && errno == EINTR); /* Loop until not interrupted */
+  }
+  while (ret == -1 && errno == EINTR); /* Loop until not interrupted */
 
   UNMASK_SIGNAL();
 
@@ -1522,9 +1548,11 @@ void GSocket::Detected_Write()
 GSocket *GSocket_new(void)
 {
     GSocket *newsocket = new GSocket();
-    if(newsocket->IsOk())
+    if (newsocket->IsOk())
         return newsocket;
+
     delete newsocket;
+
     return NULL;
 }
 
@@ -1664,6 +1692,7 @@ GSocketError _GAddress_translate_from(GAddress *address,
     address->m_error = GSOCK_MEMERR;
     return GSOCK_MEMERR;
   }
+
   memcpy(address->m_addr, addr, len);
 
   return GSOCK_NOERROR;
@@ -1750,9 +1779,11 @@ GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname)
       address->m_error = GSOCK_NOHOST;
       return GSOCK_NOHOST;
     }
+
     array_addr = (struct in_addr *) *(he->h_addr_list);
     addr->s_addr = array_addr[0].s_addr;
   }
+
   return GSOCK_NOERROR;
 }