/************************************************************************* * (C) 2010 AITNET ltd - Sofia/Bulgaria - * by Michael Pounov * * $Author: misho $ * $Id: aitio.h,v 1.32 2013/06/26 22:48:53 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 int io_GetErrno(); // io_GetError() Get error text of last operation const char *io_GetError(); /* * 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 * @dataLen = Length of data * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars */ 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] * * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout * @csPrompt = Prompt before input, may be NULL * @psPass = Readed password * @passLen = Length of password * @confirm = Confirm password, 0 - get password, !=0 Ask for confirmation * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars */ int ioPromptPassword(int *h, const char *csPrompt, char * __restrict psPass, int passLen, int confirm); /* * 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 */ int ioMkDir(const char *csDir, int mode); /* * 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 ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)); #ifdef AIO_OPS /* * 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 */ 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); /* * io_get1stiface() - Get first interface of host * * @szIface = interface string buffer * @iflen = size of interface buffer * return: -1 error or 0 ok */ int io_get1stiface(char *szIface, int iflen); /* * io_etherOpen() - Open BPF interface to device * * @csIface = interface name * @flags = open flags * @whdr = with complete headers * @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, 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_etherSend() - Send packet to bpf * * @eth = bpf handle * @buf = buffer * @buflen = buffer length * return: -1 error or !=-1 written bytes */ ssize_t io_etherSend(int eth, const void *buf, size_t buflen); /* * io_etherRecv() - Receive packet from bpf * * @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