version 1.1.1.1.2.6, 2011/10/13 16:08:52
|
version 1.2, 2011/10/17 20:14:02
|
Line 52 pktTx(sched_task_t *task)
|
Line 52 pktTx(sched_task_t *task)
|
{ |
{ |
struct tagProc *proc; |
struct tagProc *proc; |
int wlen; |
int wlen; |
u_char *str; |
|
|
|
FTRACE(3); |
FTRACE(3); |
|
|
Line 60 pktTx(sched_task_t *task)
|
Line 59 pktTx(sched_task_t *task)
|
if (!(proc = TASK_ARG(task))) |
if (!(proc = TASK_ARG(task))) |
return (void*) -1; |
return (void*) -1; |
|
|
if (Crypted) { |
|
str = cryptBuffer(proc->proc_buf_[FD2NET], proc->proc_rlen_[FD2NET], Crypted); |
|
if (str) { |
|
memcpy(proc->proc_buf_[FD2NET], str, proc->proc_rlen_[FD2NET]); |
|
free(str); |
|
} |
|
} |
|
|
|
if ((wlen = pktSend(TASK_FD(task), ++proc->proc_seq, proc->proc_flg, Crypted, |
if ((wlen = pktSend(TASK_FD(task), ++proc->proc_seq, proc->proc_flg, Crypted, |
proc->proc_buf_[FD2NET], proc->proc_rlen_[FD2NET], |
proc->proc_buf_[FD2NET], proc->proc_rlen_[FD2NET], |
&proc->proc_ea)) != ANSH_FLG_ERR) { |
&proc->proc_ea)) != ANSH_FLG_ERR) { |
Line 82 pktTx(sched_task_t *task)
|
Line 73 pktTx(sched_task_t *task)
|
void * |
void * |
pktRx(sched_task_t *task) |
pktRx(sched_task_t *task) |
{ |
{ |
u_char *buf, *str; | u_char *buf; |
struct ether_header eth; |
struct ether_header eth; |
int rlen, n = 0; |
int rlen, n = 0; |
struct tagProc *proc = NULL; |
struct tagProc *proc = NULL; |
Line 116 pktRx(sched_task_t *task)
|
Line 107 pktRx(sched_task_t *task)
|
goto end; |
goto end; |
} |
} |
|
|
if (Crypted) { |
|
str = cryptBuffer(buf, rlen, Crypted); |
|
if (str) { |
|
memcpy(buf, str, rlen); |
|
free(str); |
|
} |
|
} |
|
|
|
switch (ret) { |
switch (ret) { |
case ANSH_FLG_EOF: |
case ANSH_FLG_EOF: |
case ANSH_FLG_CPOUT: |
case ANSH_FLG_CPOUT: |
Line 139 pktRx(sched_task_t *task)
|
Line 122 pktRx(sched_task_t *task)
|
ioChgWinPTY(proc->proc_pty, ntohs(b[0]), ntohs(b[1]), ntohs(b[2]), ntohs(b[3])); |
ioChgWinPTY(proc->proc_pty, ntohs(b[0]), ntohs(b[1]), ntohs(b[2]), ntohs(b[3])); |
/* if not started login, lets start & go! */ |
/* if not started login, lets start & go! */ |
if (!proc->proc_pid) { |
if (!proc->proc_pid) { |
memcpy(&proc->proc_ea.octet, ð.ether_shost, ETHER_ADDR_LEN); | memcpy(&proc->proc_ea, ð.ether_shost, ETHER_ADDR_LEN); |
spawnLogin(task, proc); |
spawnLogin(task, proc); |
} |
} |
default: |
default: |
Line 174 fdTx(sched_task_t *task)
|
Line 157 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; |
|
|
|
schedCallOnce(TASK_ROOT(task), pktTx, 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 196 fdTx(sched_task_t *task)
|
Line 166 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; |
|
|
|
schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock); |
|
return NULL; |
return NULL; |
default: |
default: |
proc->proc_flg = ANSH_FLG_OK; |
proc->proc_flg = ANSH_FLG_OK; |
Line 236 fdRx(sched_task_t *task)
|
Line 196 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; |
|
|
|
schedCallOnce(TASK_ROOT(task), pktTx, 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 261 fdRx(sched_task_t *task)
|
Line 208 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; |
|
|
|
schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock); |
|
return NULL; |
return NULL; |
default: |
default: |
proc->proc_flg = ANSH_FLG_OK; |
proc->proc_flg = ANSH_FLG_OK; |
Line 309 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
Line 245 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
case 0: |
case 0: |
printf("anshd ELWIX remote management system (%s)\n\n", proc->proc_ttyname); |
printf("anshd ELWIX remote management system (%s)\n\n", proc->proc_ttyname); |
strlcpy(str, "-hansh@", sizeof str); |
strlcpy(str, "-hansh@", sizeof str); |
ether_ntoa_r(&proc->proc_ea, str + 7); | io_ether_ntoa((const struct io_ether_addr*) &proc->proc_ea, str + 7, 18); |
|
|
execl("/usr/bin/login", "login", str, NULL); |
execl("/usr/bin/login", "login", str, NULL); |
/* never reached */ |
/* never reached */ |