From 32c4bef8826f1231984d735944cb02a01d21177a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 13 Jul 2012 13:55:35 +0200 Subject: util: temporarily ignore SIGHUP while we are issuing TIOCSTTY --- src/shared/util.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/shared/util.c b/src/shared/util.c index 2aabd8d634..845b4bf824 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -2387,6 +2387,7 @@ int acquire_terminal( int fd = -1, notify = -1, r, wd = -1; usec_t ts = 0; + struct sigaction sa_old, sa_new; assert(name); @@ -2434,17 +2435,26 @@ int acquire_terminal( if (fd < 0) return fd; + /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed + * if we already own the tty. */ + zero(sa_new); + sa_new.sa_handler = SIG_IGN; + sa_new.sa_flags = SA_RESTART; + assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0); + /* First, try to get the tty */ - r = ioctl(fd, TIOCSCTTY, force); + if (ioctl(fd, TIOCSCTTY, force) < 0) + r = -errno; + + assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0); /* Sometimes it makes sense to ignore TIOCSCTTY * returning EPERM, i.e. when very likely we already * are have this controlling terminal. */ - if (r < 0 && errno == EPERM && ignore_tiocstty_eperm) + if (r < 0 && r == -EPERM && ignore_tiocstty_eperm) r = 0; - if (r < 0 && (force || fail || errno != EPERM)) { - r = -errno; + if (r < 0 && (force || fail || r != -EPERM)) { goto fail; } -- cgit v1.2.3-54-g00ecf