chiark / gitweb /
util: retry opening a TTY on EIO
authorLennart Poettering <lennart@poettering.net>
Thu, 17 Feb 2011 15:29:47 +0000 (16:29 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 17 Feb 2011 15:29:49 +0000 (16:29 +0100)
https://bugs.freedesktop.org/show_bug.cgi?id=33996
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/554172/comments/245

src/util.c

index 92268b69a95e4bd560102520f0d03a99842d6886..b8e73ef4bf44a4380129796bcce5c1302c3e46ba 100644 (file)
@@ -2134,8 +2134,32 @@ finish:
 
 int open_terminal(const char *name, int mode) {
         int fd, r;
 
 int open_terminal(const char *name, int mode) {
         int fd, r;
+        unsigned c = 0;
 
 
-        if ((fd = open(name, mode)) < 0)
+        /*
+         * If a TTY is in the process of being closed opening it might
+         * cause EIO. This is horribly awful, but unlikely to be
+         * changed in the kernel. Hence we work around this problem by
+         * retrying a couple of times.
+         *
+         * https://bugs.launchpad.net/ubuntu/+source/linux/+bug/554172/comments/245
+         */
+
+        for (;;) {
+                if ((fd = open(name, mode)) >= 0)
+                        break;
+
+                if (errno != EIO)
+                        return -errno;
+
+                if (c >= 20)
+                        return -errno;
+
+                usleep(50 * USEC_PER_MSEC);
+                c++;
+        }
+
+        if (fd < 0)
                 return -errno;
 
         if ((r = isatty(fd)) < 0) {
                 return -errno;
 
         if ((r = isatty(fd)) < 0) {