int ul_pty_is_running(struct ul_pty *pty);
int ul_pty_setup(struct ul_pty *pty);
int ul_pty_signals_setup(struct ul_pty *pty);
+int ul_pty_terminal_setup(struct ul_pty *pty);
void ul_pty_cleanup(struct ul_pty *pty);
int ul_pty_chownmod_slave(struct ul_pty *pty, uid_t uid, gid_t gid, mode_t mode);
void ul_pty_init_slave(struct ul_pty *pty);
if (rc)
goto done;
- /* set the current terminal to raw mode; pty_cleanup() reverses this change on exit */
- cfmakeraw(&attrs);
- tcsetattr(STDIN_FILENO, TCSANOW, &attrs);
} else {
DBG_OBJ(SETUP, pty, ul_debug("create for non-terminal"));
return rc;
}
+/* call me after ul_pty_signals_setup() and before fork() */
+int ul_pty_terminal_setup(struct ul_pty *pty)
+{
+ struct termios attrs;
+
+ if (!pty->isterm)
+ return 0;
+
+ attrs = pty->stdin_attrs;
+ cfmakeraw(&attrs);
+ if (tcsetattr(STDIN_FILENO, TCSANOW, &attrs))
+ return -errno;
+
+ DBG_OBJ(SETUP, pty, ul_debug("terminal raw mode setup done"));
+ return 0;
+}
+
/* call me before fork() */
int ul_pty_signals_setup(struct ul_pty *pty)
{
err(EXIT_FAILURE, "failed to create pseudo-terminal");
if (ul_pty_signals_setup(pty))
err(EXIT_FAILURE, "failed to initialize signals handler");
+ if (ul_pty_terminal_setup(pty))
+ err(EXIT_FAILURE, "failed to setup terminal");
fflush(stdout); /* ??? */
supam_cleanup(su, PAM_ABORT);
err(EXIT_FAILURE, _("failed to initialize signals handler"));
}
+ if (ul_pty_terminal_setup(su->pty)) {
+ supam_cleanup(su, PAM_ABORT);
+ err(EXIT_FAILURE, _("failed to setup terminal"));
+ }
}
#endif
fflush(stdout); /* ??? */
if (ul_pty_signals_setup(ctl.pty))
err(EXIT_FAILURE, _("failed to initialize signals handler"));
+ if (ul_pty_terminal_setup(ctl.pty))
+ err(EXIT_FAILURE, _("failed to setup terminal"));
fflush(stdout);
/*
err(EXIT_FAILURE, _("failed to create pseudo-terminal"));
if (ul_pty_signals_setup(ss.pty))
err(EXIT_FAILURE, _("failed to initialize signals handler"));
+ if (ul_pty_terminal_setup(ss.pty))
+ err(EXIT_FAILURE, _("failed to setup terminal"));
fflush(stdout); /* ??? */