diff --git a/core/sip/tcp_trsp.cpp b/core/sip/tcp_trsp.cpp index cf3fea8d..640dfb83 100644 --- a/core/sip/tcp_trsp.cpp +++ b/core/sip/tcp_trsp.cpp @@ -53,7 +53,7 @@ tcp_trsp_socket::tcp_trsp_socket(tcp_server_socket* server_sock, // async parser state pst.reset((char*)input_buf); - if(sd > 0) { + if(sd != -1) { create_events(); } } @@ -63,7 +63,7 @@ void tcp_trsp_socket::create_connected(tcp_server_socket* server_sock, int sd, const sockaddr_storage* sa, struct event_base* evbase) { - if(sd < 0) + if(sd == -1) return; tcp_trsp_socket* sock = new tcp_trsp_socket(server_sock,server_worker, @@ -180,7 +180,7 @@ int tcp_trsp_socket::on_connect(short ev) int tcp_trsp_socket::connect() { - if(sd > 0) { + if(sd != -1) { ERROR("pending connection request: close first."); return -1; } @@ -208,7 +208,7 @@ int tcp_trsp_socket::connect() int tcp_trsp_socket::check_connection() { - if(sd < 0){ + if(sd == -1){ int ret = connect(); if(ret < 0) { if(errno != EINPROGRESS && errno != EALREADY) { @@ -270,7 +270,7 @@ void tcp_trsp_socket::close() event_del(read_ev); event_del(write_ev); - if(sd > 0) { + if(sd != -1) { ::close(sd); sd = -1; } @@ -604,6 +604,7 @@ int tcp_server_socket::bind(const string& bind_ip, unsigned short bind_port) if(sd){ WARN("re-binding socket\n"); close(sd); + sd = -1; } if(am_inet_pton(bind_ip.c_str(),&addr) == 0){ @@ -633,26 +634,22 @@ int tcp_server_socket::bind(const string& bind_ip, unsigned short bind_port) (void*)&true_opt, sizeof (true_opt)) == -1) { ERROR("%s\n",strerror(errno)); - close(sd); return -1; } if(ioctl(sd, FIONBIO , &true_opt) == -1) { ERROR("setting non-blocking: %s\n",strerror(errno)); - close(sd); return -1; } if(::bind(sd,(const struct sockaddr*)&addr,SA_len(&addr)) < 0) { ERROR("bind: %s\n",strerror(errno)); - close(sd); return -1; } if(::listen(sd, 16) < 0) { ERROR("listen: %s\n",strerror(errno)); - close(sd); return -1; } @@ -797,7 +794,7 @@ tcp_trsp::~tcp_trsp() void tcp_trsp::run() { int server_sd = sock->get_sd(); - if(server_sd <= 0){ + if(server_sd == -1){ ERROR("Transport instance not bound\n"); return; } diff --git a/core/sip/tcp_trsp.h b/core/sip/tcp_trsp.h index 5f818d06..0a2cc73d 100644 --- a/core/sip/tcp_trsp.h +++ b/core/sip/tcp_trsp.h @@ -270,7 +270,7 @@ public: class tcp_trsp: public transport { - struct event_base *evbase; + struct event_base* evbase; protected: /** @see AmThread */ diff --git a/core/sip/transport.cpp b/core/sip/transport.cpp index f3db124f..11c831c0 100644 --- a/core/sip/transport.cpp +++ b/core/sip/transport.cpp @@ -46,6 +46,8 @@ trsp_socket::trsp_socket(unsigned short if_num, unsigned int opts, trsp_socket::~trsp_socket() { + if (sd != -1) + close(sd); } const char* trsp_socket::get_ip() const diff --git a/core/sip/transport.h b/core/sip/transport.h index e12ed907..3a42bc2a 100644 --- a/core/sip/transport.h +++ b/core/sip/transport.h @@ -79,7 +79,7 @@ protected: public: trsp_socket(unsigned short if_num, unsigned int opts, - unsigned int sys_if_idx = 0, int sd = 0); + unsigned int sys_if_idx = 0, int sd = -1); virtual ~trsp_socket(); /** diff --git a/core/sip/udp_trsp.cpp b/core/sip/udp_trsp.cpp index ae471c34..d6bd241c 100644 --- a/core/sip/udp_trsp.cpp +++ b/core/sip/udp_trsp.cpp @@ -51,9 +51,10 @@ /** @see trsp_socket */ int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port) { - if(sd){ + if(sd != -1){ WARN("re-binding socket\n"); close(sd); + sd = -1; } if(am_inet_pton(bind_ip.c_str(),&addr) == 0){ @@ -76,12 +77,11 @@ int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port) if((sd = socket(addr.ss_family,SOCK_DGRAM,0)) == -1){ ERROR("socket: %s\n",strerror(errno)); return -1; - } - + } + if(::bind(sd,(const struct sockaddr*)&addr,SA_len(&addr))) { ERROR("bind: %s\n",strerror(errno)); - close(sd); return -1; } @@ -92,7 +92,6 @@ int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port) (void*)&true_opt, sizeof (true_opt)) == -1) { ERROR("%s\n",strerror(errno)); - close(sd); return -1; } } else { @@ -100,7 +99,6 @@ int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port) (void*)&true_opt, sizeof (true_opt)) == -1) { ERROR("%s\n",strerror(errno)); - close(sd); return -1; } } @@ -138,7 +136,7 @@ int udp_trsp_socket::set_recvbuf_size(int rcvbuf_size) } } } - + return 0; } @@ -230,7 +228,7 @@ int udp_trsp_socket::send(const sockaddr_storage* sa, unsigned int flags) { if (log_level_raw_msgs >= 0) { - _LOG(log_level_raw_msgs, + _LOG(log_level_raw_msgs, "send msg to %s:%i\n--++--\n%.*s--++--\n", get_addr_str(sa).c_str(), ntohs(((sockaddr_in*)sa)->sin_port), @@ -241,7 +239,7 @@ int udp_trsp_socket::send(const sockaddr_storage* sa, return raw_sender::send(msg,msg_len,sys_if_idx,&addr,sa); if(socket_options & force_outbound_if) - return sendmsg(sa,msg,msg_len); + return sendmsg(sa,msg,msg_len); return sendto(sa,msg,msg_len); } @@ -276,7 +274,7 @@ void udp_trsp::run() { int buf_len; - if(sock->get_sd()<=0){ + if(sock->get_sd() == -1){ ERROR("Transport instance not bound\n"); return; } @@ -318,7 +316,7 @@ void udp_trsp::run() if (trsp_socket::log_level_raw_msgs >= 0) { char host[NI_MAXHOST] = ""; - _LOG(trsp_socket::log_level_raw_msgs, + _LOG(trsp_socket::log_level_raw_msgs, "vv M [|] u recvd msg via UDP from %s:%i vv\n" "--++--\n%.*s--++--\n", am_inet_ntop_sip(&s_msg->remote_ip,host,NI_MAXHOST), @@ -332,10 +330,10 @@ void udp_trsp::run() for (cmsghdr* cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) { - + if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == DSTADDR_SOCKOPT) { - + s_msg->local_ip.ss_family = AF_INET; am_set_port(&s_msg->local_ip,sock->get_port()); memcpy(&((sockaddr_in*)(&s_msg->local_ip))->sin_addr, @@ -354,6 +352,9 @@ void udp_trsp::run() // pass message to the parser / transaction layer trans_layer::instance()->received_msg(s_msg); } + + INFO("Stopped SIP server UDP transport on %s:%i\n", + sock->get_ip(),sock->get_port()); } /** @see AmThread */ @@ -362,7 +363,6 @@ void udp_trsp::on_stop() } - /** EMACS ** * Local variables: