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 "SolidSyslogTimeQualitySd.h"
6 : :
7 : : #include <stdbool.h>
8 : : #include <stdint.h>
9 : :
10 : : #include "SolidSyslogError.h"
11 : : #include "SolidSyslogNullSd.h"
12 : : #include "SolidSyslogSdElement.h"
13 : : #include "SolidSyslogSdValue.h"
14 : : #include "SolidSyslogStructuredDataDefinition.h"
15 : : #include "SolidSyslogTimeQualitySdErrors.h"
16 : : #include "SolidSyslogTimeQualitySdPrivate.h"
17 : :
18 : : const struct SolidSyslogErrorSource SolidSyslogTimeQualitySdErrorSource = {
19 : : "TimeQualitySd",
20 : : SolidSyslogTimeQualitySdErrors_Name
21 : : };
22 : :
23 : : static void TimeQualitySd_Format(struct SolidSyslogStructuredData* base, struct SolidSyslogSdElement* element);
24 : :
25 : : static inline struct SolidSyslogTimeQualitySd* TimeQualitySd_SelfFromBase(struct SolidSyslogStructuredData* base);
26 : :
27 : : static inline bool TimeQualitySd_EmitsSyncAccuracy(const struct SolidSyslogTimeQuality* quality);
28 : :
29 : 70 : void SolidSyslogTimeQualitySd_Initialise(
30 : : struct SolidSyslogStructuredData* base,
31 : : SolidSyslogTimeQualityFunction getTimeQuality
32 : : )
33 : : {
34 : 70 : struct SolidSyslogTimeQualitySd* self = TimeQualitySd_SelfFromBase(base);
35 : 70 : self->Base.Format = TimeQualitySd_Format;
36 : 70 : self->GetTimeQuality = getTimeQuality;
37 : 70 : }
38 : :
39 : 70 : void SolidSyslogTimeQualitySd_Cleanup(struct SolidSyslogStructuredData* base)
40 : : {
41 : : /* Overwrite the abstract base with the shared NullSd vtable so use-after-destroy
42 : : * is a safe no-op. Derived fields are private to this TU; the next SolidSyslogTimeQualitySd_Initialise
43 : : * overwrites them. */
44 : 70 : *base = *SolidSyslogNullSd_Get();
45 : 70 : }
46 : :
47 : 54 : static void TimeQualitySd_Format(struct SolidSyslogStructuredData* base, struct SolidSyslogSdElement* element)
48 : : {
49 : 54 : struct SolidSyslogTimeQualitySd* self = TimeQualitySd_SelfFromBase(base);
50 : 54 : struct SolidSyslogTimeQuality q = {0};
51 : :
52 : 54 : self->GetTimeQuality(&q);
53 : :
54 : 54 : SolidSyslogSdElement_Begin(element, "timeQuality", 0U);
55 [ + + ]: 54 : SolidSyslogSdValue_Uint32(SolidSyslogSdElement_Param(element, "tzKnown"), q.TzKnown ? 1U : 0U);
56 [ + + ]: 54 : SolidSyslogSdValue_Uint32(SolidSyslogSdElement_Param(element, "isSynced"), q.IsSynced ? 1U : 0U);
57 [ + + ]: 54 : if (TimeQualitySd_EmitsSyncAccuracy(&q))
58 : : {
59 : 4 : SolidSyslogSdValue_Uint32(SolidSyslogSdElement_Param(element, "syncAccuracy"), q.SyncAccuracyMicroseconds);
60 : : }
61 : 54 : SolidSyslogSdElement_End(element);
62 : 54 : }
63 : :
64 : : /* RFC 5424 section 7.1.3 forbids syncAccuracy alongside isSynced 0, so an accuracy
65 : : * supplied by a callback reporting an unsynced clock is dropped rather than emitted. */
66 : 54 : static inline bool TimeQualitySd_EmitsSyncAccuracy(const struct SolidSyslogTimeQuality* quality)
67 : : {
68 [ + + + + ]: 54 : return quality->IsSynced && (quality->SyncAccuracyMicroseconds != SOLIDSYSLOG_SYNC_ACCURACY_OMIT);
69 : : }
70 : :
71 : 124 : static inline struct SolidSyslogTimeQualitySd* TimeQualitySd_SelfFromBase(struct SolidSyslogStructuredData* base)
72 : : {
73 : 124 : return (struct SolidSyslogTimeQualitySd*) base;
74 : : }
|