File:  [ELWIX - Embedded LightWeight unIX -] / ansh / src / client3.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 4 22:37:46 2011 UTC (12 years, 10 months ago) by misho
Branches: misho
CVS tags: start, ansh1_0
ansh ELWIX remote managment

    1: /*************************************************************************
    2:  * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
    3:  *  by Michael Pounov <misho@elwix.org>
    4:  *
    5:  * $Author: misho $
    6:  * $Id: client3.c,v 1.1.1.1 2011/10/04 22:37:46 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>