Annotation of ansh/src/client3.c, revision 1.1.1.1

1.1       misho       1: /*************************************************************************
                      2:  * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
                      3:  *  by Michael Pounov <misho@elwix.org>
                      4:  *
                      5:  * $Author: misho $
                      6:  * $Id: global.h,v 1.2 2011/06/08 12:45:40 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;
                     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:                        rlen = icmpSend(h, id, ANSH_FLG_CPOUT, buf, rlen, sa, sizeof(struct sockaddr));
                     80:                        if (rlen == ANSH_FLG_ERR) {
                     81:                                ret = -1;
                     82:                                break;
                     83:                        }
                     84:                } else {
                     85:                        sl = sizeof s;
                     86:                        rlen = len;
                     87:                        memset(buf, 0, rlen);
                     88:                        flg = icmpRecv(h, &aid, buf, &rlen, &s, &sl);
                     89:                        if (flg == ANSH_FLG_ERR) {
                     90:                                ret = -1;
                     91:                                break;
                     92:                        }
                     93:                        if (aid != id) {
                     94:                                VERB(4) LOG("different service id %d / %d\n", aid, id);
                     95:                                continue;
                     96:                        }
                     97:                        if (flg == ANSH_FLG_EOF) {
                     98:                                VERB(3) LOG("receive EOF going down.\n");
                     99:                                Kill++;
                    100:                        }
                    101:                        if (flg != ANSH_FLG_OK)
                    102:                                continue;
                    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:                }
                    110:        }
                    111: 
                    112:        ioRestoreMode(STDIN_FILENO, otio);
                    113:        free(buf);
                    114:        return ret;
                    115: }

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