version 1.1.1.1, 2011/10/04 22:37:46
|
version 1.1.1.1.2.5, 2011/10/13 15:24:17
|
Line 15 pktTx(sched_task_t *task)
|
Line 15 pktTx(sched_task_t *task)
|
{ |
{ |
struct tagProc *proc; |
struct tagProc *proc; |
int wlen; |
int wlen; |
|
u_char *str; |
|
|
FTRACE(3); |
FTRACE(3); |
|
|
Line 22 pktTx(sched_task_t *task)
|
Line 23 pktTx(sched_task_t *task)
|
if (!(proc = TASK_ARG(task))) |
if (!(proc = TASK_ARG(task))) |
return (void*) -1; |
return (void*) -1; |
|
|
if ((wlen = pktSend(TASK_FD(task), proc->proc_id, proc->proc_flg, proc->proc_buf_[FD2NET], | if (Crypted) { |
proc->proc_rlen_[FD2NET], &proc->proc_ea)) != ANSH_FLG_ERR) { | 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, |
| proc->proc_buf_[FD2NET], proc->proc_rlen_[FD2NET], |
| &proc->proc_ea)) != ANSH_FLG_ERR) { |
proc->proc_flg = ANSH_FLG_OK; |
proc->proc_flg = ANSH_FLG_OK; |
proc->proc_rlen_[FD2NET] = 0; |
proc->proc_rlen_[FD2NET] = 0; |
} |
} |
Line 35 pktTx(sched_task_t *task)
|
Line 45 pktTx(sched_task_t *task)
|
void * |
void * |
pktRx(sched_task_t *task) |
pktRx(sched_task_t *task) |
{ |
{ |
u_char *buf; | u_char *buf, *str; |
struct ether_header eth; |
struct ether_header eth; |
int rlen, n = 0; |
int rlen, n = 0; |
struct tagProc *proc = NULL; |
struct tagProc *proc = NULL; |
char ret; |
char ret; |
u_short *b; |
u_short *b; |
|
u_int seq; |
|
|
FTRACE(3); |
FTRACE(3); |
|
|
rlen = bpfLEN; |
rlen = bpfLEN; |
if (!(buf = malloc(rlen))) |
if (!(buf = malloc(rlen))) |
goto end; |
goto end; |
|
else |
|
memset(buf, 0, rlen); |
|
|
if ((ret = pktRecv(TASK_FD(task), buf, &rlen, ð)) == ANSH_FLG_ERR) | if ((ret = pktRecv(TASK_FD(task), &seq, &Crypted, buf, &rlen, ð)) == ANSH_FLG_ERR) |
goto end; |
goto end; |
VERB(5) LOG("Received %d bytes", rlen); |
VERB(5) LOG("Received %d bytes", rlen); |
|
if (!(ret & ANSH_FLG_CPOUT)) |
|
goto end; |
|
|
/* packet is ok find active session */ |
/* packet is ok find active session */ |
SLIST_FOREACH(proc, &pH, proc_next) |
SLIST_FOREACH(proc, &pH, proc_next) |
Line 59 pktRx(sched_task_t *task)
|
Line 74 pktRx(sched_task_t *task)
|
break; |
break; |
} |
} |
/* not found in sessions, drop packet */ |
/* not found in sessions, drop packet */ |
if (n != ANSH_CODE) | if (n != ANSH_CODE) { |
| proc = NULL; |
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: |
|
if (seq <= proc->proc_seq) |
|
goto end; |
|
else if (seq > (proc->proc_seq + 1)) |
|
LOG("LOST PACKET(s) detect: %d; received seq=%d - %d", |
|
seq - proc->proc_seq + 1, seq, proc->proc_seq); |
|
proc->proc_seq = seq; |
break; |
break; |
case ANSH_FLG_WINZ: |
case ANSH_FLG_WINZ: |
b = (u_short*) buf; |
b = (u_short*) buf; |
ioChgWinPTY(proc->proc_pty, ntohs(buf[0]), ntohs(buf[1]), ntohs(buf[2]), ntohs(buf[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.octet, ð.ether_shost, ETHER_ADDR_LEN); |
Line 93 void *
|
Line 124 void *
|
fdTx(sched_task_t *task) |
fdTx(sched_task_t *task) |
{ |
{ |
struct tagProc *proc; |
struct tagProc *proc; |
|
struct timeval tv = { 0 }; |
int wlen; |
int wlen; |
|
|
FTRACE(3); |
FTRACE(3); |
Line 102 fdTx(sched_task_t *task)
|
Line 134 fdTx(sched_task_t *task)
|
return (void*) -1; |
return (void*) -1; |
|
|
/* if != ANSH_FLG_CPOUT isnt received from client */ |
/* if != ANSH_FLG_CPOUT isnt received from client */ |
if (proc->proc_flg != ANSH_FLG_CPOUT) | if (proc->proc_flg != ANSH_FLG_CPOUT || !proc->proc_pid) |
return NULL; |
return NULL; |
|
|
if (waitpid(proc->proc_pid, &wlen, WNOHANG)) { |
if (waitpid(proc->proc_pid, &wlen, WNOHANG)) { |
schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL); |
|
ioFreePTY(TASK_FD(task), proc->proc_ttyname); |
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_pid = 0; |
|
proc->proc_seq = 0; |
proc->proc_flg = ANSH_FLG_EOF; |
proc->proc_flg = ANSH_FLG_EOF; |
proc->proc_rlen_[FD2NET] = 0; |
proc->proc_rlen_[FD2NET] = 0; |
|
|
schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock); | schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock); |
return NULL; |
return NULL; |
} |
} |
|
|
|
/* if Timeout defined, disarm timer */ |
|
if (Timeout) |
|
schedCancelby(TASK_ROOT(task), &TASK_ROOT(task)->root_timer, 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 */ |
schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL); |
|
waitpid(proc->proc_pid, &wlen, 0); |
waitpid(proc->proc_pid, &wlen, 0); |
ioFreePTY(TASK_FD(task), proc->proc_ttyname); |
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_pid = 0; |
|
proc->proc_seq = 0; |
proc->proc_flg = ANSH_FLG_EOF; |
proc->proc_flg = ANSH_FLG_EOF; |
proc->proc_rlen_[FD2NET] = 0; |
proc->proc_rlen_[FD2NET] = 0; |
|
|
schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock); | 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 138 fdTx(sched_task_t *task)
|
Line 176 fdTx(sched_task_t *task)
|
} |
} |
VERB(3) LOG("Writed %d bytes - %s", wlen, proc->proc_buf_[NET2FD]); |
VERB(3) LOG("Writed %d bytes - %s", wlen, proc->proc_buf_[NET2FD]); |
|
|
|
/* if Timeout defined, go arm timer */ |
|
if (Timeout) { |
|
tv.tv_sec = Timeout; |
|
schedTimer(TASK_ROOT(task), TOfunc, proc, tv); |
|
} |
return NULL; |
return NULL; |
} |
} |
|
|
Line 145 void *
|
Line 188 void *
|
fdRx(sched_task_t *task) |
fdRx(sched_task_t *task) |
{ |
{ |
struct tagProc *proc; |
struct tagProc *proc; |
|
struct timeval tv = { 0 }; |
int rlen; |
int rlen; |
|
|
FTRACE(3); |
FTRACE(3); |
Line 152 fdRx(sched_task_t *task)
|
Line 196 fdRx(sched_task_t *task)
|
/* not found argument, drop data */ |
/* not found argument, drop data */ |
if (!(proc = TASK_ARG(task))) |
if (!(proc = TASK_ARG(task))) |
return (void*) -1; |
return (void*) -1; |
|
if (!proc->proc_pid) |
|
return NULL; |
|
|
if (waitpid(proc->proc_pid, &rlen, WNOHANG)) { |
if (waitpid(proc->proc_pid, &rlen, WNOHANG)) { |
schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL); |
|
ioFreePTY(TASK_FD(task), proc->proc_ttyname); |
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_pid = 0; |
|
proc->proc_seq = 0; |
proc->proc_flg = ANSH_FLG_EOF; |
proc->proc_flg = ANSH_FLG_EOF; |
proc->proc_rlen_[FD2NET] = 0; |
proc->proc_rlen_[FD2NET] = 0; |
|
|
schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock); | schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock); |
return NULL; |
return NULL; |
} |
} |
|
|
|
/* if Timeout defined, disarm timer */ |
|
if (Timeout) |
|
schedCancelby(TASK_ROOT(task), &TASK_ROOT(task)->root_timer, 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], proc->proc_blen); | rlen = read(TASK_FD(task), proc->proc_buf_[FD2NET], |
| proc->proc_blen - ETHER_HDR_LEN + sizeof(struct ansh_hdr)); |
switch (rlen) { |
switch (rlen) { |
case -1: |
case -1: |
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 */ |
schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL); |
|
waitpid(proc->proc_pid, &rlen, 0); |
waitpid(proc->proc_pid, &rlen, 0); |
VERB(3) LOG("EOF process status %d", rlen); |
|
ioFreePTY(TASK_FD(task), proc->proc_ttyname); |
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_pid = 0; |
|
proc->proc_seq = 0; |
proc->proc_flg = ANSH_FLG_EOF; |
proc->proc_flg = ANSH_FLG_EOF; |
proc->proc_rlen_[FD2NET] = 0; |
proc->proc_rlen_[FD2NET] = 0; |
|
|
schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock); | 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 189 fdRx(sched_task_t *task)
|
Line 242 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), pktTx, proc, proc->proc_sock); | schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock); |
schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty); |
schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty); |
|
|
|
/* if Timeout defined, go arm timer */ |
|
if (Timeout) { |
|
tv.tv_sec = Timeout; |
|
schedTimer(TASK_ROOT(task), TOfunc, proc, tv); |
|
} |
return NULL; |
return NULL; |
} |
} |
|
|
int |
int |
spawnLogin(sched_task_t *task, struct tagProc *proc) |
spawnLogin(sched_task_t *task, struct tagProc *proc) |
{ |
{ |
|
int flg; |
|
struct timeval tv = { 0 }; |
|
char str[STRSIZ] = { 0 }; |
|
|
FTRACE(3); |
FTRACE(3); |
|
|
assert(proc); |
assert(proc); |
Line 207 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
Line 270 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
ERR("ioForkPTY() #%d - %s", io_GetErrno(), io_GetError()); |
ERR("ioForkPTY() #%d - %s", io_GetErrno(), io_GetError()); |
return -1; |
return -1; |
case 0: |
case 0: |
execl("/usr/bin/login", "login", NULL); | printf("anshd ELWIX remote management system (%s)\n\n", proc->proc_ttyname); |
// execl("/bin/echo", "echo", "MUUUUUUUUUUUUUUUUU", NULL); | strlcpy(str, "-hansh@", sizeof str); |
| ether_ntoa_r(&proc->proc_ea, str + 7); |
| |
| execl("/usr/bin/login", "login", str, NULL); |
/* never reached */ |
/* never reached */ |
return -1; |
return -1; |
default: |
default: |
VERB(3) LOG("Parent know child pid %d - ptyfd=%d", proc->proc_pid, proc->proc_pty); | flg = fcntl(proc->proc_pty, F_GETFL); |
| fcntl(proc->proc_pty, F_SETFL, flg | O_NONBLOCK); |
| |
| 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); |
|
|
|
/* if Timeout defined, go arm timer */ |
|
if (Timeout) { |
|
tv.tv_sec = Timeout; |
|
schedTimer(TASK_ROOT(task), TOfunc, proc, tv); |
|
} |
break; |
break; |
} |
} |
|
|