mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-09-01 23:05:29 +00:00
Fixed RT 938 having to do with SIOCGIFCONF on Linux. We now do a first
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.
This commit is contained in:
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char copyright[] =
|
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 */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include "dhcpd.h"
|
#include "dhcpd.h"
|
||||||
@@ -157,8 +157,38 @@ void discover_interfaces (state)
|
|||||||
log_fatal ("Can't create addrlist socket");
|
log_fatal ("Can't create addrlist socket");
|
||||||
|
|
||||||
/* Get the interface configuration information... */
|
/* 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_len = sizeof buf;
|
||||||
ic.ifc_ifcu.ifcu_buf = (caddr_t)buf;
|
ic.ifc_ifcu.ifcu_buf = (caddr_t)buf;
|
||||||
|
|
||||||
|
#endif /* SIOCGIFCONF_NULL_BUF_GIVES_CORRECT_LEN */
|
||||||
|
|
||||||
gifconf_again:
|
gifconf_again:
|
||||||
i = ioctl(sock, SIOCGIFCONF, &ic);
|
i = ioctl(sock, SIOCGIFCONF, &ic);
|
||||||
|
|
||||||
|
@@ -151,6 +151,7 @@ extern int h_errno;
|
|||||||
|
|
||||||
#define ALIAS_NAMES_PERMUTED
|
#define ALIAS_NAMES_PERMUTED
|
||||||
#define SKIP_DUMMY_INTERFACES
|
#define SKIP_DUMMY_INTERFACES
|
||||||
|
#define SIOCGIFCONF_NULL_BUF_GIVES_CORRECT_LEN
|
||||||
|
|
||||||
#ifdef NEED_PRAND_CONF
|
#ifdef NEED_PRAND_CONF
|
||||||
#ifndef HAVE_DEV_RANDOM
|
#ifndef HAVE_DEV_RANDOM
|
||||||
|
Reference in New Issue
Block a user