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