| 
version 1.33.2.2, 2013/08/12 23:25:35
 | 
version 1.38.10.9, 2013/12/08 20:43:22
 | 
| 
 Line 62  SUCH DAMAGE.
 | 
 Line 62  SUCH DAMAGE.
 | 
 |  #include <net/bpf.h> | 
  #include <net/bpf.h> | 
 |  #include <netinet/in.h> | 
  #include <netinet/in.h> | 
 |  #include <elwix.h> | 
  #include <elwix.h> | 
 |   | 
  #include <aitsched.h> | 
 |   | 
   | 
 |   | 
   | 
 |  #ifndef STRSIZ | 
  #ifndef STRSIZ | 
| 
 Line 71  SUCH DAMAGE.
 | 
 Line 72  SUCH DAMAGE.
 | 
 |  #define IO_SOCK_ROLE_CLIENT     0 | 
  #define IO_SOCK_ROLE_CLIENT     0 | 
 |  #define IO_SOCK_ROLE_SERVER     1 | 
  #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 tagCliSock sock_cli_t; | 
 |   | 
  typedef void *(*sock_cb_t)(sock_cli_t*); | 
 |   | 
  struct tagCliSock { | 
 |   | 
          void                            *cli_parent; | 
 |   | 
          int                             cli_fd; | 
 |   | 
          int                             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 { | 
  typedef struct { | 
|         int                sock_role; |         int                             sock_role; | 
|         int             sock_backq; |         int                             sock_backq; | 
|         int             sock_type; |         int                             sock_type; | 
|         int             sock_proto; |         int                             sock_proto; | 
|         int             sock_fd; |         int                             sock_fd; | 
|         sockaddr_t      sock_addr; |         struct timespec                 sock_timeout; | 
|   |         sockaddr_t                      sock_addr; | 
|   |         sockaddr_t                      sock_peer; | 
 |   | 
   | 
|         sockaddr_t        sock_peer; |         ait_val_t                       sock_buf; | 
 |   | 
   | 
|         ait_val_t        sock_buf; |         volatile intptr_t                sock_kill; | 
|   |         sched_root_task_t               *sock_root; | 
|   |  | 
|   |         pthread_mutex_t                 sock_mtx; | 
|   |         TAILQ_HEAD(, tagCliSock)        sock_cli; | 
 |  } sock_t; | 
  } sock_t; | 
 |   | 
   | 
 |   | 
  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; | 
 |   | 
   | 
 |   | 
   | 
 |  // io_GetErrno() Get error code of last operation | 
  // io_GetErrno() Get error code of last operation | 
 |  int io_GetErrno(); | 
  int io_GetErrno(); | 
 |  // io_GetError() Get error text of last operation | 
  // io_GetError() Get error text of last operation | 
| 
 Line 93  const char *io_GetError();
 | 
 Line 134  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: 0 error, >0 executed programs and abs(<0) executed programs with logged error | 
 |   | 
   */ | 
 |   | 
  int io_progOpen(prog_t * __restrict prg, unsigned int execNum); | 
 |   | 
  /* | 
 |   | 
   * io_progGrow() - Execute to number of programs in pool | 
 |   | 
   * | 
 |   | 
   * @prg = program pool | 
 |   | 
   * @toNum = execute to number of programs (0 max) | 
 |   | 
   * return: 0 error, >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_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 | 
 |   | 
   * return: -1 error or >-1 exited programs | 
 |   | 
   */ | 
 |   | 
  int io_progCheck(prog_t * __restrict prg); | 
 |   | 
   | 
 |   | 
  /* | 
 |   | 
   * io_progAttach() - Attach to open program | 
 |   | 
   * | 
 |   | 
   * @prg = program pool | 
 |   | 
   * return: NULL error or !=NULL attached program handle | 
 |   | 
   */ | 
 |   | 
  #ifdef POPEN_STREAM | 
 |   | 
  FILE *io_progAttach(prog_t * __restrict prg); | 
 |   | 
  #else | 
 |   | 
  int io_progAttach(prog_t * __restrict prg); | 
 |   | 
  #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 | 
   * ioInitSocket() - Init socket and allocate resources | 
 |   * | 
   * | 
 |   * @role = Socket role | 
   * @role = Socket role | 
| 
 Line 112  sock_t *ioInitSocket(int role, int type, int proto, 
 | 
 Line 244  sock_t *ioInitSocket(int role, int type, int proto, 
 | 
 |   * return: none | 
   * return: none | 
 |   */ | 
   */ | 
 |  void ioCloseSocket(sock_t ** __restrict s); | 
  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); | 
 |   | 
  /* | 
 |   * ioUpSocket() - Setup socket for use | 
   * ioUpSocket() - Setup socket for use | 
 |   * | 
   * | 
 |   * @s = Socket | 
   * @s = Socket | 
 |   * @arg = Server role = listen backlog queue and Client role = peer address | 
   * @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 | 
   * return: -1 error or 0 ok | 
 |   */ | 
   */ | 
| int ioUpSocket(sock_t * __restrict s, void *arg); | 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] | 
 |   * | 
   * | 
| 
 Line 130  int ioUpSocket(sock_t * __restrict s, void *arg);
 | 
 Line 295  int ioUpSocket(sock_t * __restrict s, void *arg);
 | 
 |   * @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 141  int ioPromptRead(int *h, const char *csPrompt, char * 
 | 
 Line 307  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 444  int io_dumbFile(const char *csFile, int mode, off_t si
 | 
 Line 611  int io_dumbFile(const char *csFile, int mode, off_t si
 | 
 |   */ | 
   */ | 
 |  int io_get1stiface(char *szIface, int iflen); | 
  int io_get1stiface(char *szIface, int iflen); | 
 |  /* | 
  /* | 
 |   | 
   * io_getmaciface() - Get MAC address from interface name | 
 |   | 
   * | 
 |   | 
   * @csIface = interface name | 
 |   | 
   * @ea = ethernet address | 
 |   | 
   * return: -1 error, 0 ok or 1 not found | 
 |   | 
   */ | 
 |   | 
  int io_getmaciface(const char *csIface, ether_addr_t * __restrict ea); | 
 |   | 
  /* | 
 |   * io_etherOpen() - Open BPF interface to device | 
   * io_etherOpen() - Open BPF interface to device | 
 |   * | 
   * | 
 |   * @csIface = interface name | 
   * @csIface = interface name | 
| 
 Line 464  int io_etherOpen(const char *csIface, int flags, int w
 | 
 Line 639  int io_etherOpen(const char *csIface, int flags, int w
 | 
 |   * return: none | 
   * return: none | 
 |   */ | 
   */ | 
 |  void io_etherClose(int eth, void **zcbuf); | 
  void io_etherClose(int eth, void **zcbuf); | 
 |   | 
   | 
 |   | 
  /* | 
 |   | 
   * 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); | 
 |   | 
   | 
 |  /* | 
  /* | 
 |   * io_etherSend() - Send packet to bpf | 
   * io_etherSend() - Send packet to bpf |