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

VxWorks

开发平台:

C/C++

  1. /* dhcpcShow.c - DHCP run-time client information display routines */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc.  */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01q,12may02,kbw  man page edits
  8. 01p,10may02,kbw  making man page edits
  9. 01o,23apr02,wap  use dhcpTime() instead of time() (SPR #68900)
  10. 01n,15oct01,rae  merge from truestack ver 01m, base 01l
  11. 01m,16oct00,niq  Integrating T3 DHCP
  12. 01l,17jan98,kbw  removed NOMANUAL from dhcpcShowInit()
  13. 01k,14dec97,kbw  making minor man page fixes
  14. 01j,10dec97,kbw  making minor man page fixes
  15. 01i,04dec97,spm  added code review modifications
  16. 01h,21oct97,kbw  making minor man page fixes
  17. 01g,26aug97,spm  major overhaul: changed user interface to support multiple 
  18.                  leases at run-time; changed function names and renamed
  19.                  module to comply with coding standards
  20. 01f,06aug97,spm  removed parameters linked list to reduce memory required
  21. 01e,30jul97,kbw  fixed man page problems found in beta review
  22. 01d,02jun97,spm  updated man pages and added ERRNO entries
  23. 01c,17apr97,kbw  fixed minor format errors in man page, spell-checked
  24. 01b,07apr97,spm  corrected array indexing bugs, modified displayed parameter 
  25.                  descriptions, rewrote documentation
  26. 01a,31jan97,spm  created by extracting routines from netShow.c
  27. */
  28. /*
  29. DESCRIPTION
  30. This library provides routines that display various data related to
  31. the DHCP run-time client library such as the lease timers and responding 
  32. server.  The dhcpcShowInit() routine links the show facility into the VxWorks
  33. image.  This happens automatically if INCLUDE_NET_SHOW and INCLUDE_DHCPC 
  34. are defined at the time the image is built.
  35. INCLUDE FILES: dhcpcLib.h
  36. SEE ALSO: dhcpcLib
  37. */
  38. #include <stdio.h>
  39. #include "vxWorks.h"
  40. #include "inetLib.h"
  41. #include "dhcpcLib.h"
  42. #include "dhcp/dhcpcCommonLib.h"
  43. #include "dhcp/dhcpcStateLib.h"
  44. #include "time.h"
  45. IMPORT SEM_ID           dhcpcMutexSem;   /* protects the status indicators */
  46. /* forward declarations */
  47. STATUS dhcpcServerShow (void *);
  48. STATUS dhcpcTimersShow (void *);
  49. STATUS dhcpcParamsShow (void *);
  50. /******************************************************************************
  51. *
  52. * dhcpcShowInit - initialize the DHCP show facility
  53. *
  54. * This routine links the DHCP show facility into the VxWorks system image. 
  55. * It is called from usrNetwork.c automatically if INCLUDE_DHCP and 
  56. * INCLUDE_NET_SHOW are defined at the time the image is constructed.
  57. *
  58. */
  59. void dhcpcShowInit (void)
  60.     {
  61.     return;
  62.     }
  63. /*******************************************************************************
  64. *
  65. * dhcpcServerShow - display current DHCP server
  66. *
  67. * This routine prints the IP address of the DHCP server that provided the 
  68. * parameters for the lease identified by <pCookie>.  It has no effect if the
  69. * indicated lease is not currently active.
  70. *
  71. * RETURNS: OK, or ERROR if lease identifier unknown.
  72. *
  73. * ERRNO: 
  74. *  S_dhcpcLib_BAD_COOKIE
  75. *
  76. */
  77. STATUS dhcpcServerShow 
  78.     (
  79.     void *  pCookie  /* identifier returned by dhcpcInit() */
  80.     )
  81.     {
  82.     int  offset;
  83.     LEASE_DATA *  pLeaseData = NULL;
  84.     char  addrBuf [INET_ADDR_LEN];
  85.     STATUS  result = OK;
  86.     /*
  87.      * Use the cookie to access the lease-specific data structures.  For now,
  88.      * just typecast the cookie.  This translation could be replaced with a more
  89.      * sophisticated lookup at some point.
  90.      */
  91.     pLeaseData = (LEASE_DATA *)pCookie;
  92.     for (offset = 0; offset < dhcpcMaxLeases; offset++)
  93.         if (dhcpcLeaseList [offset] != NULL &&
  94.                 dhcpcLeaseList [offset] == pLeaseData)
  95.             break;
  96.     if (offset == dhcpcMaxLeases)
  97.         {
  98.         errno = S_dhcpcLib_BAD_COOKIE;
  99.         return (ERROR);
  100.         }
  101.     /* Ignore show request if lease is not initialized or not bound.  */
  102.     if (!dhcpcInitialized || !pLeaseData->initFlag)
  103.         return (OK);
  104.     semTake (dhcpcMutexSem, WAIT_FOREVER);
  105.     if (!pLeaseData->leaseGood)
  106.         result = ERROR;
  107.     semGive (dhcpcMutexSem);
  108.     if (result == ERROR)
  109.         return (OK);
  110.     if (pLeaseData->leaseType == DHCP_BOOTP)
  111.         {
  112.         printf ("DHCP server (BOOTP proxy): "); 
  113.         inet_ntoa_b (pLeaseData->dhcpcParam->siaddr, addrBuf);
  114.         printf ("%-18sn", addrBuf);
  115.         return (OK);
  116.         }
  117.     printf ("DHCP server: ");
  118.     inet_ntoa_b (pLeaseData->dhcpcParam->server_id, addrBuf);
  119.     printf("%-18sn", addrBuf);
  120.     return (OK);
  121.     }
  122. /*******************************************************************************
  123. *
  124. * dhcpcTimersShow - display current lease timers
  125. *
  126. * This routine prints the time remaining with each of the DHCP lease timers
  127. * for the lease identified by <pCookie>.  It has no effect if the indicated
  128. * lease is not currently active.
  129. *
  130. * RETURNS: OK if show routine completes, or ERROR otherwise.
  131. *
  132. * ERRNO: 
  133. *  S_dhcpcLib_BAD_COOKIE
  134. *
  135. */
  136. STATUS dhcpcTimersShow
  137.     (
  138.     void *  pCookie  /* identifier returned by dhcpcInit() */
  139.     )
  140.     {
  141.     int  offset;
  142.     LEASE_DATA *  pLeaseData = NULL;
  143.     STATUS  result = OK;
  144.     time_t current = 0;
  145.     long t1;
  146.     long t2;
  147.     /*
  148.      * Use the cookie to access the lease-specific data structures.  For now,
  149.      * just typecast the cookie.  This translation could be replaced with a more
  150.      * sophisticated lookup at some point.
  151.      */
  152.     pLeaseData = (LEASE_DATA *)pCookie;
  153.     for (offset = 0; offset < dhcpcMaxLeases; offset++)
  154.         if (dhcpcLeaseList [offset] != NULL &&
  155.                 dhcpcLeaseList [offset] == pLeaseData)
  156.             break;
  157.     if (offset == dhcpcMaxLeases)
  158.         {
  159.         errno = S_dhcpcLib_BAD_COOKIE;
  160.         return (ERROR);
  161.         }
  162.     /* Ignore show request if lease is not initialized or not bound.  */
  163.     if (!dhcpcInitialized || !pLeaseData->initFlag)
  164.         return (OK);
  165.     semTake (dhcpcMutexSem, WAIT_FOREVER);
  166.     if (!pLeaseData->leaseGood)
  167.         result = ERROR;
  168.     semGive (dhcpcMutexSem);
  169.     if (result == ERROR)
  170.         return (OK);
  171.     if (pLeaseData->leaseType == DHCP_BOOTP)
  172.         {
  173.         printf ("No timer values: BOOTP reply accepted.n");
  174.         return (OK);
  175.         }
  176.  
  177.     if (dhcpTime (&current) == -1)
  178.         {
  179.         printf ("time() error in dhcpcTimerShow() routine.n");
  180.         return (ERROR);
  181.         }
  182.     t1 = pLeaseData->dhcpcParam->lease_origin + 
  183.              pLeaseData->dhcpcParam->dhcp_t1 - current;
  184.     t2 = pLeaseData->dhcpcParam->lease_origin + 
  185.              pLeaseData->dhcpcParam->dhcp_t2 - current;
  186.    
  187.     if (t1 <= 0)
  188.         printf ("Timer T1 expired.n");
  189.     else
  190.         printf ("Timer T1: %ld seconds remaining.n", t1);
  191.    
  192.     if (t2 <= 0)
  193.         printf ("Timer T2 expired.n");
  194.     else
  195.         printf ("Timer T2: %ld seconds remaining.n", t2);
  196.     return (OK);
  197.     }
  198. /******************************************************************************
  199. *
  200. * dhcpcParamsShow - display current lease parameters
  201. *
  202. * This routine prints all lease parameters for the lease identified by 
  203. * <pCookie>.  It has no effect if the indicated lease is not currently active.
  204. * RETURNS: OK, or ERROR if lease identifier unknown.
  205. *
  206. * ERRNO: 
  207. *  S_dhcpcLib_BAD_COOKIE
  208. *
  209. */
  210. STATUS dhcpcParamsShow
  211.     (
  212.     void *  pCookie  /* identifier returned by dhcpcInit() */
  213.     )
  214.     {
  215.     int  offset;
  216.     LEASE_DATA *  pLeaseData = NULL;
  217.     STATUS  result = OK;
  218.     int loop;
  219.     struct dhcp_param *  pDhcpcParam;
  220.     char addrBuf [INET_ADDR_LEN];
  221.     /*
  222.      * Use the cookie to access the lease-specific data structures.  For now,
  223.      * just typecast the cookie.  This translation could be replaced with a more
  224.      * sophisticated lookup at some point.
  225.      */
  226.     pLeaseData = (LEASE_DATA *)pCookie;
  227.     for (offset = 0; offset < dhcpcMaxLeases; offset++)
  228.         if (dhcpcLeaseList [offset] != NULL &&
  229.                 dhcpcLeaseList [offset] == pLeaseData)
  230.             break;
  231.     if (offset == dhcpcMaxLeases)
  232.         {
  233.         errno = S_dhcpcLib_BAD_COOKIE;
  234.         return (ERROR);
  235.         }
  236.     /* Ignore show request if lease is not initialized or not bound.  */
  237.     if (!dhcpcInitialized || !pLeaseData->initFlag)
  238.         return (OK);
  239.     semTake (dhcpcMutexSem, WAIT_FOREVER);
  240.     if (!pLeaseData->leaseGood)
  241.         result = ERROR;
  242.     semGive (dhcpcMutexSem);
  243.     if (result == ERROR)
  244.         return (OK);
  245.     if (pLeaseData->leaseType == DHCP_BOOTP)
  246.         {
  247.         printf ("No parameter values: BOOTP reply accepted.n");
  248.         return (OK);
  249.         }
  250.     pDhcpcParam = pLeaseData->dhcpcParam;
  251.     /* Print any string parameters.  */
  252.     if (pDhcpcParam->sname != NULL)
  253.         printf ("DHCP server name: %sn", pDhcpcParam->sname);
  254.  
  255.     if (pDhcpcParam->file != NULL)
  256.         printf ("Boot file name: %sn", pDhcpcParam->file);
  257.     if (pDhcpcParam->hostname != NULL)
  258.         printf ("DHCP client name: %sn", pDhcpcParam->hostname);
  259.     if (pDhcpcParam->merit_dump != NULL)
  260.         printf ("Merit dump file: %sn", pDhcpcParam->merit_dump);
  261.     if (pDhcpcParam->dns_domain != NULL)
  262.         printf ("DNS domain name: %sn", pDhcpcParam->dns_domain);
  263.     if (pDhcpcParam->root_path != NULL)
  264.         printf ("Client root path: %sn", pDhcpcParam->root_path);
  265.     if (pDhcpcParam->extensions_path != NULL)
  266.         printf ("Options extension path: %sn", pDhcpcParam->extensions_path);
  267.     if (pDhcpcParam->nis_domain != NULL)
  268.         printf ("NIS domain: %sn", pDhcpcParam->nis_domain);
  269.     if (pDhcpcParam->nb_scope != NULL)
  270.         printf ("NetBIOS over TCP/IP scope: %sn", pDhcpcParam->nb_scope);
  271.     if (pDhcpcParam->errmsg != NULL)
  272.         printf ("Error message: %sn", pDhcpcParam->errmsg);
  273.     if (pDhcpcParam->nisp_domain != NULL)
  274.         printf ("NIS+ domain: %sn", pDhcpcParam->nisp_domain);
  275.     /* Print all TRUE boolean parameters.  */
  276.     if (pDhcpcParam->ip_forward)
  277.         printf ("IP forwarding enabled.n");
  278.     if (pDhcpcParam->nonlocal_srcroute)
  279.         printf ("Non-local source route forwarding enabled.n");
  280.     if (pDhcpcParam->all_subnet_local)
  281.         printf ("All subnets are local is TRUE.n");
  282.  
  283.     if (pDhcpcParam->mask_discover)
  284.         printf ("ICMP mask discovery enabled.n");
  285.     if (pDhcpcParam->mask_supplier)
  286.         printf ("ICMP mask supplier is TRUE.n");
  287.     if (pDhcpcParam->router_discover)
  288.         printf ("Router discovery enabled.n");
  289.     if (pDhcpcParam->trailer)
  290.         printf ("ARP trailers enabled.n");
  291.   
  292.     if (pDhcpcParam->ether_encap)
  293.         printf ("RFC 1042 Ethernet encapsulation enabled.n");
  294.     else
  295.         printf ("RFC 894 Ethernet encapsulation enabled.n");
  296.     if (pDhcpcParam->keepalive_garba)
  297.         printf ("TCP keepalive garbage octet enabled.n");
  298.     /* Print all non-zero single numeric parameters.  */
  299.     if (pDhcpcParam->time_offset != 0)
  300.         printf ("Client time offset: %ldn", pDhcpcParam->time_offset);
  301.     if (pDhcpcParam->bootsize != 0)
  302.         printf ("Boot image size: %dn", pDhcpcParam->bootsize);
  303.  
  304.     if (pDhcpcParam->max_dgram_size != 0)
  305.         printf ("Maximum datagram size: %dn", pDhcpcParam->max_dgram_size);
  306.     if (pDhcpcParam->default_ip_ttl != 0)
  307.         printf ("Default IP Time-to-live: %dn",
  308.                 pDhcpcParam->default_ip_ttl);
  309.     if (pDhcpcParam->mtu_aging_timeout != 0)
  310.         printf ("Path MTU timeout: %ldn", pDhcpcParam->mtu_aging_timeout);
  311.     if (pDhcpcParam->intf_mtu != 0)
  312.         printf ("Interface MTU: %dn", pDhcpcParam->intf_mtu);
  313.     if (pDhcpcParam->arp_cache_timeout != 0)
  314.         printf ("ARP cache timeout: %ldn", pDhcpcParam->arp_cache_timeout);
  315.     if (pDhcpcParam->default_tcp_ttl != 0)
  316.         printf ("Default TCP Time-to-live: %dn",
  317.                 pDhcpcParam->default_tcp_ttl);
  318.     if (pDhcpcParam->keepalive_inter != 0)
  319.         printf ("TCP keepalive interval: %ldn",
  320.                 pDhcpcParam->keepalive_inter);
  321.     if (pDhcpcParam->nb_nodetype != 0)
  322.         printf ("NetBIOS node type: %dn", pDhcpcParam->nb_nodetype);
  323.     printf ("Client lease origin: %ldn", pDhcpcParam->lease_origin);
  324.     printf ("Client lease duration: %ldn", pDhcpcParam->lease_duration);
  325.     if (pDhcpcParam->dhcp_t1 != 0)
  326.         printf ("Client renewal (T1) time value: %ldn",
  327.                 pDhcpcParam->dhcp_t1);
  328.     if (pDhcpcParam->dhcp_t2 != 0)
  329.         printf ("Client rebinding (T2) time value: %ldn",
  330.                 pDhcpcParam->dhcp_t2);
  331.     /* Print multiple numeric parameters.  */
  332.     if (pDhcpcParam->mtu_plateau_table != NULL)
  333.         {
  334.          printf ("MTU plateau table:n ");
  335.          if (pDhcpcParam->mtu_plateau_table->shortnum != NULL)
  336.             {
  337.             for (loop = 0; loop < pDhcpcParam->mtu_plateau_table->num; loop++)
  338.                printf ("%d ", pDhcpcParam->mtu_plateau_table->shortnum [loop]);
  339.             printf ("n");
  340.             }
  341.          else
  342.             printf ("empty.n");
  343.         }
  344.     /* Print any single IP addresses.  */
  345.     if (pDhcpcParam->server_id.s_addr != 0)
  346.         {
  347.         printf ("DHCP server: ");
  348.         inet_ntoa_b (pDhcpcParam->server_id, addrBuf);
  349.         printf ("%-18sn", addrBuf);
  350.         }
  351.     if (pDhcpcParam->ciaddr.s_addr != 0)
  352.         {
  353.         printf ("Client IP address: ");
  354.         inet_ntoa_b (pDhcpcParam->ciaddr, addrBuf);
  355.         printf ("%-18sn", addrBuf);
  356.         }
  357.     if (pDhcpcParam->yiaddr.s_addr != 0)
  358.         {
  359.         printf ("Assigned IP address: ");
  360.         inet_ntoa_b (pDhcpcParam->yiaddr, addrBuf);
  361.         printf ("%-18sn", addrBuf);
  362.         }
  363.     if (pDhcpcParam->siaddr.s_addr != 0)
  364.         {
  365.         printf ("Next server IP address: ");
  366.         inet_ntoa_b (pDhcpcParam->siaddr, addrBuf);
  367.         printf ("%-18sn", addrBuf);
  368.         }
  369.     if (pDhcpcParam->giaddr.s_addr != 0)
  370.         {
  371.         printf ("Relay agent IP address: ");
  372.         inet_ntoa_b (pDhcpcParam->giaddr, addrBuf);
  373.         printf ("%-18sn", addrBuf);
  374.         }
  375.     if (pDhcpcParam->subnet_mask != NULL)
  376.         {
  377.         printf ("Client subnet mask: ");
  378.         inet_ntoa_b (*pDhcpcParam->subnet_mask, addrBuf);
  379.         printf ("%-18sn", addrBuf);
  380.         }
  381.     if (pDhcpcParam->swap_server != NULL)
  382.         {
  383.         printf ("Client swap server: ");
  384.         inet_ntoa_b (*pDhcpcParam->swap_server, addrBuf);
  385.         printf ("%-18sn", addrBuf);
  386.         }
  387.     if (pDhcpcParam->brdcast_addr != NULL)
  388.         {
  389.         printf ("Client broadcast address: ");
  390.         inet_ntoa_b (*pDhcpcParam->brdcast_addr, addrBuf);
  391.         printf ("%-18sn", addrBuf);
  392.         }
  393.     if (pDhcpcParam->router_solicit.s_addr != 0)
  394.         {
  395.         printf ("Client router solicitation address: ");
  396.         inet_ntoa_b (pDhcpcParam->router_solicit, addrBuf);
  397.         printf ("%-18sn", addrBuf);
  398.         }
  399.     /* Print any multiple IP addresses.  */
  400.     if (pDhcpcParam->router != NULL)
  401.         {
  402.         printf ("Client IP routers:n");
  403.         if (pDhcpcParam->router->addr != NULL)
  404.             {
  405.             for (loop = 0; loop < pDhcpcParam->router->num; loop++)
  406.                 {
  407.                 inet_ntoa_b (pDhcpcParam->router->addr [loop], addrBuf);
  408.                 printf ("t%-18sn", addrBuf);
  409.                 }
  410.             }
  411.         else
  412.             printf ("tnone specified.n");
  413.         }
  414.     if (pDhcpcParam->time_server != NULL)
  415.         {
  416.         printf ("Client time servers:n");
  417.         if (pDhcpcParam->time_server->addr != NULL)
  418.             {
  419.             for (loop = 0; loop < pDhcpcParam->time_server->num; loop++)
  420.                 {
  421.                 inet_ntoa_b (pDhcpcParam->time_server->addr [loop], addrBuf);
  422.                 printf ("t%-18sn", addrBuf);
  423.                 }
  424.             }
  425.         else
  426.             printf ("tnone specified.n");
  427.         }
  428.     if (pDhcpcParam->name_server != NULL)
  429.         {
  430.         printf ("Client IEN 116 name servers:n");
  431.         if (pDhcpcParam->name_server->addr != NULL)
  432.             {
  433.             for (loop = 0; loop < pDhcpcParam->name_server->num; loop++)
  434.                 {
  435.                 inet_ntoa_b (pDhcpcParam->name_server->addr [loop], addrBuf);
  436.                 printf ("t%-18sn", addrBuf);
  437.                 }
  438.             }
  439.         else
  440.             printf ("tnone specified.n");
  441.         }
  442.     if (pDhcpcParam->dns_server != NULL)
  443.         {
  444.         printf ("Client DNS name servers:n");
  445.         if (pDhcpcParam->dns_server->addr != NULL)
  446.             {
  447.             for (loop = 0; loop < pDhcpcParam->dns_server->num; loop++)
  448.                 {
  449.                 inet_ntoa_b (pDhcpcParam->dns_server->addr [loop], addrBuf);
  450.                 printf ("t%-18sn", addrBuf);
  451.                 }
  452.             }
  453.         else
  454.             printf ("tnone specified.n");
  455.         }
  456.     if (pDhcpcParam->log_server != NULL)
  457.         {
  458.         printf ("Client log servers:n");
  459.         if (pDhcpcParam->log_server->addr != NULL)
  460.             {
  461.             for (loop = 0; loop < pDhcpcParam->log_server->num; loop++)
  462.                 {
  463.                 inet_ntoa_b (pDhcpcParam->log_server->addr [loop], addrBuf);
  464.                 printf ("t%-18sn", addrBuf);
  465.                 }
  466.             }
  467.         else
  468.             printf ("tnone specified.n");
  469.         }
  470.     if (pDhcpcParam->cookie_server != NULL)
  471.         {
  472.         printf ("Client cookie servers:n");
  473.         if (pDhcpcParam->cookie_server->addr != NULL)
  474.             {
  475.             for (loop = 0; loop < pDhcpcParam->cookie_server->num; loop++)
  476.                 {
  477.                 inet_ntoa_b (pDhcpcParam->cookie_server->addr [loop], addrBuf);
  478.                 printf ("t%-18sn", addrBuf);
  479.                 }
  480.             }
  481.         else
  482.             printf ("tnone specified.n");
  483.         }
  484.     if (pDhcpcParam->lpr_server != NULL)
  485.         {
  486.         printf ("Client line printer servers:n");
  487.         if (pDhcpcParam->lpr_server->addr != NULL)
  488.             {
  489.             for (loop = 0; loop < pDhcpcParam->lpr_server->num; loop++)
  490.                 {
  491.                 inet_ntoa_b (pDhcpcParam->lpr_server->addr [loop], addrBuf);
  492.                 printf ("t%-18sn", addrBuf);
  493.                 }
  494.             }
  495.         else
  496.             printf ("tnone specified.n");
  497.         }
  498.     if (pDhcpcParam->impress_server != NULL)
  499.         {
  500.         printf ("Client impress servers:n");
  501.         if (pDhcpcParam->impress_server->addr != NULL)
  502.             {
  503.             for (loop = 0; loop < pDhcpcParam->impress_server->num; loop++)
  504.                 {
  505.                 inet_ntoa_b (pDhcpcParam->impress_server->addr [loop],
  506.                              addrBuf);
  507.                 printf ("t%-18sn", addrBuf);
  508.                 }
  509.             }
  510.         else
  511.             printf ("tnone specified.n");
  512.         }
  513.     if (pDhcpcParam->rls_server != NULL)
  514.         {
  515.         printf ("Client resource location servers:n");
  516.         if (pDhcpcParam->rls_server->addr != NULL)
  517.             {
  518.             for (loop = 0; loop < pDhcpcParam->rls_server->num; loop++)
  519.                 {
  520.                 inet_ntoa_b (pDhcpcParam->rls_server->addr [loop], addrBuf);
  521.                 printf ("t%-18sn", addrBuf);
  522.                 }
  523.             }
  524.         else
  525.             printf ("tnone specified.n");
  526.         }
  527.     if (pDhcpcParam->nis_server != NULL)
  528.         {
  529.         printf ("Client NIS servers:n");
  530.         if (pDhcpcParam->nis_server->addr != NULL)
  531.             {
  532.             for (loop = 0; loop < pDhcpcParam->nis_server->num; loop++)
  533.                 {
  534.                 inet_ntoa_b (pDhcpcParam->nis_server->addr [loop], addrBuf);
  535.                 printf ("t%-18sn", addrBuf);
  536.                 }
  537.             }
  538.         else
  539.             printf ("tnone specified.n");
  540.         }
  541.     if (pDhcpcParam->ntp_server != NULL)
  542.         {
  543.         printf ("Client NTP servers:n");
  544.         if (pDhcpcParam->ntp_server->addr != NULL)
  545.             {
  546.             for (loop = 0; loop < pDhcpcParam->ntp_server->num; loop++)
  547.                 {
  548.                 inet_ntoa_b (pDhcpcParam->ntp_server->addr [loop], addrBuf);
  549.                 printf ("t%-18sn", addrBuf);
  550.                 }
  551.             }
  552.         else
  553.             printf ("tnone specified.n");
  554.         }
  555.     if (pDhcpcParam->nbn_server != NULL)
  556.         {
  557.         printf ("Client NetBIOS name servers:n");
  558.         if (pDhcpcParam->nbn_server->addr != NULL)
  559.             {
  560.             for (loop = 0; loop < pDhcpcParam->nbn_server->num; loop++)
  561.                 {
  562.                 inet_ntoa_b (pDhcpcParam->nbn_server->addr [loop], addrBuf);
  563.                 printf ("t%-18sn", addrBuf);
  564.                 }
  565.             }
  566.         else
  567.             printf ("tnone specified.n");
  568.         }
  569.     if (pDhcpcParam->nbdd_server != NULL)
  570.         {
  571.         printf ("Client NetBIOS datagram distribution servers:n");
  572.         if (pDhcpcParam->nbdd_server->addr != NULL)
  573.             {
  574.             for (loop = 0; loop < pDhcpcParam->nbdd_server->num; loop++)
  575.                 {
  576.                 inet_ntoa_b (pDhcpcParam->nbdd_server->addr [loop], addrBuf);
  577.                 printf ("t%-18sn", addrBuf);
  578.                 }
  579.             }
  580.         else
  581.             printf ("tnone specified.n");
  582.         }
  583.     if (pDhcpcParam->xfont_server != NULL)
  584.         {
  585.         printf ("Client X Window System font servers:n");
  586.         if (pDhcpcParam->xfont_server->addr != NULL)
  587.             {
  588.             for (loop = 0; loop < pDhcpcParam->xfont_server->num; loop++)
  589.                 {
  590.                 inet_ntoa_b (pDhcpcParam->xfont_server->addr [loop], addrBuf);
  591.                 printf ("t%-18sn", addrBuf);
  592.                 }
  593.             }
  594.         else
  595.             printf ("tnone specified.n");
  596.         }
  597.     if (pDhcpcParam->xdisplay_manager != NULL)
  598.         {
  599.         printf ("Available X Window Display Manager systems:n");
  600.         if (pDhcpcParam->xdisplay_manager->addr != NULL)
  601.             {
  602.             for (loop = 0; loop < pDhcpcParam->xdisplay_manager->num; loop++)
  603.                {
  604.                inet_ntoa_b (pDhcpcParam->xdisplay_manager->addr[loop],
  605.                             addrBuf);
  606.                printf ("t%-18sn", addrBuf);
  607.                }
  608.             }
  609.         else
  610.             printf ("tnone specified.n");
  611.         }
  612.     if (pDhcpcParam->nisp_server != NULL)
  613.         {
  614.         printf ("Available NIS+ servers:n");
  615.         if (pDhcpcParam->nisp_server->addr != NULL)
  616.             {
  617.             for (loop = 0; loop < pDhcpcParam->nisp_server->num; loop++)
  618.                 {
  619.                 inet_ntoa_b (pDhcpcParam->nisp_server->addr [loop], addrBuf);
  620.                 printf ("t%-18sn", addrBuf);
  621.                 }
  622.             }
  623.         else
  624.             printf ("tnone specified.n");
  625.         }
  626.     if (pDhcpcParam->mobileip_ha != NULL)
  627.         {
  628.         printf ("Available mobile IP home agents:n");
  629.         if (pDhcpcParam->mobileip_ha->addr != NULL)
  630.             {
  631.             for (loop = 0; loop < pDhcpcParam->mobileip_ha->num; loop++)
  632.                 {
  633.                 inet_ntoa_b (pDhcpcParam->mobileip_ha->addr [loop], addrBuf);
  634.                 printf ("t%-18sn", addrBuf);
  635.                 }
  636.             }
  637.         else
  638.             printf ("tnone specified.n");
  639.         }
  640.     if (pDhcpcParam->smtp_server != NULL)
  641.         {
  642.         printf ("Available SMTP servers:n");
  643.         if (pDhcpcParam->smtp_server->addr != NULL)
  644.             {
  645.             for (loop = 0; loop < pDhcpcParam->smtp_server->num; loop++)
  646.                 {
  647.                 inet_ntoa_b (pDhcpcParam->smtp_server->addr [loop], addrBuf);
  648.                 printf ("t%-18sn", addrBuf);
  649.                 }
  650.             }
  651.         else
  652.             printf ("tnone specified.n");
  653.         }
  654.     if (pDhcpcParam->pop3_server != NULL)
  655.         {
  656.         printf ("Available POP3 servers:n");
  657.         if (pDhcpcParam->pop3_server->addr != NULL)
  658.             {
  659.             for (loop = 0; loop < pDhcpcParam->pop3_server->num; loop++)
  660.                 {
  661.                 inet_ntoa_b (pDhcpcParam->pop3_server->addr [loop], addrBuf);
  662.                 printf ("t%-18sn", addrBuf);
  663.                 }
  664.             }
  665.         else
  666.             printf ("tnone specified.n");
  667.         }
  668.     if (pDhcpcParam->nntp_server != NULL)
  669.         {
  670.         printf ("Available NNTP servers:n");
  671.         if (pDhcpcParam->nntp_server->addr != NULL)
  672.             {
  673.             for (loop = 0; loop < pDhcpcParam->nntp_server->num; loop++)
  674.                 {
  675.                 inet_ntoa_b (pDhcpcParam->nntp_server->addr [loop], addrBuf);
  676.                 printf ("t%-18sn", addrBuf);
  677.                 }
  678.             }
  679.         else
  680.             printf ("tnone specified.n");
  681.         }
  682.     if (pDhcpcParam->dflt_www_server != NULL)
  683.         {
  684.         printf ("Available World Wide Web servers:n");
  685.         if (pDhcpcParam->dflt_www_server->addr != NULL)
  686.             {
  687.             for (loop = 0; loop < pDhcpcParam->dflt_www_server->num; loop++)
  688.                 {
  689.                 inet_ntoa_b (pDhcpcParam->dflt_www_server->addr [loop],
  690.                              addrBuf);
  691.                 printf ("t%-18sn", addrBuf);
  692.                 }
  693.             }
  694.         else
  695.             printf ("tnone specified.n");
  696.         }
  697.     if (pDhcpcParam->dflt_finger_server != NULL)
  698.         {
  699.         printf ("Available Finger servers:n");
  700.         if (pDhcpcParam->dflt_finger_server->addr != NULL)
  701.             {
  702.             for (loop = 0; loop < pDhcpcParam->dflt_finger_server->num; loop++)
  703.                 {
  704.                 inet_ntoa_b (pDhcpcParam->dflt_finger_server->addr [loop],
  705.                              addrBuf);
  706.                 printf ("t%-18sn", addrBuf);
  707.                 }
  708.             }
  709.         else
  710.             printf ("tnone specified.n");
  711.         }
  712.     if (pDhcpcParam->dflt_irc_server != NULL)
  713.         {
  714.         printf ("Available IRC servers:n");
  715.         if (pDhcpcParam->dflt_irc_server->addr != NULL)
  716.             {
  717.             for (loop = 0; loop < pDhcpcParam->dflt_irc_server->num; loop++)
  718.                 {
  719.                 inet_ntoa_b (pDhcpcParam->dflt_irc_server->addr [loop],
  720.                              addrBuf);
  721.                 printf ("t%-18sn", addrBuf);
  722.                 }
  723.             }
  724.         else
  725.             printf ("tnone specified.n");
  726.         }
  727.     if (pDhcpcParam->streettalk_server != NULL)
  728.         {
  729.         printf ("Available StreetTalk servers:n");
  730.         if (pDhcpcParam->streettalk_server->addr != NULL)
  731.             {
  732.             for (loop = 0; loop < pDhcpcParam->streettalk_server->num; loop++)
  733.                 {
  734.                 inet_ntoa_b (pDhcpcParam->streettalk_server->addr [loop],
  735.                              addrBuf);
  736.                 printf ("t%-18sn", addrBuf);
  737.                 }
  738.             }
  739.         else
  740.             printf ("tnone specified.n");
  741.         }
  742.     if (pDhcpcParam->stda_server != NULL)
  743.         {
  744.         printf ("Available StreetTalk Directory Assistance servers:n");
  745.         if (pDhcpcParam->stda_server->addr != NULL)
  746.             {
  747.             for (loop = 0; loop < pDhcpcParam->stda_server->num; loop++)
  748.                 {
  749.                 inet_ntoa_b (pDhcpcParam->stda_server->addr [loop], addrBuf);
  750.                 printf ("t%-18sn", addrBuf);
  751.                 }
  752.             }
  753.         else
  754.             printf ("tnone specified.n");
  755.         }
  756.     /* Print any multiple IP address pairs.  */
  757.     if (pDhcpcParam->policy_filter != NULL)
  758.         {
  759.         printf ("Client policy filters:n");
  760.         if (pDhcpcParam->policy_filter->addr != NULL)
  761.             {
  762.             printf ("Destination        Subnet maskn");
  763.             printf ("-----------        -----------n");
  764.             for (loop = 0; loop < pDhcpcParam->policy_filter->num; loop++)
  765.                {
  766.                inet_ntoa_b (pDhcpcParam->policy_filter->addr[loop * 2],
  767.                             addrBuf);
  768.                printf ("%-18s ", addrBuf);
  769.                inet_ntoa_b (pDhcpcParam->policy_filter->addr[loop * 2 + 1],
  770.                             addrBuf);
  771.                printf ("%-18sn", addrBuf);
  772.                }
  773.             }
  774.         else
  775.             printf ("tnone specified.n");
  776.         }
  777.     if (pDhcpcParam->static_route != NULL)
  778.         {
  779.         printf ("Client static routes:n");
  780.         if (pDhcpcParam->static_route->addr != NULL)
  781.             {
  782.             printf ("Destination        Router IPn");
  783.             printf ("-----------        ---------n");
  784.             for (loop = 0; loop < pDhcpcParam->static_route->num; loop++)
  785.                 {
  786.                 inet_ntoa_b (pDhcpcParam->static_route->addr [loop * 2],
  787.                              addrBuf);
  788.                 printf ("%-18s ", addrBuf);
  789.                 inet_ntoa_b (pDhcpcParam->static_route->addr [loop * 2 + 1],
  790.                              addrBuf);
  791.                 printf ("%-18sn", addrBuf);
  792.                 }
  793.             }
  794.         else
  795.             printf ("tnone specified.n");
  796.         }
  797.     /* Print any lists.  */
  798.     if (pDhcpcParam->vendlist != NULL)
  799.         {
  800.         printf ("Vendor-specific data:n ");
  801.         if (pDhcpcParam->vendlist->list != NULL)
  802.             {
  803.             for (loop = 0; loop < pDhcpcParam->vendlist->len; loop++)
  804.                 printf("%d ", pDhcpcParam->vendlist->list [loop]);
  805.             printf("n");
  806.             }
  807.         else
  808.             printf ("none specified.n");
  809.         }
  810.     return (OK);
  811.     }