Branch data Line data Source code
1 : : /* SPDX-FileCopyrightText: Copyright 2026 Cozens Software Solutions Limited
2 : : * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0 OR LicenseRef-PolyForm-Internal-Use-1.0.0 OR LicenseRef-COSOSO-Commercial
3 : : */
4 : :
5 : : #include <stdbool.h>
6 : : #include <stdint.h>
7 : :
8 : : #include "SolidSyslogError.h"
9 : : #include "SolidSyslogLwipRawAddressPrivate.h"
10 : : #include "SolidSyslogLwipRawResolverErrors.h"
11 : : #include "SolidSyslogLwipRawResolverPrivate.h"
12 : : #include "SolidSyslogNullResolver.h"
13 : : #include "SolidSyslogPrival.h"
14 : : #include "SolidSyslogResolverCategories.h"
15 : : #include "SolidSyslogResolverDefinition.h"
16 : : #include "SolidSyslogTransport.h"
17 : : #include "lwip/ip_addr.h"
18 : :
19 : : const struct SolidSyslogErrorSource SolidSyslogLwipRawResolverErrorSource = {
20 : : "LwipRawResolver",
21 : : SolidSyslogResolverErrors_Name
22 : : };
23 : :
24 : : struct SolidSyslogAddress;
25 : :
26 : : static bool LwipRawResolver_Resolve(
27 : : struct SolidSyslogResolver* base,
28 : : enum SolidSyslogTransport transport,
29 : : const char* host,
30 : : uint16_t port,
31 : : struct SolidSyslogAddress* result
32 : : );
33 : :
34 : 18 : void SolidSyslogLwipRawResolver_Initialise(struct SolidSyslogResolver* base)
35 : : {
36 : 18 : base->Resolve = LwipRawResolver_Resolve;
37 : 18 : }
38 : :
39 : 18 : void SolidSyslogLwipRawResolver_Cleanup(struct SolidSyslogResolver* base)
40 : : {
41 : : /* Overwrite the abstract base with the shared NullResolver vtable so
42 : : * use-after-destroy resolves cleanly to a failed-lookup error path
43 : : * rather than a NULL-fn-pointer crash. */
44 : 18 : *base = *SolidSyslogNullResolver_Get();
45 : 18 : }
46 : :
47 : 12 : static bool LwipRawResolver_Resolve(
48 : : struct SolidSyslogResolver* base,
49 : : enum SolidSyslogTransport transport,
50 : : const char* host,
51 : : uint16_t port,
52 : : struct SolidSyslogAddress* result
53 : : )
54 : : {
55 : : (void) base;
56 : : (void) transport;
57 : 12 : struct SolidSyslogLwipRawAddress* self = SolidSyslogLwipRawAddress_As(result);
58 : : /* No SolidSyslogLwipRaw_Marshal hop here: ipaddr_aton is a pure string
59 : : * parser that touches no lwIP core state, so it is safe on any thread.
60 : : * The sibling SolidSyslogLwipRawDnsResolver calls lwIP DNS APIs
61 : : * (dns_gethostbyname) and must marshal them - that is where the hop
62 : : * belongs, not here. */
63 : : ip_addr_t parsed;
64 : 12 : bool resolved = false;
65 [ + + ]: 12 : if (ipaddr_aton(host, &parsed) != 0)
66 : : {
67 : : /* IPv4 only, which is what the datagram's and stream's pcbs send to.
68 : : * A dual-stack lwIP parses an IPv6 literal too, and storing it would
69 : : * give the transports a destination they fail every send to. */
70 [ + + ]: 9 : if (LwipRawAddress_IsIpv4(&parsed))
71 : : {
72 : 6 : self->Ip = parsed;
73 : 6 : self->Port = port;
74 : 6 : resolved = true;
75 : : }
76 : : else
77 : : {
78 : 3 : LwipRawResolver_Report(
79 : : SOLIDSYSLOG_SEVERITY_ERROR,
80 : : SOLIDSYSLOG_CAT_RESOLVER_RESOLVE_FAILED,
81 : : SOLIDSYSLOG_RESOLVER_ERROR_ADDRESS_FAMILY_UNSUPPORTED
82 : : );
83 : : }
84 : : }
85 : 12 : return resolved;
86 : : }
|