⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exconf.c

📁 最新的libexosip2源码libeXosip2-3.0.3-2
💻 C
📖 第 1 页 / 共 2 页
字号:
      if (res1 != 0)      	  {		  close (sock);		  sock = -1;		  continue;	  }	  close(sock);	  sock=-1;	  eXosip_freeaddrinfo (addrinfo_rtp);	  if (ipv6_enable == 0)		return ntohs (((struct sockaddr_in *) &ai_addr)->sin_port);	  else		return ntohs (((struct sockaddr_in6 *) &ai_addr)->sin6_port);  }  eXosip_freeaddrinfo (addrinfo_rtp);  if (sock!=-1)  {	  close(sock);	  sock=-1;  }  return -1;}#endifinteXosip_listen_addr (int transport, const char *addr, int port, int family,                    int secure){  int i=-1;  struct eXtl_protocol *eXtl=NULL;  if (eXosip.eXtl!=NULL)    {      /* already set */      OSIP_TRACE (osip_trace		  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: already listening somewhere\n"));      return -1;    }  if (transport==IPPROTO_UDP && secure==0)    eXtl = &eXtl_udp;  else if (transport==IPPROTO_TCP && secure==0)    eXtl = &eXtl_tcp;#ifdef HAVE_OPENSSL_SSL_H  else if (transport==IPPROTO_UDP)    eXtl = &eXtl_dtls;  else if (transport==IPPROTO_TCP)    eXtl = &eXtl_tls;#endif  if (eXtl==NULL)    return -1;  eXtl->proto_family=family;  eXtl->proto_port=port;  if (addr!=NULL)    snprintf(eXtl->proto_ifs, sizeof(eXtl->proto_ifs), "%s", addr);  i = eXtl->tl_open();    if (i!=0)    return -1;    eXosip.eXtl = eXtl;  if (transport==IPPROTO_UDP && secure==0)    snprintf(eXosip.transport, sizeof(eXosip.transport), "%s", "UDP");  else if (transport==IPPROTO_TCP && secure==0)    snprintf(eXosip.transport, sizeof(eXosip.transport), "%s", "TCP");  else if (transport==IPPROTO_UDP)    snprintf(eXosip.transport, sizeof(eXosip.transport), "%s", "DTLS-UDP");  else if (transport==IPPROTO_TCP)    snprintf(eXosip.transport, sizeof(eXosip.transport), "%s", "TLS");#ifdef OSIP_MT  if (eXosip.j_thread==NULL)    {      eXosip.j_thread = (void *) osip_thread_create (20000, _eXosip_thread, NULL);      if (eXosip.j_thread == NULL)	{	  OSIP_TRACE (osip_trace		      (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: Cannot start thread!\n"));	  return -1;	}    }#endif  return 0;}inteXosip_init (void){  osip_t *osip;  memset (&eXosip, 0, sizeof (eXosip));  snprintf(eXosip.ipv4_for_gateway, 256, "%s", "217.12.3.11");  snprintf(eXosip.ipv6_for_gateway, 256, "%s", "2001:638:500:101:2e0:81ff:fe24:37c6");#ifndef MINISIZE  snprintf(eXosip.event_package, 256, "%s", "dialog");#endif#ifdef WIN32  /* Initializing windows socket library */  {    WORD wVersionRequested;    WSADATA wsaData;    int i;    wVersionRequested = MAKEWORD (1, 1);    i = WSAStartup (wVersionRequested, &wsaData);    if (i != 0)      {        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_WARNING, NULL,                     "eXosip: Unable to initialize WINSOCK, reason: %d\n", i));        /* return -1; It might be already initilized?? */      }  }#endif  eXosip.user_agent = osip_strdup ("eXosip/" EXOSIP_VERSION);  eXosip.j_calls = NULL;  eXosip.j_stop_ua = 0;#ifdef OSIP_MT  eXosip.j_thread = NULL;#endif  eXosip.j_transactions = (osip_list_t *) osip_malloc (sizeof (osip_list_t));  osip_list_init (eXosip.j_transactions);  eXosip.j_reg = NULL;#ifdef OSIP_MT#if !defined (_WIN32_WCE)  eXosip.j_cond = (struct osip_cond *) osip_cond_init ();#endif  eXosip.j_mutexlock = (struct osip_mutex *) osip_mutex_init ();#endif  if (-1 == osip_init (&osip))    {      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_ERROR, NULL,                   "eXosip: Cannot initialize osip!\n"));      return -1;    }  osip_set_application_context (osip, &eXosip);  eXosip_set_callbacks (osip);  eXosip.j_osip = osip;#ifdef OSIP_MT  /* open a TCP socket to wake up the application when needed. */  eXosip.j_socketctl = jpipe ();  if (eXosip.j_socketctl == NULL)    return -2;  eXosip.j_socketctl_event = jpipe ();  if (eXosip.j_socketctl_event == NULL)    return -3;#endif  /* To be changed in osip! */  eXosip.j_events = (osip_fifo_t *) osip_malloc (sizeof (osip_fifo_t));  osip_fifo_init (eXosip.j_events);  eXosip.use_rport = 1;  eXosip.keep_alive = 32000;  eXtl_udp.tl_init();  eXtl_tcp.tl_init();#ifdef HAVE_OPENSSL_SSL_H  eXtl_dtls.tl_init();  eXtl_tls.tl_init();#endif  return 0;}inteXosip_execute (void){  struct timeval lower_tv;  int i;#ifdef OSIP_MT  osip_timers_gettimeout (eXosip.j_osip, &lower_tv);  if (lower_tv.tv_sec > 15)    {      lower_tv.tv_sec = 15;      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_INFO2, NULL,                   "eXosip: Reseting timer to 15s before waking up!\n"));  } else    {      /*  add a small amount of time on windows to avoid         waking up too early. (probably a bad time precision) */      if (lower_tv.tv_usec < 900000)        lower_tv.tv_usec = 100000;      /* add 10ms */      else        {          lower_tv.tv_usec = 10000;     /* add 10ms */          lower_tv.tv_sec++;        }      OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_INFO2, NULL,                   "eXosip: timer sec:%i usec:%i!\n",                   lower_tv.tv_sec, lower_tv.tv_usec));    }#else  lower_tv.tv_sec = 0;  lower_tv.tv_usec = 0;#endif  i = eXosip_read_message (1, lower_tv.tv_sec, lower_tv.tv_usec);  if (i == -2)    {      return -2;    }  eXosip_lock ();  osip_timers_ict_execute (eXosip.j_osip);  osip_timers_nict_execute (eXosip.j_osip);  osip_timers_ist_execute (eXosip.j_osip);  osip_timers_nist_execute (eXosip.j_osip);  osip_ict_execute (eXosip.j_osip);  osip_nict_execute (eXosip.j_osip);  osip_ist_execute (eXosip.j_osip);  osip_nist_execute (eXosip.j_osip);  /* free all Calls that are in the TERMINATED STATE? */  eXosip_release_terminated_calls ();  eXosip_release_terminated_registrations ();#ifndef MINISIZE  eXosip_release_unused_transactions();#endif  eXosip_unlock ();  if (eXosip.keep_alive > 0)    {      _eXosip_keep_alive ();    }  return 0;}inteXosip_set_option (eXosip_option opt, const void *value){  int val;  char *tmp;  switch (opt)    {      case EXOSIP_OPT_ADD_ACCOUNT_INFO:		  {			  struct eXosip_account_info *ainfo;			  int i;			  ainfo = (struct eXosip_account_info*) value;			  if (ainfo==NULL || ainfo->proxy[0]=='\0')			  {				  return -1;			  }			  for (i=0;i<MAX_EXOSIP_ACCOUNT_INFO;i++)			  {				  if (eXosip.account_entries[i].proxy[0]!='\0'					  &&0==osip_strcasecmp(eXosip.account_entries[i].proxy, ainfo->proxy))				  {					  /* update ainfo */					  if (ainfo->nat_ip[0]!='\0')					  {						  snprintf(eXosip.account_entries[i].nat_ip, sizeof(eXosip.account_entries[i].nat_ip), "%s", ainfo->nat_ip);						  eXosip.account_entries[i].nat_port = ainfo->nat_port;						  OSIP_TRACE (osip_trace										(__FILE__, __LINE__, OSIP_INFO1, NULL,										"eXosip option set: account info updated:%s -> %s:%i\n",										ainfo->proxy, ainfo->nat_ip, ainfo->nat_port));					  }					  else					  {						  eXosip.account_entries[i].proxy[0]='\0';						  OSIP_TRACE (osip_trace										(__FILE__, __LINE__, OSIP_INFO2, NULL,										 "eXosip option set: account info deleted :%s\n", ainfo->proxy));					  }					  return 0;				  }			  }			  if (ainfo->nat_ip[0]=='\0')			  {				  return -1;			  }			  /* not found case: */			  for (i=0;i<MAX_EXOSIP_ACCOUNT_INFO;i++)			  {				  if (eXosip.account_entries[i].proxy[0]=='\0')				  {					  /* add ainfo */					  snprintf(eXosip.account_entries[i].proxy, sizeof(ainfo->proxy), "%s", ainfo->proxy);					  snprintf(eXosip.account_entries[i].nat_ip, sizeof(ainfo->nat_ip), "%s", ainfo->nat_ip);					  eXosip.account_entries[i].nat_port = ainfo->nat_port;						  OSIP_TRACE (osip_trace										(__FILE__, __LINE__, OSIP_INFO1, NULL,										"eXosip option set: account info added:%s -> %s:%i\n",										ainfo->proxy, ainfo->nat_ip, ainfo->nat_port));					  return 0;				  }			  }			  return -1;		  }        break;	  case EXOSIP_OPT_ADD_DNS_CACHE:		  {			  struct eXosip_dns_cache *entry;			  int i;			  entry = (struct eXosip_dns_cache*) value;			  if (entry==NULL || entry->host[0]=='\0')			  {				  return -1;			  }			  for (i=0;i<MAX_EXOSIP_DNS_ENTRY;i++)			  {				  if (eXosip.dns_entries[i].host[0]!='\0'					  &&0==osip_strcasecmp(eXosip.dns_entries[i].host, entry->host))				  {					  /* update entry */					  if (entry->ip[0]!='\0')					  {						  snprintf(eXosip.dns_entries[i].ip, sizeof(eXosip.dns_entries[i].ip), "%s", entry->ip);						  OSIP_TRACE (osip_trace										(__FILE__, __LINE__, OSIP_INFO1, NULL,										 "eXosip option set: dns cache updated:%s -> %s\n", entry->host, entry->ip));					  }					  else					  {						  eXosip.dns_entries[i].host[0]='\0';						  OSIP_TRACE (osip_trace										(__FILE__, __LINE__, OSIP_INFO2, NULL,										 "eXosip option set: dns cache deleted :%s\n", entry->host));					  }					  return 0;				  }			  }			  if (entry->ip[0]=='\0')			  {				  return -1;			  }			  /* not found case: */			  for (i=0;i<MAX_EXOSIP_DNS_ENTRY;i++)			  {				  if (eXosip.dns_entries[i].host[0]=='\0')				  {					  /* add entry */					  snprintf(eXosip.dns_entries[i].host, sizeof(entry->host), "%s", entry->host);					  snprintf(eXosip.dns_entries[i].ip, sizeof(entry->ip), "%s", entry->ip);					  OSIP_TRACE (osip_trace									(__FILE__, __LINE__, OSIP_INFO2, NULL,									 "eXosip option set: dns cache added:%s -> %s\n", entry->host, entry->ip));					  return 0;				  }			  }			  return -1;		  }        break;      case EXOSIP_OPT_UDP_KEEP_ALIVE:        val = *((int *) value);        eXosip.keep_alive = val;        /* value in ms */        break;      case EXOSIP_OPT_UDP_LEARN_PORT:        val = *((int *) value);        eXosip.learn_port = val;        /* 1 to learn port */        break;#ifndef MINISIZE      case EXOSIP_OPT_SET_HTTP_TUNNEL_PORT:        val = *((int *) value);        eXosip.http_port = val; /* value in ms */        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_INFO1, NULL,                     "eXosip option set: http_port:%i!\n", eXosip.http_port));        break;      case EXOSIP_OPT_SET_HTTP_TUNNEL_PROXY:        tmp = (char *) value;        memset (eXosip.http_proxy, '\0', sizeof (eXosip.http_proxy));        if (tmp != NULL && tmp[0] != '\0')          strncpy (eXosip.http_proxy, tmp, sizeof (eXosip.http_proxy)); /* value in proxy:port */        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_INFO1, NULL,                     "eXosip option set: http_proxy:%s!\n", eXosip.http_proxy));        break;      case EXOSIP_OPT_SET_HTTP_OUTBOUND_PROXY:        tmp = (char *) value;        memset (eXosip.http_outbound_proxy, '\0',                sizeof (eXosip.http_outbound_proxy));        if (tmp != NULL && tmp[0] != '\0')          strncpy (eXosip.http_outbound_proxy, tmp, sizeof (eXosip.http_outbound_proxy));       /* value in proxy:port */        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_INFO1, NULL,                     "eXosip option set: http_outbound_proxy:%s!\n",                     eXosip.http_outbound_proxy));        break;      case EXOSIP_OPT_DONT_SEND_101:        val = *((int *) value);        eXosip.dontsend_101 = val;        /* 0 to disable */        break;#endif      case EXOSIP_OPT_USE_RPORT:        val = *((int *) value);        eXosip.use_rport = val;       /* 0 to disable (for broken NAT only?) */        break;      case EXOSIP_OPT_SET_IPV4_FOR_GATEWAY:        tmp = (char *) value;        memset (eXosip.ipv4_for_gateway, '\0',                sizeof (eXosip.ipv4_for_gateway));        if (tmp != NULL && tmp[0] != '\0')          strncpy (eXosip.ipv4_for_gateway, tmp, sizeof (eXosip.ipv4_for_gateway));        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_INFO1, NULL,                     "eXosip option set: ipv4_for_gateway:%s!\n",                     eXosip.ipv4_for_gateway));        break;#ifndef MINISIZE      case EXOSIP_OPT_SET_IPV6_FOR_GATEWAY:        tmp = (char *) value;        memset (eXosip.ipv6_for_gateway, '\0',                sizeof (eXosip.ipv6_for_gateway));        if (tmp != NULL && tmp[0] != '\0')          strncpy (eXosip.ipv6_for_gateway, tmp, sizeof (eXosip.ipv6_for_gateway));        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_INFO1, NULL,                     "eXosip option set: ipv6_for_gateway:%s!\n",                     eXosip.ipv6_for_gateway));        break;      case EXOSIP_OPT_EVENT_PACKAGE:        tmp = (char *) value;        memset (eXosip.event_package, '\0',                sizeof (eXosip.event_package));        if (tmp != NULL && tmp[0] != '\0')          strncpy (eXosip.event_package, tmp, sizeof (eXosip.event_package));        OSIP_TRACE (osip_trace                    (__FILE__, __LINE__, OSIP_INFO1, NULL,                     "eXosip option set: event_package:%s!\n",                     eXosip.event_package));        break;#endif    default:      return -1;    }  return 0;}static void_eXosip_keep_alive (void){  static struct timeval mtimer = { 0, 0 };  struct timeval now;  osip_gettimeofday (&now, NULL);  if (mtimer.tv_sec == 0 && mtimer.tv_usec == 0)    {      /* first init */      osip_gettimeofday (&mtimer, NULL);      add_gettimeofday (&mtimer, eXosip.keep_alive);    }  if (osip_timercmp (&now, &mtimer, <))    {      return;                   /* not yet time */    }  /* reset timer */  osip_gettimeofday (&mtimer, NULL);  add_gettimeofday (&mtimer, eXosip.keep_alive);  eXtl_udp.tl_keepalive();}#ifdef OSIP_MTvoid *_eXosip_thread (void *arg){  int i;  while (eXosip.j_stop_ua == 0)    {      i = eXosip_execute ();      if (i == -2)        osip_thread_exit ();    }  osip_thread_exit ();  return NULL;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -