-\f/*
-** MAILB_LOOKUP -- do DNS mailbox lookup
-*/
-
-#ifdef DNS_MAILB
-
-mailb_lookup(addr)
- char *addr;
-{
- /*
- ** Convert addr to DNS form (user.host).
- */
-
- /* figure out how much space it needs */
- atp = strchr(addr, '@');
- if (atp == NULL)
- atp = &addr(strlen(addr));
- i = strlen(addr);
- for (p = addr; (p = strchr(p, '.')) != NULL; p++)
- {
- if (p > atp)
- break;
- i++;
- }
- if (i < sizeof abuf)
- bufp = abuf;
- else
- bufp = xalloc(i + 1);
-
- lhsmode = TRUE;
- for (p = addr, q = bufp; (c = *p++) != '\0'; )
- {
- if (c == '.' && lhsmode)
- *q++ = '\\';
- if (c == '@')
- lhsmode = FALSE;
- *q++ = c;
- }
- *q = '\0';
-
- /*
- ** Now do a MAILB lookup.
- */
-
-retry:
- if (res_query(bufp, C_IN, T_MAILB, (char *) &answer, sizeof answer < 0)
- {
- /* no match -- just continue as usual */
- return FALSE;
- }
-
- /* find first satisfactory answer */
- hp = (HEADER *)&answer;
- ap = (u_char *)&answer + sizeof(HEADER);
- eom = (u_char *)&answer + n;
- for (qdcount = ntohs(hp->qdcount); qdcount--; ap += n + QFIXEDSZ)
- if ((n = dn_skipname(ap, eom)) < 0)
- return FALSE;
- for (ancount = ntohs(hp->ancount); --ancount >= 0 && ap < eom; ap += n)
- {
- n = dn_expand((u_char *)&answer, eom, ap, (u_char *)bp, buflen);
- if (n < 0)
- break;
- ap += n;
- GETSHORT(type, ap);
- ap += SHORTSIZE + LONGSIZE;
- GETSHORT(n, ap);
- switch (type)
- {
- case T_MR:
- /* rename: try again */
- i = dn_expand((u_char *) &answer, eom, ap,
- (u_char) abuf, sizeof abuf);
- if (i < 0)
- break;
- if (bufp != abuf)
- {
- free(bufp);
- bufp = abuf;
- }
- goto retry;
-
- case T_MB:
- i = dn_expand((u_char *) &answer, eom, ap,
- (u_char) hbuf, sizeof hbuf);
- if (i < 0)
- break;
-
- /* hbuf now has the host to deliver to */
- break;
-
- case T_MG:
- i = dn_expand((u_char *) &answer, eom, ap,
- (u_char) gbuf, sizeof gbuf);
- if (i < 0)
- break;
- AliasLevel++;
- naddrs += sendtolist(ubuf, a, sendq, e);
- AliasLevel--;
- break;
-
- case T_MINFO:
- /* bleach */
- XXX;
- }
-
-
-
- if (type != T_MX)
- {
- if (tTd(8, 8) || _res.options & RES_DEBUG)
- printf("unexpected answer type %d, size %d\n",
- type, n);
- cp += n;
- continue;
- }
- GETSHORT(pref, cp);
- if ((n = dn_expand((u_char *)&answer, eom, cp,
- (u_char *)bp, buflen)) < 0)
- break;
- cp += n;
-
-
-#endif /* DNS_MAILB */