/************************************************************************* * (C) 2011 AITNET - Sofia/Bulgaria - * by Michael Pounov * * $Author: misho $ * $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, struct ether_addr *ea, u_char *buf, int buflen) { u_short *pos = (u_short*) buf; struct winsize ws; FTRACE(5); memset(buf, 0, buflen); if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1) { printf("Error:: ioctl(winsize) #%d - %s\n", errno, strerror(errno)); return -1; } pos[0] = htons(ws.ws_row); pos[1] = htons(ws.ws_col); pos[2] = htons(ws.ws_xpixel); pos[3] = htons(ws.ws_ypixel); if (pktSend(h, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, ea) == -1) return -1; return 0; } int 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, nl = 0; u_char *buf, *str; FTRACE(3); if (!(buf = malloc(len))) { printf("Error:: no enough memory #%d - %s\n", errno, strerror(errno)); return -1; } if (SetRemoteWinz(h, ea, buf, len) == -1) { free(buf); return -1; } ioSetRAWMode(STDIN_FILENO, &otio); while (!Kill) { FD_ZERO(&rfd); FD_SET(h, &rfd); FD_SET(STDIN_FILENO, &rfd); if (select(h + 1, &rfd, NULL, NULL, (Timeout ? &tv : NULL)) < 1) { ret = -1; break; } if (FD_ISSET(STDIN_FILENO, &rfd)) { memset(buf, 0, len); rlen = read(STDIN_FILENO, buf, len); if (rlen == -1) { printf("Error:: read(stdin) #%d - %s\n", errno, strerror(errno)); ret = -1; break; } /* 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; } } else { rlen = len; memset(buf, 0, rlen); flg = pktRecv(h, &Crypted, buf, &rlen, ð); if (flg == ANSH_FLG_ERR) { ret = -1; break; } 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) { VERB(3) LOG("receive EOF going down.\n"); Kill++; } 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)); ret = -1; break; } } } ioRestoreMode(STDIN_FILENO, otio); free(buf); return ret; }