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 "lwip/opt.h"
6 : :
7 : : #if LWIP_SOCKET && LWIP_DNS
8 : :
9 : : #include "SolidSyslogLwipSocketResolver.h"
10 : :
11 : : #include <stdbool.h>
12 : : #include <stddef.h>
13 : : #include <stdint.h>
14 : :
15 : : #include "SolidSyslogError.h"
16 : : #include "SolidSyslogErrorCategory.h"
17 : : #include "SolidSyslogLwipSocketResolverErrors.h"
18 : : #include "SolidSyslogLwipSocketResolverPrivate.h"
19 : : #include "SolidSyslogNullResolver.h"
20 : : #include "SolidSyslogPoolAllocator.h"
21 : : #include "SolidSyslogPrival.h"
22 : : #include "SolidSyslogTunables.h"
23 : :
24 : : struct SolidSyslogResolver;
25 : :
26 : : static inline size_t LwipSocketResolver_IndexFromHandle(const struct SolidSyslogResolver* base);
27 : : static inline void LwipSocketResolver_CleanupAtIndex(size_t index, void* context);
28 : :
29 : : static bool LwipSocketResolver_InUse[SOLIDSYSLOG_RESOLVER_POOL_SIZE];
30 : : static struct SolidSyslogLwipSocketResolver LwipSocketResolver_Pool[SOLIDSYSLOG_RESOLVER_POOL_SIZE];
31 : : static struct SolidSyslogPoolAllocator LwipSocketResolver_Allocator = {
32 : : LwipSocketResolver_InUse,
33 : : SOLIDSYSLOG_RESOLVER_POOL_SIZE
34 : : };
35 : :
36 : 22 : struct SolidSyslogResolver* SolidSyslogLwipSocketResolver_Create(void)
37 : : {
38 : 22 : size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&LwipSocketResolver_Allocator);
39 : 22 : struct SolidSyslogResolver* handle = SolidSyslogNullResolver_Get();
40 [ + + ]: 22 : if (SolidSyslogPoolAllocator_IndexIsValid(&LwipSocketResolver_Allocator, index) == true)
41 : : {
42 : 19 : SolidSyslogLwipSocketResolver_Initialise(&LwipSocketResolver_Pool[index].Base);
43 : 19 : handle = &LwipSocketResolver_Pool[index].Base;
44 : : }
45 : : else
46 : : {
47 : 3 : LwipSocketResolver_Report(
48 : : SOLIDSYSLOG_POOL_EXHAUSTED_SEVERITY,
49 : : SOLIDSYSLOG_CAT_POOL_EXHAUSTED,
50 : : SOLIDSYSLOG_RESOLVER_ERROR_POOL_EXHAUSTED
51 : : );
52 : : }
53 : 22 : return handle;
54 : : }
55 : :
56 : 22 : void SolidSyslogLwipSocketResolver_Destroy(struct SolidSyslogResolver* base)
57 : : {
58 : 22 : size_t index = LwipSocketResolver_IndexFromHandle(base);
59 [ + + + + ]: 42 : bool released = SolidSyslogPoolAllocator_IndexIsValid(&LwipSocketResolver_Allocator, index) &&
60 : 20 : SolidSyslogPoolAllocator_FreeIfInUse(
61 : : &LwipSocketResolver_Allocator,
62 : : index,
63 : : LwipSocketResolver_CleanupAtIndex,
64 : : NULL
65 : : );
66 [ + + ]: 22 : if (!released)
67 : : {
68 : 3 : LwipSocketResolver_Report(
69 : : SOLIDSYSLOG_UNKNOWN_DESTROY_SEVERITY,
70 : : SOLIDSYSLOG_CAT_UNKNOWN_DESTROY,
71 : : SOLIDSYSLOG_RESOLVER_ERROR_UNKNOWN_DESTROY
72 : : );
73 : : }
74 : 22 : }
75 : :
76 : 22 : static inline size_t LwipSocketResolver_IndexFromHandle(const struct SolidSyslogResolver* base)
77 : : {
78 : 22 : size_t result = SOLIDSYSLOG_RESOLVER_POOL_SIZE;
79 [ + + ]: 24 : for (size_t poolIndex = 0U; poolIndex < SOLIDSYSLOG_RESOLVER_POOL_SIZE; poolIndex++)
80 : : {
81 [ + + ]: 22 : if (base == &LwipSocketResolver_Pool[poolIndex].Base)
82 : : {
83 : 20 : result = poolIndex;
84 : 20 : break;
85 : : }
86 : : }
87 : 22 : return result;
88 : : }
89 : :
90 : 19 : static inline void LwipSocketResolver_CleanupAtIndex(size_t index, void* context)
91 : : {
92 : : (void) context;
93 : 19 : SolidSyslogLwipSocketResolver_Cleanup(&LwipSocketResolver_Pool[index].Base);
94 : 19 : }
95 : :
96 : : #else
97 : :
98 : : /* ISO C forbids an empty translation unit. */
99 : : typedef int LwipSocketResolverStatic_EmptyTranslationUnit;
100 : :
101 : : #endif /* LWIP_SOCKET && LWIP_DNS */
|