signal(SIGHUP, fatal_sig_handler); signal(SIGINT, fatal_sig_handler); signal(SIGQUIT, fatal_sig_handler); signal(SIGILL, fatal_sig_handler); signal(SIGABRT, fatal_sig_handler); signal(SIGFPE, fatal_sig_handler); signal(SIGPIPE, fatal_sig_handler); signal(SIGALRM, fatal_sig_handler); signal(SIGTERM, fatal_sig_handler); signal(SIGSEGV, fatal_sig_handler); signal(SIGUSR1, fatal_sig_handler); signal(SIGUSR2, fatal_sig_handler);
putty_signal(SIGHUP, fatal_sig_handler); putty_signal(SIGINT, fatal_sig_handler); putty_signal(SIGQUIT, fatal_sig_handler); putty_signal(SIGILL, fatal_sig_handler); putty_signal(SIGABRT, fatal_sig_handler); putty_signal(SIGFPE, fatal_sig_handler); putty_signal(SIGPIPE, fatal_sig_handler); putty_signal(SIGALRM, fatal_sig_handler); putty_signal(SIGTERM, fatal_sig_handler); putty_signal(SIGSEGV, fatal_sig_handler); putty_signal(SIGUSR1, fatal_sig_handler); putty_signal(SIGUSR2, fatal_sig_handler);
void pty_pre_init(void){    pid_t pid;    int pipefd[2];    pty_master_fd = -1;    if (geteuid() != getuid() || getegid() != getgid()) {	pty_open_master();    }#ifndef OMIT_UTMP    /*     * Fork off the utmp helper.     */    if (pipe(pipefd) < 0) {	perror("pterm: pipe");	exit(1);    }    pid = fork();    if (pid < 0) {	perror("pterm: fork");	exit(1);    } else if (pid == 0) {	char display[128], buffer[128];	int dlen, ret;	close(pipefd[1]);	/*	 * Now sit here until we receive a display name from the	 * other end of the pipe, and then stamp utmp. Unstamp utmp	 * again, and exit, when the pipe closes.	 */	dlen = 0;	while (1) {	    	    ret = read(pipefd[0], buffer, lenof(buffer));	    if (ret <= 0) {		cleanup_utmp();		exit(0);	    } else if (!pty_stamped_utmp) {		if (dlen < lenof(display))		    memcpy(display+dlen, buffer,			   min(ret, lenof(display)-dlen));		if (buffer[ret-1] == '\0') {		    /*		     * Now we have a display name. NUL-terminate		     * it, and stamp utmp.		     */		    display[lenof(display)-1] = '\0';		    /*		     * Trap as many fatal signals as we can in the		     * hope of having the best possible chance to		     * clean up utmp before termination. We are		     * unfortunately unprotected against SIGKILL,		     * but that's life.		     */		    signal(SIGHUP, fatal_sig_handler);		    signal(SIGINT, fatal_sig_handler);		    signal(SIGQUIT, fatal_sig_handler);		    signal(SIGILL, fatal_sig_handler);		    signal(SIGABRT, fatal_sig_handler);		    signal(SIGFPE, fatal_sig_handler);		    signal(SIGPIPE, fatal_sig_handler);		    signal(SIGALRM, fatal_sig_handler);		    signal(SIGTERM, fatal_sig_handler);		    signal(SIGSEGV, fatal_sig_handler);		    signal(SIGUSR1, fatal_sig_handler);		    signal(SIGUSR2, fatal_sig_handler);#ifdef SIGBUS		    signal(SIGBUS, fatal_sig_handler);#endif#ifdef SIGPOLL		    signal(SIGPOLL, fatal_sig_handler);#endif#ifdef SIGPROF		    signal(SIGPROF, fatal_sig_handler);#endif#ifdef SIGSYS		    signal(SIGSYS, fatal_sig_handler);#endif#ifdef SIGTRAP		    signal(SIGTRAP, fatal_sig_handler);#endif#ifdef SIGVTALRM		    signal(SIGVTALRM, fatal_sig_handler);#endif#ifdef SIGXCPU		    signal(SIGXCPU, fatal_sig_handler);#endif#ifdef SIGXFSZ		    signal(SIGXFSZ, fatal_sig_handler);#endif#ifdef SIGIO		    signal(SIGIO, fatal_sig_handler);#endif		    /* Also clean up utmp on normal exit. */		    atexit(cleanup_utmp);		    setup_utmp(pty_name, display);		}	    }	}    } else {	close(pipefd[0]);	pty_utmp_helper_pid = pid;	pty_utmp_helper_pipe = pipefd[1];	signal(SIGCHLD, sigchld_handler);    }#endif    /* Drop privs. */    {	int gid = getgid(), uid = getuid();#ifndef HAVE_NO_SETRESUID	int setresgid(gid_t, gid_t, gid_t);	int setresuid(uid_t, uid_t, uid_t);	setresgid(gid, gid, gid);	setresuid(uid, uid, uid);#else	setgid(getgid());	setuid(getuid());#endif    }}