]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Ignore EHOSTUNREACH and ECONNREFUSED errors on Linux (for now).
authorTed Lemon <source@isc.org>
Sat, 29 Mar 1997 00:06:07 +0000 (00:06 +0000)
committerTed Lemon <source@isc.org>
Sat, 29 Mar 1997 00:06:07 +0000 (00:06 +0000)
common/socket.c

index 114630d9a562145cdb208e0e51c16569369c8241..9a39f1aa11d4cba334bf0b419ed03716502da736 100644 (file)
@@ -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 */