⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 res_debu.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * ++Copyright++ 1985, 1990, 1993
 * -
 * Copyright (c) 1985, 1990, 1993
 *    The Regents of the University of California.  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. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *   This product includes software developed by the University of
 *   California, Berkeley and its contributors.
 * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
 * -
 * Portions Copyright (c) 1993 by Digital Equipment Corporation.
 * 
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies, and that
 * the name of Digital Equipment Corporation not be used in advertising or
 * publicity pertaining to distribution of the document or software without
 * specific, written prior permission.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 * -
 * --Copyright--
 */

#include "resolver.h"

#if defined(USE_BIND)

static const char *dewks (int wks)
{
  static char buf[20];

  switch (wks)
  {
    case 5:   return "rje";
    case 7:   return "echo";
    case 9:   return "discard";
    case 11:  return "systat";
    case 13:  return "daytime";
    case 15:  return "netstat";
    case 17:  return "qotd";
    case 19:  return "chargen";
    case 20:  return "ftp-data";
    case 21:  return "ftp";
    case 23:  return "telnet";
    case 25:  return "smtp";
    case 37:  return "time";
    case 39:  return "rlp";
    case 42:  return "name";
    case 43:  return "whois";
    case 53:  return "domain";
    case 57:  return "apts";
    case 59:  return "apfs";
    case 67:  return "bootps";
    case 68:  return "bootpc";
    case 69:  return "tftp";
    case 77:  return "rje";
    case 79:  return "finger";
    case 87:  return "link";
    case 95:  return "supdup";
    case 100: return "newacct";
    case 101: return "hostnames";
    case 102: return "iso-tsap";
    case 103: return "x400";
    case 104: return "x400-snd";
    case 105: return "csnet-ns";
    case 109: return "pop-2";
    case 111: return "sunrpc";
    case 113: return "auth";
    case 115: return "sftp";
    case 117: return "uucp-path";
    case 119: return "nntp";
    case 121: return "erpc";
    case 123: return "ntp";
    case 133: return "statsrv";
    case 136: return "profile";
    case 144: return "NeWS";
    case 161: return "snmp";
    case 162: return "snmp-trap";
    case 170: return "print-srv";
  }
  sprintf (buf,"%d",wks);
  return (buf);
}

static const char *deproto (int protonum)
{
  static char buf[20];

  switch (protonum)
  {
    case 1:  return "icmp";
    case 2:  return "igmp";
    case 3:  return "ggp";
    case 5:  return "st";
    case 6:  return "tcp";
    case 7:  return "ucl";
    case 8:  return "egp";
    case 9:  return "igp";
    case 11: return "nvp-II";
    case 12: return "pup";
    case 16: return "chaos";
    case 17: return "udp";
  }
  sprintf (buf, "%d", protonum);
  return (buf);
}

static const u_char *do_rrset (const u_char *msg, int len, const u_char *cp,
                               int cnt, int pflag, FILE *file, const char *hs)
{
  int n, sflag;

  /* Print answer records.
   */
  sflag = (_res.pfcode & pflag);
  if ((n = ntohs(cnt)) != 0)
  {
    if (!_res.pfcode || (sflag && (_res.pfcode & RES_PRF_HEAD1)))
       fprintf (file, "%s", hs);

    while (--n >= 0)
    {
      if ((!_res.pfcode) || sflag)
         cp = __p_rr (cp, msg, file);
      else
      {
        unsigned int dlen;
        cp += __dn_skipname (cp, cp + MAXCDNAME);
        cp += INT16SZ;
        cp += INT16SZ;
        cp += INT32SZ;
        dlen = _getshort ((u_char*)cp);
        cp += INT16SZ;
        cp += dlen;
      }
      if ((cp - msg) > len)
         return (NULL);
    }
    if (!_res.pfcode || (sflag && (_res.pfcode & RES_PRF_HEAD1)))
       putc ('\n', file);
  }
  return (cp);
}

void __p_query (const u_char *msg)
{
  __fp_query (msg,stdout);
}


/*
 * Print the current options.
 * This is intended to be primarily a debugging routine.
 */ 
void __fp_resstat (struct __res_state *statp, FILE *file)
{
  u_long mask;

  fprintf (file, ";; res options:");
  if (!statp)
     statp = &_res;
  for (mask = 1; mask; mask <<= 1)
      if (statp->options & mask)
         fprintf (file, " %s", p_option(mask));
  putc ('\n', file);
}

/*
 * Print the contents of a query.
 * This is intended to be primarily a debugging routine.
 */ 
void __fp_nquery (const u_char *msg, int len, FILE *file)
{
  const u_char *cp, *endMark;
  const HEADER *hp;
  int   n, tline;

  if ((_res.options & RES_INIT) == 0 && res_init() == -1)
     return;

#define TruncTest(x) do                     \
                       if (x >= endMark) {  \
                         tline = __LINE__;  \
                         goto trunc;        \
                     } while (0)

#define ErrorTest(x) do                     \
                       if (x == NULL) {     \
                          tline = __LINE__; \
                          goto error;       \
                     } while (0)

  /* Print header fields.
   */
  hp = (HEADER *)msg;
  cp = msg + HFIXEDSZ;
  endMark = cp + len;

  if (!_res.pfcode || (_res.pfcode & RES_PRF_HEADX) || hp->rcode)
  {
    fprintf (file, ";; ->>HEADER<<- opcode: %s, status: %s, id: %d",
             _res_opcodes[hp->opcode], _res_resultcodes[hp->rcode],
             ntohs(hp->id));
    putc ('\n', file);
  }
  if (!_res.pfcode || (_res.pfcode & RES_PRF_HEADX))
     putc (';', file);

  if (!_res.pfcode || (_res.pfcode & RES_PRF_HEAD2))
  {
    fprintf (file, "; flags:");
    if (hp->qr) fprintf (file, " qr");
    if (hp->aa) fprintf (file, " aa");
    if (hp->tc) fprintf (file, " tc");
    if (hp->rd) fprintf (file, " rd");
    if (hp->ra) fprintf (file, " ra");
  }
  if (!_res.pfcode || (_res.pfcode & RES_PRF_HEAD1))
  {
    fprintf (file, "; Ques: %d", ntohs(hp->qdcount));
    fprintf (file, ", Ans: %d",  ntohs(hp->ancount));
    fprintf (file, ", Auth: %d", ntohs(hp->nscount));
    fprintf (file, ", Addit: %d",ntohs(hp->arcount));
  }
  if (!_res.pfcode ||
      (_res.pfcode & (RES_PRF_HEADX | RES_PRF_HEAD2 | RES_PRF_HEAD1)))
     putc ('\n',file);

  /* Print question records.
   */
  if ((n = ntohs(hp->qdcount)) != 0)
  {
    if (!_res.pfcode || (_res.pfcode & RES_PRF_QUES))
       fprintf (file, ";; QUESTIONS:\n");

    while (--n >= 0)
    {
      if (!_res.pfcode || (_res.pfcode & RES_PRF_QUES))
         fprintf (file, ";;\t");
      TruncTest (cp);
      if (!_res.pfcode || (_res.pfcode & RES_PRF_QUES))
         cp = p_cdnname (cp, msg, len, file);
      else
      {
        int  n;
        char name[MAXDNAME];

        if ((n = dn_expand(msg,msg+len,cp,name,sizeof(name))) < 0)
             cp = NULL;
        else cp += n;
      }
      ErrorTest (cp);
      TruncTest (cp);
      if (!_res.pfcode || (_res.pfcode & RES_PRF_QUES))
         fprintf (file, ", type = %s", __p_type(_getshort((u_char*)cp)));
      cp += INT16SZ;
      TruncTest (cp);
      if (!_res.pfcode || (_res.pfcode & RES_PRF_QUES))
         fprintf (file, ", class = %s\n", __p_class(_getshort((u_char*)cp)));
      cp += INT16SZ;
      if (!_res.pfcode || (_res.pfcode & RES_PRF_QUES))
         putc ('\n', file);
    }
  }
  /* Print authoritative answer records
   */
  TruncTest (cp);
  cp = do_rrset (msg, len, cp, hp->ancount, RES_PRF_ANS, file,
                 ";; ANSWERS:\n");
  ErrorTest (cp);

  /* print name server records
   */
  TruncTest (cp);
  cp = do_rrset (msg, len, cp, hp->nscount, RES_PRF_AUTH, file,
                 ";; AUTHORITY RECORDS:\n");
  ErrorTest (cp);
  TruncTest (cp);

  /* print additional records
   */
  cp = do_rrset (msg, len, cp, hp->arcount, RES_PRF_ADD, file,
                 ";; ADDITIONAL RECORDS:\n");
  ErrorTest(cp);
  return;

trunc:
  fprintf (file, "\n;; ...truncated (%s, line %d)\n",__FILE__,tline);
  return;

error:
  fprintf (file, "\n;; ...malformed (%s, line %d)\n",__FILE__,tline);
}

void __fp_query (const u_char *msg, FILE *file)
{
  fp_nquery (msg, PACKETSZ, file);
}

const u_char *__p_cdnname (const u_char *cp, const u_char *msg, int len, FILE *file)
{
  char name[MAXDNAME];
  int n;

  if ((n = dn_expand(msg, msg + len, cp, name, sizeof name)) < 0)
     return (NULL);
  if (name[0] == '\0')
       putc ('.', file);
  else fputs (name, file);
  return (cp + n);
}

const u_char *__p_cdname (const u_char *cp, const u_char *msg, FILE *file)
{
  return (p_cdnname(cp, msg, PACKETSZ, file));
}

/* XXX:  the rest of these functions need to become length-limited, too. (vix)
 */

const u_char *__p_fqname (const u_char *cp, const u_char *msg, FILE *file)
{
  char name[MAXDNAME];
  int  n;

  if ((n = dn_expand(msg, cp + MAXCDNAME, cp, name, sizeof name)) < 0)
     return (NULL);

  if (name[0] == '\0')
     putc ('.', file);
  else
  {
    fputs (name, file);
    if (name[strlen(name) - 1] != '.')
       putc ('.', file);
  }
  return (cp + n);
}

/*
 * Print resource record fields in human readable form.
 */
const u_char *__p_rr (const u_char *cp, const u_char *msg, FILE *file)
{
  int    type, class, dlen;
  int    n = 0, c = 0;
  struct in_addr inaddr;
  const  u_char *cp1, *cp2;
  u_long tmpttl, t;
  int    lcnt;

  if ((_res.options & RES_INIT) == 0 && res_init() == -1)
  {
    h_errno = NETDB_INTERNAL;
    return (NULL);
  }
  if ((cp = p_fqname(cp, msg, file)) == NULL)
     return (NULL);      /* compression error */

  type   = _getshort ((u_char*)cp);
  cp    += INT16SZ;
  class  = _getshort ((u_char*)cp);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -