--- libaitio/src/sock.c 2013/11/25 11:40:04 1.8 +++ libaitio/src/sock.c 2013/12/12 15:23:44 1.11.2.2 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: sock.c,v 1.8 2013/11/25 11:40:04 misho Exp $ +* $Id: sock.c,v 1.11.2.2 2013/12/12 15:23:44 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -59,7 +59,8 @@ io_closeClient(sched_task_t *task) schedCancelby(s->sock_root, taskMAX, CRITERIA_ARG, cli, NULL); - ioFreePTY(cli->cli_pty, cli->cli_name); + if (*cli->cli_name) + ioFreePTY(cli->cli_pty, cli->cli_name); if (s->sock_type == SOCK_STREAM) { shutdown(cli->cli_fd, SHUT_RDWR); @@ -134,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); } @@ -272,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; @@ -552,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); +} + +/* + * 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) +{ + if (!s) + return -1; + + s->sock_prog = p; + return 0; }