2017-01-07 22:41:59 +03:00
|
|
|
/*
|
|
|
|
* netio.h -- network I/O support.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
|
|
|
|
*
|
|
|
|
* See LICENSE for the license.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* The netio module implements event based I/O handling using
|
|
|
|
* pselect(2). Multiple event handlers can wait for a certain event
|
|
|
|
* to occur simultaneously. Each event handler is called when an
|
|
|
|
* event occurs that the event handler has indicated that it is
|
|
|
|
* willing to handle.
|
|
|
|
*
|
|
|
|
* There are four types of events that can be handled:
|
|
|
|
*
|
|
|
|
* NETIO_EVENT_READ: reading will not block.
|
|
|
|
* NETIO_EVENT_WRITE: writing will not block.
|
|
|
|
* NETIO_EVENT_TIMEOUT: the timeout expired.
|
|
|
|
*
|
|
|
|
* A file descriptor must be specified if the handler is interested in
|
|
|
|
* the first three event types. A timeout must be specified if the
|
|
|
|
* event handler is interested in timeouts. These event types can be
|
|
|
|
* OR'ed together if the handler is willing to handle multiple types
|
|
|
|
* of events.
|
|
|
|
*
|
|
|
|
* The special event type NETIO_EVENT_NONE is available if you wish to
|
|
|
|
* temporarily disable the event handler without removing and adding
|
|
|
|
* the handler to the netio structure.
|
|
|
|
*
|
|
|
|
* The event callbacks are free to modify the netio_handler_type
|
|
|
|
* structure to change the file descriptor, timeout, event types, user
|
|
|
|
* data, or handler functions.
|
|
|
|
*
|
|
|
|
* The main loop of the program must call netio_dispatch to check for
|
|
|
|
* events and dispatch them to the handlers. An additional timeout
|
|
|
|
* can be specified as well as the signal mask to install while
|
|
|
|
* blocked in pselect(2).
|
|
|
|
*/
|
|
|
|
|
Import 4.8.0 (previous was 4.6.0)
29 November 2023: Wouter
- Tag for 4.8.0rc1.
28 November 2023: Wouter
- Set up doc/RELNOTES for upcoming release.
- Fix unit test kill_from_pidfile function for nonexistent files
because the argument is evaluated before the test expression.
- Fix rr-test to also convert the contents of the just written output
file.
- Fix test set to remove -f nsd.db and rm nsd.db commands.
- Fix test set to remove difffile option.
27 November 2023: Jeroen
- Fix #14: Set timeout to 3s when servicing remaining TCP connections.
- Fix: Always instate write handler after reading queries from TCP.
- Answer first query on connections accepted just before reload.
27 November 2023: Wouter
- Merge #305: faster stats. Statistics can be gathered while a reload
is in progress.
27 November 2023: Willem
- Merge #302: Test package fixes. Correct Auxfiles, kill_from_pidfile
function and fix drop_updates, rr-test and xfr_update tests.
1 November 2023: Jeroen
- Remove on-disk database.
31 October 2023: Wouter
- Merge #301: improve the logging of ixfr fallbacks to axfr.
30 October 2023: Jeroen
- Fix processing of consolidated IXFRs.
30 October 2023: Wouter
- Fix for interprocess communication to set quit sync command from
main process explicitly.
3 October 2023: Wouter
- Merge #281: Proxy protocol. An implementation of PROXYv2 for NSD.
It can be configured with proxy-protocol-port: portnum with the
port number of the interface on which proxy traffic is handled.
The interface can support proxy traffic for UDP, TCP and TLS.
21 September 2023: Wouter
- Merge #295: Update e-mail addresses, add ref to support contracts
31 August 2023: Wouter
- Fix autoconf 2.69 warnings in configure.
14 July 2023: Wouter
- Merge #287: Update nsd.conf.5.in.
11 July 2023: Wouter
- Fix unused variable warning in unit test of udb.
22 June 2023: Wouter
- Fix #284: dnstap_collector.c: SOCK_NONBLOCK is not available on
Mac/Darwin.
7 June 2023: Wouter
- Merge #282: Improve nsd.conf man page.
- Fix unused but set variable warning.
- Fix #283: Compile failure in remote.c when --disable-bind8-stats
and --without-ssl are specified.
31 May 2023: Wouter
- Add missing items to doc/RELNOTES.
- Tag for 4.7.0rc1. It became release 4.7.0 on 7 june 2023. The code
repository continues with 4.7.1.
30 May 2023: Jeroen
- Fix #240: Prefix messages originating from verifier.
- Fix #275: Drop unnecessary root server checks.
30 May 2023: Wouter
- Next version is 4.7.0, instead of 4.6.2, because of the added
features, like TLS for DNSTAP.
- Fix unused variable warning in unit test, from clang compile.
24 May 2023: Wouter
- For #279: Note that autoreconf -fi creates the configure script
and also the needed auxiliary files, for autoconf 2.69 and 2.71.
4 May 2023: Wouter
- Fix to remove unused whitespace from acx_nlnetlabs.m4 and config.h.
1 May 2023: Wouter
- make depend.
- Fix for build to run flex and bison before compiling code that needs
the headers.
13 April 2023: Wouter
- Fix cirrus script for submit to coverity scan to libtoolize
the configure script components config.guess and config.sub.
- Fix readme status badge links.
28 March 2023: Wouter
- Fix #273: Large TXT record breaks AXFR.
- Fix ixfr create from adding too many record types.
16 March 2023: Wouter
- Fix include brackets for ssl.h include statements, instead of quotes.
- Fix static analyzer warning about nsd_event_method initialization.
15 March 2023: Wouter
- Dnstap tls code fixes.
14 March 2023: Wouter
- Fix dnstap to not check socket path when using IP address.
- dnstap over TLS, default enabled. Configured with the
options dnstap-tls, dnstap-tls-server-name, dnstap-tls-cert-bundle,
dnstap-tls-client-key-file and dnstap-tls-client-cert-file.
- Fix to compile without ssl with dnstap-tls code.
9 March 2023: Wouter
- Fix #271: DNSTAP over TCP, with dnstap-ip: "127.0.0.1@3333".
- Fix to clean more memory on exit of dnstap collector.
23 February 2023: Wouter
- Fix #270: reserved identifier violation.
20 February 2023: Wouter
- Merge #269 from Fale: Add systemd service unit.
16 February 2023: Wouter
- Fix #266: Fix build with --without-ssl.
- Fix #267: Allow unencrypted local operation of nsd-control.
- Fix for #267: neater variable definitions.
2 February 2023: Wouter
- Merge #265: Fix C99 compatibility issue.
30 January 2023: Wouter
- Merge #263: Add bash autocompletion script for nsd-control.
- Fix for #262: More error logging for SSL read failures for zone
transfers.
27 January 2023: Wouter
- Fix #262: Zone(s) not synchronizing properly via TLS.
- Fix ixfr_and_restart test to wait for processes to come to a stop.
26 January 2023: Wouter
- Fix configure for -Wstrict-prototypes.
10 November 2022: Wouter
- Tag for NSD 4.6.1, the repository continues with version 4.6.2.
- Fix #239: -Wincompatible-pointer-types warning in remote.c.
- Fix unit tests to succeed with --disable-bind8-stats.
1 November 2022: Wouter
- Fixup for non-trailing newline lexer change warnings.
- Update doc/RELNOTES for changes.
- Fix ixfr_gone unit test to not use system default zone list file.
- Fix credns tests for vm usage, and not use system default zone
list file.
- Fix verify tests to use more portable bash location in script.
- Fix verify_again test to use ipv4 address for test.
1 November 2022: Tom
- Add SVCB dohpath support
28 September 2022: Jeroen
- Set ALPN "dot" token during connection establishment as per RFC9103
section 7.1 (Thanks Cesar Kuroiwa).
21 September 2022: Tom
- Change zone parsing to accept non-trailing newline.
1 September 2022: Wouter
- Merge #231 from moritzbuhl: Fix checking if nonblocking sockets work
on OpenBSD.
19 August 2022: Wouter
- Update cirrus build script for newer Ubuntu image, and FreeBSD
build with libtoolize to install auxiliary files.
- Update to clang 14 in cirrus build test on Ubuntu Jammy 22.04.
7 July 2022: Tom
- Fix #212: Change commandline control actions to always log.
1 July 2022: Wouter
- Fix static analyzer reports, fix wrong log print when skipping xfr,
fix to print error on pipe read fail, and assert an xfr is in
progress during packet checks.
2024-02-17 20:31:21 +03:00
|
|
|
#ifndef NETIO_H
|
|
|
|
#define NETIO_H
|
2017-01-07 22:41:59 +03:00
|
|
|
|
|
|
|
#ifdef HAVE_SYS_SELECT_H
|
|
|
|
#include <sys/select.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
|
|
|
#include "region-allocator.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The type of events a handler is interested in. These can be OR'ed
|
|
|
|
* together to specify multiple event types.
|
|
|
|
*/
|
|
|
|
enum netio_event_types {
|
|
|
|
NETIO_EVENT_NONE = 0,
|
|
|
|
NETIO_EVENT_READ = 1,
|
|
|
|
NETIO_EVENT_WRITE = 2,
|
|
|
|
NETIO_EVENT_TIMEOUT = 4,
|
|
|
|
};
|
|
|
|
typedef enum netio_event_types netio_event_types_type;
|
|
|
|
|
|
|
|
typedef struct netio netio_type;
|
|
|
|
typedef struct netio_handler netio_handler_type;
|
|
|
|
typedef struct netio_handler_list netio_handler_list_type;
|
|
|
|
|
|
|
|
struct netio
|
|
|
|
{
|
|
|
|
region_type *region;
|
|
|
|
netio_handler_list_type *handlers;
|
|
|
|
netio_handler_list_type *deallocated;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Cached value of the current time. The cached value is
|
|
|
|
* cleared at the start of netio_dispatch to calculate the
|
|
|
|
* relative timeouts of the event handlers and after calling
|
|
|
|
* pselect(2) so handlers can use it to calculate a new
|
|
|
|
* absolute timeout.
|
|
|
|
*
|
|
|
|
* Use netio_current_time() to read the current time.
|
|
|
|
*/
|
|
|
|
int have_current_time;
|
|
|
|
struct timespec cached_current_time;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Next handler in the dispatch. Only valid during callbacks.
|
|
|
|
* To make sure that deletes respect the state of the iterator.
|
|
|
|
*/
|
|
|
|
netio_handler_list_type *dispatch_next;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef void (*netio_event_handler_type)(netio_type *netio,
|
|
|
|
netio_handler_type *handler,
|
|
|
|
netio_event_types_type event_types);
|
|
|
|
|
|
|
|
struct netio_handler
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* The file descriptor that should be checked for events. If
|
|
|
|
* the file descriptor is negative only timeout events are
|
|
|
|
* checked for.
|
|
|
|
*/
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
/** index of the pollfd array for this handler */
|
|
|
|
int pfd;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The time when no events should be checked for and the
|
|
|
|
* handler should be called with the NETIO_EVENT_TIMEOUT
|
|
|
|
* event type. Unlike most timeout parameters the time should
|
|
|
|
* be absolute, not relative!
|
|
|
|
*/
|
|
|
|
struct timespec *timeout;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Additional user data.
|
|
|
|
*/
|
|
|
|
void *user_data;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The type of events that should be checked for. These types
|
|
|
|
* can be OR'ed together to wait for multiple types of events.
|
|
|
|
*/
|
|
|
|
netio_event_types_type event_types;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The event handler. The event_types parameter contains the
|
|
|
|
* OR'ed set of event types that actually triggered. The
|
|
|
|
* event handler is allowed to modify this handler object.
|
|
|
|
* The event handler SHOULD NOT block.
|
|
|
|
*/
|
|
|
|
netio_event_handler_type event_handler;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct netio_handler_list
|
|
|
|
{
|
|
|
|
netio_handler_list_type *next;
|
|
|
|
netio_handler_type *handler;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Create a new netio instance using the specified REGION. The netio
|
|
|
|
* instance is cleaned up when the REGION is deallocated.
|
|
|
|
*/
|
|
|
|
netio_type *netio_create(region_type *region);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Add a new HANDLER to NETIO.
|
|
|
|
*/
|
|
|
|
void netio_add_handler(netio_type *netio, netio_handler_type *handler);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Remove the HANDLER from NETIO.
|
|
|
|
*/
|
|
|
|
void netio_remove_handler(netio_type *netio, netio_handler_type *handler);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Retrieve the current time (using gettimeofday(2).
|
|
|
|
*/
|
|
|
|
const struct timespec *netio_current_time(netio_type *netio);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Check for events and dispatch them to the handlers. If TIMEOUT is
|
|
|
|
* specified it specifies the maximum time to wait for an event to
|
|
|
|
* arrive. SIGMASK is passed to the underlying pselect(2) call.
|
|
|
|
* Returns the number of non-timeout events dispatched, 0 on timeout,
|
|
|
|
* and -1 on error (with errno set appropriately).
|
|
|
|
*/
|
|
|
|
int netio_dispatch(netio_type *netio,
|
|
|
|
const struct timespec *timeout,
|
|
|
|
const sigset_t *sigmask);
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
inline netio_event_types_type
|
|
|
|
operator | (netio_event_types_type lhs, netio_event_types_type rhs) {
|
|
|
|
return (netio_event_types_type) (lhs | rhs);
|
|
|
|
}
|
|
|
|
inline netio_event_types_type
|
|
|
|
operator |= (netio_event_types_type &lhs, netio_event_types_type rhs) {
|
|
|
|
lhs = (netio_event_types_type) (lhs | rhs);
|
|
|
|
return lhs;
|
|
|
|
}
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
Import 4.8.0 (previous was 4.6.0)
29 November 2023: Wouter
- Tag for 4.8.0rc1.
28 November 2023: Wouter
- Set up doc/RELNOTES for upcoming release.
- Fix unit test kill_from_pidfile function for nonexistent files
because the argument is evaluated before the test expression.
- Fix rr-test to also convert the contents of the just written output
file.
- Fix test set to remove -f nsd.db and rm nsd.db commands.
- Fix test set to remove difffile option.
27 November 2023: Jeroen
- Fix #14: Set timeout to 3s when servicing remaining TCP connections.
- Fix: Always instate write handler after reading queries from TCP.
- Answer first query on connections accepted just before reload.
27 November 2023: Wouter
- Merge #305: faster stats. Statistics can be gathered while a reload
is in progress.
27 November 2023: Willem
- Merge #302: Test package fixes. Correct Auxfiles, kill_from_pidfile
function and fix drop_updates, rr-test and xfr_update tests.
1 November 2023: Jeroen
- Remove on-disk database.
31 October 2023: Wouter
- Merge #301: improve the logging of ixfr fallbacks to axfr.
30 October 2023: Jeroen
- Fix processing of consolidated IXFRs.
30 October 2023: Wouter
- Fix for interprocess communication to set quit sync command from
main process explicitly.
3 October 2023: Wouter
- Merge #281: Proxy protocol. An implementation of PROXYv2 for NSD.
It can be configured with proxy-protocol-port: portnum with the
port number of the interface on which proxy traffic is handled.
The interface can support proxy traffic for UDP, TCP and TLS.
21 September 2023: Wouter
- Merge #295: Update e-mail addresses, add ref to support contracts
31 August 2023: Wouter
- Fix autoconf 2.69 warnings in configure.
14 July 2023: Wouter
- Merge #287: Update nsd.conf.5.in.
11 July 2023: Wouter
- Fix unused variable warning in unit test of udb.
22 June 2023: Wouter
- Fix #284: dnstap_collector.c: SOCK_NONBLOCK is not available on
Mac/Darwin.
7 June 2023: Wouter
- Merge #282: Improve nsd.conf man page.
- Fix unused but set variable warning.
- Fix #283: Compile failure in remote.c when --disable-bind8-stats
and --without-ssl are specified.
31 May 2023: Wouter
- Add missing items to doc/RELNOTES.
- Tag for 4.7.0rc1. It became release 4.7.0 on 7 june 2023. The code
repository continues with 4.7.1.
30 May 2023: Jeroen
- Fix #240: Prefix messages originating from verifier.
- Fix #275: Drop unnecessary root server checks.
30 May 2023: Wouter
- Next version is 4.7.0, instead of 4.6.2, because of the added
features, like TLS for DNSTAP.
- Fix unused variable warning in unit test, from clang compile.
24 May 2023: Wouter
- For #279: Note that autoreconf -fi creates the configure script
and also the needed auxiliary files, for autoconf 2.69 and 2.71.
4 May 2023: Wouter
- Fix to remove unused whitespace from acx_nlnetlabs.m4 and config.h.
1 May 2023: Wouter
- make depend.
- Fix for build to run flex and bison before compiling code that needs
the headers.
13 April 2023: Wouter
- Fix cirrus script for submit to coverity scan to libtoolize
the configure script components config.guess and config.sub.
- Fix readme status badge links.
28 March 2023: Wouter
- Fix #273: Large TXT record breaks AXFR.
- Fix ixfr create from adding too many record types.
16 March 2023: Wouter
- Fix include brackets for ssl.h include statements, instead of quotes.
- Fix static analyzer warning about nsd_event_method initialization.
15 March 2023: Wouter
- Dnstap tls code fixes.
14 March 2023: Wouter
- Fix dnstap to not check socket path when using IP address.
- dnstap over TLS, default enabled. Configured with the
options dnstap-tls, dnstap-tls-server-name, dnstap-tls-cert-bundle,
dnstap-tls-client-key-file and dnstap-tls-client-cert-file.
- Fix to compile without ssl with dnstap-tls code.
9 March 2023: Wouter
- Fix #271: DNSTAP over TCP, with dnstap-ip: "127.0.0.1@3333".
- Fix to clean more memory on exit of dnstap collector.
23 February 2023: Wouter
- Fix #270: reserved identifier violation.
20 February 2023: Wouter
- Merge #269 from Fale: Add systemd service unit.
16 February 2023: Wouter
- Fix #266: Fix build with --without-ssl.
- Fix #267: Allow unencrypted local operation of nsd-control.
- Fix for #267: neater variable definitions.
2 February 2023: Wouter
- Merge #265: Fix C99 compatibility issue.
30 January 2023: Wouter
- Merge #263: Add bash autocompletion script for nsd-control.
- Fix for #262: More error logging for SSL read failures for zone
transfers.
27 January 2023: Wouter
- Fix #262: Zone(s) not synchronizing properly via TLS.
- Fix ixfr_and_restart test to wait for processes to come to a stop.
26 January 2023: Wouter
- Fix configure for -Wstrict-prototypes.
10 November 2022: Wouter
- Tag for NSD 4.6.1, the repository continues with version 4.6.2.
- Fix #239: -Wincompatible-pointer-types warning in remote.c.
- Fix unit tests to succeed with --disable-bind8-stats.
1 November 2022: Wouter
- Fixup for non-trailing newline lexer change warnings.
- Update doc/RELNOTES for changes.
- Fix ixfr_gone unit test to not use system default zone list file.
- Fix credns tests for vm usage, and not use system default zone
list file.
- Fix verify tests to use more portable bash location in script.
- Fix verify_again test to use ipv4 address for test.
1 November 2022: Tom
- Add SVCB dohpath support
28 September 2022: Jeroen
- Set ALPN "dot" token during connection establishment as per RFC9103
section 7.1 (Thanks Cesar Kuroiwa).
21 September 2022: Tom
- Change zone parsing to accept non-trailing newline.
1 September 2022: Wouter
- Merge #231 from moritzbuhl: Fix checking if nonblocking sockets work
on OpenBSD.
19 August 2022: Wouter
- Update cirrus build script for newer Ubuntu image, and FreeBSD
build with libtoolize to install auxiliary files.
- Update to clang 14 in cirrus build test on Ubuntu Jammy 22.04.
7 July 2022: Tom
- Fix #212: Change commandline control actions to always log.
1 July 2022: Wouter
- Fix static analyzer reports, fix wrong log print when skipping xfr,
fix to print error on pipe read fail, and assert an xfr is in
progress during packet checks.
2024-02-17 20:31:21 +03:00
|
|
|
#endif /* NETIO_H */
|