Monado OpenXR Runtime
solarxr_ipc_message.h
1// Copyright 2025, rcelyte
2// SPDX-License-Identifier: BSL-1.0
3
4#pragma once
5#include <endian.h>
6#include <string.h>
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
13{
14 uint32_t length;
15 uint8_t body[];
16};
17
18static inline struct solarxr_ipc_message *
19solarxr_ipc_message_start(uint8_t head[const], const uint8_t *const end)
20{
21 if ((size_t)(end - head) < sizeof(struct solarxr_ipc_message)) {
22 return NULL;
23 }
24
25 struct solarxr_ipc_message *const message = (struct solarxr_ipc_message *)head;
26 message->length = 0;
27 return message;
28}
29
30static inline bool
31solarxr_ipc_message_write(struct solarxr_ipc_message *const message,
32 const uint8_t *const end,
33 const uint8_t data[const],
34 const uint32_t data_len)
35{
36 if (message == NULL) {
37 return false;
38 }
39
40 if ((size_t)(end - message->body) < message->length || end - &message->body[message->length] < data_len) {
41 message->length = UINT32_MAX;
42 return false;
43 }
44
45 memcpy(&message->body[message->length], data, data_len);
46 message->length += data_len;
47 return true;
48}
49
50static inline uint32_t
51solarxr_ipc_message_end(struct solarxr_ipc_message *const message, uint8_t **const end_out)
52{
53 if (message == NULL || message->length >= UINT32_MAX - sizeof(*message)) {
54 return 0;
55 }
56
57 *end_out = &message->body[message->length];
58 const uint32_t length = sizeof(*message) + message->length;
59 message->length = htole32(length);
60 return length;
61}
62
63static inline uint32_t
64solarxr_ipc_message_write_single(uint8_t **const head,
65 const uint8_t *const end,
66 const uint8_t data[const],
67 const uint32_t data_len)
68{
69 struct solarxr_ipc_message *const message = solarxr_ipc_message_start(*head, end);
70 solarxr_ipc_message_write(message, end, data, data_len);
71 return solarxr_ipc_message_end(message, head);
72}
73
74static inline uint32_t
75solarxr_ipc_message_inline(uint8_t data[const], const uint32_t data_len)
76{
77 struct solarxr_ipc_message *const message = solarxr_ipc_message_start(data, &data[data_len]);
78 if (message != NULL) {
79 message->length = &data[data_len] - message->body;
80 }
81 return solarxr_ipc_message_end(message, &(uint8_t *){NULL});
82}
83
84#ifdef __cplusplus
85}
86#endif
Definition: solarxr_ipc_message.h:13