--- libaitcli/src/aitcli.c 2010/06/07 09:04:46 1.2.2.5 +++ libaitcli/src/aitcli.c 2010/06/07 11:32:50 1.2.2.6 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcli.c,v 1.2.2.5 2010/06/07 09:04:46 misho Exp $ +* $Id: aitcli.c,v 1.2.2.6 2010/06/07 11:32:50 misho Exp $ * *************************************************************************/ #include "global.h" @@ -436,6 +436,114 @@ cli_BindKey(bindkey_t * __restrict key, linebuffer_t * } return RETCODE_OK; +} + + +/* + * cli_addCommand() Add command to CLI session + * @buffer = CLI buffer + * @csCmd = Command name + * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * @funcCmd = Callback function when user call command + * @csInfo = Inline information for command + * @csHelp = Help line when call help + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int +cli_addCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel, cmd_func_t funcCmd, + const char *csInfo, const char *csHelp) +{ + struct tagCommand *cmd; + + if (!buffer || !csCmd || !funcCmd) { + cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); + return RETCODE_ERR; + } + + cmd = malloc(sizeof(struct tagCommand)); + if (!cmd) { + LOGERR; + return RETCODE_ERR; + } else + memset(cmd, 0, sizeof(struct tagCommand)); + + cmd->cmd_level = cliLevel; + cmd->cmd_func = funcCmd; + cmd->cmd_len = strlcpy(cmd->cmd_name, csCmd, STRSIZ); + if (csInfo) + strlcpy(cmd->cmd_info, csInfo, STRSIZ); + if (csHelp) + strlcpy(cmd->cmd_help, csHelp, STRSIZ); + SLIST_INSERT_HEAD(&buffer->line_cmds, cmd, cmd_next); + return RETCODE_OK; +} + +/* + * cli_delCommand() Delete command from CLI session + * @buffer = CLI buffer + * @csCmd = Command name + * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int +cli_delCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel) +{ + struct tagCommand *cmd; + int ret = RETCODE_OK; + + if (!buffer || !csCmd) { + cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); + return RETCODE_ERR; + } + + SLIST_FOREACH(cmd, &buffer->line_cmds, cmd_next) + if (cmd->cmd_level == cliLevel && !strcmp(cmd->cmd_name, csCmd)) { + ret = 1; + SLIST_REMOVE(&buffer->line_cmds, cmd, tagCommand, cmd_next); + free(cmd); + break; + } + + return ret; +} + +/* + * cli_updCommand() Update command in CLI session + * @buffer = CLI buffer + * @csCmd = Command name + * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * @funcCmd = Callback function when user call command + * @csInfo = Inline information for command + * @csHelp = Help line when call help + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int +cli_updCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel, cmd_func_t funcCmd, + const char *csInfo, const char *csHelp) +{ + struct tagCommand *cmd; + int ret = RETCODE_OK; + + if (!buffer || !csCmd) { + cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); + return RETCODE_ERR; + } + + SLIST_FOREACH(cmd, &buffer->line_cmds, cmd_next) + if (cmd->cmd_level == cliLevel && !strcmp(cmd->cmd_name, csCmd)) { + ret = 1; + + if (funcCmd) + cmd->cmd_func = funcCmd; + if (csInfo) + strlcpy(cmd->cmd_info, csInfo, STRSIZ); + if (csHelp) + strlcpy(cmd->cmd_help, csHelp, STRSIZ); + + break; + } + + return ret; }