Files
m241Neelima/components/ip_net2-6.9/ipappl/src/ipdhcpc_cmd_dhcpc.c
T
2026-07-30 11:19:44 +05:30

576 lines
16 KiB
C

/*
******************************************************************************
* INTERPEAK SOURCE FILE
*
*
* INTERPEAK_COPYRIGHT_STRING
*
* Design and implementation by Zhangqing Luo <Zhangqing.luo@windriver.com>
******************************************************************************
*/
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
#include "ipdhcpc_config.h"
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#ifdef IPDHCPC_INCLUDE_CMD
#define IPCOM_USE_CLIB_PROTO
#include <ipcom.h>
#include <ipcom_cstyle.h>
#include <ipcom_time.h>
#include <ipcom_err.h>
#include <ipcom_getopt.h>
#include <ipcom_inet.h>
#include <ipcom_os.h>
#include <ipcom_shell.h>
#include <ipcom_sock.h>
#include <ipcom_syslog.h>
#include <ipcom_tmo2.h>
#include <ipcom_type.h>
#include "ipdhcpc_h.h"
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
#define IPDHCPC_MAX_CMD (sizeof(ipdhcpc_cmd_callback)/sizeof(Ipdhcpc_cmd_cb))
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
typedef struct Ipdhcpc_cmd_cb_struct
{
char* cmd;
Ip_err(*cmd_cb)(int argc, char *argv[]);
}
Ipdhcpc_cmd_cb;
/*
****************************************************************************
* 6 EXTERN PROTOTYPES
****************************************************************************
*/
IP_EXTERN Ipdhcpc_data ipdhcpc;
/*
****************************************************************************
* 7 LOCAL PROTOTYPES
****************************************************************************
*/
IP_STATIC void ipdhcpc_printf (const char *format, /*args*/ ...);
IP_STATIC void ipdhcpc_errmsg_print (Ip_err code);
IP_STATIC void ipdhcpc_state_print (int state);
IP_STATIC void ipdhcpc_cmd_print_usage (void);
IP_STATIC Ip_err ipdhcpc_handle_cmd_renew (int argc, char *argv[]);
IP_STATIC Ip_err ipdhcpc_handle_cmd_inform (int argc, char *argv[]);
IP_STATIC Ip_err ipdhcpc_handle_cmd_interface (int argc, char *argv[]);
IP_STATIC Ip_err ipdhcpc_handle_cmd_lease (int argc, char *argv[]);
/*
****************************************************************************
* 8 DATA
****************************************************************************
*/
/*
*===========================================================================
* ipdhcpc_cmd_cb
*===========================================================================
* Description: Ipdhcpc command callback struct.
*/
IP_STATIC Ipdhcpc_cmd_cb ipdhcpc_cmd_callback[] =
{
{
"renew",
ipdhcpc_handle_cmd_renew
},
{
"inform",
ipdhcpc_handle_cmd_inform
},
{
"lease",
ipdhcpc_handle_cmd_lease
},
{
"interface",
ipdhcpc_handle_cmd_interface
}
};
/*
****************************************************************************
* 9 STATIC FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipdhcpc_printf
*===========================================================================
* Description: Format and print the message.
* Parameters: message formatted
* Returns: -
*
*/
IP_STATIC void
ipdhcpc_printf (const char *format, /*args*/ ...)
{
char *buf;
va_list ap;
Ip_s32 retval;
buf = ipcom_malloc(IPCOM_STDIO_BUFSIZE);
ip_assert(buf);
va_start(ap, format);
retval = ipcom_vsnprintf(buf, IPCOM_STDIO_BUFSIZE, format, ap);
retval = IP_MIN(retval, (int) IPCOM_STDIO_BUFSIZE);
va_end(ap);
if(retval > 0)
{
(void)ipcom_printf(buf);
}
ipcom_free(buf);
}
/*
*===========================================================================
* ipdhcpc_errmsg_print
*===========================================================================
* Description: Prints error messages in clear text.
* Parameters: code - error code
* Returns: -
*
*/
IP_STATIC void
ipdhcpc_errmsg_print(Ip_err code)
{
switch(code)
{
case IPCOM_ERR_INVALID_ARG:
ipdhcpc_printf("failed :: invalid argument"IP_LF);
break;
case IPCOM_ERR_INVALID_CONFIG:
ipdhcpc_printf("failed :: invalid config"IP_LF);
break;
case IPCOM_ERR_NOT_FOUND:
ipdhcpc_printf("failed :: not found"IP_LF);
break;
case IPCOM_ERR_NO_MEMORY:
ipdhcpc_printf("failed :: out of memory"IP_LF);
break;
case IPCOM_ERR_ALREADY_INSTALLED:
ipdhcpc_printf("failed :: already exists"IP_LF);
break;
case IPCOM_ERR_NOT_OPENED:
ipdhcpc_printf("failed :: ipdhcpc not open"IP_LF);
break;
case IPCOM_ERR_PERMISSION_DENIED:
ipdhcpc_printf("failed :: not allowed"IP_LF);
break;
case IPCOM_ERR_ALREADY_STARTED:
ipdhcpc_printf ("failed::already in processing");
break;
default:
break;
}
}
/*
*===========================================================================
* ipdhcpc_state_print
*===========================================================================
* Description: Prints state of the dhcp
* Parameters: state code
* Returns: -
*
*/
IP_STATIC void
ipdhcpc_state_print (int state)
{
switch(state)
{
case IPDHCPC_STATE_INIT:
ipdhcpc_printf(" State: Init"IP_LF);
break;
case IPDHCPC_STATE_INIT_REBOOT:
ipdhcpc_printf(" State: Init reboot"IP_LF);
break;
case IPDHCPC_STATE_SELECTING:
ipdhcpc_printf(" State: Selecting"IP_LF);
break;
case IPDHCPC_STATE_REBOOTING:
ipdhcpc_printf(" State: Rebooting"IP_LF);
break;
case IPDHCPC_STATE_REQUESTING:
ipdhcpc_printf(" State: Requesting"IP_LF);
break;
case IPDHCPC_STATE_BOUND:
ipdhcpc_printf(" State: Bound"IP_LF);
break;
case IPDHCPC_STATE_RENEWING:
ipdhcpc_printf(" State: Renewing"IP_LF);
break;
case IPDHCPC_STATE_REBINDING:
ipdhcpc_printf(" State: Rebinding"IP_LF);
break;
case IPDHCPC_STATE_STOPPED:
ipdhcpc_printf(" State: Stopped"IP_LF);
break;
case IPDHCPC_STATE_INFORMING:
ipdhcpc_printf(" State: Informing"IP_LF);
break;
default:
break;
}
}
/*
*===========================================================================
* ipdhcpc_handle_cmd_renew
*===========================================================================
* Description: Handles the renew command.
* Parameters: argc - number of command line arguments
* argv - array of command line arguments
*
* Returns: IPCOM_SUCCESS - the operation was successful
* IPCOM_ERR... - failed
*
*/
IP_STATIC Ip_err
ipdhcpc_handle_cmd_renew (int argc, char *argv[])
{
Ip_err retval = IPCOM_SUCCESS;
if (argc<1)
IPDHCPC_LEAVE(IPCOM_ERR_INVALID_ARG);
/*got the interface name*/
retval = ipdhcpc_renew_get (argv[0]);
ipdhcpc_printf(IP_LF);
ipdhcpc_errmsg_print(retval);
leave:
return retval;
}
/*
*===========================================================================
* ipdhcpc_handle_cmd_inform
*===========================================================================
* Description: Handles the inform command.
* Parameters: argc - number of command line arguments
* argv - array of command line arguments
*
* Returns: IPCOM_SUCCESS - the operation was successful
* IPCOM_ERR... - failed
*
*/
IP_STATIC Ip_err
ipdhcpc_handle_cmd_inform (int argc, char *argv[])
{
Ip_err retval = IPCOM_SUCCESS;
if (argc<1)
IPDHCPC_LEAVE(IPCOM_ERR_INVALID_ARG);
retval = ipdhcpc_inform_get (argv[0], argv[1]);
ipdhcpc_printf(IP_LF);
ipdhcpc_errmsg_print(retval);
leave:
return retval;
}
/*
*===========================================================================
* ipdhcpc_handle_cmd_interface
*===========================================================================
* Description: Handles the interface command.
* Parameters: argc - number of command line arguments
* argv - array of command line arguments
*
* Returns: IPCOM_SUCCESS - the operation was successful
* IPCOM_ERR... - failed
*
*/
IP_STATIC Ip_err
ipdhcpc_handle_cmd_interface (int argc, char *argv[])
{
Ip_err retval = IPCOM_SUCCESS;
Ipdhcpc_if *ift = IP_NULL;
(void)argc;
if (ipcom_strcmp ("list", argv[0])==0)
{
char * status = IP_NULL;
int i = 0;
IPDHCPC_LOCK();
/*show all interfaces status*/
for (ift = ipdhcpc.ift_head; ift != IP_NULL; ift = ift->next)
{
ipdhcpc_printf (""IP_LF);
ipdhcpc_printf ("Details about interface"IP_LF);
ipdhcpc_printf (" Name: %s"IP_LF, ift->ifname);
ipdhcpc_printf (" Index: %d"IP_LF,ift->ifindex);
ipdhcpc_printf (" HWaddr: ");
for (;i<ift->hlen-1; i++)
ipdhcpc_printf ("%x%x:",ift->chaddr[i]>>4, ift->chaddr[i]&0xf);
ipdhcpc_printf ("%x%x",ift->chaddr[i]>>4, ift->chaddr[i]&0xf);
ipdhcpc_printf (IP_LF);
status = ift->isdown?"Down":"Up";
ipdhcpc_printf (" Status: %s"IP_LF,status);
status = ift->information_only?"Enabled":"Disabled";
ipdhcpc_printf (" Information Only:%s"IP_LF,status);
if (ift->handle != IP_NULL)
/*show state*/
ipdhcpc_state_print (ift->handle->priv->state);
ipdhcpc_printf (""IP_LF);
}
IPDHCPC_UNLOCK();
}
else
retval = IPCOM_ERR_INVALID_ARG;
ipdhcpc_printf (IP_LF);
ipdhcpc_errmsg_print (retval);
return retval;
}
/*
*===========================================================================
* ipdhcpc_handle_cmd_lease
*===========================================================================
* Description: Handles the lease command.
* Parameters: argc - number of command line arguments
* argv - array of command line arguments
*
* Returns: IPCOM_SUCCESS - the operation was successful
* IPCOM_ERR... - failed
*
*/
IP_STATIC Ip_err
ipdhcpc_handle_cmd_lease (int argc, char *argv[])
{
Ip_err retval = IPCOM_SUCCESS;
Ipdhcpc_if *ift = IP_NULL;
struct Ip_in_addr addr;
(void)argc;
if (ipcom_strcmp ("list", argv[0])==0)
{
IPDHCPC_LOCK();
for (ift = ipdhcpc.ift_head; ift != IP_NULL; ift = ift->next)
{
if (ift->information_only == IP_TRUE)
{
ipdhcpc_printf (IP_LF);
ipdhcpc_printf (" Interface %s is in INFORMATION_ONLY MODE, no lease from server"IP_LF, ift->ifname);
}
else if (ift->handle != IP_NULL)
{
if (ift->handle->priv->state>=IPDHCPC_STATE_BOUND)
{
ipdhcpc_printf (""IP_LF);
ipdhcpc_printf ("Lease:"IP_LF);
ipdhcpc_printf (" Index: %d"IP_LF, ift->ifindex);
addr.s_addr = ift->handle->info.ipaddr_n;
ipdhcpc_printf (" Client address: %s"IP_LF, ipcom_inet_ntoa(addr));
addr.s_addr = ift->handle->info.serveraddr_n;
ipdhcpc_printf (" Server address: %s"IP_LF,ipcom_inet_ntoa(addr));
ipdhcpc_printf (" Duration: %ds"IP_LF, ift->lease.tlease);
ipdhcpc_printf (""IP_LF);
}
else
{
ipdhcpc_printf (IP_LF);
ipdhcpc_printf ("Performing dhcp");
ipdhcpc_state_print (ift->handle->priv->state);
}
}
else
ipdhcpc_printf ("Not started"IP_LF);
}
IPDHCPC_UNLOCK();
}
else
retval = IPCOM_ERR_INVALID_ARG;
ipdhcpc_printf (IP_LF);
ipdhcpc_errmsg_print (retval);
return retval;
}
/*
*===========================================================================
* ipdhcpc_cmd_print_usage
*===========================================================================
* Description: Prints the documentation for the command.
* Parameters:
* Returns: IPCOM_SUCCESS - the operation was successful
*
*
*/
IP_STATIC void
ipdhcpc_cmd_print_usage(void)
{
ipdhcpc_printf (IP_LF);
ipdhcpc_printf ("NAME" IP_LF);
ipdhcpc_printf (" dhcpc - Control Interpeak DHCP client"IP_LF);
ipdhcpc_printf (IP_LF);
ipdhcpc_printf ("SYNOPSIS" IP_LF);
ipdhcpc_printf (" dhcpc renew {name}"IP_LF);
ipdhcpc_printf (" dhcpc inform {name} [addr] "IP_LF);
ipdhcpc_printf (" dhcpc lease list "IP_LF);
ipdhcpc_printf (" dhcpc interface list"IP_LF);
ipdhcpc_printf (IP_LF);
ipdhcpc_printf ("DESCRIPTION" IP_LF);
ipdhcpc_printf (" renew Trigger renew event manually."IP_LF);
ipdhcpc_printf (" inform Trigger INFORM message. if no address set, select primary address as default"IP_LF);
ipdhcpc_printf (" lease List current data in lease database."IP_LF);
ipdhcpc_printf (" interface List interfaces used by the dhcp client."IP_LF);
ipdhcpc_printf (IP_LF);
ipdhcpc_printf ("EXAMPLES" IP_LF);
ipdhcpc_printf (" dhcpc renew eth0"IP_LF);
ipdhcpc_printf (" dhcpc inform eth0 128.224.158.82"IP_LF);
ipdhcpc_printf (" dhcpc inform eth0"IP_LF);
ipdhcpc_printf (" dhcpc lease list"IP_LF);
ipdhcpc_printf (" dhcpc interface list"IP_LF);
}
/*
****************************************************************************
* 10 GLOBAL FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipdhcpc_cmd_dhcpc
*===========================================================================
* Description: Shell command used to start,stop and configure the DHCP
* server.
* Parameters: argc - The number of arguments passed to the command.
* argv - The arguments passed to the command.
* Returns: 0 = success,
*
*/
IP_GLOBAL int
ipdhcpc_cmd_dhcpc(int argc, char **argv)
{
Ip_err retval;
int i;
retval = IPCOM_ERR_INVALID_ARG;
if(argc < 2)
IPDHCPC_LEAVE(IPCOM_ERR_INVALID_ARG);
for(i = 0; i < (int)IPDHCPC_MAX_CMD; i++)
{
if(ipcom_strcmp(argv[1], ipdhcpc_cmd_callback[i].cmd) == 0)
{
retval = ipdhcpc_cmd_callback[i].cmd_cb(argc-2, &argv[2]);
break;
}
}
leave:
if(retval == IPCOM_ERR_INVALID_ARG)
ipdhcpc_cmd_print_usage();
return retval;
}
/*
****************************************************************************
* 11 PUBLIC FUNCTIONS
****************************************************************************
*/
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/
/* #ifdef IPDHCPC_INCLUDE_CMD */
#endif