Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Bdd/Targets/Common/BddTargetTlsSender_OpenSsl_PosixTcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ static SolidSyslogPosixTcpStreamStorage underlyingStreamStorage;
static struct SolidSyslogStream* underlyingStream;
static SolidSyslogTlsStreamStorage tlsStreamStorage;
static struct SolidSyslogStream* tlsStream;
static SolidSyslogStreamSenderStorage senderStorage;
static struct SolidSyslogSender* sender;

struct SolidSyslogSender* BddTargetTlsSender_Create(struct SolidSyslogResolver* resolver, bool mtls)
Expand Down Expand Up @@ -46,7 +45,7 @@ struct SolidSyslogSender* BddTargetTlsSender_Create(struct SolidSyslogResolver*
senderConfig.Endpoint = mtls ? BddTargetMtlsConfig_GetEndpoint : BddTargetTlsConfig_GetEndpoint;
senderConfig.EndpointVersion =
mtls ? BddTargetMtlsConfig_GetEndpointVersion : BddTargetTlsConfig_GetEndpointVersion;
sender = SolidSyslogStreamSender_Create(&senderStorage, &senderConfig);
sender = SolidSyslogStreamSender_Create(&senderConfig);

return sender;
}
Expand Down
3 changes: 1 addition & 2 deletions Bdd/Targets/Common/BddTargetTlsSender_OpenSsl_WinsockTcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ static SolidSyslogWinsockTcpStreamStorage underlyingStreamStorage;
static struct SolidSyslogStream* underlyingStream;
static SolidSyslogTlsStreamStorage tlsStreamStorage;
static struct SolidSyslogStream* tlsStream;
static SolidSyslogStreamSenderStorage senderStorage;
static struct SolidSyslogSender* sender;

struct SolidSyslogSender* BddTargetTlsSender_Create(struct SolidSyslogResolver* resolver, bool mtls)
Expand Down Expand Up @@ -46,7 +45,7 @@ struct SolidSyslogSender* BddTargetTlsSender_Create(struct SolidSyslogResolver*
senderConfig.Endpoint = mtls ? BddTargetMtlsConfig_GetEndpoint : BddTargetTlsConfig_GetEndpoint;
senderConfig.EndpointVersion =
mtls ? BddTargetMtlsConfig_GetEndpointVersion : BddTargetTlsConfig_GetEndpointVersion;
sender = SolidSyslogStreamSender_Create(&senderStorage, &senderConfig);
sender = SolidSyslogStreamSender_Create(&senderConfig);

return sender;
}
Expand Down
6 changes: 2 additions & 4 deletions Bdd/Targets/FreeRtos/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ static NetworkEndPoint_t networkEndPoint;
static SolidSyslogFreeRtosStaticResolverStorage resolverStorage;
static SolidSyslogFreeRtosDatagramStorage datagramStorage;
static SolidSyslogFreeRtosTcpStreamStorage tcpStreamStorage;
static SolidSyslogStreamSenderStorage tcpSenderStorage;

/* CircularBuffer + FreeRtosMutex composition for cross-task emission.
* 8 max-sized messages is comfortably above the 3-message BDD scenarios
Expand Down Expand Up @@ -196,7 +195,6 @@ static volatile bool solidSyslogTeardown = false;
static const char STORE_PATH_PREFIX[] = "STORE";

static SolidSyslogFatFsFileStorage storeFileStorage;
static SolidSyslogFileBlockDeviceStorage blockDeviceStorage;
static SolidSyslogBlockStoreStorage blockStoreStorage;

/* FATFS object lives in .bss because f_mount stores its address inside the
Expand Down Expand Up @@ -591,7 +589,7 @@ static bool RebuildWithFileStore(void)
* BlockSequence_Open's f_stat / f_open calls now hit a live filesystem
* via disk_read / disk_write semihosting traps. */
storeFile = SolidSyslogFatFsFile_Create(&storeFileStorage);
storeBlockDevice = SolidSyslogFileBlockDevice_Create(&blockDeviceStorage, storeFile, STORE_PATH_PREFIX);
storeBlockDevice = SolidSyslogFileBlockDevice_Create(storeFile, STORE_PATH_PREFIX);

struct SolidSyslogSecurityPolicy* policy = SolidSyslogCrc16Policy_Create();
struct SolidSyslogBlockStoreConfig storeConfig = {
Expand Down Expand Up @@ -800,7 +798,7 @@ static void InteractiveTask(void* argument)
.Endpoint = GetEndpoint,
.EndpointVersion = GetEndpointVersion,
};
tcpSender = SolidSyslogStreamSender_Create(&tcpSenderStorage, &tcpConfig);
tcpSender = SolidSyslogStreamSender_Create(&tcpConfig);

/* SwitchingSender lets `set transport <udp|tcp>` flip the active transport
* at runtime. Default to UDP so existing UDP-tagged scenarios stay green;
Expand Down
6 changes: 2 additions & 4 deletions Bdd/Targets/Linux/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ static struct SolidSyslogFile* storeFile;
static struct SolidSyslogBlockDevice* storeBlockDevice;
static SolidSyslogPosixTcpStreamStorage plainTcpStreamStorage;
static struct SolidSyslogStream* plainTcpStream;
static SolidSyslogStreamSenderStorage plainTcpSenderStorage;
static struct SolidSyslogSender* plainTcpSender;
static struct SolidSyslogSender* udpSender;
static struct SolidSyslogSender* switchingSender;
Expand Down Expand Up @@ -93,7 +92,7 @@ static struct SolidSyslogSender* CreateSender(const struct BddTargetOptions* opt
tcpConfig.Stream = plainTcpStream;
tcpConfig.Endpoint = BddTargetTcpConfig_GetEndpoint;
tcpConfig.EndpointVersion = BddTargetTcpConfig_GetEndpointVersion;
plainTcpSender = SolidSyslogStreamSender_Create(&plainTcpSenderStorage, &tcpConfig);
plainTcpSender = SolidSyslogStreamSender_Create(&tcpConfig);

struct SolidSyslogSender* tlsSender = BddTargetTlsSender_Create(resolver, mtlsModeActive);

Expand Down Expand Up @@ -161,8 +160,7 @@ static struct SolidSyslogStore* CreateStore(const struct BddTargetOptions* optio
static SolidSyslogPosixFileStorage fileStorage;
storeFile = SolidSyslogPosixFile_Create(&fileStorage);

static SolidSyslogFileBlockDeviceStorage blockDeviceStorage;
storeBlockDevice = SolidSyslogFileBlockDevice_Create(&blockDeviceStorage, storeFile, STORE_PATH_PREFIX);
storeBlockDevice = SolidSyslogFileBlockDevice_Create(storeFile, STORE_PATH_PREFIX);

static size_t capacityThreshold;
capacityThreshold = options->CapacityThreshold;
Expand Down
6 changes: 2 additions & 4 deletions Bdd/Targets/Windows/BddTargetWindows.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ static const char* const STORE_PATH_PREFIX = "Bdd/output/STORE";
static const char* const THRESHOLD_MARKER_PATH = "Bdd/output/solidsyslog_threshold_marker.log";

static SolidSyslogWinsockTcpStreamStorage tcpStreamStorage;
static SolidSyslogStreamSenderStorage tcpSenderStorage;
static uint8_t bufferRing[SOLIDSYSLOG_CIRCULAR_BUFFER_RING_BYTES(BDD_TARGET_BUFFER_MESSAGES)];
static SolidSyslogWindowsMutexStorage mutexStorage;
static SolidSyslogWindowsAtomicCounterStorage counterStorage;
Expand Down Expand Up @@ -196,7 +195,7 @@ static struct SolidSyslogSender* CreateSender(const struct BddTargetWindowsOptio
tcpConfig.Stream = plainTcpStream;
tcpConfig.Endpoint = GetEndpoint;
tcpConfig.EndpointVersion = GetEndpointVersion;
plainTcpSender = SolidSyslogStreamSender_Create(&tcpSenderStorage, &tcpConfig);
plainTcpSender = SolidSyslogStreamSender_Create(&tcpConfig);

struct SolidSyslogSender* tlsSender = BddTargetTlsSender_Create(resolver, mtlsModeActive);

Expand Down Expand Up @@ -235,8 +234,7 @@ static struct SolidSyslogStore* CreateStore(const struct BddTargetWindowsOptions
static SolidSyslogWindowsFileStorage fileStorage;
storeFile = SolidSyslogWindowsFile_Create(&fileStorage);

static SolidSyslogFileBlockDeviceStorage blockDeviceStorage;
storeBlockDevice = SolidSyslogFileBlockDevice_Create(&blockDeviceStorage, storeFile, STORE_PATH_PREFIX);
storeBlockDevice = SolidSyslogFileBlockDevice_Create(storeFile, STORE_PATH_PREFIX);

static size_t capacityThreshold;
capacityThreshold = options->CapacityThreshold;
Expand Down
12 changes: 7 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -333,16 +333,17 @@ live under `Core/Interface/`; platform-specific helpers (the `SolidSyslogPosix*`
| `SolidSyslogStreamDefinition.h` | Stream implementors (extension point) | `SolidSyslogStream` vtable struct (`Open`, `Send`, `Read`, `Close`) |
| `SolidSyslogFreeRtosTcpStream.h` | System setup code on FreeRTOS targets using FreeRTOS-Plus-TCP for TCP | `SolidSyslogFreeRtosTcpStreamStorage`, `SOLIDSYSLOG_FREERTOSTCPSTREAM_SIZE`, `SolidSyslogFreeRtosTcpStream_Create(storage)`, `_Destroy(stream)` (wraps `FreeRTOS_socket` / `FreeRTOS_connect` / `FreeRTOS_send` / `FreeRTOS_recv` / `FreeRTOS_closesocket`; bounded blocking connect via `SO_SNDTIMEO=200ms`, cleared post-connect so Send/Read are non-blocking) |
| `SolidSyslogUdpSender.h` | System setup code using UDP transport | `SolidSyslogUdpSenderConfig` (resolver, datagram, endpoint, endpointVersion), `SolidSyslogUdpSender_Create(config)`, `_Destroy(sender)`. Instance struct lives in a library-internal static pool (E11); `_Destroy` takes the handle returned by `_Create`. Pool-exhaustion and bad-config fallback is the shared `SolidSyslogNullSender`. |
| `SolidSyslogStreamSender.h` | System setup code using octet-framed transport (RFC 6587) over any Stream — `SolidSyslogPosixTcpStream` (POSIX TCP), `SolidSyslogWinsockTcpStream` (Windows TCP), `SolidSyslogFreeRtosTcpStream` (FreeRTOS-Plus-TCP), `SolidSyslogTlsStream` (TLS; OpenSSL reference integration), or a caller-supplied Stream backend | `SolidSyslogStreamSenderConfig` (resolver, stream, endpoint, endpointVersion), `SolidSyslogStreamSender_Create`, `_Destroy` |
| `SolidSyslogStreamSender.h` | System setup code using octet-framed transport (RFC 6587) over any Stream — `SolidSyslogPosixTcpStream` (POSIX TCP), `SolidSyslogWinsockTcpStream` (Windows TCP), `SolidSyslogFreeRtosTcpStream` (FreeRTOS-Plus-TCP), `SolidSyslogTlsStream` (TLS; OpenSSL reference integration), or a caller-supplied Stream backend | `SolidSyslogStreamSenderConfig` (resolver, stream, endpoint, endpointVersion), `SolidSyslogStreamSender_Create(config)`, `_Destroy(base)`. Instance struct lives in a library-internal static pool (E11); `_Destroy` takes the handle returned by `_Create`. Pool exhaustion resolves to the shared `SolidSyslogNullSender`. |
| `SolidSyslogSwitchingSender.h` | System setup code composing multiple inner senders | `SolidSyslogSwitchingSenderConfig` (senders, senderCount, selector), `SolidSyslogSwitchingSenderSelector`, `SolidSyslogSwitchingSender_Create(config)`, `_Destroy(sender)`. Instance struct lives in a library-internal static pool (E11); `_Destroy` takes the handle returned by `_Create`. Out-of-range selector and pool exhaustion both resolve to the shared `SolidSyslogNullSender`. |
| `SolidSyslogBuffer.h` | Library internals consuming a buffer (Service algorithm) | `SolidSyslogBuffer_Write`, `_Read` |
| `SolidSyslogNullBuffer.h` | Any code installing a no-op buffer slot (Read returns `false`/`bytesRead=0`; Write swallows the record) | `SolidSyslogNullBuffer_Get` |
| `SolidSyslogBufferDefinition.h` | Buffer implementors (extension point) | `SolidSyslogBuffer` vtable struct |
| `SolidSyslogPassthroughBuffer.h` | System setup code (single-task, no buffering) | `SolidSyslogPassthroughBuffer_Create(sender)`, `_Destroy(buffer)`. Instance struct lives in a library-internal static pool (E11); `_Destroy` takes the handle returned by `_Create` to release the slot. |
| `SolidSyslogPassthroughBuffer.h` | System setup code (single-task, no buffering) | `SolidSyslogPassthroughBuffer_Create(sender)`, `_Destroy(buffer)`. Instance struct lives in a library-internal static pool (E11); `_Destroy` takes the handle returned by `_Create` to release the slot. Pool exhaustion resolves to the shared `SolidSyslogNullBuffer`. |
| `SolidSyslogPosixMessageQueueBuffer.h` | System setup code using POSIX message queue buffer | `SolidSyslogPosixMessageQueueBuffer_Create`, `_Destroy` |
| `SolidSyslogCircularBuffer.h` | System setup code using an in-memory ring buffer (bare-metal / RTOS / Windows) | `SOLIDSYSLOG_CIRCULAR_BUFFER_HEADER_BYTES`, `SOLIDSYSLOG_CIRCULAR_BUFFER_RING_BYTES(maxMessages)` (friendly: N max-sized messages → ring bytes), `SolidSyslogCircularBuffer_Create(mutex, ring, ringBytes)`, `_Destroy(buffer)` (uint16-length-prefixed records, drop-newest on overflow, no-split wrap, mutex-injected synchronization). Instance struct lives in a library-internal static pool (E11); caller supplies the ring memory only. |
| `SolidSyslogCircularBuffer.h` | System setup code using an in-memory ring buffer (bare-metal / RTOS / Windows) | `SOLIDSYSLOG_CIRCULAR_BUFFER_HEADER_BYTES`, `SOLIDSYSLOG_CIRCULAR_BUFFER_RING_BYTES(maxMessages)` (friendly: N max-sized messages → ring bytes), `SolidSyslogCircularBuffer_Create(mutex, ring, ringBytes)`, `_Destroy(buffer)` (uint16-length-prefixed records, drop-newest on overflow, no-split wrap, mutex-injected synchronisation). Instance struct lives in a library-internal static pool (E11); caller supplies the ring memory only. Pool exhaustion resolves to the shared `SolidSyslogNullBuffer`. |
| `SolidSyslogMutex.h` | Any code holding a mutex handle | `SolidSyslogMutex_Lock`, `_Unlock` |
| `SolidSyslogMutexDefinition.h` | Mutex implementors (extension point) | `SolidSyslogMutex` vtable struct (`Lock`, `Unlock`) |
| `SolidSyslogNullMutex.h` | System setup code (single-task, no synchronization) | `SolidSyslogNullMutex_Create`, `_Destroy` |
| `SolidSyslogNullMutex.h` | System setup code (single-task, no synchronisation) | `SolidSyslogNullMutex_Create`, `_Destroy` |
| `SolidSyslogPosixMutex.h` | System setup code on POSIX targets needing thread-safe buffering | `SolidSyslogPosixMutexStorage`, `SOLIDSYSLOG_POSIXMUTEX_SIZE`, `SolidSyslogPosixMutex_Create(storage)`, `_Destroy(mutex)` (wraps `pthread_mutex_t`) |
| `SolidSyslogWindowsMutex.h` | System setup code on Windows targets needing thread-safe buffering | `SolidSyslogWindowsMutexStorage`, `SOLIDSYSLOG_WINDOWSMUTEX_SIZE`, `SolidSyslogWindowsMutex_Create(storage)`, `_Destroy(mutex)` (wraps `CRITICAL_SECTION`) |
| `SolidSyslogFreeRtosMutex.h` | System setup code on FreeRTOS targets needing thread-safe buffering | `SolidSyslogFreeRtosMutexStorage`, `SOLIDSYSLOG_FREERTOSMUTEX_SIZE`, `SolidSyslogFreeRtosMutex_Create(storage)`, `_Destroy(mutex)` (wraps `xSemaphoreCreateMutexStatic` — caller's `StaticSemaphore_t` lives inside the injected storage; requires `configSUPPORT_STATIC_ALLOCATION=1`) |
Expand All @@ -352,8 +353,9 @@ live under `Core/Interface/`; platform-specific helpers (the `SolidSyslogPosix*`
| `SolidSyslogFileDefinition.h` | File implementors (extension point) | `SolidSyslogFile` vtable struct |
| `SolidSyslogFile.h` | Any code using the file abstraction | `SolidSyslogFile_Open`, `_Close`, `_IsOpen`, `_Read`, `_Write`, `_SeekTo`, `_Size`, `_Truncate` |
| `SolidSyslogBlockDevice.h` | Library internals consuming a block device (BlockSequence inside BlockStore) and integrator code addressing blocks directly | `SolidSyslogBlockDevice_Acquire`, `_Dispose`, `_Exists`, `_Read`, `_Append`, `_WriteAt`, `_Size` (block-indexed I/O; Acquire makes a block ready for fresh writes, Dispose releases it) |
| `SolidSyslogNullBlockDevice.h` | Any code installing a no-op block device slot (every method returns `false` / `0` — disk doesn't exist) | `SolidSyslogNullBlockDevice_Get` |
| `SolidSyslogBlockDeviceDefinition.h` | BlockDevice implementors (extension point) | `SolidSyslogBlockDevice` vtable struct (`Acquire`, `Dispose`, `Exists`, `Read`, `Append`, `WriteAt`, `Size`) |
| `SolidSyslogFileBlockDevice.h` | System setup code wiring a file-backed block device | `SolidSyslogFileBlockDeviceStorage`, `SOLIDSYSLOG_FILEBLOCKDEVICE_STORAGE_SIZE`, `SolidSyslogFileBlockDevice_Create(storage, readFile, writeFile, pathPrefix)` (sequence-numbered filenames `<prefix><NN>.log`, two cached file handles), `_Destroy(device)` |
| `SolidSyslogFileBlockDevice.h` | System setup code wiring a file-backed block device | `SolidSyslogFileBlockDevice_Create(file, pathPrefix)` (sequence-numbered filenames `<prefix><NN>.log`, one cached file handle), `_Destroy(base)`. Instance struct lives in a library-internal static pool (E11); `_Destroy` takes the handle returned by `_Create`. Pool exhaustion resolves to the shared `SolidSyslogNullBlockDevice`. |
| `SolidSyslogBlockStore.h` | System setup code using a BlockDevice-backed store | `SolidSyslogBlockStoreStorage`, `SOLIDSYSLOG_BLOCKSTORE_STORAGE_SIZE`, `SolidSyslogBlockStoreConfig` (with `blockDevice`, `storeFullContext`, `getCapacityThreshold`, `onThresholdCrossed`, `thresholdContext`), `SolidSyslogBlockStore_Create(storage, config)`, `_Destroy(store)`, `SolidSyslogDiscardPolicy` (`SolidSyslogDiscardPolicy_Oldest` / `_Newest` / `_Halt`), `SolidSyslogStoreFullCallback(void* context)`, `SolidSyslogStoreThresholdFunction(void* context)` (returns threshold in bytes; 0 disables; queried each Write), `SolidSyslogStoreThresholdCallback(void* context)` (edge-triggered; PassthroughBuffer recursion gotcha — see header) |
| `SolidSyslogSecurityPolicyDefinition.h` | SecurityPolicy implementors (extension point) | `SolidSyslogSecurityPolicy` vtable struct, `SOLIDSYSLOG_MAX_INTEGRITY_SIZE` |
| `SolidSyslogNullSecurityPolicy.h` | System setup code (no integrity checking) | `SolidSyslogNullSecurityPolicy_Get` |
Expand Down
13 changes: 0 additions & 13 deletions Core/Interface/SolidSyslogFileBlockDevice.h
Original file line number Diff line number Diff line change
@@ -1,32 +1,19 @@
#ifndef SOLIDSYSLOGFILEBLOCKDEVICE_H
#define SOLIDSYSLOGFILEBLOCKDEVICE_H

#include <stdint.h>

#include "ExternC.h"

struct SolidSyslogBlockDevice;
struct SolidSyslogFile;

EXTERN_C_BEGIN

enum
{
SOLIDSYSLOG_FILE_BLOCK_DEVICE_STORAGE_SIZE = sizeof(intptr_t) * 16U
};

typedef struct
{
intptr_t slots[(SOLIDSYSLOG_FILE_BLOCK_DEVICE_STORAGE_SIZE + sizeof(intptr_t) - 1U) / sizeof(intptr_t)];
} SolidSyslogFileBlockDeviceStorage;

/* The driver caches at most one open SolidSyslogFile handle, re-pointed only when the
* targeted blockIndex changes — same-block runs of Read and Append (and Append-then-WriteAt
* during MarkSent) share the handle. The single-handle-per-path invariant the storage layer
* depends on (E27 #345 / S27.01) is enforced by construction here: the driver physically
* holds one file. */
struct SolidSyslogBlockDevice* SolidSyslogFileBlockDevice_Create(
SolidSyslogFileBlockDeviceStorage * storage,
struct SolidSyslogFile * file,
const char* pathPrefix
);
Expand Down
14 changes: 14 additions & 0 deletions Core/Interface/SolidSyslogNullBlockDevice.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef SOLIDSYSLOGNULLBLOCKDEVICE_H
#define SOLIDSYSLOGNULLBLOCKDEVICE_H

#include "ExternC.h"

EXTERN_C_BEGIN

struct SolidSyslogBlockDevice;

struct SolidSyslogBlockDevice* SolidSyslogNullBlockDevice_Get(void);

EXTERN_C_END

#endif /* SOLIDSYSLOGNULLBLOCKDEVICE_H */
14 changes: 14 additions & 0 deletions Core/Interface/SolidSyslogNullBuffer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef SOLIDSYSLOGNULLBUFFER_H
#define SOLIDSYSLOGNULLBUFFER_H

#include "ExternC.h"

EXTERN_C_BEGIN

struct SolidSyslogBuffer;

struct SolidSyslogBuffer* SolidSyslogNullBuffer_Get(void);

EXTERN_C_END

#endif /* SOLIDSYSLOGNULLBUFFER_H */
17 changes: 1 addition & 16 deletions Core/Interface/SolidSyslogStreamSender.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
#ifndef SOLIDSYSLOG_STREAM_SENDER_H
#define SOLIDSYSLOG_STREAM_SENDER_H

#include <stdint.h>

#include "SolidSyslogEndpoint.h"
#include "ExternC.h"

Expand All @@ -18,20 +16,7 @@ EXTERN_C_BEGIN
SolidSyslogEndpointVersionFunction EndpointVersion; /* polled cheaply on every Send for stale check */
};

enum
{
SOLIDSYSLOG_STREAM_SENDER_SIZE = (sizeof(intptr_t) * 7U) + sizeof(uint32_t)
};

typedef struct
{
intptr_t slots[(SOLIDSYSLOG_STREAM_SENDER_SIZE + sizeof(intptr_t) - 1U) / sizeof(intptr_t)];
} SolidSyslogStreamSenderStorage;

struct SolidSyslogSender* SolidSyslogStreamSender_Create(
SolidSyslogStreamSenderStorage * storage,
const struct SolidSyslogStreamSenderConfig* config
);
struct SolidSyslogSender* SolidSyslogStreamSender_Create(const struct SolidSyslogStreamSenderConfig* config);
void SolidSyslogStreamSender_Destroy(struct SolidSyslogSender * base);

EXTERN_C_END
Expand Down
Loading
Loading