changeset 40:1f5ee194cacf draft

Fix arp checking linux-2.6.19 headers NOW don't work with c99 which is just wrong, so dhcpcd no longer builds against these kernel headers. You get a nice error though :)
author Roy Marples <roy@marples.name>
date Thu, 21 Dec 2006 16:51:16 +0000
parents 646f65220304
children b3ed04340ded
files ChangeLog Makefile arp.c client.c dhcp.c interface.c
diffstat 6 files changed, 33 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Dec 19 10:06:45 2006 +0000
+++ b/ChangeLog	Thu Dec 21 16:51:16 2006 +0000
@@ -1,3 +1,8 @@
+Fix arp checking
+linux-2.6.19 headers NOW don't work with c99 which is just wrong, so
+dhcpcd no longer builds against these kernel headers. You get a nice
+error though :)
+
 dhcpcd-3.0.7
 Allow Linux to use Token Ring again as Linux does not have any more hardware
 specific code. BPF needs a patch for Token Ring support.
--- a/Makefile	Tue Dec 19 10:06:45 2006 +0000
+++ b/Makefile	Thu Dec 21 16:51:16 2006 +0000
@@ -1,6 +1,6 @@
 # Should work for both GNU make and BSD make
 
-VERSION = 3.0.7
+VERSION = 3.0.8_pre1
 
 INSTALL ?= install
 
--- a/arp.c	Tue Dec 19 10:06:45 2006 +0000
+++ b/arp.c	Thu Dec 21 16:51:16 2006 +0000
@@ -121,16 +121,20 @@
 	{
 	  union
 	  {
-	    unsigned char buffer[sizeof (struct arphdr)];
+	    unsigned char buffer[buflen];
 	    struct arphdr hdr;
 	  } reply;
 	  union
 	  {
 	    unsigned char *c;
-	    struct in_addr a;
-	  } ra;
-
-	  memset (reply.buffer, 0, sizeof (struct arphdr));
+	    struct in_addr *a;
+	  } rp;
+	  union
+	  {
+	    unsigned char *c;
+	    struct ether_addr *a;
+	  } rh;
+	  memset (reply.buffer, 0, sizeof (reply.buffer));
 	  if ((bytes = get_packet (iface, reply.buffer, arp.buffer,
 				   &buflen, &bufpos)) < 0)
 	    break;
@@ -151,10 +155,10 @@
 	  if ((unsigned) bytes < sizeof (reply.hdr) + 2 * (4 + reply.hdr.ar_hln))
 	    continue;
 
-	  ra.c = (unsigned char *) ar_spa (&reply.hdr);
+	  rp.c = (unsigned char *) ar_spa (&reply.hdr);
+	  rh.c = (unsigned char *) ar_sha (&reply.hdr);
 	  logger (LOG_ERR, "ARPOP_REPLY received from %s (%s)",
-		  inet_ntoa (ra.a),
-		  ether_ntoa ((struct ether_addr *) ar_sha (&reply.hdr)));
+		  inet_ntoa (*rp.a), ether_ntoa (rh.a));
 	  close (iface->fd);
 	  iface->fd = -1;
 	  return 1;
--- a/client.c	Tue Dec 19 10:06:45 2006 +0000
+++ b/client.c	Thu Dec 21 16:51:16 2006 +0000
@@ -464,15 +464,19 @@
 			  SOCKET_MODE (SOCKET_OPEN);
 			  SEND_MESSAGE (DHCP_DECLINE);
 			  SOCKET_MODE (SOCKET_CLOSED);
+
 			  free_dhcp (dhcp);
-			  memset (dhcp, 0, sizeof (dhcp));
+			  memset (dhcp, 0, sizeof (dhcp_t));
+ 
 			  if (daemonised)
 			    configure (options, iface, dhcp);
 
 			  xid = 0;
+			  timeout = 0;
 			  state = STATE_INIT;
 			  /* RFC 2131 says that we should wait for 10 seconds
 			     before doing anything else */
+			  logger (LOG_INFO, "sleeping for 10 seconds");
 			  sleep (10);
 			  continue;
 			}
--- a/dhcp.c	Tue Dec 19 10:06:45 2006 +0000
+++ b/dhcp.c	Thu Dec 21 16:51:16 2006 +0000
@@ -253,7 +253,7 @@
   make_dhcp_packet (&packet, (unsigned char *) &message, message_length,
 		    from, to);
 
-  logger (LOG_DEBUG, "Sending %s with xid %d", dhcp_message[(int) type], xid);
+  logger (LOG_DEBUG, "sending %s with xid %d", dhcp_message[(int) type], xid);
   return send_packet (iface, ETHERTYPE_IP, (unsigned char *) &packet,
 		      message_length + sizeof (struct ip) +
 		      sizeof (struct udphdr));
@@ -409,7 +409,7 @@
 
 void free_dhcp (dhcp_t *dhcp)
 {
-  if (!dhcp)
+  if (! dhcp)
     return;
 
   if (dhcp->routes)
--- a/interface.c	Tue Dec 19 10:06:45 2006 +0000
+++ b/interface.c	Thu Dec 21 16:51:16 2006 +0000
@@ -26,14 +26,18 @@
 
 #include <arpa/inet.h>
 
-/* Netlink suff */
+/* Check linux version before including headers which break us */
 #ifdef __linux__ 
-#include <asm/types.h> /* Needed for 2.4 kernels */
 #include <features.h>
 #include <linux/version.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION (2,6,19)
-#include <linux/if_addr.h>
+#if LINUX_VERSION_CODE == KERNEL_VERSION (2,6,19)
+#error "linux 2.6.19 headers are so badly broken, use something else"
+#endif
 #endif
+
+/* Netlink suff */
+#ifdef __linux__
+#include <asm/types.h> /* Needed for 2.4 kernels */
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
 #include <netinet/ether.h>