--- ansh/src/client2.c 2011/10/04 22:37:46 1.1.1.1 +++ ansh/src/client2.c 2011/10/10 13:56:30 1.1.1.1.2.2 @@ -3,14 +3,14 @@ * by Michael Pounov * * $Author: misho $ - * $Id: client2.c,v 1.1.1.1 2011/10/04 22:37:46 misho Exp $ + * $Id: client2.c,v 1.1.1.1.2.2 2011/10/10 13:56:30 misho Exp $ * *************************************************************************/ #include "global.h" static int -SetRemoteWinz(int h, u_short id, struct ether_addr *ea, u_char *buf, int buflen) +SetRemoteWinz(int h, struct ether_addr *ea, u_char *buf, int buflen) { u_short *pos = (u_short*) buf; struct winsize ws; @@ -27,22 +27,22 @@ SetRemoteWinz(int h, u_short id, struct ether_addr *ea pos[1] = htons(ws.ws_col); pos[2] = htons(ws.ws_xpixel); pos[3] = htons(ws.ws_ypixel); - if (pktSend(h, id, ANSH_FLG_WINZ, buf, sizeof ws, ea) == -1) + if (pktSend(h, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, ea) == -1) return -1; return 0; } int -ConnectL2(int h, u_short id, struct ether_addr *ea, int len) +ConnectL2(int h, struct ether_addr *ea, int len) { fd_set rfd; struct ether_header eth; struct timeval tv = { 10, 0 }; struct termios otio; int rlen, ret = 0; - char flg; - u_char *buf; + char flg, nl = 0; + u_char *buf, *str; FTRACE(3); @@ -51,7 +51,7 @@ ConnectL2(int h, u_short id, struct ether_addr *ea, in return -1; } - if (SetRemoteWinz(h, id, ea, buf, len) == -1) { + if (SetRemoteWinz(h, ea, buf, len) == -1) { free(buf); return -1; } @@ -62,7 +62,7 @@ ConnectL2(int h, u_short id, struct ether_addr *ea, in FD_ZERO(&rfd); FD_SET(h, &rfd); FD_SET(STDIN_FILENO, &rfd); - if (select(h + 1, &rfd, NULL, NULL, &tv) < 1) { + if (select(h + 1, &rfd, NULL, NULL, (Timeout ? &tv : NULL)) < 1) { ret = -1; break; } @@ -74,7 +74,46 @@ ConnectL2(int h, u_short id, struct ether_addr *ea, in ret = -1; break; } - rlen = pktSend(h, id, ANSH_FLG_CPOUT, buf, rlen, ea); + + /* local command handling */ + if (rlen) { + /* execute local command */ + if (nl == 2) { + switch (*buf) { + case '.': + Kill++; + printf("\n"); + VERB(1) LOG("Exit from client\n"); + continue; + case '~': + default: + nl ^= nl; + /* send buffer, unknown command */ + break; + } + } + /* skip buffer and wait for local command */ + if (nl == 1 && *buf == '~') { + nl++; + continue; + } + /* send buffer if detect NL */ + if (*buf == 0xa || *buf == 0xd) + nl = 1; + else + nl ^= nl; + } else + nl ^= nl; + + if (Crypted) { + str = cryptBuffer(buf, rlen, Crypted); + if (str) { + memcpy(buf, str, rlen); + free(str); + } + } + + rlen = pktSend(h, ANSH_FLG_CPOUT, Crypted, buf, rlen, ea); if (rlen == ANSH_FLG_ERR) { ret = -1; break; @@ -82,13 +121,13 @@ ConnectL2(int h, u_short id, struct ether_addr *ea, in } else { rlen = len; memset(buf, 0, rlen); - flg = pktRecv(h, buf, &rlen, ð); + flg = pktRecv(h, &Crypted, buf, &rlen, ð); if (flg == ANSH_FLG_ERR) { ret = -1; break; } - if (ntohs(eth.ether_type) != id) { - VERB(4) LOG("different service id %d / %d\n", ntohs(eth.ether_type), id); + if (ntohs(eth.ether_type) != ANSH_ID) { + VERB(4) LOG("different service id %d / %d\n", eth.ether_type, ANSH_ID); continue; } if (flg == ANSH_FLG_EOF) { @@ -97,6 +136,15 @@ ConnectL2(int h, u_short id, struct ether_addr *ea, in } if (flg != ANSH_FLG_OK) continue; + + if (Crypted) { + str = cryptBuffer(buf, rlen, Crypted); + if (str) { + memcpy(buf, str, rlen); + free(str); + } + } + rlen = write(STDOUT_FILENO, buf, rlen); if (rlen == -1) { printf("Error:: write(stdout) #%d - %s\n", errno, strerror(errno));