--- libaitio/inc/aitio.h 2013/12/05 15:18:22 1.38.10.4 +++ libaitio/inc/aitio.h 2013/12/12 21:17:53 1.38.10.16 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.38.10.4 2013/12/05 15:18:22 misho Exp $ +* $Id: aitio.h,v 1.38.10.16 2013/12/12 21:17:53 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -78,12 +78,23 @@ SUCH DAMAGE. #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; - int cli_pty; + intptr_t cli_pty; sockaddr_t cli_addr; char cli_name[64]; char cli_cmdline[PATH_MAX]; @@ -107,6 +118,7 @@ typedef struct { sockaddr_t sock_peer; ait_val_t sock_buf; + prog_t *sock_prog; volatile intptr_t sock_kill; sched_root_task_t *sock_root; @@ -115,17 +127,7 @@ typedef struct { TAILQ_HEAD(, tagCliSock) sock_cli; } 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; -} prog_t; - - // io_GetErrno() Get error code of last operation int io_GetErrno(); // io_GetError() Get error text of last operation @@ -147,18 +149,42 @@ prog_t *io_progInit(const char *progName, * * @prg = program pool * @execNum = execute program(s) (0 max) - * return: 0 error, >0 executed programs and abs(<0) executed programs with logged error + * 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, u_int toNum); +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 @@ -174,8 +200,42 @@ int io_progClose(prog_t * __restrict prg, unsigned int */ 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 @@ -203,6 +263,14 @@ void ioCloseSocket(sock_t ** __restrict s); * 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 *