version 1.1.1.1.2.6, 2011/10/13 16:08:52
|
version 1.3.2.1, 2012/01/23 16:13:07
|
Line 83 void *
|
Line 83 void *
|
icmpRx(sched_task_t *task) |
icmpRx(sched_task_t *task) |
{ |
{ |
u_char *buf, *str; |
u_char *buf, *str; |
struct sockaddr sa; | io_sockaddr_t sa; |
int rlen, n = 0, salen = sizeof sa; |
int rlen, n = 0, salen = sizeof sa; |
struct tagProc *proc = NULL; |
struct tagProc *proc = NULL; |
char ret; |
char ret; |
Line 151 icmpRx(sched_task_t *task)
|
Line 151 icmpRx(sched_task_t *task)
|
proc->proc_rlen_[NET2FD] = rlen; |
proc->proc_rlen_[NET2FD] = rlen; |
memset(proc->proc_buf_[NET2FD], 0, proc->proc_blen); |
memset(proc->proc_buf_[NET2FD], 0, proc->proc_blen); |
memcpy(proc->proc_buf_[NET2FD], buf, proc->proc_rlen_[NET2FD]); |
memcpy(proc->proc_buf_[NET2FD], buf, proc->proc_rlen_[NET2FD]); |
schedWrite(TASK_ROOT(task), fdTx, proc, proc->proc_pty); | schedWrite(TASK_ROOT(task), fdTx, proc, proc->proc_pty, NULL, 0); |
end: |
end: |
free(buf); |
free(buf); |
schedRead(TASK_ROOT(task), icmpRx, NULL, proc ? proc->proc_sock : TASK_FD(task)); | schedRead(TASK_ROOT(task), icmpRx, NULL, proc ? proc->proc_sock : TASK_FD(task), NULL, 0); |
return NULL; |
return NULL; |
} |
} |
|
|
Line 175 fdTx(sched_task_t *task)
|
Line 175 fdTx(sched_task_t *task)
|
if (proc->proc_flg != ANSH_FLG_CPOUT || !proc->proc_pid) |
if (proc->proc_flg != ANSH_FLG_CPOUT || !proc->proc_pid) |
return NULL; |
return NULL; |
|
|
if (waitpid(proc->proc_pid, &wlen, WNOHANG)) { |
|
ioFreePTY(TASK_FD(task), proc->proc_ttyname); |
|
schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL); |
|
|
|
proc->proc_pid = 0; |
|
proc->proc_seq = 0; |
|
proc->proc_flg = ANSH_FLG_EOF; |
|
proc->proc_rlen_[FD2NET] = 0; |
|
|
|
schedWrite(TASK_ROOT(task), icmpTx, proc, proc->proc_sock); |
|
return NULL; |
|
} |
|
|
|
/* if Timeout defined, disarm timer */ |
/* if Timeout defined, disarm timer */ |
if (Timeout) |
if (Timeout) |
schedCancelby(TASK_ROOT(task), &TASK_ROOT(task)->root_timer, CRITERIA_CALL, TOfunc, NULL); | schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_CALL, TOfunc, NULL); |
|
|
wlen = write(TASK_FD(task), proc->proc_buf_[NET2FD], proc->proc_rlen_[NET2FD]); |
wlen = write(TASK_FD(task), proc->proc_buf_[NET2FD], proc->proc_rlen_[NET2FD]); |
switch (wlen) { |
switch (wlen) { |
case -1: |
case -1: |
ERR("write2tty #%d - %s", errno, strerror(errno)); |
ERR("write2tty #%d - %s", errno, strerror(errno)); |
/* exit from shell and release tty */ |
/* exit from shell and release tty */ |
waitpid(proc->proc_pid, &wlen, 0); |
|
ioFreePTY(TASK_FD(task), proc->proc_ttyname); |
|
schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL); |
|
|
|
proc->proc_pid = 0; |
|
proc->proc_seq = 0; |
|
proc->proc_flg = ANSH_FLG_EOF; |
|
proc->proc_rlen_[FD2NET] = 0; |
|
|
|
schedWrite(TASK_ROOT(task), icmpTx, proc, proc->proc_sock); |
|
return NULL; |
return NULL; |
default: |
default: |
proc->proc_flg = ANSH_FLG_OK; |
proc->proc_flg = ANSH_FLG_OK; |
Line 217 fdTx(sched_task_t *task)
|
Line 194 fdTx(sched_task_t *task)
|
/* if Timeout defined, go arm timer */ |
/* if Timeout defined, go arm timer */ |
if (Timeout) { |
if (Timeout) { |
tv.tv_sec = Timeout; |
tv.tv_sec = Timeout; |
schedTimer(TASK_ROOT(task), TOfunc, proc, tv); | schedTimer(TASK_ROOT(task), TOfunc, proc, tv, NULL, 0); |
} |
} |
return NULL; |
return NULL; |
} |
} |
Line 237 fdRx(sched_task_t *task)
|
Line 214 fdRx(sched_task_t *task)
|
if (!proc->proc_pid) |
if (!proc->proc_pid) |
return NULL; |
return NULL; |
|
|
if (waitpid(proc->proc_pid, &rlen, WNOHANG)) { |
|
ioFreePTY(TASK_FD(task), proc->proc_ttyname); |
|
schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL); |
|
|
|
proc->proc_pid = 0; |
|
proc->proc_seq = 0; |
|
proc->proc_flg = ANSH_FLG_EOF; |
|
proc->proc_rlen_[FD2NET] = 0; |
|
|
|
schedWrite(TASK_ROOT(task), icmpTx, proc, proc->proc_sock); |
|
return NULL; |
|
} |
|
|
|
/* if Timeout defined, disarm timer */ |
/* if Timeout defined, disarm timer */ |
if (Timeout) |
if (Timeout) |
schedCancelby(TASK_ROOT(task), &TASK_ROOT(task)->root_timer, CRITERIA_CALL, TOfunc, NULL); | schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_CALL, TOfunc, NULL); |
|
|
memset(proc->proc_buf_[FD2NET], 0, proc->proc_blen); |
memset(proc->proc_buf_[FD2NET], 0, proc->proc_blen); |
rlen = read(TASK_FD(task), proc->proc_buf_[FD2NET], |
rlen = read(TASK_FD(task), proc->proc_buf_[FD2NET], |
Line 262 fdRx(sched_task_t *task)
|
Line 226 fdRx(sched_task_t *task)
|
ERR("readtty #%d - %s", errno, strerror(errno)); |
ERR("readtty #%d - %s", errno, strerror(errno)); |
case 0: |
case 0: |
/* exit from shell and release tty */ |
/* exit from shell and release tty */ |
waitpid(proc->proc_pid, &rlen, 0); |
|
ioFreePTY(TASK_FD(task), proc->proc_ttyname); |
|
schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL); |
|
VERB(3) LOG("EOF process status %d", rlen); |
|
|
|
proc->proc_pid = 0; |
|
proc->proc_seq = 0; |
|
proc->proc_flg = ANSH_FLG_EOF; |
|
proc->proc_rlen_[FD2NET] = 0; |
|
|
|
schedWrite(TASK_ROOT(task), icmpTx, proc, proc->proc_sock); |
|
return NULL; |
return NULL; |
default: |
default: |
proc->proc_flg = ANSH_FLG_OK; |
proc->proc_flg = ANSH_FLG_OK; |
Line 280 fdRx(sched_task_t *task)
|
Line 233 fdRx(sched_task_t *task)
|
} |
} |
VERB(3) LOG("Readed %d bytes - %s", rlen, proc->proc_buf_[FD2NET]); |
VERB(3) LOG("Readed %d bytes - %s", rlen, proc->proc_buf_[FD2NET]); |
|
|
schedWrite(TASK_ROOT(task), icmpTx, proc, proc->proc_sock); | schedWrite(TASK_ROOT(task), icmpTx, proc, proc->proc_sock, NULL, 0); |
schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty); | schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty, NULL, 0); |
|
|
/* if Timeout defined, go arm timer */ |
/* if Timeout defined, go arm timer */ |
if (Timeout) { |
if (Timeout) { |
tv.tv_sec = Timeout; |
tv.tv_sec = Timeout; |
schedTimer(TASK_ROOT(task), TOfunc, proc, tv); | schedTimer(TASK_ROOT(task), TOfunc, proc, tv, NULL, 0); |
} |
} |
return NULL; |
return NULL; |
} |
} |
Line 297 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
Line 250 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
int flg; |
int flg; |
struct timeval tv = { 0 }; |
struct timeval tv = { 0 }; |
char str[STRSIZ] = { 0 }; |
char str[STRSIZ] = { 0 }; |
struct sockaddr_in *sin; |
|
struct sockaddr_in6 *sin6; |
|
|
|
FTRACE(3); |
FTRACE(3); |
|
|
Line 313 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
Line 264 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
printf("ansh3d ELWIX remote management system over ICMP (%s)\n\n", |
printf("ansh3d ELWIX remote management system over ICMP (%s)\n\n", |
proc->proc_ttyname); |
proc->proc_ttyname); |
strlcpy(str, "-hansh3@", sizeof str); |
strlcpy(str, "-hansh3@", sizeof str); |
if (proc->proc_cli.sa_family == AF_INET) { | if (proc->proc_cli.sa.sa_family == AF_INET) |
sin = (struct sockaddr_in*) &proc->proc_cli; | inet_ntop(AF_INET, &proc->proc_cli.sin.sin_addr, str + 8, INET_ADDRSTRLEN); |
inet_ntop(AF_INET, &sin->sin_addr, str + 8, INET_ADDRSTRLEN); | else if (proc->proc_cli.sa.sa_family == AF_INET6) |
} else if (proc->proc_cli.sa_family == AF_INET6) { | inet_ntop(AF_INET6, &proc->proc_cli.sin6.sin6_addr, str + 8, INET6_ADDRSTRLEN); |
sin6 = (struct sockaddr_in6*) &proc->proc_cli; | |
inet_ntop(AF_INET6, &sin6->sin6_addr, str + 8, INET6_ADDRSTRLEN); | |
} | |
execl("/usr/bin/login", "login", str, NULL); |
execl("/usr/bin/login", "login", str, NULL); |
/* never reached */ |
/* never reached */ |
return -1; |
return -1; |
Line 328 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
Line 276 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
fcntl(proc->proc_pty, F_SETFL, flg | O_NONBLOCK); |
fcntl(proc->proc_pty, F_SETFL, flg | O_NONBLOCK); |
|
|
VERB(3) LOG("Parent know child pid %d", proc->proc_pid); |
VERB(3) LOG("Parent know child pid %d", proc->proc_pid); |
schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty); | schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty, NULL, 0); |
|
|
/* if Timeout defined, go arm timer */ |
/* if Timeout defined, go arm timer */ |
if (Timeout) { |
if (Timeout) { |
tv.tv_sec = Timeout; |
tv.tv_sec = Timeout; |
schedTimer(TASK_ROOT(task), TOfunc, proc, tv); | schedTimer(TASK_ROOT(task), TOfunc, proc, tv, NULL, 0); |
} |
} |
break; |
break; |
} |
} |