diff options
-rw-r--r-- | pjlib/include/pj/sock.h | 9 | ||||
-rw-r--r-- | pjlib/src/pj/sock_bsd.c | 5 | ||||
-rw-r--r-- | pjlib/src/pj/sock_common.c | 5 | ||||
-rw-r--r-- | pjlib/src/pj/sock_symbian.cpp | 1 | ||||
-rw-r--r-- | pjsip-apps/src/pjsua/main.c | 12 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_transport_tcp.c | 5 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_transport_tls.c | 5 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_transport_tls_ossl.c | 5 |
8 files changed, 47 insertions, 0 deletions
diff --git a/pjlib/include/pj/sock.h b/pjlib/include/pj/sock.h index bdb24f03..cb3993cb 100644 --- a/pjlib/include/pj/sock.h +++ b/pjlib/include/pj/sock.h @@ -297,6 +297,9 @@ extern const pj_uint16_t PJ_TCP_NODELAY; * @see pj_SO_REUSEADDR */ extern const pj_uint16_t PJ_SO_REUSEADDR; +/** Do not generate SIGPIPE. @see pj_SO_NOSIGPIPE */ +extern const pj_uint16_t PJ_SO_NOSIGPIPE; + /** Set the protocol-defined priority for all packets to be sent on socket. */ extern const pj_uint16_t PJ_SO_PRIORITY; @@ -333,6 +336,9 @@ extern const pj_uint16_t PJ_IP_DROP_MEMBERSHIP; /** Get #PJ_SO_REUSEADDR constant */ PJ_DECL(pj_uint16_t) pj_SO_REUSEADDR(void); + /** Get #PJ_SO_NOSIGPIPE constant */ + PJ_DECL(pj_uint16_t) pj_SO_NOSIGPIPE(void); + /** Get #PJ_SO_PRIORITY constant */ PJ_DECL(pj_uint16_t) pj_SO_PRIORITY(void); @@ -366,6 +372,9 @@ extern const pj_uint16_t PJ_IP_DROP_MEMBERSHIP; /** Get #PJ_SO_REUSEADDR constant */ # define pj_SO_REUSEADDR() PJ_SO_REUSEADDR + /** Get #PJ_SO_NOSIGPIPE constant */ +# define pj_SO_NOSIGPIPE() PJ_SO_NOSIGPIPE + /** Get #PJ_SO_PRIORITY constant */ # define pj_SO_PRIORITY() PJ_SO_PRIORITY diff --git a/pjlib/src/pj/sock_bsd.c b/pjlib/src/pj/sock_bsd.c index 47e3fd14..4dbdc5c6 100644 --- a/pjlib/src/pj/sock_bsd.c +++ b/pjlib/src/pj/sock_bsd.c @@ -135,6 +135,11 @@ const pj_uint16_t PJ_SO_RCVBUF = SO_RCVBUF; const pj_uint16_t PJ_SO_SNDBUF = SO_SNDBUF; const pj_uint16_t PJ_TCP_NODELAY= TCP_NODELAY; const pj_uint16_t PJ_SO_REUSEADDR= SO_REUSEADDR; +#ifdef SO_NOSIGPIPE +const pj_uint16_t PJ_SO_NOSIGPIPE = SO_NOSIGPIPE; +#else +const pj_uint16_t PJ_SO_NOSIGPIPE = 0xFFFF; +#endif #if defined(SO_PRIORITY) const pj_uint16_t PJ_SO_PRIORITY = SO_PRIORITY; #else diff --git a/pjlib/src/pj/sock_common.c b/pjlib/src/pj/sock_common.c index fa5858fd..564f2036 100644 --- a/pjlib/src/pj/sock_common.c +++ b/pjlib/src/pj/sock_common.c @@ -1137,6 +1137,11 @@ PJ_DEF(pj_uint16_t) pj_SO_REUSEADDR(void) return PJ_SO_REUSEADDR; } +PJ_DEF(pj_uint16_t) pj_SO_NOSIGPIPE(void) +{ + return PJ_SO_NOSIGPIPE; +} + PJ_DEF(pj_uint16_t) pj_SO_PRIORITY(void) { return PJ_SO_PRIORITY; diff --git a/pjlib/src/pj/sock_symbian.cpp b/pjlib/src/pj/sock_symbian.cpp index b1697642..10eb1fa6 100644 --- a/pjlib/src/pj/sock_symbian.cpp +++ b/pjlib/src/pj/sock_symbian.cpp @@ -53,6 +53,7 @@ const pj_uint16_t PJ_SOL_IP = 0xFFFF; const pj_uint16_t PJ_SOL_TCP = 0xFFFF; const pj_uint16_t PJ_SOL_UDP = 0xFFFF; const pj_uint16_t PJ_SOL_IPV6 = 0xFFFF; +const pj_uint16_t PJ_SO_NOSIGPIPE = 0xFFFF; /* TOS */ const pj_uint16_t PJ_IP_TOS = 0; diff --git a/pjsip-apps/src/pjsua/main.c b/pjsip-apps/src/pjsua/main.c index 37941efe..5adf996d 100644 --- a/pjsip-apps/src/pjsua/main.c +++ b/pjsip-apps/src/pjsua/main.c @@ -66,16 +66,28 @@ static void setup_signal_handler(void) SetConsoleCtrlHandler(&CtrlHandler, TRUE); } +static void setup_socket_signal() +{ +} + #else +#include <signal.h> static void setup_signal_handler(void) { } +static void setup_socket_signal() +{ + signal(SIGPIPE, SIG_IGN); +} + #endif int main(int argc, char *argv[]) { + setup_socket_signal(); + do { app_restart = PJ_FALSE; diff --git a/pjsip/src/pjsip/sip_transport_tcp.c b/pjsip/src/pjsip/sip_transport_tcp.c index 1ad8fedc..43c82ae8 100644 --- a/pjsip/src/pjsip/sip_transport_tcp.c +++ b/pjsip/src/pjsip/sip_transport_tcp.c @@ -544,6 +544,7 @@ static pj_status_t tcp_create( struct tcp_listener *listener, pj_activesock_cfg asock_cfg; pj_activesock_cb tcp_callback; const pj_str_t ka_pkt = PJSIP_TCP_KEEP_ALIVE_DATA; + pj_int32_t val = 1; pj_status_t status; @@ -631,6 +632,10 @@ static pj_status_t tcp_create( struct tcp_listener *listener, tcp->ka_timer.cb = &tcp_keep_alive_timer; pj_ioqueue_op_key_init(&tcp->ka_op_key.key, sizeof(pj_ioqueue_op_key_t)); pj_strdup(tcp->base.pool, &tcp->ka_pkt, &ka_pkt); + + /* Prevent SIGPIPE */ + pj_sock_setsockopt(tcp->sock, pj_SOL_SOCKET(), pj_SO_NOSIGPIPE(), + &val, sizeof(val)); /* Done setting up basic transport. */ *p_tcp = tcp; diff --git a/pjsip/src/pjsip/sip_transport_tls.c b/pjsip/src/pjsip/sip_transport_tls.c index 59c7e93d..5fcfc39e 100644 --- a/pjsip/src/pjsip/sip_transport_tls.c +++ b/pjsip/src/pjsip/sip_transport_tls.c @@ -527,6 +527,7 @@ static pj_status_t tls_create( struct tls_listener *listener, { struct tls_transport *tls; const pj_str_t ka_pkt = PJSIP_TLS_KEEP_ALIVE_DATA; + pj_int32_t val = 1; pj_status_t status; @@ -616,6 +617,10 @@ static pj_status_t tls_create( struct tls_listener *listener, pj_ioqueue_op_key_init(&tls->ka_op_key.key, sizeof(pj_ioqueue_op_key_t)); pj_strdup(tls->base.pool, &tls->ka_pkt, &ka_pkt); + /* Prevent SIGPIPE */ + pj_sock_setsockopt(tcp->sock, pj_SOL_SOCKET(), pj_SO_NOSIGPIPE(), + &val, sizeof(val)); + /* Done setting up basic transport. */ *p_tls = tls; diff --git a/pjsip/src/pjsip/sip_transport_tls_ossl.c b/pjsip/src/pjsip/sip_transport_tls_ossl.c index d652b0be..d2f1b423 100644 --- a/pjsip/src/pjsip/sip_transport_tls_ossl.c +++ b/pjsip/src/pjsip/sip_transport_tls_ossl.c @@ -1229,6 +1229,7 @@ static pj_status_t tls_create( struct tls_listener *listener, pj_ioqueue_t *ioqueue; pj_ioqueue_callback tls_callback; int rc; + pj_int32_t val = 1; pj_status_t status; @@ -1332,6 +1333,10 @@ static pj_status_t tls_create( struct tls_listener *listener, tls->ka_timer.user_data = (void*) tls; tls->ka_timer.cb = &tls_keep_alive_timer; + /* Prevent SIGPIPE */ + pj_sock_setsockopt(tcp->sock, pj_SOL_SOCKET(), pj_SO_NOSIGPIPE(), + &val, sizeof(val)); + /* Done setting up basic transport. */ *p_tls = tls; |