--- libaitio/inc/aitio.h 2010/09/07 17:04:15 1.4.2.5 +++ libaitio/inc/aitio.h 2013/06/04 12:44:46 1.31 @@ -1,43 +1,81 @@ /************************************************************************* -* (C) 2010 AITNET ltd - Sofia/Bulgaria - -* by Michael Pounov +* (C) 2010 AITNET ltd - Sofia/Bulgaria - +* by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.4.2.5 2010/09/07 17:04:15 misho Exp $ +* $Id: aitio.h,v 1.31 2013/06/04 12:44:46 misho Exp $ * -*************************************************************************/ +************************************************************************** +The ELWIX and AITNET software is distributed under the following +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, 2012, 2013 + by Michael Pounov . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: +This product includes software developed by Michael Pounov +ELWIX - Embedded LightWeight unIX and its contributors. +4. Neither the name of AITNET nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +*/ #ifndef __AITIO_H #define __AITIO_H -typedef struct _tagURLItem { - int vallen; - char *value; -} url_Item_t; +#define COMPAT_43TTY -struct tagIOURL { - unsigned char url_line[BUFSIZ]; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include - 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; -}; +#ifndef STRSIZ +#define STRSIZ 256 +#endif // io_GetErrno() Get error code of last operation -inline int io_GetErrno(); +int io_GetErrno(); // 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 * @csPrompt = Prompt before input, may be NULL * @psData = Readed data @@ -46,7 +84,8 @@ inline const char *io_GetError(); */ 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 * @csPrompt = Prompt before input, may be NULL * @psPass = Readed password @@ -56,143 +95,66 @@ int ioPromptRead(int *h, const char *csPrompt, char * */ 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); /* - * io_Path2File() Parse and make path/filename pair - * @csArgs = Input argument line - * @psPath = Output Path, if ==NULL path not returned - * @pathLen = Size of path array - * @psFile = Output File - * @fileLen = Size of file array - * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items + * ioMkDir() - Function for racursive directory creation and validation + * + * @csDir = Full directory path + * @mode = Mode for directory creation if missing dir + * return: -1 error, 0 directory path exist, >0 created missing dirs */ -inline int io_Path2File(const char * __restrict csArgs, char * __restrict psPath, int pathLen, - 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); +int ioMkDir(const char *csDir, int mode); /* - * io_UnquotStr() Remove quots from input text string - * @psLine = Text string - * return: 0 nothing to do; 1 successful unquoted string + * ioWatchDirLoop() - Function for watching changes in directory and fire callback + * + * @csDir = Full directory path + * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create + * return: -1 error, !=-1 ok, number of total signaled events */ -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); +int ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)); + +#ifdef AIO_OPS /* - * ioURLGet() Parse and get data from input URL - * @csURL = Input URL line - * @url = Output parsed URL - * return: 0 error format not find tech:// and return URL like path; - -1 error:: can`t read; >0 ok, up bits for known elements -*/ -int ioURLGet(const char *csURL, struct tagIOURL *url); + * io_aiobulk() - AIO bulk R/W function + * + * @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 + */ +int io_aiobulk(int mode, struct aiocb ** __restrict acbs, int nacb, + struct sigevent *sig); +#endif /* - * ioURLGetValue() Get value from parsed URL - * @url = Input parsed URL - * @csAttr = Attribute for search - * @psValue = Return value of attribute, if ==NULL only check for existence of attribute - * @valLen = Size of psValue array - * return: 0 error attribute not find; -1 error:: can`t read; >0 ok, find at position -*/ -int ioURLGetValue(struct tagIOURL *url, const char *csAttr, char * __restrict psValue, int valLen); + * io_rreadv() - Raw VFS bulk read function + * + * @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 + */ +int io_rreadv(int fd, struct iovec * __restrict bufs, int nbufs, off_t offset, + int update); /* - * ioURLGetFile() Get file from parsed URL - * @url = Input parsed URL - * @psValue = Return filename, if not specified file in url path, replace with / - * @valLen = Size of psValue array - * return: -1 error:: can`t read; 0 ok -*/ -int ioURLGetFile(struct tagIOURL *url, char * __restrict psValue, int valLen); - - + * io_rwritev() - Raw VFS bulk write function + * + * @fd = File handle + * @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 + */ +int io_rwritev(int fd, struct iovec * __restrict bufs, int nbufs, off_t offset, + int update); /* - * io_rread() Raw VFS read function + * io_rread() - Raw VFS read function + * * @fd = File handle * @buf = Read buffer * @nbytes = Read buffer size @@ -200,36 +162,229 @@ int ioURLGetFile(struct tagIOURL *url, char * __restri * @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); +int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, + int update); /* - * io_rwrite() Raw VFS write function + * io_rwrite() - Raw VFS write function + * * @fd = File handle * @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 writed bytes + * return: -1 error or !=-1 written bytes */ -inline int io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update); +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) -/* Debug helper macros */ -extern int io_Debug; +/* Crypto framework */ -#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, "Debug(%d):%s(%d): %s\n", \ - (x), __func__, __LINE__, str);\ - } while(0) +/* + * ioCipher() - Cipher wrapper for all supported crypto algorythms + * + * @pInput = input buffer + * @inLen = input buffer len + * @ppOutput = output allocated buffe, must be e_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 +*/ +int ioCipher(unsigned char *pInput, int inLen, unsigned char **ppOutput, const EVP_CIPHER *Cipher, + unsigned char *pKey, unsigned char *pIV, int nMode); + +/* + * io_Blowfish() - Blowfish cipher algorythm, work with ASCII hex strings + * + * @pInput = input buffer + * @inLen = input buffer len + * @ppOutput = output allocated buffe, must be e_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 +*/ +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_ctr_AES(unsigned char *pInput, int inLen, unsigned char **ppOutput, + unsigned char *pKey, unsigned char IV[AES_BLOCK_SIZE]); + + +/* + * ioAllocPTY() - Allocate new PTY and TTY + * + * @ptyfd = master fd, pty + * @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 + */ +int ioAllocPTY(int *ptyfd, int *ttyfd, char * __restrict name, int namesiz, + struct termios * __restrict term, struct winsize * __restrict winz); +/* + * ioFreePTY() - Release PTY and TTY device + * + * @ptyfd = master fd, pty (==-1 skip closing pty) + * @ttyname = tty filename + * return: none + */ +void ioFreePTY(int ptyfd, const char *ttyname); +/* + * ioChgWinPTY() - Change window size of PTY + * + * @ptyfd = master fd, pty + * @row = row + * @col = col + * @xpxl = x pixels + * @ypxl = y pixels + * return: -1 error or 0 ok + */ +int ioChgWinPTY(int ptyfd, unsigned short row, unsigned short col, + unsigned short xpxl, unsigned short ypxl); +/* + * ioSetOwnerTTY() - Set owner to TTY + * + * @ttyname = tty filename + * @UID = uid + * @GID = gid + * return: -1 error or 0 ok + */ +int ioSetOwnerTTY(const char *ttyname, uid_t UID, gid_t GID); +/* + * ioSetSidTTY() - Makes the process's controlling TTY and sets it to sane modes. + * + * @ttyfd = slave fd, tty + * @ttyname = tty filename + * return: -1 error or 0 ok + */ +int ioSetSidTTY(int *ttyfd, const char *ttyname); +/* + * ioSetRAWMode() - Enter into RAW mode + * + * @fd = tty fd + * @otio = saved old termios for later restore if !=NULL + * return: -1 error or 0 ok + */ +int ioSetRAWMode(int fd, struct termios *otio); +/* + * ioRestoreMode() - Restore termios to tty fd + * + * @fd = tty fd + * @tio = termios structure for restore + * return: -1 error or 0 ok + */ +int ioRestoreMode(int fd, struct termios tio); +/* + * 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); + +/* + * ioCreatePIDFile() - Create PID file + * + * @csName = PID filename + * @ifExists = !=0 if filename exists return error + * return: -1 error or 0 ok + */ +int ioCreatePIDFile(const char *csName, int ifExists); + +/* + * ioSendFile() - AITNET sendfile() userland implementation, not dependant from OS + * + * @s = socket + * @csFile = file for send + * @sendLen = bytes to send, if 0 send all data + * @offset = start file offset + * @sndbuf = SO_SNDBUF value, if 0 use default + * return: 0 error, >0 ok, sended bytes + */ +size_t ioSendFile(int s, const char *csFile, size_t sendLen, off_t offset, int sndbuf); +/* + * ioRecvFile() - Receive file from socket, fastest (zero-copy) way + * + * @s = socket + * @csFile = file for receive + * @recvLen = receive bytes + * @over = overwrite file if exists with mode like 0644 + * @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); + +/* + * ioRealFileName() - Get real file name + * + * @fname = filename + * return: =NULL error or !=NULL real filename, should be free with e_free() + */ +char *ioRealFileName(const char *fname); + +/* Buffered file access over memory block */ + +/* + * io_fmemopen() - File buffered stream operations over memory block + * + * @base = Base address of memory block, if =NULL Infinit length(auto-grow) + * @basesize = Size of memory block + * return: NULL error or !=NULL Opened file resource + */ +FILE *io_fmemopen(void ** __restrict base, off_t basesize); +/* + * io_fmapopen() - File buffered stream operations over MMAP block + * + * @csFile = Filename for MMAP, if =NULL private MMAP block + * @mode = File open mode + * @perm = If file not exists will be created with this access permissions + * @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_fd2buf() - Convert open file handle to buffered file I/O + * + * @fd = File handle + * @mode = Permissions for new buffered file I/O + * return: NULL error or open buffered file + */ +FILE *io_fd2buf(int fd, const char *mode); +/* + * io_dumbFile() - Create empry or dumb file with fixed size + * + * @csFile = Filename for create + * @mode = File access permissions + * @size = File size + * return: -1 error or open file handle + */ +int io_dumbFile(const char *csFile, int mode, off_t size); #endif