From: Ted Lemon Date: Sat, 29 Mar 1997 00:06:07 +0000 (+0000) Subject: Ignore EHOSTUNREACH and ECONNREFUSED errors on Linux (for now). X-Git-Tag: DHCP-970328~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5145810cfddb09d7b1c938cd1f34cb0149411309;p=thirdparty%2Fdhcp.git Ignore EHOSTUNREACH and ECONNREFUSED errors on Linux (for now). --- diff --git a/common/socket.c b/common/socket.c index 114630d9a..9a39f1aa1 100644 --- a/common/socket.c +++ b/common/socket.c @@ -50,7 +50,7 @@ #ifndef lint static char copyright[] = -"$Id: socket.c,v 1.21 1997/03/06 06:55:53 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n"; +"$Id: socket.c,v 1.22 1997/03/29 00:06:07 mellon Exp $ Copyright (c) 1995, 1996 The Internet Software Consortium. All rights reserved.\n"; #endif /* not lint */ #include "dhcpd.h" @@ -193,8 +193,20 @@ size_t send_packet (interface, packet, raw, len, from, to, hto) struct sockaddr_in *to; struct hardware *hto; { - return sendto (interface -> wfdesc, (char *)raw, len, 0, - (struct sockaddr *)to, sizeof *to); + int result; +#ifdef IGNORE_HOSTUNREACH + int retry = 0; + do { +#endif + result = sendto (interface -> wfdesc, (char *)raw, len, 0, + (struct sockaddr *)to, sizeof *to); +#ifdef IGNORE_HOSTUNREACH + } while (to.sin_addr.s_addr = htonl (INADDR_BROADCAST) && + result < 0 && + (errno == EHOSTUNREACH || + errno == ECONNREFUSED) && + retry++ < 10); +#endif } #endif /* USE_SOCKET_SEND */ @@ -207,9 +219,20 @@ size_t receive_packet (interface, buf, len, from, hfrom) struct hardware *hfrom; { int flen = sizeof *from; + int result; - return recvfrom (interface -> rfdesc, buf, len, 0, - (struct sockaddr *)from, &flen); +#ifdef IGNORE_HOSTUNREACH + int retry = 0; + do { +#endif + result = recvfrom (interface -> rfdesc, buf, len, 0, + (struct sockaddr *)from, &flen); +#ifdef IGNORE_HOSTUNREACH + } while (result < 0 && + (errno == EHOSTUNREACH || + errno == ECONNREFUSED) && + retry++ < 10); +#endif } #endif /* USE_SOCKET_RECEIVE */