📄 res_init.c
字号:
n = 0; } } /* null terminate last domain if there are excess */ while (*cp != '\0' && *cp != ' ' && *cp != '\t') cp++; *cp = '\0'; *pp++ = 0; havesearch = 1; continue; } /* read nameservers to query */ if (MATCH(buf, "nameserver") && nserv < MAXNS) { char *q; struct addrinfo hints, *res; char pbuf[NI_MAXSERV]; cp = buf + sizeof("nameserver") - 1; while (*cp == ' ' || *cp == '\t') cp++; if ((*cp == '\0') || (*cp == '\n')) continue; for (q = cp; *q; q++) { if (isspace(*q)) { *q = '\0'; break; } } memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_NUMERICHOST; hints.ai_socktype = SOCK_DGRAM; snprintf(pbuf, sizeof(pbuf), "%d", NAMESERVER_PORT); if (getaddrinfo(cp, pbuf, &hints, &res) == 0 && res->ai_next == NULL) { if (res->ai_addrlen <= sizeof(_res_ext.nsaddr_list[nserv])) { memcpy(&_res_ext.nsaddr_list[nserv], res->ai_addr, res->ai_addrlen); } else { memset(&_res_ext.nsaddr_list[nserv], 0, sizeof(_res_ext.nsaddr_list[nserv])); } if (res->ai_addrlen <= sizeof(_res.nsaddr_list[nserv])) { memcpy(&_res.nsaddr_list[nserv], res->ai_addr, res->ai_addrlen); } else { memset(&_res.nsaddr_list[nserv], 0, sizeof(_res.nsaddr_list[nserv])); } nserv++; } if (res) freeaddrinfo(res); continue; }#ifdef RESOLVSORT if (MATCH(buf, "sortlist")) { struct in_addr a; struct in6_addr a6; int m, i; u_char *u; cp = buf + sizeof("sortlist") - 1; while (nsort < MAXRESOLVSORT) { while (*cp == ' ' || *cp == '\t') cp++; if (*cp == '\0' || *cp == '\n' || *cp == ';') break; net = cp; while (*cp && !ISSORTMASK(*cp) && *cp != ';' && isascii(*cp) && !isspace(*cp)) cp++; n = *cp; *cp = 0; if (inet_aton(net, &a)) { _res.sort_list[nsort].addr = a; if (ISSORTMASK(n)) { *cp++ = n; net = cp; while (*cp && *cp != ';' && isascii(*cp) && !isspace(*cp)) cp++; n = *cp; *cp = 0; if (inet_aton(net, &a)) { _res.sort_list[nsort].mask = a.s_addr; } else { _res.sort_list[nsort].mask = net_mask(_res.sort_list[nsort].addr); } } else { _res.sort_list[nsort].mask = net_mask(_res.sort_list[nsort].addr); } _res_ext.sort_list[nsort].af = AF_INET; _res_ext.sort_list[nsort].addr.ina = _res.sort_list[nsort].addr; _res_ext.sort_list[nsort].mask.ina.s_addr = _res.sort_list[nsort].mask; nsort++; } else if (inet_pton(AF_INET6, net, &a6) == 1) { _res_ext.sort_list[nsort].af = AF_INET6; _res_ext.sort_list[nsort].addr.in6a = a6; u = (u_char *)&_res_ext.sort_list[nsort].mask.in6a; *cp++ = n; net = cp; while (*cp && *cp != ';' && isascii(*cp) && !isspace(*cp)) cp++; m = n; n = *cp; *cp = 0; switch (m) { case '/': m = atoi(net); break; case '&': if (inet_pton(AF_INET6, net, u) == 1) { m = -1; break; } /*FALLTHROUGH*/ default: m = sizeof(struct in6_addr) * NBBY; break; } if (m >= 0) { for (i = 0; i < sizeof(struct in6_addr); i++) { if (m <= 0) { *u = 0; } else { m -= NBBY; *u = (u_char)~0; if (m < 0) *u <<= -m; } u++; } } _res.sort_list[nsort].addr.s_addr = (u_int32_t)0xffffffff; _res.sort_list[nsort].mask = (u_int32_t)0xffffffff; nsort++; } *cp = n; } continue; }#endif if (MATCH(buf, "options")) { res_setoptions(buf + sizeof("options") - 1, "conf"); continue; } } if (nserv > 1) _res.nscount = nserv;#ifdef RESOLVSORT _res.nsort = nsort;#endif (void) fclose(fp); } if (_res.defdname[0] == 0 && gethostname(buf, sizeof(_res.defdname) - 1) == 0 && (cp = strchr(buf, '.')) != NULL) strcpy(_res.defdname, cp + 1); /* find components of local domain that might be searched */ if (havesearch == 0) { pp = _res.dnsrch; *pp++ = _res.defdname; *pp = NULL;#ifndef RFC1535 dots = 0; for (cp = _res.defdname; *cp; cp++) dots += (*cp == '.'); cp = _res.defdname; while (pp < _res.dnsrch + MAXDFLSRCH) { if (dots < LOCALDOMAINPARTS) break; cp = strchr(cp, '.') + 1; /* we know there is one */ *pp++ = cp; dots--; } *pp = NULL;#ifdef DEBUG if (_res.options & RES_DEBUG) { printf(";; res_init()... default dnsrch list:\n"); for (pp = _res.dnsrch; *pp; pp++) printf(";;\t%s\n", *pp); printf(";;\t..END..\n"); }#endif#endif /* !RFC1535 */ } if (issetugid()) _res.options |= RES_NOALIASES; else if ((cp = getenv("RES_OPTIONS")) != NULL) res_setoptions(cp, "env"); _res.options |= RES_INIT; return (0);}static voidres_setoptions(options, source) char *options, *source;{ char *cp = options; int i;#ifdef DEBUG if (_res.options & RES_DEBUG) printf(";; res_setoptions(\"%s\", \"%s\")...\n", options, source);#endif while (*cp) { /* skip leading and inner runs of spaces */ while (*cp == ' ' || *cp == '\t') cp++; /* search for and process individual options */ if (!strncmp(cp, "ndots:", sizeof("ndots:") - 1)) { i = atoi(cp + sizeof("ndots:") - 1); if (i <= RES_MAXNDOTS) _res.ndots = i; else _res.ndots = RES_MAXNDOTS;#ifdef DEBUG if (_res.options & RES_DEBUG) printf(";;\tndots=%d\n", _res.ndots);#endif } else if (!strncmp(cp, "debug", sizeof("debug") - 1)) {#ifdef DEBUG if (!(_res.options & RES_DEBUG)) { printf(";; res_setoptions(\"%s\", \"%s\")..\n", options, source); _res.options |= RES_DEBUG; } printf(";;\tdebug\n");#endif } else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) { _res.options |= RES_USE_INET6; } else if (!strncmp(cp, "insecure1", sizeof("insecure1") - 1)) { _res.options |= RES_INSECURE1; } else if (!strncmp(cp, "insecure2", sizeof("insecure2") - 1)) { _res.options |= RES_INSECURE2; } else if (!strncmp(cp, "no_tld_query", sizeof("no_tld_query") - 1)) { _res.options |= RES_NOTLDQUERY; } else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) { _res.options |= RES_USE_EDNS0; } else { /* XXX - print a warning here? */ } /* skip to next run of spaces */ while (*cp && *cp != ' ' && *cp != '\t') cp++; }}#ifdef RESOLVSORT/* XXX - should really support CIDR which means explicit masks always. */static u_int32_tnet_mask(in) /* XXX - should really use system's version of this */ struct in_addr in;{ u_int32_t i = ntohl(in.s_addr); if (IN_CLASSA(i)) return (htonl(IN_CLASSA_NET)); else if (IN_CLASSB(i)) return (htonl(IN_CLASSB_NET)); return (htonl(IN_CLASSC_NET));}#endifu_intres_randomid(){ struct timeval now; gettimeofday(&now, NULL); return (0xffff & (now.tv_sec ^ now.tv_usec ^ getpid()));}/* * Weak aliases for applications that use certain private entry points, * and fail to include <resolv.h>. */#undef res_init__weak_reference(__res_init, res_init);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -