chiark / gitweb /
util: when releasing terminal, temporarily disable SIGHUP
authorLennart Poettering <lennart@poettering.net>
Sat, 24 Apr 2010 00:32:07 +0000 (02:32 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 24 Apr 2010 00:32:07 +0000 (02:32 +0200)
util.c

diff --git a/util.c b/util.c
index 9d99fefe78b8ce5e373e52e91084988d8c938893..8556ea12cd153d6899f3b98a8cc803e80b61f401 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1677,13 +1677,24 @@ fail:
 
 int release_terminal(void) {
         int r = 0, fd;
+        struct sigaction sa_old, sa_new;
 
-        if ((fd = open("/dev/tty", O_RDWR)) < 0)
+        if ((fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_NDELAY)) < 0)
                 return -errno;
 
+        /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
+         * by our own TIOCNOTTY */
+
+        zero(sa_new);
+        sa_new.sa_handler = SIG_IGN;
+        sa_new.sa_flags = SA_RESTART;
+        assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
+
         if (ioctl(fd, TIOCNOTTY) < 0)
                 r = -errno;
 
+        assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0);
+
         close_nointr_nofail(fd);
         return r;
 }