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