X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=845b4bf8241cf427678dc0d576bbc5bf97431c1c;hp=2aabd8d6346df41de2419754c4b56f56abd71979;hb=32c4bef8826f1231984d735944cb02a01d21177a;hpb=95ea1b90cc61f464f3b9bc147119dee4ba9620b8;ds=sidebyside diff --git a/src/shared/util.c b/src/shared/util.c index 2aabd8d63..845b4bf82 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; }