]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Fixed RT 938 having to do with SIOCGIFCONF on Linux. We now do a first
authorBen Cottrell <source@isc.org>
Sat, 17 Mar 2001 02:11:29 +0000 (02:11 +0000)
committerBen Cottrell <source@isc.org>
Sat, 17 Mar 2001 02:11:29 +0000 (02:11 +0000)
pass in which we pass a null pointer for the buffer, and we will get
back the length of the buffer we should allocate. This is because
if you pass in a buffer that is too small, Linux (unlike other OSes)
will not tell you that it is too small by returning a length greater
than the length you passed in.

common/discover.c
includes/cf/linux.h

index 89ca6ad8c198f8cc3501b3757e930444251e38c2..be533e3e749df1416bbc8272992a6ebcc7ca7137 100644 (file)
@@ -43,7 +43,7 @@
 
 #ifndef lint
 static char copyright[] =
-"$Id: discover.c,v 1.38 2001/02/17 21:16:44 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium.  All rights reserved.\n";
+"$Id: discover.c,v 1.39 2001/03/17 02:11:27 tamino Exp $ Copyright (c) 1995-2000 The Internet Software Consortium.  All rights reserved.\n";
 #endif /* not lint */
 
 #include "dhcpd.h"
@@ -157,8 +157,38 @@ void discover_interfaces (state)
                log_fatal ("Can't create addrlist socket");
 
        /* Get the interface configuration information... */
+
+#ifdef SIOCGIFCONF_NULL_BUF_GIVES_CORRECT_LEN
+
+       /* linux will only tell us how long a buffer it wants if we give it
+        * a null buffer first. So, do a dry run to figure out the length.
+        * 
+        * XXX this code is duplicated from below because trying to fold
+        * the logic into the if statement and goto resulted in excesssive
+        * obfuscation. The intent is that unless you run Linux you shouldn't
+        * have to deal with this. */
+
+       ic.ifc_len = 0;
+       ic.ifc_ifcu.ifcu_buf = (caddr_t)NULL;
+
+       i = ioctl(sock, SIOCGIFCONF, &ic);
+       if (i < 0)
+               log_fatal ("ioctl: SIOCGIFCONF: %m");
+
+       ic.ifc_ifcu.ifcu_buf = dmalloc ((size_t)ic.ifc_len, MDL);
+       if (!ic.ifc_ifcu.ifcu_buf)
+               log_fatal ("Can't allocate SIOCGIFCONF buffer.");
+
+#else /* SIOCGIFCONF_NULL_BUF_GIVES_CORRECT_LEN */
+
+       /* otherwise, we just feed it a starting size, and it'll tell us if
+        * it needs more */
+
        ic.ifc_len = sizeof buf;
        ic.ifc_ifcu.ifcu_buf = (caddr_t)buf;
+
+#endif /* SIOCGIFCONF_NULL_BUF_GIVES_CORRECT_LEN */
+
       gifconf_again:
        i = ioctl(sock, SIOCGIFCONF, &ic);
 
index a01401e07dc95e355bc94e01480f2f53d7b89bdb..bdc0de6af75bfcaecb83da70ee2fa2d579841c69 100644 (file)
@@ -151,6 +151,7 @@ extern int h_errno;
 
 #define ALIAS_NAMES_PERMUTED
 #define SKIP_DUMMY_INTERFACES
+#define SIOCGIFCONF_NULL_BUF_GIVES_CORRECT_LEN
 
 #ifdef NEED_PRAND_CONF
 #ifndef HAVE_DEV_RANDOM