1SD-ID128(3) sd-id128 SD-ID128(3)
2
3
4
6 sd-id128, SD_ID128_ALLF, SD_ID128_CONST_STR, SD_ID128_FORMAT_STR,
7 SD_ID128_FORMAT_VAL, SD_ID128_MAKE, SD_ID128_MAKE_STR,
8 SD_ID128_MAKE_UUID_STR, SD_ID128_NULL, SD_ID128_UUID_FORMAT_STR,
9 sd_id128_equal, sd_id128_in_set, sd_id128_in_set_sentinel,
10 sd_id128_in_setv, sd_id128_is_allf, sd_id128_is_null, sd_id128_t - APIs
11 for processing 128-bit IDs
12
14 #include <systemd/sd-id128.h>
15
16 pkg-config --cflags --libs libsystemd
17
19 sd-id128.h provides APIs to process and generate 128-bit ID values. The
20 128-bit ID values processed and generated by these APIs are a
21 generalization of OSF UUIDs as defined by RFC 4122[1] but use a simpler
22 string format. These functions impose no structure on the used IDs,
23 much unlike OSF UUIDs or Microsoft GUIDs, but are mostly compatible
24 with those types of IDs.
25
26 See sd_id128_to_string(3), sd_id128_randomize(3) and
27 sd_id128_get_machine(3) for more information about the implemented
28 functions.
29
30 A 128-bit ID is implemented as the following union type:
31
32 typedef union sd_id128 {
33 uint8_t bytes[16];
34 uint64_t qwords[2];
35 } sd_id128_t;
36
37 This union type allows accessing the 128-bit ID as 16 separate bytes or
38 two 64-bit words. It is generally safer to access the ID components by
39 their 8-bit array to avoid endianness issues. This union is intended to
40 be passed call-by-value (as opposed to call-by-reference) and may be
41 directly manipulated by clients.
42
43 A couple of macros are defined to denote and decode 128-bit IDs:
44
45 SD_ID128_MAKE() may be used to denote a constant 128-bit ID in source
46 code. A commonly used idiom is to assign a name to a 128-bit ID using
47 this macro:
48
49 #define SD_MESSAGE_COREDUMP SD_ID128_MAKE(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1)
50
51 SD_ID128_NULL may be used to refer to the 128-bit ID consisting of only
52 NUL bytes.
53
54 SD_ID128_MAKE_STR() is similar to SD_ID128_MAKE(), but creates a const
55 char* expression that can be conveniently used in message formats and
56 such:
57
58 #include <stdio.h>
59 #define SD_MESSAGE_COREDUMP_STR SD_ID128_MAKE_STR(fc,2e,22,bc,6e,e6,47,b6,b9,07,29,ab,34,a2,50,b1)
60
61 int main(int argc, char **argv) {
62 puts("Match for coredumps: MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR);
63 }
64
65 SD_ID128_CONST_STR() may be used to convert constant 128-bit IDs into
66 constant strings for output. The following example code will output the
67 string "fc2e22bc6ee647b6b90729ab34a250b1":
68
69 int main(int argc, char *argv[]) {
70 puts("Match for coredumps: %s", SD_ID128_CONST_STR(SD_MESSAGE_COREDUMP));
71 }
72
73 SD_ID128_FORMAT_STR and SD_ID128_FORMAT_VAL() may be used to format a
74 128-bit ID in a printf(3) format string, as shown in the following
75 example:
76
77 int main(int argc, char *argv[]) {
78 sd_id128_t id;
79 id = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
80 printf("The ID encoded in this C file is " SD_ID128_FORMAT_STR ".\n", SD_ID128_FORMAT_VAL(id));
81 return 0;
82 }
83
84 SD_ID128_UUID_FORMAT_STR and SD_ID128_MAKE_UUID_STR() are similar to
85 SD_ID128_FORMAT_STR and SD_ID128_MAKE_STR(), but include separating
86 hyphens to conform to the "canonical representation[2]". They format
87 the string based on RFC4122[1] Variant 1 rules, i.e. converting from
88 Big Endian byte order. This matches behaviour of most other Linux
89 userspace infrastructure. It's probably best to avoid UUIDs of other
90 variants, in order to avoid unnecessary ambiguities. All 128-bit IDs
91 generated by the sd-id128 APIs strictly conform to Variant 1 Version 4
92 UUIDs, as per RFC 4122.
93
94 Use sd_id128_equal() to compare two 128-bit IDs:
95
96 int main(int argc, char *argv[]) {
97 sd_id128_t a, b, c;
98 a = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
99 b = SD_ID128_MAKE(f2,28,88,9c,5f,09,44,15,9d,d7,04,77,58,cb,e7,3e);
100 c = a;
101 assert(sd_id128_equal(a, c));
102 assert(!sd_id128_equal(a, b));
103 return 0;
104 }
105
106 Use sd_id128_is_null() to check if an 128-bit ID consists of only NUL
107 bytes:
108
109 assert(sd_id128_is_null(SD_ID128_NULL));
110
111 Similarly, use sd_id128_is_allf() to check if an 128-bit ID consists of
112 only 0xFF bytes (all bits on):
113
114 assert(sd_id128_is_allf(SD_ID128_ALLF));
115
116 For convenience, sd_id128_in_set() takes a list of IDs and returns true
117 if any are equal to the first argument:
118
119 int main(int argc, char *argv[]) {
120 sd_id12_t a = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
121 assert(sd_id128_in_set(a, a));
122 assert(sd_id128_in_set(a, a, a));
123 assert(!sd_id128_in_set(a));
124 assert(!sd_id128_in_set(a,
125 SD_ID128_MAKE(f2,28,88,9c,5f,09,44,15,9d,d7,04,77,58,cb,e7,3e)
126 SD_ID128_MAKE(2f,88,28,5f,9c,44,09,9d,d7,15,77,04,bc,85,7e,e3)
127 SD_ID128_ALLF));
128 return 0;
129 }
130
131 sd_id128_in_set() is defined as a macro over
132 sd_id128_in_set_sentinel(), adding the SD_ID128_NULL sentinel. Since
133 sd_id128_in_set_sentinel() uses SD_ID128_NULL as the sentinel,
134 SD_ID128_NULL cannot be otherwise placed in the argument list.
135
136 sd_id128_in_setv() is similar to sd_id128_in_set_sentinel(), but takes
137 a struct varargs argument.
138
139 Note that new, randomized IDs may be generated with systemd-id128(1)'s
140 new command.
141
143 These APIs are implemented as a shared library, which can be compiled
144 and linked to with the libsystemd pkg-config(1) file.
145
147 systemd(1), sd_id128_to_string(3), sd_id128_randomize(3),
148 sd_id128_get_machine(3), printf(3), journalctl(1), sd-journal(7), pkg-
149 config(1), machine-id(5)
150
152 1. RFC 4122
153 https://tools.ietf.org/html/rfc4122
154
155 2. canonical representation
156 https://en.wikipedia.org/wiki/Universally_unique_identifier#Format
157
158
159
160systemd 249 SD-ID128(3)