1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
6 Copyright 2013 Thomas H.P. Andersen
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
26 #include "alloc-util.h"
27 #include "errno-list.h"
29 #include "parse-util.h"
30 #include "string-util.h"
32 static void test_parse_boolean(void) {
33 assert_se(parse_boolean("1") == 1);
34 assert_se(parse_boolean("y") == 1);
35 assert_se(parse_boolean("Y") == 1);
36 assert_se(parse_boolean("yes") == 1);
37 assert_se(parse_boolean("YES") == 1);
38 assert_se(parse_boolean("true") == 1);
39 assert_se(parse_boolean("TRUE") == 1);
40 assert_se(parse_boolean("on") == 1);
41 assert_se(parse_boolean("ON") == 1);
43 assert_se(parse_boolean("0") == 0);
44 assert_se(parse_boolean("n") == 0);
45 assert_se(parse_boolean("N") == 0);
46 assert_se(parse_boolean("no") == 0);
47 assert_se(parse_boolean("NO") == 0);
48 assert_se(parse_boolean("false") == 0);
49 assert_se(parse_boolean("FALSE") == 0);
50 assert_se(parse_boolean("off") == 0);
51 assert_se(parse_boolean("OFF") == 0);
53 assert_se(parse_boolean("garbage") < 0);
54 assert_se(parse_boolean("") < 0);
55 assert_se(parse_boolean("full") < 0);
58 static void test_parse_pid(void) {
62 r = parse_pid("100", &pid);
64 assert_se(pid == 100);
66 r = parse_pid("0x7FFFFFFF", &pid);
68 assert_se(pid == 2147483647);
70 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
71 r = parse_pid("0", &pid);
72 assert_se(r == -ERANGE);
75 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
76 r = parse_pid("-100", &pid);
77 assert_se(r == -ERANGE);
80 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
81 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
82 assert_se(r == -ERANGE);
85 r = parse_pid("junk", &pid);
86 assert_se(r == -EINVAL);
88 r = parse_pid("", &pid);
89 assert_se(r == -EINVAL);
92 static void test_parse_mode(void) {
95 assert_se(parse_mode("-1", &m) < 0);
96 assert_se(parse_mode("", &m) < 0);
97 assert_se(parse_mode("888", &m) < 0);
98 assert_se(parse_mode("77777", &m) < 0);
100 assert_se(parse_mode("544", &m) >= 0 && m == 0544);
101 assert_se(parse_mode("777", &m) >= 0 && m == 0777);
102 assert_se(parse_mode("7777", &m) >= 0 && m == 07777);
103 assert_se(parse_mode("0", &m) >= 0 && m == 0);
106 static void test_parse_size(void) {
109 assert_se(parse_size("", 1024, &bytes) == -EINVAL);
111 assert_se(parse_size("111", 1024, &bytes) == 0);
112 assert_se(bytes == 111);
114 assert_se(parse_size("111.4", 1024, &bytes) == 0);
115 assert_se(bytes == 111);
117 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
118 assert_se(bytes == 112);
120 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
121 assert_se(bytes == 112);
123 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
124 assert_se(bytes == 3*1024 + 512);
126 assert_se(parse_size("3. K", 1024, &bytes) == 0);
127 assert_se(bytes == 3*1024);
129 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
130 assert_se(bytes == 3*1024);
132 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
134 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
135 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
137 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
139 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
140 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
142 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
143 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
145 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
147 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
148 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
150 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
151 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
153 assert_se(parse_size("12P", 1024, &bytes) == 0);
154 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
156 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
158 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
159 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
161 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
163 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
165 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
167 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
168 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
169 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
171 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
173 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
176 #if 0 /// UNNEEDED by elogind
177 static void test_parse_range(void) {
178 unsigned lower, upper;
180 /* Successful cases */
181 assert_se(parse_range("111", &lower, &upper) == 0);
182 assert_se(lower == 111);
183 assert_se(upper == 111);
185 assert_se(parse_range("111-123", &lower, &upper) == 0);
186 assert_se(lower == 111);
187 assert_se(upper == 123);
189 assert_se(parse_range("123-111", &lower, &upper) == 0);
190 assert_se(lower == 123);
191 assert_se(upper == 111);
193 assert_se(parse_range("123-123", &lower, &upper) == 0);
194 assert_se(lower == 123);
195 assert_se(upper == 123);
197 assert_se(parse_range("0", &lower, &upper) == 0);
198 assert_se(lower == 0);
199 assert_se(upper == 0);
201 assert_se(parse_range("0-15", &lower, &upper) == 0);
202 assert_se(lower == 0);
203 assert_se(upper == 15);
205 assert_se(parse_range("15-0", &lower, &upper) == 0);
206 assert_se(lower == 15);
207 assert_se(upper == 0);
209 assert_se(parse_range("128-65535", &lower, &upper) == 0);
210 assert_se(lower == 128);
211 assert_se(upper == 65535);
213 assert_se(parse_range("1024-4294967295", &lower, &upper) == 0);
214 assert_se(lower == 1024);
215 assert_se(upper == 4294967295);
217 /* Leading whitespace is acceptable */
218 assert_se(parse_range(" 111", &lower, &upper) == 0);
219 assert_se(lower == 111);
220 assert_se(upper == 111);
222 assert_se(parse_range(" 111-123", &lower, &upper) == 0);
223 assert_se(lower == 111);
224 assert_se(upper == 123);
226 assert_se(parse_range("111- 123", &lower, &upper) == 0);
227 assert_se(lower == 111);
228 assert_se(upper == 123);
230 assert_se(parse_range("\t111-\t123", &lower, &upper) == 0);
231 assert_se(lower == 111);
232 assert_se(upper == 123);
234 assert_se(parse_range(" \t 111- \t 123", &lower, &upper) == 0);
235 assert_se(lower == 111);
236 assert_se(upper == 123);
238 /* Error cases, make sure they fail as expected */
239 lower = upper = 9999;
240 assert_se(parse_range("111garbage", &lower, &upper) == -EINVAL);
241 assert_se(lower == 9999);
242 assert_se(upper == 9999);
244 assert_se(parse_range("garbage111", &lower, &upper) == -EINVAL);
245 assert_se(lower == 9999);
246 assert_se(upper == 9999);
248 assert_se(parse_range("garbage", &lower, &upper) == -EINVAL);
249 assert_se(lower == 9999);
250 assert_se(upper == 9999);
252 assert_se(parse_range("111-123garbage", &lower, &upper) == -EINVAL);
253 assert_se(lower == 9999);
254 assert_se(upper == 9999);
256 assert_se(parse_range("111garbage-123", &lower, &upper) == -EINVAL);
257 assert_se(lower == 9999);
258 assert_se(upper == 9999);
261 lower = upper = 9999;
262 assert_se(parse_range("", &lower, &upper) == -EINVAL);
263 assert_se(lower == 9999);
264 assert_se(upper == 9999);
266 /* 111--123 will pass -123 to safe_atou which returns -ERANGE for negative */
267 assert_se(parse_range("111--123", &lower, &upper) == -ERANGE);
268 assert_se(lower == 9999);
269 assert_se(upper == 9999);
271 assert_se(parse_range("-123", &lower, &upper) == -EINVAL);
272 assert_se(lower == 9999);
273 assert_se(upper == 9999);
275 assert_se(parse_range("-111-123", &lower, &upper) == -EINVAL);
276 assert_se(lower == 9999);
277 assert_se(upper == 9999);
279 assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
280 assert_se(lower == 9999);
281 assert_se(upper == 9999);
283 assert_se(parse_range("111.4-123", &lower, &upper) == -EINVAL);
284 assert_se(lower == 9999);
285 assert_se(upper == 9999);
287 assert_se(parse_range("111-123.4", &lower, &upper) == -EINVAL);
288 assert_se(lower == 9999);
289 assert_se(upper == 9999);
291 assert_se(parse_range("111,4-123", &lower, &upper) == -EINVAL);
292 assert_se(lower == 9999);
293 assert_se(upper == 9999);
295 assert_se(parse_range("111-123,4", &lower, &upper) == -EINVAL);
296 assert_se(lower == 9999);
297 assert_se(upper == 9999);
299 /* Error on trailing dash */
300 assert_se(parse_range("111-", &lower, &upper) == -EINVAL);
301 assert_se(lower == 9999);
302 assert_se(upper == 9999);
304 assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
305 assert_se(lower == 9999);
306 assert_se(upper == 9999);
308 assert_se(parse_range("111--", &lower, &upper) == -EINVAL);
309 assert_se(lower == 9999);
310 assert_se(upper == 9999);
312 assert_se(parse_range("111- ", &lower, &upper) == -EINVAL);
313 assert_se(lower == 9999);
314 assert_se(upper == 9999);
316 /* Whitespace is not a separator */
317 assert_se(parse_range("111 123", &lower, &upper) == -EINVAL);
318 assert_se(lower == 9999);
319 assert_se(upper == 9999);
321 assert_se(parse_range("111\t123", &lower, &upper) == -EINVAL);
322 assert_se(lower == 9999);
323 assert_se(upper == 9999);
325 assert_se(parse_range("111 \t 123", &lower, &upper) == -EINVAL);
326 assert_se(lower == 9999);
327 assert_se(upper == 9999);
329 /* Trailing whitespace is invalid (from safe_atou) */
330 assert_se(parse_range("111 ", &lower, &upper) == -EINVAL);
331 assert_se(lower == 9999);
332 assert_se(upper == 9999);
334 assert_se(parse_range("111-123 ", &lower, &upper) == -EINVAL);
335 assert_se(lower == 9999);
336 assert_se(upper == 9999);
338 assert_se(parse_range("111 -123", &lower, &upper) == -EINVAL);
339 assert_se(lower == 9999);
340 assert_se(upper == 9999);
342 assert_se(parse_range("111 -123 ", &lower, &upper) == -EINVAL);
343 assert_se(lower == 9999);
344 assert_se(upper == 9999);
346 assert_se(parse_range("111\t-123\t", &lower, &upper) == -EINVAL);
347 assert_se(lower == 9999);
348 assert_se(upper == 9999);
350 assert_se(parse_range("111 \t -123 \t ", &lower, &upper) == -EINVAL);
351 assert_se(lower == 9999);
352 assert_se(upper == 9999);
354 /* Out of the "unsigned" range, this is 1<<64 */
355 assert_se(parse_range("0-18446744073709551616", &lower, &upper) == -ERANGE);
356 assert_se(lower == 9999);
357 assert_se(upper == 9999);
361 static void test_safe_atolli(void) {
365 r = safe_atolli("12345", &l);
367 assert_se(l == 12345);
369 r = safe_atolli(" 12345", &l);
371 assert_se(l == 12345);
373 r = safe_atolli("-12345", &l);
375 assert_se(l == -12345);
377 r = safe_atolli(" -12345", &l);
379 assert_se(l == -12345);
381 r = safe_atolli("12345678901234567890", &l);
382 assert_se(r == -ERANGE);
384 r = safe_atolli("-12345678901234567890", &l);
385 assert_se(r == -ERANGE);
387 r = safe_atolli("junk", &l);
388 assert_se(r == -EINVAL);
390 r = safe_atolli("123x", &l);
391 assert_se(r == -EINVAL);
393 r = safe_atolli("12.3", &l);
394 assert_se(r == -EINVAL);
396 r = safe_atolli("", &l);
397 assert_se(r == -EINVAL);
400 static void test_safe_atou16(void) {
404 r = safe_atou16("12345", &l);
406 assert_se(l == 12345);
408 r = safe_atou16(" 12345", &l);
410 assert_se(l == 12345);
412 r = safe_atou16("123456", &l);
413 assert_se(r == -ERANGE);
415 r = safe_atou16("-1", &l);
416 assert_se(r == -ERANGE);
418 r = safe_atou16(" -1", &l);
419 assert_se(r == -ERANGE);
421 r = safe_atou16("junk", &l);
422 assert_se(r == -EINVAL);
424 r = safe_atou16("123x", &l);
425 assert_se(r == -EINVAL);
427 r = safe_atou16("12.3", &l);
428 assert_se(r == -EINVAL);
430 r = safe_atou16("", &l);
431 assert_se(r == -EINVAL);
434 static void test_safe_atoi16(void) {
438 r = safe_atoi16("-12345", &l);
440 assert_se(l == -12345);
442 r = safe_atoi16(" -12345", &l);
444 assert_se(l == -12345);
446 r = safe_atoi16("32767", &l);
448 assert_se(l == 32767);
450 r = safe_atoi16(" 32767", &l);
452 assert_se(l == 32767);
454 r = safe_atoi16("36536", &l);
455 assert_se(r == -ERANGE);
457 r = safe_atoi16("-32769", &l);
458 assert_se(r == -ERANGE);
460 r = safe_atoi16("junk", &l);
461 assert_se(r == -EINVAL);
463 r = safe_atoi16("123x", &l);
464 assert_se(r == -EINVAL);
466 r = safe_atoi16("12.3", &l);
467 assert_se(r == -EINVAL);
469 r = safe_atoi16("", &l);
470 assert_se(r == -EINVAL);
473 static void test_safe_atoux16(void) {
477 r = safe_atoux16("1234", &l);
479 assert_se(l == 0x1234);
481 r = safe_atoux16("abcd", &l);
483 assert_se(l == 0xabcd);
485 r = safe_atoux16(" 1234", &l);
487 assert_se(l == 0x1234);
489 r = safe_atoux16("12345", &l);
490 assert_se(r == -ERANGE);
492 r = safe_atoux16("-1", &l);
493 assert_se(r == -ERANGE);
495 r = safe_atoux16(" -1", &l);
496 assert_se(r == -ERANGE);
498 r = safe_atoux16("junk", &l);
499 assert_se(r == -EINVAL);
501 r = safe_atoux16("123x", &l);
502 assert_se(r == -EINVAL);
504 r = safe_atoux16("12.3", &l);
505 assert_se(r == -EINVAL);
507 r = safe_atoux16("", &l);
508 assert_se(r == -EINVAL);
511 static void test_safe_atou64(void) {
515 r = safe_atou64("12345", &l);
517 assert_se(l == 12345);
519 r = safe_atou64(" 12345", &l);
521 assert_se(l == 12345);
523 r = safe_atou64("18446744073709551617", &l);
524 assert_se(r == -ERANGE);
526 r = safe_atou64("-1", &l);
527 assert_se(r == -ERANGE);
529 r = safe_atou64(" -1", &l);
530 assert_se(r == -ERANGE);
532 r = safe_atou64("junk", &l);
533 assert_se(r == -EINVAL);
535 r = safe_atou64("123x", &l);
536 assert_se(r == -EINVAL);
538 r = safe_atou64("12.3", &l);
539 assert_se(r == -EINVAL);
541 r = safe_atou64("", &l);
542 assert_se(r == -EINVAL);
545 static void test_safe_atoi64(void) {
549 r = safe_atoi64("-12345", &l);
551 assert_se(l == -12345);
553 r = safe_atoi64(" -12345", &l);
555 assert_se(l == -12345);
557 r = safe_atoi64("32767", &l);
559 assert_se(l == 32767);
561 r = safe_atoi64(" 32767", &l);
563 assert_se(l == 32767);
565 r = safe_atoi64("9223372036854775813", &l);
566 assert_se(r == -ERANGE);
568 r = safe_atoi64("-9223372036854775813", &l);
569 assert_se(r == -ERANGE);
571 r = safe_atoi64("junk", &l);
572 assert_se(r == -EINVAL);
574 r = safe_atoi64("123x", &l);
575 assert_se(r == -EINVAL);
577 r = safe_atoi64("12.3", &l);
578 assert_se(r == -EINVAL);
580 r = safe_atoi64("", &l);
581 assert_se(r == -EINVAL);
584 static void test_safe_atod(void) {
589 r = safe_atod("junk", &d);
590 assert_se(r == -EINVAL);
592 r = safe_atod("0.2244", &d);
594 assert_se(fabs(d - 0.2244) < 0.000001);
596 r = safe_atod("0,5", &d);
597 assert_se(r == -EINVAL);
601 assert_se(*e == ',');
603 r = safe_atod("", &d);
604 assert_se(r == -EINVAL);
606 /* Check if this really is locale independent */
607 if (setlocale(LC_NUMERIC, "de_DE.utf8")) {
609 r = safe_atod("0.2244", &d);
611 assert_se(fabs(d - 0.2244) < 0.000001);
613 r = safe_atod("0,5", &d);
614 assert_se(r == -EINVAL);
617 /// elogind supports musl_libc, and their strtod doesn't seem to use the set locale.
618 #if defined(__GLIBC__)
619 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
622 r = safe_atod("", &d);
623 assert_se(r == -EINVAL);
626 /* And check again, reset */
627 assert_se(setlocale(LC_NUMERIC, "C"));
629 r = safe_atod("0.2244", &d);
631 assert_se(fabs(d - 0.2244) < 0.000001);
633 r = safe_atod("0,5", &d);
634 assert_se(r == -EINVAL);
638 assert_se(*e == ',');
640 r = safe_atod("", &d);
641 assert_se(r == -EINVAL);
644 static void test_parse_percent(void) {
645 assert_se(parse_percent("") == -EINVAL);
646 assert_se(parse_percent("foo") == -EINVAL);
647 assert_se(parse_percent("0") == -EINVAL);
648 assert_se(parse_percent("50") == -EINVAL);
649 assert_se(parse_percent("100") == -EINVAL);
650 assert_se(parse_percent("-1") == -EINVAL);
651 assert_se(parse_percent("0%") == 0);
652 assert_se(parse_percent("55%") == 55);
653 assert_se(parse_percent("100%") == 100);
654 assert_se(parse_percent("-7%") == -ERANGE);
655 assert_se(parse_percent("107%") == -ERANGE);
656 assert_se(parse_percent("%") == -EINVAL);
657 assert_se(parse_percent("%%") == -EINVAL);
658 assert_se(parse_percent("%1") == -EINVAL);
659 assert_se(parse_percent("1%%") == -EINVAL);
660 assert_se(parse_percent("3.2%") == -EINVAL);
663 static void test_parse_percent_unbounded(void) {
664 assert_se(parse_percent_unbounded("101%") == 101);
665 assert_se(parse_percent_unbounded("400%") == 400);
668 #if 0 /// UNNEEDED by elogind
669 static void test_parse_nice(void) {
672 assert_se(parse_nice("0", &n) >= 0 && n == 0);
673 assert_se(parse_nice("+0", &n) >= 0 && n == 0);
674 assert_se(parse_nice("-1", &n) >= 0 && n == -1);
675 assert_se(parse_nice("-2", &n) >= 0 && n == -2);
676 assert_se(parse_nice("1", &n) >= 0 && n == 1);
677 assert_se(parse_nice("2", &n) >= 0 && n == 2);
678 assert_se(parse_nice("+1", &n) >= 0 && n == 1);
679 assert_se(parse_nice("+2", &n) >= 0 && n == 2);
680 assert_se(parse_nice("-20", &n) >= 0 && n == -20);
681 assert_se(parse_nice("19", &n) >= 0 && n == 19);
682 assert_se(parse_nice("+19", &n) >= 0 && n == 19);
685 assert_se(parse_nice("", &n) == -EINVAL);
686 assert_se(parse_nice("-", &n) == -EINVAL);
687 assert_se(parse_nice("+", &n) == -EINVAL);
688 assert_se(parse_nice("xx", &n) == -EINVAL);
689 assert_se(parse_nice("-50", &n) == -ERANGE);
690 assert_se(parse_nice("50", &n) == -ERANGE);
691 assert_se(parse_nice("+50", &n) == -ERANGE);
692 assert_se(parse_nice("-21", &n) == -ERANGE);
693 assert_se(parse_nice("20", &n) == -ERANGE);
694 assert_se(parse_nice("+20", &n) == -ERANGE);
698 static void test_parse_dev(void) {
701 assert_se(parse_dev("", &dev) == -EINVAL);
702 assert_se(parse_dev("junk", &dev) == -EINVAL);
703 assert_se(parse_dev("0", &dev) == -EINVAL);
704 assert_se(parse_dev("5", &dev) == -EINVAL);
705 assert_se(parse_dev("5:", &dev) == -EINVAL);
706 assert_se(parse_dev(":5", &dev) == -EINVAL);
708 assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
710 assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
713 static void test_parse_errno(void) {
714 assert_se(parse_errno("EILSEQ") == EILSEQ);
715 assert_se(parse_errno("EINVAL") == EINVAL);
716 assert_se(parse_errno("0") == 0);
717 assert_se(parse_errno("1") == 1);
718 assert_se(parse_errno("4095") == 4095);
720 assert_se(parse_errno("-1") == -ERANGE);
721 assert_se(parse_errno("-3") == -ERANGE);
722 assert_se(parse_errno("4096") == -ERANGE);
724 assert_se(parse_errno("") == -EINVAL);
725 assert_se(parse_errno("12.3") == -EINVAL);
726 assert_se(parse_errno("123junk") == -EINVAL);
727 assert_se(parse_errno("junk123") == -EINVAL);
728 assert_se(parse_errno("255EILSEQ") == -EINVAL);
729 assert_se(parse_errno("EINVAL12") == -EINVAL);
730 assert_se(parse_errno("-EINVAL") == -EINVAL);
731 assert_se(parse_errno("EINVALaaa") == -EINVAL);
734 static void test_parse_syscall_and_errno(void) {
735 _cleanup_free_ char *n = NULL;
738 assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
739 assert_se(streq(n, "uname"));
740 assert_se(e == errno_from_name("EILSEQ") && e >= 0);
743 assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
744 assert_se(streq(n, "uname"));
745 assert_se(e == errno_from_name("EINVAL") && e >= 0);
748 assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
749 assert_se(streq(n, "@sync"));
750 assert_se(e == 4095);
753 /* If errno is omitted, then e is set to -1 */
754 assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
755 assert_se(streq(n, "mount"));
759 /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
760 assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
761 assert_se(streq(n, "hoge"));
765 /* The function checks the syscall name is empty or not. */
766 assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
767 assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
769 /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095 */
770 assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
771 assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
772 assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
773 assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
774 assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
775 assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
776 assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
777 assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
778 assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
781 int main(int argc, char *argv[]) {
782 log_parse_environment();
785 test_parse_boolean();
789 #if 0 /// UNNEEDED by elogind
799 test_parse_percent();
800 test_parse_percent_unbounded();
801 #if 0 /// UNNEEDED by elogind
806 test_parse_syscall_and_errno();