--- libaitcli/inc/aitcli.h 2011/05/29 22:49:25 1.4 +++ libaitcli/inc/aitcli.h 2013/11/22 15:17:22 1.10 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitcli.h,v 1.4 2011/05/29 22:49:25 misho Exp $ +* $Id: aitcli.h,v 1.10 2013/11/22 15:17:22 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -51,7 +51,9 @@ SUCH DAMAGE. #include +#ifndef STRSIZ #define STRSIZ 256 +#endif /* Key definitions */ @@ -184,8 +186,8 @@ SUCH DAMAGE. /* History types */ struct tagHistory { - int hist_len; - char hist_line[BUFSIZ]; + int hist_len; + char hist_line[BUFSIZ]; TAILQ_ENTRY(tagHistory) hist_next; }; @@ -193,7 +195,7 @@ typedef TAILQ_HEAD(tqHistoryHead, tagHistory) history_ /* Bind keys structure types */ -typedef int (*bindkey_func_t)(int idx, /*linebuffer_t **/ void * __restrict buffer); +typedef int (*bindkey_func_t)(int idx, /* linebuffer_t * */ void * __restrict cli_buffer); typedef struct { int key_len; unsigned char key_ch[8]; @@ -203,7 +205,8 @@ typedef struct { /* Commands structure for CLI */ -typedef int (*cmd_func_t)(/*linebuffer_t **/ void * __restrict buffer, int idx, char ** __restrict args); +typedef int (*cmd_func_t)(/*linebuffer_t **/ void * __restrict cli_buffer, int idx, + char ** __restrict args); struct tagCommand { int cmd_level; @@ -223,6 +226,7 @@ typedef SLIST_HEAD(slCommandHead, tagCommand) commands /* Main structure, Buffer for CLI work with thread models ;-) special designed by M.Punov */ typedef struct { + int line_kill; char line_mode; char *line_prompt; @@ -248,9 +252,9 @@ typedef struct { /* Error support functions */ // cli_GetErrno() Get error code of last operation -inline int cli_GetErrno(); +int cli_GetErrno(); // cli_GetError() Get error text of last operation -inline const char *cli_GetError(); +const char *cli_GetError(); /* TELNET support for CLI */ @@ -267,7 +271,8 @@ struct telnetAttrs { #ifndef NDEBUG /* - * cli_telnetDumpAttrs() Telnet debug attributes list, if NDEBUG defined not include + * cli_telnetDumpAttrs() - Telnet debug attributes list, if NDEBUG defined not include + * * @attr = attributes list * @nAttr = attributes list size * return: none @@ -279,7 +284,8 @@ extern void cli_telnetDumpAttrs(struct telnetAttrs *, /* - * cli_telnetRecv() Telnet receive commands, negotiate with telnet peer + * cli_telnetRecv() - Telnet receive commands, negotiate with telnet peer + * * @sock = socket for communication * @attr = received attributes list, must be free after use, but if NULL receive in binary mode * @nAttr = received attributes list size, if is NULL receive in binary mode @@ -289,7 +295,8 @@ extern void cli_telnetDumpAttrs(struct telnetAttrs *, */ int cli_telnetRecv(int sock, struct telnetAttrs **attr, int *nAttr, void *data, int datLen); /* - * cli_telnetSend() Telnet send commands, negotiate with telnet peer + * cli_telnetSend() - Telnet send commands, negotiate with telnet peer + * * @sock = socket for communication * @attr = send attributes list * @nAttr = send attributes list size @@ -301,17 +308,19 @@ int cli_telnetRecv(int sock, struct telnetAttrs **attr int cli_telnetSend(int sock, struct telnetAttrs *attr, int nAttr, void *data, int datLen, int Term); /* - * cli_telnet_Get_SubOpt() Telnet get sub option function + * cli_telnet_Get_SubOpt() - Telnet get sub option function + * * @attr = input attribute * @code = sub-option code for opt * @data = sub-option data * @datLen = data size set max size in input, output return copy size * return: -1 can`t get option; !=-1 option code */ -inline int cli_telnet_Get_SubOpt(struct telnetAttrs *attr, unsigned char *code, +int cli_telnet_Get_SubOpt(struct telnetAttrs *attr, unsigned char *code, void *data, unsigned char *datLen); /* - * cli_telnet_Set_SubOpt() Telnet set sub option function + * cli_telnet_Set_SubOpt() - Telnet set sub option function + * * @attr = output attribute * @opt = attribute option * @code = sub-option code for opt, if 0xff not specified @@ -319,17 +328,19 @@ inline int cli_telnet_Get_SubOpt(struct telnetAttrs *a * @datLen = data size, if 0 not specified * return: -1 can`t set sub-otion; 0 ok */ -inline int cli_telnet_Set_SubOpt(struct telnetAttrs *attr, unsigned char opt, unsigned char code, +int cli_telnet_Set_SubOpt(struct telnetAttrs *attr, unsigned char opt, unsigned char code, void *data, unsigned char datLen); /* - * cli_telnet_GetCmd() Telnet get command + * cli_telnet_GetCmd() - Telnet get command + * * @attr = input attribute * return: -1 can`t get command; !=-1 command <<24 return sublen, <<8 return option, <<0 command */ -inline unsigned int cli_telnet_GetCmd(struct telnetAttrs *attr); +unsigned int cli_telnet_GetCmd(struct telnetAttrs *attr); /* - * cli_telnet_SetCmd() Telnet set command + * cli_telnet_SetCmd() - Telnet set command + * * @attr = input attribute * @cmd = command * @opt = option, if 0xff not specified @@ -338,15 +349,16 @@ inline unsigned int cli_telnet_GetCmd(struct telnetAtt * @arg3 = sub-option data size, if 0 not specified data * return: -1 can`t set command; !=-1 ok */ -inline int cli_telnet_SetCmd(struct telnetAttrs *attr, unsigned char cmd, unsigned char opt, ...); +int cli_telnet_SetCmd(struct telnetAttrs *attr, unsigned char cmd, unsigned char opt, ...); /* - * cli_telnet_Answer() Automatic generate commands answer to send from telnet + * cli_telnet_Answer() - Automatic generate commands answer to send from telnet + * * @caps = Array of capability options * @nCaps = number of capability options * @attr = input attribute * @nAttr = number of input attributes - * @ans = output answered attributes, must be free() after use + * @ans = output answered attributes, must be e_free() after use * @Ans = number of output answered attributes * return: -1 can`t answer; !=-1 ok */ @@ -365,128 +377,145 @@ int cli_telnet_Answer(unsigned char *caps, int nCaps, /* CLI Helper functions */ /* - * cli_Cmd_Unsupported() Builtin helper function for unsupported commands - * @buffer = CLI buffer - * @idx = Selected command ID + * cli_Cmd_Unsupported() - Builtin helper function for unsupported commands + * + * @cli_buffer = CLI buffer + * @idx = Config level * @args = Parsed arguments array * return: RETCODE_OK ok */ -int cli_Cmd_Unsupported(void * __restrict buffer, int idx, char ** __restrict args); +int cli_Cmd_Unsupported(void * __restrict cli_buffer, int idx, char ** __restrict args); /* CLI Functions */ /* - * cli_BindKey() Bind function to key + * cli_BindKey() - Bind function to key + * * @key = key structure - * @buffer = CLI buffer + * @cli_buffer = CLI buffer * return: RETCODE_ERR error, RETCODE_OK ok, >0 bind at position */ -int cli_BindKey(bindkey_t * __restrict key, linebuffer_t * __restrict buffer); +int cli_BindKey(bindkey_t * __restrict key, linebuffer_t * __restrict cli_buffer); /* - * cli_addCommand() Add command to CLI session - * @buffer = CLI buffer + * cli_addCommand() - Add command to CLI session + * + * @cli_buffer = CLI buffer * @csCmd = Command name - * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * @cliLevel = Level in CLI, -1 view from all levels, 0 hidden, >0 mask levels * @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, +cli_addCommand(linebuffer_t * __restrict cli_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 + * cli_delCommand() - Delete command from CLI session + * + * @cli_buffer = CLI buffer * @csCmd = Command name - * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * @cliLevel = Level in CLI, -1 view from all levels, 0 hidden, >0 mask levels * return: RETCODE_ERR error, RETCODE_OK ok */ int -cli_delCommand(linebuffer_t * __restrict buffer, const char *csCmd, int cliLevel); +cli_delCommand(linebuffer_t * __restrict cli_buffer, const char *csCmd, int cliLevel); /* - * cli_updCommand() Update command in CLI session - * @buffer = CLI buffer + * cli_updCommand() - Update command in CLI session + * + * @cli_buffer = CLI buffer * @csCmd = Command name - * @cliLevel = Level in CLI, -1 unprivi(view from all), 0 main config, 1 sub config ... + * @cliLevel = Level in CLI, -1 view from all levels, 0 hidden, >0 mask levels * @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, +cli_updCommand(linebuffer_t * __restrict cli_buffer, const char *csCmd, + int cliLevel, cmd_func_t funcCmd, const char *csInfo, const char *csHelp); /* - * cli_addHistory() Add line to history - * @buffer = CLI buffer + * cli_addHistory() - Add line to history + * + * @cli_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); +int cli_addHistory(linebuffer_t * __restrict cli_buffer, const char * __restrict str); /* - * cli_saveHistory() Save history to file - * @buffer = CLI buffer + * cli_saveHistory() - Save history to file + * + * @cli_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); +int cli_saveHistory(linebuffer_t * __restrict cli_buffer, const char *histfile, int lines); /* - * cli_loadHistory() Load history from file - * @buffer = CLI buffer + * cli_loadHistory() - Load history from file + * + * @cli_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); +int cli_loadHistory(linebuffer_t * __restrict cli_buffer, const char *histfile); /* - * cli_resetHistory() Reset history search in CLI session - * @buffer = CLI buffer + * cli_resetHistory() - Reset history search in CLI session + * + * @cli_buffer = CLI buffer * return: none */ -inline void cli_resetHistory(linebuffer_t * __restrict buffer); +void cli_resetHistory(linebuffer_t * __restrict cli_buffer); /* - * cli_freeLine() Clear entire line - * @buffer = CLI buffer + * cli_freeLine() - Clear entire line + * + * @cli_buffer = CLI buffer * return: RETCODE_ERR error, RETCODE_OK ok */ -inline int cli_freeLine(linebuffer_t * __restrict buffer); +int cli_freeLine(linebuffer_t * __restrict cli_buffer); /* - * cli_setPrompt() Set new prompt for CLI session - * @buffer = CLI buffer + * cli_setPrompt() - Set new prompt for CLI session + * + * @cli_buffer = CLI buffer * @prompt = new text for prompt or if NULL disable prompt * return: none */ -inline void cli_setPrompt(linebuffer_t * __restrict buffer, const char *prompt); +void cli_setPrompt(linebuffer_t * __restrict cli_buffer, const char *prompt); /* - * cli_Printf() Send message to CLI session - * @buffer = CLI buffer + * cli_Printf() - Send message to CLI session + * + * @cli_buffer = CLI buffer * @fmt = printf format string * @... = arguments defined in fmt * return: none */ -inline void cli_Printf(linebuffer_t * __restrict buffer, char *fmt, ...); +void cli_Printf(linebuffer_t * __restrict cli_buffer, char *fmt, ...); /* - * cli_PrintHelp() Print help screen - * @buffer = CLI buffer + * cli_PrintHelp() - Print help screen + * + * @cli_buffer = CLI buffer * return: none */ -inline void cli_PrintHelp(linebuffer_t * __restrict buffer); +void cli_PrintHelp(linebuffer_t * __restrict cli_buffer); /* - * cliEnd() Clear data, Free resources and close CLI session - * @buffer = CLI buffer + * cliEnd() - Clear data, Free resources and close CLI session + * + * @cli_buffer = CLI buffer * return: RETCODE_ERR error, RETCODE_OK ok */ -void cliEnd(linebuffer_t * __restrict buffer); +void cliEnd(linebuffer_t * __restrict cli_buffer); /* - * cliInit() Start CLI session, allocate memory for resources and bind keys + * 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 @@ -495,35 +524,42 @@ void cliEnd(linebuffer_t * __restrict buffer); linebuffer_t *cliInit(int fin, int fout, const char *prompt); /* - * cliInitLine() Init CLI input line terminal - * @buffer = CLI buffer + * cliInitLine() - Init CLI input line terminal + * + * @cli_buffer = CLI buffer * return: none */ -int cliInitLine(linebuffer_t * __restrict buffer); +int cliInitLine(linebuffer_t * __restrict cli_buffer); /* - * cliReadLine() Read line from opened CLI session - * @buffer = CLI buffer - * return: NULL if error or !=NULL readed line, must be free after use! + * cliReadLine() - Read line from opened CLI session + * + * @cli_buffer = CLI buffer + * @timeout = Session timeout (-1 infinit) + * return: NULL if error or !=NULL readed line, must be e_free after use! */ -char *cliReadLine(linebuffer_t * __restrict buffer); +char *cliReadLine(linebuffer_t * __restrict cli_buffer, int timeout); /* - * cliLoop() CLI main loop - * @buffer = CLI buffer + * cliLoop() - CLI main loop + * + * @cli_buffer = CLI buffer * @csHistFile = History file name + * @timeout = Session timeout (-1 infinit) * return: RETCODE_ERR error, RETCODE_OK ok */ -int cliLoop(linebuffer_t * __restrict buffer, const char *csHistFile); +int cliLoop(linebuffer_t * __restrict cli_buffer, const char *csHistFile, int timeout); /* - * cliNetLoop() CLI network main loop binded to socket - * @buffer = CLI buffer + * cliNetLoop() - CLI network main loop binded to socket + * + * @cli_buffer = CLI buffer * @csHistFile = History file name * @sock = client socket - * @term = stdin termios - * @win = window size of tty + * @timeout = Session timeout (-1 infinit) * return: RETCODE_ERR error, RETCODE_OK ok */ -int cliNetLoop(linebuffer_t * __restrict buffer, const char *csHistFile, int sock); +int cliNetLoop(linebuffer_t * __restrict cli_buffer, const char *csHistFile, + int sock, int timeout); +#define cliKillLoop(_x) (assert((_x)), (_x)->line_kill = 1) #endif