Annotation of ansh/src/client3.c, revision 1.3
1.1 misho 1: /*************************************************************************
2: * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
3: * by Michael Pounov <misho@elwix.org>
4: *
5: * $Author: misho $
1.3 ! misho 6: * $Id: client3.c,v 1.2.2.1 2011/10/31 15:49:37 misho Exp $
1.1 misho 7: *
1.2 misho 8: *************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
30: 4. Neither the name of AITNET nor the names of its contributors
31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
1.1 misho 46: #include "global.h"
47:
48:
49: static int
1.3 ! misho 50: SetRemoteWinz(int h, u_short id, io_sockaddr_t *sa, u_char *buf, int buflen)
1.1 misho 51: {
52: u_short *pos = (u_short*) buf;
53: struct winsize ws;
54:
55: FTRACE(5);
56:
57: memset(buf, 0, buflen);
58: if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1) {
59: printf("Error:: ioctl(winsize) #%d - %s\n", errno, strerror(errno));
60: return -1;
61: }
62:
63: pos[0] = htons(ws.ws_row);
64: pos[1] = htons(ws.ws_col);
65: pos[2] = htons(ws.ws_xpixel);
66: pos[3] = htons(ws.ws_ypixel);
1.3 ! misho 67: if (icmpSend(h, 0, id, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, sa, sa->sa.sa_len) == -1)
1.1 misho 68: return -1;
69:
70: return 0;
71: }
72:
73: int
1.3 ! misho 74: ConnectL3(int h, u_short id, io_sockaddr_t *sa, int len)
1.1 misho 75: {
76: fd_set rfd;
77: struct timeval tv = { Timeout, 0 };
78: struct termios otio;
79: int rlen, ret = 0;
80: u_short aid;
1.3 ! misho 81: io_sockaddr_t s;
1.2 misho 82: char flg, nl = 0;
83: u_char *buf, *str;
1.1 misho 84: socklen_t sl;
1.2 misho 85: u_int sq, Seq = 0;
1.1 misho 86:
87: FTRACE(3);
88:
89: if (!(buf = malloc(len))) {
90: printf("Error:: no enough memory #%d - %s\n", errno, strerror(errno));
91: return -1;
92: }
93:
94: if (SetRemoteWinz(h, id, sa, buf, len) == -1) {
95: free(buf);
96: return -1;
97: }
98:
99: ioSetRAWMode(STDIN_FILENO, &otio);
100:
101: while (!Kill) {
102: FD_ZERO(&rfd);
103: FD_SET(h, &rfd);
104: FD_SET(STDIN_FILENO, &rfd);
105: if (select(h + 1, &rfd, NULL, NULL, (Timeout ? &tv : NULL)) < 1) {
106: ret = -1;
107: break;
108: }
1.2 misho 109: if (FD_ISSET(h, &rfd)) {
1.1 misho 110: sl = sizeof s;
111: rlen = len;
112: memset(buf, 0, rlen);
1.2 misho 113: flg = icmpRecv(h, &sq, &aid, &Crypted, buf, &rlen, &s, &sl);
1.1 misho 114: if (flg == ANSH_FLG_ERR) {
115: ret = -1;
116: break;
117: }
118: if (aid != id) {
119: VERB(4) LOG("different service id %d / %d\n", aid, id);
120: continue;
121: }
122: if (flg == ANSH_FLG_EOF) {
123: VERB(3) LOG("receive EOF going down.\n");
124: Kill++;
125: }
126: if (flg != ANSH_FLG_OK)
127: continue;
1.2 misho 128: if (sq <= Seq)
129: continue;
130: else if (sq > (Seq + 1))
131: VERB(1) LOG("LOST PACKET(s) detect: %d; received seq=%d - %d",
132: sq - Seq + 1, sq, Seq);
133: Seq = sq;
134:
135: if (Crypted) {
136: str = cryptBuffer(buf, rlen, Crypted);
137: if (str) {
138: memcpy(buf, str, rlen);
139: free(str);
140: }
141: }
142:
1.1 misho 143: rlen = write(STDOUT_FILENO, buf, rlen);
144: if (rlen == -1) {
145: printf("Error:: write(stdout) #%d - %s\n", errno, strerror(errno));
146: ret = -1;
147: break;
148: }
1.2 misho 149: } else {
150: memset(buf, 0, len);
151: rlen = read(STDIN_FILENO, buf, len);
152: if (rlen == -1) {
153: printf("Error:: read(stdin) #%d - %s\n", errno, strerror(errno));
154: ret = -1;
155: break;
156: }
157:
158: /* local command handling */
159: if (rlen) {
160: /* execute local command */
161: if (nl == 2) {
162: switch (*buf) {
163: case '.':
164: Kill++;
165: printf("\n");
166: VERB(1) LOG("Exit from client\n");
167: continue;
168: case '~':
169: default:
170: nl ^= nl;
171: /* send buffer, unknown command */
172: break;
173: }
174: }
175: /* skip buffer and wait for local command */
176: if (nl == 1 && *buf == '~') {
177: nl++;
178: continue;
179: }
180: /* send buffer if detect NL */
181: if (*buf == 0xa || *buf == 0xd)
182: nl = 1;
183: else
184: nl ^= nl;
185: } else
186: nl ^= nl;
187:
188: if (Crypted) {
189: str = cryptBuffer(buf, rlen, Crypted);
190: if (str) {
191: memcpy(buf, str, rlen);
192: free(str);
193: }
194: }
195:
196: rlen = icmpSend(h, ++Seq, id, ANSH_FLG_CPOUT, Crypted, buf, rlen, sa, sizeof(struct sockaddr));
197: if (rlen == ANSH_FLG_ERR) {
198: ret = -1;
199: break;
200: }
1.1 misho 201: }
202: }
203:
204: ioRestoreMode(STDIN_FILENO, otio);
205: free(buf);
206: return ret;
207: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>