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;
}
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;
}
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
#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
#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