--- libaitcli/inc/aitcli.h 2010/06/04 12:08:32 1.2.2.1 +++ libaitcli/inc/aitcli.h 2010/06/08 08:05:12 1.2.2.11 @@ -3,13 +3,19 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcli.h,v 1.2.2.1 2010/06/04 12:08:32 misho Exp $ +* $Id: aitcli.h,v 1.2.2.11 2010/06/08 08:05:12 misho Exp $ * *************************************************************************/ #ifndef __AITCLI_H #define __AITCLI_H +#include +#include + + +#define STRSIZ 256 + /* Key definitions */ #define K_F1 "\x1b\x4f\x50" @@ -158,6 +164,25 @@ typedef struct { } bindkey_t; +/* Commands structure for CLI */ + +typedef int (*cmd_func_t)(/*linebuffer_t **/ void * __restrict buffer, int idx, char ** __restrict args); +struct tagCommand { + int cmd_level; + + int cmd_len; + char cmd_name[STRSIZ]; + + char cmd_info[STRSIZ]; + char cmd_help[STRSIZ]; + + cmd_func_t cmd_func; + + SLIST_ENTRY(tagCommand) cmd_next; +}; +typedef SLIST_HEAD(slCommandHead, tagCommand) commands_t; + + /* Main structure, Buffer for CLI work with thread models ;-) special designed by M.Punov */ typedef struct { @@ -175,27 +200,14 @@ typedef struct { bindkey_t *line_keys; + int line_level; + commands_t line_cmds; + int line_in; int line_out; } linebuffer_t; -/* Commands structure for CLI */ -typedef int (*cmd_func_t)(linebuffer_t * __restrict buffer, int argc, char ** __restrict argv); -typedef struct { - int cmd_level; - - int cmd_min; - int cmd_len; - char cmd_name[STRSIZ]; - - char cmd_info[STRSIZ]; - char cmd_help[STRSIZ]; - - cmd_func_t *cmd_func; -} commands_t; - - /* Error support functions */ // cli_GetErrno() Get error code of last operation @@ -204,63 +216,173 @@ inline int cli_GetErrno(); inline const char *cli_GetError(); +/* CLI Helper functions */ + +/* + * cli_Cmd_Unsupported() Builtin helper function for unsupported commands + * @buffer = CLI buffer + * @idx = Selected command ID + * @args = Parsed arguments array + * return: RETCODE_OK ok +*/ +int cli_Cmd_Unsupported(void * __restrict buffer, int idx, char ** __restrict args); + + /* CLI Functions */ /* - * cliExec() Execute CLI main loop - * @cmdList = Commands list - * @csPrompt = Prompt text - * return: -1 error, 0 = exit w/^+D, 1 done. + * cli_BindKey() Bind function to key + * @key = key structure + * @buffer = CLI buffer + * return: RETCODE_ERR error, RETCODE_OK ok, >0 bind at position */ -int cliExec(cliCommands_t *cmdList, const char *csPrompt); +int cli_BindKey(bindkey_t * __restrict key, linebuffer_t * __restrict buffer); + + /* - * cliNetExec() Execute net CLI main loop - * @cmdList = Commands list - * @csPrompt = Prompt text - * @sock = client socket - * @term = stdin termios - * @win = window size of tty - * return: -1 error, 0 = exit w/^+D, 1 done. + * 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 cliNetExec(cliCommands_t *cmdList, const char *csPrompt, int sock, struct termios *term, struct winsize *win); +int +cli_addCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel, cmd_func_t funcCmd, + const char *csInfo, const char *csHelp); +/* + * 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); +/* + * 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); -/* CLI Helper functions */ +/* + * cli_addHistory() Add line to history + * @buffer = CLI buffer + * @str = Add custom text or if NULL use readed line from CLI buffer + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int cli_addHistory(linebuffer_t * __restrict buffer, const char * __restrict str); +/* + * cli_saveHistory() Save history to file + * @buffer = CLI buffer + * @histfile = History filename, if NULL will be use default name + * @lines = Maximum history lines to save + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int cli_saveHistory(linebuffer_t * __restrict buffer, const char *histfile, int lines); +/* + * cli_loadHistory() Load history from file + * @buffer = CLI buffer + * @histfile = History filename, if NULL will be use default name + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int cli_loadHistory(linebuffer_t * __restrict buffer, const char *histfile); +/* + * cli_resetHistory() Reset history search in CLI session + * @buffer = CLI buffer + * return: none +*/ +inline void cli_resetHistory(linebuffer_t * __restrict buffer); /* - * cli_Cmd_Unsupported() Builtin helper function for unsupported commands - * @cmds = Commands list - * @idx = Selected command ID - * @out = Output handle - * @args = Parsed arguments array - * return: -1 error, 0 = ok, 1 exit from Cli! + * cli_freeLine() Clear entire line + * @buffer = CLI buffer + * return: RETCODE_ERR error, RETCODE_OK ok */ -int cli_Cmd_Unsupported(void *cmds, int idx, FILE *out, char ** __restrict args); +inline int cli_freeLine(linebuffer_t * __restrict buffer); /* - * cli_Cmd_Help() Builtin helper function for Help screen - * @cmds = Commands list - * @idx = Selected command ID - * @out = Output handle - * @args = Parsed arguments array - * return: -1 error, 0 = ok + * cli_setPrompt() Set new prompt for CLI session + * @buffer = CLI buffer + * @prompt = new text for prompt or if NULL disable prompt + * return: none */ -int cli_Cmd_Help(void *cmds, int idx, FILE *out, char ** __restrict args); +inline void cli_setPrompt(linebuffer_t * __restrict buffer, const char *prompt); /* - * cli_Cmd_Exit() Builtin helper function for Exit from Cli - * @cmds = Commands list - * @idx = Selected command ID - * @out = Output handle - * @args = Parsed arguments array - * return: 1 exit from Cli! + * cli_Printf() Send message to CLI session + * @buffer = CLI buffer + * @fmt = printf format string + * @... = arguments defined in fmt + * return: none */ -int cli_Cmd_Exit(void *cmds, int idx, FILE *out, char ** __restrict args); +inline void cli_Printf(linebuffer_t * __restrict buffer, char *fmt, ...); +/* + * cli_PrintHelp() Print help screen + * @buffer = CLI buffer + * return: none +*/ +inline void cli_PrintHelp(linebuffer_t * __restrict buffer); +/* + * cliEnd() Clear data, Free resources and close CLI session + * @buffer = CLI buffer + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +void cliEnd(linebuffer_t * __restrict buffer); +/* + * cliInit() Start CLI session, allocate memory for resources and bind keys + * @fin = Input device handle + * @fout = Output device handle + * @prompt = text for prompt, if NULL disable prompt + * return: NULL if error or !=NULL CLI buffer +*/ +linebuffer_t *cliInit(int fin, int fout, const char *prompt); /* - * cli_Register_Commands - Declare helper function for register and export Commands variable + * cliReadLine() Read line from opened CLI session + * @buffer = CLI buffer + * return: NULL if error or !=NULL readed line, must be free after use! */ -#define CLI_REGISTER_COMMANDS(CMDS) \ - extern commands_t CMDS[]; +char *cliReadLine(linebuffer_t * __restrict buffer); +/* + * cliLoop() CLI main loop + * @buffer = CLI buffer + * @csHistFile = History file name + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int cliLoop(linebuffer_t * __restrict buffer, const char *csHistFile); + +/* + * cliLoop() CLI main loop + * @buffer = CLI buffer + * @csHistFile = History file name + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int cliLoop(linebuffer_t * __restrict buffer, const char *csHistFile); +/* + * cliNetLoop() CLI network main loop binded to socket + * @buffer = CLI buffer + * @csHistFile = History file name + * @sock = client socket + * @term = stdin termios + * @win = window size of tty + * return: RETCODE_ERR error, RETCODE_OK ok +*/ +int cliNetLoop(linebuffer_t * __restrict buffer, const char *csHistFile, int sock, + struct termios *term, struct winsize *win); + + + /* * cli_Make_Comp_Commands - Declare helper function for Commands completion arguments */