- n = res_search(host, C_IN, NoWildcardMX ? T_ANY : T_CNAME,
- (char *)&answer, sizeof(answer));
- if (n < 0) {
- if (tTd(8, 1))
- printf("getcanonname: res_search failed (errno=%d, h_errno=%d)\n",
- errno, h_errno);
- return (rval);
+ ret = -1;
+ if ((n == 0 && _res.options & RES_DEFNAMES) ||
+ (n > 0 && *--cp != '.' && _res.options & RES_DNSRCH))
+ {
+ for (domain = _res.dnsrch; *domain; domain++)
+ {
+ (void) sprintf(nbuf, "%.*s.%.*s",
+ MAXDNAME, host, MAXDNAME, *domain);
+ if (tTd(8, 5))
+ printf("getcanonname: trying %s\n", nbuf);
+ ret = res_query(nbuf, C_IN, qtype, &answer, sizeof(answer));
+ if (ret > 0)
+ {
+ if (tTd(8, 8))
+ printf("\tYES\n");
+ cp = nbuf;
+ break;
+ }
+ else if (tTd(8, 8))
+ printf("\tNO: h_errno=%d\n", h_errno);
+
+ /*
+ * If no server present, give up.
+ * If name isn't found in this domain,
+ * keep trying higher domains in the search list
+ * (if that's enabled).
+ * On a NO_DATA error, keep trying, otherwise
+ * a wildcard entry of another type could keep us
+ * from finding this entry higher in the domain.
+ * If we get some other error (negative answer or
+ * server failure), then stop searching up,
+ * but try the input name below in case it's fully-qualified.
+ */
+ if (errno == ECONNREFUSED) {
+ h_errno = TRY_AGAIN;
+ return rval;
+ }
+ if (h_errno == NO_DATA)
+ {
+ ret = 0;
+ cp = nbuf;
+ break;
+ }
+ if ((h_errno != HOST_NOT_FOUND) ||
+ (_res.options & RES_DNSRCH) == 0)
+ return rval;
+ }
+ }
+ if (ret < 0)
+ {
+ cp = host;
+ if (tTd(8, 5))
+ printf("getcanonname: trying %s\n", cp);
+ ret = res_query(cp, C_IN, qtype, &answer, sizeof(answer));
+ if (ret > 0)
+ {
+ if (tTd(8, 8))
+ printf("\tYES\n");
+ }
+ else
+ {
+ if (tTd(8, 8))
+ printf("\tNO: h_errno=%d\n", h_errno);
+ return rval;
+ }