Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
b29f38b
Fix bounds checking in check_ia()
simonkelley Jul 5, 2025
f9d82e4
Update dnsmasq version
DL6ER Dec 13, 2025
34eb0bc
Tidy up code in in do_tcp_connection() which filters incoming connect…
simonkelley Dec 5, 2025
546cacb
Prepare for next patch
DL6ER Jan 19, 2026
bd4f8af
Terminate TCP child processes that arise from UDP truncated replies.
simonkelley Dec 6, 2025
aa95eb6
Reimplement necessary Pi-hole changes
DL6ER Jan 19, 2026
898ff36
Fix a corner-case in DNSSEC validation with wildcards.
simonkelley Jan 12, 2026
d899a20
Support Inotify in FreeBSD.
mandree Jan 14, 2026
456e24e
Fix DNSSEC failure with spurious RRSIGs.
simonkelley Jan 15, 2026
92d0ae8
The only_failed argument has been added to the log-queries parameter.
PVBozhko Dec 19, 2025
a72e626
Log SERVFAIL from usptream servers.
simonkelley Jan 18, 2026
707bc2d
Fix DNSSEC fail with CNAME replies to DS queries.
simonkelley Jan 18, 2026
cc286de
Update embedded dnsmasq version to 2.93test1
DL6ER Jan 19, 2026
350f2b0
Update expected dnsmasq warnings
DL6ER Jan 27, 2026
bb8207b
Fix memory allocation in blockdata_retrieve()
simonkelley Jan 24, 2026
3c42f53
Add --log-malloc debugging option.
simonkelley Jan 24, 2026
b36cbec
Don't log free(NULL) calls.
simonkelley Jan 24, 2026
ace64db
Don't start malloc() logging until the log system is configured.
simonkelley Jan 24, 2026
34c01e1
Rationalise DNS TCP buffer use.
simonkelley Jan 26, 2026
0456c8e
Optimise TCP send.
simonkelley Jan 26, 2026
f08d1dd
Update embedded dnsmasq to v2.93test2
DL6ER Jan 28, 2026
a7cede6
Prevent macro leakage into system headers: document and guard push/po…
DL6ER Jan 28, 2026
a680941
Remove DHCPv6 UseMulticast option code.
simonkelley Jan 31, 2026
5d8dfd7
Tidy up check for muticast DHCPv6 requests.
simonkelley Jan 31, 2026
269c57b
Tidy up memory allocation in read_event()
simonkelley Jan 31, 2026
2b0d909
base32_decode: avoid shifting into the sign bit
mandree Jan 31, 2026
37bd6c5
Avoid uninitialized-value warnings from the compiler
mandree Jan 31, 2026
9dd5f0b
read_writev: avoid reading past the last iovec elem
mandree Jan 31, 2026
9113bbf
Fix compiler warning.
simonkelley Feb 1, 2026
ebb859d
Rewrite blockdata_retrieve() and expand_buf() to use realloc().
simonkelley Feb 1, 2026
cbf4666
Update embedded dnsmasq version to v2.93test3
DL6ER Feb 2, 2026
87e8480
Enhance --log-malloc
simonkelley Feb 3, 2026
b8ad9b3
Improve memory allocation for /etc/hosts etc.
simonkelley Feb 5, 2026
7e5ac70
treat opt_malloc as a wrapper for logging purposes.
simonkelley Feb 5, 2026
8b6ad15
Fix PXE boot server (PXEBS) responses broken in 2.92
claytono Feb 5, 2026
2d563e1
Convert hash_init() to use realloc().
simonkelley Feb 6, 2026
f0f0feb
Update embedded dnsmasq to v2.93test4
DL6ER Feb 14, 2026
e333c95
Log memory allocated by libidn when --log-malloc active.
simonkelley Feb 13, 2026
eca40c5
Remove duplicate configured trust anchors.
simonkelley Feb 16, 2026
fac3a2a
Fix broken NS responses in certain auth-zone configurations.
erbth Feb 26, 2026
ee09c81
Fix crash with empty DHCP SNAME option.
simonkelley Feb 26, 2026
a1ff716
Modify the inotify implementation so that inotify watches are only cr…
simonkelley Feb 28, 2026
8622514
Fix FTBFS with nettle 4.0.
simonkelley Mar 1, 2026
a034611
Fix missed hash->digest calls in 4070a74862c3c956a676d2b931ff186e14f5…
simonkelley Mar 1, 2026
6485254
Update dnsmasq tag
DL6ER Mar 1, 2026
f70ff5a
Make FTL nettle v4.0 compatible
DL6ER Mar 2, 2026
1b43af9
Fix TCP replies being broken. THis fixes a regression of 13e120b29b7c…
DL6ER Mar 3, 2026
ed8e049
Tweak zone update testing script
DL6ER Mar 3, 2026
c1cd013
Improve zone testing script
DL6ER Mar 5, 2026
3c6e244
Fix regression handling non-QUERY requests over TCP.
simonkelley Mar 8, 2026
b90bd2e
Don't call qsort() with a NULL array when no servers defined.
simonkelley Mar 10, 2026
1f85ef2
Tighten length checking to avoid possible buffer read-overrun in DHCPv6.
simonkelley Mar 10, 2026
caab737
Complete 32a54fc8a5b7fee715b963f6e5b28f41289e6a4f
simonkelley Mar 15, 2026
0038e89
Update embedded dnsmasq version
DL6ER Mar 17, 2026
73548bd
Update zone update test script
DL6ER Mar 17, 2026
c8f1e1c
Fix broken DHCPv6 vendorclass data in DHCP script.
simonkelley Mar 17, 2026
5811f5e
Accept DHCPv6 vendorclasses with any enterprise number in --dhcp-vend…
simonkelley Mar 17, 2026
fc1bcdb
Fix broken DHCPv6 userclass data in DHCP script.
simonkelley Mar 17, 2026
2c40dd7
New heuristic for disabling DNSSEC for domain-specific nameservers.
simonkelley Mar 24, 2026
a0be547
Further tidying of DHCPv6 packet dissection code.
simonkelley Mar 24, 2026
41d855a
Update dnsmasq tag fo 2.93test8
DL6ER Mar 26, 2026
816f627
Move logging on TCP timeout from child process to main process.
simonkelley Mar 30, 2026
37f3f9e
Tighten check on TFTP pathnames to avoid directory escape.
simonkelley Mar 30, 2026
7e87df2
OOB buffer check with DNS bitstring labels.
simonkelley Mar 30, 2026
3970e70
Sanity checking on DNS replies via TCP.
simonkelley Apr 5, 2026
2b77ae7
Check DNS query via TCP doesn't have QR bit set.
simonkelley Apr 5, 2026
28d7511
Fix 1-byte buffer overflow in relay_reply4()
simonkelley Apr 6, 2026
47957b9
Update dnsmasq version to v2.93test9
DL6ER Apr 7, 2026
6137681
Bump copyrights to 2026.
simonkelley Apr 8, 2026
f08e913
Tweak DHCPv6 replay decapsulation.
simonkelley Apr 10, 2026
9a72d8d
Fix crash with mal-formed config option.
Toliak Apr 21, 2026
135ab75
Fix buffer overlow in log_query()
simonkelley Apr 21, 2026
ce5a896
Preserve existing log file permissions when adding group-write bit.
ralt Apr 21, 2026
a8819db
Fix memory leak reading ARP cache on *BSD.
simonkelley May 4, 2026
7d63856
Add support for IPV6 when reading ARP/ND table on *BSD.
sagie-d May 9, 2026
8d0a921
Fix OOB read when parsing DHCPv6 userclass or vendorclass options.
simonkelley May 10, 2026
eb4090d
Fix OOB read/write of rr_status.
simonkelley May 10, 2026
2167247
fix: zero correct byte count in expand_workspace_real()
DL6ER Mar 19, 2026
9fabcd4
fix: move fd-match guard out of loop in reply_query()
DL6ER Mar 19, 2026
8f035d1
fix: rand64() must share global outleft with rand16()/rand32()
DL6ER Mar 19, 2026
a77d8f9
fix: NUL-terminate buf in prettyprint_time() when t == 0
DL6ER Mar 19, 2026
e886e24
helper: fix OOB read in grab_extradata_lua bounds check
DL6ER Mar 19, 2026
5af6962
rfc2131: fix off-by-one in BOOTP filename netid NUL termination
DL6ER Mar 19, 2026
f50fe7a
dhcp-common: bounds-check label index before reading in OT_RFC1035_NA…
DL6ER Mar 19, 2026
f47243d
dhcp-common: fix OOB reads in DHCPv6 option_string() decoders
DL6ER Mar 19, 2026
abdfb23
rfc3315: fix integer underflow and heap overflow in log6_opts STATUS_…
DL6ER Mar 19, 2026
c7b2ae1
edns0: bounds-check option length before memcmp in check_source()
DL6ER Mar 19, 2026
db50e3f
lease: check parse_hex() return value before use as length
DL6ER Mar 19, 2026
922e450
domain: fix strncat buffer-size argument in is_rev_synth()
DL6ER Mar 19, 2026
b8603b3
dump: check lseek() return in pcap record-counting loop
DL6ER Mar 20, 2026
37de5e9
Rework storage allocation for domain names. CVE-2026-2291
simonkelley Feb 12, 2026
9ad9b90
Fix NSEC bitmap parsing infinite loop. CVE-2026-4890
simonkelley Mar 25, 2026
3077809
Verify rdlen field in RRSIG packets. CVE-2026-4891
simonkelley Mar 25, 2026
8b37719
Fix buffer overflow in helper.c with large CLIDs. CVE-2026-4892
simonkelley Mar 25, 2026
a219c5e
Fix broken client subnet validation. CVE-2026-4893
simonkelley Mar 25, 2026
d0d7e9d
Updates to a345b075b3b8696a18631b46e53ab654354ed961 following review.
simonkelley Mar 30, 2026
0bb13d5
Fix buffer overflow vulnerability in extract_addresses() CVE-2026-5172
simonkelley Mar 30, 2026
091fd15
Sync 3ea905b98b8756f0652a9626a98384e96bab3a97 with 7cd050075ea73cd770…
simonkelley Mar 30, 2026
998631f
Fix problen in from_wire() when names contain escape chars.
simonkelley Apr 6, 2026
c63a09b
Fix buffer OOB read in find_soa()
dolitli May 9, 2026
02ce7d7
Update ftl-build container and dnsmasq tag
DL6ER May 11, 2026
351c5ad
Merge branch 'development' into update/dnsmasq
DL6ER May 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ set(CMAKE_C_STANDARD 17)

project(PIHOLE_FTL C)

set(DNSMASQ_VERSION pi-hole-v2.92.2)
set(DNSMASQ_VERSION pi-hole-v2.93rc1)

add_subdirectory(src)
10 changes: 10 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,16 @@ if [[ -n "${debug}" ]]; then
restart=1
fi

# If we are building in debug mode, ensure CMake is configured for a Debug build
# This appends the cache entry so callers can still pass other -D options.
if [[ -n "${debug}" ]]; then
if [[ -n "${cmake_args}" ]]; then
cmake_args="${cmake_args} -DCMAKE_BUILD_TYPE=Debug"
else
cmake_args="-DCMAKE_BUILD_TYPE=Debug"
fi
fi

# If we are in dev mode, we want to build, install, restart, and tail the logs
# by default
if [[ -n "${dev}" ]]; then
Expand Down
27 changes: 27 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,33 @@ find_library(LIBNETTLE NAMES libnettle${LIBRARY_SUFFIX} nettle HINTS /usr/local/
find_library(LIBIDN2 NAMES libidn2${LIBRARY_SUFFIX} idn2)
find_library(LIBUNISTRING NAMES libunistring${LIBRARY_SUFFIX} unistring)

# Echo library search results to the console
if(LIBHOGWEED)
message(STATUS "Found libhogweed: ${LIBHOGWEED}")
else()
message(WARNING "libhogweed not found, DNSSEC support will be disabled")
endif()
if(LIBGMP)
message(STATUS "Found libgmp: ${LIBGMP}")
else()
message(WARNING "libgmp not found, DNSSEC support will be disabled")
endif()
if(LIBNETTLE)
message(STATUS "Found libnettle: ${LIBNETTLE}")
else()
message(WARNING "libnettle not found, DNSSEC support will be disabled")
endif()
if(LIBIDN2)
message(STATUS "Found libidn2: ${LIBIDN2}")
else()
message(WARNING "libidn2 not found, IDN support will be disabled")
endif()
if(LIBUNISTRING)
message(STATUS "Found libunistring: ${LIBUNISTRING}")
else()
message(WARNING "libunistring not found, IDN support will be disabled")
endif()

target_link_libraries(pihole-FTL rt Threads::Threads ${LIBHOGWEED} ${LIBGMP} ${LIBNETTLE} ${LIBIDN2} ${LIBUNISTRING})

if(LUA_DL STREQUAL "true")
Expand Down
28 changes: 28 additions & 0 deletions src/FTL.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,29 @@

#define __USE_XOPEN
#define _GNU_SOURCE
#ifdef __GNUC__
/*
* Protect system headers from project-local macro redefinitions.
*
* `dnsmasq/dnsmasq.h` (and other third-party headers) define very common
* identifiers like `free`/`strdup` as macros that expand to internal
* wrappers (e.g. `free_real(__func__, __LINE__, (x))`). If such macros are
* active while system headers are included, they can be expanded inside
* libc prototypes and inline functions and produce invalid code, causing
* spurious compiler errors.
*
* To avoid this we push any existing macro definition on a stack, undefine
* the name while including system headers, and restore the original macro
* afterwards with `#pragma pop_macro`.
*
* Note: `#pragma push_macro`/`pop_macro` is a GCC/Clang extension, so we
* guard its use with `#ifdef __GNUC__` for portability.
*/
#pragma push_macro("free")
#pragma push_macro("strdup")
#undef free
#undef strdup
#endif
#include <stdio.h>
// variable argument lists
#include <stdarg.h>
Expand Down Expand Up @@ -176,7 +199,12 @@
// and report accordingly in the log. This will make debugging FTL crash
// caused by insufficient memory or by code bugs (not properly dealing
// with NULL pointers) much easier.
#ifdef __GNUC__
#pragma pop_macro("strdup")
#pragma pop_macro("free")
#endif
#undef strdup // strdup() is a macro in itself, it needs special handling
#undef free
#define free(ptr) { FTLfree(ptr, __FILE__, __FUNCTION__, __LINE__); ptr = NULL; }
#define strdup(str_in) FTLstrdup(str_in, __FILE__, __FUNCTION__, __LINE__)
#define calloc(numer_of_elements, element_size) FTLcalloc(numer_of_elements, element_size, __FILE__, __FUNCTION__, __LINE__)
Expand Down
5 changes: 4 additions & 1 deletion src/api/2fa.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,11 @@ static uint32_t hotp(const uint8_t *key, size_t key_len, const uint64_t counter,
// Compute HMAC-SHA1
hmac_sha1_update(&ctx, sizeof(counter_be), (uint8_t*)&counter_be);
uint8_t out[SHA1_DIGEST_SIZE];
#if NETTLE_VERSION_MAJOR >= 4
hmac_sha1_digest(&ctx, out);
#else
hmac_sha1_digest(&ctx, SHA1_DIGEST_SIZE, out);

#endif
// Truncate HMAC-SHA1 for ease of use
// RFC 6238 (section 5.3): offset = last nibble of hash
const uint8_t offset = out[SHA1_DIGEST_SIZE-1] & 0x0F;
Expand Down
8 changes: 8 additions & 0 deletions src/config/password.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,11 @@ static char * __attribute__((malloc)) double_sha256_password(const char *passwor
strlen(password),
(uint8_t*)password);

#if NETTLE_VERSION_MAJOR >= 4
sha256_digest(&ctx, raw_response);
#else
sha256_digest(&ctx, SHA256_DIGEST_SIZE, raw_response);
#endif
sha256_raw_to_hex(raw_response, response);

// Hash password a second time
Expand All @@ -85,7 +89,11 @@ static char * __attribute__((malloc)) double_sha256_password(const char *passwor
strlen(response),
(uint8_t*)response);

#if NETTLE_VERSION_MAJOR >= 4
sha256_digest(&ctx, raw_response);
#else
sha256_digest(&ctx, SHA256_DIGEST_SIZE, raw_response);
#endif
sha256_raw_to_hex(raw_response, response);

return strdup(response);
Expand Down
2 changes: 1 addition & 1 deletion src/dnsmasq/arp.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000-2025 Simon Kelley
/* dnsmasq is Copyright (c) 2000-2026 Simon Kelley

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down
16 changes: 8 additions & 8 deletions src/dnsmasq/auth.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000-2025 Simon Kelley
/* dnsmasq is Copyright (c) 2000-2026 Simon Kelley

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -591,7 +591,7 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n
if (auth && zone)
{
char *authname;
int newoffset, offset = 0;
int newoffset = ansp - (unsigned char *)header, offset = 0;

if (!subnet)
authname = zone->domain;
Expand Down Expand Up @@ -631,8 +631,7 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n
}

/* handle NS and SOA in auth section or for explicit queries */
newoffset = ansp - (unsigned char *)header;
if (((anscount == 0 && !ns) || soa) &&
if (((anscount == 0 && !ns) || soa) &&
add_resource_record(header, limit, &trunc, 0, &ansp,
daemon->auth_ttl, NULL, T_SOA, C_IN, "ddlllll",
authname, daemon->authserver, daemon->hostmaster,
Expand All @@ -650,11 +649,10 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n
if (anscount != 0 || ns)
{
struct name_list *secondary;

/* Only include the machine running dnsmasq if it's acting as an auth server */
if (daemon->authinterface)
{
newoffset = ansp - (unsigned char *)header;
if (add_resource_record(header, limit, &trunc, -offset, &ansp,
daemon->auth_ttl, NULL, T_NS, C_IN, "d", offset == 0 ? authname : NULL, daemon->authserver))
{
Expand All @@ -669,9 +667,11 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n

if (!subnet)
for (secondary = daemon->secondary_forward_server; secondary; secondary = secondary->next)
if (add_resource_record(header, limit, &trunc, offset, &ansp,
daemon->auth_ttl, NULL, T_NS, C_IN, "d", secondary->name))
if (add_resource_record(header, limit, &trunc, -offset, &ansp,
daemon->auth_ttl, NULL, T_NS, C_IN, "d", offset == 0 ? authname : NULL, secondary->name))
{
if (offset == 0)
offset = newoffset;
if (ns)
anscount++;
else
Expand Down
18 changes: 10 additions & 8 deletions src/dnsmasq/blockdata.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000-2025 Simon Kelley
/* dnsmasq is Copyright (c) 2000-2026 Simon Kelley

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -193,20 +193,22 @@ void *blockdata_retrieve(struct blockdata *block, size_t len, void *data)
{
size_t blen;
struct blockdata *b;
uint8_t *new, *d;
uint8_t *d;

static unsigned int buff_len = 0;
static unsigned char *buff = NULL;

if (!data)
{
static unsigned int buff_len = 0;
static unsigned char *buff = NULL;
uint8_t *new;

if (len > buff_len)
{
if (!(new = whine_malloc(len)))
blen = len + 1024;
if (!(new = whine_realloc(buff, blen)))
return NULL;
if (buff)
free(buff);

buff = new;
buff_len = blen;
}
data = buff;
}
Expand Down
56 changes: 41 additions & 15 deletions src/dnsmasq/bpf.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* dnsmasq is Copyright (c) 2000-2025 Simon Kelley
/* dnsmasq is Copyright (c) 2000-2026 Simon Kelley

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -47,33 +47,29 @@ static union all_addr del_addr;

#if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)

int arp_enumerate(void *parm, callback_t callback)
static int arp_enumerate_family(int family, void *parm, callback_t callback)
{
int mib[6];
size_t needed;
char *next;
struct rt_msghdr *rtm;
struct sockaddr_inarp *sin2;
struct sockaddr_dl *sdl;
struct iovec buff;
static struct iovec buff = { NULL, 0 };
int rc;

buff.iov_base = NULL;
buff.iov_len = 0;

mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = AF_INET;
mib[3] = family;
mib[4] = NET_RT_FLAGS;
#ifdef RTF_LLINFO
mib[5] = RTF_LLINFO;
#else
mib[5] = 0;
#endif
if (sysctl(mib, 6, NULL, &needed, NULL, 0) == -1 || needed == 0)
return 0;

return 1; /* not a failure: unsupported or empty table */
while (1)
{
if (!expand_buf(&buff, needed))
Expand All @@ -83,20 +79,50 @@ int arp_enumerate(void *parm, callback_t callback)
break;
needed += needed / 8;
}

if (rc == -1)
return 0;

for (next = buff.iov_base ; next < (char *)buff.iov_base + needed; next += rtm->rtm_msglen)
{
rtm = (struct rt_msghdr *)next;
sin2 = (struct sockaddr_inarp *)(rtm + 1);
sdl = (struct sockaddr_dl *)((char *)sin2 + SA_SIZE(sin2));
if (!callback.af_unspec(AF_INET, &sin2->sin_addr, LLADDR(sdl), sdl->sdl_alen, parm))
return 0;
if (family == AF_INET)
{
struct sockaddr_inarp *sin2 = (struct sockaddr_inarp *)(rtm + 1);
sdl = (struct sockaddr_dl *)((char *)sin2 + SA_SIZE(sin2));
if (!callback.af_unspec(AF_INET, &sin2->sin_addr,
LLADDR(sdl), sdl->sdl_alen, parm))
return 0;
}
else
{
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)(rtm + 1);
sdl = (struct sockaddr_dl *)((char *)sin6 + SA_SIZE(sin6));
if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
{
/* PF_ROUTE sysctl returns raw kernel structures with the interface
index embedded in bytes 2-3 of link-local addresses. Extract it
into sin6_scope_id per the KAME API contract before clearing. */
sin6->sin6_scope_id =
((uint32_t)(sin6->sin6_addr.s6_addr[2]) << 8) | sin6->sin6_addr.s6_addr[3];
sin6->sin6_addr.s6_addr[2] = 0;
sin6->sin6_addr.s6_addr[3] = 0;
}
if (!callback.af_unspec(AF_INET6, &sin6->sin6_addr,
LLADDR(sdl), sdl->sdl_alen, parm))
return 0;
}
}

return 1;
}

static int arp_enumerate(void *parm, callback_t callback)
{
if (!arp_enumerate_family(AF_INET, parm, callback))
return 0;
return arp_enumerate_family(AF_INET6, parm, callback);
}
#endif /* defined(HAVE_BSD_NETWORK) && !defined(__APPLE__) */


Expand Down
Loading
Loading