Diff for /libaitio/inc/aitio.h between versions 1.9 and 1.33

version 1.9, 2011/05/03 15:41:00 version 1.33, 2013/07/09 00:35:35
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 47  SUCH DAMAGE. Line 47  SUCH DAMAGE.
 #define __AITIO_H  #define __AITIO_H
   
   
   #define COMPAT_43TTY
   
 #include <assert.h>  #include <assert.h>
   #include <syslog.h>
 #include <openssl/evp.h>  #include <openssl/evp.h>
   #include <openssl/aes.h>
   #include <sys/tty.h>
   #include <sys/ioctl_compat.h>
   #include <sys/socket.h>
   #include <sys/un.h>
   #include <sys/uio.h>
   #include <net/if_dl.h>
   #include <net/bpf.h>
   #include <netinet/in.h>
   
   
#define VACUUM_LEFT     1#ifndef STRSIZ
#define VACUUM_BETWEEN  2#define STRSIZ          256
 #endif
   
   
 typedef void ** sarr_seg_t;  
 typedef struct _tagSplitArray {  
         int             sarr_num;  
         int             sarr_seg;  
         int             sarr_siz;  
         sarr_seg_t      *sarr_data;  
 } sarr_t;  
   
 typedef struct _tagArray {  
         int     arr_num;  
         void    **arr_data;  
 } array_t;  
   
 typedef struct _tagURLItem {  
         int     vallen;  
         char    *value;  
 } url_Item_t;  
   
 struct tagIOURL {  
         unsigned char   url_line[BUFSIZ];  
   
         url_Item_t      url_tech;  
         url_Item_t      url_user;  
         url_Item_t      url_pass;  
         url_Item_t      url_host;  
         url_Item_t      url_port;  
         url_Item_t      url_path;  
         url_Item_t      url_args;  
   
         char            *url_reserved;  
 };  
   
 struct tagReqXML {  
         unsigned char   xml_line[BUFSIZ];  
   
         url_Item_t      xml_namespace;  
         union {  
                 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;  
 };  
   
   
 // io_GetErrno() Get error code of last operation  // io_GetErrno() Get error code of last operation
inline int io_GetErrno();int io_GetErrno();
 // io_GetError() Get error text of last operation  // io_GetError() Get error text of last operation
inline const char *io_GetError();const char *io_GetError();
   
   
 /*  /*
 * ioPromptRead() Read data from input h[0] with prompt to output h[1] * ioPromptRead() - Read data from input h[0] with prompt to output h[1]
  *
  * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout   * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout
  * @csPrompt = Prompt before input, may be NULL   * @csPrompt = Prompt before input, may be NULL
  * @psData = Readed data   * @psData = Readed data
Line 117  inline const char *io_GetError(); Line 85  inline const char *io_GetError();
 */  */
 int ioPromptRead(int *h, const char *csPrompt, char * __restrict psData, int dataLen);  int ioPromptRead(int *h, const char *csPrompt, char * __restrict psData, int dataLen);
 /*  /*
 * ioPromptPassword() Read password from input h[0] with prompt to output h[1] * ioPromptPassword() - Read password from input h[0] with prompt to output h[1]
  *
  * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout   * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout
  * @csPrompt = Prompt before input, may be NULL   * @csPrompt = Prompt before input, may be NULL
  * @psPass = Readed password   * @psPass = Readed password
Line 127  int ioPromptRead(int *h, const char *csPrompt, char *  Line 96  int ioPromptRead(int *h, const char *csPrompt, char * 
 */  */
 int ioPromptPassword(int *h, const char *csPrompt, char * __restrict psPass, int passLen, int confirm);  int ioPromptPassword(int *h, const char *csPrompt, char * __restrict psPass, int passLen, int confirm);
   
 /*  
  * ioRegexVerify() Function for verify data match in regex expression  
  * @csRegex = Regulare expression pattern  
  * @csData = Data for check and verify  
  * @startPos = Return start positions  
  * @endPos = Return end positions  
  * return: NULL not match or error; !=NULL begin of matched data  
 */  
 const char *ioRegexVerify(const char *csRegex, const char *csData, int *startPos, int *endPos);  
 /*  
  * ioRegexGet() Function for get data match in regex expression  
  * @csRegex = Regulare expression pattern  
  * @csData = Data from get  
  * @psString = Returned string if match  
  * @strLen = Length of string  
  * return: 0 not match; >0 count of returned chars  
 */  
 int ioRegexGet(const char *csRegex, const char *csData, char * __restrict psString, int strLen);  
 /*  
  * ioRegexReplace() Function for replace data match in regex expression with newdata  
  * @csRegex = Regulare expression pattern  
  * @csData = Source data  
  * @csNew = Data for replace  
  * return: NULL not match or error; !=NULL allocated new string, must be free after use!  
 */  
 char *ioRegexReplace(const char *csRegex, const char *csData, const char *csNew);  
   
 /*  /*
 * ioVarAst() Function for evaluate string like asterisk variable "{text[:[-]#[:#]]}" * ioMkDir() - Function for racursive directory creation and validation
 * @csString = Input string *
 * return: NULL error, !=NULL Allocated new string evaluated from input string, must be free() * @csDir = Full directory path
  * @mode = Mode for directory creation if missing dir
  * return: -1 error, 0 directory path exist, >0 created missing dirs
 */  */
char *ioVarAst(const char *csString);int ioMkDir(const char *csDir, int mode);
   
 /*  /*
 * io_Path2File() Parse and make path/filename pair * ioWatchDirLoop() - Function for watching changes in directory and fire callback
 * @csArgs = Input argument line *
 * @psPath = Output Path, if ==NULL path not returned * @csDir = Full directory path
 * @pathLen = Size of path array * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create
 * @psFile = Output File * return: -1 error, !=-1 ok, number of total signaled events
 * @fileLen = Size of file array 
 * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items 
 */  */
inline int io_Path2File(const char * __restrict csArgs, char * __restrict psPath, int pathLen, int ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp));
                char * __restrict psFile, int fileLen); 
   
 /*  
  * io_UnquotStr() Remove quots from input text string   
  * @psLine = Text string  
  * return: 0 nothing to do; 1 successful unquoted string  
 */  
 inline int io_UnquotStr(unsigned char * __restrict psLine);  
 /*  
  * io_LTrimStr() Remove left whitespaces from text string  
  * @psLine = Text string  
  * return: 0 nothing to do; !=0 Removed bytes  
 */  
 inline int io_LTrimStr(unsigned char * __restrict psLine);  
 /*  
  * io_RTrimStr() Remove right whitespaces from text string  
  * @psLine = Text string  
  * return: 0 nothing to do; !=0 Removed bytes  
 */  
 inline int io_RTrimStr(unsigned char * __restrict psLine);  
 /*  
  * io_TrimStr() Remove left and right whitespaces from text string  
  * @psLine = Text string  
  * return: 0 nothing to do; !=0 Removed bytes  
 */  
 inline int io_TrimStr(unsigned char * __restrict psLine);  
 /*  
  * io_Ch2Hex() Convert from Char string to Hex string  
  * @psLine = Text string  
  * @lineLen = Length of Text string  
  * return: NULL nothing to do or error; !=0 Allocated new converted data without term\0 (must be free)  
 */  
 inline unsigned char *io_Ch2Hex(unsigned char *psLine, int lineLen);  
 /*  
  * io_Hex2Ch() Convert from Hex string to Char string  
  * @psLine = Text string  
  * @lineLen = Length of Text string  
  * return: NULL nothing to do or error; !=0 Allocated new converted string(must be free)  
 */  
 inline char *io_Hex2Ch(unsigned char *psLine, int lineLen);  
   
   #ifdef AIO_OPS
 /*  /*
 * io_arrayInit() - Create and initialize dynamic array * io_aiobulk() - AIO bulk R/W function
 * @numItems = Number of Items *
 * return: NULL error, != NULL allocated memory for array * @mode = Bulk wait mode
  * @acbs = List of aiocb structures
  * @nacb = Number of aiocb in list
  * @sig = Event for completed operations, may be =NULL
  * return: -1 error or 0 ok
  */   */
inline array_t *io_arrayInit(int numItems);int io_aiobulk(int mode, struct aiocb ** __restrict acbs, int nacb, 
                 struct sigevent *sig);
 #endif
 /*  /*
 * io_arrayDestroy() - Free all data in dynamic array and Destroy dynamic array * io_rreadv() - Raw VFS bulk read function
 * @parr = Array *
 * return: none * @fd = File handle
  * @bufs = Read buffers
  * @nbufs = Number of read buffers
  * @offset = Read from position, if -1 read nbytes from current position
  * @update = Update file handle position !0
  * return: -1 error or !=-1 readed bytes
  */   */
inline void io_arrayDestroy(array_t ** __restrict parr);int io_rreadv(int fd, struct iovec * __restrict bufs, int nbufs, off_t offset, 
                 int update);
 /*  /*
 * io_arrayFree() - Free all data in dynamic array * io_rwritev() - Raw VFS bulk write function
 *      (WARNING! If assign static array dont use this!!!) *
 * @arr = Array * @fd = File handle
 * return: none * @bufs = Write buffers
  * @nbufs = Number of write buffers
  * @offset = Write to position, if -1 write nbytes to current position
  * @update = Update file handle position !0
  * return: -1 error or !=-1 written bytes
  */   */
inline void io_arrayFree(array_t * __restrict arr);int io_rwritev(int fd, struct iovec * __restrict bufs, int nbufs, off_t offset, 
                 int update);
 /*  /*
 * io_arrayLen() - Get last used element in dynamic array (array Length) * io_rread() - Raw VFS read function
 * @arr = Array *
 * return: -1 error, 0 empty or >0 position of last used element * @fd = File handle
  * @buf = Read buffer
  * @nbytes = Read buffer size
  * @offset = Read from position, if -1 read nbytes from current position
  * @update = Update file handle position !0
  * return: -1 error or !=-1 readed bytes
  */   */
inline int io_arrayLen(array_t * __restrict arr);int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, 
                 int update);
 /*  /*
 * io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!! * io_rwrite() - Raw VFS write function
 * @arr = Array *
 * @newNumItems = Number of Items * @fd = File handle
 * return: -1 error, 0 ok * @buf = Write buffer
  * @nbytes = Write bytes from buffer
  * @offset = Write at position, if -1 write nbytes from current position
  * @update = Update file handle position !0
  * return: -1 error or !=-1 written bytes
  */   */
int io_arrayGrow(array_t * __restrict arr, int newNumItems);int io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, 
/*                int update);
 * 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)/* 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)
   
 #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)  
 #define io_arrayDel(_arr, _d)           do { \  
                                                 assert(_arr && _arr->arr_num > _d); \  
                                                 *(_arr->arr_data + _d) = NULL; \  
                                         } while (0)  
   
/*/* Crypto framework */
 * io_arrayPush() - Push element into dynamic array like stack manner, place at first empty position 
 * @arr = Array 
 * @data = Element, if set NULL return only first empty position 
 * return: -1 not found empty position, array is full!, >-1 return position of stored element into array 
 */ 
inline int io_arrayPush(array_t * __restrict arr, void **data); 
/* 
 * io_arrayPop() - Pop element from dynamic array like stack manner, last used position 
 * @arr = Array 
 * @data = Element, if set NULL return only first empty position 
 * @delAfter = Delete after Pop element, !=0 delete element from array after return data 
 * return: -1 not found used position, array is empty!, >-1 return element position 
 */ 
inline int io_arrayPop(array_t * __restrict arr, void ** __restrict data, int delAfter); 
   
 /*  /*
 * io_argsNum() Parse and calculate number of arguments * ioCipher() - Cipher wrapper for all supported crypto algorythms
 * @csArgs = Input arguments line *
 * @csDelim = Delimiter(s) for separate * @pInput = input buffer
 * return: 0 error format; -1 error:: can`t read; >0 ok, number of items * @inLen = input buffer len
 */ * @ppOutput = output allocated buffe, must be e_free after use
inline int io_argsNum(const char *csArgs, const char *csDelim); * @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
 */
 int ioCipher(unsigned char *pInput, int inLen, unsigned char **ppOutput, const EVP_CIPHER *Cipher, 
                 unsigned char *pKey, unsigned char *pIV, int nMode);
   
 /*  /*
 * io_arrayMake() Parse and make array from arguments ... (input string will be modified!!!  * io_Blowfish() - Blowfish cipher algorythm, work with ASCII hex strings
 *      and output array must be free with io_arrayDestroy() after use!) *
 * @psArgs = Input arguments line, after execute string is modified!!! * @pInput = input buffer
 * @nargs = Maximum requested count of arguments from input string psArgs, if 0 all psArgs * @inLen = input buffer len
 * @csDelim = Delimiter(s) for separate * @ppOutput = output allocated buffe, must be e_free after use
 * @parr = Output array of arguments ... (must be free with io_arrayDestroy() after use!) * @pKey = key
 * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items * @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
 */
 int io_Blowfish(unsigned char *pInput, int inLen, unsigned char **ppOutput, 
                 unsigned char *pKey, unsigned char *pIV, int nMode);
 /*
  * io_ctr_AES() - Encrypt/Decrypt stream cipher CTR_AES
  *
  * @pInput = Input buffer with ASCII
  * @inLen = Input buffer data length
  * @ppOutput = Output buffer with cipher data, must be e_free after use
  * @pKey = Key
  * @IV = IVector/Nonce/Counter, Warning: IV must be variable, because we write there!!!
  * return: -1 error or >-1 how many cipher blocks proceeded
  */   */
int io_arrayMake(char * __restrict psArgs, int nargs, const char *csDelim, int io_ctr_AES(unsigned char *pInput, int inLen, unsigned char **ppOutput, 
                array_t ** __restrict parr);                unsigned char *pKey, unsigned char IV[AES_BLOCK_SIZE]);
   
 /*  
  * 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);  
   
 /*  /*
 * io_sarrInit() - Create and initialize dynamic split-order array * ioAllocPTY() - Allocate new PTY and TTY
 * @numItems = Number of Items *
 * @segLen = Length of segment * @ptyfd = master fd, pty
 * return: NULL error, != NULL allocated memory for array * @ttyfd = slave fd, tty
  * @name = tty device name if not null
  * @namesiz = name length, must be above 63 bytes.
  * @term = termios for terminal
  * @winz = winsize for terminal
  * return: -1 error or 0 ok
  */   */
inline sarr_t *io_sarrInit(int numItems, int segLen);int ioAllocPTY(int *ptyfd, int *ttyfd, char * __restrict name, int namesiz, 
                 struct termios * __restrict term, struct winsize * __restrict winz);
 /*  /*
 * io_sarrDestroy() - Free all data in dynamic split-order array and Destroy array * ioFreePTY() - Release PTY and TTY device
 * @parr = Array *
  * @ptyfd = master fd, pty (==-1 skip closing pty)
  * @ttyname = tty filename
  * return: none   * return: none
  */   */
inline void io_sarrDestroy(sarr_t ** __restrict parr);void ioFreePTY(int ptyfd, const char *ttyname);
 /*  /*
 * io_sarrGrow() - Grow/Shrink dynamic split-order array, Use with care when it shrink!!! * ioChgWinPTY() - Change window size of PTY
 * @arr = Array *
 * @newNumItems = Number of Items * @ptyfd = master fd, pty
 * return: -1 error, 0 ok * @row = row
  * @col = col
  * @xpxl = x pixels
  * @ypxl = y pixels
  * return: -1 error or 0 ok
  */   */
int io_sarrGrow(sarr_t * __restrict arr, int newNumItems);int ioChgWinPTY(int ptyfd, unsigned short row, unsigned short col, 
                 unsigned short xpxl, unsigned short ypxl);
 /*  /*
 * io_sarrVacuum() - Vacuum dynamic split-order array, empty segments will be freed * ioSetOwnerTTY() - Set owner to TTY
 * @arr = Array *
 * return: -1 error, >-1 freed segments * @ttyname = tty filename
  * @UID = uid
  * @GID = gid
  * return: -1 error or 0 ok
  */   */
inline int io_sarrVacuum(sarr_t * __restrict arr);int ioSetOwnerTTY(const char *ttyname, uid_t UID, gid_t GID);
#define io_sarrSize(_arr)               ((assert(_arr)), _arr->sarr_num) 
 /*  /*
 * io_sarrGet() - Get element from dynamic split-order array * ioSetSidTTY() - Makes the process's controlling TTY and sets it to sane modes.
 * @arr = Array *
 * @idx = Index (warning 1st element is at position 1) * @ttyfd = slave fd, tty
 * return: NULL not found, !=NULL element * @ttyname = tty filename
  * return: -1 error or 0 ok
  */   */
inline void *io_sarrGet(sarr_t * __restrict arr, unsigned int idx);int ioSetSidTTY(int *ttyfd, const char *ttyname);
 /*  /*
 * io_sarrGet2() - Always get element from dynamic split-order array * ioSetRAWMode() - Enter into RAW mode
 *      Function automatic grow array. Good use for Hash tables!  *
 * @arr = Array * @fd = tty fd
 * @idx = Index (warning 1st element is at position 1) * @otio = saved old termios for later restore if !=NULL
 * return: NULL not found, !=NULL element * return: -1 error or 0 ok
  */   */
void *io_sarrGet2(sarr_t * __restrict arr, unsigned int idx);int ioSetRAWMode(int fd, struct termios *otio);
 /*  /*
 * io_sarrSet() - Set element to dynamic split-order array * ioRestoreMode() - Restore termios to tty fd
 * @arr = Array *
 * @idx = Index (warning 1st element is at position 1) * @fd = tty fd
 * @data = Value * @tio = termios structure for restore
 * return: NULL error or empty, !=NULL old value in element * return: -1 error or 0 ok
  */   */
inline void *io_sarrSet(sarr_t * __restrict arr, unsigned int idx, void *data);int ioRestoreMode(int fd, struct termios tio);
#define io_sarrDel(_arr, _idx)          io_sarrSet(_arr, _idx, NULL)/*
#define io_sarr(_arr, _idx, _type)      (_type)io_sarrGet(_arr, _idx) * ioForkPTY() - Fork new process with session leader and new TTY
  *
  * @ptyfd = master fd, pty
  * @name = tty device name if not null
  * @namesiz = name length, must be above 63 bytes.
  * @term = termios for terminal
  * @winz = winsize for terminal
  * @otio = old termios structure for restore
  * return: -1 error, 0 child process or >0 parent: pid of child
  */
 pid_t ioForkPTY(int *ptyfd, char * __restrict name, int namesiz, struct termios * __restrict term, 
                 struct winsize * __restrict winz, struct termios * __restrict otio);
   
 /*  /*
 * ioURLGet() Parse and get data from input URL * ioCreatePIDFile() - Create PID file
 * @csURL = Input URL line *
 * @url = Output parsed URL * @csName = PID filename
 * return: 0 error format not find tech:// and return URL like path;  * @ifExists = !=0 if filename exists return error
                -1 error:: can`t read; >0 ok, up bits for known elements * return: -1 error or 0 ok
*/ */
int ioURLGet(const char *csURL, struct tagIOURL *url);int ioCreatePIDFile(const char *csName, int ifExists);
 
 /*  /*
 * ioURLGetValue() Get value from parsed URL * ioSendFile() - AITNET sendfile() userland implementation, not dependant from OS
 * @url = Input parsed URL *
 * @csAttr = Attribute for search * @s = socket
 * @psValue = Return value of attribute, if ==NULL only check for existence of attribute * @csFile = file for send
 * @valLen = Size of psValue array * @sendLen = bytes to send, if 0 send all data
 * return: 0 error attribute not find; -1 error:: can`t read; >0 ok, find at position * @offset = start file offset
*/ * @sndbuf = SO_SNDBUF value, if 0 use default
int ioURLGetValue(struct tagIOURL *url, const char *csAttr, char * __restrict psValue, int valLen); * return: 0 error, >0 ok, sended bytes
  */
 size_t ioSendFile(int s, const char *csFile, size_t sendLen, off_t offset, int sndbuf);
 /*  /*
 * ioURLGetFile() Get file from parsed URL * ioRecvFile() - Receive file from socket, fastest (zero-copy) way
 * @url = Input parsed URL *
 * @psValue = Return filename, if not specified file in url path, replace with / * @s = socket
 * @valLen = Size of psValue array * @csFile = file for receive
 * return: -1 error:: can`t read; 0 ok * @recvLen = receive bytes
*/ * @over = overwrite file if exists with mode like 0644
int ioURLGetFile(struct tagIOURL *url, char * __restrict psValue, int valLen); * @rcvbuf = SO_RCVBUF value, if 0 use default
  * return: 0 error, >0 ok, received bytes
  */
 size_t ioRecvFile(int s, const char *csFile, size_t recvLen, int over, int rcvbuf);
   
   
 /*  /*
 * ioXMLGet() Parse and get data from input XML request string [ns:]container[|attribute[=value]][?data] * ioRealFileName() - Get real file name
 * @csXML = Input XML request line *
 * @xml = Output parsed XML request * @fname = filename
 * return: 0 error format incorrect, -1 error:: can`t read; >0 ok readed elements bits * return: =NULL error or !=NULL real filename, should be free with e_free()
*/ */
int ioXMLGet(const char *csXML, struct tagReqXML *xml);char *ioRealFileName(const char *fname);
   
   /* Buffered file access over memory block */
   
 /*  /*
 * ioMkDir() Function for racursive directory creation and validation * io_fmemopen() - File buffered stream operations over memory block
 * @csDir = Full directory path *
 * @mode = Mode for directory creation if missing dir * @base = Base address of memory block, if =NULL Infinit length(auto-grow)
 * return: -1 error, 0 directory path exist, >0 created missing dirs * @basesize = Size of memory block
*/ * return: NULL error or !=NULL Opened file resource
int ioMkDir(const char *csDir, int mode); */
FILE *io_fmemopen(void ** __restrict base, off_t basesize);
 /*  /*
 * ioWatchDirLoop() Function for watching changes in directory and fire callback * io_fmapopen() - File buffered stream operations over MMAP block
 * @csDir = Full directory path *
 * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create * @csFile = Filename for MMAP, if =NULL private MMAP block
 * return: -1 error, !=-1 ok, number of total signaled events * @mode = File open mode
*/ * @perm = If file not exists will be created with this access permissions
int ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)); * @prot = MMAP protection
 * @flags = MMAP mode flags
 * @offset = Map from file offset, if csFile==NULL then this is size of MMAP private block
  * return: NULL error or !=NULL Opened file resource
  */
 FILE *io_fmapopen(const char *csFile, int mode, int perm, int prot, int flags, off_t offset);
 /*  /*
 * io_rread() Raw VFS read function * io_fd2buf() - Convert open file handle to buffered file I/O
  *
  * @fd = File handle   * @fd = File handle
 * @buf = Read buffer * @mode = Permissions for new buffered file I/O
 * @nbytes = Read buffer size * return: NULL error or open buffered file
 * @offset = Read from position, if -1 read nbytes from current position 
 * @update = Update file handle position !0 
 * return: -1 error or !=-1 readed bytes 
  */   */
inline int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update);FILE *io_fd2buf(int fd, const char *mode);
 /*  /*
 * io_rwrite() Raw VFS write function * io_dumbFile() - Create empry or dumb file with fixed size
 * @fd = File handle *
 * @buf = Write buffer * @csFile = Filename for create
 * @nbytes = Write bytes from buffer * @mode = File access permissions
 * @offset = Write at position, if -1 write nbytes from current position * @size = File size
 * @update = Update file handle position !0 * return: -1 error or open file handle
 * return: -1 error or !=-1 writed bytes 
  */   */
inline int io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update);int io_dumbFile(const char *csFile, int mode, off_t size);
   
 /* 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)  
   
   
 /* 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 */  
   
 /*  /*
 * ioCipher() Cipher wrapper for all supported crypto algorythms * io_get1stiface() - Get first interface of host
 * @pInput = input buffer *
 * @inLen = input buffer len * @szIface = interface string buffer
 * @ppOutput = output allocated buffe, must be free after use * @iflen = size of interface buffer
 * @Cipher = cipher engine, like EVP_bf_cbc() or etc... * return: -1 error or 0 ok
 * @pKey = key */
 * @pIV = IV, salt (8 bytes)int io_get1stiface(char *szIface, int iflen);
 * @nMode = Mode 0 - decrypting or 1 - encrypting/*
 * return: 0 not present data or error!; >0 number of processed and returned bytes into ppOutput * io_etherOpen() - Open BPF interface to device
*/ *
int ioCipher(unsigned char *pInput, int inLen, unsigned char **ppOutput, const EVP_CIPHER *Cipher * @csIface = interface name
                unsigned char *pKey, unsigned char *pIV, int nMode); * @flags = open flags
  * @whdr = with complete headers
  * @wdlt = with data link type
  * @buflen = buffer length
  * @zcbuf = zero copy buffer, if BPF supports it and isn't NULL
  * return: -1 error or >-1 bpf handle
  */
 int io_etherOpen(const char *csIface, int flags, int whdr, int wdlt
                 unsigned int *buflen, void **zcbuf);
 /*
  * io_etherClose() - Close BPF interface
  *
  * @eth = bpf handle
  * @zcbuf = zero copy buffer, if BPF supports it and isn't NULL
  * return: none
  */
 void io_etherClose(int eth, void **zcbuf);
   
 /*  /*
 * io_Blowfish() Blowfish cipher algorythm, work with ASCII hex strings * io_etherSend() - Send packet to bpf
 * @pInput = input buffer *
 * @inLen = input buffer len * @eth = bpf handle
 * @ppOutput = output allocated buffe, must be free after use * @buf = buffer
 * @pKey = key * @buflen = buffer length
 * @pIV = IV, salt (8 bytes) * return: -1 error or !=-1 written bytes
 * @nMode = Mode 0 - decrypting or 1 - encrypting */
 * return: 0 not present data or error!; >0 number of processed and returned bytes into ppOutputssize_t io_etherSend(int eth, const void *buf, size_t buflen);
*//*
int io_Blowfish(unsigned char *pInput, int inLen, unsigned char **ppOutput,  * io_etherRecv() - Receive packet from bpf
                unsigned char *pKey, unsigned char *pIV, int nMode); *
  * @eth = bpf handle
  * @buf = buffer
  * @buflen = buffer length
  * @zcbuf = zero copy buffer, if BPF supports it and isn't NULL
  * return: -1 error or !=-1 readed bytes
  */
 ssize_t io_etherRecv(int eth, void * __restrict buf, 
                 size_t buflen, void * __restrict zcbuf);
   
   
 #endif  #endif

Removed from v.1.9  
changed lines
  Added in v.1.33


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>