Diff for /libaitio/inc/aitio.h between versions 1.29 and 1.42

version 1.29, 2013/03/13 14:54:39 version 1.42, 2016/08/18 09:06:31
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013Copyright 2004 - 2016
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 53  SUCH DAMAGE. Line 53  SUCH DAMAGE.
 #include <syslog.h>  #include <syslog.h>
 #include <openssl/evp.h>  #include <openssl/evp.h>
 #include <openssl/aes.h>  #include <openssl/aes.h>
 #include <sys/tty.h>  
 #include <sys/ioctl_compat.h>  
 #include <sys/socket.h>  #include <sys/socket.h>
 #include <sys/un.h>  #include <sys/un.h>
 #include <sys/uio.h>  #include <sys/uio.h>
   #ifndef __linux__
   #include <sys/tty.h>
   #include <sys/ioctl_compat.h>
 #include <net/if_dl.h>  #include <net/if_dl.h>
   #include <net/bpf.h>
   #endif
 #include <netinet/in.h>  #include <netinet/in.h>
   #include <elwix.h>
   #include <aitsched.h>
   
   
 #ifndef STRSIZ  #ifndef STRSIZ
#define STRSIZ          256#define STRSIZ                  256
 #endif  #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();
   
   
 /*  /*
    * 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]   * 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
Line 82  inline const char *io_GetError(); Line 328  inline const char *io_GetError();
  * @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]
  *   *
Line 93  int ioPromptRead(int *h, const char *csPrompt, char *  Line 340  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);
   
   
 /*  /*
Line 125  int ioWatchDirLoop(const char *csDir, int (*callback)( Line 373  int ioWatchDirLoop(const char *csDir, int (*callback)(
  * @sig = Event for completed operations, may be =NULL   * @sig = Event for completed operations, may be =NULL
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int io_aiobulk(int mode, struct aiocb ** __restrict acbs, int nacb, int io_aiobulk(int mode, struct aiocb ** __restrict acbs, int nacb, 
                 struct sigevent *sig);                  struct sigevent *sig);
 #endif  #endif
 /*  /*
Line 162  int io_rwritev(int fd, struct iovec * __restrict bufs, Line 410  int io_rwritev(int fd, struct iovec * __restrict bufs,
  * @update = Update file handle position !0   * @update = Update file handle position !0
  * return: -1 error or !=-1 readed bytes   * return: -1 error or !=-1 readed bytes
  */   */
inline int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, 
                 int update);                  int update);
 /*  /*
  * io_rwrite() - Raw VFS write function   * io_rwrite() - Raw VFS write function
Line 174  inline int io_rread(int fd, void * __restrict buf, siz Line 422  inline int io_rread(int fd, void * __restrict buf, siz
  * @update = Update file handle position !0   * @update = Update file handle position !0
  * return: -1 error or !=-1 written bytes   * return: -1 error or !=-1 written bytes
  */   */
inline int io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, 
                 int update);                  int update);
   
 /* Disk I/O helper macros */  /* Disk I/O helper macros */
Line 237  int io_ctr_AES(unsigned char *pInput, int inLen, unsig Line 485  int io_ctr_AES(unsigned char *pInput, int inLen, unsig
  * @winz = winsize for terminal   * @winz = winsize for terminal
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int ioAllocPTY(int *ptyfd, int *ttyfd, char * __restrict name, int namesiz, int ioAllocPTY(int *ptyfd, int *ttyfd, char * __restrict name, int namesiz, 
                 struct termios * __restrict term, struct winsize * __restrict winz);                  struct termios * __restrict term, struct winsize * __restrict winz);
 /*  /*
  * ioFreePTY() - Release PTY and TTY device   * ioFreePTY() - Release PTY and TTY device
Line 246  inline int ioAllocPTY(int *ptyfd, int *ttyfd, char * _ Line 494  inline int ioAllocPTY(int *ptyfd, int *ttyfd, char * _
  * @ttyname = tty filename   * @ttyname = tty filename
  * return: none   * return: none
  */   */
inline void ioFreePTY(int ptyfd, const char *ttyname);void ioFreePTY(int ptyfd, const char *ttyname);
 /*  /*
  * ioChgWinPTY() - Change window size of PTY   * ioChgWinPTY() - Change window size of PTY
  *   *
Line 257  inline void ioFreePTY(int ptyfd, const char *ttyname); Line 505  inline void ioFreePTY(int ptyfd, const char *ttyname);
  * @ypxl = y pixels   * @ypxl = y pixels
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int ioChgWinPTY(int ptyfd, unsigned short row, unsigned short col, int ioChgWinPTY(int ptyfd, unsigned short row, unsigned short col, 
                 unsigned short xpxl, unsigned short ypxl);                  unsigned short xpxl, unsigned short ypxl);
 /*  /*
  * ioSetOwnerTTY() - Set owner to TTY   * ioSetOwnerTTY() - Set owner to TTY
Line 283  int ioSetSidTTY(int *ttyfd, const char *ttyname); Line 531  int ioSetSidTTY(int *ttyfd, const char *ttyname);
  * @otio = saved old termios for later restore if !=NULL   * @otio = saved old termios for later restore if !=NULL
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int ioSetRAWMode(int fd, struct termios *otio);int ioSetRAWMode(int fd, struct termios *otio);
 /*  /*
  * ioRestoreMode() - Restore termios to tty fd   * ioRestoreMode() - Restore termios to tty fd
  *   *
Line 291  inline int ioSetRAWMode(int fd, struct termios *otio); Line 539  inline int ioSetRAWMode(int fd, struct termios *otio);
  * @tio = termios structure for restore   * @tio = termios structure for restore
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int ioRestoreMode(int fd, struct termios tio);int ioRestoreMode(int fd, struct termios tio);
 /*  /*
  * ioForkPTY() - Fork new process with session leader and new TTY   * ioForkPTY() - Fork new process with session leader and new TTY
  *   *
Line 313  pid_t ioForkPTY(int *ptyfd, char * __restrict name, in Line 561  pid_t ioForkPTY(int *ptyfd, char * __restrict name, in
  * @ifExists = !=0 if filename exists return error   * @ifExists = !=0 if filename exists return error
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline int ioCreatePIDFile(const char *csName, int ifExists);int ioCreatePIDFile(const char *csName, int ifExists);
   
 /*  /*
  * ioSendFile() - AITNET sendfile() userland implementation, not dependant from OS   * ioSendFile() - AITNET sendfile() userland implementation, not dependant from OS
Line 338  size_t ioSendFile(int s, const char *csFile, size_t se Line 586  size_t ioSendFile(int s, const char *csFile, size_t se
  */   */
 size_t ioRecvFile(int s, const char *csFile, size_t recvLen, int over, int rcvbuf);  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 */  /* Buffered file access over memory block */
   
Line 368  FILE *io_fmapopen(const char *csFile, int mode, int pe Line 623  FILE *io_fmapopen(const char *csFile, int mode, int pe
  * @mode = Permissions for new buffered file I/O   * @mode = Permissions for new buffered file I/O
  * return: NULL error or open buffered file   * return: NULL error or open buffered file
  */   */
inline FILE *io_fd2buf(int fd, const char *mode);FILE *io_fd2buf(int fd, const char *mode);
 /*  /*
  * io_dumbFile() - Create empry or dumb file with fixed size   * io_dumbFile() - Create empry or dumb file with fixed size
  *   *
Line 378  inline FILE *io_fd2buf(int fd, const char *mode); Line 633  inline FILE *io_fd2buf(int fd, const char *mode);
  * return: -1 error or open file handle   * return: -1 error or open file handle
  */   */
 int io_dumbFile(const char *csFile, int mode, off_t size);  int io_dumbFile(const char *csFile, int mode, off_t size);
   #define io_emptyFile io_dumbFile
   
   
   /*
    * 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);
   
   #ifndef __linux__
   /*
    * 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
   
   /*
    * 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  #endif

Removed from v.1.29  
changed lines
  Added in v.1.42


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