--- libaitio/src/sock.c 2013/12/18 12:40:21 1.13 +++ libaitio/src/sock.c 2016/08/18 09:06:31 1.16 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: sock.c,v 1.13 2013/12/18 12:40:21 misho Exp $ +* $Id: sock.c,v 1.16 2016/08/18 09:06:31 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 +Copyright 2004 - 2016 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -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) { @@ -168,8 +168,13 @@ io_txNet(sched_task_t *task) 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); +#ifndef __linux__ + wlen = sendto(TASK_FD(task), buf, len, 0, &cli->cli_addr.sa, cli->cli_addr.sa.sa_len); +#else + wlen = sendto(TASK_FD(task), buf, len, 0, &cli->cli_addr.sa, + cli->cli_addr.sa.sa_family == AF_INET ? + sizeof cli->cli_addr.sin : sizeof cli->cli_addr.sin6); +#endif if (wlen < 1) { schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); break; @@ -211,16 +216,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 +243,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 +306,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); @@ -447,7 +457,12 @@ ioInitSocket(int role, int type, int proto, const char e_free(s); return NULL; } +#ifndef __linux__ if (bind(s->sock_fd, &s->sock_addr.sa, s->sock_addr.sa.sa_len) == -1) { +#else + if (bind(s->sock_fd, &s->sock_addr.sa, s->sock_addr.sa.sa_family == AF_INET ? + sizeof s->sock_addr.sin : sizeof s->sock_addr.sin6) == -1) { +#endif LOGERR; AIT_FREE_VAL(&s->sock_buf); e_free(s); @@ -544,8 +559,12 @@ ioUpSocket(sock_t * __restrict s, void *arg, int timeo case IO_SOCK_ROLE_CLIENT: memcpy(&s->sock_peer, peer, sizeof s->sock_peer); - if (connect(s->sock_fd, &s->sock_peer.sa, - s->sock_peer.sa.sa_len) == -1) { +#ifndef __linux__ + if (connect(s->sock_fd, &s->sock_peer.sa, s->sock_peer.sa.sa_len) == -1) { +#else + if (connect(s->sock_fd, &s->sock_peer.sa, s->sock_addr.sa.sa_family == AF_INET ? + sizeof s->sock_peer.sin : sizeof s->sock_peer.sin6) == -1) { +#endif LOGERR; return -1; }