Annotation of ansh/src/client2.c, revision 1.1.1.1.2.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.1.1.1.2.3! misho       6:  * $Id: client2.c,v 1.1.1.1.2.2 2011/10/10 13:56:30 misho Exp $
1.1       misho       7:  *
                      8:  *************************************************************************/
                      9: #include "global.h"
                     10: 
                     11: 
                     12: static int
1.1.1.1.2.2  misho      13: SetRemoteWinz(int h, struct ether_addr *ea, u_char *buf, int buflen)
1.1       misho      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);
1.1.1.1.2.3! misho      30:        if (pktSend(h, 0, ANSH_FLG_WINZ, Crypted, buf, sizeof ws, ea) == -1)
1.1       misho      31:                return -1;
                     32: 
                     33:        return 0;
                     34: }
                     35: 
                     36: int
1.1.1.1.2.2  misho      37: ConnectL2(int h, struct ether_addr *ea, int len)
1.1       misho      38: {
                     39:        fd_set rfd;
                     40:        struct ether_header eth;
                     41:        struct timeval tv = { 10, 0 };
                     42:        struct termios otio;
                     43:        int rlen, ret = 0;
1.1.1.1.2.1  misho      44:        char flg, nl = 0;
                     45:        u_char *buf, *str;
1.1.1.1.2.3! misho      46:        u_int s, Seq = 0;
1.1       misho      47: 
                     48:        FTRACE(3);
                     49: 
                     50:        if (!(buf = malloc(len))) {
                     51:                printf("Error:: no enough memory #%d - %s\n", errno, strerror(errno));
                     52:                return -1;
                     53:        }
                     54: 
1.1.1.1.2.2  misho      55:        if (SetRemoteWinz(h, ea, buf, len) == -1) {
1.1       misho      56:                free(buf);
                     57:                return -1;
                     58:        }
                     59: 
                     60:        ioSetRAWMode(STDIN_FILENO, &otio);
                     61: 
                     62:        while (!Kill) {
                     63:                FD_ZERO(&rfd);
                     64:                FD_SET(h, &rfd);
                     65:                FD_SET(STDIN_FILENO, &rfd);
1.1.1.1.2.1  misho      66:                if (select(h + 1, &rfd, NULL, NULL, (Timeout ? &tv : NULL)) < 1) {
1.1       misho      67:                        ret = -1;
                     68:                        break;
                     69:                }
1.1.1.1.2.3! misho      70:                if (FD_ISSET(h, &rfd)) {
        !            71:                        rlen = len;
        !            72:                        memset(buf, 0, rlen);
        !            73:                        flg = pktRecv(h, &s, &Crypted, buf, &rlen, &eth);
        !            74:                        if (flg == ANSH_FLG_ERR) {
        !            75:                                ret = -1;
        !            76:                                break;
        !            77:                        }
        !            78:                        if (ntohs(eth.ether_type) != ANSH_ID) {
        !            79:                                VERB(4) LOG("different service id %d / %d\n", eth.ether_type, ANSH_ID);
        !            80:                                continue;
        !            81:                        }
        !            82:                        if (flg == ANSH_FLG_EOF) {
        !            83:                                VERB(3) LOG("receive EOF going down.\n");
        !            84:                                Kill++;
        !            85:                        }
        !            86:                        if (flg != ANSH_FLG_OK)
        !            87:                                continue;
        !            88:                        if (s <= Seq)
        !            89:                                continue;
        !            90:                        else if (s > (Seq + 1))
        !            91:                                VERB(1) LOG("LOST PACKET(s) detect: %d; received seq=%d - %d", 
        !            92:                                                s - (Seq + 1), s, Seq);
        !            93:                        Seq = s;
        !            94: 
        !            95:                        if (Crypted) {
        !            96:                                str = cryptBuffer(buf, rlen, Crypted);
        !            97:                                if (str) {
        !            98:                                        memcpy(buf, str, rlen);
        !            99:                                        free(str);
        !           100:                                }
        !           101:                        }
        !           102: 
        !           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:                } else {
1.1       misho     110:                        memset(buf, 0, len);
                    111:                        rlen = read(STDIN_FILENO, buf, len);
                    112:                        if (rlen == -1) {
                    113:                                printf("Error:: read(stdin) #%d - %s\n", errno, strerror(errno));
                    114:                                ret = -1;
                    115:                                break;
                    116:                        }
1.1.1.1.2.1  misho     117: 
                    118:                        /* local command handling */
                    119:                        if (rlen) {
                    120:                                /* execute local command */
                    121:                                if (nl == 2) {
                    122:                                        switch (*buf) {
                    123:                                                case '.':
                    124:                                                        Kill++;
                    125:                                                        printf("\n");
                    126:                                                        VERB(1) LOG("Exit from client\n");
                    127:                                                        continue;
                    128:                                                case '~':
                    129:                                                default:
                    130:                                                        nl ^= nl;
                    131:                                                        /* send buffer, unknown command  */
                    132:                                                        break;
                    133:                                        }
                    134:                                }
                    135:                                /* skip buffer and wait for local command */
                    136:                                if (nl == 1 && *buf == '~') {
                    137:                                        nl++;
                    138:                                        continue;
                    139:                                }
                    140:                                /* send buffer if detect NL */
                    141:                                if (*buf == 0xa || *buf == 0xd)
                    142:                                        nl = 1;
                    143:                                else
                    144:                                        nl ^= nl;
                    145:                        } else
                    146:                                nl ^= nl;
                    147: 
                    148:                        if (Crypted) {
                    149:                                str = cryptBuffer(buf, rlen, Crypted);
                    150:                                if (str) {
                    151:                                        memcpy(buf, str, rlen);
                    152:                                        free(str);
                    153:                                }
                    154:                        }
                    155: 
1.1.1.1.2.3! misho     156:                        rlen = pktSend(h, ++Seq, ANSH_FLG_CPOUT, Crypted, buf, rlen, ea);
1.1       misho     157:                        if (rlen == ANSH_FLG_ERR) {
                    158:                                ret = -1;
                    159:                                break;
                    160:                        }
                    161:                }
                    162:        }
                    163: 
                    164:        ioRestoreMode(STDIN_FILENO, otio);
                    165:        free(buf);
                    166:        return ret;
                    167: }

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