resolvLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:30k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* resolvLib.c - DNS resolver library */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc */
  3. #include <copyright_wrs.h>
  4. /* 
  5. modification history 
  6. -------------------------
  7. 01k,15oct01,rae  merge from truestack ver 01l, base 01j (SPRs 67238, 28659)
  8. 01j,06oct98,jmp  moved doc to resolvLibDoc.c.
  9. 01i,14dec97,jdi  doc: cleanup.
  10. 01h,19aug97,jag  fixed man page problems in resolvInit() SPR#9173, fixed
  11.  SPR#9174, SPR#9175. Deleted getHostInfo(), getbyaddrWrapper()
  12. 01g,04aug97,kbw  fixed man page problems found in beta review
  13. 01f,19may97,spm  added checks for NULL pointers to user interface (SPR #8603)
  14. 01e,30apr97,kbw  fiddled man page text 
  15. 01d,01apr97,kbw  fixed man page text, changed parameter name to "length"
  16.                  in resolvDNExpand 
  17. 01c,01apr97,jag  removed unused variable resolvDefaultDomainName.  Added
  18.                  routines: resolvHostLibGetByAddr(), resolvHostLibGetByName().
  19.                  Added necessary man pages.
  20. 01b,05feb97,jag  added debug function pointer in resolvInit. MAX_DOMAIN_NAME
  21. 01a,12aug96,rjc  written
  22. */
  23. /*
  24. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!      WARNING      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  25.          DOCUMENTATION of this library is located in resolvLibDoc.c
  26.       If you modify any documented routine, please update resolvLibDoc.c.
  27. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  28. */
  29. /* includes */
  30. #include <vxWorks.h>
  31. #include <resolvLib.h>
  32. #include <semLib.h>
  33. #include <hostLib.h>
  34. #include <stdlib.h>
  35. #include <sockLib.h>
  36. #include <netinet/in.h>
  37. #include <inetLib.h>
  38. #include <stdio.h>
  39. #include <ctype.h>
  40. #include <errnoLib.h>
  41. #include <string.h>
  42. /* defines */
  43. #define  LOCAL_ENTRIES_TTL     60     /* Local entries have a ttl for 60 seconds */
  44. #define  ALIGNMENT              4     /* for word alignment */
  45. #define  MAX_DOMAIN_NAME      260     /* Max domain name including EOS marker */
  46. #define  MAX_HOSTLIB_BUF      512     /* hostLib interface functions buffer */
  47. /* macro to align ptr to buffer and decrement buffer size accordingly */
  48. #define ALIGN_BUF_PTR(pBuf, bufLen, alignment)     
  49.      while ((UINT) (pBuf) % (alignment) != 0) 
  50.         {    
  51.         ++ (pBuf);  
  52.         -- (bufLen);  
  53.         }
  54. /* typedefs */
  55. /* Globals */
  56. /*
  57.  * Resolver state default settings.  Structure moved here from res_init.c
  58.  */
  59. struct __res_state _res = 
  60. {
  61.         RES_TIMEOUT,                    /* retransmition time interval */
  62.         4,                              /* number of times to retransmit */
  63.         RES_DEFAULT,                    /* options flags */
  64.         1,                              /* number of name servers */
  65. };
  66. /* This variable point to the optional debug routine */
  67. FUNCPTR pdnsDebugFunc;
  68. /* locals */
  69. LOCAL RESOLV_PARAMS_S            resolvParams;        /* resolver settings */
  70. LOCAL STATUS resolvHostLibGetByAddr (int addr, char * pHostName);
  71. LOCAL int resolvHostLibGetByName (char * pHostName);
  72. /* externs */
  73. extern struct hostent *  _gethostbyname ();
  74. extern struct hostent *  _gethostbyaddr ();
  75. /* Ptrs defined in hostLib.c.  These ptrs are set by the resolver library */
  76. extern FUNCPTR _presolvHostLibGetByName;
  77. extern FUNCPTR _presolvHostLibGetByAddr;
  78. /*******************************************************************************
  79. *
  80. * hostEntFormat - Formats a char array as a structure of type hostent
  81. *
  82. * This routine formarts a character array pointed to by <ppBuf> of the length 
  83. * specified by <pBuflen>.  It creates a hostent structure in the buffer along
  84. * with the `h_aliases' and `h_addr_list' vectors big enough for <numAliases> 
  85. * aliases and <numAddrs> addresses respectively. On a successful return 
  86. * <ppBuf> and <pBuflen> specify the remaining unused part of the buffer.
  87. *
  88. * NOMANUAL
  89. *
  90. * RETURNS: A pointer to a hostent structure on success, or NULL if the
  91. * input buffer is too small.
  92. */
  93. LOCAL struct hostent *  hostEntFormat
  94.     (
  95.     char **           ppBuf,      /* Pointer to character buffer pointer */
  96.     int *             pBufLen,    /* Pointer to the buffer length */
  97.     int               numAliases, /* Max # of host aliases expected */
  98.     int               numAddrs    /* Max # of host addresses expected */
  99.     )
  100.     {
  101.     char *            pTmp;
  102.     struct hostent *  pHostEnt;
  103.     pTmp =  *ppBuf;
  104.     if (((numAliases + 1 + numAddrs + 1) * sizeof (char *) + 
  105.          sizeof (struct hostent) + 3 + 3) > *pBufLen)
  106.         {
  107.         return (NULL);
  108.         }
  109.     ALIGN_BUF_PTR (pTmp, *pBufLen, ALIGNMENT);
  110.     pHostEnt = (struct hostent *) pTmp;
  111.     pTmp += sizeof (struct hostent);
  112.     *pBufLen -= sizeof (struct hostent); 
  113.     ALIGN_BUF_PTR (pTmp, *pBufLen, ALIGNMENT);
  114.     pHostEnt->h_aliases = (char **) pTmp; 
  115.     pTmp += (numAliases + 1)* sizeof (char **);
  116.     *pBufLen -=  (numAliases + 1) * sizeof (char **); 
  117.     pHostEnt->h_addr_list = (char **) pTmp;
  118.     pTmp += (numAddrs + 1)  * sizeof (char **);
  119.     *pBufLen -= (numAddrs + 1)  * sizeof (char **);
  120.     *ppBuf = pTmp;
  121.     return (pHostEnt);
  122.     }
  123. /*******************************************************************************
  124. *
  125. * resolvInit - initialize the resolver library 
  126. *
  127. * This function initializes the resolver.  <pNameServer> is a single IP address
  128. * for a name server in dotted decimal notation.  <pDefaultDomainName> is the 
  129. * default domain name to be appended to names without a dot.  The function 
  130. * pointer <pdnsDebugRtn> is set to the resolver debug function.  Additional
  131. * name servers can be configured using the function resolvParamsSet().
  132. *
  133. * RETURNS: OK or ERROR.
  134. *
  135. * SEE ALSO:
  136. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  137. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  138. * resolvQuery()
  139. */
  140. STATUS resolvInit
  141.     (
  142.     char *     pNameServer,     /* pointer to Name server IP address */
  143.     char *     pDefaultDomainName,  /* default domain name */
  144.     FUNCPTR    pdnsDebugRtn         /* function ptr to debug routine */
  145.     )
  146.     {
  147.     int nserv = 0;           /* number of nameserver records read from file */
  148.     struct in_addr   ipAddr;
  149.     /* Initialize global pointer to the DNS debug routine */
  150.     pdnsDebugFunc = (FUNCPTR) NULL;
  151.     if (pdnsDebugRtn != NULL)
  152. pdnsDebugFunc = pdnsDebugRtn;
  153.     _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
  154.     _res.nsaddr.sin_family = AF_INET;
  155.     _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
  156.     _res.ndots = 1;
  157.     _res.pfcode = 0;
  158.     strncpy (_res.lookups, "b", sizeof _res.lookups);
  159.     
  160.     if (inet_aton (pNameServer, &ipAddr) == OK) 
  161. {
  162. _res.nsaddr_list [nserv].sin_addr = ipAddr;
  163. _res.nsaddr_list [nserv].sin_family = AF_INET;
  164. _res.nsaddr_list [nserv].sin_port = htons(NAMESERVER_PORT);
  165. nserv++;
  166. }
  167.     else
  168. {
  169. /* Illegal IP address for DNS server */
  170. return (ERROR);
  171. }
  172.     _res.nscount = nserv; /* Number of name servers */
  173.     _res.dnsrch [0] = _res.defdname;
  174.     _res.options |= RES_INIT | RES_DEFNAMES | RES_DEBUG;
  175.     (void) strcpy (_res.defdname, pDefaultDomainName);
  176.     /* The resolver is initialized to query only the DNS server */
  177.     resolvParams.queryOrder = QUERY_DNS_ONLY;
  178.     /* Install pointers used by hostLib to access the resolver library */
  179.     _presolvHostLibGetByName = resolvHostLibGetByName;
  180.     _presolvHostLibGetByAddr = resolvHostLibGetByAddr;
  181.     return (OK);
  182.     }
  183. /*******************************************************************************
  184. *
  185. * resolvHostGetByName - queries the static host table for the host name
  186. *
  187. * Retrieve host information installed by hostAdd() and install it in the
  188. * `hostent' structure referenced in <pHostEnt>.  This routine uses the 
  189. * buffer referenced in <pBuf> to store hostname and network address 
  190. * information.
  191. *
  192. * NOMANUAL
  193. *
  194. * RETURNS: A pointer to hostent, or NULL if the entry was not found.
  195. */
  196. LOCAL struct hostent *  resolvHostGetByName 
  197.     (
  198.     char *             pHostName,  /* pointer to the name of the host */
  199.     struct hostent *   pHostEnt,   /* ptr to hostent to hold the results */
  200.     char *             pBuf,       /* buffer to be used by hostnt */
  201.     int                bufLen      /* length of the buffer */
  202.     )
  203.     {
  204.     ALIGN_BUF_PTR (pBuf, bufLen, ALIGNMENT);
  205.     *(int*) pBuf =  hostTblSearchByName (pHostName);
  206.     if (*(int*)pBuf != ERROR)
  207.         {
  208.         pHostEnt->h_addr_list [0] = pBuf;
  209.         pHostEnt->h_addr_list [1] = NULL;
  210. pHostEnt->h_addrtype = AF_INET;
  211. pHostEnt->h_length = sizeof (int);
  212.         pBuf += sizeof (int);
  213.         pHostEnt->h_name = pBuf;
  214.         strcpy (pBuf, pHostName);
  215.         pHostEnt->h_ttl =  LOCAL_ENTRIES_TTL;
  216.         return (pHostEnt);
  217.         }
  218.     return (NULL);
  219.     }
  220. /*******************************************************************************
  221. *
  222. * resolvHostGetByAddr - queries the static host table for the IP address
  223. *
  224. * Retrieve host information installed by hostAdd().  Copies the entry into
  225. * the hostent specified by <pHostEnt>, using the buffer specified by <pBuf> and
  226. * bufLen for storing hostname and network address info.
  227. *
  228. * NOMANUAL
  229. *
  230. * RETURNS: A pointer to hostent on sucess, or NULL.
  231. */
  232. LOCAL struct hostent *  resolvHostGetByAddr 
  233.     (
  234.     const char *       pAddr,    /* pointer to IP address in network order */
  235.     struct hostent *   pHostEnt, /* ptr to hostent to hold the results */
  236.     char *             pBuf,     /* buffer used by hostent */
  237.     int                bufLen    /* length of the buffer */
  238.     )
  239.     {
  240.     ALIGN_BUF_PTR (pBuf, bufLen, ALIGNMENT);
  241.     *(int*) pBuf = *(int*)pAddr;
  242.     pHostEnt->h_addr_list [0] = pBuf;
  243.     pHostEnt->h_addr_list [1] = NULL;
  244.     pBuf += 4;
  245.     if (hostTblSearchByAddr (*((int *)pAddr), pBuf) != OK)
  246.         {
  247.         return (NULL);
  248.         }
  249.     pHostEnt->h_name = pBuf;
  250.     pHostEnt->h_aliases [0] = NULL;
  251.     pHostEnt->h_ttl =  LOCAL_ENTRIES_TTL;
  252.     return (pHostEnt);
  253.     }
  254. /*******************************************************************************
  255. *
  256. * resolvGetHostByName - query the DNS server for the IP address of a host
  257. *
  258. * This function returns a `hostent' structure. This structure is defined as
  259. * follows: 
  260. *
  261. * .CS
  262. *     struct   hostent 
  263. *     {
  264. *     char *   h_name;          /@ official name of host @/ 
  265. *     char **  h_aliases;       /@ alias list @/
  266. *     int      h_addrtype;      /@ address type @/
  267. *     int      h_length;        /@ length of address @/ 
  268. *     char **  h_addr_list;     /@ list of addresses from name server @/
  269. *     unsigned int h_ttl;       /@ Time to Live in Seconds for this entry @/
  270. *     }
  271. * .CE
  272. * The `h_aliases' and `h_addr_type' vectors are NULL-terminated.
  273. *
  274. * Specify the host you want to query in <pHostname>.  Use <pBuf> and <bufLen> 
  275. * to specify the location and size of a buffer to receive the `hostent' 
  276. * structure and its associated contents.  Host addresses are returned in 
  277. * network byte order.  Given the information this routine retrieves, the 
  278. * <pBuf> buffer should be 512 bytes or larger.
  279. *
  280. * RETURNS: A pointer to a `hostent' structure if the host is found, or 
  281. * NULL if the parameters are invalid, the host is not found, or the 
  282. * buffer is too small.
  283. *
  284. * ERRNO:
  285. *  S_resolvLib_INVALID_PARAMETER
  286. *  S_resolvLib_BUFFER_2_SMALL
  287. *  S_resolvLib_TRY_AGAIN
  288. *  S_resolvLib_HOST_NOT_FOUND
  289. *  S_resolvLib_NO_DATA
  290. *  S_resolvLib_NO_RECOVERY
  291. * SEE ALSO:
  292. * resolvInit(), resolvGetHostByAddr(), resolvDNExpand(),
  293. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  294. * resolvMkQuery(), resolvQuery()
  295. */
  296. struct hostent *  resolvGetHostByName
  297.     (
  298.     char *     pHostName,  /* ptr to the name of  the host */
  299.     char *     pHostBuf,   /* ptr to the buffer used by hostent structure */
  300.     int        bufLen      /* length of the buffer */ 
  301.     )
  302.     {
  303.     struct hostent *       pHostEnt;         /* Ptr to host entry */
  304.   
  305.     /* Validate input parameters */
  306.     if (pHostName == NULL || pHostBuf == NULL)
  307.         {
  308.         errnoSet (S_resolvLib_INVALID_PARAMETER);
  309.         return (NULL);
  310.         }
  311.     /* Format input buffer for use as a hostent structure */
  312.     pHostEnt = hostEntFormat (&pHostBuf, &bufLen, MAXALIASES, MAXADDRS);
  313.     if (pHostEnt == NULL)
  314.         {
  315.         errno = S_resolvLib_BUFFER_2_SMALL;
  316.         return (NULL);
  317.         }
  318.     /* Check the hostLib static host table first ? */
  319.     if (resolvParams.queryOrder == QUERY_LOCAL_FIRST)
  320.         {
  321.         if (resolvHostGetByName (pHostName, pHostEnt, pHostBuf, bufLen) != NULL)
  322.             {
  323.             return (pHostEnt);
  324.             }
  325.         }
  326.     /* 
  327.      * Ask the DNS Server to resolve the query.  In the case of queryOrder set
  328.      * to QUERY_ DNS_ONLY, this is the only query done.
  329.      */
  330.     if (_gethostbyname (pHostName,  pHostEnt, pHostBuf, bufLen))
  331.         {
  332.         return (pHostEnt);      /* Got an answer from the DNS server */
  333.         }
  334.     /* We need to check the hostLib static host table next */
  335.     if (resolvParams.queryOrder == QUERY_DNS_FIRST)
  336.         {
  337.         if (resolvHostGetByName (pHostName, pHostEnt, pHostBuf, bufLen) != NULL)
  338.             {
  339.             return (pHostEnt);
  340.             }
  341.         }
  342.  
  343.     return (NULL);  /* Host IP Address Not Found */
  344.     }
  345. /*******************************************************************************
  346. *
  347. * resolvGetHostByAddr - query the DNS server for the host name of an IP address
  348. *
  349. * This function returns a `hostent' structure, which is defined as follows:
  350. *
  351. * .CS
  352. * struct   hostent 
  353. *     {
  354. *     char *   h_name;            /@ official name of host @/
  355. *     char **  h_aliases;         /@ alias list @/
  356. *     int      h_addrtype;        /@ address type @/
  357. *     int      h_length;          /@ length of address @/
  358. *     char **  h_addr_list;       /@ list of addresses from name server @/
  359. *     unsigned int h_ttl;         /@ Time to Live in Seconds for this entry @/
  360. *     }
  361. * .CE
  362. * The `h_aliases' and `h_addr_type' vectors are NULL-terminated.
  363. *
  364. * The <pinetAddr> parameter passes in the IP address (in network byte order)
  365. * for the host whose name you want to discover.  The <pBuf> and <bufLen> 
  366. * parameters specify the location and size (512 bytes or more) of the buffer 
  367. * that is to receive the hostent structure.  resolvGetHostByAddr() returns 
  368. * host addresses are returned in network byte order. 
  369. *
  370. * RETURNS: A pointer to a `hostent' structure if the host is found, or 
  371. * NULL if the parameters are invalid, host is not found, or the buffer 
  372. * is too small.
  373. * ERRNO:
  374. *  S_resolvLib_INVALID_PARAMETER
  375. *  S_resolvLib_BUFFER_2_SMALL
  376. *  S_resolvLib_TRY_AGAIN
  377. *  S_resolvLib_HOST_NOT_FOUND
  378. *  S_resolvLib_NO_DATA
  379. *  S_resolvLib_NO_RECOVERY
  380. *
  381. * SEE ALSO:
  382. * resolvGetHostByName(), resolvInit(), resolvDNExpand(),
  383. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  384. * resolvMkQuery(), resolvQuery()
  385. */
  386. struct hostent *     resolvGetHostByAddr 
  387.     (
  388.     const char *       pInetAddr,
  389.     char *             pHostBuf,
  390.     int                bufLen
  391.     )
  392.     {
  393.     struct hostent *       pHostEnt;         /* Ptr to host entry */
  394.     if (pInetAddr == NULL || pHostBuf == NULL)
  395.         {
  396.         errnoSet (S_resolvLib_INVALID_PARAMETER);
  397.         return (NULL);
  398.         }
  399.     /* Format input buffer for use as a hostent structure */
  400.     pHostEnt = hostEntFormat (&pHostBuf, &bufLen, MAXALIASES, MAXADDRS);
  401.     if (pHostEnt == NULL)
  402.         {
  403.         errno = S_resolvLib_BUFFER_2_SMALL;
  404.         return (NULL);
  405.         }
  406.     /* Check the hostLib static host table first ? */
  407.     if (resolvParams.queryOrder == QUERY_LOCAL_FIRST)
  408.         {
  409.         if (resolvHostGetByAddr (pInetAddr, pHostEnt, pHostBuf, bufLen) != NULL)
  410.             {
  411.             return (pHostEnt);
  412.             }
  413.         }
  414.     /* 
  415.      * Ask the DNS Server to resolve the query.  In the case of queryOrder set
  416.      * to QUERY_ DNS_ONLY, this is the only query done.
  417.      */
  418.     if (_gethostbyaddr (pInetAddr, 4, AF_INET, pHostEnt, pHostBuf, bufLen))
  419.         {
  420.         return (pHostEnt);      /* Got an answer from the DNS server */
  421.         }
  422.     /* We need to check the hostLib static host table next */
  423.     if (resolvParams.queryOrder == QUERY_DNS_FIRST)
  424.         {
  425.         if (resolvHostGetByAddr (pInetAddr, pHostEnt, pHostBuf, bufLen) != NULL)
  426.             {
  427.             return (pHostEnt);
  428.             }
  429.         }
  430.     return (NULL);             /* Host Name Not found */
  431.     }
  432. /*******************************************************************************
  433. *
  434. * resolvParamsSet - set the parameters which control the resolver library
  435. *
  436. * This routine sets the resolver parameters.  <pResolvParams> passes in
  437. * a pointer to a RESOLV_PARAMS_S structure, which is defined as follows: 
  438. * .CS
  439. *     typedef struct
  440. *        {
  441. *        char   queryOrder;
  442. *        char   domainName [MAXDNAME];
  443. *        char   nameServersAddr [MAXNS][MAXIPADDRLEN];
  444. *        } RESOLV_PARAMS_S;
  445. * .CE
  446. * Use the members of this structure to specify the settings you want to 
  447. * apply to the resolver.  It is important to remember that multiple tasks 
  448. * can use the resolver library and that the settings specified in 
  449. * this RESOLV_PARAMS_S structure affect all queries from all tasks.  In 
  450. * addition, you should set resolver parameters at initialization and not 
  451. * while queries could be in progress. Otherwise, the results of the query 
  452. * are unpredictable.  
  453. *
  454. * Before calling resolvParamsSet(), you should first call resolvParamsGet() 
  455. * to populate a RESOLV_PARAMS_S structure with the current settings.  Then
  456. * you change the values of the members that interest you.    
  457. *
  458. * Valid values for the `queryOrder' member of RESOLV_PARAMS_S structure 
  459. * are defined in resolvLib.h.  Set the `domainName' member to the domain to 
  460. * which this resolver belongs.  Set the `nameServersAddr' member to the IP 
  461. * addresses of the DNS server that the resolver can query.  You must specify 
  462. * the IP addresses in standard dotted decimal notation.  This function tries 
  463. * to validate the values in the `queryOrder' and `nameServerAddr' members.  
  464. * This function does not try to validate the domain name.  
  465. *
  466. * RETURNS: OK if the parameters are valid, ERROR otherwise.
  467. *
  468. * SEE ALSO:
  469. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  470. * resolvDNComp(), resolvSend(), resolvInit(), resolvParamsGet(),
  471. * resolvMkQuery(), resolvQuery()
  472. */
  473. STATUS resolvParamsSet 
  474.     (
  475.     RESOLV_PARAMS_S *  pResolvParams  /* ptr to resolver parameter struct */
  476.     )
  477.     {
  478.     struct in_addr   ipAddr;
  479.     int               index;
  480.    /* Validate queryOrder parameters */
  481.    if (pResolvParams->queryOrder != QUERY_LOCAL_FIRST && 
  482.        pResolvParams->queryOrder != QUERY_DNS_FIRST &&
  483.        pResolvParams->queryOrder != QUERY_DNS_ONLY)
  484.        return (ERROR);
  485.     /* Validate IP addresses */
  486.     for (index = 0 ; (index < MAXNS) && 
  487.  (pResolvParams->nameServersAddr [index][0] != ''); index++)
  488. {
  489. if (inet_aton (pResolvParams->nameServersAddr [index], &ipAddr) != OK)
  490. return(ERROR);
  491. }
  492.     /* Update queryOrder parameter */
  493.     resolvParams.queryOrder = pResolvParams->queryOrder;
  494.     /* Update the name server IP addresses in decimal dot notation */
  495.     for (index = 0, _res.nscount = 0; (index < MAXNS) && 
  496.  (pResolvParams->nameServersAddr [index][0] != ''); index++)
  497. {
  498. (void) inet_aton (pResolvParams->nameServersAddr [index], &ipAddr);
  499. /* update the resolver server entry */
  500. _res.nsaddr_list [index].sin_addr = ipAddr;
  501. _res.nsaddr_list [index].sin_family = AF_INET;
  502. _res.nsaddr_list [index].sin_port = htons(NAMESERVER_PORT);
  503.         _res.lookups [index] = 'b';
  504.         _res.nscount++;  /* Number of DNS servers to query */
  505. }
  506.     _res.lookups [index] = 'f';
  507.     /* Update domain name; Assume a valid domain name */
  508.     (void) strcpy (_res.defdname, pResolvParams->domainName);
  509.     return (OK);
  510.     }
  511. /*******************************************************************************
  512. *
  513. * resolvParamsGet - get the parameters which control the resolver library
  514. *
  515. * This routine copies the resolver parameters to the RESOLV_PARAMS_S
  516. * structure referenced in the <pResolvParms> parameter.  The RESOLV_PARAMS_S
  517. * structure is defined in resolvLib.h as follows: 
  518. * .CS
  519. *     typedef struct
  520. *        {
  521. *        char   queryOrder;
  522. *        char   domainName [MAXDNAME];
  523. *        char   nameServersAddr [MAXNS][MAXIPADDRLEN];
  524. *        } RESOLV_PARAMS_S;
  525. * .CE
  526. * Typically, you call this function just before calling resolvParamsSet().
  527. * The resolvParamsGet() call populates the RESOLV_PARAMS_S structure. 
  528. * You can then modify the default values just before calling 
  529. * resolvParamsSet().  
  530. *
  531. * RETURNS: N/A
  532. *
  533. * SEE ALSO:
  534. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  535. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvInit(),
  536. * resolvMkQuery(), resolvQuery()
  537. */
  538. void resolvParamsGet 
  539.     (
  540.     RESOLV_PARAMS_S *     pResolvParams  /* ptr to resolver parameter struct */
  541.     )
  542.     {
  543.     int index;
  544.     pResolvParams->queryOrder = resolvParams.queryOrder;
  545.     (void) strcpy (pResolvParams->domainName, _res.defdname);
  546.     
  547.     /* Copy the name server IP addresses in decimal dot notation */ 
  548.     for ( index = 0 ; index < MAXNS ; index++)
  549. if (index < _res.nscount)
  550.     {
  551.     inet_ntoa_b (_res.nsaddr_list [index].sin_addr,
  552.  pResolvParams->nameServersAddr [index]);
  553.     }
  554. else
  555.     {
  556.     pResolvParams->nameServersAddr [index][0] = 0;
  557.     }
  558. }
  559.     }
  560. /*******************************************************************************
  561. *
  562. * resolvHostLibGetByName - query the DNS server in behalf of hostGetByName
  563. *
  564. * When the resolver library is installed, the routine hostGetByName() in the 
  565. * hostLib library invokes this routine.  When the host name is not found by
  566. * hostGetByName in the static host table.  This feature allows existing 
  567. * applications to take advantage of the resolver without any changes.
  568. *
  569. * NOMANUAL
  570. *
  571. * ERRNO:
  572. *  S_resolvLib_TRY_AGAIN
  573. *  S_resolvLib_HOST_NOT_FOUND
  574. *  S_resolvLib_NO_DATA
  575. *  S_resolvLib_NO_RECOVERY
  576. *
  577. * RETURNS: IP address of host, or ERROR if the host was not found.
  578. */
  579. LOCAL int resolvHostLibGetByName 
  580.     (
  581.     char * pHostName       /* Pointer to host name */
  582.     )
  583.     {
  584.     char reqBuf [MAX_HOSTLIB_BUF];        /* Holding buffer  */
  585.     char *     pHostBuf;
  586.     int        bufLen;
  587.     struct hostent *       pHostEnt;           /* Ptr to host entry */
  588.     /* Try to get the answer from the DNS Server */
  589.     pHostBuf = reqBuf;
  590.     bufLen   = sizeof(reqBuf);
  591.     pHostEnt = hostEntFormat (& pHostBuf, & bufLen, MAXALIASES, MAXADDRS);
  592.     pHostEnt = _gethostbyname (pHostName, pHostEnt, pHostBuf, bufLen);
  593.     if (pHostEnt != NULL)
  594. {
  595. return (*(int *)(pHostEnt->h_addr_list [0])); /* Host IP address */
  596. }
  597.     return (ERROR);  /* Host IP address not found ! */
  598.     }
  599. /*******************************************************************************
  600. *
  601. * resolvHostLibGetByAddr - query the DNS server in behalf of hostGetByAddr()
  602. *
  603. * When the resolver library is installed the routine hostGetByAddr() in the 
  604. * hostLib library invokes this routine.  When the IP address is not found by
  605. * hostGetByAddr() in the static host table.  This feature allows existing 
  606. * applications to take advantage of the resolver without any changes.  The
  607. * <addr> paramter specifies the IP address and <pHostName> points to the
  608. * official name of the host when the query is successful.
  609. *
  610. * NOMANUAL
  611. *
  612. * ERRNO:
  613. *  S_resolvLib_TRY_AGAIN
  614. *  S_resolvLib_HOST_NOT_FOUND
  615. *  S_resolvLib_NO_DATA
  616. *  S_resolvLib_NO_RECOVERY
  617. *
  618. * RETURNS: OK, or ERROR if the host name was not found.
  619. */
  620. LOCAL STATUS resolvHostLibGetByAddr
  621.     (
  622.     int   addr, /* IP address of requested host name */
  623.     char * pHostName /* host name output by this routine */
  624.     )
  625.     {
  626.     char reqBuf [MAX_HOSTLIB_BUF];        /* Holding buffer  */
  627.     char *     pHostBuf;
  628.     int        bufLen;
  629.     struct hostent *       pHostEnt;           /* Ptr to host entry */
  630.     /* Try to get the answer from the DNS Server */
  631.     pHostBuf = reqBuf;
  632.     bufLen   = sizeof(reqBuf);
  633.     pHostEnt = hostEntFormat (& pHostBuf, & bufLen, MAXALIASES, MAXADDRS);
  634.     pHostEnt = _gethostbyaddr ((char *)&addr, 4, AF_INET, pHostEnt, 
  635.        pHostBuf, bufLen);
  636.     if (pHostEnt != NULL)
  637. {
  638.         strcpy (pHostName, pHostEnt->h_name);  /* Copy the host official name */
  639. return (OK);
  640. }
  641.     return (ERROR);
  642.     }
  643. /*******************************************************************************
  644. *
  645. * resolvDNExpand - expand a DNS compressed name from a DNS packet
  646. *
  647. * This functions expands a compressed DNS name from a DNS packet.  The <msg>
  648. * parameter points to that start of the DNS packet.  The <eomorig> parameter
  649. * points to the last location of the DNS packet plus 1.  The <comp_dn> 
  650. * parameter points to the compress domain name, and <exp_dn> parameter 
  651. * expects a pointer to a buffer.  Upon function completion, this buffer 
  652. * contains the expanded domain name.  Use the <length> parameter to pass in
  653. * the size of the buffer referenced by the <exp_dn> parameter.  
  654. *
  655. * RETURNS: The length of the expanded domain name, or ERROR on failure.
  656. *
  657. * SEE ALSO:
  658. * resolvGetHostByName(), resolvGetHostByAddr(), resolvInit(),
  659. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  660. * resolvMkQuery(), resolvQuery()
  661. */
  662. int resolvDNExpand 
  663.     (
  664.     const u_char * msg,     /* ptr to the start of the DNS packet */
  665.     const u_char * eomorig, /* ptr to the last location +1 of the DNS packet */
  666.     const u_char * comp_dn, /* ptr to the compressed domain name */
  667.           u_char * exp_dn,  /* ptr to where the expanded DN is output */
  668.           int      length   /* length of the buffer pointed by <expd_dn> */
  669.     );
  670. /*******************************************************************************
  671. *
  672. * resolvDNComp - compress a DNS name in a DNS packet
  673. *
  674. * This routine takes the expanded domain name referenced in the <exp_dn> 
  675. * parameter, compresses it, and stores the compressed name in the location
  676. * pointed to by the <comp_dn> parameter.  The <length> parameter passes in 
  677. * the length of the buffer starting at <comp_dn>.  The <dnptrs> parameter 
  678. * is a pointer to a list of pointers to previously compressed names.  The 
  679. * <lastdnptr> parameter points to the last entry in the <dnptrs> array.
  680. *
  681. * RETURNS: The size of the compressed name, or ERROR.
  682. *
  683. * SEE ALSO:
  684. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  685. * resolvInit(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  686. * resolvMkQuery(), resolvQuery()
  687. */
  688. int resolvDNComp 
  689.     (
  690.     const u_char *  exp_dn,   /* ptr to the expanded domain name */
  691.           u_char *  comp_dn,  /* ptr to where to output the compressed name */  
  692.           int       length,   /* length of the buffer pointed by <comp_dn> */
  693.           u_char ** dnptrs,   /* ptr to a ptr list of compressed names */ 
  694.           u_char ** lastdnptr /* ptr to the last entry pointed by <dnptrs> */
  695.       );
  696. /*******************************************************************************
  697. *
  698. * resolvQuery - construct a query, send it, wait for a response
  699. *
  700. * This routine constructs a query for the domain specified in the <name> 
  701. * parameter.  The <class> parameter specifies the class of the query. 
  702. * The <type> parameter specifies the type of query. The routine then sends
  703. * the query to the DNS server.  When the server responds, the response is 
  704. * validated and copied to the buffer you supplied in the <answer> parameter.
  705. * Use the <anslen> parameter to pass in the size of the buffer referenced
  706. * in <answer>.
  707. *
  708. * RETURNS: The length of the response or ERROR.
  709. *
  710. * ERRNO:
  711. *  S_resolvLib_TRY_AGAIN
  712. *  S_resolvLib_HOST_NOT_FOUND
  713. *  S_resolvLib_NO_DATA
  714. *  S_resolvLib_NO_RECOVERY
  715. *
  716. * SEE ALSO:
  717. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  718. * resolvDNComp(), resolvInit(), resolvParamsSet(), resolvParamsGet(),
  719. * resolvMkQuery()
  720. */
  721. int resolvQuery 
  722.     (
  723.     char   *name,       /* domain name */
  724.     int    class,       /* query class for IP is C_IN */
  725.     int    type,        /* type is T_A, T_PTR, ... */
  726.     u_char *answer,     /* buffer to put answer */
  727.     int    anslen       /* length of answer buffer */
  728.     );
  729. /*******************************************************************************
  730. *
  731. * resolvMkQuery - create all types of DNS queries
  732. *
  733. * This routine uses the input parameters to create a domain name query.
  734. * You can set the <op> parameter to QUERY or IQUERY.  Specify the domain 
  735. * name in <dname>, the class in <class>, the query type in <type>.  Valid
  736. * values for type include T_A, T_PTR, and so on.  Use <data> to add Resource 
  737. * Record data to the query.  Use <datalen> to pass in the length of the 
  738. * data buffer.  Set <newrr_in> to NULL.  This parameter is reserved for 
  739. * future use.  The <buf> parameter expects a pointer to the output buffer 
  740. * for the constructed query.  Use <buflen> to pass in the length of the 
  741. * buffer referenced in <buf>.
  742. *
  743. * RETURNS: The length of the constructed query or ERROR.
  744. *
  745. * SEE ALSO:
  746. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  747. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  748. * resolvInit(), resolvQuery()
  749. */
  750. int resolvMkQuery 
  751.     (
  752.           int     op,        /* set to desire query QUERY or IQUERY */
  753.     const char *  dname,       /* domain name to be use in the query */
  754.     int           class,       /* query class for IP is C_IN */
  755.     int           type,        /* type is T_A, T_PTR, ... */
  756.     const char *  data,        /* resource Record (RR) data */
  757.     int           datalen,     /* length of the RR */
  758.     const char *  newrr_in,    /* not used always set to NULL */
  759.           char *  buf,         /* out of the constructed query */
  760.           int     buflen       /* length of the buffer for the query */
  761.     );
  762. /*******************************************************************************
  763. *
  764. * resolvSend - send a pre-formatted query and return the answer
  765. *
  766. * This routine takes a pre-formatted DNS query and sends it to the domain
  767. * server.  Use <buf> to pass in a pointer to the query.  Use <buflen> to 
  768. * pass in the size of the buffer referenced in <buf>.  The <answer> parameter
  769. * expects a pointer to a buffer into which this routine can write the 
  770. * answer retrieved from the server.  Use <anslen> to pass in the size of
  771. * the buffer you have provided in <anslen>.
  772. *
  773. * RETURNS: The length of the response or ERROR.
  774. *
  775. * ERRNO:
  776. *  S_resolvLib_TRY_AGAIN
  777. *  ECONNREFUSE
  778. *  ETIMEDOU
  779. *
  780. * SEE ALSO:
  781. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  782. * resolvDNComp(), resolvInit(), resolvParamsSet(), resolvParamsGet(),
  783. * resolvMkQuery(), resolvQuery()
  784. */
  785. int resolvSend 
  786.     (
  787.     const char * buf, /* pre-formatted query */
  788.           int    buflen, /* length of query */
  789.           char * answer, /* buffer for answer */
  790.           int    anslen /* length of answer */
  791.     );