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

📄 exutils.c

📁 libeXosip2-3.0.3.tar.gz
💻 C
📖 第 1 页 / 共 3 页
字号:
                  (__FILE__, __LINE__, OSIP_INFO2, NULL,                   "getaddrinfo failure. %s:%s (%s)\n", hostname, portbuf,                   gai_strerror (error)));      return -1;    }   else{	struct addrinfo *elem;	char tmp[INET6_ADDRSTRLEN];	char porttmp[10];	OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_INFO2, NULL,                   "getaddrinfo returned the following addresses:\n"));	for (elem=*addrinfo;elem!=NULL;elem=elem->ai_next){		getnameinfo(elem->ai_addr,elem->ai_addrlen,tmp,sizeof(tmp),porttmp,sizeof(porttmp),NI_NUMERICHOST|NI_NUMERICSERV);		OSIP_TRACE (osip_trace                  (__FILE__, __LINE__, OSIP_INFO2, NULL,                   "%s port %s\n",tmp,porttmp));	}   }  return 0;}#endif#ifdef SRV_RECORDint_eXosip_srv_lookup(osip_transaction_t * tr, osip_message_t * sip, struct osip_srv_record *record){	int use_srv=1;	int port;	char *host;	osip_via_t *via;	via = (osip_via_t *) osip_list_get (&sip->vias, 0);	if (via == NULL || via->protocol == NULL)		return -1;	if (MSG_IS_REQUEST(sip))	{	    osip_route_t *route;	    osip_message_get_route (sip, 0, &route);	    if (route != NULL)	    {			osip_uri_param_t *lr_param = NULL;						osip_uri_uparam_get_byname (route->url, "lr", &lr_param);			if (lr_param == NULL)				route = NULL;		}	    	    if (route != NULL)	    {			port = 5060;			if (route->url->port != NULL)			{				port = osip_atoi (route->url->port);				use_srv=0;			}			host = route->url->host;	    }	    else	    {		/* search for maddr parameter */		osip_uri_param_t *maddr_param = NULL;		osip_uri_uparam_get_byname (sip->req_uri, "maddr", &maddr_param);		host=NULL;		if (maddr_param!=NULL && maddr_param->gvalue!=NULL)		  host = maddr_param->gvalue;				port = 5060;		if (sip->req_uri->port != NULL)		  {		    use_srv=0;		    port = osip_atoi (sip->req_uri->port);		  }				if (host==NULL)		  host = sip->req_uri->host;	    }	}	else	{		osip_generic_param_t *maddr;		osip_generic_param_t *received;		osip_generic_param_t *rport;		osip_via_param_get_byname (via, "maddr", &maddr);		osip_via_param_get_byname (via, "received", &received);		osip_via_param_get_byname (via, "rport", &rport);		if (maddr != NULL)			host = maddr->gvalue;		else if (received != NULL)			host = received->gvalue;		else			host = via->host;		if (via->port == NULL)			use_srv=0;		if (rport == NULL || rport->gvalue == NULL)		{			if (via->port != NULL)				port = osip_atoi (via->port);			else				port = 5060;		} else			port = osip_atoi (rport->gvalue);	}	/* check if we have an IP address */	if (use_srv==1)	{		int i;		i = _eXosip_get_srv_record(record, host, via->protocol);	}	return 0;}#if defined(WIN32) && !defined(_WIN32_WCE)int_eXosip_get_srv_record (struct osip_srv_record *record, char *domain, char *protocol){	char zone[1024];	PDNS_RECORD answer, tmp;      /* answer buffer from nameserver */	int n;	char tr[100];	memset(record, 0, sizeof(struct osip_srv_record));	if (strlen(domain)+strlen(protocol)>1000)		return -1;	if (strlen(protocol)>=100)	  return -1;	snprintf(tr, 100, protocol);	osip_tolower(tr);	snprintf(zone, 1024, "_sip._%s.%s", tr, domain);	OSIP_TRACE (osip_trace				(__FILE__, __LINE__, OSIP_INFO2, NULL,				"About to ask for '%s IN SRV'\n", zone));	if (DnsQuery (zone, DNS_TYPE_SRV, DNS_QUERY_STANDARD, NULL, &answer, NULL) != 0)	{		return -1;    }	n = 0;	for (tmp = answer; tmp != NULL; tmp = tmp->pNext)	{		struct osip_srv_entry *srventry;		DNS_SRV_DATA * data;		if (tmp->wType != DNS_TYPE_SRV)			continue;		srventry = &record->srventry[n];		data=&tmp->Data.SRV;		snprintf(srventry->srv, sizeof(srventry->srv), "%s", data->pNameTarget);		srventry->priority = data->wPriority;		srventry->weight = data->wWeight;		if (srventry->weight)			srventry->rweight = 1 + rand () % (10000 * srventry->weight);		else			srventry->rweight = 0;		srventry->port = data->wPort;		OSIP_TRACE (osip_trace					(__FILE__, __LINE__, OSIP_INFO2, NULL,					"SRV record %s IN SRV -> %s:%i/%i/%i/%i\n",					zone, srventry->srv, srventry->port, srventry->priority,					srventry->weight, srventry->rweight));		n++;	}	if (n==0)		return -1;	snprintf(record->name, sizeof(record->name), "%s", domain);	return 0;}#elif defined(__linux)/* the biggest packet we'll send and receive */#if PACKETSZ > 1024#define	MAXPACKET PACKETSZ#else#define	MAXPACKET 1024#endif/* and what we send and receive */  typedef union  {    HEADER hdr;    u_char buf[MAXPACKET];  }  querybuf;#ifndef T_SRV#define T_SRV		33#endifint_eXosip_get_srv_record (struct osip_srv_record *record, char *domain, char *protocol){	querybuf answer;              /* answer buffer from nameserver */	int n;	char zone[1024];	int ancount, qdcount;         /* answer count and query count */	HEADER *hp;                   /* answer buffer header */	char hostbuf[256];	unsigned char *msg, *eom, *cp;        /* answer buffer positions */	int dlen, type, aclass, pref, weight, port;	long ttl;	int answerno;	char tr[100];	memset(record, 0, sizeof(struct osip_srv_record));	if (strlen(domain)+strlen(protocol)>1000)		return -1;	if (strlen(protocol)>=100)	  return -1;	snprintf(tr, 100, protocol);	osip_tolower(tr);	snprintf(zone, 1024, "_sip._%s.%s", tr, domain);	OSIP_TRACE (osip_trace				(__FILE__, __LINE__, OSIP_INFO2, NULL,				"About to ask for '%s IN SRV'\n", zone));	n = res_query (zone, C_IN, T_SRV, (unsigned char *) &answer, sizeof (answer));	if (n < (int) sizeof (HEADER))	{		return -1;	}	/* browse message and search for DNS answers part */	hp = (HEADER *) &answer;	qdcount = ntohs (hp->qdcount);	ancount = ntohs (hp->ancount);	msg = (unsigned char *) (&answer);	eom = (unsigned char *) (&answer) + n;	cp = (unsigned char *) (&answer) + sizeof (HEADER);	while (qdcount-- > 0 && cp < eom)	{		n = dn_expand (msg, eom, cp, (char *) hostbuf, 256);		if (n < 0)		{			OSIP_TRACE (osip_trace						(__FILE__, __LINE__, OSIP_ERROR, NULL,						"Invalid SRV record answer for '%s': bad format\n", zone));			return -1;		}		cp += n + QFIXEDSZ;	}	/* browse DNS answers */	answerno = 0;	/* loop through the answer buffer and extract SRV records */	while (ancount-- > 0 && cp < eom)	{		struct osip_srv_entry *srventry;		n = dn_expand (msg, eom, cp, (char *) hostbuf, 256);		if (n < 0)		{			OSIP_TRACE (osip_trace						(__FILE__, __LINE__, OSIP_ERROR, NULL,						"Invalid SRV record answer for '%s': bad format\n", zone));			return -1;		}		cp += n;#if defined(__NetBSD__) || defined(__OpenBSD__) ||\defined(OLD_NAMESER) || defined(__FreeBSD__)		type = _get_short (cp);		cp += sizeof (u_short);#elif defined(__APPLE_CC__)		GETSHORT (type, cp);#else		NS_GET16 (type, cp);#endif#if defined(__NetBSD__) || defined(__OpenBSD__) ||\defined(OLD_NAMESER) || defined(__FreeBSD__)		aclass = _get_short (cp);		cp += sizeof (u_short);#elif defined(__APPLE_CC__)		GETSHORT (aclass, cp);#else		NS_GET16 (aclass, cp);#endif#if defined(__NetBSD__) || defined(__OpenBSD__) ||\defined(OLD_NAMESER) || defined(__FreeBSD__)		ttl = _get_long (cp);		cp += sizeof (u_long);#elif defined(__APPLE_CC__)		GETLONG (ttl, cp);#else		NS_GET32 (ttl, cp);#endif#if defined(__NetBSD__) || defined(__OpenBSD__) ||\defined(OLD_NAMESER) || defined(__FreeBSD__)		dlen = _get_short (cp);		cp += sizeof (u_short);#elif defined(__APPLE_CC__)		GETSHORT (dlen, cp);#else		NS_GET16 (dlen, cp);#endif		if (type != T_SRV)		{			cp += dlen;			continue;		}#if defined(__NetBSD__) || defined(__OpenBSD__) ||\defined(OLD_NAMESER) || defined(__FreeBSD__)		pref = _get_short (cp);		cp += sizeof (u_short);#elif defined(__APPLE_CC__)		GETSHORT (pref, cp);#else		NS_GET16 (pref, cp);#endif#if defined(__NetBSD__) || defined(__OpenBSD__) ||\defined(OLD_NAMESER) || defined(__FreeBSD__)		weight = _get_short (cp);		cp += sizeof (u_short);#elif defined(__APPLE_CC__)		GETSHORT (weight, cp);#else		NS_GET16 (weight, cp);#endif#if defined(__NetBSD__) || defined(__OpenBSD__) ||\defined(OLD_NAMESER) || defined(__FreeBSD__)		port = _get_short (cp);		cp += sizeof (u_short);#elif defined(__APPLE_CC__)		GETSHORT (port, cp);#else		NS_GET16 (port, cp);#endif		n = dn_expand (msg, eom, cp, (char *) hostbuf, 256);		if (n < 0)			break;		cp += n;		srventry = &record->srventry[answerno];		snprintf(srventry->srv, sizeof(srventry->srv), "%s", hostbuf);		srventry->priority = pref;		srventry->weight = weight;		if (weight)			srventry->rweight = 1 + random () % (10000 * srventry->weight);		else			srventry->rweight = 0;		srventry->port = port;		OSIP_TRACE (osip_trace					(__FILE__, __LINE__, OSIP_INFO2, NULL,					"SRV record %s IN SRV -> %s:%i/%i/%i/%i\n",					zone, srventry->srv, srventry->port, srventry->priority,					srventry->weight, srventry->rweight));		answerno++;	}	if (answerno == 0)		return -1;	snprintf(record->name, sizeof(record->name), "%s", domain);	return 0;}#elseint_eXosip_get_srv_record (struct osip_srv_record *record, char *domain, char *protocol){	return -1;}#endif#endif

⌨️ 快捷键说明

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