/** Send using su_vsend(). Map IPv4 addresses as IPv6 addresses, if needed. */ ssize_t tport_send_dgram(tport_t const *self, msg_t *msg, msg_iovec_t iov[], size_t iovused) { su_sockaddr_t su[1]; socklen_t sulen = sizeof su; if (tport_is_connection_oriented(self)) return su_vsend(self->tp_socket, iov, iovused, MSG_NOSIGNAL, NULL, 0); msg_get_address(msg, su, &sulen); #if SU_HAVE_IN6 && defined(IN6_INADDR_TO_V4MAPPED) if (su->su_family == AF_INET && self->tp_addrinfo->ai_family == AF_INET6) { su_sockaddr_t su0[1]; memset(su0, 0, sizeof su0); su0->su_family = self->tp_addrinfo->ai_family; su0->su_port = su->su_port; IN6_INADDR_TO_V4MAPPED(&su->su_sin.sin_addr, &su0->su_sin6.sin6_addr); memcpy(su, su0, sulen = sizeof(su0->su_sin6)); } #endif su_soerror(self->tp_socket); /* XXX - we *still* have a race condition */ return su_vsend(self->tp_socket, iov, iovused, MSG_NOSIGNAL, su, sulen); }
void DrachtioController::getTransactionSender( nta_incoming_t* irq, string& host, unsigned int& port ) { su_sockaddr_t su[1]; socklen_t sulen = sizeof su; msg_t* msg = nta_incoming_getrequest( irq ) ; if( 0 != msg_get_address(msg, su, &sulen) ) { throw std::runtime_error("Failed trying to retrieve socket associated with incoming sip message") ; } char h[256], s[256] ; su_getnameinfo(su, sulen, h, 256, s, 256, NI_NUMERICHOST | NI_NUMERICSERV); host = h ; port = ::atoi( s ) ; }