Diff for /libaitio/inc/aitio.h between versions 1.3 and 1.30

version 1.3, 2010/03/22 15:21:20 version 1.30, 2013/05/30 09:10:13
Line 1 Line 1
 /*************************************************************************  /*************************************************************************
* (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>* (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
*  by Michael Pounov <misho@openbsd-bg.org>*  by Michael Pounov <misho@elwix.org>
 *  *
 * $Author$  * $Author$
 * $Id$  * $Id$
 *  *
*************************************************************************/**************************************************************************
#ifndef __AITIO_HThe ELWIX and AITNET software is distributed under the following
#define __AITIO_Hterms:
   
   All of the documentation and software included in the ELWIX and AITNET
   Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
typedef struct _tagURLItem {Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
        int     vallen;        by Michael Pounov <misho@elwix.org>.  All rights reserved.
        char    *value; 
} url_Item_t; 
   
struct tagIOURL {Redistribution and use in source and binary forms, with or without
        unsigned char   url_line[BUFSIZ];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 <misho@elwix.org>
 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.
   
        url_Item_t      url_tech;THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
        url_Item_t      url_user;ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        url_Item_t      url_pass;IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        url_Item_t      url_host;ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        url_Item_t      url_port;FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        url_Item_t      url_path;DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        url_Item_t      url_args;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
   
         char            *url_reserved;  
 };  
   
struct tagIOCmd {#define COMPAT_43TTY
        const char *cmd_name; 
        int (*cmd_func)(void *, FILE *, char **); 
        const char *cmd_doc; 
        const char *cmd_help; 
        char *(*cmd_comp)(const char *, int); 
}; 
   
typedef struct tagIOCmd ioCommands_t;#include <assert.h>
typedef char *io_CompEntry_t(const char *, int);#include <syslog.h>
typedef char **io_Completion_t(const char *, int, int);#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 <netinet/in.h>
   
   
   #ifndef STRSIZ
   #define STRSIZ          256
   #endif
   
   
 // 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 58  inline const char *io_GetError(); Line 84  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 68  int ioPromptRead(int *h, const char *csPrompt, char *  Line 95  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 * ioMkDir() - Function for racursive directory creation and validation
 * @csRegex = Regulare expression pattern *
 * @csData = Data for check and verify * @csDir = Full directory path
 * @startPos = Return start positions * @mode = Mode for directory creation if missing dir
 * @endPos = Return end positions * return: -1 error, 0 directory path exist, >0 created missing dirs
 * return: NULL not match or error; !=NULL begin of matched data 
 */  */
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 * ioWatchDirLoop() - Function for watching changes in directory and fire callback
 * @csRegex = Regulare expression pattern *
 * @csData = Data from get * @csDir = Full directory path
 * @psString = Returned string if match * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create
 * @strLen = Length of string * return: -1 error, !=-1 ok, number of total signaled events
 * return: 0 not match; >0 count of returned chars 
 */  */
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));
/* 
 * 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); 
   
   
   #ifdef AIO_OPS
 /*  /*
 * io_Path2File() Parse and make path/filename pair * io_aiobulk() - AIO bulk R/W function
 * @csArgs = Input argument line *
 * @psPath = Output Path, if ==NULL path not returned * @mode = Bulk wait mode
 * @pathLen = Size of path array * @acbs = List of aiocb structures
 * @psFile = Output File * @nacb = Number of aiocb in list
 * @fileLen = Size of file array * @sig = Event for completed operations, may be =NULL
 * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items * return: -1 error or 0 ok
*/ */
inline int io_Path2File(const char * __restrict csArgs, char * __restrict psPath, int pathLen, int io_aiobulk(int mode, struct aiocb ** __restrict acbs, int nacb, 
                char * __restrict psFile, int fileLen);                struct sigevent *sig);
 #endif
 /*  /*
 * io_MakeAV() Parse and make attribute/value pair * io_rreadv() - Raw VFS bulk read function
 * @csArgs = Input argument line *
 * @csDelim = Delimiter for separate * @fd = File handle
 * @psAttr = Output Attribute * @bufs = Read buffers
 * @attrLen = Size of attribute array * @nbufs = Number of read buffers
 * @psValue = Output Value, if ==NULL this element not present value or not wanted for return * @offset = Read from position, if -1 read nbytes from current position
 * @valLen = Size of value array * @update = Update file handle position !0
 * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items * return: -1 error or !=-1 readed bytes
*/ */
inline int io_MakeAV(const char * __restrict csArgs, const char *csDelim, int io_rreadv(int fd, struct iovec * __restrict bufs, int nbufs, off_t offset, 
                char * __restrict psAttr, int attrLen, char * __restrict psValue, int valLen);                int update);
 /*  /*
 * io_SizeArray() Parse and calculate size of array * io_rwritev() - Raw VFS bulk write function
 * @csArgs = Input arguments line *
 * @csDelim = Delimiter(s) for separate * @fd = File handle
 * return: 0 error format; -1 error:: can`t read; >0 ok, number of items * @bufs = Write buffers
*/ * @nbufs = Number of write buffers
inline int io_SizeArray(const char *csArgs, const char *csDelim); * @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_MakeArray() Parse and make array of arguments values ...  * io_rread() - Raw VFS read function
 *      (input string will be modified! and output array must be free) *
 * @psArgs = Input arguments line, after execute string is modified!!! * @fd = File handle
 * @csDelim = Delimiter(s) for separate * @buf = Read buffer
 * @args = Output array of arguments ... (must be free() after procced function!) * @nbytes = Read buffer size
 * @nargs = Maximum requested count of arguments from input string psArgs * @offset = Read from position, if -1 read nbytes from current position
 * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items * @update = Update file handle position !0
*/ * return: -1 error or !=-1 readed bytes
inline int io_MakeArray(char * __restrict psArgs, const char *csDelim,  */
                char *** __restrict args, int nargs);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 */
   
 /*  /*
 * ioURLGet() Parse and get data from input URL * ioCipher() - Cipher wrapper for all supported crypto algorythms
 * @csURL = Input URL line *
 * @url = Output parsed URL * @pInput = input buffer
 * return: 0 error format not find tech:// and return URL like path;  * @inLen = input buffer len
                -1 error:: can`t read; >0 ok, up bits for known elements * @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 ioURLGet(const char *csURL, struct tagIOURL *url);int ioCipher(unsigned char *pInput, int inLen, unsigned char **ppOutput, const EVP_CIPHER *Cipher, 
                 unsigned char *pKey, unsigned char *pIV, int nMode);
 
 /*  /*
 * ioURLGetValue() Get value from parsed URL * io_Blowfish() - Blowfish cipher algorythm, work with ASCII hex strings
 * @url = Input parsed URL *
 * @csAttr = Attribute for search * @pInput = input buffer
 * @psValue = Return value of attribute, if ==NULL only check for existence of attribute * @inLen = input buffer len
 * @valLen = Size of psValue array * @ppOutput = output allocated buffe, must be e_free after use
 * return: 0 error attribute not find; -1 error:: can`t read; >0 ok, find at position * @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 ioURLGetValue(struct tagIOURL *url, const char *csAttr, char * __restrict psValue, int valLen);int io_Blowfish(unsigned char *pInput, int inLen, unsigned char **ppOutput, 
                 unsigned char *pKey, unsigned char *pIV, int nMode);
 /*  /*
 * ioURLGetFile() Get file from parsed URL * io_ctr_AES() - Encrypt/Decrypt stream cipher CTR_AES
 * @url = Input parsed URL *
 * @psValue = Return filename, if not specified file in url path, replace with / * @pInput = Input buffer with ASCII
 * @valLen = Size of psValue array * @inLen = Input buffer data length
 * return: -1 error:: can`t read; 0 ok * @ppOutput = Output buffer with cipher data, must be e_free after use
*/ * @pKey = Key
int ioURLGetFile(struct tagIOURL *url, char * __restrict psValue, int valLen); * @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]);
   
   
 /*  /*
 * ioCLIComp() Initialize completion CLI features * ioAllocPTY() - Allocate new PTY and TTY
 * @cmdComplete = Completion function *
 * @cmdEntry = Compentry function * @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   * return: none
*/ */
inline void ioCLIComp(io_Completion_t *cmdComplete, io_CompEntry_t *cmdEntry);void ioFreePTY(int ptyfd, const char *ttyname);
 /*  /*
 * ioCLIExec() Execute CLI main loop * ioChgWinPTY() - Change window size of PTY
 * @cmdList = Commands list *
 * @out = Output handle * @ptyfd = master fd, pty
 * @csPrompt = Prompt text * @row = row
 * return: -1 error, 0 = exit w/^+D, 1 done. * @col = col
*/ * @xpxl = x pixels
int ioCLIExec(ioCommands_t *cmdList, FILE *out, const char *csPrompt); * @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);
 /*  /*
 * io_Cmd_Unsupported() Builtin helper function for unsupported commands * ioSetOwnerTTY() - Set owner to TTY
 * @cmds = Commands list *
 * @out = Output handle * @ttyname = tty filename
 * @args = Parsed arguments array * @UID = uid
 * return: -1 error, 0 = ok, 1 exit from Cli! * @GID = gid
*/ * return: -1 error or 0 ok
int io_Cmd_Unsupported(void *cmds, FILE *out, char ** __restrict args); */
 int ioSetOwnerTTY(const char *ttyname, uid_t UID, gid_t GID);
 /*  /*
 * io_Cmd_Help() Builtin helper function for Help screen * ioSetSidTTY() - Makes the process's controlling TTY and sets it to sane modes.
 * @cmds = Commands list *
 * @out = Output handle * @ttyfd = slave fd, tty
 * @args = Parsed arguments array * @ttyname = tty filename
 * return: -1 error, 0 = ok * return: -1 error or 0 ok
*/ */
int io_Cmd_Help(void *cmds, FILE *out, char ** __restrict args);int ioSetSidTTY(int *ttyfd, const char *ttyname);
 /*  /*
 * io_Cmd_Exit() Builtin helper function for Exit from Cli * ioSetRAWMode() - Enter into RAW mode
 * @cmds = Commands list *
 * @out = Output handle * @fd = tty fd
 * @args = Parsed arguments array * @otio = saved old termios for later restore if !=NULL
 * return: 1 exit from Cli! * return: -1 error or 0 ok
*/ */
int io_Cmd_Exit(void *cmds, FILE *out, char ** __restrict args);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);
   
 /*  /*
 * io_Make_Comp_Commands - Declare helper function for Commands completion arguments * ioSendFile() - AITNET sendfile() userland implementation, not dependant from OS
*/ *
#define IO_MAKE_COMP_COMMANDS(FUNC, CMDS)       \ * @s = socket
        char *FUNC(const char *text, int state) \ * @csFile = file for send
        { \ * @sendLen = bytes to send, if 0 send all data
                register int i; \ * @offset = start file offset
                int len = strlen(text); \ * @sndbuf = SO_SNDBUF value, if 0 use default
                for (i = state; CMDS[i].cmd_name; i++) { \ * return: 0 error, >0 ok, sended bytes
                        if (strncmp(CMDS[i].cmd_name, "---", 3) && \ */
                                        !strncmp(CMDS[i].cmd_name, text, len)) \size_t ioSendFile(int s, const char *csFile, size_t sendLen, off_t offset, int sndbuf);
                                return strdup(CMDS[i].cmd_name); \/*
                } \ * ioRecvFile() - Receive file from socket, fastest (zero-copy) way
                return NULL; \ *
        } * @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_Comp_Filename() Builtin helper function for filename completion arguments * io_fmemopen() - File buffered stream operations over memory block
 * @text = Text line *
 * @state = Position state * @base = Base address of memory block, if =NULL Infinit length(auto-grow)
 * return: NULL not found filename, != NULL filename * @basesize = Size of memory block
*/ * return: NULL error or !=NULL Opened file resource
char *io_Comp_Filename(const char *text, int state); */
 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  #endif

Removed from v.1.3  
changed lines
  Added in v.1.30


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