#include "ares_private.h"
Include dependency graph for ares_search.c:
Go to the source code of this file.
Data Structures | |
struct | search_query |
Functions | |
void | search_callback (void *arg, int status, unsigned char *abuf, int alen) |
void | end_squery (struct search_query *squery, int status, unsigned char *abuf, int alen) |
int | cat_domain (const char *name, const char *domain, char **s) |
int | single_domain (ares_channel channel, const char *name, char **s) |
void | ares_search (ares_channel channel, const char *name, int dnsclass, int type, ares_callback callback, void *arg) |
|
Definition at line 46 of file ares_search.c. References ares_callback, ares_channel, ARES_ENOMEM, ares_query(), ARES_SUCCESS, callback(), cat_domain(), ares_channeldata::domains, free, malloc, name, ares_channeldata::ndots, NULL, search_callback(), single_domain(), status, and strdup. Referenced by next_lookup().
00048 { 00049 struct search_query *squery; 00050 char *s; 00051 const char *p; 00052 int status, ndots; 00053 00054 /* If name only yields one domain to search, then we don't have 00055 * to keep extra state, so just do an ares_query(). 00056 */ 00057 status = single_domain(channel, name, &s); 00058 if (status != ARES_SUCCESS) 00059 { 00060 callback(arg, status, NULL, 0); 00061 return; 00062 } 00063 if (s) 00064 { 00065 ares_query(channel, s, dnsclass, type, callback, arg); 00066 free(s); 00067 return; 00068 } 00069 00070 /* Allocate a search_query structure to hold the state necessary for 00071 * doing multiple lookups. 00072 */ 00073 squery = malloc(sizeof(struct search_query)); 00074 if (!squery) 00075 { 00076 callback(arg, ARES_ENOMEM, NULL, 0); 00077 return; 00078 } 00079 squery->channel = channel; 00080 squery->name = strdup(name); 00081 if(!squery->name) 00082 { 00083 free(squery); 00084 callback(arg, ARES_ENOMEM, NULL, 0); 00085 return; 00086 } 00087 squery->dnsclass = dnsclass; 00088 squery->type = type; 00089 squery->status_as_is = -1; 00090 squery->callback = callback; 00091 squery->arg = arg; 00092 00093 /* Count the number of dots in name. */ 00094 ndots = 0; 00095 for (p = name; *p; p++) 00096 { 00097 if (*p == '.') 00098 ndots++; 00099 } 00100 00101 /* If ndots is at least the channel ndots threshold (usually 1), 00102 * then we try the name as-is first. Otherwise, we try the name 00103 * as-is last. 00104 */ 00105 if (ndots >= channel->ndots) 00106 { 00107 /* Try the name as-is first. */ 00108 squery->next_domain = 0; 00109 squery->trying_as_is = 1; 00110 ares_query(channel, name, dnsclass, type, search_callback, squery); 00111 } 00112 else 00113 { 00114 /* Try the name as-is last; start with the first search domain. */ 00115 squery->next_domain = 1; 00116 squery->trying_as_is = 0; 00117 status = cat_domain(name, channel->domains[0], &s); 00118 if (status == ARES_SUCCESS) 00119 { 00120 ares_query(channel, s, dnsclass, type, search_callback, squery); 00121 free(s); 00122 } 00123 else 00124 callback(arg, status, NULL, 0); 00125 } 00126 } |
Here is the call graph for this function:
|
Definition at line 181 of file ares_search.c. References ARES_ENOMEM, ARES_SUCCESS, malloc, and name. Referenced by ares_search(), and search_callback().
00182 { 00183 int nlen = strlen(name), dlen = strlen(domain); 00184 00185 *s = malloc(nlen + 1 + dlen + 1); 00186 if (!*s) 00187 return ARES_ENOMEM; 00188 memcpy(*s, name, nlen); 00189 (*s)[nlen] = '.'; 00190 memcpy(*s + nlen + 1, domain, dlen); 00191 (*s)[nlen + 1 + dlen] = 0; 00192 return ARES_SUCCESS; 00193 } |
|
Definition at line 172 of file ares_search.c. References search_query::arg, search_query::callback, free, search_query::name, and status. Referenced by search_callback().
|
|
Definition at line 128 of file ares_search.c. References ares_channel, ARES_ENODATA, ARES_ENOTFOUND, ARES_ESERVFAIL, ares_query(), ARES_SUCCESS, cat_domain(), ares_channeldata::domains, end_squery(), free, ares_channeldata::ndomains, NULL, search_callback(), and status. Referenced by ares_search(), and search_callback().
00130 { 00131 struct search_query *squery = (struct search_query *) arg; 00132 ares_channel channel = squery->channel; 00133 char *s; 00134 00135 /* Stop searching unless we got a non-fatal error. */ 00136 if (status != ARES_ENODATA && status != ARES_ESERVFAIL 00137 && status != ARES_ENOTFOUND) 00138 end_squery(squery, status, abuf, alen); 00139 else 00140 { 00141 /* Save the status if we were trying as-is. */ 00142 if (squery->trying_as_is) 00143 squery->status_as_is = status; 00144 if (squery->next_domain < channel->ndomains) 00145 { 00146 /* Try the next domain. */ 00147 status = cat_domain(squery->name, 00148 channel->domains[squery->next_domain], &s); 00149 if (status != ARES_SUCCESS) 00150 end_squery(squery, status, NULL, 0); 00151 else 00152 { 00153 squery->trying_as_is = 0; 00154 squery->next_domain++; 00155 ares_query(channel, s, squery->dnsclass, squery->type, 00156 search_callback, squery); 00157 free(s); 00158 } 00159 } 00160 else if (squery->status_as_is == -1) 00161 { 00162 /* Try the name as-is at the end. */ 00163 squery->trying_as_is = 1; 00164 ares_query(channel, squery->name, squery->dnsclass, squery->type, 00165 search_callback, squery); 00166 } 00167 else 00168 end_squery(squery, squery->status_as_is, NULL, 0); 00169 } 00170 } |
Here is the call graph for this function:
|
Definition at line 199 of file ares_search.c. References ares_channel, ARES_ENOMEM, ARES_FLAG_NOSEARCH, ARES_SUCCESS, ares_channeldata::flags, len, name, ares_channeldata::ndomains, NULL, and strdup. Referenced by ares_search().
00200 { 00201 int len = strlen(name); 00202 00203 /* If the name contains a trailing dot, then the single query is the name 00204 * sans the trailing dot. 00205 */ 00206 if (name[len - 1] == '.') 00207 { 00208 *s = strdup(name); 00209 return (*s) ? ARES_SUCCESS : ARES_ENOMEM; 00210 } 00211 00212 if (channel->flags & ARES_FLAG_NOSEARCH || channel->ndomains == 0) 00213 { 00214 /* No domain search to do; just try the name as-is. */ 00215 *s = strdup(name); 00216 return (*s) ? ARES_SUCCESS : ARES_ENOMEM; 00217 } 00218 00219 *s = NULL; 00220 return ARES_SUCCESS; 00221 } |