Annotation of ansh/src/client3.c, revision 1.1
1.1 ! misho 1: /*************************************************************************
! 2: * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
! 3: * by Michael Pounov <misho@elwix.org>
! 4: *
! 5: * $Author: misho $
! 6: * $Id: global.h,v 1.2 2011/06/08 12:45:40 misho Exp $
! 7: *
! 8: *************************************************************************/
! 9: #include "global.h"
! 10:
! 11:
! 12: static int
! 13: SetRemoteWinz(int h, u_short id, struct sockaddr *sa, u_char *buf, int buflen)
! 14: {
! 15: u_short *pos = (u_short*) buf;
! 16: struct winsize ws;
! 17:
! 18: FTRACE(5);
! 19:
! 20: memset(buf, 0, buflen);
! 21: if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1) {
! 22: printf("Error:: ioctl(winsize) #%d - %s\n", errno, strerror(errno));
! 23: return -1;
! 24: }
! 25:
! 26: pos[0] = htons(ws.ws_row);
! 27: pos[1] = htons(ws.ws_col);
! 28: pos[2] = htons(ws.ws_xpixel);
! 29: pos[3] = htons(ws.ws_ypixel);
! 30: if (icmpSend(h, id, ANSH_FLG_WINZ, buf, sizeof ws, sa, sizeof(struct sockaddr)) == -1)
! 31: return -1;
! 32:
! 33: return 0;
! 34: }
! 35:
! 36: int
! 37: ConnectL3(int h, u_short id, struct sockaddr *sa, int len)
! 38: {
! 39: fd_set rfd;
! 40: struct timeval tv = { Timeout, 0 };
! 41: struct termios otio;
! 42: int rlen, ret = 0;
! 43: u_short aid;
! 44: struct sockaddr s;
! 45: char flg;
! 46: u_char *buf;
! 47: socklen_t sl;
! 48:
! 49: FTRACE(3);
! 50:
! 51: if (!(buf = malloc(len))) {
! 52: printf("Error:: no enough memory #%d - %s\n", errno, strerror(errno));
! 53: return -1;
! 54: }
! 55:
! 56: if (SetRemoteWinz(h, id, sa, buf, len) == -1) {
! 57: free(buf);
! 58: return -1;
! 59: }
! 60:
! 61: ioSetRAWMode(STDIN_FILENO, &otio);
! 62:
! 63: while (!Kill) {
! 64: FD_ZERO(&rfd);
! 65: FD_SET(h, &rfd);
! 66: FD_SET(STDIN_FILENO, &rfd);
! 67: if (select(h + 1, &rfd, NULL, NULL, (Timeout ? &tv : NULL)) < 1) {
! 68: ret = -1;
! 69: break;
! 70: }
! 71: if (FD_ISSET(STDIN_FILENO, &rfd)) {
! 72: memset(buf, 0, len);
! 73: rlen = read(STDIN_FILENO, buf, len);
! 74: if (rlen == -1) {
! 75: printf("Error:: read(stdin) #%d - %s\n", errno, strerror(errno));
! 76: ret = -1;
! 77: break;
! 78: }
! 79: rlen = icmpSend(h, id, ANSH_FLG_CPOUT, buf, rlen, sa, sizeof(struct sockaddr));
! 80: if (rlen == ANSH_FLG_ERR) {
! 81: ret = -1;
! 82: break;
! 83: }
! 84: } else {
! 85: sl = sizeof s;
! 86: rlen = len;
! 87: memset(buf, 0, rlen);
! 88: flg = icmpRecv(h, &aid, buf, &rlen, &s, &sl);
! 89: if (flg == ANSH_FLG_ERR) {
! 90: ret = -1;
! 91: break;
! 92: }
! 93: if (aid != id) {
! 94: VERB(4) LOG("different service id %d / %d\n", aid, id);
! 95: continue;
! 96: }
! 97: if (flg == ANSH_FLG_EOF) {
! 98: VERB(3) LOG("receive EOF going down.\n");
! 99: Kill++;
! 100: }
! 101: if (flg != ANSH_FLG_OK)
! 102: continue;
! 103: rlen = write(STDOUT_FILENO, buf, rlen);
! 104: if (rlen == -1) {
! 105: printf("Error:: write(stdout) #%d - %s\n", errno, strerror(errno));
! 106: ret = -1;
! 107: break;
! 108: }
! 109: }
! 110: }
! 111:
! 112: ioRestoreMode(STDIN_FILENO, otio);
! 113: free(buf);
! 114: return ret;
! 115: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>