File:  [ELWIX - Embedded LightWeight unIX -] / ansh / src / client3.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Oct 4 22:37:46 2011 UTC (12 years, 8 months ago) by misho
Branches: MAIN
CVS tags: HEAD
Initial revision

/*************************************************************************
 * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
 *  by Michael Pounov <misho@elwix.org>
 *
 * $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;
}

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