static void sigint_handler(int signum) { (void)signum; restore_tty_state(); report(stderr, GT_("\nCaught SIGINT... bailing out.\n")); exit(1); }
/*{{{ static void user_stop_signal (int sig)*/ static void user_stop_signal (int sig) { /* Advanced Programming in the UNIX Environment, Stevens; P321 */ /* set continue handler for after stop */ signal (SIGCONT, user_cont_signal); if (stdin_is_tty && occam_uses_keyboard ()) { restore_tty_state (); } /* kill_kbdio (); */ /* Do the default SIGTSTP action - stop this process */ kill (getpid(), SIGSTOP); #if defined(SIGNAL_TYPE_SYSV) /* Re-establish signal handler */ signal (SIGTSTP, user_stop_signal); #endif }
char *fm_getpassword(char *prompt) { register char *p; register int c; FILE *fi; static char pbuf[INPUT_BUF_SIZE]; SIGHANDLERTYPE sig = 0; /* initialization pacifies -Wall */ int istty = isatty(0); /* get the file descriptor for the actual input device if it's a tty */ if (istty) { if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL) fi = stdin; else setbuf(fi, (char *)NULL); } else fi = stdin; /* store descriptor for the tty */ ttyfd = fileno(fi); if (istty) { /* preserve tty state before turning off echo */ save_tty_state(); /* now that we have the current tty state, we can catch SIGINT and exit gracefully */ sig = set_signal_handler(SIGINT, sigint_handler); /* turn off echo on the tty */ disable_tty_echo(); /* display the prompt and get the input string */ fprintf(stderr, "%s", prompt); } for (p = pbuf; (c = getc(fi))!='\n' && c!=EOF;) { if (p < &pbuf[INPUT_BUF_SIZE - 1]) *p++ = c; } *p = '\0'; /* write a newline so cursor won't appear to hang */ if (fi != stdin) fprintf(stderr, "\n"); if (istty) { /* restore previous state of the tty */ restore_tty_state(); /* restore previous state of SIGINT */ set_signal_handler(SIGINT, sig); } if (fi != stdin) fclose(fi); /* not checking should be safe, file mode was "r" */ return(pbuf); }