--- libaitio/inc/aitio.h 2013/10/21 21:12:41 1.36 +++ libaitio/inc/aitio.h 2013/11/21 18:59:49 1.36.2.6 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.36 2013/10/21 21:12:41 misho Exp $ +* $Id: aitio.h,v 1.36.2.6 2013/11/21 18:59:49 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -62,6 +62,7 @@ SUCH DAMAGE. #include #include #include +#include #ifndef STRSIZ @@ -81,30 +82,34 @@ typedef struct tagCliSock sock_cli_t; typedef void *(*sock_cb_t)(sock_cli_t*); struct tagCliSock { void *cli_parent; - pthread_t cli_tid; int cli_fd; int cli_pty; sockaddr_t cli_addr; char cli_name[64]; + char cli_cmdline[PATH_MAX]; - sock_cb_t cli_func; - void *cli_arg; + sched_task_func_t cli_func; - ait_val_t cli_buf; + 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; + volatile intptr_t sock_kill; + sched_root_task_t *sock_root; + pthread_mutex_t sock_mtx; TAILQ_HEAD(, tagCliSock) sock_cli; } sock_t; @@ -136,23 +141,46 @@ 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 * @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 ioUpSocket(sock_t * __restrict s, void *arg, int timeout); /* - * ioAcceptSocket() - Accept clients + * ioUpdTimerSocket() - Update timeout of socket * + * @c = Client socket + * return: none + */ +void ioUpdTimerSocket(sock_cli_t * __restrict c); +/* + * ioLoopSocket() - Start socket scheduler + * * @s = Socket - * @f = callback function for client handling - * @arg = optional argument for callback function - * return: -1 error or 0 ok + * @rcb = Read callback + * return: -1 error or return result from scheduler */ -int ioAcceptSocket(sock_t * __restrict s, sock_cb_t f, void *arg); +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] @@ -163,7 +191,8 @@ int ioAcceptSocket(sock_t * __restrict s, sock_cb_t f, * @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] * @@ -174,7 +203,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); /*