]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
EAGAIN is not a socket error we care about.
authorAlan T. DeKok <aland@freeradius.org>
Thu, 9 Nov 2017 18:29:49 +0000 (13:29 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 9 Nov 2017 18:31:55 +0000 (13:31 -0500)
src/lib/util/udp.c

index 6d9d8b45d0b50a2874ea0ec7f5e0a2a76c823695..dd2e562bbe5230c61b9b7ae2c68c525730c16fb6 100644 (file)
@@ -190,7 +190,10 @@ ssize_t udp_recv(int sockfd, void *data, size_t data_len, int flags,
        /*
         *      Connected sockets already know src/dst IP/port
         */
-       if ((flags & UDP_FLAGS_CONNECTED) != 0) return recv(sockfd, data, data_len, sock_flags);
+       if ((flags & UDP_FLAGS_CONNECTED) != 0) {
+               received = recv(sockfd, data, data_len, sock_flags);
+               goto done;
+       }
 
        if (when) {
                when->tv_sec = 0;
@@ -225,10 +228,6 @@ ssize_t udp_recv(int sockfd, void *data, size_t data_len, int flags,
        if (if_index) *if_index = 0;
 #endif
 
-       if (received < 0) {
-               fr_strerror_printf("Failed reading socket: %s", fr_syserror(errno));
-               return received;
-       }
 
        if (fr_ipaddr_from_sockaddr(&src, sizeof_src, src_ipaddr, &port) < 0) {
                fr_strerror_printf("Failed converting sockaddr to ipaddr");
@@ -237,12 +236,20 @@ ssize_t udp_recv(int sockfd, void *data, size_t data_len, int flags,
 
        *src_port = port;
 
-       if (when && !when->tv_sec) gettimeofday(when, NULL);
-
        if (dst_ipaddr) {
                fr_ipaddr_from_sockaddr(&dst, sizeof_dst, dst_ipaddr, &port);
                *dst_port = port;
        }
 
+done:
+       if (received < 0) {
+               if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) return 0;
+
+               fr_strerror_printf("Failed reading socket: %s", fr_syserror(errno));
+               return received;
+       }
+
+       if (when && !when->tv_sec) gettimeofday(when, NULL);
+
        return received;
 }