|
|
| version 1.1.1.1.2.6, 2011/10/13 16:08:52 | version 1.2.2.1, 2011/10/31 15:49:37 |
|---|---|
| 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 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), &TASK_ROOT(task)->root_timer, CRITERIA_CALL, TOfunc, NULL); |
| Line 197 fdTx(sched_task_t *task) | Line 184 fdTx(sched_task_t *task) |
| 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 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), &TASK_ROOT(task)->root_timer, CRITERIA_CALL, TOfunc, NULL); |
| 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 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; |