--- libaitio/inc/aitio.h 2013/11/21 14:46:44 1.36.2.3 +++ libaitio/inc/aitio.h 2013/12/05 16:57:08 1.38.10.6 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.36.2.3 2013/11/21 14:46:44 misho Exp $ +* $Id: aitio.h,v 1.38.10.6 2013/12/05 16:57:08 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -86,10 +86,12 @@ struct tagCliSock { 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; + ait_val_t cli_buf[2]; TAILQ_ENTRY(tagCliSock) cli_node; }; @@ -113,7 +115,17 @@ 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 @@ -121,6 +133,65 @@ 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_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); + + +/* * ioInitSocket() - Init socket and allocate resources * * @role = Socket role @@ -140,7 +211,15 @@ sock_t *ioInitSocket(int role, int type, int proto, * 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); +/* * ioUpSocket() - Setup socket for use * * @s = Socket @@ -164,7 +243,16 @@ void ioUpdTimerSocket(sock_cli_t * __restrict c); * 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] * @@ -174,7 +262,8 @@ int ioLoopSocket(sock_t * __restrict s, sched_task_fun * @dataLen = Length of data * 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] * @@ -185,7 +274,8 @@ int ioPromptRead(int *h, const char *csPrompt, char * * @confirm = Confirm password, 0 - get password, !=0 Ask for confirmation * 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); /* @@ -487,6 +577,14 @@ int io_dumbFile(const char *csFile, int mode, off_t si * return: -1 error or 0 ok */ 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 *