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.
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

NOTES

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

SEE ALSO

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

NOTES

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)
Impressum