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 "SolidSyslogPlusTcpResolver.h"
6 : :
7 : : #include <stdbool.h>
8 : : #include <stddef.h>
9 : : #include <stdint.h>
10 : :
11 : : #include "FreeRTOS.h"
12 : : #include "FreeRTOS_DNS.h"
13 : : #include "FreeRTOS_IP.h"
14 : : #include "FreeRTOS_Sockets.h"
15 : :
16 : : #include "SolidSyslogError.h"
17 : : #include "SolidSyslogNullResolver.h"
18 : : #include "SolidSyslogPlusTcpAddressPrivate.h"
19 : : #include "SolidSyslogPlusTcpResolverErrors.h"
20 : : #include "SolidSyslogPlusTcpResolverPrivate.h"
21 : : #include "SolidSyslogResolverDefinition.h"
22 : : #include "SolidSyslogTransport.h"
23 : :
24 : : const struct SolidSyslogErrorSource SolidSyslogPlusTcpResolverErrorSource = {
25 : : "PlusTcpResolver",
26 : : SolidSyslogResolverErrors_Name
27 : : };
28 : :
29 : : struct SolidSyslogAddress;
30 : :
31 : : enum
32 : : {
33 : : GETADDRINFO_SUCCESS = 0
34 : : };
35 : :
36 : : static bool PlusTcpResolver_Resolve(
37 : : struct SolidSyslogResolver* base,
38 : : enum SolidSyslogTransport transport,
39 : : const char* host,
40 : : uint16_t port,
41 : : struct SolidSyslogAddress* result
42 : : );
43 : : static BaseType_t PlusTcpResolver_MapTransport(enum SolidSyslogTransport transport);
44 : :
45 : 19 : void SolidSyslogPlusTcpResolver_Initialise(struct SolidSyslogResolver* base)
46 : : {
47 : 19 : base->Resolve = PlusTcpResolver_Resolve;
48 : 19 : }
49 : :
50 : 19 : void SolidSyslogPlusTcpResolver_Cleanup(struct SolidSyslogResolver* base)
51 : : {
52 : : /* Overwrite the abstract base with the shared NullResolver vtable so
53 : : * use-after-destroy resolves cleanly to a failed-lookup error path
54 : : * rather than a NULL-fn-pointer crash. */
55 : 19 : *base = *SolidSyslogNullResolver_Get();
56 : 19 : }
57 : :
58 : 10 : static bool PlusTcpResolver_Resolve(
59 : : struct SolidSyslogResolver* base,
60 : : enum SolidSyslogTransport transport,
61 : : const char* host,
62 : : uint16_t port,
63 : : struct SolidSyslogAddress* result
64 : : )
65 : : {
66 : : (void) base;
67 : :
68 : 10 : struct freertos_addrinfo hints = {0};
69 : 10 : hints.ai_family = FREERTOS_AF_INET4;
70 : 10 : hints.ai_socktype = PlusTcpResolver_MapTransport(transport);
71 : :
72 : 10 : struct freertos_addrinfo* info = NULL;
73 : 10 : bool resolved = false;
74 : :
75 [ + + ]: 10 : if (FreeRTOS_getaddrinfo(host, NULL, &hints, &info) == GETADDRINFO_SUCCESS)
76 : : {
77 : 8 : struct freertos_sockaddr* sockaddr = SolidSyslogPlusTcpAddress_AsFreertosSockaddr(result);
78 : 8 : sockaddr->sin_family = FREERTOS_AF_INET;
79 : 8 : sockaddr->sin_port = (uint16_t) FreeRTOS_htons(port);
80 : 8 : sockaddr->sin_address.ulIP_IPv4 = info->ai_addr->sin_address.ulIP_IPv4;
81 : 8 : FreeRTOS_freeaddrinfo(info);
82 : 8 : resolved = true;
83 : : }
84 : :
85 : 10 : return resolved;
86 : : }
87 : :
88 : 10 : static BaseType_t PlusTcpResolver_MapTransport(enum SolidSyslogTransport transport)
89 : : {
90 : 10 : BaseType_t socktype = FREERTOS_SOCK_DGRAM;
91 : :
92 [ + + ]: 10 : if (transport == SOLIDSYSLOG_TRANSPORT_TCP)
93 : : {
94 : 1 : socktype = FREERTOS_SOCK_STREAM;
95 : : }
96 : :
97 : 10 : return socktype;
98 : : }
|