]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Unix IO: Tried to fix strange behavior after POLLHUP or POLLERR.
authorJan Moskyto Matejka <mq@ucw.cz>
Mon, 30 May 2016 12:28:22 +0000 (14:28 +0200)
committerJan Moskyto Matejka <mq@ucw.cz>
Mon, 30 May 2016 12:28:22 +0000 (14:28 +0200)
sysdep/unix/io.c

index 486319ff50ebe0b57b2846fe9271c5211c37aaf8..8198743dc91457d5eb5d48362444dd02e5fa6993 100644 (file)
@@ -1853,6 +1853,20 @@ sk_write(sock *s)
   }
 }
 
+void
+sk_err(sock *s, int revents)
+{
+  int se = 0, sse = sizeof(se);
+  if (revents & POLLERR)
+    if (getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &se, &sse) < 0)
+    {
+      log(L_ERR "IO: Socket error: SO_ERROR: %m");
+      se = 0;
+    }
+
+  s->err_hook(s, se);
+}
+
 void
 sk_dump_all(void)
 {
@@ -2163,7 +2177,7 @@ io_loop(void)
              int steps;
 
              steps = MAX_STEPS;
-             if (s->fast_rx && (pfd[s->index].revents & (POLLIN | POLLHUP | POLLERR)) && s->rx_hook)
+             if (s->fast_rx && (pfd[s->index].revents & POLLIN) && s->rx_hook)
                do
                  {
                    steps--;
@@ -2185,6 +2199,7 @@ io_loop(void)
                      goto next;
                  }
                while (e && steps);
+
              current_sock = sk_next(s);
            next: ;
            }
@@ -2208,18 +2223,26 @@ io_loop(void)
                  goto next2;
                }
 
-             if (!s->fast_rx && (pfd[s->index].revents & (POLLIN | POLLHUP | POLLERR)) && s->rx_hook)
+             if (!s->fast_rx && (pfd[s->index].revents & POLLIN) && s->rx_hook)
                {
                  count++;
                  io_log_event(s->rx_hook, s->data);
                  sk_read(s, pfd[s->index].revents);
                  if (s != current_sock)
-                     goto next2;
+                   goto next2;
+               }
+
+             if (pfd[s->index].revents & (POLLHUP | POLLERR))
+               {
+                 sk_err(s, pfd[s->index].revents);
+                   goto next2;
                }
+
              current_sock = sk_next(s);
            next2: ;
            }
 
+
          stored_sock = current_sock;
        }
     }