struct ul_pty_callbacks *ul_pty_get_callbacks(struct ul_pty *pty);
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);
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);
int ul_pty_setup(struct ul_pty *pty)
{
struct termios attrs;
- sigset_t ourset;
int rc = 0;
assert(pty->sigfd == -1);
- /* save the current signals setting */
+ /* save the current signals setting (to make ul_pty_cleanup() usable,
+ * otherwise see ul_pty_signals_setup() */
sigprocmask(0, NULL, &pty->orgsig);
if (pty->isterm) {
fcntl(pty->master, F_SETFL, O_NONBLOCK);
+done:
+ if (rc)
+ ul_pty_cleanup(pty);
+
+ DBG(SETUP, ul_debugobj(pty, "pty setup done [master=%d, slave=%d, rc=%d]",
+ pty->master, pty->slave, rc));
+ return rc;
+}
+
+/* call me before fork() */
+int ul_pty_signals_setup(struct ul_pty *pty)
+{
+ sigset_t ourset;
+ int rc = 0;
+
+ assert(pty->sigfd == -1);
+
+ /* save the current signals setting */
+ sigprocmask(0, NULL, &pty->orgsig);
+
sigfillset(&ourset);
if (sigprocmask(SIG_BLOCK, &ourset, NULL)) {
rc = -errno;
if (rc)
ul_pty_cleanup(pty);
- DBG(SETUP, ul_debugobj(pty, "pty setup done [master=%d, slave=%d, rc=%d]",
- pty->master, pty->slave, rc));
+ DBG(SETUP, ul_debugobj(pty, "pty signals setup done [rc=%d]", rc));
return rc;
}
if (ul_pty_setup(pty))
err(EXIT_FAILURE, "failed to create pseudo-terminal");
+ if (ul_pty_signals_setup(pty))
+ err(EXIT_FAILURE, "failed to initialize signals handler");
fflush(stdout); /* ??? */