int spyon(char *sockname) { SOCKET spy_sock=INVALID_SOCKET; struct sockaddr_un spy_name; socklen_t spy_len; unsigned char key; unsigned char buf; int i; fd_set rd; BOOL b; int retval=0; char ANSIbuf[32]; int parsing=0; int telnet_strip=0; struct text_info ti; char *scrn; /* ToDo Test for it actually being a socket! */ /* Well, it will fail to connect won't it? */ if((spy_sock=socket(PF_UNIX,SOCK_STREAM,0))==INVALID_SOCKET) { printf("ERROR %d creating local spy socket", errno); return(SPY_NOSOCKET); } spy_name.sun_family=AF_UNIX; SAFECOPY(spy_name.sun_path,sockname); #ifdef SUN_LEN spy_len=SUN_LEN(&spy_name); #else spy_len=sizeof(struct sockaddr_un); #endif if(connect(spy_sock,(struct sockaddr *)&spy_name,spy_len)) { return(SPY_NOCONNECT); } i=1; gettextinfo(&ti); scrn=(char *)alloca(ti.screenwidth*ti.screenheight*2); gettext(1,1,ti.screenwidth,ti.screenheight,scrn); textcolor(YELLOW); textbackground(BLUE); clrscr(); gotoxy(1,ti.screenheight); cputs("Local spy mode... press CTRL-C to return to monitor"); clreol(); cterm=cterm_init(ti.screenheight-1,ti.screenwidth,1,1,0,NULL,CTERM_EMULATION_ANSI_BBS); while(spy_sock!=INVALID_SOCKET && cterm != NULL) { struct timeval tv; tv.tv_sec=0; tv.tv_usec=100; FD_ZERO(&rd); FD_SET(spy_sock,&rd); if((select(spy_sock+1,&rd,NULL,NULL,&tv))<0) { close(spy_sock); spy_sock=INVALID_SOCKET; retval=SPY_SELECTFAILED; break; } if(!socket_check(spy_sock,NULL,&b,0)) { close(spy_sock); spy_sock=INVALID_SOCKET; retval=SPY_SOCKETLOST; break; } if(spy_sock != INVALID_SOCKET && FD_ISSET(spy_sock,&rd)) { if((i=read(spy_sock,&buf,1))==1) { if(telnet_strip) { telnet_strip++; if(buf==255 && telnet_strip==2) { telnet_strip=0; cterm_write(cterm, &buf,1,NULL,0,NULL); } if(telnet_strip==3) telnet_strip=0; } else if(buf==255) telnet_strip=1; else cterm_write(cterm, &buf,1,NULL,0,NULL); } else if(i<0) { close(spy_sock); spy_sock=INVALID_SOCKET; retval=SPY_SOCKETLOST; break; } } if(kbhit()) { key=getch(); /* Check for control keys */ switch(key) { case 0: /* Extended keys */ case 0xff: getch(); break; case 3: /* CTRL-C */ close(spy_sock); spy_sock=INVALID_SOCKET; retval=SPY_CLOSED; break; default: write(spy_sock,&key,1); } } } cterm_end(cterm); puttext(1,1,ti.screenwidth,ti.screenheight,scrn); window(ti.winleft,ti.wintop,ti.winright,ti.winbottom); textattr(ti.attribute); gotoxy(ti.curx,ti.cury); return(retval); }
int main(int argc, char **argv) { struct text_info ti; FILE *f; char buf[BUF_SIZE*2]; /* Room for lfexpand */ int len; int speed; char *scrollbuf; char *infile=NULL; char title[MAX_PATH+1]; int expand=0; int i; textmode(C80); gettextinfo(&ti); if((scrollbuf=malloc(SCROLL_LINES*ti.screenwidth*2))==NULL) { cprintf("Cannot allocate memory\n\n\rPress any key to exit."); getch(); return(-1); } /* Parse command line */ for(i=1; i<argc; i++) { if(argv[i][0]=='-') { if(argv[i][1]=='l' && argv[i][2]==0) expand=1; else goto usage; } else { if(infile==NULL) infile=argv[i]; else goto usage; } } cterm_init(ti.screenheight, ti.screenwidth, 0, 0, SCROLL_LINES, scrollbuf); if(infile) { if((f=fopen(infile,"r"))==NULL) { cprintf("Cannot read %s\n\n\rPress any key to exit.",argv[1]); getch(); return(-1); } sprintf(title,"SyncView: %s",getfname(argv[1])); } else { f=stdin; strcpy(title,"SyncView: [stdin]"); } settitle(title); while((len=fread(buf, 1, BUF_SIZE, f))!=0) { if(expand) lfexpand(buf, &len); cterm_write(buf, len, NULL, 0, &speed); } viewscroll(); return(0); usage: cprintf("Usage: %s [-l] [filename]\r\n\r\n" "Displays the ANSI file filename expanding \\n to \\r\\n if -l is specified.\r\n" "If no filename is specified, reads input from stdin\r\n" "\r\n" "Press any key to exit."); getch(); return(-1); }
int main(int argc, char **argv) { struct text_info ti; FILE *f; char buf[BUF_SIZE*2]; /* Room for lfexpand */ int len; int speed=0; char *scrollbuf; char *infile=NULL; char title[MAX_PATH+1]; int expand=0; int ansi=0; int i; /* Parse command line */ for(i=1; i<argc; i++) { if(argv[i][0]=='-') { if(argv[i][1]=='l' && argv[i][2]==0) expand=1; else if(argv[i][1]=='a' && argv[i][2]==0) ansi=1; else goto usage; } else { if(infile==NULL) infile=argv[i]; else goto usage; } } if(ansi) { initciolib(CIOLIB_MODE_ANSI); puts("START OF ANSI..."); } textmode(C80); gettextinfo(&ti); if((scrollbuf=malloc(SCROLL_LINES*ti.screenwidth*2))==NULL) { cprintf("Cannot allocate memory\n\n\rPress any key to exit."); getch(); return(-1); } cterm=cterm_init(ti.screenheight, ti.screenwidth, 1, 1, SCROLL_LINES, scrollbuf, CTERM_EMULATION_ANSI_BBS); if(!cterm) { fputs("ERROR Initializing CTerm!\n", stderr); return 1; } if(infile) { if((f=fopen(infile,"r"))==NULL) { cprintf("Cannot read %s\n\n\rPress any key to exit.",argv[1]); getch(); return(-1); } sprintf(title,"SyncView: %s",getfname(argv[1])); } else { f=stdin; strcpy(title,"SyncView: [stdin]"); } settitle(title); while((len=fread(buf, 1, BUF_SIZE, f))!=0) { if(expand) lfexpand(buf, &len); cterm_write(cterm, buf, len, NULL, 0, &speed); } if(ansi) { puts(""); puts("END OF ANSI"); gettext(1,1,ti.screenwidth,ti.screenheight,scrollbuf); puttext_can_move=1; puts("START OF SCREEN DUMP..."); clrscr(); puttext(1,1,ti.screenwidth,ti.screenheight,scrollbuf); } else viewscroll(); return(0); usage: cprintf("Usage: %s [-l] [-a] [filename]\r\n\r\n" "Displays the ANSI file filename expanding \\n to \\r\\n if -l is specified.\r\n" "If no filename is specified, reads input from stdin\r\n" "If -a is specified, outputs ANSI to stdout\r\n" "\r\n" "Press any key to exit."); getch(); return(-1); }