diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-08-21 02:11:39 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-08-21 02:11:39 +0000 |
commit | 8b0c007ad990aa27d9868da49215fd1076ac77cc (patch) | |
tree | 270b9c46c1e644483d6d2a35b509f43218ba3252 /dns.c | |
parent | a42edc84034f91932a3e12d503e07f76a6eb498a (diff) |
merge new_loader_completion branch, including (at least):
- restructured build tree and makefiles to eliminate recursion problems
- support for embedded modules
- support for static builds
- simpler cross-compilation support
- simpler module/loader interface (no exported symbols)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@40722 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'dns.c')
-rw-r--r-- | dns.c | 235 |
1 files changed, 0 insertions, 235 deletions
diff --git a/dns.c b/dns.c deleted file mode 100644 index d214ef3e9..000000000 --- a/dns.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Asterisk -- An open source telephony toolkit. - * - * Copyright (C) 1999 - 2006 Thorsten Lockert - * - * Written by Thorsten Lockert <tholo@trollphone.org> - * - * Funding provided by Troll Phone Networks AS - * - * See http://www.asterisk.org for more information about - * the Asterisk project. Please do not directly contact - * any of the maintainers of this project for assistance; - * the project provides a web site, mailing lists and IRC - * channels for your use. - * - * This program is free software, distributed under the terms of - * the GNU General Public License Version 2. See the LICENSE file - * at the top of the source tree. - */ - -/*! \file - * - * \brief DNS Support for Asterisk - * - * \author Thorsten Lockert <tholo@trollphone.org> - * - * \par Reference - * - DNR SRV records http://www.ietf.org/rfc/rfc2782.txt - * - */ - -#include "asterisk.h" - -ASTERISK_FILE_VERSION(__FILE__, "$Revision$") - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/nameser.h> -#include <resolv.h> -#include <unistd.h> - -#include "asterisk/logger.h" -#include "asterisk/channel.h" -#include "asterisk/dns.h" -#include "asterisk/endian.h" - -#define MAX_SIZE 4096 - -typedef struct { - unsigned id:16; /*!< query identification number */ -#if __BYTE_ORDER == __BIG_ENDIAN - /* fields in third byte */ - unsigned qr:1; /*!< response flag */ - unsigned opcode:4; /*!< purpose of message */ - unsigned aa:1; /*!< authoritive answer */ - unsigned tc:1; /*!< truncated message */ - unsigned rd:1; /*!< recursion desired */ - /* fields in fourth byte */ - unsigned ra:1; /*!< recursion available */ - unsigned unused:1; /*!< unused bits (MBZ as of 4.9.3a3) */ - unsigned ad:1; /*!< authentic data from named */ - unsigned cd:1; /*!< checking disabled by resolver */ - unsigned rcode:4; /*!< response code */ -#endif -#if __BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __PDP_ENDIAN - /* fields in third byte */ - unsigned rd:1; /*!< recursion desired */ - unsigned tc:1; /*!< truncated message */ - unsigned aa:1; /*!< authoritive answer */ - unsigned opcode:4; /*!< purpose of message */ - unsigned qr:1; /*!< response flag */ - /* fields in fourth byte */ - unsigned rcode:4; /*!< response code */ - unsigned cd:1; /*!< checking disabled by resolver */ - unsigned ad:1; /*!< authentic data from named */ - unsigned unused:1; /*!< unused bits (MBZ as of 4.9.3a3) */ - unsigned ra:1; /*!< recursion available */ -#endif - /* remaining bytes */ - unsigned qdcount:16; /*!< number of question entries */ - unsigned ancount:16; /*!< number of answer entries */ - unsigned nscount:16; /*!< number of authority entries */ - unsigned arcount:16; /*!< number of resource entries */ -} dns_HEADER; - -struct dn_answer { - unsigned short rtype; - unsigned short class; - unsigned int ttl; - unsigned short size; -} __attribute__ ((__packed__)); - -static int skip_name(unsigned char *s, int len) -{ - int x = 0; - - while (x < len) { - if (*s == '\0') { - s++; - x++; - break; - } - if ((*s & 0xc0) == 0xc0) { - s += 2; - x += 2; - break; - } - x += *s + 1; - s += *s + 1; - } - if (x >= len) - return -1; - return x; -} - -/*! \brief Parse DNS lookup result, call callback */ -static int dns_parse_answer(void *context, - int class, int type, unsigned char *answer, int len, - int (*callback)(void *context, unsigned char *answer, int len, unsigned char *fullanswer)) -{ - unsigned char *fullanswer = answer; - struct dn_answer *ans; - dns_HEADER *h; - int res; - int x; - - h = (dns_HEADER *)answer; - answer += sizeof(dns_HEADER); - len -= sizeof(dns_HEADER); - - for (x = 0; x < ntohs(h->qdcount); x++) { - if ((res = skip_name(answer, len)) < 0) { - ast_log(LOG_WARNING, "Couldn't skip over name\n"); - return -1; - } - answer += res + 4; /* Skip name and QCODE / QCLASS */ - len -= res + 4; - if (len < 0) { - ast_log(LOG_WARNING, "Strange query size\n"); - return -1; - } - } - - for (x = 0; x < ntohs(h->ancount); x++) { - if ((res = skip_name(answer, len)) < 0) { - ast_log(LOG_WARNING, "Failed skipping name\n"); - return -1; - } - answer += res; - len -= res; - ans = (struct dn_answer *)answer; - answer += sizeof(struct dn_answer); - len -= sizeof(struct dn_answer); - if (len < 0) { - ast_log(LOG_WARNING, "Strange result size\n"); - return -1; - } - if (len < 0) { - ast_log(LOG_WARNING, "Length exceeds frame\n"); - return -1; - } - - if (ntohs(ans->class) == class && ntohs(ans->rtype) == type) { - if (callback) { - if ((res = callback(context, answer, ntohs(ans->size), fullanswer)) < 0) { - ast_log(LOG_WARNING, "Failed to parse result\n"); - return -1; - } - if (res > 0) - return 1; - } - } - answer += ntohs(ans->size); - len -= ntohs(ans->size); - } - return 0; -} - -#if defined(res_ninit) -#define HAS_RES_NINIT -#else -AST_MUTEX_DEFINE_STATIC(res_lock); -#if 0 -#warning "Warning, res_ninit is missing... Could have reentrancy issues" -#endif -#endif - -/*! \brief Lookup record in DNS -\note Asterisk DNS is synchronus at this time. This means that if your DNS does -not work properly, Asterisk might not start properly or a channel may lock. -*/ -int ast_search_dns(void *context, - const char *dname, int class, int type, - int (*callback)(void *context, unsigned char *answer, int len, unsigned char *fullanswer)) -{ -#ifdef HAS_RES_NINIT - struct __res_state dnsstate; -#endif - unsigned char answer[MAX_SIZE]; - int res, ret = -1; - -#ifdef HAS_RES_NINIT -#ifdef MAKE_VALGRIND_HAPPY - memset(&dnsstate, 0, sizeof(dnsstate)); -#endif - res_ninit(&dnsstate); - res = res_nsearch(&dnsstate, dname, class, type, answer, sizeof(answer)); -#else - ast_mutex_lock(&res_lock); - res_init(); - res = res_search(dname, class, type, answer, sizeof(answer)); -#endif - if (res > 0) { - if ((res = dns_parse_answer(context, class, type, answer, res, callback)) < 0) { - ast_log(LOG_WARNING, "DNS Parse error for %s\n", dname); - ret = -1; - } - else if (ret == 0) { - ast_log(LOG_DEBUG, "No matches found in DNS for %s\n", dname); - ret = 0; - } - else - ret = 1; - } -#ifdef HAS_RES_NINIT - res_nclose(&dnsstate); -#else -#ifndef __APPLE__ - res_close(); -#endif - ast_mutex_unlock(&res_lock); -#endif - return ret; -} |