X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c7edd1d3c1393145db803b9d616bb2a069180c8..d3e780ecdf69233c872d51216eedbc64a1b6db25:/src/unix/gsocket.c diff --git a/src/unix/gsocket.c b/src/unix/gsocket.c index 9566043c43..16eae12743 100644 --- a/src/unix/gsocket.c +++ b/src/unix/gsocket.c @@ -261,7 +261,10 @@ GSocket *GSocket_new(void) void GSocket_close(GSocket *socket) { _GSocket_Disable_Events(socket); + /* gsockosx.c calls CFSocketInvalidate which closes the socket for us */ +#if !(defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__))) close(socket->m_fd); +#endif socket->m_fd = INVALID_SOCKET; } @@ -269,20 +272,12 @@ void GSocket_destroy(GSocket *socket) { assert(socket != NULL); - /* When using CFSocket we MUST invalidate before closing the fd */ -#ifdef __DARWIN__ - /* Per-socket GUI-specific cleanup */ - _GSocket_GUI_Destroy_Socket(socket); -#endif - /* Check that the socket is really shutdowned */ if (socket->m_fd != INVALID_SOCKET) GSocket_Shutdown(socket); -#ifndef __DARWIN__ /* Per-socket GUI-specific cleanup */ _GSocket_GUI_Destroy_Socket(socket); -#endif /* Destroy private addresses */ if (socket->m_local) @@ -488,6 +483,11 @@ GSocketError GSocket_SetServer(GSocket *sck) #endif _GSocket_Enable_Events(sck); + /* allow a socket to re-bind if the socket is in the TIME_WAIT + state after being previously closed. + */ + setsockopt(sck->m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long)); + /* Bind to the local address, * retrieve the actual address bound, * and listen up to 5 connections. @@ -914,8 +914,8 @@ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags) struct timeval tv; /* Do not use a static struct, Linux can garble it */ - tv.tv_sec = 0; - tv.tv_usec = 0; + tv.tv_sec = socket->m_timeout / 1000; + tv.tv_usec = (socket->m_timeout % 1000) / 1000; assert(socket != NULL); @@ -923,7 +923,8 @@ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags) FD_ZERO(&writefds); FD_ZERO(&exceptfds); FD_SET(socket->m_fd, &readfds); - FD_SET(socket->m_fd, &writefds); + if (flags & GSOCK_OUTPUT_FLAG) + FD_SET(socket->m_fd, &writefds); FD_SET(socket->m_fd, &exceptfds); /* Check 'sticky' CONNECTION flag first */ @@ -1615,8 +1616,10 @@ GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname) { #else /* Use gethostbyname by default */ - int val = 1; //VA doesn't like constants in conditional expressions at all +#ifndef __WXMAC__ + int val = 1; /* VA doesn't like constants in conditional expressions */ if (val) +#endif { #endif struct in_addr *array_addr;