--- libaitio/src/sock.c 2014/02/08 22:06:17 1.14 +++ libaitio/src/sock.c 2014/05/18 23:35:16 1.15 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: sock.c,v 1.14 2014/02/08 22:06:17 misho Exp $ +* $Id: sock.c,v 1.15 2014/05/18 23:35:16 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -53,12 +53,12 @@ io_closeClient(sched_task_t *task) sock_t *s = (sock_t*) cli->cli_parent; int stat; + schedCancelby(s->sock_root, taskMAX, CRITERIA_ARG, cli, NULL); + pthread_mutex_lock(&s->sock_mtx); TAILQ_REMOVE(&s->sock_cli, cli, cli_node); pthread_mutex_unlock(&s->sock_mtx); - schedCancelby(s->sock_root, taskMAX, CRITERIA_ARG, cli, NULL); - if (*cli->cli_name) ioFreePTY(cli->cli_pty, cli->cli_name); if (s->sock_prog) { @@ -211,16 +211,19 @@ io_rxNet(sched_task_t *task) else { rlen = recvfrom(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[0]), AIT_LEN(&cli->cli_buf[0]), 0, &sa.sa, &salen); - if (e_addrcmp(&cli->cli_addr, &sa, 42)) - goto end; + if (e_addrcmp(&cli->cli_addr, &sa, 42)) { + schedReadSelf(task); + taskExit(task, NULL); + } } if (rlen < 1) schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); - else + else { schedEvent(TASK_ROOT(task), io_txPty, cli, cli->cli_pty, AIT_GET_BUF(&cli->cli_buf[0]), rlen); -end: - schedReadSelf(task); + schedReadSelf(task); + } + taskExit(task, NULL); } @@ -235,11 +238,12 @@ io_rxPty(sched_task_t *task) rlen = read(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[1]), AIT_LEN(&cli->cli_buf[1])); if (rlen < 1) schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); - else + else { schedEvent(TASK_ROOT(task), io_txNet, cli, cli->cli_fd, AIT_GET_BUF(&cli->cli_buf[1]), rlen); + schedReadSelf(task); + } - schedReadSelf(task); taskExit(task, NULL); } @@ -297,6 +301,7 @@ io_bridgeClient(sched_task_t *task) break; case 0: cli->cli_pty = pty; + ioSetRAWMode(STDIN_FILENO, NULL); array_Args(cli->cli_cmdline, 0, " \t", &args); argv = array_To(args);