From 727da5e28aa110f7931b696f1b1ba74e805bb9b4 Mon Sep 17 00:00:00 2001 From: Riza Sulistyo Date: Thu, 19 Jun 2014 05:07:12 +0000 Subject: Re #1771: Implement run-time configuration to set specific socket option. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4860 74dad513-b988-da41-8d7b-12977e46ad98 --- pjlib/src/pj/sock_bsd.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'pjlib/src/pj/sock_bsd.c') diff --git a/pjlib/src/pj/sock_bsd.c b/pjlib/src/pj/sock_bsd.c index 107f5247..1688668b 100644 --- a/pjlib/src/pj/sock_bsd.c +++ b/pjlib/src/pj/sock_bsd.c @@ -26,6 +26,8 @@ #include #include +#define THIS_FILE "sock_bsd.c" + /* * Address families conversion. * The values here are indexed based on pj_addr_family. @@ -765,13 +767,53 @@ PJ_DEF(pj_status_t) pj_sock_setsockopt( pj_sock_t sock, const void *optval, int optlen) { + int status; PJ_CHECK_STACK(); - if (setsockopt(sock, level, optname, (const char*)optval, optlen) != 0) + +#if (defined(PJ_WIN32) && PJ_WIN32) || (defined(PJ_SUNOS) && PJ_SUNOS) + /* Some opt may still need int value (e.g:SO_EXCLUSIVEADDRUSE in win32). */ + status = setsockopt(sock, + level, + ((optname&0xff00)==0xff00)?(int)optname|0xffff0000:optname, + (const char*)optval, optlen); +#else + status = setsockopt(sock, level, optname, (const char*)optval, optlen); +#endif + + if (status != 0) return PJ_RETURN_OS_ERROR(pj_get_native_netos_error()); else return PJ_SUCCESS; } +/* + * Set socket option. + */ +PJ_DEF(pj_status_t) pj_sock_setsockopt_params( pj_sock_t sockfd, + const pj_sockopt_params *params) +{ + unsigned int i = 0; + pj_status_t retval = PJ_SUCCESS; + PJ_CHECK_STACK(); + PJ_ASSERT_RETURN(params, PJ_EINVAL); + + for (;icnt && ioptions[i].level, + (pj_uint16_t)params->options[i].optname, + params->options[i].optval, + params->options[i].optlen); + if (status != PJ_SUCCESS) { + retval = status; + PJ_PERROR(4,(THIS_FILE, status, + "Warning: error applying sock opt %d", + params->options[i].optname)); + } + } + + return retval; +} + /* * Connect socket. */ -- cgit v1.2.3