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 "SolidSyslogPassthroughBuffer.h"
6 :
7 : #include <stdbool.h>
8 : #include <stddef.h>
9 :
10 : #include "SolidSyslogBufferDefinition.h"
11 : #include "SolidSyslogError.h"
12 : #include "SolidSyslogNullBuffer.h"
13 : #include "SolidSyslogPassthroughBufferErrors.h"
14 : #include "SolidSyslogPassthroughBufferPrivate.h"
15 : #include "SolidSyslogSender.h"
16 :
17 : const struct SolidSyslogErrorSource SolidSyslogPassthroughBufferErrorSource = {
18 : "PassthroughBuffer",
19 : SolidSyslogPassthroughBufferErrors_Name
20 : };
21 :
22 : static bool PassthroughBuffer_Read(struct SolidSyslogBuffer* base, void* data, size_t maxSize, size_t* bytesRead);
23 : static void PassthroughBuffer_Write(struct SolidSyslogBuffer* base, const void* data, size_t size);
24 : static bool PassthroughBuffer_IsFull(struct SolidSyslogBuffer* base);
25 :
26 : static inline struct SolidSyslogPassthroughBuffer* PassthroughBuffer_SelfFromBase(struct SolidSyslogBuffer* base);
27 :
28 133 : void SolidSyslogPassthroughBuffer_Initialise(struct SolidSyslogBuffer* base, struct SolidSyslogSender* sender)
29 : {
30 133 : struct SolidSyslogPassthroughBuffer* self = PassthroughBuffer_SelfFromBase(base);
31 133 : self->Base.Write = PassthroughBuffer_Write;
32 133 : self->Base.Read = PassthroughBuffer_Read;
33 133 : self->Base.IsFull = PassthroughBuffer_IsFull;
34 133 : self->Sender = sender;
35 133 : }
36 :
37 133 : void SolidSyslogPassthroughBuffer_Cleanup(struct SolidSyslogBuffer* base)
38 : {
39 : /* Overwrite the abstract base with the shared NullBuffer vtable so
40 : * use-after-destroy is a safe no-op rather than a NULL-fn-pointer crash. The
41 : * Sender pointer is private to this TU; the next SolidSyslogPassthroughBuffer_Initialise overwrites it. */
42 133 : *base = *SolidSyslogNullBuffer_Get();
43 133 : }
44 :
45 40 : static bool PassthroughBuffer_Read(struct SolidSyslogBuffer* base, void* data, size_t maxSize, size_t* bytesRead)
46 : {
47 : (void) base;
48 : (void) data;
49 : (void) maxSize;
50 40 : *bytesRead = 0;
51 40 : return false;
52 : }
53 :
54 69 : static void PassthroughBuffer_Write(struct SolidSyslogBuffer* base, const void* data, size_t size)
55 : {
56 69 : struct SolidSyslogPassthroughBuffer* self = PassthroughBuffer_SelfFromBase(base);
57 69 : (void) SolidSyslogSender_Send(self->Sender, data, size);
58 69 : }
59 :
60 : /* Nothing is queued, so nothing is ever outrun. */
61 10 : static bool PassthroughBuffer_IsFull(struct SolidSyslogBuffer* base)
62 : {
63 : (void) base;
64 10 : return false;
65 : }
66 :
67 202 : static inline struct SolidSyslogPassthroughBuffer* PassthroughBuffer_SelfFromBase(struct SolidSyslogBuffer* base)
68 : {
69 202 : return (struct SolidSyslogPassthroughBuffer*) base;
70 : }
|