Ported pjlib to PowerPC/MacOS
git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@338 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjlib/src/pj/sock_bsd.c b/pjlib/src/pj/sock_bsd.c
index df59a74..09b362a 100644
--- a/pjlib/src/pj/sock_bsd.c
+++ b/pjlib/src/pj/sock_bsd.c
@@ -82,6 +82,15 @@
const pj_uint16_t PJ_SO_SNDBUF = SO_SNDBUF;
+#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0
+# define SET_LEN(addr,len) (((pj_sockaddr*)(addr))->sa_zero_len=(len))
+# define RESET_LEN(addr) (((pj_sockaddr*)(addr))->sa_zero_len=0)
+#else
+# define SET_LEN(addr,len)
+# define RESET_LEN(addr)
+#endif
+
+
/*
* Convert 16-bit value from network byte order to host byte order.
*/
@@ -190,6 +199,7 @@
PJ_ASSERT_RETURN(!str_addr || str_addr->slen < PJ_MAX_HOSTNAME,
(addr->sin_addr.s_addr=PJ_INADDR_NONE, PJ_EINVAL));
+ RESET_LEN(addr);
addr->sin_family = AF_INET;
if (str_addr && str_addr->slen) {
@@ -226,6 +236,7 @@
{
PJ_ASSERT_RETURN(addr, (addr->sin_addr.s_addr=PJ_INADDR_NONE, PJ_EINVAL));
+ RESET_LEN(addr);
addr->sin_family = PJ_AF_INET;
pj_sockaddr_in_set_port(addr, port);
return pj_sockaddr_in_set_str_addr(addr, str_addr);
@@ -346,6 +357,7 @@
PJ_CHECK_STACK();
+ SET_LEN(&addr, sizeof(pj_sockaddr_in));
addr.sin_family = PJ_AF_INET;
addr.sin_addr.s_addr = pj_htonl(addr32);
addr.sin_port = pj_htons(port);
@@ -385,8 +397,10 @@
PJ_CHECK_STACK();
if (getpeername(sock, (struct sockaddr*)addr, (socklen_t*)namelen) != 0)
return PJ_RETURN_OS_ERROR(pj_get_native_netos_error());
- else
+ else {
+ RESET_LEN(addr);
return PJ_SUCCESS;
+ }
}
/*
@@ -399,8 +413,10 @@
PJ_CHECK_STACK();
if (getsockname(sock, (struct sockaddr*)addr, (socklen_t*)namelen) != 0)
return PJ_RETURN_OS_ERROR(pj_get_native_netos_error());
- else
+ else {
+ RESET_LEN(addr);
return PJ_SUCCESS;
+ }
}
/*
@@ -483,8 +499,10 @@
if (*len < 0)
return PJ_RETURN_OS_ERROR(pj_get_native_netos_error());
- else
+ else {
+ RESET_LEN(from);
return PJ_SUCCESS;
+ }
}
/*
@@ -574,11 +592,25 @@
PJ_CHECK_STACK();
PJ_ASSERT_RETURN(newsock != NULL, PJ_EINVAL);
+#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0
+ if (addr) {
+ SET_LEN(addr, *addrlen);
+ }
+#endif
+
*newsock = accept(serverfd, (struct sockaddr*)addr, (socklen_t*)addrlen);
if (*newsock==PJ_INVALID_SOCKET)
return PJ_RETURN_OS_ERROR(pj_get_native_netos_error());
- else
+ else {
+
+#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0
+ if (addr) {
+ RESET_LEN(addr);
+ }
+#endif
+
return PJ_SUCCESS;
+ }
}
#endif /* PJ_HAS_TCP */