]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
6695ed7a LP |
2 | #ifndef foosdid128hfoo |
3 | #define foosdid128hfoo | |
87d2c1ff LP |
4 | |
5 | /*** | |
87d2c1ff | 6 | systemd is free software; you can redistribute it and/or modify it |
5430f7f2 LP |
7 | under the terms of the GNU Lesser General Public License as published by |
8 | the Free Software Foundation; either version 2.1 of the License, or | |
87d2c1ff LP |
9 | (at your option) any later version. |
10 | ||
11 | systemd is distributed in the hope that it will be useful, but | |
12 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
5430f7f2 | 14 | Lesser General Public License for more details. |
87d2c1ff | 15 | |
5430f7f2 | 16 | You should have received a copy of the GNU Lesser General Public License |
87d2c1ff LP |
17 | along with systemd; If not, see <http://www.gnu.org/licenses/>. |
18 | ***/ | |
19 | ||
20 | #include <inttypes.h> | |
87d2c1ff LP |
21 | #include <string.h> |
22 | ||
0095c454 LP |
23 | #include "_sd-common.h" |
24 | ||
25 | _SD_BEGIN_DECLARATIONS; | |
f9873976 | 26 | |
10b17992 | 27 | /* 128-bit ID APIs. See sd-id128(3) for more information. */ |
cb07866b | 28 | |
87d2c1ff LP |
29 | typedef union sd_id128 sd_id128_t; |
30 | ||
31 | union sd_id128 { | |
32 | uint8_t bytes[16]; | |
33 | uint64_t qwords[2]; | |
34 | }; | |
35 | ||
9b271c03 LP |
36 | #define SD_ID128_STRING_MAX 33 |
37 | ||
4199f689 | 38 | char *sd_id128_to_string(sd_id128_t id, char s[_SD_ARRAY_STATIC SD_ID128_STRING_MAX]); |
aa96c6cb | 39 | int sd_id128_from_string(const char *s, sd_id128_t *ret); |
87d2c1ff LP |
40 | |
41 | int sd_id128_randomize(sd_id128_t *ret); | |
42 | ||
87d2c1ff | 43 | int sd_id128_get_machine(sd_id128_t *ret); |
87d2c1ff | 44 | int sd_id128_get_boot(sd_id128_t *ret); |
4b58153d | 45 | int sd_id128_get_invocation(sd_id128_t *ret); |
87d2c1ff | 46 | |
463adf57 LP |
47 | int sd_id128_get_machine_app_specific(sd_id128_t app_id, sd_id128_t *ret); |
48 | int sd_id128_get_boot_app_specific(sd_id128_t app_id, sd_id128_t *ret); | |
49 | ||
b28ff39f LP |
50 | #define SD_ID128_ARRAY(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) \ |
51 | { .bytes = { 0x##v0, 0x##v1, 0x##v2, 0x##v3, 0x##v4, 0x##v5, 0x##v6, 0x##v7, \ | |
52 | 0x##v8, 0x##v9, 0x##v10, 0x##v11, 0x##v12, 0x##v13, 0x##v14, 0x##v15 }} | |
53 | ||
4783e5ad LP |
54 | #define SD_ID128_MAKE(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) \ |
55 | ((const sd_id128_t) SD_ID128_ARRAY(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)) | |
56 | ||
57 | ||
8e9e6d56 | 58 | /* Note that SD_ID128_FORMAT_VAL will evaluate the passed argument 16 |
eaff7bd8 | 59 | * times. It is hence not a good idea to call this macro with an |
f131770b | 60 | * expensive function as parameter or an expression with side |
eaff7bd8 | 61 | * effects */ |
877d54e9 | 62 | |
8e9e6d56 LP |
63 | #define SD_ID128_FORMAT_STR "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" |
64 | #define SD_ID128_FORMAT_VAL(x) (x).bytes[0], (x).bytes[1], (x).bytes[2], (x).bytes[3], (x).bytes[4], (x).bytes[5], (x).bytes[6], (x).bytes[7], (x).bytes[8], (x).bytes[9], (x).bytes[10], (x).bytes[11], (x).bytes[12], (x).bytes[13], (x).bytes[14], (x).bytes[15] | |
eaff7bd8 | 65 | |
183de6d7 | 66 | #define SD_ID128_CONST_STR(x) \ |
9bf3b535 | 67 | ((const char[SD_ID128_STRING_MAX]) { \ |
183de6d7 LP |
68 | ((x).bytes[0] >> 4) >= 10 ? 'a' + ((x).bytes[0] >> 4) - 10 : '0' + ((x).bytes[0] >> 4), \ |
69 | ((x).bytes[0] & 15) >= 10 ? 'a' + ((x).bytes[0] & 15) - 10 : '0' + ((x).bytes[0] & 15), \ | |
70 | ((x).bytes[1] >> 4) >= 10 ? 'a' + ((x).bytes[1] >> 4) - 10 : '0' + ((x).bytes[1] >> 4), \ | |
71 | ((x).bytes[1] & 15) >= 10 ? 'a' + ((x).bytes[1] & 15) - 10 : '0' + ((x).bytes[1] & 15), \ | |
72 | ((x).bytes[2] >> 4) >= 10 ? 'a' + ((x).bytes[2] >> 4) - 10 : '0' + ((x).bytes[2] >> 4), \ | |
73 | ((x).bytes[2] & 15) >= 10 ? 'a' + ((x).bytes[2] & 15) - 10 : '0' + ((x).bytes[2] & 15), \ | |
74 | ((x).bytes[3] >> 4) >= 10 ? 'a' + ((x).bytes[3] >> 4) - 10 : '0' + ((x).bytes[3] >> 4), \ | |
75 | ((x).bytes[3] & 15) >= 10 ? 'a' + ((x).bytes[3] & 15) - 10 : '0' + ((x).bytes[3] & 15), \ | |
76 | ((x).bytes[4] >> 4) >= 10 ? 'a' + ((x).bytes[4] >> 4) - 10 : '0' + ((x).bytes[4] >> 4), \ | |
77 | ((x).bytes[4] & 15) >= 10 ? 'a' + ((x).bytes[4] & 15) - 10 : '0' + ((x).bytes[4] & 15), \ | |
78 | ((x).bytes[5] >> 4) >= 10 ? 'a' + ((x).bytes[5] >> 4) - 10 : '0' + ((x).bytes[5] >> 4), \ | |
79 | ((x).bytes[5] & 15) >= 10 ? 'a' + ((x).bytes[5] & 15) - 10 : '0' + ((x).bytes[5] & 15), \ | |
80 | ((x).bytes[6] >> 4) >= 10 ? 'a' + ((x).bytes[6] >> 4) - 10 : '0' + ((x).bytes[6] >> 4), \ | |
81 | ((x).bytes[6] & 15) >= 10 ? 'a' + ((x).bytes[6] & 15) - 10 : '0' + ((x).bytes[6] & 15), \ | |
82 | ((x).bytes[7] >> 4) >= 10 ? 'a' + ((x).bytes[7] >> 4) - 10 : '0' + ((x).bytes[7] >> 4), \ | |
83 | ((x).bytes[7] & 15) >= 10 ? 'a' + ((x).bytes[7] & 15) - 10 : '0' + ((x).bytes[7] & 15), \ | |
84 | ((x).bytes[8] >> 4) >= 10 ? 'a' + ((x).bytes[8] >> 4) - 10 : '0' + ((x).bytes[8] >> 4), \ | |
85 | ((x).bytes[8] & 15) >= 10 ? 'a' + ((x).bytes[8] & 15) - 10 : '0' + ((x).bytes[8] & 15), \ | |
86 | ((x).bytes[9] >> 4) >= 10 ? 'a' + ((x).bytes[9] >> 4) - 10 : '0' + ((x).bytes[9] >> 4), \ | |
87 | ((x).bytes[9] & 15) >= 10 ? 'a' + ((x).bytes[9] & 15) - 10 : '0' + ((x).bytes[9] & 15), \ | |
88 | ((x).bytes[10] >> 4) >= 10 ? 'a' + ((x).bytes[10] >> 4) - 10 : '0' + ((x).bytes[10] >> 4), \ | |
89 | ((x).bytes[10] & 15) >= 10 ? 'a' + ((x).bytes[10] & 15) - 10 : '0' + ((x).bytes[10] & 15), \ | |
90 | ((x).bytes[11] >> 4) >= 10 ? 'a' + ((x).bytes[11] >> 4) - 10 : '0' + ((x).bytes[11] >> 4), \ | |
91 | ((x).bytes[11] & 15) >= 10 ? 'a' + ((x).bytes[11] & 15) - 10 : '0' + ((x).bytes[11] & 15), \ | |
92 | ((x).bytes[12] >> 4) >= 10 ? 'a' + ((x).bytes[12] >> 4) - 10 : '0' + ((x).bytes[12] >> 4), \ | |
93 | ((x).bytes[12] & 15) >= 10 ? 'a' + ((x).bytes[12] & 15) - 10 : '0' + ((x).bytes[12] & 15), \ | |
94 | ((x).bytes[13] >> 4) >= 10 ? 'a' + ((x).bytes[13] >> 4) - 10 : '0' + ((x).bytes[13] >> 4), \ | |
95 | ((x).bytes[13] & 15) >= 10 ? 'a' + ((x).bytes[13] & 15) - 10 : '0' + ((x).bytes[13] & 15), \ | |
96 | ((x).bytes[14] >> 4) >= 10 ? 'a' + ((x).bytes[14] >> 4) - 10 : '0' + ((x).bytes[14] >> 4), \ | |
97 | ((x).bytes[14] & 15) >= 10 ? 'a' + ((x).bytes[14] & 15) - 10 : '0' + ((x).bytes[14] & 15), \ | |
98 | ((x).bytes[15] >> 4) >= 10 ? 'a' + ((x).bytes[15] >> 4) - 10 : '0' + ((x).bytes[15] >> 4), \ | |
99 | ((x).bytes[15] & 15) >= 10 ? 'a' + ((x).bytes[15] & 15) - 10 : '0' + ((x).bytes[15] & 15), \ | |
100 | 0 }) | |
101 | ||
2b044526 ZJS |
102 | #define SD_ID128_MAKE_STR(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) \ |
103 | #a #b #c #d #e #f #g #h #i #j #k #l #m #n #o #p | |
104 | ||
0cb27225 | 105 | _sd_pure_ static __inline__ int sd_id128_equal(sd_id128_t a, sd_id128_t b) { |
87d2c1ff LP |
106 | return memcmp(&a, &b, 16) == 0; |
107 | } | |
108 | ||
0cb27225 | 109 | _sd_pure_ static __inline__ int sd_id128_is_null(sd_id128_t a) { |
15e80c7b LP |
110 | return a.qwords[0] == 0 && a.qwords[1] == 0; |
111 | } | |
112 | ||
67081438 LP |
113 | _sd_pure_ static __inline__ int sd_id128_is_allf(sd_id128_t a) { |
114 | return a.qwords[0] == UINT64_C(0xFFFFFFFFFFFFFFFF) && a.qwords[1] == UINT64_C(0xFFFFFFFFFFFFFFFF); | |
115 | } | |
116 | ||
9bf3b535 | 117 | #define SD_ID128_NULL ((const sd_id128_t) { .qwords = { 0, 0 }}) |
67081438 | 118 | #define SD_ID128_ALLF ((const sd_id128_t) { .qwords = { UINT64_C(0xFFFFFFFFFFFFFFFF), UINT64_C(0xFFFFFFFFFFFFFFFF) }}) |
c2893c4b | 119 | |
0095c454 | 120 | _SD_END_DECLARATIONS; |
f9873976 | 121 | |
87d2c1ff | 122 | #endif |