--- ansh/src/client2.c 2011/10/04 22:37:46 1.1.1.1 +++ ansh/src/client2.c 2011/10/10 09:11:48 1.1.1.1.2.1 @@ -3,7 +3,7 @@ * 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.1 2011/10/10 09:11:48 misho Exp $ * *************************************************************************/ #include "global.h" @@ -27,7 +27,7 @@ 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, id, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, ea) == -1) return -1; return 0; @@ -41,8 +41,8 @@ ConnectL2(int h, u_short id, struct ether_addr *ea, in 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); @@ -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, id, ANSH_FLG_CPOUT, Crypted, buf, rlen, ea); if (rlen == ANSH_FLG_ERR) { ret = -1; break; @@ -82,7 +121,7 @@ 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; @@ -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));