/**Create a resolver. * * The function sres_resolver_create() is used to allocate and initialize * the resolver object using the Sofia asynchronous reactor #su_root_t. */ sres_resolver_t * sres_resolver_create(su_root_t *root, char const *conf_file_path, tag_type_t tag, tag_value_t value, ...) { sres_resolver_t *res; sres_sofia_t *srs; sres_cache_t *cache = NULL; ta_list ta; if (root == NULL) return su_seterrno(EFAULT), (void *)NULL; ta_start(ta, tag, value); tl_gets(ta_args(ta), SRESTAG_RESOLV_CONF_REF(conf_file_path), SRESTAG_CACHE_REF(cache), TAG_END()); ta_end(ta); res = sres_resolver_new_with_cache(conf_file_path, cache, NULL); srs = res ? su_zalloc(0, sizeof *srs) : NULL; if (res && srs) { su_timer_t *t; srs->srs_resolver = res; srs->srs_root = root; srs->srs_socket = INVALID_SOCKET; sres_resolver_set_async(res, sres_sofia_update, srs, 0); t = su_timer_create(su_root_task(root), SRES_RETRANSMIT_INTERVAL); srs->srs_timer = t; if (!srs->srs_timer) SU_DEBUG_3(("sres: cannot create timer\n")); #if nomore else if (su_timer_set_for_ever(t, sres_sofia_timer, srs) < 0) SU_DEBUG_3(("sres: cannot set timer\n")); #else else if (sres_resolver_set_timer_cb(res, sres_sofia_set_timer, srs) < 0) SU_DEBUG_3(("sres: cannot set timer cb\n")); #endif else return res; /* Success! */ sres_resolver_destroy(res), res = NULL; } return res; }
void DrachtioController::run() { if( m_bDaemonize ) { daemonize() ; } /* now we can initialize logging */ m_logger.reset( this->createLogger() ); this->logConfig() ; DR_LOG(log_debug) << "Main thread id: " << boost::this_thread::get_id() << endl ; /* open stats connection */ string adminAddress ; unsigned int adminPort = m_Config->getAdminPort( adminAddress ) ; if( 0 != adminPort ) { m_pClientController.reset( new ClientController( this, adminAddress, adminPort )) ; } string url ; m_Config->getSipUrl( url ) ; DR_LOG(log_notice) << "starting sip stack on " << url << endl ; int rv = su_init() ; if( rv < 0 ) { DR_LOG(log_error) << "Error calling su_init: " << rv << endl ; return ; } ::atexit(su_deinit); m_root = su_root_create( NULL ) ; if( NULL == m_root ) { DR_LOG(log_error) << "Error calling su_root_create: " << endl ; return ; } m_home = su_home_create() ; if( NULL == m_home ) { DR_LOG(log_error) << "Error calling su_home_create" << endl ; } su_log_redirect(NULL, __sofiasip_logger_func, NULL); /* for now set logging to full debug */ su_log_set_level(NULL, m_Config->getSofiaLogLevel() ) ; setenv("TPORT_LOG", "1", 1) ; /* this causes su_clone_start to start a new thread */ su_root_threading( m_root, 0 ) ; rv = su_clone_start( m_root, m_clone, this, clone_init, clone_destroy ) ; if( rv < 0 ) { DR_LOG(log_error) << "Error calling su_clone_start" << endl ; return ; } /* enable extended headers */ if (sip_update_default_mclass(sip_extend_mclass(NULL)) < 0) { DR_LOG(log_error) << "Error calling sip_update_default_mclass" << endl ; return ; } /* create our agent */ char str[URL_MAXLEN] ; memset(str, 0, URL_MAXLEN) ; strncpy( str, url.c_str(), url.length() ) ; m_nta = nta_agent_create( m_root, URL_STRING_MAKE(str), /* our contact address */ NULL, /* no callback function */ NULL, /* therefore no context */ TAG_NULL(), TAG_END() ) ; if( NULL == m_nta ) { DR_LOG(log_error) << "Error calling nta_agent_create" << endl ; return ; } m_defaultLeg = nta_leg_tcreate(m_nta, defaultLegCallback, this, NTATAG_NO_DIALOG(1), TAG_END()); if( NULL == m_defaultLeg ) { DR_LOG(log_error) << "Error creating default leg" << endl ; return ; } /* save my contact url, via, etc */ m_my_contact = nta_agent_contact( m_nta ) ; ostringstream s ; s << "SIP/2.0/UDP " << m_my_contact->m_url[0].url_host ; if( m_my_contact->m_url[0].url_port ) s << ":" << m_my_contact->m_url[0].url_port ; m_my_via.assign( s.str().c_str(), s.str().length() ) ; DR_LOG(log_debug) << "My via header: " << m_my_via << endl ; m_pDialogController = boost::make_shared<SipDialogController>( this, &m_clone ) ; /* sofia event loop */ DR_LOG(log_notice) << "Starting sofia event loop in main thread: " << boost::this_thread::get_id() << endl ; /* start a timer */ m_timer = su_timer_create( su_root_task(m_root), 30000) ; su_timer_set_for_ever(m_timer, watchdogTimerHandler, this) ; su_root_run( m_root ) ; DR_LOG(log_notice) << "Sofia event loop ended" << endl ; su_root_destroy( m_root ) ; m_root = NULL ; su_home_unref( m_home ) ; su_deinit() ; m_Config.reset(); this->deinitializeLogging() ; }