Fixed a problem in GAddress related to CHECK_ADDRESS macro
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6775 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1015,22 +1015,38 @@ int _GSocket_Send_Dgram(GSocket *socket, const char *buffer, int size)
|
|||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* CHECK_ADDRESS verifies that the current family is either GSOCK_NOFAMILY
|
/* CHECK_ADDRESS verifies that the current address family is either
|
||||||
* or GSOCK_*family*, and if it is GSOCK_NOFAMILY, it initalizes address
|
* GSOCK_NOFAMILY or GSOCK_*family*, and if it is GSOCK_NOFAMILY, it
|
||||||
* to be a GSOCK_*family*. In other cases, it returns GSOCK_INVADDR.
|
* 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 (address->m_family == GSOCK_NOFAMILY) \
|
||||||
if (_GAddress_Init_##family(address) != GSOCK_NOERROR) \
|
if (_GAddress_Init_##family(address) != GSOCK_NOERROR) \
|
||||||
return address->m_error; \
|
return address->m_error; \
|
||||||
if (address->m_family != GSOCK_##family) \
|
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; \
|
address->m_error = GSOCK_INVADDR; \
|
||||||
return retval; \
|
return retval; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GAddress *GAddress_new(void)
|
GAddress *GAddress_new(void)
|
||||||
{
|
{
|
||||||
GAddress *address;
|
GAddress *address;
|
||||||
@@ -1186,7 +1202,7 @@ GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname)
|
|||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
|
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
|
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
|
||||||
|
|
||||||
@@ -1222,7 +1238,7 @@ GSocketError GAddress_INET_SetHostAddress(GAddress *address,
|
|||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
|
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
|
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
|
||||||
addr->s_addr = hostaddr;
|
addr->s_addr = hostaddr;
|
||||||
@@ -1237,7 +1253,7 @@ GSocketError GAddress_INET_SetPortName(GAddress *address, const char *port,
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
if (!port)
|
if (!port)
|
||||||
{
|
{
|
||||||
@@ -1273,7 +1289,7 @@ GSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port)
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
addr = (struct sockaddr_in *)address->m_addr;
|
addr = (struct sockaddr_in *)address->m_addr;
|
||||||
addr->sin_port = htons(port);
|
addr->sin_port = htons(port);
|
||||||
@@ -1288,7 +1304,7 @@ GSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname, size_t
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
addr = (struct sockaddr_in *)address->m_addr;
|
addr = (struct sockaddr_in *)address->m_addr;
|
||||||
addr_buf = (char *)&(addr->sin_addr);
|
addr_buf = (char *)&(addr->sin_addr);
|
||||||
@@ -1310,7 +1326,7 @@ unsigned long GAddress_INET_GetHostAddress(GAddress *address)
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, 0);
|
CHECK_ADDRESS_RETVAL(address, INET, 0);
|
||||||
|
|
||||||
addr = (struct sockaddr_in *)address->m_addr;
|
addr = (struct sockaddr_in *)address->m_addr;
|
||||||
|
|
||||||
@@ -1322,7 +1338,7 @@ unsigned short GAddress_INET_GetPort(GAddress *address)
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, 0);
|
CHECK_ADDRESS_RETVAL(address, INET, 0);
|
||||||
|
|
||||||
addr = (struct sockaddr_in *)address->m_addr;
|
addr = (struct sockaddr_in *)address->m_addr;
|
||||||
return ntohs(addr->sin_port);
|
return ntohs(addr->sin_port);
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ struct sockaddr_un {
|
|||||||
# define GSocket_Debug(args) printf args
|
# define GSocket_Debug(args) printf args
|
||||||
#else
|
#else
|
||||||
# define GSocket_Debug(args)
|
# define GSocket_Debug(args)
|
||||||
#endif // __GSOCKET_DEBUG__
|
#endif /* __GSOCKET_DEBUG__ */
|
||||||
|
|
||||||
/* Global initialisers */
|
/* Global initialisers */
|
||||||
|
|
||||||
@@ -1242,22 +1242,38 @@ void _GSocket_Detected_Write(GSocket *socket)
|
|||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* CHECK_ADDRESS verifies that the current family is either GSOCK_NOFAMILY
|
/* CHECK_ADDRESS verifies that the current address family is either
|
||||||
* or GSOCK_*family*, and if it is GSOCK_NOFAMILY, it initalizes address
|
* GSOCK_NOFAMILY or GSOCK_*family*, and if it is GSOCK_NOFAMILY, it
|
||||||
* to be a GSOCK_*family*. In other cases, it returns GSOCK_INVADDR.
|
* 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 (address->m_family == GSOCK_NOFAMILY) \
|
||||||
if (_GAddress_Init_##family(address) != GSOCK_NOERROR) \
|
if (_GAddress_Init_##family(address) != GSOCK_NOERROR) \
|
||||||
return address->m_error; \
|
return address->m_error; \
|
||||||
if (address->m_family != GSOCK_##family) \
|
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; \
|
address->m_error = GSOCK_INVADDR; \
|
||||||
return retval; \
|
return retval; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GAddress *GAddress_new(void)
|
GAddress *GAddress_new(void)
|
||||||
{
|
{
|
||||||
GAddress *address;
|
GAddress *address;
|
||||||
@@ -1372,7 +1388,8 @@ GSocketError _GAddress_translate_to(GAddress *address,
|
|||||||
|
|
||||||
*len = address->m_len;
|
*len = address->m_len;
|
||||||
*addr = (struct sockaddr *)malloc(address->m_len);
|
*addr = (struct sockaddr *)malloc(address->m_len);
|
||||||
if (*addr == NULL) {
|
if (*addr == NULL)
|
||||||
|
{
|
||||||
address->m_error = GSOCK_MEMERR;
|
address->m_error = GSOCK_MEMERR;
|
||||||
return GSOCK_MEMERR;
|
return GSOCK_MEMERR;
|
||||||
}
|
}
|
||||||
@@ -1412,7 +1429,7 @@ GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname)
|
|||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
|
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
|
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
|
||||||
|
|
||||||
@@ -1456,7 +1473,7 @@ GSocketError GAddress_INET_SetHostAddress(GAddress *address,
|
|||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
|
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
|
addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
|
||||||
addr->s_addr = hostaddr;
|
addr->s_addr = hostaddr;
|
||||||
@@ -1471,7 +1488,7 @@ GSocketError GAddress_INET_SetPortName(GAddress *address, const char *port,
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
if (!port)
|
if (!port)
|
||||||
{
|
{
|
||||||
@@ -1507,7 +1524,7 @@ GSocketError GAddress_INET_SetPort(GAddress *address, unsigned short port)
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
addr = (struct sockaddr_in *)address->m_addr;
|
addr = (struct sockaddr_in *)address->m_addr;
|
||||||
addr->sin_port = htons(port);
|
addr->sin_port = htons(port);
|
||||||
@@ -1522,7 +1539,7 @@ GSocketError GAddress_INET_GetHostName(GAddress *address, char *hostname, size_t
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, INET);
|
||||||
|
|
||||||
addr = (struct sockaddr_in *)address->m_addr;
|
addr = (struct sockaddr_in *)address->m_addr;
|
||||||
addr_buf = (char *)&(addr->sin_addr);
|
addr_buf = (char *)&(addr->sin_addr);
|
||||||
@@ -1544,7 +1561,7 @@ unsigned long GAddress_INET_GetHostAddress(GAddress *address)
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, 0);
|
CHECK_ADDRESS_RETVAL(address, INET, 0);
|
||||||
|
|
||||||
addr = (struct sockaddr_in *)address->m_addr;
|
addr = (struct sockaddr_in *)address->m_addr;
|
||||||
|
|
||||||
@@ -1556,7 +1573,7 @@ unsigned short GAddress_INET_GetPort(GAddress *address)
|
|||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, INET, 0);
|
CHECK_ADDRESS_RETVAL(address, INET, 0);
|
||||||
|
|
||||||
addr = (struct sockaddr_in *)address->m_addr;
|
addr = (struct sockaddr_in *)address->m_addr;
|
||||||
return ntohs(addr->sin_port);
|
return ntohs(addr->sin_port);
|
||||||
@@ -1583,7 +1600,7 @@ GSocketError _GAddress_Init_UNIX(GAddress *address)
|
|||||||
((struct sockaddr_un *)address->m_addr)->sun_family = AF_UNIX;
|
((struct sockaddr_un *)address->m_addr)->sun_family = AF_UNIX;
|
||||||
((struct sockaddr_un *)address->m_addr)->sun_path[0] = 0;
|
((struct sockaddr_un *)address->m_addr)->sun_path[0] = 0;
|
||||||
|
|
||||||
return TRUE;
|
return GSOCK_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path)
|
GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path)
|
||||||
@@ -1592,7 +1609,7 @@ GSocketError GAddress_UNIX_SetPath(GAddress *address, const char *path)
|
|||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
|
|
||||||
CHECK_ADDRESS(address, UNIX, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, UNIX);
|
||||||
|
|
||||||
addr = ((struct sockaddr_un *)address->m_addr);
|
addr = ((struct sockaddr_un *)address->m_addr);
|
||||||
memcpy(addr->sun_path, path, strlen(path));
|
memcpy(addr->sun_path, path, strlen(path));
|
||||||
@@ -1605,7 +1622,7 @@ GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf)
|
|||||||
struct sockaddr_un *addr;
|
struct sockaddr_un *addr;
|
||||||
|
|
||||||
assert(address != NULL);
|
assert(address != NULL);
|
||||||
CHECK_ADDRESS(address, UNIX, GSOCK_INVADDR);
|
CHECK_ADDRESS(address, UNIX);
|
||||||
|
|
||||||
addr = (struct sockaddr_un *)address->m_addr;
|
addr = (struct sockaddr_un *)address->m_addr;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user