summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/src/sm_resolve.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/src/sm_resolve.c')
-rw-r--r--contrib/sendmail/src/sm_resolve.c456
1 files changed, 0 insertions, 456 deletions
diff --git a/contrib/sendmail/src/sm_resolve.c b/contrib/sendmail/src/sm_resolve.c
deleted file mode 100644
index 035a9e5..0000000
--- a/contrib/sendmail/src/sm_resolve.c
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * Copyright (c) 2000-2004 Sendmail, Inc. and its suppliers.
- * All rights reserved.
- *
- * By using this file, you agree to the terms and conditions set
- * forth in the LICENSE file which can be found at the top level of
- * the sendmail distribution.
- *
- */
-
-/*
- * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan
- * (Royal Institute of Technology, Stockholm, Sweden).
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sendmail.h>
-#if DNSMAP
-# if NAMED_BIND
-# include "sm_resolve.h"
-
-SM_RCSID("$Id: sm_resolve.c,v 8.35 2007/06/25 16:20:14 ca Exp $")
-
-static struct stot
-{
- const char *st_name;
- int st_type;
-} stot[] =
-{
-# if NETINET
- { "A", T_A },
-# endif /* NETINET */
-# if NETINET6
- { "AAAA", T_AAAA },
-# endif /* NETINET6 */
- { "NS", T_NS },
- { "CNAME", T_CNAME },
- { "PTR", T_PTR },
- { "MX", T_MX },
- { "TXT", T_TXT },
- { "AFSDB", T_AFSDB },
- { "SRV", T_SRV },
- { NULL, 0 }
-};
-
-static DNS_REPLY_T *parse_dns_reply __P((unsigned char *, int));
-
-/*
-** DNS_STRING_TO_TYPE -- convert resource record name into type
-**
-** Parameters:
-** name -- name of resource record type
-**
-** Returns:
-** type if succeeded.
-** -1 otherwise.
-*/
-
-int
-dns_string_to_type(name)
- const char *name;
-{
- struct stot *p = stot;
-
- for (p = stot; p->st_name != NULL; p++)
- if (sm_strcasecmp(name, p->st_name) == 0)
- return p->st_type;
- return -1;
-}
-
-/*
-** DNS_TYPE_TO_STRING -- convert resource record type into name
-**
-** Parameters:
-** type -- resource record type
-**
-** Returns:
-** name if succeeded.
-** NULL otherwise.
-*/
-
-const char *
-dns_type_to_string(type)
- int type;
-{
- struct stot *p = stot;
-
- for (p = stot; p->st_name != NULL; p++)
- if (type == p->st_type)
- return p->st_name;
- return NULL;
-}
-
-/*
-** DNS_FREE_DATA -- free all components of a DNS_REPLY_T
-**
-** Parameters:
-** r -- pointer to DNS_REPLY_T
-**
-** Returns:
-** none.
-*/
-
-void
-dns_free_data(r)
- DNS_REPLY_T *r;
-{
- RESOURCE_RECORD_T *rr;
-
- if (r->dns_r_q.dns_q_domain != NULL)
- sm_free(r->dns_r_q.dns_q_domain);
- for (rr = r->dns_r_head; rr != NULL; )
- {
- RESOURCE_RECORD_T *tmp = rr;
-
- if (rr->rr_domain != NULL)
- sm_free(rr->rr_domain);
- if (rr->rr_u.rr_data != NULL)
- sm_free(rr->rr_u.rr_data);
- rr = rr->rr_next;
- sm_free(tmp);
- }
- sm_free(r);
-}
-
-/*
-** PARSE_DNS_REPLY -- parse DNS reply data.
-**
-** Parameters:
-** data -- pointer to dns data
-** len -- len of data
-**
-** Returns:
-** pointer to DNS_REPLY_T if succeeded.
-** NULL otherwise.
-*/
-
-static DNS_REPLY_T *
-parse_dns_reply(data, len)
- unsigned char *data;
- int len;
-{
- unsigned char *p;
- ushort ans_cnt, ui;
- int status;
- size_t l;
- char host[MAXHOSTNAMELEN];
- DNS_REPLY_T *r;
- RESOURCE_RECORD_T **rr;
-
- r = (DNS_REPLY_T *) sm_malloc(sizeof(*r));
- if (r == NULL)
- return NULL;
- memset(r, 0, sizeof(*r));
-
- p = data;
-
- /* doesn't work on Crays? */
- memcpy(&r->dns_r_h, p, sizeof(r->dns_r_h));
- p += sizeof(r->dns_r_h);
- status = dn_expand(data, data + len, p, host, sizeof(host));
- if (status < 0)
- {
- dns_free_data(r);
- return NULL;
- }
- r->dns_r_q.dns_q_domain = sm_strdup(host);
- if (r->dns_r_q.dns_q_domain == NULL)
- {
- dns_free_data(r);
- return NULL;
- }
-
- ans_cnt = ntohs((ushort) r->dns_r_h.ancount);
-
- p += status;
- GETSHORT(r->dns_r_q.dns_q_type, p);
- GETSHORT(r->dns_r_q.dns_q_class, p);
- rr = &r->dns_r_head;
- ui = 0;
- while (p < data + len && ui < ans_cnt)
- {
- int type, class, ttl, size, txtlen;
-
- status = dn_expand(data, data + len, p, host, sizeof(host));
- if (status < 0)
- {
- dns_free_data(r);
- return NULL;
- }
- ++ui;
- p += status;
- GETSHORT(type, p);
- GETSHORT(class, p);
- GETLONG(ttl, p);
- GETSHORT(size, p);
- if (p + size > data + len)
- {
- /*
- ** announced size of data exceeds length of
- ** data paket: someone is cheating.
- */
-
- if (LogLevel > 5)
- sm_syslog(LOG_WARNING, NOQID,
- "ERROR: DNS RDLENGTH=%d > data len=%d",
- size, len - (p - data));
- dns_free_data(r);
- return NULL;
- }
- *rr = (RESOURCE_RECORD_T *) sm_malloc(sizeof(**rr));
- if (*rr == NULL)
- {
- dns_free_data(r);
- return NULL;
- }
- memset(*rr, 0, sizeof(**rr));
- (*rr)->rr_domain = sm_strdup(host);
- if ((*rr)->rr_domain == NULL)
- {
- dns_free_data(r);
- return NULL;
- }
- (*rr)->rr_type = type;
- (*rr)->rr_class = class;
- (*rr)->rr_ttl = ttl;
- (*rr)->rr_size = size;
- switch (type)
- {
- case T_NS:
- case T_CNAME:
- case T_PTR:
- status = dn_expand(data, data + len, p, host,
- sizeof(host));
- if (status < 0)
- {
- dns_free_data(r);
- return NULL;
- }
- (*rr)->rr_u.rr_txt = sm_strdup(host);
- if ((*rr)->rr_u.rr_txt == NULL)
- {
- dns_free_data(r);
- return NULL;
- }
- break;
-
- case T_MX:
- case T_AFSDB:
- status = dn_expand(data, data + len, p + 2, host,
- sizeof(host));
- if (status < 0)
- {
- dns_free_data(r);
- return NULL;
- }
- l = strlen(host) + 1;
- (*rr)->rr_u.rr_mx = (MX_RECORD_T *)
- sm_malloc(sizeof(*((*rr)->rr_u.rr_mx)) + l);
- if ((*rr)->rr_u.rr_mx == NULL)
- {
- dns_free_data(r);
- return NULL;
- }
- (*rr)->rr_u.rr_mx->mx_r_preference = (p[0] << 8) | p[1];
- (void) sm_strlcpy((*rr)->rr_u.rr_mx->mx_r_domain,
- host, l);
- break;
-
- case T_SRV:
- status = dn_expand(data, data + len, p + 6, host,
- sizeof(host));
- if (status < 0)
- {
- dns_free_data(r);
- return NULL;
- }
- l = strlen(host) + 1;
- (*rr)->rr_u.rr_srv = (SRV_RECORDT_T*)
- sm_malloc(sizeof(*((*rr)->rr_u.rr_srv)) + l);
- if ((*rr)->rr_u.rr_srv == NULL)
- {
- dns_free_data(r);
- return NULL;
- }
- (*rr)->rr_u.rr_srv->srv_r_priority = (p[0] << 8) | p[1];
- (*rr)->rr_u.rr_srv->srv_r_weight = (p[2] << 8) | p[3];
- (*rr)->rr_u.rr_srv->srv_r_port = (p[4] << 8) | p[5];
- (void) sm_strlcpy((*rr)->rr_u.rr_srv->srv_r_target,
- host, l);
- break;
-
- case T_TXT:
-
- /*
- ** The TXT record contains the length as
- ** leading byte, hence the value is restricted
- ** to 255, which is less than the maximum value
- ** of RDLENGTH (size). Nevertheless, txtlen
- ** must be less than size because the latter
- ** specifies the length of the entire TXT
- ** record.
- */
-
- txtlen = *p;
- if (txtlen >= size)
- {
- if (LogLevel > 5)
- sm_syslog(LOG_WARNING, NOQID,
- "ERROR: DNS TXT record size=%d <= text len=%d",
- size, txtlen);
- dns_free_data(r);
- return NULL;
- }
- (*rr)->rr_u.rr_txt = (char *) sm_malloc(txtlen + 1);
- if ((*rr)->rr_u.rr_txt == NULL)
- {
- dns_free_data(r);
- return NULL;
- }
- (void) sm_strlcpy((*rr)->rr_u.rr_txt, (char*) p + 1,
- txtlen + 1);
- break;
-
- default:
- (*rr)->rr_u.rr_data = (unsigned char*) sm_malloc(size);
- if ((*rr)->rr_u.rr_data == NULL)
- {
- dns_free_data(r);
- return NULL;
- }
- (void) memcpy((*rr)->rr_u.rr_data, p, size);
- break;
- }
- p += size;
- rr = &(*rr)->rr_next;
- }
- *rr = NULL;
- return r;
-}
-
-/*
-** DNS_LOOKUP_INT -- perform dns map lookup (internal helper routine)
-**
-** Parameters:
-** domain -- name to lookup
-** rr_class -- resource record class
-** rr_type -- resource record type
-** retrans -- retransmission timeout
-** retry -- number of retries
-**
-** Returns:
-** result of lookup if succeeded.
-** NULL otherwise.
-*/
-
-DNS_REPLY_T *
-dns_lookup_int(domain, rr_class, rr_type, retrans, retry)
- const char *domain;
- int rr_class;
- int rr_type;
- time_t retrans;
- int retry;
-{
- int len;
- unsigned long old_options = 0;
- time_t save_retrans = 0;
- int save_retry = 0;
- DNS_REPLY_T *r = NULL;
- unsigned char reply[1024];
-
- if (tTd(8, 16))
- {
- old_options = _res.options;
- _res.options |= RES_DEBUG;
- sm_dprintf("dns_lookup(%s, %d, %s)\n", domain,
- rr_class, dns_type_to_string(rr_type));
- }
- if (retrans > 0)
- {
- save_retrans = _res.retrans;
- _res.retrans = retrans;
- }
- if (retry > 0)
- {
- save_retry = _res.retry;
- _res.retry = retry;
- }
- errno = 0;
- SM_SET_H_ERRNO(0);
- len = res_search(domain, rr_class, rr_type, reply, sizeof(reply));
- if (tTd(8, 16))
- {
- _res.options = old_options;
- sm_dprintf("dns_lookup(%s, %d, %s) --> %d\n",
- domain, rr_class, dns_type_to_string(rr_type), len);
- }
- if (len >= 0)
- r = parse_dns_reply(reply, len);
- if (retrans > 0)
- _res.retrans = save_retrans;
- if (retry > 0)
- _res.retry = save_retry;
- return r;
-}
-
-# if 0
-DNS_REPLY_T *
-dns_lookup(domain, type_name, retrans, retry)
- const char *domain;
- const char *type_name;
- time_t retrans;
- int retry;
-{
- int type;
-
- type = dns_string_to_type(type_name);
- if (type == -1)
- {
- if (tTd(8, 16))
- sm_dprintf("dns_lookup: unknown resource type: `%s'\n",
- type_name);
- return NULL;
- }
- return dns_lookup_int(domain, C_IN, type, retrans, retry);
-}
-# endif /* 0 */
-# endif /* NAMED_BIND */
-#endif /* DNSMAP */
OpenPOWER on IntegriCloud