|
version 1.1.1.1.2.8, 2011/10/14 12:03:10
|
version 1.5, 2015/05/19 23:25:30
|
|
Line 12 terms:
|
Line 12 terms:
|
| All of the documentation and software included in the ELWIX and AITNET |
All of the documentation and software included in the ELWIX and AITNET |
| Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
| |
|
| Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 | Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013 |
| by Michael Pounov <misho@elwix.org>. All rights reserved. |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
| |
|
| Redistribution and use in source and binary forms, with or without |
Redistribution and use in source and binary forms, with or without |
|
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 93 pktRx(sched_task_t *task)
|
Line 84 pktRx(sched_task_t *task)
|
| FTRACE(3); |
FTRACE(3); |
| |
|
| rlen = bpfLEN; |
rlen = bpfLEN; |
| if (!(buf = malloc(rlen))) | if (!(buf = e_malloc(rlen))) |
| goto end; |
goto end; |
| else |
else |
| memset(buf, 0, rlen); |
memset(buf, 0, rlen); |
|
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 150 pktRx(sched_task_t *task)
|
Line 133 pktRx(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); | e_free(buf); |
| schedRead(TASK_ROOT(task), pktRx, NULL, proc ? proc->proc_sock : TASK_FD(task)); | schedRead(TASK_ROOT(task), pktRx, NULL, proc ? proc->proc_sock : TASK_FD(task), NULL, 0); |
| return NULL; |
return NULL; |
| } |
} |
| |
|
|
Line 161 void *
|
Line 144 void *
|
| fdTx(sched_task_t *task) |
fdTx(sched_task_t *task) |
| { |
{ |
| struct tagProc *proc; |
struct tagProc *proc; |
| struct timeval tv = { 0 }; | struct timespec ts = { 0 }; |
| int wlen; |
int wlen; |
| |
|
| FTRACE(3); |
FTRACE(3); |
|
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), 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; |
|
| |
|
| 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 219 fdTx(sched_task_t *task)
|
Line 175 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; | ts.tv_sec = Timeout; |
| schedTimer(TASK_ROOT(task), TOfunc, proc, tv); | schedTimer(TASK_ROOT(task), TOfunc, proc, ts, NULL, 0); |
| } |
} |
| return NULL; |
return NULL; |
| } |
} |
|
Line 229 void *
|
Line 185 void *
|
| fdRx(sched_task_t *task) |
fdRx(sched_task_t *task) |
| { |
{ |
| struct tagProc *proc; |
struct tagProc *proc; |
| struct timeval tv = { 0 }; | struct timespec ts = { 0 }; |
| int rlen; |
int rlen; |
| |
|
| FTRACE(3); |
FTRACE(3); |
|
Line 240 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), 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 267 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 287 fdRx(sched_task_t *task)
|
Line 215 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]); |
| |
|
| schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock); | schedCallOnce(TASK_ROOT(task), pktTx, 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; | ts.tv_sec = Timeout; |
| schedTimer(TASK_ROOT(task), TOfunc, proc, tv); | schedTimer(TASK_ROOT(task), TOfunc, proc, ts, NULL, 0); |
| } |
} |
| return NULL; |
return NULL; |
| } |
} |
|
Line 302 int
|
Line 230 int
|
| spawnLogin(sched_task_t *task, struct tagProc *proc) |
spawnLogin(sched_task_t *task, struct tagProc *proc) |
| { |
{ |
| int flg; |
int flg; |
| struct timeval tv = { 0 }; | struct timespec ts = { 0 }; |
| char str[STRSIZ] = { 0 }; |
char str[STRSIZ] = { 0 }; |
| |
|
| FTRACE(3); |
FTRACE(3); |
|
Line 317 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); |
| io_ether_ntoa((const struct io_ether_addr*) &proc->proc_ea, str + 7, 18); | e_ether_ntoa((const ether_addr_t*) &proc->proc_ea, str + 7, 18); |
| |
|
| execl("/usr/bin/login", "login", str, NULL); |
execl("/usr/bin/login", "login", str, NULL); |
| /* never reached */ |
/* never reached */ |
|
Line 327 spawnLogin(sched_task_t *task, struct tagProc *proc)
|
Line 255 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; | ts.tv_sec = Timeout; |
| schedTimer(TASK_ROOT(task), TOfunc, proc, tv); | schedTimer(TASK_ROOT(task), TOfunc, proc, ts, NULL, 0); |
| } |
} |
| break; |
break; |
| } |
} |