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 "SolidSyslogPosixAddress.h"
6 : :
7 : : #include <stdbool.h>
8 : : #include <stddef.h>
9 : : #include <stdint.h>
10 : :
11 : : #include "SolidSyslogError.h"
12 : : #include "SolidSyslogErrorCategory.h"
13 : : #include "SolidSyslogPoolAllocator.h"
14 : : #include "SolidSyslogPosixAddressErrors.h"
15 : : #include "SolidSyslogPosixAddressPrivate.h"
16 : : #include "SolidSyslogPrival.h"
17 : : #include "SolidSyslogTunables.h"
18 : :
19 : : struct SolidSyslogAddress;
20 : :
21 : : static inline struct SolidSyslogAddress* PosixAddress_HandleFromIndex(size_t index);
22 : : static inline size_t PosixAddress_IndexFromHandle(const struct SolidSyslogAddress* base);
23 : : static inline void PosixAddress_CleanupAtIndex(size_t index, void* context);
24 : :
25 : : static bool PosixAddress_InUse[SOLIDSYSLOG_ADDRESS_POOL_SIZE];
26 : : static struct SolidSyslogPoolAllocator PosixAddress_Allocator = {PosixAddress_InUse, SOLIDSYSLOG_ADDRESS_POOL_SIZE};
27 : :
28 : 306 : struct SolidSyslogAddress* SolidSyslogPosixAddress_Create(void)
29 : : {
30 : : /* TU-private fallback returned when the pool is exhausted. Sized as
31 : : * a real SolidSyslogPosixAddress so a Resolver overwrite at the
32 : : * exhausted-fallback call site is bounded - same sockaddr_in storage
33 : : * as any pooled slot. */
34 : : static struct SolidSyslogPosixAddress fallback;
35 : :
36 : 306 : size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&PosixAddress_Allocator);
37 : 306 : struct SolidSyslogAddress* handle = (struct SolidSyslogAddress*) &fallback;
38 [ + + ]: 306 : if (SolidSyslogPoolAllocator_IndexIsValid(&PosixAddress_Allocator, index) == true)
39 : : {
40 : 303 : handle = PosixAddress_HandleFromIndex(index);
41 : 303 : SolidSyslogPosixAddress_Initialise(handle);
42 : : }
43 : : else
44 : : {
45 : 3 : PosixAddress_Report(
46 : : SOLIDSYSLOG_POOL_EXHAUSTED_SEVERITY,
47 : : SOLIDSYSLOG_CAT_POOL_EXHAUSTED,
48 : : SOLIDSYSLOG_ADDRESS_ERROR_POOL_EXHAUSTED
49 : : );
50 : : }
51 : 306 : return handle;
52 : : }
53 : :
54 : 934 : static inline struct SolidSyslogAddress* PosixAddress_HandleFromIndex(size_t index)
55 : : {
56 : : static struct SolidSyslogPosixAddress pool[SOLIDSYSLOG_ADDRESS_POOL_SIZE];
57 : 934 : return (struct SolidSyslogAddress*) &pool[index];
58 : : }
59 : :
60 : 309 : void SolidSyslogPosixAddress_Destroy(struct SolidSyslogAddress* base)
61 : : {
62 : 309 : size_t index = PosixAddress_IndexFromHandle(base);
63 : 309 : bool released =
64 [ + + + + ]: 613 : SolidSyslogPoolAllocator_IndexIsValid(&PosixAddress_Allocator, index) &&
65 : 304 : SolidSyslogPoolAllocator_FreeIfInUse(&PosixAddress_Allocator, index, PosixAddress_CleanupAtIndex, NULL);
66 [ + + ]: 309 : if (!released)
67 : : {
68 : 6 : PosixAddress_Report(
69 : : SOLIDSYSLOG_UNKNOWN_DESTROY_SEVERITY,
70 : : SOLIDSYSLOG_CAT_UNKNOWN_DESTROY,
71 : : SOLIDSYSLOG_ADDRESS_ERROR_UNKNOWN_DESTROY
72 : : );
73 : : }
74 : 309 : }
75 : :
76 : 309 : static inline size_t PosixAddress_IndexFromHandle(const struct SolidSyslogAddress* base)
77 : : {
78 : 309 : size_t result = SOLIDSYSLOG_ADDRESS_POOL_SIZE;
79 [ + + ]: 333 : for (size_t poolIndex = 0U; poolIndex < SOLIDSYSLOG_ADDRESS_POOL_SIZE; poolIndex++)
80 : : {
81 [ + + ]: 328 : if (base == PosixAddress_HandleFromIndex(poolIndex))
82 : : {
83 : 304 : result = poolIndex;
84 : 304 : break;
85 : : }
86 : : }
87 : 309 : return result;
88 : : }
89 : :
90 : 303 : static inline void PosixAddress_CleanupAtIndex(size_t index, void* context)
91 : : {
92 : : (void) context;
93 : 303 : SolidSyslogPosixAddress_Cleanup(PosixAddress_HandleFromIndex(index));
94 : 303 : }
|