1SD-ID128(3)                        sd-id128                        SD-ID128(3)
2
3
4

NAME

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

SYNOPSIS

14       #include <systemd/sd-id128.h>
15
16       pkg-config --cflags --libs libsystemd
17

DESCRIPTION

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 (i.e. all bits off).
53
54       SD_ID128_ALLF may be used to refer to the 128-bit ID consisting of only
55       0xFF bytes (i.e. all bits on).
56
57       SD_ID128_MAKE_STR() is similar to SD_ID128_MAKE(), but creates a const
58       char* expression that can be conveniently used in message formats and
59       such:
60
61           #include <stdio.h>
62           #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)
63
64           int main(int argc, char **argv) {
65             puts("Match for coredumps: MESSAGE_ID=" SD_MESSAGE_COREDUMP_STR);
66           }
67
68       SD_ID128_CONST_STR() may be used to convert constant 128-bit IDs into
69       constant strings for output. The following example code will output the
70       string "fc2e22bc6ee647b6b90729ab34a250b1":
71
72           int main(int argc, char *argv[]) {
73             puts("Match for coredumps: %s", SD_ID128_CONST_STR(SD_MESSAGE_COREDUMP));
74           }
75
76       SD_ID128_FORMAT_STR and SD_ID128_FORMAT_VAL() may be used to format a
77       128-bit ID in a printf(3) format string, as shown in the following
78       example:
79
80           int main(int argc, char *argv[]) {
81             sd_id128_t id;
82             id = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
83             printf("The ID encoded in this C file is " SD_ID128_FORMAT_STR ".\n", SD_ID128_FORMAT_VAL(id));
84             return 0;
85           }
86
87       SD_ID128_UUID_FORMAT_STR and SD_ID128_MAKE_UUID_STR() are similar to
88       SD_ID128_FORMAT_STR and SD_ID128_MAKE_STR(), but include separating
89       hyphens to conform to the "canonical representation[2]". They format
90       the string based on RFC4122[1] Variant 1 rules, i.e. converting from
91       Big Endian byte order. This matches behaviour of most other Linux
92       userspace infrastructure. It's probably best to avoid UUIDs of other
93       variants, in order to avoid unnecessary ambiguities. All 128-bit IDs
94       generated by the sd-id128 APIs strictly conform to Variant 1 Version 4
95       UUIDs, as per RFC 4122.
96
97       Use sd_id128_equal() to compare two 128-bit IDs:
98
99           int main(int argc, char *argv[]) {
100             sd_id128_t a, b, c;
101             a = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
102             b = SD_ID128_MAKE(f2,28,88,9c,5f,09,44,15,9d,d7,04,77,58,cb,e7,3e);
103             c = a;
104             assert(sd_id128_equal(a, c));
105             assert(!sd_id128_equal(a, b));
106             return 0;
107           }
108
109       Use sd_id128_is_null() to check if an 128-bit ID consists of only NUL
110       bytes:
111
112           assert(sd_id128_is_null(SD_ID128_NULL));
113
114       Similarly, use sd_id128_is_allf() to check if an 128-bit ID consists of
115       only 0xFF bytes (all bits on):
116
117           assert(sd_id128_is_allf(SD_ID128_ALLF));
118
119       For convenience, sd_id128_in_set() takes a list of IDs and returns true
120       if any are equal to the first argument:
121
122           int main(int argc, char *argv[]) {
123             sd_id12_t a = SD_ID128_MAKE(ee,89,be,71,bd,6e,43,d6,91,e6,c5,5d,eb,03,02,07);
124             assert(sd_id128_in_set(a, a));
125             assert(sd_id128_in_set(a, a, a));
126             assert(!sd_id128_in_set(a));
127             assert(!sd_id128_in_set(a,
128                                     SD_ID128_MAKE(f2,28,88,9c,5f,09,44,15,9d,d7,04,77,58,cb,e7,3e)
129                                     SD_ID128_MAKE(2f,88,28,5f,9c,44,09,9d,d7,15,77,04,bc,85,7e,e3)
130                                     SD_ID128_ALLF));
131             return 0;
132           }
133
134       sd_id128_in_set() is defined as a macro over
135       sd_id128_in_set_sentinel(), adding the SD_ID128_NULL sentinel. Since
136       sd_id128_in_set_sentinel() uses SD_ID128_NULL as the sentinel,
137       SD_ID128_NULL cannot be otherwise placed in the argument list.
138
139       sd_id128_in_setv() is similar to sd_id128_in_set_sentinel(), but takes
140       a struct varargs argument.
141
142       Note that new, randomized IDs may be generated with systemd-id128(1)'s
143       new command.
144

NOTES

146       These APIs are implemented as a shared library, which can be compiled
147       and linked to with the libsystemd pkg-config(1) file.
148

SEE ALSO

150       systemd(1), sd_id128_to_string(3), sd_id128_randomize(3),
151       sd_id128_get_machine(3), printf(3), journalctl(1), sd-journal(7), pkg-
152       config(1), machine-id(5)
153

NOTES

155        1. RFC 4122
156           https://tools.ietf.org/html/rfc4122
157
158        2. canonical representation
159           https://en.wikipedia.org/wiki/Universally_unique_identifier#Format
160
161
162
163systemd 250                                                        SD-ID128(3)
Impressum