/*{{{ static void user_cont_signal (int sig)*/ static void user_cont_signal (int sig) { /* Advanced Programming in the UNIX Environment, Stevens; P321 */ sigset_t mask; /* unblock SIGCONT since it is blocked while we're handling it */ sigemptyset (&mask); sigaddset (&mask, SIGCONT); sigprocmask (SIG_UNBLOCK, &mask, NULL); if (stdin_is_tty) { /* Save terminal state */ save_tty_state (); } /* Do default SIGCONT action - continue the process */ signal (SIGCONT, SIG_DFL); kill (getpid(), SIGCONT); }
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); }