* PLEASE don't put C++ comments here - this is a C source file.
*/
+#ifdef _MSC_VER
+ /* RPCNOTIFICATION_ROUTINE in rasasync.h (included from winsock.h),
+ * warning: conditional expression is constant.
+ */
+# pragma warning(disable:4115)
+ /* FD_SET,
+ * warning: named type definition in parentheses.
+ */
+# pragma warning(disable:4127)
+ /* GAddress_UNIX_GetPath,
+ * warning: unreferenced formal parameter.
+ */
+# pragma warning(disable:4100)
+#endif /* _MSC_VER */
+
+
#ifndef __GSOCKET_STANDALONE__
-#include "wx/setup.h"
+# include "wx/setup.h"
#endif
#if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__)
# include "gsocket.h"
#endif /* __GSOCKET_STANDALONE__ */
-/* redefine some GUI-only functions to do nothing in console mode */
+/* Redefine some GUI-only functions to do nothing in console mode */
#if defined(wxUSE_GUI) && !wxUSE_GUI
-# define _GSocket_GUI_Init(socket) 1
+# define _GSocket_GUI_Init(socket) (1)
# define _GSocket_GUI_Destroy(socket)
# define _GSocket_Enable_Events(socket)
# define _GSocket_Disable_Events(socket)
#include <stdlib.h>
#include <stddef.h>
#include <ctype.h>
+
#include <winsock.h>
+
/* if we use configure for MSW SOCKLEN_T will be already defined */
#ifndef SOCKLEN_T
# define SOCKLEN_T int
#endif
-/* using FD_SET results in this warning */
-#ifdef _MSC_VER
-# pragma warning(disable:4127) /* conditional expression is constant */
-#endif
-
/* Constructors / Destructors for GSocket */
if (!success)
{
free(socket);
- return NULL;
+ socket = NULL;
}
return socket;
* Sets the socket to non-blocking mode. All IO calls will return
* immediately.
*/
-void GSocket_SetNonBlocking(GSocket *socket, bool non_block)
+void GSocket_SetNonBlocking(GSocket *socket, int non_block)
{
assert(socket != NULL);
* -------------------------------------------------------------------------
*/
-/* CHECK_ADDRESS verifies that the current family is either GSOCK_NOFAMILY
- * or GSOCK_*family*, and if it is GSOCK_NOFAMILY, it initalizes address
- * to be a GSOCK_*family*. In other cases, it returns GSOCK_INVADDR.
+/* CHECK_ADDRESS verifies that the current address family is either
+ * GSOCK_NOFAMILY or GSOCK_*family*, and if it is GSOCK_NOFAMILY, it
+ * initalizes it to be a GSOCK_*family*. In other cases, it returns
+ * an appropiate error code.
+ *
+ * CHECK_ADDRESS_RETVAL does the same but returning 'retval' on error.
*/
-#define CHECK_ADDRESS(address, family, retval) \
+#define CHECK_ADDRESS(address, family) \
{ \
if (address->m_family == GSOCK_NOFAMILY) \
if (_GAddress_Init_##family(address) != GSOCK_NOERROR) \
return address->m_error; \
if (address->m_family != GSOCK_##family) \
+ { \
+ address->m_error = GSOCK_INVADDR; \
+ return GSOCK_INVADDR; \
+ } \
+}
+
+#define CHECK_ADDRESS_RETVAL(address, family, retval) \
+{ \
+ if (address->m_family == GSOCK_NOFAMILY) \
+ if (_GAddress_Init_##family(address) != GSOCK_NOERROR) \
+ return retval; \
+ if (address->m_family != GSOCK_##family) \
{ \
address->m_error = GSOCK_INVADDR; \
return retval; \
} \
}
+
GAddress *GAddress_new(void)
{
GAddress *address;
{
assert(address != NULL);
+ if (address->m_addr)
+ free(address->m_addr);
+
free(address);
}
assert(address != NULL);
- CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
+ CHECK_ADDRESS(address, INET);
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
assert(address != NULL);
- CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
+ CHECK_ADDRESS(address, INET);
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
addr->s_addr = hostaddr;
struct sockaddr_in *addr;
assert(address != NULL);
- CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
+ CHECK_ADDRESS(address, INET);
if (!port)
{
struct sockaddr_in *addr;
assert(address != NULL);
- CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
+ CHECK_ADDRESS(address, INET);
addr = (struct sockaddr_in *)address->m_addr;
addr->sin_port = htons(port);
struct sockaddr_in *addr;
assert(address != NULL);
- CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
+ CHECK_ADDRESS(address, INET);
addr = (struct sockaddr_in *)address->m_addr;
addr_buf = (char *)&(addr->sin_addr);
struct sockaddr_in *addr;
assert(address != NULL);
- CHECK_ADDRESS(address, INET, 0);
+ CHECK_ADDRESS_RETVAL(address, INET, 0);
addr = (struct sockaddr_in *)address->m_addr;
struct sockaddr_in *addr;
assert(address != NULL);
- CHECK_ADDRESS(address, INET, 0);
+ CHECK_ADDRESS_RETVAL(address, INET, 0);
addr = (struct sockaddr_in *)address->m_addr;
return ntohs(addr->sin_port);
* -------------------------------------------------------------------------
*/
-#ifdef _MSC_VER
- #pragma warning(disable:4100) /* unreferenced formal parameter */
-#endif /* Visual C++ */
-
GSocketError _GAddress_Init_UNIX(GAddress *address)
{
assert (address != NULL);