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 "SolidSyslogPosixResolver.h"
6 : :
7 : : #include <arpa/inet.h>
8 : : #include <netdb.h>
9 : : #include <netinet/in.h>
10 : : #include <stdbool.h>
11 : : #include <stddef.h>
12 : : #include <stdint.h>
13 : : #include <sys/socket.h>
14 : :
15 : : #include "SolidSyslogError.h"
16 : : #include "SolidSyslogPosixResolverErrors.h"
17 : : #include "SolidSyslogPosixResolverPrivate.h"
18 : : #include "SolidSyslogNullResolver.h"
19 : : #include "SolidSyslogPosixAddressPrivate.h"
20 : : #include "SolidSyslogResolverDefinition.h"
21 : : #include "SolidSyslogTransport.h"
22 : :
23 : : const struct SolidSyslogErrorSource SolidSyslogPosixResolverErrorSource = {
24 : : "PosixResolver",
25 : : SolidSyslogResolverErrors_Name
26 : : };
27 : :
28 : : struct SolidSyslogAddress;
29 : :
30 : : enum
31 : : {
32 : : GETADDRINFO_SUCCESS = 0
33 : : };
34 : :
35 : : static bool PosixResolver_Resolve(
36 : : struct SolidSyslogResolver* base,
37 : : enum SolidSyslogTransport transport,
38 : : const char* host,
39 : : uint16_t port,
40 : : struct SolidSyslogAddress* result
41 : : );
42 : : static int PosixResolver_MapTransport(enum SolidSyslogTransport transport);
43 : :
44 : 171 : void SolidSyslogPosixResolver_Initialise(struct SolidSyslogResolver* base)
45 : : {
46 : 171 : base->Resolve = PosixResolver_Resolve;
47 : 171 : }
48 : :
49 : 171 : void SolidSyslogPosixResolver_Cleanup(struct SolidSyslogResolver* base)
50 : : {
51 : : /* Overwrite the abstract base with the shared NullResolver vtable so
52 : : * use-after-destroy is a safe no-op rather than a NULL-fn-pointer crash. */
53 : 171 : *base = *SolidSyslogNullResolver_Get();
54 : 171 : }
55 : :
56 : 148 : static bool PosixResolver_Resolve(
57 : : struct SolidSyslogResolver* base,
58 : : enum SolidSyslogTransport transport,
59 : : const char* host,
60 : : uint16_t port,
61 : : struct SolidSyslogAddress* result
62 : : )
63 : : {
64 : : (void) base;
65 : :
66 : 148 : struct addrinfo hints = {0};
67 : 148 : hints.ai_family = AF_INET;
68 : 148 : hints.ai_socktype = PosixResolver_MapTransport(transport);
69 : :
70 : 148 : struct addrinfo* info = NULL;
71 : 148 : bool resolved = false;
72 : :
73 [ + + ]: 148 : if (getaddrinfo(host, NULL, &hints, &info) == GETADDRINFO_SUCCESS)
74 : : {
75 : 140 : struct sockaddr_in* sin = SolidSyslogPosixAddress_AsSockaddrIn(result);
76 : 140 : *sin = *(struct sockaddr_in*) info->ai_addr;
77 : 140 : sin->sin_port = htons(port);
78 : 140 : freeaddrinfo(info);
79 : 140 : resolved = true;
80 : : }
81 : :
82 : 148 : return resolved;
83 : : }
84 : :
85 : 148 : static int PosixResolver_MapTransport(enum SolidSyslogTransport transport)
86 : : {
87 : 148 : int socktype = SOCK_DGRAM;
88 : :
89 [ + + ]: 148 : if (transport == SOLIDSYSLOG_TRANSPORT_TCP)
90 : : {
91 : 70 : socktype = SOCK_STREAM;
92 : : }
93 : :
94 : 148 : return socktype;
95 : : }
|