libsood

Zig library for Roon Core discovery message, with C-compatible API and WebAssembly.

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114
  115. 115
  116. 116
  117. 117
  118. 118
  119. 119
  120. 120
  121. 121
  122. 122
  123. 123
  124. 124
  125. 125
  126. 126
  127. 127
  128. 128
  129. 129
  130. 130
  131. 131
  132. 132
  133. 133
  134. 134
  135. 135
  136. 136
  137. 137
  138. 138
  139. 139
  140. 140
  141. 141
  142. 142
.\" Copyright 2025 Shota FUJI
.\"
.\" Licensed under the Zero-Clause BSD License or the Apache License, Version 2.0, at your option.
.\" You may not use, copy, modify, or distribute this file except according to those terms. You can
.\" find a copy of the Zero-Clause BSD License at LICENSES/0BSD.txt, and a copy of the Apache License,
.\" Version 2.0 at LICENSES/Apache-2.0.txt. You may also obtain a copy of the Apache License, Version
.\" 2.0 at <https://www.apache.org/licenses/LICENSE-2.0>
.\"
.\" SPDX-License-Identifier: 0BSD OR Apache-2.0
.TH sood 3


.SH NAME
sood \- SOOD message used for Roon service discovery


.SH SYNOPSIS
.nf
.B #include <sood.h>
.fi


.SH DESCRIPTION
SOOD message is a UDP packet data format used for Roon Server discovery.
This
.B libsood
library provides parser functions and constants for the service discovery
process.
.PP
This library does NOT provide functions performing I/O. User is
responsible for sending and/or receiving UDP packet.

.SS Strings
Otherwise noted, this library uses an address and length to represent
strings, named "*_ptr" and "*_len" correspondingly.
Characters are encoded as UTF\-8.

.SS Allocation
This library does not allocate memory. User is responsible for allocating
a struct and pass an address of the struct via function parameter, usually
named
.B dst\fR.

.SS Bit size
Platforms having non-8bit byte (char) are not supported.


.SH RETURN VALUE
Functions provided by this library returns a shared enum as result codes.

.SS SOOD_OK
Procedure successfully completed and destination pointer is populated if
any.

.SS SOOD_ITERATOR_DONE
Only
.BR sood_message_iter_next (3)
returns this code.
Iterator reached at the end of a message and no more bytes to read.

.SS SOOD_ERR_PARSE_HEADER_SIZE_MISMATCH
Aborted header parsing due to received byte size being shorter than that
of SOOD message header.

.SS SOOD_ERR_PARSE_INVALID_SIGNATURE
Aborted header parsing due to the received bytes does not starts with SOOD
message signature (magic bytes).

.SS SOOD_ERR_PARSE_EMPTY_KEY
Aborted body parsing due to size of key is 0. libsood currently rejects
empty keys.

.SS SOOD_ERR_PARSE_KEY_SIZE_MISMATCH
Aborted body parsing due to message bytes ends at middle of a key field.

.SS SOOD_ERR_PARSE_NON_UTF8_KEY
Aborted body parsing due to message has a key that is not a valid UTF-8
string.

.SS SOOD_ERR_PARSE_VALUE_SIZE_CORRUPTED
Aborted body parsing due to message bytes ends at middle of value size
field. (A value size field is unsigned 16bit integer.)

.SS SOOD_ERR_PARSE_VALUE_SIZE_MISMATCH
Aborted body parsing due to message bytes ends at middle of a value field.

.SS SOOD_ERR_PARSE_NON_UTF8_VALUE
Aborted body parsing due to message has a value that is not a valid UTF-8
string. As SOOD message is schema\-less key\-value, every value has to be a
valid UTF-8 string.

.SS SOOD_ERR_VALIDATE_MISSING_REQUIRED_PROPERTY
Aborted response message parsing due to message does not have expected
key.

.SS SOOD_ERR_VALIDATE_UNEXPECTED_VALUE_TYPE
Aborted response message parsing due to fields have unexpected format,
such as port number field having non\-decimal string.

.SS SOOD_ERR_VALIDATE_UNEXPECTED_MESSAGE_KIND
Aborted response message parsing due to message type field is not set to
.BR R .


.SH CONSTANTS

.SS SOOD_DISCOVERY_QUERY_PREBUILT
A SOOD message ready to send via IP multicast or broadcast. This bytes
contains a NUL character: do not treat as C\-strings.

.nf
.RS
#include <sys/socket.h>

sendto (sockfd,
       SOOD_DISCOVERY_QUERY_PREBUILT,
       sizeof(SOOD_DISCOVERY_QUERY_PREBUILT),
       0, &multicast_address,
       sizeof(multicast_address));
.RE
.fi

.SS SOOD_DISCOVERY_MULTICAST_IPV4_ADDRESS_BE
IPv4 multicast address Roon Server listens to. This is in network byte
order.

.SS SOOD_DISCOVERY_MULTICAST_IPV4_ADDRESS
Same as
.BR SOOD_DISCOVERY_MULTICAST_IPV4_ADDRESS_BE ,
but in a byte array.

.SS SOOD_DISCOVERY_SERVER_UDP_PORT
UDP port for sending IPv4 multicast and broadcast to.


.SH SEE ALSO

.BR sood_parse (3),
.BR sood_get_result_string (3),
.BR sood_message_iterator (3),
.BR sood_message_iter_next (3),
.BR sood_discovery_response_parse (3)