| version 1.4, 2010/04/16 13:25:27 | version 1.7.2.2, 2011/04/19 21:43:18 | 
| Line 10 | Line 10 | 
 | #define __AITIO_H | #define __AITIO_H | 
 |  |  | 
 |  |  | 
 |  | #include <assert.h> | 
 |  | #include <openssl/evp.h> | 
 |  |  | 
 |  |  | 
 |  | #define VACUUM_LEFT     1 | 
 |  | #define VACUUM_BETWEEN  2 | 
 |  |  | 
 |  |  | 
 |  | typedef struct _tagArray { | 
 |  | int     arr_num; | 
 |  | void    **arr_data; | 
 |  | } array_t; | 
 |  |  | 
 | typedef struct _tagURLItem { | typedef struct _tagURLItem { | 
 | int     vallen; | int     vallen; | 
 | char    *value; | char    *value; | 
| Line 29  struct tagIOURL { | Line 42  struct tagIOURL { | 
 | char            *url_reserved; | char            *url_reserved; | 
 | }; | }; | 
 |  |  | 
| struct tagIOCmd { | struct tagReqXML { | 
| const char *cmd_name; | unsigned char   xml_line[BUFSIZ]; | 
| int (*cmd_func)(void *, FILE *, char **); |  | 
| const char *cmd_doc; | url_Item_t      xml_namespace; | 
| const char *cmd_help; | union { | 
| char *(*cmd_comp)(const char *, int); | url_Item_t      container; | 
|  | url_Item_t      path; | 
|  | }               xml_node; | 
|  | url_Item_t      xml_data; | 
|  | url_Item_t      xml_attribute; | 
|  | url_Item_t      xml_value; | 
 | }; | }; | 
 |  |  | 
 | typedef struct tagIOCmd ioCommands_t; |  | 
 | typedef char *io_CompEntry_t(const char *, int); |  | 
 | typedef char **io_Completion_t(const char *, int, int); |  | 
 |  |  | 
 |  |  | 
 | // io_GetErrno() Get error code of last operation | // io_GetErrno() Get error code of last operation | 
 | inline int io_GetErrno(); | inline int io_GetErrno(); | 
 | // io_GetError() Get error text of last operation | // io_GetError() Get error text of last operation | 
| Line 96  int ioRegexGet(const char *csRegex, const char *csData | Line 110  int ioRegexGet(const char *csRegex, const char *csData | 
 | char *ioRegexReplace(const char *csRegex, const char *csData, const char *csNew); | char *ioRegexReplace(const char *csRegex, const char *csData, const char *csNew); | 
 |  |  | 
 | /* | /* | 
 |  | * ioVarAst() Function for evaluate string like asterisk variable "{text[:[-]#[:#]]}" | 
 |  | * @csString = Input string | 
 |  | * return: NULL error, !=NULL Allocated new string evaluated from input string, must be free() | 
 |  | */ | 
 |  | char *ioVarAst(const char *csString); | 
 |  |  | 
 |  | /* | 
 | * io_Path2File() Parse and make path/filename pair | * io_Path2File() Parse and make path/filename pair | 
 | * @csArgs = Input argument line | * @csArgs = Input argument line | 
 | * @psPath = Output Path, if ==NULL path not returned | * @psPath = Output Path, if ==NULL path not returned | 
| Line 106  char *ioRegexReplace(const char *csRegex, const char * | Line 127  char *ioRegexReplace(const char *csRegex, const char * | 
 | */ | */ | 
 | inline int io_Path2File(const char * __restrict csArgs, char * __restrict psPath, int pathLen, | inline int io_Path2File(const char * __restrict csArgs, char * __restrict psPath, int pathLen, | 
 | char * __restrict psFile, int fileLen); | char * __restrict psFile, int fileLen); | 
 | /* |  | 
 | * io_MakeAV() Parse and make attribute/value pair |  | 
 | * @csArgs = Input argument line |  | 
 | * @csDelim = Delimiter for separate |  | 
 | * @psAttr = Output Attribute |  | 
 | * @attrLen = Size of attribute array |  | 
 | * @psValue = Output Value, if ==NULL this element not present value or not wanted for return |  | 
 | * @valLen = Size of value array |  | 
 | * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items |  | 
 | */ |  | 
 | inline int io_MakeAV(const char * __restrict csArgs, const char *csDelim, |  | 
 | char * __restrict psAttr, int attrLen, char * __restrict psValue, int valLen); |  | 
 | /* |  | 
 | * io_SizeArray() Parse and calculate size of array |  | 
 | * @csArgs = Input arguments line |  | 
 | * @csDelim = Delimiter(s) for separate |  | 
 | * return: 0 error format; -1 error:: can`t read; >0 ok, number of items |  | 
 | */ |  | 
 | inline int io_SizeArray(const char *csArgs, const char *csDelim); |  | 
 | /* |  | 
 | * io_MakeArray() Parse and make array of arguments values ... |  | 
 | *      (input string will be modified! and output array must be free) |  | 
 | * @psArgs = Input arguments line, after execute string is modified!!! |  | 
 | * @csDelim = Delimiter(s) for separate |  | 
 | * @args = Output array of arguments ... (must be free() after procced function!) |  | 
 | * @nargs = Maximum requested count of arguments from input string psArgs |  | 
 | * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items |  | 
 | */ |  | 
 | inline int io_MakeArray(char * __restrict psArgs, const char *csDelim, |  | 
 | char *** __restrict args, int nargs); |  | 
 |  |  | 
 | /* | /* | 
 | * io_UnquotStr() Remove quots from input text string | * io_UnquotStr() Remove quots from input text string | 
 | * @psLine = Text string | * @psLine = Text string | 
 | * return: 0 nothing to do; 1 successful unquoted string | * return: 0 nothing to do; 1 successful unquoted string | 
 | */ | */ | 
| inline int io_UnquotStr(unsigned char *psLine); | inline int io_UnquotStr(unsigned char * __restrict psLine); | 
 | /* | /* | 
 | * io_LTrimStr() Remove left whitespaces from text string | * io_LTrimStr() Remove left whitespaces from text string | 
 | * @psLine = Text string | * @psLine = Text string | 
 | * return: 0 nothing to do; !=0 Removed bytes | * return: 0 nothing to do; !=0 Removed bytes | 
 | */ | */ | 
| inline int io_LTrimStr(unsigned char *psLine); | inline int io_LTrimStr(unsigned char * __restrict psLine); | 
 | /* | /* | 
 | * io_RTrimStr() Remove right whitespaces from text string | * io_RTrimStr() Remove right whitespaces from text string | 
 | * @psLine = Text string | * @psLine = Text string | 
 | * return: 0 nothing to do; !=0 Removed bytes | * return: 0 nothing to do; !=0 Removed bytes | 
 | */ | */ | 
| inline int io_RTrimStr(unsigned char *psLine); | inline int io_RTrimStr(unsigned char * __restrict psLine); | 
 | /* | /* | 
 | * io_TrimStr() Remove left and right whitespaces from text string | * io_TrimStr() Remove left and right whitespaces from text string | 
 | * @psLine = Text string | * @psLine = Text string | 
 | * return: 0 nothing to do; !=0 Removed bytes | * return: 0 nothing to do; !=0 Removed bytes | 
 | */ | */ | 
| inline int io_TrimStr(unsigned char *psLine); | inline int io_TrimStr(unsigned char * __restrict psLine); | 
 | /* | /* | 
| * io_Char2Hex() Convert from Char string to Hex string | * io_Ch2Hex() Convert from Char string to Hex string | 
 | * @psLine = Text string | * @psLine = Text string | 
 | * @lineLen = Length of Text string | * @lineLen = Length of Text string | 
| * return: NULL nothing to do or error; !=0 Allocated new converted string(must be free) | * return: NULL nothing to do or error; !=0 Allocated new converted data without term\0 (must be free) | 
 | */ | */ | 
| inline char *io_Char2Hex(unsigned char *psLine, int lineLen); | inline unsigned char *io_Ch2Hex(unsigned char *psLine, int lineLen); | 
 | /* | /* | 
| * io_Hex2Char() Convert from Hex string to Char string | * io_Hex2Ch() Convert from Hex string to Char string | 
 | * @psLine = Text string | * @psLine = Text string | 
 | * @lineLen = Length of Text string | * @lineLen = Length of Text string | 
 | * return: NULL nothing to do or error; !=0 Allocated new converted string(must be free) | * return: NULL nothing to do or error; !=0 Allocated new converted string(must be free) | 
 | */ | */ | 
| inline char *io_Hex2Char(unsigned char *psLine, int lineLen); | inline char *io_Hex2Ch(unsigned char *psLine, int lineLen); | 
 |  |  | 
 | /* | /* | 
 |  | * io_arrayInit() - Create and initialize dynamic array | 
 |  | * @numItems = Number of Items | 
 |  | * return: NULL error, != NULL allocated memory for array | 
 |  | */ | 
 |  | inline array_t *io_arrayInit(int numItems); | 
 |  | /* | 
 |  | * io_arrayDestroy() - Free all data in dynamic array and Destroy dynamic array | 
 |  | * @parr = Array | 
 |  | * return: none | 
 |  | */ | 
 |  | inline void io_arrayDestroy(array_t ** __restrict parr); | 
 |  | /* | 
 |  | * io_arrayFree() - Free all data in dynamic array | 
 |  | *      (WARNING! If assign static array dont use this!!!) | 
 |  | * @arr = Array | 
 |  | * return: none | 
 |  | */ | 
 |  | inline void io_arrayFree(array_t * __restrict arr); | 
 |  | /* | 
 |  | * io_arrayLen() - Get last used element in dynamic array (array Length) | 
 |  | * @arr = Array | 
 |  | * return: -1 error, 0 empty or >0 position of last used element | 
 |  | */ | 
 |  | inline int io_arrayLen(array_t * __restrict arr); | 
 |  | /* | 
 |  | * io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!! | 
 |  | * @arr = Array | 
 |  | * @newNumItems = Number of Items | 
 |  | * return: -1 error, 0 ok | 
 |  | */ | 
 |  | int io_arrayGrow(array_t * __restrict arr, int newNumItems); | 
 |  | /* | 
 |  | * io_arrayVacuum() - Vacuum dynamic array, empty elements will be deleted | 
 |  | * @arr = Array | 
 |  | * @fromWhere = 1 begin, 2 ALL empty elements | 
 |  | * return: -1 error, 0 ok | 
 |  | */ | 
 |  | int io_arrayVacuum(array_t * __restrict arr, int fromWhere); | 
 |  |  | 
 |  | #define io_arraySize(_arr)              ((assert(_arr)), _arr->arr_num) | 
 |  |  | 
 |  | #define io_arrayGet(_arr, _d, _type)    ((assert(_arr && _arr->arr_num > _d)), \ | 
 |  | ((_type) *(_arr->arr_data + _d))) | 
 |  | #define io_arraySet(_arr, _d, _ptr)     do { \ | 
 |  | assert(_arr && _arr->arr_num > _d); \ | 
 |  | *(_arr->arr_data + _d) = (void*) _ptr; \ | 
 |  | } while (0) | 
 |  |  | 
 |  | /* | 
 |  | * io_argsNum() Parse and calculate number of arguments | 
 |  | * @csArgs = Input arguments line | 
 |  | * @csDelim = Delimiter(s) for separate | 
 |  | * return: 0 error format; -1 error:: can`t read; >0 ok, number of items | 
 |  | */ | 
 |  | inline int io_argsNum(const char *csArgs, const char *csDelim); | 
 |  |  | 
 |  | /* | 
 |  | * io_arrayMake() Parse and make array from arguments ... (input string will be modified!!! | 
 |  | *      and output array must be free with io_arrayDestroy() after use!) | 
 |  | * @psArgs = Input arguments line, after execute string is modified!!! | 
 |  | * @nargs = Maximum requested count of arguments from input string psArgs, if 0 all psArgs | 
 |  | * @csDelim = Delimiter(s) for separate | 
 |  | * @parr = Output array of arguments ... (must be free with io_arrayDestroy() after use!) | 
 |  | * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items | 
 |  | */ | 
 |  | int io_arrayMake(char * __restrict psArgs, int nargs, const char *csDelim, | 
 |  | array_t ** __restrict parr); | 
 |  |  | 
 |  | /* | 
 |  | * io_MakeAV() Parse and make attribute/value pair | 
 |  | * @csArgs = Input argument line | 
 |  | * @csDelim = Delimiter for separate | 
 |  | * @psAttr = Output Attribute | 
 |  | * @attrLen = Size of attribute array | 
 |  | * @psValue = Output Value, if ==NULL this element not present value or not wanted for return | 
 |  | * @valLen = Size of value array | 
 |  | * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items | 
 |  | */ | 
 |  | int io_MakeAV(const char * __restrict csArgs, const char *csDelim, | 
 |  | char * __restrict psAttr, int attrLen, char * __restrict psValue, int valLen); | 
 |  |  | 
 |  |  | 
 |  | /* | 
 | * ioURLGet() Parse and get data from input URL | * ioURLGet() Parse and get data from input URL | 
 | * @csURL = Input URL line | * @csURL = Input URL line | 
 | * @url = Output parsed URL | * @url = Output parsed URL | 
| Line 202  int ioURLGetValue(struct tagIOURL *url, const char *cs | Line 276  int ioURLGetValue(struct tagIOURL *url, const char *cs | 
 | */ | */ | 
 | int ioURLGetFile(struct tagIOURL *url, char * __restrict psValue, int valLen); | int ioURLGetFile(struct tagIOURL *url, char * __restrict psValue, int valLen); | 
 |  |  | 
 |  |  | 
 | /* | /* | 
| * ioCLIComp() Initialize completion CLI features | * ioXMLGet() Parse and get data from input XML request string [ns:]container[|attribute[=value]][?data] | 
| * @cmdComplete = Completion function | * @csXML = Input XML request line | 
| * @cmdEntry = Compentry function | * @xml = Output parsed XML request | 
| * return: none | * return: 0 error format incorrect, -1 error:: can`t read; >0 ok readed elements bits | 
 | */ | */ | 
| inline void ioCLIComp(io_Completion_t *cmdComplete, io_CompEntry_t *cmdEntry); | int ioXMLGet(const char *csXML, struct tagReqXML *xml); | 
|  |  | 
|  |  | 
 | /* | /* | 
| * ioCLIExec() Execute CLI main loop | * ioMkDir() Function for racursive directory creation and validation | 
| * @cmdList = Commands list | * @csDir = Full directory path | 
| * @out = Output handle | * @mode = Mode for directory creation if missing dir | 
| * @csPrompt = Prompt text | * return: -1 error, 0 directory path exist, >0 created missing dirs | 
| * return: -1 error, 0 = exit w/^+D, 1 done. |  | 
 | */ | */ | 
| int ioCLIExec(ioCommands_t *cmdList, FILE *out, const char *csPrompt); | int ioMkDir(const char *csDir, int mode); | 
 |  |  | 
 | /* | /* | 
| * io_Cmd_Unsupported() Builtin helper function for unsupported commands | * ioWatchDirLoop() Function for watching changes in directory and fire callback | 
| * @cmds = Commands list | * @csDir = Full directory path | 
| * @out = Output handle | * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create | 
| * @args = Parsed arguments array | * return: -1 error, !=-1 ok, number of total signaled events | 
| * return: -1 error, 0 = ok, 1 exit from Cli! |  | 
 | */ | */ | 
| int io_Cmd_Unsupported(void *cmds, FILE *out, char ** __restrict args); | int ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)); | 
|  |  | 
|  |  | 
 | /* | /* | 
| * io_Cmd_Help() Builtin helper function for Help screen | * io_rread() Raw VFS read function | 
| * @cmds = Commands list | * @fd = File handle | 
| * @out = Output handle | * @buf = Read buffer | 
| * @args = Parsed arguments array | * @nbytes = Read buffer size | 
| * return: -1 error, 0 = ok | * @offset = Read from position, if -1 read nbytes from current position | 
| */ | * @update = Update file handle position !0 | 
| int io_Cmd_Help(void *cmds, FILE *out, char ** __restrict args); | * return: -1 error or !=-1 readed bytes | 
|  | */ | 
|  | inline int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update); | 
 | /* | /* | 
| * io_Cmd_Exit() Builtin helper function for Exit from Cli | * io_rwrite() Raw VFS write function | 
| * @cmds = Commands list | * @fd = File handle | 
| * @out = Output handle | * @buf = Write buffer | 
| * @args = Parsed arguments array | * @nbytes = Write bytes from buffer | 
| * return: 1 exit from Cli! | * @offset = Write at position, if -1 write nbytes from current position | 
| */ | * @update = Update file handle position !0 | 
| int io_Cmd_Exit(void *cmds, FILE *out, char ** __restrict args); | * return: -1 error or !=-1 writed bytes | 
|  | */ | 
|  | inline int io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update); | 
 |  |  | 
 |  | /* Disk I/O helper macros */ | 
 |  | #define io_read(f, b, n) io_rread(f, b, n, -1, 1) | 
 |  | #define io_write(f, b, n) io_rwrite(f, b, n, -1, 1) | 
 |  |  | 
 | /* |  | 
 | * io_Make_Comp_Commands - Declare helper function for Commands completion arguments |  | 
 | */ |  | 
 | #define IO_MAKE_COMP_COMMANDS(FUNC, CMDS)       \ |  | 
 | char *FUNC(const char *text, int state) \ |  | 
 | { \ |  | 
 | register int i; \ |  | 
 | int len = strlen(text); \ |  | 
 | for (i = state; CMDS[i].cmd_name; i++) { \ |  | 
 | if (strncmp(CMDS[i].cmd_name, "---", 3) && \ |  | 
 | !strncmp(CMDS[i].cmd_name, text, len)) \ |  | 
 | return strdup(CMDS[i].cmd_name); \ |  | 
 | } \ |  | 
 | return NULL; \ |  | 
 | } |  | 
 |  |  | 
 |  | /* Debug helper macros */ | 
 |  | extern int io_Debug; | 
 |  |  | 
 |  | #define io_initDebug(x)         io_Debug = (x); | 
 |  | #define io_addDebug             io_Debug++ | 
 |  | #define ioDEBUG(x, fmt, ...)    do { \ | 
 |  | assert((fmt)); \ | 
 |  | char str[STRSIZ] = { 0 }; \ | 
 |  | snprintf(str, STRSIZ, (fmt), ##__VA_ARGS__); \ | 
 |  | if ((x) <= io_Debug) \ | 
 |  | syslog(LOG_DEBUG, "ioDebug(%d):%s(%d): %s\n", \ | 
 |  | (x), __func__, __LINE__, str); \ | 
 |  | } while (0) | 
 |  |  | 
 |  | #define ioERROR(x, fmt, ...)    do { \ | 
 |  | assert((fmt)); \ | 
 |  | char str[STRSIZ] = { 0 }; \ | 
 |  | snprintf(str, STRSIZ, (fmt), ##__VA_ARGS__); \ | 
 |  | syslog(LOG_ERR, "ioError():%s(%d): #%d - %s\n", \ | 
 |  | __func__, __LINE__, (x), str); \ | 
 |  | } while (0) | 
 |  | #define io_sysERROR(x)          do { \ | 
 |  | if (x > 0 || errno) \ | 
 |  | syslog(LOG_ERR, "ioError(sys):%s(%d): #%d - %s\n", \ | 
 |  | __func__, __LINE__, x > 0 ? x : errno, \ | 
 |  | strerror(x > 0 ? x : errno)); \ | 
 |  | } while (0) | 
 |  | #define io_aitERROR(ait)        do { \ | 
 |  | if (ait##_GetErrno()) \ | 
 |  | syslog(LOG_ERR, "ioError(ait):%s(%d): #%d - %s\n", \ | 
 |  | __func__, __LINE__, ait##_GetErrno(), \ | 
 |  | ait##_GetError()); \ | 
 |  | } while (0) | 
 |  |  | 
 |  |  | 
 |  | /* Crypto framework */ | 
 |  |  | 
 | /* | /* | 
| * io_Make_Comp_Args - Declare helper function for Arguments completion | * ioCipher() Cipher wrapper for all supported crypto algorythms | 
|  | * @pInput = input buffer | 
|  | * @inLen = input buffer len | 
|  | * @ppOutput = output allocated buffe, must be free after use | 
|  | * @Cipher = cipher engine, like EVP_bf_cbc() or etc... | 
|  | * @pKey = key | 
|  | * @pIV = IV, salt (8 bytes) | 
|  | * @nMode = Mode 0 - decrypting or 1 - encrypting | 
|  | * return: 0 not present data or error!; >0 number of processed and returned bytes into ppOutput | 
 | */ | */ | 
| #define IO_MAKE_COMP_ARGS(FUNC, ARGS)   \ | int ioCipher(unsigned char *pInput, int inLen, unsigned char **ppOutput, const EVP_CIPHER *Cipher, | 
| char *FUNC(const char *text __attribute__((unused)), int state) \ | unsigned char *pKey, unsigned char *pIV, int nMode); | 
| { \ |  | 
| while (ARGS[state]) \ |  | 
| return strdup(ARGS[state]); \ |  | 
| return NULL; \ |  | 
| } |  | 
 |  |  | 
 | /* | /* | 
| * io_Comp_Filename() Builtin helper function for filename completion arguments | * io_Blowfish() Blowfish cipher algorythm, work with ASCII hex strings | 
| * @text = Text line | * @pInput = input buffer | 
| * @state = Position state | * @inLen = input buffer len | 
| * return: NULL not found filename, != NULL filename | * @ppOutput = output allocated buffe, must be free after use | 
|  | * @pKey = key | 
|  | * @pIV = IV, salt (8 bytes) | 
|  | * @nMode = Mode 0 - decrypting or 1 - encrypting | 
|  | * return: 0 not present data or error!; >0 number of processed and returned bytes into ppOutput | 
 | */ | */ | 
| char *io_Comp_Filename(const char *text, int state); | int io_Blowfish(unsigned char *pInput, int inLen, unsigned char **ppOutput, | 
|  | unsigned char *pKey, unsigned char *pIV, int nMode); | 
 |  |  | 
 |  |  | 
 | #endif | #endif |