tw_cli_ping.c.svn-base
上传用户:hujq123
上传日期:2016-04-10
资源大小:153k
文件大小:6k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* 
  2.  * Copyright (C) 2002 Koninklijke Philips Electronics N.V., 
  3.  * All Rights Reserved. 
  4.  *
  5.  * This source code and any compilation or derivative thereof is the 
  6.  * proprietary information of Koninklijke Philips Electronics N.V. 
  7.  * and is confidential in nature. 
  8.  * Under no circumstances is this software to be exposed to or placed 
  9.  * under an Open Source License of any type without the expressed 
  10.  * written permission of Koninklijke Philips Electronics N.V. 
  11.  * 
  12.  *###########################################################
  13.  */ 
  14. /*! 
  15.  *      file           tw_cli_ping.c 
  16.  * 
  17.  *      brief          - 
  18.  * 
  19.  */ 
  20. /*-----------------------------------------------------------*
  21.  * 
  22.  *      %version:       4 % 
  23.  *      instance:       DS_6 
  24.  *      %date_created:  Fri Feb 21 08:04:56 2003 % 
  25.  *
  26.  *###########################################################
  27.  */ 
  28. #include <stdlib.h>
  29. #include <stdio.h>
  30. #include <stdarg.h>
  31. #include <string.h>
  32. #include <socket_app.h>
  33. #include <tm_common.h>
  34. #include <tw_cli.h>
  35. #include <ctype.h>
  36. #include <sys_conf.h>
  37. #include <arpa/inet.h>
  38.       
  39. /* #define PING_DEBUG */
  40. #define MAX_PING_PARAMS     8
  41. #define MAX_PING_TIMEOUT    400
  42. #define MAX_PING_SIZE       528
  43. typedef char PingParam_t[64];
  44. static PingParam_t PingParamList[MAX_PING_PARAMS];
  45. static char PingBuffer[MAX_PING_SIZE];
  46. static int CliCoProc_Ping (Cli_cmdSession_t *pSess, char *CmdStr, int Ptr);
  47. Cli_CmdStruct_t  CliRco_Ping = 
  48.     "ping",
  49.     ALL_ACCESS_MODE | ALL_PRODUCT_TYPE,
  50.     NULL,
  51.     "Send ICMP Echo Request to host",
  52.     NULL,
  53.     NULL,
  54.     CliCoProc_Ping,
  55. };
  56. static void GetDottedIP(char *strbuf, UInt8 *IPAddr)
  57. {
  58.   int i;
  59.   UInt8 byteval;
  60.   for (i = 0; (i < 4); i++)
  61.   {
  62.     byteval = 0;
  63.     while (isdigit(*strbuf))
  64.     {
  65.       byteval = (byteval * 10) + (*strbuf - '0');
  66.       strbuf++;
  67.     }
  68.     IPAddr[i] = byteval;
  69.     if (*strbuf == '.')
  70.     {
  71.         strbuf++;
  72.     }
  73.   }
  74. }
  75. /************************************************************************
  76. *
  77. * iadk_ping - Send an echo request to a host.
  78. *
  79. * Globals:
  80. *   None
  81. *
  82. * Returns:
  83. *   int - 0 if no error, -1 otherwise.
  84. *
  85. * Description:
  86. *   Send an echo request to a host. Each TCP/IP stack seems to have 
  87. *   their own favorite API for this so we combine them here.
  88. *
  89. * Notes:
  90. *   None
  91. *
  92. * History:
  93. *   10/25/01    FD     Created.
  94. *
  95. ************************************************************************/
  96. int iadk_ping (UInt8 *IPAddress, char *RequestBuffer, 
  97.                UInt32 RequestLength,
  98.                UInt32 RequestTimeout,
  99.                UInt32 *Resptime,
  100.                UInt32 *EchoResult)
  101. {
  102.     int  result;
  103.     *EchoResult = 1;
  104.     result = tw_ping (IPAddress, RequestBuffer, RequestLength,
  105.                RequestTimeout,
  106.                Resptime);
  107.                
  108.     if (result < 0)
  109.         result = -1;
  110.     else
  111.         result = 0;
  112.     return result;
  113. }
  114. static int CliCoProc_Ping(Cli_cmdSession_t *pSess, char *CmdStr, int Ptr)
  115. {
  116.     int i;
  117.     int sts;
  118.     int FieldCount;
  119.     int ParamIndex;
  120.     char *param;
  121.     int PingCount;
  122.     UInt32 dstaddr;
  123.     struct hostent *h;
  124.     PingParam_t hostName;
  125.     int PingSize;
  126.     UInt32 RespTime;
  127.     UInt32 EchoResult;
  128.     unsigned long interPingGap = KC_TICKS2SEC;
  129.     FieldCount = sscanf(CmdStr + Ptr,"%s %s %s %s %s %s %s %s", 
  130.                         PingParamList[0],
  131.                         PingParamList[1],
  132.                         PingParamList[2],
  133.                         PingParamList[3],
  134.                         PingParamList[4],
  135.                         PingParamList[5],
  136.                         PingParamList[6],
  137.                         PingParamList[7]);
  138. #ifdef PING_DEBUG
  139.     printf("nPING: Param Count = %dn", FieldCount-1);
  140. #endif
  141. /*
  142.     First we'll set up all of our defaults, then let's process 
  143.     all these options
  144. */
  145.     PingCount = 3;
  146.     PingSize = 64;
  147.     for (i = 0; (i < FieldCount); i++)
  148.     {
  149.         param = (char *)&PingParamList[i];
  150. #ifdef PING_DEBUG
  151.         printf("Parameter[%d] = [%s]n", i, param);
  152. #endif
  153.         if (param[0] == '-')
  154.         {
  155.             if (param[1] == 'c')
  156.             {
  157.                 PingCount = atoi(PingParamList[++i]);
  158.                 /* i += 1;  */
  159.             }
  160.             if (param[1] == 's')
  161.             {
  162.                 PingSize = atoi(PingParamList[++i]);
  163.             }
  164.             if (param[1] == 't')
  165.             {
  166.                 interPingGap = (unsigned long) atoi(PingParamList[++i]);
  167.             }
  168.             continue;
  169.         }
  170.         /* we got a hostname, we done */
  171.         strcpy(hostName,param);
  172.         break;
  173.     }
  174.     if (PingSize > MAX_PING_SIZE)
  175.     {
  176.         PingSize = MAX_PING_SIZE;
  177.     }
  178.     Cli_Printf(pSess,
  179.         "pinging %s %d times with packet of size %d with %d ticks betweenn",
  180.         hostName,PingCount,PingSize,interPingGap);
  181.     for (i = 0; (i < PingCount); i++)
  182.     {
  183.         if ((dstaddr = inet_addr(hostName)) == (unsigned int)-1)
  184.         {
  185. /*
  186.             h = gethostbyname(hostName);
  187.             if(h)
  188.             {
  189.                 memcpy(&dstaddr, h->h_addr, sizeof(dstaddr));
  190.             }
  191.             else*/
  192.             {
  193.                 Cli_Printf(pSess,"PING: bad hostnamen");
  194.                 return 0;
  195.             }
  196.         }
  197.         sts = iadk_ping((UInt8 *)&dstaddr, &PingBuffer[0], PingSize,
  198.                       MAX_PING_TIMEOUT, &RespTime, &EchoResult);
  199.         Cli_Printf(pSess, "sts=%d, EchoResult=%dn", sts, EchoResult);
  200.         if (EchoResult)
  201.         {
  202.             if (sts > 0)
  203.             {
  204.                 unsigned char *p = (unsigned char *) &dstaddr;
  205.                 Cli_Printf(pSess, "Reply from %d.%d.%d.%d bytes = %d " 
  206.                            "time = %d msn", p[0], p[1], p[2], p[3],
  207.                            sts, RespTime);
  208.             }
  209.             else if (sts == 0)
  210.             {
  211.                 Cli_Printf(pSess, "Request Timed Outn");
  212.             }
  213.         }
  214.         tm_wkafter(interPingGap);
  215.     }
  216.     return 0;
  217. }