/************************************************************************* * (C) 2011 AITNET - Sofia/Bulgaria - * by Michael Pounov * * $Author: misho $ * $Id: client3.c,v 1.1 2011/10/04 22:37:46 misho Exp $ * *************************************************************************/ #include "global.h" static int SetRemoteWinz(int h, u_short id, struct sockaddr *sa, 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 (icmpSend(h, id, ANSH_FLG_WINZ, buf, sizeof ws, sa, sizeof(struct sockaddr)) == -1) return -1; return 0; } int ConnectL3(int h, u_short id, struct sockaddr *sa, int len) { fd_set rfd; struct timeval tv = { Timeout, 0 }; struct termios otio; int rlen, ret = 0; u_short aid; struct sockaddr s; char flg; u_char *buf; socklen_t sl; FTRACE(3); if (!(buf = malloc(len))) { printf("Error:: no enough memory #%d - %s\n", errno, strerror(errno)); return -1; } if (SetRemoteWinz(h, id, sa, 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; } rlen = icmpSend(h, id, ANSH_FLG_CPOUT, buf, rlen, sa, sizeof(struct sockaddr)); if (rlen == ANSH_FLG_ERR) { ret = -1; break; } } else { sl = sizeof s; rlen = len; memset(buf, 0, rlen); flg = icmpRecv(h, &aid, buf, &rlen, &s, &sl); if (flg == ANSH_FLG_ERR) { ret = -1; break; } if (aid != id) { VERB(4) LOG("different service id %d / %d\n", aid, id); continue; } if (flg == ANSH_FLG_EOF) { VERB(3) LOG("receive EOF going down.\n"); Kill++; } if (flg != ANSH_FLG_OK) continue; 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; }