--- libaitio/src/sock.c 2013/11/25 11:45:41 1.8.2.1 +++ libaitio/src/sock.c 2013/12/12 15:20:23 1.11.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: sock.c,v 1.8.2.1 2013/11/25 11:45:41 misho Exp $ +* $Id: sock.c,v 1.11.2.1 2013/12/12 15:20:23 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -135,20 +135,37 @@ end: static void * io_txNet(sched_task_t *task) { - int wlen; + int wlen, ret, len = TASK_DATLEN(task); sock_cli_t *cli = TASK_ARG(task); sock_t *s = (sock_t*) cli->cli_parent; + u_char *buf = TASK_DATA(task); + struct pollfd pfd[1]; - ioUpdTimerSocket(cli); + pfd->fd = TASK_FD(task); + pfd->events = POLLOUT; + pfd->revents = 0; + for(; len > 0; len -= wlen, buf += wlen) { + ioUpdTimerSocket(cli); - if (s->sock_type == SOCK_STREAM) - wlen = send(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0); - else - wlen = sendto(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0, - &cli->cli_addr.sa, cli->cli_addr.sa.sa_len); - if (wlen < 1) - schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); + if ((ret = poll(pfd, 1, s->sock_timeout.tv_sec * 1000)) < 1 || + pfd->revents & (POLLNVAL | POLLERR | POLLHUP)) { + if (!ret) + continue; + schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); + break; + } + if (s->sock_type == SOCK_STREAM) + wlen = send(TASK_FD(task), buf, len, 0); + else + wlen = sendto(TASK_FD(task), buf, len, 0, + &cli->cli_addr.sa, cli->cli_addr.sa.sa_len); + if (wlen < 1) { + schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); + break; + } + } + taskExit(task, NULL); } @@ -273,7 +290,9 @@ io_bridgeClient(sched_task_t *task) argv = array_To(args); array_Destroy(&args); +#if 0 printf("Console %s\n", cli->cli_name); +#endif rlen = execv(*argv, argv); _exit(rlen); break; @@ -553,4 +572,21 @@ ioBridgeProg2Socket(sock_t * __restrict s, const char schedRead(s->sock_root, io_bridgeClient, s, s->sock_fd, (void*) prgname, 0); return schedRun(s->sock_root, &s->sock_kill); +} + +/* + * ioSetupProg() - Setup program pool to socket server + * + * @s = Socket + * @p = Program pool + * return: -1 error or 0 ok + */ +int +ioSetupProg(sock_t * __restrict s, prog_t * __restrict p) +{ + if (!s) + return -1; + + s->sock_prog = p; + return 0; }