]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE12-deal-with-linux-EAGAIN-returns-when-receiving-20020731
authorJeffrey Hutzelman <jhutz@cmu.edu>
Wed, 31 Jul 2002 23:36:11 +0000 (23:36 +0000)
committerDerrick Brashear <shadow@dementia.org>
Wed, 31 Jul 2002 23:36:11 +0000 (23:36 +0000)
sometimes you get EAGAIN from recvfrom, apparently if a packet comes in with a
bad checksum for instance. we should deal better.

(cherry picked from commit 6c5439b80934cd6e3f0539a07874c3bda18d676d)

src/kauth/krb_udp.c
src/rx/rx_lwp.c
src/rx/rx_pthread.c

index 79dbf777dcc2bfe23e2e2039b6467985fa42d13c..2a432c70685fe0f25a9771357ca059d47c74e7c9 100644 (file)
@@ -778,6 +778,8 @@ static SocketListener ()
            code = recvfrom(sock_kerb, packet.data, sizeof(packet.data), 0,
                            (struct sockaddr *) &packet.from, &fromLen);
            if (code < 0) {
+               if (errno == EAGAIN || errno == ECONNREFUSED) 
+                   goto try_kerb5;
                perror ("calling recvfrom");
                break;
            }
@@ -792,10 +794,13 @@ static SocketListener ()
            packet.time = 0;
            process_udp_request (sock_kerb, &packet);
        } 
+try_kerb5:
        if ((sock_kerb5 >= 0) && FD_ISSET(sock_kerb5, &rfds)) {
            code = recvfrom(sock_kerb5, packet.data, sizeof(packet.data), 0,
                            (struct sockaddr *) &packet.from, &fromLen);
            if (code < 0) {
+               if (errno == EAGAIN || errno == ECONNREFUSED) 
+                   continue;
                perror ("calling recvfrom");
                break;
            }
@@ -811,6 +816,15 @@ static SocketListener ()
            process_udp_request (sock_kerb5, &packet);
        } 
     }
+    if (sock_kerb >= 0) {
+       close(sock_kerb);
+       sock_kerb = -1;
+    }
+    if (sock_kerb5 >= 0) {
+       close(sock_kerb5);
+       sock_kerb5 = -1;
+    }
+    printf("UDP SocketListener exiting due to error\n");
 }
 
 #if MAIN
index 2daed73527e8d04189c01f584c0421de917c72bd..0e6ffb557bb20925831992840825b68f027a6aee 100644 (file)
@@ -431,7 +431,9 @@ int rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags)
 #elif defined(AFS_LINUX22_ENV)
          /* linux unfortunately returns ECONNREFUSED if the target port
           * is no longer in use */
-       if (errno != EWOULDBLOCK && errno != ENOBUFS && errno != ECONNREFUSED)
+         /* and EAGAIN if a UDP checksum is incorrect */
+       if (errno != EWOULDBLOCK && errno != ENOBUFS &&
+           errno != ECONNREFUSED && errno != EAGAIN)
 #else
        if (errno != EWOULDBLOCK && errno != ENOBUFS)
 #endif
index a2b7297c99a0e7b1a13a416112fb6f61a7bc9649..295913f24dbc742528c005273ffd98ba8bc0dee7 100644 (file)
@@ -403,7 +403,8 @@ rxi_Sendmsg(socket, msg_p, flags)
 #ifdef AFS_LINUX22_ENV
     /* linux unfortunately returns ECONNREFUSED if the target port
      * is no longer in use */
-    if (ret == -1 && errno != ECONNREFUSED) {
+    /* and EAGAIN if a UDP checksum is incorrect */
+    if (ret == -1 && errno != ECONNREFUSED && errno != EAGAIN) {
 #else
     if (ret == -1) {
 #endif