return socket;
}
+void GSocket_close(GSocket *socket)
+{
+ _GSocket_Disable_Events(socket);
+ close(socket->m_fd);
+ socket->m_fd = INVALID_SOCKET;
+}
+
void GSocket_destroy(GSocket *socket)
{
assert(socket != NULL);
if (socket->m_fd != INVALID_SOCKET)
{
shutdown(socket->m_fd, 2);
- close(socket->m_fd);
- socket->m_fd = INVALID_SOCKET;
+ GSocket_close(socket);
}
/* Disable GUI callbacks */
socket->m_cbacks[evt] = NULL;
socket->m_detected = GSOCK_LOST_FLAG;
- _GSocket_Disable_Events(socket);
}
/* Address handling */
(SOCKLEN_T *) &sck->m_local->m_len) != 0) ||
(listen(sck->m_fd, 5) != 0))
{
- close(sck->m_fd);
- sck->m_fd = INVALID_SOCKET;
+ GSocket_close(sck);
sck->m_error = GSOCK_IOERR;
return GSOCK_IOERR;
}
{
if (_GSocket_Output_Timeout(sck) == GSOCK_TIMEDOUT)
{
- close(sck->m_fd);
- sck->m_fd = INVALID_SOCKET;
+ GSocket_close(sck);
/* sck->m_error is set in _GSocket_Output_Timeout */
return GSOCK_TIMEDOUT;
}
/* If connect failed with an error other than EINPROGRESS,
* then the call to GSocket_Connect has failed.
*/
- close(sck->m_fd);
- sck->m_fd = INVALID_SOCKET;
+ GSocket_close(sck);
sck->m_error = GSOCK_IOERR;
return GSOCK_IOERR;
}
sck->m_local->m_addr,
(SOCKLEN_T *) &sck->m_local->m_len) != 0))
{
- close(sck->m_fd);
- sck->m_fd = INVALID_SOCKET;
+ GSocket_close(sck);
sck->m_error = GSOCK_IOERR;
return GSOCK_IOERR;
}
if (ret == -1)
{
GSocket_Debug(( "GSocket_Input_Timeout, select returned -1\n" ));
- if (errno == EBADF) GSocket_Debug(( "Invalid file descriptor\n" ));
- if (errno == EINTR) GSocket_Debug(( "A non blocked signal was caught\n" ));
- if (errno == EINVAL) GSocket_Debug(( "The highest number descriptor is negative\n" ));
- if (errno == ENOMEM) GSocket_Debug(( "Not enough memory\n" ));
+ if (errno == EBADF) { GSocket_Debug(( "Invalid file descriptor\n" )); }
+ if (errno == EINTR) { GSocket_Debug(( "A non blocked signal was caught\n" )); }
+ if (errno == EINVAL) { GSocket_Debug(( "The highest number descriptor is negative\n" )); }
+ if (errno == ENOMEM) { GSocket_Debug(( "Not enough memory\n" )); }
socket->m_error = GSOCK_TIMEDOUT;
return GSOCK_TIMEDOUT;
}
if (ret == -1)
{
GSocket_Debug(( "GSocket_Output_Timeout, select returned -1\n" ));
- if (errno == EBADF) GSocket_Debug(( "Invalid file descriptor\n" ));
- if (errno == EINTR) GSocket_Debug(( "A non blocked signal was caught\n" ));
- if (errno == EINVAL) GSocket_Debug(( "The highest number descriptor is negative\n" ));
- if (errno == ENOMEM) GSocket_Debug(( "Not enough memory\n" ));
+ if (errno == EBADF) { GSocket_Debug(( "Invalid file descriptor\n" )); }
+ if (errno == EINTR) { GSocket_Debug(( "A non blocked signal was caught\n" )); }
+ if (errno == EINVAL) { GSocket_Debug(( "The highest number descriptor is negative\n" )); }
+ if (errno == ENOMEM) { GSocket_Debug(( "Not enough memory\n" )); }
socket->m_error = GSOCK_TIMEDOUT;
return GSOCK_TIMEDOUT;
}
- if ( ! FD_ISSET(socket->m_fd, &writefds) )
- GSocket_Debug(( "GSocket_Output_Timeout is buggy!\n" ));
- else
- GSocket_Debug(( "GSocket_Output_Timeout seems correct\n" ));
+ if ( ! FD_ISSET(socket->m_fd, &writefds) ) {
+ GSocket_Debug(( "GSocket_Output_Timeout is buggy!\n" ));
+ }
+ else {
+ GSocket_Debug(( "GSocket_Output_Timeout seems correct\n" ));
+ }
}
else
{
memcpy(addr2, address, sizeof(GAddress));
- if (address->m_addr)
+ if (address->m_addr && address->m_len > 0)
{
addr2->m_addr = (struct sockaddr *)malloc(addr2->m_len);
if (addr2->m_addr == NULL)
se = getservbyname(port, protocol);
if (!se)
{
- if (isdigit(port[0]))
+ /* the cast to int suppresses compiler warnings about subscript having the
+ type char */
+ if (isdigit((int)port[0]))
{
int port_int;
return GSOCK_NOERROR;
}
+#define UNIX_SOCK_PATHLEN (sizeof(addr->sun_path)/sizeof(addr->sun_path[0]))
+
GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path)
{
struct sockaddr_un *addr;
CHECK_ADDRESS(address, UNIX);
addr = ((struct sockaddr_un *)address->m_addr);
- memcpy(addr->sun_path, path, strlen(path));
+ strncpy(addr->sun_path, path, UNIX_SOCK_PATHLEN);
+ addr->sun_path[UNIX_SOCK_PATHLEN - 1] = '\0';
return GSOCK_NOERROR;
}
#endif /* wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) */
+/* vi:sts=4:sw=4:et */
+