/*************************************************************************
* (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
* by Michael Pounov <misho@elwix.org>
*
* $Author: misho $
* $Id: client2.c,v 1.1.1.1.2.1 2011/10/10 09:11:48 misho Exp $
*
*************************************************************************/
#include "global.h"
static int
SetRemoteWinz(int h, u_short id, struct ether_addr *ea, 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 (pktSend(h, id, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, ea) == -1)
return -1;
return 0;
}
int
ConnectL2(int h, u_short id, struct ether_addr *ea, int len)
{
fd_set rfd;
struct ether_header eth;
struct timeval tv = { 10, 0 };
struct termios otio;
int rlen, ret = 0;
char flg, nl = 0;
u_char *buf, *str;
FTRACE(3);
if (!(buf = malloc(len))) {
printf("Error:: no enough memory #%d - %s\n", errno, strerror(errno));
return -1;
}
if (SetRemoteWinz(h, id, ea, 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;
}
/* local command handling */
if (rlen) {
/* execute local command */
if (nl == 2) {
switch (*buf) {
case '.':
Kill++;
printf("\n");
VERB(1) LOG("Exit from client\n");
continue;
case '~':
default:
nl ^= nl;
/* send buffer, unknown command */
break;
}
}
/* skip buffer and wait for local command */
if (nl == 1 && *buf == '~') {
nl++;
continue;
}
/* send buffer if detect NL */
if (*buf == 0xa || *buf == 0xd)
nl = 1;
else
nl ^= nl;
} else
nl ^= nl;
if (Crypted) {
str = cryptBuffer(buf, rlen, Crypted);
if (str) {
memcpy(buf, str, rlen);
free(str);
}
}
rlen = pktSend(h, id, ANSH_FLG_CPOUT, Crypted, buf, rlen, ea);
if (rlen == ANSH_FLG_ERR) {
ret = -1;
break;
}
} else {
rlen = len;
memset(buf, 0, rlen);
flg = pktRecv(h, &Crypted, buf, &rlen, ð);
if (flg == ANSH_FLG_ERR) {
ret = -1;
break;
}
if (ntohs(eth.ether_type) != id) {
VERB(4) LOG("different service id %d / %d\n", ntohs(eth.ether_type), id);
continue;
}
if (flg == ANSH_FLG_EOF) {
VERB(3) LOG("receive EOF going down.\n");
Kill++;
}
if (flg != ANSH_FLG_OK)
continue;
if (Crypted) {
str = cryptBuffer(buf, rlen, Crypted);
if (str) {
memcpy(buf, str, rlen);
free(str);
}
}
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>