--- libaitio/inc/aitio.h 2010/02/23 22:54:52 1.1 +++ libaitio/inc/aitio.h 2013/05/30 09:10:13 1.30 @@ -1,23 +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.1 2010/02/23 22:54:52 misho Exp $ +* $Id: aitio.h,v 1.30 2013/05/30 09:10:13 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 +#define COMPAT_43TTY + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#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 @@ -26,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 @@ -36,32 +95,289 @@ 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 + * 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 */ -const char *ioRegexVerify(const char *csRegex, const char *csData, int *startPos, int *endPos); +int ioMkDir(const char *csDir, int mode); + /* - * 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 + * 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 */ -int ioRegexGet(const char *csRegex, const char *csData, char * __restrict psString, int strLen); +int ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)); + + +#ifdef AIO_OPS /* - * 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! + * 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 +/* + * 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); +/* + * 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 + * + * @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 + */ +int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, + int update); +/* + * 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 written bytes + */ +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) + + +/* Crypto framework */ + +/* + * 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 */ -char *ioRegexReplace(const char *csRegex, const char *csData, const char *csNew); +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); + + +/* 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