Commit 32c4bef8 authored by Lennart Poettering's avatar Lennart Poettering
Browse files

util: temporarily ignore SIGHUP while we are issuing TIOCSTTY

parent 95ea1b90
...@@ -2387,6 +2387,7 @@ int acquire_terminal( ...@@ -2387,6 +2387,7 @@ int acquire_terminal(
int fd = -1, notify = -1, r, wd = -1; int fd = -1, notify = -1, r, wd = -1;
usec_t ts = 0; usec_t ts = 0;
struct sigaction sa_old, sa_new;
assert(name); assert(name);
...@@ -2434,17 +2435,26 @@ int acquire_terminal( ...@@ -2434,17 +2435,26 @@ int acquire_terminal(
if (fd < 0) if (fd < 0)
return fd; 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 */ /* 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 /* Sometimes it makes sense to ignore TIOCSCTTY
* returning EPERM, i.e. when very likely we already * returning EPERM, i.e. when very likely we already
* are have this controlling terminal. */ * are have this controlling terminal. */
if (r < 0 && errno == EPERM && ignore_tiocstty_eperm) if (r < 0 && r == -EPERM && ignore_tiocstty_eperm)
r = 0; r = 0;
if (r < 0 && (force || fail || errno != EPERM)) { if (r < 0 && (force || fail || r != -EPERM)) {
r = -errno;
goto fail; goto fail;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment