#include "config.h" #ifdef USE_TIOCGETP #include <sys/ioctl.h> #endif #include <signal.h> #include <stdio.h> #ifdef USE_TCGETA #include <termio.h> #endif char *rcv_message(); extern void prepare_ipc(), exit(), send_message(), read_server(); void catch_sig(); extern int getpid(), fork(), kill(); int child, parent, do_not_echo; #ifdef USE_TIOCGETP struct sigvec sig; #endif int main(argc, argv) int argc; char **argv; { char buff[200]; char old_buff[sizeof buff]; int port = 2000; #ifdef USE_TCGETA struct termio termio; #endif #ifdef USE_TIOCGETP struct sgttyb sgttyb; #endif if (argc == 2) port = atoi(argv[1]); else if (argc != 1) { fprintf(stderr, "Usage: %s [port]\n", argv[0]); exit(1); } prepare_ipc(port); parent = getpid(); child = fork(); if (child == 0) { read_server(); exit(0); } #ifdef USE_TCGETA signal(SIGUSR1, catch_sig); #endif #ifdef USE_TIOCGETP sig.sv_handler = (int (*)())catch_sig; sig.sv_mask = SIGUSR1; sig.sv_flags = SV_INTERRUPT; if (sigvec(SIGUSR1, &sig, 0) == -1) { perror("sigvec"); exit(1); } #endif while(1) { if (do_not_echo) { fflush(stdout); #ifdef USE_TIOCGETP if (ioctl(1, TIOCGETP, &sgttyb) == -1) { perror("ioctl TIOCGETP"); exit(1); } sgttyb.sg_flags &= ~ECHO; if (ioctl(1, TIOCSETP, &sgttyb) == -1) { perror("ioctl TIOCSETP"); exit(1); } #endif #ifdef USE_TCGETA if (ioctl(0, TCGETA, &termio) == -1) { perror("ioctl TCGETA"); exit(1); } termio.c_lflag &= ~ECHO; if (ioctl(0, TCSETA, &termio) == -1) { perror("ioctl TCGETA"); exit(1); } #endif } if (fgets(buff, sizeof buff, stdin) == 0) continue; #ifdef USE_TIOCGETP if (do_not_echo) { sgttyb.sg_flags |= ECHO; if (ioctl(0, TIOCSETP, &sgttyb) == -1) { perror("ioctl TIOCSETP"); exit(1); } do_not_echo = 0; } #endif #ifdef USE_TCGETA if (do_not_echo) { termio.c_lflag |= ECHO; if (ioctl(0, TCSETA, &termio) == -1) { perror("ioctl TCGETA"); exit(1); } do_not_echo = 0; } #endif if (strcmp(buff, "!\n") == 0) strcpy(buff, old_buff); else strcpy(old_buff, buff); send_message(buff); } /*NOTREACHED*/ } void read_server() { char *str; while(1) { str = rcv_message(); if (str[0] == '\0') { (void)kill(parent, SIGINT); exit(0); } if (strncmp(str, "Password: ", 10) == 0) kill(parent, SIGUSR1); (void)printf("%s", str); (void)fflush(stdout); } } void catch_sig() { #ifdef USE_TCGETA signal(SIGUSR1, catch_sig); #endif do_not_echo = 1; }