version 1.6, 2013/11/22 14:31:08
|
version 1.7, 2013/11/22 15:09:17
|
Line 51 io_closeClient(sched_task_t *task)
|
Line 51 io_closeClient(sched_task_t *task)
|
{ |
{ |
sock_cli_t *cli = (sock_cli_t*) TASK_ARG(task); |
sock_cli_t *cli = (sock_cli_t*) TASK_ARG(task); |
sock_t *s = (sock_t*) cli->cli_parent; |
sock_t *s = (sock_t*) cli->cli_parent; |
int stat, sock = (int) TASK_DATLEN(task); | int stat; |
|
|
pthread_mutex_lock(&s->sock_mtx); |
pthread_mutex_lock(&s->sock_mtx); |
TAILQ_REMOVE(&s->sock_cli, cli, cli_node); |
TAILQ_REMOVE(&s->sock_cli, cli, cli_node); |
Line 60 io_closeClient(sched_task_t *task)
|
Line 60 io_closeClient(sched_task_t *task)
|
schedCancelby(s->sock_root, taskMAX, CRITERIA_ARG, cli, NULL); |
schedCancelby(s->sock_root, taskMAX, CRITERIA_ARG, cli, NULL); |
|
|
if (s->sock_type == SOCK_STREAM) { |
if (s->sock_type == SOCK_STREAM) { |
shutdown(sock, SHUT_RDWR); | shutdown(cli->cli_fd, SHUT_RDWR); |
close(sock); | close(cli->cli_fd); |
} |
} |
AIT_FREE_VAL(&cli->cli_buf[1]); |
AIT_FREE_VAL(&cli->cli_buf[1]); |
AIT_FREE_VAL(&cli->cli_buf[0]); |
AIT_FREE_VAL(&cli->cli_buf[0]); |
|
|
if (cli->cli_pid > 0) { |
if (cli->cli_pid > 0) { |
kill(cli->cli_pid, SIGTERM); | kill(cli->cli_pid, SIGKILL); |
while (waitpid(cli->cli_pid, &stat, WNOHANG) > 0) { |
while (waitpid(cli->cli_pid, &stat, WNOHANG) > 0) { |
usleep(1000); |
usleep(1000); |
kill(cli->cli_pid, SIGTERM); | kill(cli->cli_pid, SIGKILL); |
} |
} |
} |
} |
|
|
Line 123 io_acceptClient(sched_task_t *task)
|
Line 123 io_acceptClient(sched_task_t *task)
|
AIT_SET_BUFSIZ(&cli->cli_buf[1], 0, AIT_LEN(&s->sock_buf)); |
AIT_SET_BUFSIZ(&cli->cli_buf[1], 0, AIT_LEN(&s->sock_buf)); |
|
|
schedRead(TASK_ROOT(task), cli->cli_func, cli, cli->cli_fd, TASK_ARG(task), 0); |
schedRead(TASK_ROOT(task), cli->cli_func, cli, cli->cli_fd, TASK_ARG(task), 0); |
ioUpdTimerSocket(cli, NULL); | ioUpdTimerSocket(cli); |
end: |
end: |
schedReadSelf(task); |
schedReadSelf(task); |
taskExit(task, NULL); |
taskExit(task, NULL); |
Line 136 io_txNet(sched_task_t *task)
|
Line 136 io_txNet(sched_task_t *task)
|
sock_cli_t *cli = TASK_ARG(task); |
sock_cli_t *cli = TASK_ARG(task); |
sock_t *s = (sock_t*) cli->cli_parent; |
sock_t *s = (sock_t*) cli->cli_parent; |
|
|
ioUpdTimerSocket(cli, NULL); | ioUpdTimerSocket(cli); |
|
|
if (s->sock_type == SOCK_STREAM) |
if (s->sock_type == SOCK_STREAM) |
wlen = send(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0); |
wlen = send(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0); |
Line 144 io_txNet(sched_task_t *task)
|
Line 144 io_txNet(sched_task_t *task)
|
wlen = sendto(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0, |
wlen = sendto(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task), 0, |
&cli->cli_addr.sa, cli->cli_addr.sa.sa_len); |
&cli->cli_addr.sa, cli->cli_addr.sa.sa_len); |
if (wlen < 1) |
if (wlen < 1) |
schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, | schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); |
(void*) cli->cli_func, cli->cli_fd); | |
|
|
taskExit(task, NULL); |
taskExit(task, NULL); |
} |
} |
Line 156 io_txPty(sched_task_t *task)
|
Line 155 io_txPty(sched_task_t *task)
|
int wlen; |
int wlen; |
sock_cli_t *cli = TASK_ARG(task); |
sock_cli_t *cli = TASK_ARG(task); |
|
|
ioUpdTimerSocket(cli, NULL); | ioUpdTimerSocket(cli); |
|
|
wlen = write(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task)); |
wlen = write(TASK_FD(task), TASK_DATA(task), TASK_DATLEN(task)); |
if (wlen < 1) |
if (wlen < 1) |
schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, | schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); |
(void*) cli->cli_func, cli->cli_fd); | |
|
|
taskExit(task, NULL); |
taskExit(task, NULL); |
} |
} |
Line 175 io_rxNet(sched_task_t *task)
|
Line 173 io_rxNet(sched_task_t *task)
|
sockaddr_t sa; |
sockaddr_t sa; |
socklen_t salen = sizeof sa.ss; |
socklen_t salen = sizeof sa.ss; |
|
|
ioUpdTimerSocket(cli, NULL); | ioUpdTimerSocket(cli); |
|
|
if (s->sock_type == SOCK_STREAM) |
if (s->sock_type == SOCK_STREAM) |
rlen = recv(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[0]), |
rlen = recv(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[0]), |
Line 187 io_rxNet(sched_task_t *task)
|
Line 185 io_rxNet(sched_task_t *task)
|
goto end; |
goto end; |
} |
} |
if (rlen < 1) |
if (rlen < 1) |
schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, | schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); |
(void*) cli->cli_func, cli->cli_fd); | |
else |
else |
schedEvent(TASK_ROOT(task), io_txPty, cli, cli->cli_pty, |
schedEvent(TASK_ROOT(task), io_txPty, cli, cli->cli_pty, |
AIT_GET_BUF(&cli->cli_buf[0]), rlen); |
AIT_GET_BUF(&cli->cli_buf[0]), rlen); |
Line 203 io_rxPty(sched_task_t *task)
|
Line 200 io_rxPty(sched_task_t *task)
|
int rlen; |
int rlen; |
sock_cli_t *cli = TASK_ARG(task); |
sock_cli_t *cli = TASK_ARG(task); |
|
|
ioUpdTimerSocket(cli, NULL); | ioUpdTimerSocket(cli); |
|
|
rlen = read(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[1]), AIT_LEN(&cli->cli_buf[1])); |
rlen = read(TASK_FD(task), AIT_GET_BUF(&cli->cli_buf[1]), AIT_LEN(&cli->cli_buf[1])); |
if (rlen < 1) |
if (rlen < 1) |
schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, | schedEvent(TASK_ROOT(task), io_closeClient, cli, 0, NULL, 0); |
(void*) cli->cli_func, cli->cli_fd); | |
else |
else |
schedEvent(TASK_ROOT(task), io_txNet, cli, cli->cli_fd, |
schedEvent(TASK_ROOT(task), io_txNet, cli, cli->cli_fd, |
AIT_GET_BUF(&cli->cli_buf[1]), rlen); |
AIT_GET_BUF(&cli->cli_buf[1]), rlen); |
Line 285 io_bridgeClient(sched_task_t *task)
|
Line 281 io_bridgeClient(sched_task_t *task)
|
TASK_ARG(task), 0); |
TASK_ARG(task), 0); |
schedRead(TASK_ROOT(task), io_rxNet, cli, cli->cli_fd, |
schedRead(TASK_ROOT(task), io_rxNet, cli, cli->cli_fd, |
TASK_ARG(task), 0); |
TASK_ARG(task), 0); |
ioUpdTimerSocket(cli, NULL); | ioUpdTimerSocket(cli); |
break; |
break; |
} |
} |
end: |
end: |
Line 407 ioCloseSocket(sock_t ** __restrict s)
|
Line 403 ioCloseSocket(sock_t ** __restrict s)
|
AIT_FREE_VAL(&cli->cli_buf[0]); |
AIT_FREE_VAL(&cli->cli_buf[0]); |
|
|
if (cli->cli_pid > 0) { |
if (cli->cli_pid > 0) { |
kill(cli->cli_pid, SIGTERM); | kill(cli->cli_pid, SIGKILL); |
while (waitpid(cli->cli_pid, &stat, WNOHANG) > 0) { |
while (waitpid(cli->cli_pid, &stat, WNOHANG) > 0) { |
usleep(1000); |
usleep(1000); |
kill(cli->cli_pid, SIGTERM); | kill(cli->cli_pid, SIGKILL); |
} |
} |
} |
} |
|
|
Line 487 ioUpSocket(sock_t * __restrict s, void *arg, int timeo
|
Line 483 ioUpSocket(sock_t * __restrict s, void *arg, int timeo
|
* ioUpdTimerSocket() - Update timeout of socket |
* ioUpdTimerSocket() - Update timeout of socket |
* |
* |
* @c = Client socket |
* @c = Client socket |
* @arg = Optional data argument |
|
* return: none |
* return: none |
*/ |
*/ |
void |
void |
ioUpdTimerSocket(sock_cli_t * __restrict c, void *arg) | ioUpdTimerSocket(sock_cli_t * __restrict c) |
{ |
{ |
sock_t *s; |
sock_t *s; |
|
|
Line 500 ioUpdTimerSocket(sock_cli_t * __restrict c, void *arg)
|
Line 495 ioUpdTimerSocket(sock_cli_t * __restrict c, void *arg)
|
else |
else |
s = c->cli_parent; |
s = c->cli_parent; |
|
|
schedCancelby(s->sock_root, taskTIMER, CRITERIA_DATLEN, (void*) c->cli_fd, NULL); | schedCancelby(s->sock_root, taskTIMER, CRITERIA_ARG, c, NULL); |
schedTimer(s->sock_root, io_closeClient, c, s->sock_timeout, arg, c->cli_fd); | schedTimer(s->sock_root, io_closeClient, c, s->sock_timeout, NULL, 0); |
} |
} |
|
|
/* |
/* |
Line 520 ioCloseClient(sock_cli_t * __restrict c)
|
Line 515 ioCloseClient(sock_cli_t * __restrict c)
|
else |
else |
s = c->cli_parent; |
s = c->cli_parent; |
|
|
return !schedEvent(s->sock_root, io_closeClient, c, 0, NULL, c->cli_fd); | return !schedEvent(s->sock_root, io_closeClient, c, 0, NULL, 0); |
} |
} |
|
|
/* |
/* |