📄 exutils.c
字号:
(__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 + -