]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
87d2c1ff LP |
2 | |
3 | #include <string.h> | |
4 | ||
07630cea LP |
5 | #include "sd-daemon.h" |
6 | #include "sd-id128.h" | |
81527be1 | 7 | |
b5efdb8a | 8 | #include "alloc-util.h" |
65548c58 | 9 | #include "fd-util.h" |
65548c58 | 10 | #include "id128-util.h" |
87d2c1ff | 11 | #include "macro.h" |
07630cea | 12 | #include "string-util.h" |
e4de7287 | 13 | #include "tmpfile-util.h" |
07630cea | 14 | #include "util.h" |
87d2c1ff LP |
15 | |
16 | #define ID128_WALDI SD_ID128_MAKE(01, 02, 03, 04, 05, 06, 07, 08, 09, 0a, 0b, 0c, 0d, 0e, 0f, 10) | |
aa96c6cb LP |
17 | #define STR_WALDI "0102030405060708090a0b0c0d0e0f10" |
18 | #define UUID_WALDI "01020304-0506-0708-090a-0b0c0d0e0f10" | |
87d2c1ff LP |
19 | |
20 | int main(int argc, char *argv[]) { | |
21 | sd_id128_t id, id2; | |
910fd145 | 22 | char t[33], q[37]; |
aa96c6cb | 23 | _cleanup_free_ char *b = NULL; |
65548c58 | 24 | _cleanup_close_ int fd = -1; |
b3415f5d | 25 | int r; |
87d2c1ff LP |
26 | |
27 | assert_se(sd_id128_randomize(&id) == 0); | |
28 | printf("random: %s\n", sd_id128_to_string(id, t)); | |
29 | ||
30 | assert_se(sd_id128_from_string(t, &id2) == 0); | |
31 | assert_se(sd_id128_equal(id, id2)); | |
32 | ||
143bfdaf HHPF |
33 | if (sd_booted() > 0) { |
34 | assert_se(sd_id128_get_machine(&id) == 0); | |
35 | printf("machine: %s\n", sd_id128_to_string(id, t)); | |
87d2c1ff | 36 | |
143bfdaf HHPF |
37 | assert_se(sd_id128_get_boot(&id) == 0); |
38 | printf("boot: %s\n", sd_id128_to_string(id, t)); | |
39 | } | |
87d2c1ff LP |
40 | |
41 | printf("waldi: %s\n", sd_id128_to_string(ID128_WALDI, t)); | |
aa96c6cb LP |
42 | assert_se(streq(t, STR_WALDI)); |
43 | ||
44 | assert_se(asprintf(&b, SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(ID128_WALDI)) == 32); | |
45 | printf("waldi2: %s\n", b); | |
46 | assert_se(streq(t, b)); | |
47 | ||
910fd145 LP |
48 | printf("waldi3: %s\n", id128_to_uuid_string(ID128_WALDI, q)); |
49 | assert_se(streq(q, UUID_WALDI)); | |
50 | ||
51 | b = mfree(b); | |
52 | assert_se(asprintf(&b, ID128_UUID_FORMAT_STR, SD_ID128_FORMAT_VAL(ID128_WALDI)) == 36); | |
53 | printf("waldi4: %s\n", b); | |
54 | assert_se(streq(q, b)); | |
55 | ||
56 | assert_se(sd_id128_from_string(STR_WALDI, &id) >= 0); | |
57 | assert_se(sd_id128_equal(id, ID128_WALDI)); | |
58 | ||
aa96c6cb LP |
59 | assert_se(sd_id128_from_string(UUID_WALDI, &id) >= 0); |
60 | assert_se(sd_id128_equal(id, ID128_WALDI)); | |
61 | ||
62 | assert_se(sd_id128_from_string("", &id) < 0); | |
63 | assert_se(sd_id128_from_string("01020304-0506-0708-090a-0b0c0d0e0f101", &id) < 0); | |
64 | assert_se(sd_id128_from_string("01020304-0506-0708-090a-0b0c0d0e0f10-", &id) < 0); | |
65 | assert_se(sd_id128_from_string("01020304-0506-0708-090a0b0c0d0e0f10", &id) < 0); | |
66 | assert_se(sd_id128_from_string("010203040506-0708-090a-0b0c0d0e0f10", &id) < 0); | |
67 | ||
68 | assert_se(id128_is_valid(STR_WALDI)); | |
69 | assert_se(id128_is_valid(UUID_WALDI)); | |
70 | assert_se(!id128_is_valid("")); | |
71 | assert_se(!id128_is_valid("01020304-0506-0708-090a-0b0c0d0e0f101")); | |
72 | assert_se(!id128_is_valid("01020304-0506-0708-090a-0b0c0d0e0f10-")); | |
73 | assert_se(!id128_is_valid("01020304-0506-0708-090a0b0c0d0e0f10")); | |
74 | assert_se(!id128_is_valid("010203040506-0708-090a-0b0c0d0e0f10")); | |
eaff7bd8 | 75 | |
65548c58 LP |
76 | fd = open_tmpfile_unlinkable(NULL, O_RDWR|O_CLOEXEC); |
77 | assert_se(fd >= 0); | |
78 | ||
79 | /* First, write as UUID */ | |
80 | assert_se(sd_id128_randomize(&id) >= 0); | |
81 | assert_se(id128_write_fd(fd, ID128_UUID, id, false) >= 0); | |
82 | ||
83 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
84 | assert_se(id128_read_fd(fd, ID128_PLAIN, &id2) == -EINVAL); | |
85 | ||
86 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
87 | assert_se(id128_read_fd(fd, ID128_UUID, &id2) >= 0); | |
88 | assert_se(sd_id128_equal(id, id2)); | |
89 | ||
90 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
91 | assert_se(id128_read_fd(fd, ID128_ANY, &id2) >= 0); | |
92 | assert_se(sd_id128_equal(id, id2)); | |
93 | ||
94 | /* Second, write as plain */ | |
95 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
96 | assert_se(ftruncate(fd, 0) >= 0); | |
97 | ||
98 | assert_se(sd_id128_randomize(&id) >= 0); | |
99 | assert_se(id128_write_fd(fd, ID128_PLAIN, id, false) >= 0); | |
100 | ||
101 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
102 | assert_se(id128_read_fd(fd, ID128_UUID, &id2) == -EINVAL); | |
103 | ||
104 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
105 | assert_se(id128_read_fd(fd, ID128_PLAIN, &id2) >= 0); | |
106 | assert_se(sd_id128_equal(id, id2)); | |
107 | ||
108 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
109 | assert_se(id128_read_fd(fd, ID128_ANY, &id2) >= 0); | |
110 | assert_se(sd_id128_equal(id, id2)); | |
111 | ||
112 | /* Third, write plain without trailing newline */ | |
113 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
114 | assert_se(ftruncate(fd, 0) >= 0); | |
115 | ||
116 | assert_se(sd_id128_randomize(&id) >= 0); | |
117 | assert_se(write(fd, sd_id128_to_string(id, t), 32) == 32); | |
118 | ||
119 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
120 | assert_se(id128_read_fd(fd, ID128_UUID, &id2) == -EINVAL); | |
121 | ||
122 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
123 | assert_se(id128_read_fd(fd, ID128_PLAIN, &id2) >= 0); | |
124 | assert_se(sd_id128_equal(id, id2)); | |
125 | ||
126 | /* Third, write UUID without trailing newline */ | |
127 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
128 | assert_se(ftruncate(fd, 0) >= 0); | |
129 | ||
130 | assert_se(sd_id128_randomize(&id) >= 0); | |
ba8868f5 | 131 | assert_se(write(fd, id128_to_uuid_string(id, q), 36) == 36); |
65548c58 LP |
132 | |
133 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
134 | assert_se(id128_read_fd(fd, ID128_PLAIN, &id2) == -EINVAL); | |
135 | ||
136 | assert_se(lseek(fd, 0, SEEK_SET) == 0); | |
137 | assert_se(id128_read_fd(fd, ID128_UUID, &id2) >= 0); | |
138 | assert_se(sd_id128_equal(id, id2)); | |
139 | ||
2e914f34 | 140 | r = sd_id128_get_machine_app_specific(SD_ID128_MAKE(f0,3d,aa,eb,1c,33,4b,43,a7,32,17,29,44,bf,77,2e), &id); |
09b9348e | 141 | if (r == -EOPNOTSUPP) |
2e914f34 | 142 | log_info("khash not supported on this kernel, skipping sd_id128_get_machine_app_specific() checks"); |
09b9348e | 143 | else { |
2e914f34 MP |
144 | assert_se(r >= 0); |
145 | assert_se(sd_id128_get_machine_app_specific(SD_ID128_MAKE(f0,3d,aa,eb,1c,33,4b,43,a7,32,17,29,44,bf,77,2e), &id2) >= 0); | |
146 | assert_se(sd_id128_equal(id, id2)); | |
147 | assert_se(sd_id128_get_machine_app_specific(SD_ID128_MAKE(51,df,0b,4b,c3,b0,4c,97,80,e2,99,b9,8c,a3,73,b8), &id2) >= 0); | |
148 | assert_se(!sd_id128_equal(id, id2)); | |
149 | } | |
70fc4f57 | 150 | |
b3415f5d LP |
151 | /* Query the invocation ID */ |
152 | r = sd_id128_get_invocation(&id); | |
153 | if (r < 0) | |
154 | log_warning_errno(r, "Failed to get invocation ID, ignoring: %m"); | |
155 | else | |
156 | log_info("Invocation ID: " SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(id)); | |
157 | ||
87d2c1ff LP |
158 | return 0; |
159 | } |