Diff for /libaitio/inc/aitio.h between versions 1.4.2.5 and 1.42.2.1

version 1.4.2.5, 2010/09/07 17:04:15 version 1.42.2.1, 2019/10/08 12:58:55
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$
 *  *
*************************************************************************/**************************************************************************
 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 <info@elwix.org>
 
 Copyright 2004 - 2016
         by Michael Pounov <misho@elwix.org>.  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 <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.
 
 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  #ifndef __AITIO_H
 #define __AITIO_H  #define __AITIO_H
   
   
typedef struct _tagURLItem {#define COMPAT_43TTY
        int     vallen; 
        char    *value; 
} url_Item_t; 
   
struct tagIOURL {#include <assert.h>
        unsigned char   url_line[BUFSIZ];#include <syslog.h>
 #include <openssl/crypto.h>
 #include <openssl/aes.h>
 #include <openssl/evp.h>
 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
         #include <openssl/modes.h>
 #endif
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <sys/uio.h>
 #ifndef __linux__
 #include <sys/tty.h>
 #include <sys/ioctl_compat.h>
 #include <net/if_dl.h>
 #include <net/bpf.h>
 #endif
 #include <netinet/in.h>
 #include <elwix.h>
 #include <aitsched.h>
   
         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 evp_cipher_ctx_st
 struct evp_cipher_ctx_st {
     const EVP_CIPHER *cipher;
     ENGINE *engine;             /* functional reference if 'cipher' is
                                  * ENGINE-provided */
     int encrypt;                /* encrypt or decrypt */
     int buf_len;                /* number we have left */
     unsigned char oiv[EVP_MAX_IV_LENGTH]; /* original iv */
     unsigned char iv[EVP_MAX_IV_LENGTH]; /* working iv */
     unsigned char buf[EVP_MAX_BLOCK_LENGTH]; /* saved partial block */
     int num;                    /* used by cfb/ofb/ctr mode */
     /* FIXME: Should this even exist? It appears unused */
     void *app_data;             /* application stuff */
     int key_len;                /* May change for variable length cipher */
     unsigned long flags;        /* Various flags */
     void *cipher_data;          /* per EVP data */
     int final_used;
     int block_mask;
     unsigned char final[EVP_MAX_BLOCK_LENGTH]; /* possible final block */
 } /* EVP_CIPHER_CTX */ ;
 #endif
 
 #ifndef STRSIZ
 #define STRSIZ                  256
 #endif
 
 #define IO_SOCK_ROLE_CLIENT     0
 #define IO_SOCK_ROLE_SERVER     1
 
 #define IO_ETHER_FILTER_PROMISC 0
 #define IO_ETHER_FILTER_NOTREAD -1
 #define IO_ETHER_FILTER_READ    1
 #define IO_ETHER_FILTER_WRITE   2
 
 
 typedef struct {
         unsigned int                    prog_inin;      /* init progs */
         unsigned int                    prog_maxn;      /* max progs */
         unsigned int                    prog_cnum;      /* current progs */
         char                            prog_name[PATH_MAX];
 
         pthread_mutex_t                 prog_mtx;
         array_t                         *prog_fds;
         unsigned int                    *prog_used;
 } prog_t;
 
 typedef struct tagCliSock sock_cli_t;
 typedef void *(*sock_cb_t)(sock_cli_t*);
 struct tagCliSock {
         void                            *cli_parent;
         int                             cli_fd;
         intptr_t                        cli_pty;
         sockaddr_t                      cli_addr;
         char                            cli_name[64];
         char                            cli_cmdline[PATH_MAX];
         pid_t                           cli_pid;
 
         sched_task_func_t               cli_func;
 
         ait_val_t                       cli_buf[2];
 
         TAILQ_ENTRY(tagCliSock)         cli_node;
 };  };
   
   typedef struct {
           int                             sock_role;
           int                             sock_backq;
           int                             sock_type;
           int                             sock_proto;
           int                             sock_fd;
           struct timespec                 sock_timeout;
           sockaddr_t                      sock_addr;
           sockaddr_t                      sock_peer;
   
           ait_val_t                       sock_buf;
           prog_t                          *sock_prog;
   
           volatile intptr_t               sock_kill;
           sched_root_task_t               *sock_root;
   
           pthread_mutex_t                 sock_mtx;
           TAILQ_HEAD(, tagCliSock)        sock_cli;
   } sock_t;
   
   
 // 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] * io_progInit() - Init program pool
  *
  * @progName = program name for execution
  * @initNum = initial started programs
  * @maxNum = maximum started programs
  * return: NULL error or !=NULL allocated pool (must destroied with io_progDestroy())
  */
 prog_t *io_progInit(const char *progName, 
                 unsigned int initNum, unsigned int maxNum);
 /*
  * io_progOpen() - Execute number of program(s)
  *
  * @prg = program pool
  * @execNum = execute program(s) (0 max)
  * return: -1 error, >0 executed programs
  */
 int io_progOpen(prog_t * __restrict prg, unsigned int execNum);
 /*
  * io_progOpen2() - Start program from pool on first unused slot
  *
  * @prg = program pool
  * return: -1 error, >-1 reside at slot
  */
 int io_progOpen2(prog_t * __restrict prg);
 /*
  * io_progGrow() - Execute to number of programs in pool
  *
  * @prg = program pool
  * @toNum = execute to number of programs (0 max)
  * return: 0 error or nothing to do, 
  *      >0 executed programs and abs(<0) executed programs with logged error
  */
 int io_progGrow(prog_t * __restrict prg, unsigned int toNum);
 /*
  * io_progVacuum() - Vacuum pool to running number of programs
  *
  * @prg = program pool
  * @toNum = vacuum to number of programs (0 to init number)
  * return: 0 error or >0 closed programs
  */
 int io_progVacuum(prog_t * __restrict prg, unsigned int toNum);
 /*
  * io_progCloseAt() - Close program at pool of certain position
  *
  * @prg = program pool
  * @idx = index at pool
  * return: 0 error or !=0 closed program
  */
 int io_progCloseAt(prog_t * __restrict prg, unsigned int idx);
 /*
  * io_progCloseOf() - Close program at pool with certain handle
  *
  * @prg = program pool
  * @h = handle of program
  * return: 0 error, >0 closed programs
  */
 #ifdef POPEN_STREAM
 int io_progCloseOf(prog_t * __restrict prg, FILE *h);
 #else
 int io_progCloseOf(prog_t * __restrict prg, int h);
 #endif
 /*
  * io_progClose() - Close all programs in pool
  *
  * @prg = program pool
  * @closeNum = close program(s) (0 all)
  * return: 0 error, >0 closed programs
  */
 int io_progClose(prog_t * __restrict prg, unsigned int closeNum);
 /*
  * io_progDestroy() - Destroy entire program pool
  *
  * @pprg = program pool
  * return: none
  */
 void io_progDestroy(prog_t ** __restrict pprg);
 
 /*
  * io_progCheck() - Check exit status of program pool
  *
  * @prg = program pool
  * @re = resurrect program to init number
  * return: -1 error or >-1 exited programs
  */
 int io_progCheck(prog_t * __restrict prg, int re);
 
 /*
  * io_progAttach() - Attach to open program
  *
  * @prg = program pool
  * @newOne = Execute new one program after attach
  * return: NULL error or !=NULL attached program handle
  */
 #ifdef POPEN_STREAM
 FILE *io_progAttach(prog_t * __restrict prg, int newOne);
 #else
 int io_progAttach(prog_t * __restrict prg, int newOne);
 #endif
 /*
  * io_progDetach() - Detch from open program
  *
  * @prg= program pool
  * @pfd = attached program handle
  * return: none
  */
 #ifdef POPEN_STREAM
 void io_progDetach(prog_t * __restrict prg, FILE *pfd);
 #else
 void io_progDetach(prog_t * __restrict prg, int pfd);
 #endif
 
 
 /*
  * ioInitSocket() - Init socket and allocate resources
  *
  * @role = Socket role
  * @type = Socket type
  * @proto = Socket protocol
  * @addr = Bind to address
  * @port = Bind to port
  * @buflen = Socket buffer, optional if =0 == BUFSIZ
  * return: NULL error or !=NULL created socket
  */
 sock_t *ioInitSocket(int role, int type, int proto, 
                 const char *addr, unsigned short port, size_t buflen);
 /*
  * ioCloseSocket() - Close socket and free resources
  *
  * @s = Socket
  * return: none
  */
 void ioCloseSocket(sock_t ** __restrict s);
 #define ioKillSocket(x)         (assert((x)), (x)->sock_kill = 1)
 /*
  * ioCloseClient() - Close client socket
  *
  * @c = Client socket
  * return: 0 ok or !=0 error
  */
 int ioCloseClient(sock_cli_t * __restrict c);
 /*
  * ioSetupProg2Socket() - Setup program pool to socket server
  *
  * @s = Socket
  * @p = Program pool
  * return: -1 error or 0 ok
  */
 int ioSetupProg2Socket(sock_t * __restrict s, prog_t * __restrict p);
 /*
  * ioUpSocket() - Setup socket for use
  *
  * @s = Socket
  * @arg = Server role = listen backlog queue and Client role = peer address
  * @timeout = Socket timeout in ms (default -1 infinit)
  * return: -1 error or 0 ok
  */
 int ioUpSocket(sock_t * __restrict s, void *arg, int timeout);
 /*
  * ioUpdTimerSocket() - Update timeout of socket
  *
  * @c = Client socket
  * return:  none
  */
 void ioUpdTimerSocket(sock_cli_t * __restrict c);
 /*
  * ioLoopSocket() - Start socket scheduler
  *
  * @s = Socket
  * @rcb = Read callback
  * return: -1 error or return result from scheduler
  */
 int ioLoopSocket(sock_t * __restrict s, sched_task_func_t rcb);
 /*
  * ioBridgeProg2Socket() - Start socket scheduler and bridge program to socket
  *
  * @s = Socket
  * @prgname = Program name
  * return: 0 ok or !=0 error
  */
 int ioBridgeProg2Socket(sock_t * __restrict s, const char *prgname);
 
 
 /*
  * 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
  * @dataLen = Length of data   * @dataLen = Length of data
  * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars   * 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);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 54  int ioPromptRead(int *h, const char *csPrompt, char *  Line 366  int ioPromptRead(int *h, const char *csPrompt, char * 
  * @confirm = Confirm password, 0 - get password, !=0 Ask for confirmation   * @confirm = Confirm password, 0 - get password, !=0 Ask for confirmation
  * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars   * 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);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 */
   
 /*  /*
 * io_UnquotStr() Remove quots from input text string  * ioCipher() - Cipher wrapper for all supported crypto algorythms
 * @psLine = Text string *
 * return: 0 nothing to do; 1 successful unquoted string * @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
 */  */
inline int io_UnquotStr(unsigned char * __restrict psLine);int ioCipher(unsigned char *pInput, int inLen, unsigned char **ppOutput, const EVP_CIPHER *Cipher, 
                 unsigned char *pKey, unsigned char *pIV, int nMode);
 
 /*  /*
 * io_LTrimStr() Remove left whitespaces from text string * io_Blowfish() - Blowfish cipher algorythm, work with ASCII hex strings
 * @psLine = Text string *
 * return: 0 nothing to do; !=0 Removed bytes * @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
 */  */
inline int io_LTrimStr(unsigned char * __restrict psLine);int io_Blowfish(unsigned char *pInput, int inLen, unsigned char **ppOutput, 
                 unsigned char *pKey, unsigned char *pIV, int nMode);
 /*  /*
 * io_RTrimStr() Remove right whitespaces from text string * io_ctr_AES() - Encrypt/Decrypt stream cipher CTR_AES
 * @psLine = Text string *
 * return: 0 nothing to do; !=0 Removed bytes * @pInput = Input buffer with ASCII
*/ * @inLen = Input buffer data length
inline int io_RTrimStr(unsigned char * __restrict psLine); * @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]);
 
 
 /*  /*
 * io_TrimStr() Remove left and right whitespaces from text string * ioAllocPTY() - Allocate new PTY and TTY
 * @psLine = Text string *
 * return: 0 nothing to do; !=0 Removed bytes * @ptyfd = master fd, pty
*/ * @ttyfd = slave fd, tty
inline int io_TrimStr(unsigned char * __restrict psLine); * @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);
 /*  /*
 * io_Ch2Hex() Convert from Char string to Hex string * ioFreePTY() - Release PTY and TTY device
 * @psLine = Text string *
 * @lineLen = Length of Text string * @ptyfd = master fd, pty (==-1 skip closing pty)
 * return: NULL nothing to do or error; !=0 Allocated new converted data without term\0 (must be free) * @ttyname = tty filename
*/ * return: none
inline unsigned char *io_Ch2Hex(unsigned char *psLine, int lineLen); */
 void ioFreePTY(int ptyfd, const char *ttyname);
 /*  /*
 * io_Hex2Ch() Convert from Hex string to Char string * ioChgWinPTY() - Change window size of PTY
 * @psLine = Text string *
 * @lineLen = Length of Text string * @ptyfd = master fd, pty
 * return: NULL nothing to do or error; !=0 Allocated new converted string(must be free) * @row = row
*/ * @col = col
inline char *io_Hex2Ch(unsigned char *psLine, int lineLen); * @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);
   
 /*  /*
 * 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);
   
   /*
    * 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_rread() Raw VFS read function * io_fmemopen() - File buffered stream operations over memory block
 * @fd = File handle *
 * @buf = Read buffer * @base = Base address of memory block, if =NULL Infinit length(auto-grow)
 * @nbytes = Read buffer size * @basesize = Size of memory block
 * @offset = Read from position, if -1 read nbytes from current position * return: NULL error or !=NULL Opened file resource
 * @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_fmemopen(void ** __restrict base, off_t basesize);
 /*  /*
 * io_rwrite() Raw VFS write function * 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   * @fd = File handle
 * @buf = Write buffer * @mode = Permissions for new buffered file I/O
 * @nbytes = Write bytes from buffer * return: NULL error or open buffered file
 * @offset = Write at position, if -1 write nbytes from current position 
 * @update = Update file handle position !0 
 * return: -1 error or !=-1 writed bytes 
  */   */
inline int io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update);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);
 #define io_emptyFile io_dumbFile
   
 /* 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)  
   
   /*
    * io_etherOpen() - Open BPF interface to device
    *
    * @csIface = interface name
    * @flags = open flags
    * @whdr = with complete headers
    * @wdlt = with data link type, on Linux is protocol number
    * @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, unsigned int whdr, 
                   unsigned 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);
   
/* Debug helper macros */#ifndef __linux__
extern int io_Debug;/*
  * io_etherFilter() - BPF filter routine
  *
  * @eth = bpf handle
  * @io = filter direction 
  *  (IO_ETHER_FILTER_PROMISC|IO_ETHER_FILTER_NOTREAD|IO_ETHER_FILTER_READ|IO_ETHER_FILTER_WRITE)
  * @insn = BPF filter instruction array
  * @insnlen = Length of BPF filter instruction array
  * return: -1 error or 0 ok
  */
 int io_etherFilter(int eth, int io, struct bpf_insn * __restrict insn, size_t insnlen);
 #endif
   
#define io_initDebug(x)            io_Debug = (x);/*
#define io_addDebug                io_Debug++ * io_etherSend() - Send packet to bpf
#define ioDEBUG(x, fmt, ...)    do { \ *
                                        assert((fmt)); \ * @eth = bpf handle
                                        char str[STRSIZ] = { 0 }; \ * @buf = buffer
                                        snprintf(str, STRSIZ, (fmt), ##__VA_ARGS__); \ * @buflen = buffer length
                                        if ((x) <= io_Debug) \ * return: -1 error or !=-1 written bytes
                                                syslog(LOG_DEBUG, "Debug(%d):%s(%d): %s\n", \ */
                                                                (x), __func__, __LINE__, str);\ssize_t io_etherSend(int eth, const void *buf, size_t buflen);
                                } while(0)/*
  * 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  #endif

Removed from v.1.4.2.5  
changed lines
  Added in v.1.42.2.1


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