File:  [ELWIX - Embedded LightWeight unIX -] / ansh / src / client3.c
Revision 1.1.1.1.2.1: download - view: text, annotated - select for diffs - revision graph
Wed Oct 5 23:57:24 2011 UTC (12 years, 9 months ago) by misho
Branches: ansh1_0
Diff to: branchpoint 1.1.1.1: preferred, unified
finish local commands handling

    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.2.1 2011/10/05 23:57:24 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, nl = 0;
   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: 
   80: 			/* local command handling */
   81: 			if (rlen) {
   82: 				/* execute local command */
   83: 			       	if (nl == 2) {
   84: 					switch (*buf) {
   85: 						case '.':
   86: 							Kill++;
   87: 							printf("\n");
   88: 							VERB(1) LOG("Exit from client\n");
   89: 							continue;
   90: 						case '~':
   91: 						default:
   92: 							nl ^= nl;
   93: 							/* send buffer, unknown command  */
   94: 							break;
   95: 					}
   96: 				}
   97: 				/* skip buffer and wait for local command */
   98: 				if (nl == 1 && *buf == '~') {
   99: 					nl++;
  100: 					continue;
  101: 				}
  102: 				/* send buffer if detect NL */
  103: 				if (*buf == 0xa || *buf == 0xd)
  104: 					nl = 1;
  105: 				else
  106: 					nl ^= nl;
  107: 			} else
  108: 				nl ^= nl;
  109: 
  110: 			rlen = icmpSend(h, id, ANSH_FLG_CPOUT, buf, rlen, sa, sizeof(struct sockaddr));
  111: 			if (rlen == ANSH_FLG_ERR) {
  112: 				ret = -1;
  113: 				break;
  114: 			}
  115: 		} else {
  116: 			sl = sizeof s;
  117: 			rlen = len;
  118: 			memset(buf, 0, rlen);
  119: 			flg = icmpRecv(h, &aid, buf, &rlen, &s, &sl);
  120: 			if (flg == ANSH_FLG_ERR) {
  121: 				ret = -1;
  122: 				break;
  123: 			}
  124: 			if (aid != id) {
  125: 				VERB(4) LOG("different service id %d / %d\n", aid, id);
  126: 				continue;
  127: 			}
  128: 			if (flg == ANSH_FLG_EOF) {
  129: 				VERB(3) LOG("receive EOF going down.\n");
  130: 				Kill++;
  131: 			}
  132: 			if (flg != ANSH_FLG_OK)
  133: 				continue;
  134: 			rlen = write(STDOUT_FILENO, buf, rlen);
  135: 			if (rlen == -1) {
  136: 				printf("Error:: write(stdout) #%d - %s\n", errno, strerror(errno));
  137: 				ret = -1;
  138: 				break;
  139: 			}
  140: 		}
  141: 	}
  142: 
  143: 	ioRestoreMode(STDIN_FILENO, otio);
  144: 	free(buf);
  145: 	return ret;
  146: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>