Annotation of sbbs/src/sbbs3/umonitor/spyon.c, revision 1.1

1.1     ! root        1: /* spyon.c */
        !             2: 
        !             3: /* Synchronet for *nix node spy */
        !             4: 
        !             5: /* $Id: spyon.c,v 1.7 2006/05/08 18:58:21 deuce Exp $ */
        !             6: 
        !             7: /****************************************************************************
        !             8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !            10:  *                                                                                                                                                     *
        !            11:  * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html         *
        !            12:  *                                                                                                                                                     *
        !            13:  * This program is free software; you can redistribute it and/or                       *
        !            14:  * modify it under the terms of the GNU General Public License                         *
        !            15:  * as published by the Free Software Foundation; either version 2                      *
        !            16:  * of the License, or (at your option) any later version.                                      *
        !            17:  * See the GNU General Public License for more details: gpl.txt or                     *
        !            18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
        !            19:  *                                                                                                                                                     *
        !            20:  * Anonymous FTP access to the most recent released source is available at     *
        !            21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
        !            22:  *                                                                                                                                                     *
        !            23:  * Anonymous CVS access to the development source and modification history     *
        !            24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
        !            25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
        !            26:  *     (just hit return, no password is necessary)                                                     *
        !            27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
        !            28:  *                                                                                                                                                     *
        !            29:  * For Synchronet coding style and modification guidelines, see                                *
        !            30:  * http://www.synchro.net/source.html                                                                          *
        !            31:  *                                                                                                                                                     *
        !            32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
        !            33:  * format) via e-mail to [email protected]                                                                      *
        !            34:  *                                                                                                                                                     *
        !            35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
        !            36:  ****************************************************************************/
        !            37: 
        !            38: #include <unistd.h>
        !            39: #include <stdlib.h>
        !            40: #include "sockwrap.h"  /* Must go before <sys/un.h> */
        !            41: #include <sys/un.h>
        !            42: #include <stdio.h>
        !            43: #include <string.h>
        !            44: #include "sockwrap.h"
        !            45: #include "spyon.h"
        !            46: #include "cterm.h"
        !            47: #include "ciolib.h"
        !            48: 
        !            49: int spyon(char *sockname)  {
        !            50:        SOCKET          spy_sock=INVALID_SOCKET;
        !            51:        struct sockaddr_un spy_name;
        !            52:        socklen_t       spy_len;
        !            53:        unsigned char           key;
        !            54:        unsigned char           buf;
        !            55:        int             i;
        !            56:        fd_set  rd;
        !            57:        BOOL    b;
        !            58:        int             retval=0;
        !            59:        char    ANSIbuf[32];
        !            60:        int             parsing=0;
        !            61:        int             telnet_strip=0;
        !            62:        struct text_info ti;
        !            63:        char *scrn;
        !            64: 
        !            65:        /* ToDo Test for it actually being a socket! */
        !            66:        /* Well, it will fail to connect won't it?   */
        !            67: 
        !            68:        if((spy_sock=socket(PF_UNIX,SOCK_STREAM,0))==INVALID_SOCKET)  {
        !            69:                printf("ERROR %d creating local spy socket", errno);
        !            70:                return(SPY_NOSOCKET);
        !            71:        }
        !            72:        
        !            73:        spy_name.sun_family=AF_UNIX;
        !            74:        SAFECOPY(spy_name.sun_path,sockname);
        !            75: #ifdef SUN_LEN
        !            76:        spy_len=SUN_LEN(&spy_name);
        !            77: #else
        !            78:        spy_len=sizeof(struct sockaddr_un);
        !            79: #endif
        !            80:        if(connect(spy_sock,(struct sockaddr *)&spy_name,spy_len))  {
        !            81:                return(SPY_NOCONNECT);
        !            82:        }
        !            83:        i=1;
        !            84: 
        !            85:        gettextinfo(&ti);
        !            86:        scrn=(char *)alloca(ti.screenwidth*ti.screenheight*2);
        !            87:        gettext(1,1,ti.screenwidth,ti.screenheight,scrn);
        !            88:        textcolor(YELLOW);
        !            89:        textbackground(BLUE);
        !            90:        clrscr();
        !            91:        gotoxy(1,ti.screenheight);
        !            92:        cputs("Local spy mode... press CTRL-C to return to monitor");
        !            93:        clreol();
        !            94:        cterm_init(ti.screenheight-1,ti.screenwidth,1,1,0,NULL);
        !            95:        while(spy_sock!=INVALID_SOCKET)  {
        !            96:                struct timeval tv;
        !            97:                tv.tv_sec=0;
        !            98:                tv.tv_usec=100;
        !            99:                FD_ZERO(&rd);
        !           100:                FD_SET(spy_sock,&rd);
        !           101:                if((select(spy_sock+1,&rd,NULL,NULL,&tv))<0)  {
        !           102:                        close(spy_sock);
        !           103:                        spy_sock=INVALID_SOCKET;
        !           104:                        retval=SPY_SELECTFAILED;
        !           105:                        break;
        !           106:                }
        !           107:                if(!socket_check(spy_sock,NULL,&b,0)) {
        !           108:                        close(spy_sock);
        !           109:                        spy_sock=INVALID_SOCKET;
        !           110:                        retval=SPY_SOCKETLOST;
        !           111:                        break;
        !           112:                }
        !           113:                if(spy_sock != INVALID_SOCKET && FD_ISSET(spy_sock,&rd))  {
        !           114:                        if((i=read(spy_sock,&buf,1))==1)  {
        !           115:                                if(telnet_strip) {
        !           116:                                        telnet_strip++;
        !           117:                                        if(buf==255 && telnet_strip==2) {
        !           118:                                                telnet_strip=0;
        !           119:                                                cterm_write(&buf,1,NULL,0,NULL);
        !           120:                                        }
        !           121:                                        if(telnet_strip==3)
        !           122:                                                telnet_strip=0;
        !           123:                                }
        !           124:                                else
        !           125:                                        if(buf==255)
        !           126:                                                telnet_strip=1;
        !           127:                                        else
        !           128:                                                cterm_write(&buf,1,NULL,0,NULL);
        !           129:                        }
        !           130:                        else if(i<0) {
        !           131:                                close(spy_sock);
        !           132:                                spy_sock=INVALID_SOCKET;
        !           133:                                retval=SPY_SOCKETLOST;
        !           134:                                break;
        !           135:                        }
        !           136:                }
        !           137:                if(kbhit())  {
        !           138:                        key=getch();
        !           139:                        /* Check for control keys */
        !           140:                        switch(key)  {
        !           141:                                case 0:         /* Extended keys */
        !           142:                                case 0xff:
        !           143:                                        getch();
        !           144:                                        break;
        !           145:                                case 3: /* CTRL-C */
        !           146:                                        close(spy_sock);
        !           147:                                        spy_sock=INVALID_SOCKET;
        !           148:                                        retval=SPY_CLOSED;
        !           149:                                        break;
        !           150:                                default:
        !           151:                                        write(spy_sock,&key,1);
        !           152:                        }
        !           153:                }
        !           154:        }
        !           155:        puttext(1,1,ti.screenwidth,ti.screenheight,scrn);
        !           156:        window(ti.winleft,ti.wintop,ti.winright,ti.winbottom);
        !           157:        textattr(ti.attribute);
        !           158:        gotoxy(ti.curx,ti.cury);
        !           159:        return(retval);
        !           160: }
        !           161: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.