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

VxWorks

开发平台:

C/C++

  1. /* resolvLib/resolvLibDoc.c - DNS resolver library */
  2. /* Copyright 1998-2002 Wind River Systems, Inc */
  3. #include <copyright_wrs.h>
  4. /* 
  5. modification history 
  6. --------------------
  7. 01b,25apr02,vvv  updated doc for resolvGetHostByName (SPR #72988)
  8. 01a,06oct98,jmp  written from resolvLib.c
  9. */
  10. /*
  11. DESCRIPTION
  12. This library provides the client-side services for DNS (Domain Name
  13. Service) queries.  DNS queries come from applications that require
  14. translation of IP addresses to host names and back.  If you include 
  15. this library in VxWorks, it extends the services of the host library.  The
  16. interface to this library is described in hostLib.  The hostLib interface 
  17. uses resolver services to get IP and host names. In addition, the resolver
  18. can query multiple DNS servers, if necessary, to add redundancy for queries.  
  19. There are two interfaces available for the resolver library.  One is 
  20. a high-level interface suitable for most applications.  The other is also a
  21. low-level interface for more specialized applications, such as mail protocols.
  22. USING THIS LIBRARY
  23. By default, a VxWorks build does not include the resolver code.  In addition,
  24. VxWorks is delivered with the resolver library disabled.  To include the
  25. resolver library in the VxWorks image, edit config/all/configAll.h and 
  26. include the definition:
  27. .CS
  28.     #define INCLUDE_DNS_RESOLVER
  29. .CE
  30. To enable the resolver services, you need to redefine only one DNS 
  31. server IP address, changing it from a place-holder value to an actual value. 
  32. Additional DNS server IP addresses can be configured using resolvParamsSet().
  33. To do the initial configuration, edit configAll.h, and enter the correct IP 
  34. address for your domain server in the definition:
  35. .CS
  36.     #define RESOLVER_DOMAIN_SERVER  "90.0.0.3"
  37. .CE
  38. If you do not provide a valid IP address, resolver initialization fails.  
  39. You also need to configure the domain to which your resolver belongs.  To 
  40. do this, edit configAll.h and enter the correct domain name for your 
  41. organization in the definition:
  42. .CS
  43.     #define RESOLVER_DOMAIN  "wrs.com"
  44. .CE
  45. The last and most important step is to make sure that you have a route to 
  46. the configured DNS server.  If your VxWorks image includes a routing protocol, 
  47. such as RIP or OSPF, the routes are created for you automatically.  Otherwise,
  48. you must use routeAdd() or mRouteAdd() to add the routes to the routing table.
  49. The resolver library comes with a debug option.  To turn on debugging, 
  50. edit configAll.h to include the define:
  51. .CS
  52.     #define INCLUDE_DNS_DEBUG
  53. .CE
  54. This include makes VxWorks print a log of the resolver queries to the console.
  55. This feature assumes a single task.  Thus, if you are running multiple tasks,
  56. your output to the console is a garble of messages from all the tasks.
  57. The resolver library uses UDP to send queries to the DNS server and expects
  58. the DNS server to handle recursion.  You can change the resolver parameters 
  59. at any time after the library has been initialized with resolvInit().
  60. However, it is strongly recommended that you change parameters only shortly 
  61. after initialization, or when there are no other tasks accessing the resolver
  62. library.  
  63. Your procedure for changing any of the resolver parameter should start
  64. with a call to resolvParamsGet() to retrieve the active parameters.  Then
  65. you can change the query order (defaults to query DNS server only), the 
  66. domain name, or add DNS server IP addresses.  After the parameters are
  67. changed, call resolvParamsSet().  For the values you can use when accessing 
  68. resolver library services, see the header files resolvLib.h, resolv/resolv.h, 
  69. and resolv/nameser.h. 
  70. INCLUDE FILES: resolvLib.h 
  71. SEE ALSO
  72. hostLib
  73. */
  74. /*******************************************************************************
  75. *
  76. * resolvInit - initialize the resolver library 
  77. *
  78. * This function initializes the resolver.  <pNameServer> is a single IP address
  79. * for a name server in dotted decimal notation.  <pDefaultDomainName> is the 
  80. * default domain name to be appended to names without a dot.  The function 
  81. * pointer <pdnsDebugRtn> is set to the resolver debug function.  Additional
  82. * name servers can be configured using the function resolvParamsSet().
  83. *
  84. * RETURNS: OK or ERROR.
  85. *
  86. * SEE ALSO:
  87. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  88. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  89. * resolvQuery()
  90. */
  91. STATUS resolvInit
  92.     (
  93.     char *     pNameServer,     /* pointer to Name server IP address */
  94.     char *     pDefaultDomainName,  /* default domain name */
  95.     FUNCPTR    pdnsDebugRtn         /* function ptr to debug routine */
  96.     )
  97.     {
  98.     ...
  99.     }
  100. /*******************************************************************************
  101. *
  102. * resolvGetHostByName - query the DNS server for the IP address of a host
  103. *
  104. * This function returns a `hostent' structure. This structure is defined as
  105. * follows: 
  106. *
  107. * .CS
  108. *     struct   hostent 
  109. *     {
  110. *     char *   h_name;          /@ official name of host @/ 
  111. *     char **  h_aliases;       /@ alias list @/
  112. *     int      h_addrtype;      /@ address type @/
  113. *     int      h_length;        /@ length of address @/ 
  114. *     char **  h_addr_list;     /@ list of addresses from name server @/
  115. *     unsigned int h_ttl;       /@ Time to Live in Seconds for this entry @/
  116. *     }
  117. * .CE
  118. * The `h_aliases' and `h_addr_list' vectors are NULL-terminated. For a locally
  119. * resolved entry `h_ttl' is always 60 (an externally resolved entry may also
  120. * have a TTL of 60 depending on its age but it is usually much higher).
  121. *
  122. * Specify the host you want to query in <pHostname>.  Use <pBuf> and <bufLen> 
  123. * to specify the location and size of a buffer to receive the `hostent' 
  124. * structure and its associated contents.  Host addresses are returned in 
  125. * network byte order.  Given the information this routine retrieves, the 
  126. * <pBuf> buffer should be 512 bytes or larger.
  127. *
  128. * RETURNS: A pointer to a `hostent' structure if the host is found, or 
  129. * NULL if the parameters are invalid, the host is not found, or the 
  130. * buffer is too small.
  131. *
  132. * ERRNO:
  133. *  S_resolvLib_INVALID_PARAMETER
  134. *  S_resolvLib_BUFFER_2_SMALL
  135. *  S_resolvLib_TRY_AGAIN
  136. *  S_resolvLib_HOST_NOT_FOUND
  137. *  S_resolvLib_NO_DATA
  138. *  S_resolvLib_NO_RECOVERY
  139. * SEE ALSO:
  140. * resolvInit(), resolvGetHostByAddr(), resolvDNExpand(),
  141. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  142. * resolvMkQuery(), resolvQuery()
  143. */
  144. struct hostent *  resolvGetHostByName
  145.     (
  146.     char *     pHostName,  /* ptr to the name of  the host */
  147.     char *     pHostBuf,   /* ptr to the buffer used by hostent structure */
  148.     int        bufLen      /* length of the buffer */ 
  149.     )
  150.     {
  151.     ...
  152.     }
  153. /*******************************************************************************
  154. *
  155. * resolvGetHostByAddr - query the DNS server for the host name of an IP address
  156. *
  157. * This function returns a `hostent' structure, which is defined as follows:
  158. *
  159. * .CS
  160. * struct   hostent 
  161. *     {
  162. *     char *   h_name;            /@ official name of host @/
  163. *     char **  h_aliases;         /@ alias list @/
  164. *     int      h_addrtype;        /@ address type @/
  165. *     int      h_length;          /@ length of address @/
  166. *     char **  h_addr_list;       /@ list of addresses from name server @/
  167. *     unsigned int h_ttl;         /@ Time to Live in Seconds for this entry @/
  168. *     }
  169. * .CE
  170. * The `h_aliases' and `h_addr_list' vectors are NULL-terminated. For a locally
  171. * resolved entry `h_ttl' is always 60 (an externally resolved entry may also
  172. * have a TTL of 60 depending on its age but it is usually much higher).
  173. *
  174. * The <pinetAddr> parameter passes in the IP address (in network byte order)
  175. * for the host whose name you want to discover.  The <pBuf> and <bufLen> 
  176. * parameters specify the location and size (512 bytes or more) of the buffer 
  177. * that is to receive the hostent structure.  resolvGetHostByAddr() returns 
  178. * host addresses are returned in network byte order. 
  179. *
  180. * RETURNS: A pointer to a `hostent' structure if the host is found, or 
  181. * NULL if the parameters are invalid, host is not found, or the buffer 
  182. * is too small.
  183. * ERRNO:
  184. *  S_resolvLib_INVALID_PARAMETER
  185. *  S_resolvLib_BUFFER_2_SMALL
  186. *  S_resolvLib_TRY_AGAIN
  187. *  S_resolvLib_HOST_NOT_FOUND
  188. *  S_resolvLib_NO_DATA
  189. *  S_resolvLib_NO_RECOVERY
  190. *
  191. * SEE ALSO:
  192. * resolvGetHostByName(), resolvInit(), resolvDNExpand(),
  193. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  194. * resolvMkQuery(), resolvQuery()
  195. */
  196. struct hostent *     resolvGetHostByAddr 
  197.     (
  198.     const char *       pInetAddr,
  199.     char *             pHostBuf,
  200.     int                bufLen
  201.     )
  202.     {
  203.     ...
  204.     }
  205. /*******************************************************************************
  206. *
  207. * resolvParamsSet - set the parameters which control the resolver library
  208. *
  209. * This routine sets the resolver parameters.  <pResolvParams> passes in
  210. * a pointer to a RESOLV_PARAMS_S structure, which is defined as follows: 
  211. * .CS
  212. *     typedef struct
  213. *        {
  214. *        char   queryOrder;
  215. *        char   domainName [MAXDNAME];
  216. *        char   nameServersAddr [MAXNS][MAXIPADDRLEN];
  217. *        } RESOLV_PARAMS_S;
  218. * .CE
  219. * Use the members of this structure to specify the settings you want to 
  220. * apply to the resolver.  It is important to remember that multiple tasks 
  221. * can use the resolver library and that the settings specified in 
  222. * this RESOLV_PARAMS_S structure affect all queries from all tasks.  In 
  223. * addition, you should set resolver parameters at initialization and not 
  224. * while queries could be in progress. Otherwise, the results of the query 
  225. * are unpredictable.  
  226. *
  227. * Before calling resolvParamsSet(), you should first call resolvParamsGet() 
  228. * to populate a RESOLV_PARAMS_S structure with the current settings.  Then
  229. * you change the values of the members that interest you.    
  230. *
  231. * Valid values for the `queryOrder' member of RESOLV_PARAMS_S structure 
  232. * are defined in resolvLib.h.  Set the `domainName' member to the domain to 
  233. * which this resolver belongs.  Set the `nameServersAddr' member to the IP 
  234. * addresses of the DNS server that the resolver can query.  You must specify 
  235. * the IP addresses in standard dotted decimal notation.  This function tries 
  236. * to validate the values in the `queryOrder' and `nameServerAddr' members.  
  237. * This function does not try to validate the domain name.  
  238. *
  239. * RETURNS: OK if the parameters are valid, ERROR otherwise.
  240. *
  241. * SEE ALSO:
  242. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  243. * resolvDNComp(), resolvSend(), resolvInit(), resolvParamsGet(),
  244. * resolvMkQuery(), resolvQuery()
  245. */
  246. STATUS resolvParamsSet 
  247.     (
  248.     RESOLV_PARAMS_S *  pResolvParams  /* ptr to resolver parameter struct */
  249.     )
  250.     {
  251.     ...
  252.     }
  253. /*******************************************************************************
  254. *
  255. * resolvParamsGet - get the parameters which control the resolver library
  256. *
  257. * This routine copies the resolver parameters to the RESOLV_PARAMS_S
  258. * structure referenced in the <pResolvParms> parameter.  The RESOLV_PARAMS_S
  259. * structure is defined in resolvLib.h as follows: 
  260. * .CS
  261. *     typedef struct
  262. *        {
  263. *        char   queryOrder;
  264. *        char   domainName [MAXDNAME];
  265. *        char   nameServersAddr [MAXNS][MAXIPADDRLEN];
  266. *        } RESOLV_PARAMS_S;
  267. * .CE
  268. * Typically, you call this function just before calling resolvParamsSet().
  269. * The resolvParamsGet() call populates the RESOLV_PARAMS_S structure. 
  270. * You can then modify the default values just before calling 
  271. * resolvParamsSet().  
  272. *
  273. * RETURNS: N/A
  274. *
  275. * SEE ALSO:
  276. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  277. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvInit(),
  278. * resolvMkQuery(), resolvQuery()
  279. */
  280. void resolvParamsGet 
  281.     (
  282.     RESOLV_PARAMS_S *     pResolvParams  /* ptr to resolver parameter struct */
  283.     )
  284.     {
  285.     ...
  286.     }
  287. /*******************************************************************************
  288. *
  289. * resolvHostLibGetByName - query the DNS server in behalf of hostGetByName
  290. *
  291. * When the resolver library is installed, the routine hostGetByName() in the 
  292. * hostLib library invokes this routine.  When the host name is not found by
  293. * hostGetByName in the static host table.  This feature allows existing 
  294. * applications to take advantage of the resolver without any changes.
  295. *
  296. * NOMANUAL
  297. *
  298. * ERRNO:
  299. *  S_resolvLib_TRY_AGAIN
  300. *  S_resolvLib_HOST_NOT_FOUND
  301. *  S_resolvLib_NO_DATA
  302. *  S_resolvLib_NO_RECOVERY
  303. *
  304. * RETURNS: IP address of host, or ERROR if the host was not found.
  305. */
  306. LOCAL int resolvHostLibGetByName 
  307.     (
  308.     char * pHostName       /* Pointer to host name */
  309.     )
  310.     {
  311.     ...
  312.     }
  313. /*******************************************************************************
  314. *
  315. * resolvHostLibGetByAddr - query the DNS server in behalf of hostGetByAddr()
  316. *
  317. * When the resolver library is installed the routine hostGetByAddr() in the 
  318. * hostLib library invokes this routine.  When the IP address is not found by
  319. * hostGetByAddr() in the static host table.  This feature allows existing 
  320. * applications to take advantage of the resolver without any changes.  The
  321. * <addr> paramter specifies the IP address and <pHostName> points to the
  322. * official name of the host when the query is successful.
  323. *
  324. * NOMANUAL
  325. *
  326. * ERRNO:
  327. *  S_resolvLib_TRY_AGAIN
  328. *  S_resolvLib_HOST_NOT_FOUND
  329. *  S_resolvLib_NO_DATA
  330. *  S_resolvLib_NO_RECOVERY
  331. *
  332. * RETURNS: OK, or ERROR if the host name was not found.
  333. */
  334. LOCAL STATUS resolvHostLibGetByAddr
  335.     (
  336.     int   addr, /* IP address of requested host name */
  337.     char * pHostName /* host name output by this routine */
  338.     )
  339.     {
  340.     ...
  341.     }
  342. /*******************************************************************************
  343. *
  344. * resolvDNExpand - expand a DNS compressed name from a DNS packet
  345. *
  346. * This functions expands a compressed DNS name from a DNS packet.  The <msg>
  347. * parameter points to that start of the DNS packet.  The <eomorig> parameter
  348. * points to the last location of the DNS packet plus 1.  The <comp_dn> 
  349. * parameter points to the compress domain name, and <exp_dn> parameter 
  350. * expects a pointer to a buffer.  Upon function completion, this buffer 
  351. * contains the expanded domain name.  Use the <length> parameter to pass in
  352. * the size of the buffer referenced by the <exp_dn> parameter.  
  353. *
  354. * RETURNS: The length of the expanded domain name, or ERROR on failure.
  355. *
  356. * SEE ALSO:
  357. * resolvGetHostByName(), resolvGetHostByAddr(), resolvInit(),
  358. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  359. * resolvMkQuery(), resolvQuery()
  360. */
  361. int resolvDNExpand 
  362.     (
  363.     const u_char * msg,     /* ptr to the start of the DNS packet */
  364.     const u_char * eomorig, /* ptr to the last location +1 of the DNS packet */
  365.     const u_char * comp_dn, /* ptr to the compressed domain name */
  366.           u_char * exp_dn,  /* ptr to where the expanded DN is output */
  367.           int      length   /* length of the buffer pointed by <expd_dn> */
  368.     )
  369.     {
  370.     ...
  371.     }
  372. /*******************************************************************************
  373. *
  374. * resolvDNComp - compress a DNS name in a DNS packet
  375. *
  376. * This routine takes the expanded domain name referenced in the <exp_dn> 
  377. * parameter, compresses it, and stores the compressed name in the location
  378. * pointed to by the <comp_dn> parameter.  The <length> parameter passes in 
  379. * the length of the buffer starting at <comp_dn>.  The <dnptrs> parameter 
  380. * is a pointer to a list of pointers to previously compressed names.  The 
  381. * <lastdnptr> parameter points to the last entry in the <dnptrs> array.
  382. *
  383. * RETURNS: The size of the compressed name, or ERROR.
  384. *
  385. * SEE ALSO:
  386. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  387. * resolvInit(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  388. * resolvMkQuery(), resolvQuery()
  389. */
  390. int resolvDNComp 
  391.     (
  392.     const u_char *  exp_dn,   /* ptr to the expanded domain name */
  393.           u_char *  comp_dn,  /* ptr to where to output the compressed name */  
  394.           int       length,   /* length of the buffer pointed by <comp_dn> */
  395.           u_char ** dnptrs,   /* ptr to a ptr list of compressed names */ 
  396.           u_char ** lastdnptr /* ptr to the last entry pointed by <dnptrs> */
  397.     )
  398.     {
  399.     ...
  400.     }
  401. /*******************************************************************************
  402. *
  403. * resolvQuery - construct a query, send it, wait for a response
  404. *
  405. * This routine constructs a query for the domain specified in the <name> 
  406. * parameter.  The <class> parameter specifies the class of the query. 
  407. * The <type> parameter specifies the type of query. The routine then sends
  408. * the query to the DNS server.  When the server responds, the response is 
  409. * validated and copied to the buffer you supplied in the <answer> parameter.
  410. * Use the <anslen> parameter to pass in the size of the buffer referenced
  411. * in <answer>.
  412. *
  413. * RETURNS: The length of the response or ERROR.
  414. *
  415. * ERRNO:
  416. *  S_resolvLib_TRY_AGAIN
  417. *  S_resolvLib_HOST_NOT_FOUND
  418. *  S_resolvLib_NO_DATA
  419. *  S_resolvLib_NO_RECOVERY
  420. *
  421. * SEE ALSO:
  422. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  423. * resolvDNComp(), resolvInit(), resolvParamsSet(), resolvParamsGet(),
  424. * resolvMkQuery()
  425. */
  426. int resolvQuery 
  427.     (
  428.     char   *name,       /* domain name */
  429.     int    class,       /* query class for IP is C_IN */
  430.     int    type,        /* type is T_A, T_PTR, ... */
  431.     u_char *answer,     /* buffer to put answer */
  432.     int    anslen       /* length of answer buffer */
  433.     )
  434.     {
  435.     ...
  436.     }
  437. /*******************************************************************************
  438. *
  439. * resolvMkQuery - create all types of DNS queries
  440. *
  441. * This routine uses the input parameters to create a domain name query.
  442. * You can set the <op> parameter to QUERY or IQUERY.  Specify the domain 
  443. * name in <dname>, the class in <class>, the query type in <type>.  Valid
  444. * values for type include T_A, T_PTR, and so on.  Use <data> to add Resource 
  445. * Record data to the query.  Use <datalen> to pass in the length of the 
  446. * data buffer.  Set <newrr_in> to NULL.  This parameter is reserved for 
  447. * future use.  The <buf> parameter expects a pointer to the output buffer 
  448. * for the constructed query.  Use <buflen> to pass in the length of the 
  449. * buffer referenced in <buf>.
  450. *
  451. * RETURNS: The length of the constructed query or ERROR.
  452. *
  453. * SEE ALSO:
  454. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  455. * resolvDNComp(), resolvSend(), resolvParamsSet(), resolvParamsGet(),
  456. * resolvInit(), resolvQuery()
  457. */
  458. int resolvMkQuery 
  459.     (
  460.           int     op,        /* set to desire query QUERY or IQUERY */
  461.     const char *  dname,       /* domain name to be use in the query */
  462.     int           class,       /* query class for IP is C_IN */
  463.     int           type,        /* type is T_A, T_PTR, ... */
  464.     const char *  data,        /* resource Record (RR) data */
  465.     int           datalen,     /* length of the RR */
  466.     const char *  newrr_in,    /* not used always set to NULL */
  467.           char *  buf,         /* out of the constructed query */
  468.           int     buflen       /* length of the buffer for the query */
  469.     )
  470.     {
  471.     ...
  472.     }
  473. /*******************************************************************************
  474. *
  475. * resolvSend - send a pre-formatted query and return the answer
  476. *
  477. * This routine takes a pre-formatted DNS query and sends it to the domain
  478. * server.  Use <buf> to pass in a pointer to the query.  Use <buflen> to 
  479. * pass in the size of the buffer referenced in <buf>.  The <answer> parameter
  480. * expects a pointer to a buffer into which this routine can write the 
  481. * answer retrieved from the server.  Use <anslen> to pass in the size of
  482. * the buffer you have provided in <anslen>.
  483. *
  484. * RETURNS: The length of the response or ERROR.
  485. *
  486. * ERRNO:
  487. *  S_resolvLib_TRY_AGAIN
  488. *  ECONNREFUSE
  489. *  ETIMEDOU
  490. *
  491. * SEE ALSO:
  492. * resolvGetHostByName(), resolvGetHostByAddr(), resolvDNExpand(),
  493. * resolvDNComp(), resolvInit(), resolvParamsSet(), resolvParamsGet(),
  494. * resolvMkQuery(), resolvQuery()
  495. */
  496. int resolvSend 
  497.     (
  498.     const char * buf, /* pre-formatted query */
  499.           int    buflen, /* length of query */
  500.           char * answer, /* buffer for answer */
  501.           int    anslen /* length of answer */
  502.     )
  503.     {
  504.     ...
  505.     }