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
12 //#include <sys/socket.h>
14 #include "alloc-util.h"
15 #include "errno-list.h"
17 #include "parse-util.h"
18 #include "string-util.h"
20 static void test_parse_boolean(void) {
21 assert_se(parse_boolean("1") == 1);
22 assert_se(parse_boolean("y") == 1);
23 assert_se(parse_boolean("Y") == 1);
24 assert_se(parse_boolean("yes") == 1);
25 assert_se(parse_boolean("YES") == 1);
26 assert_se(parse_boolean("true") == 1);
27 assert_se(parse_boolean("TRUE") == 1);
28 assert_se(parse_boolean("on") == 1);
29 assert_se(parse_boolean("ON") == 1);
31 assert_se(parse_boolean("0") == 0);
32 assert_se(parse_boolean("n") == 0);
33 assert_se(parse_boolean("N") == 0);
34 assert_se(parse_boolean("no") == 0);
35 assert_se(parse_boolean("NO") == 0);
36 assert_se(parse_boolean("false") == 0);
37 assert_se(parse_boolean("FALSE") == 0);
38 assert_se(parse_boolean("off") == 0);
39 assert_se(parse_boolean("OFF") == 0);
41 assert_se(parse_boolean("garbage") < 0);
42 assert_se(parse_boolean("") < 0);
43 assert_se(parse_boolean("full") < 0);
46 static void test_parse_pid(void) {
50 r = parse_pid("100", &pid);
52 assert_se(pid == 100);
54 r = parse_pid("0x7FFFFFFF", &pid);
56 assert_se(pid == 2147483647);
58 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
59 r = parse_pid("0", &pid);
60 assert_se(r == -ERANGE);
63 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
64 r = parse_pid("-100", &pid);
65 assert_se(r == -ERANGE);
68 pid = 65; /* pid is left unchanged on ERANGE. Set to known arbitrary value. */
69 r = parse_pid("0xFFFFFFFFFFFFFFFFF", &pid);
70 assert_se(r == -ERANGE);
73 r = parse_pid("junk", &pid);
74 assert_se(r == -EINVAL);
76 r = parse_pid("", &pid);
77 assert_se(r == -EINVAL);
80 static void test_parse_mode(void) {
83 assert_se(parse_mode("-1", &m) < 0);
84 assert_se(parse_mode("", &m) < 0);
85 assert_se(parse_mode("888", &m) < 0);
86 assert_se(parse_mode("77777", &m) < 0);
88 assert_se(parse_mode("544", &m) >= 0 && m == 0544);
89 assert_se(parse_mode("777", &m) >= 0 && m == 0777);
90 assert_se(parse_mode("7777", &m) >= 0 && m == 07777);
91 assert_se(parse_mode("0", &m) >= 0 && m == 0);
94 static void test_parse_size(void) {
97 assert_se(parse_size("", 1024, &bytes) == -EINVAL);
99 assert_se(parse_size("111", 1024, &bytes) == 0);
100 assert_se(bytes == 111);
102 assert_se(parse_size("111.4", 1024, &bytes) == 0);
103 assert_se(bytes == 111);
105 assert_se(parse_size(" 112 B", 1024, &bytes) == 0);
106 assert_se(bytes == 112);
108 assert_se(parse_size(" 112.6 B", 1024, &bytes) == 0);
109 assert_se(bytes == 112);
111 assert_se(parse_size("3.5 K", 1024, &bytes) == 0);
112 assert_se(bytes == 3*1024 + 512);
114 assert_se(parse_size("3. K", 1024, &bytes) == 0);
115 assert_se(bytes == 3*1024);
117 assert_se(parse_size("3.0 K", 1024, &bytes) == 0);
118 assert_se(bytes == 3*1024);
120 assert_se(parse_size("3. 0 K", 1024, &bytes) == -EINVAL);
122 assert_se(parse_size(" 4 M 11.5K", 1024, &bytes) == 0);
123 assert_se(bytes == 4*1024*1024 + 11 * 1024 + 512);
125 assert_se(parse_size("3B3.5G", 1024, &bytes) == -EINVAL);
127 assert_se(parse_size("3.5G3B", 1024, &bytes) == 0);
128 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 3);
130 assert_se(parse_size("3.5G 4B", 1024, &bytes) == 0);
131 assert_se(bytes == 3ULL*1024*1024*1024 + 512*1024*1024 + 4);
133 assert_se(parse_size("3B3G4T", 1024, &bytes) == -EINVAL);
135 assert_se(parse_size("4T3G3B", 1024, &bytes) == 0);
136 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
138 assert_se(parse_size(" 4 T 3 G 3 B", 1024, &bytes) == 0);
139 assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
141 assert_se(parse_size("12P", 1024, &bytes) == 0);
142 assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
144 assert_se(parse_size("12P12P", 1024, &bytes) == -EINVAL);
146 assert_se(parse_size("3E 2P", 1024, &bytes) == 0);
147 assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
149 assert_se(parse_size("12X", 1024, &bytes) == -EINVAL);
151 assert_se(parse_size("12.5X", 1024, &bytes) == -EINVAL);
153 assert_se(parse_size("12.5e3", 1024, &bytes) == -EINVAL);
155 assert_se(parse_size("1024E", 1024, &bytes) == -ERANGE);
156 assert_se(parse_size("-1", 1024, &bytes) == -ERANGE);
157 assert_se(parse_size("-1024E", 1024, &bytes) == -ERANGE);
159 assert_se(parse_size("-1024P", 1024, &bytes) == -ERANGE);
161 assert_se(parse_size("-10B 20K", 1024, &bytes) == -ERANGE);
164 #if 0 /// UNNEEDED by elogind
165 static void test_parse_range(void) {
166 unsigned lower, upper;
168 /* Successful cases */
169 assert_se(parse_range("111", &lower, &upper) == 0);
170 assert_se(lower == 111);
171 assert_se(upper == 111);
173 assert_se(parse_range("111-123", &lower, &upper) == 0);
174 assert_se(lower == 111);
175 assert_se(upper == 123);
177 assert_se(parse_range("123-111", &lower, &upper) == 0);
178 assert_se(lower == 123);
179 assert_se(upper == 111);
181 assert_se(parse_range("123-123", &lower, &upper) == 0);
182 assert_se(lower == 123);
183 assert_se(upper == 123);
185 assert_se(parse_range("0", &lower, &upper) == 0);
186 assert_se(lower == 0);
187 assert_se(upper == 0);
189 assert_se(parse_range("0-15", &lower, &upper) == 0);
190 assert_se(lower == 0);
191 assert_se(upper == 15);
193 assert_se(parse_range("15-0", &lower, &upper) == 0);
194 assert_se(lower == 15);
195 assert_se(upper == 0);
197 assert_se(parse_range("128-65535", &lower, &upper) == 0);
198 assert_se(lower == 128);
199 assert_se(upper == 65535);
201 assert_se(parse_range("1024-4294967295", &lower, &upper) == 0);
202 assert_se(lower == 1024);
203 assert_se(upper == 4294967295);
205 /* Leading whitespace is acceptable */
206 assert_se(parse_range(" 111", &lower, &upper) == 0);
207 assert_se(lower == 111);
208 assert_se(upper == 111);
210 assert_se(parse_range(" 111-123", &lower, &upper) == 0);
211 assert_se(lower == 111);
212 assert_se(upper == 123);
214 assert_se(parse_range("111- 123", &lower, &upper) == 0);
215 assert_se(lower == 111);
216 assert_se(upper == 123);
218 assert_se(parse_range("\t111-\t123", &lower, &upper) == 0);
219 assert_se(lower == 111);
220 assert_se(upper == 123);
222 assert_se(parse_range(" \t 111- \t 123", &lower, &upper) == 0);
223 assert_se(lower == 111);
224 assert_se(upper == 123);
226 /* Error cases, make sure they fail as expected */
227 lower = upper = 9999;
228 assert_se(parse_range("111garbage", &lower, &upper) == -EINVAL);
229 assert_se(lower == 9999);
230 assert_se(upper == 9999);
232 assert_se(parse_range("garbage111", &lower, &upper) == -EINVAL);
233 assert_se(lower == 9999);
234 assert_se(upper == 9999);
236 assert_se(parse_range("garbage", &lower, &upper) == -EINVAL);
237 assert_se(lower == 9999);
238 assert_se(upper == 9999);
240 assert_se(parse_range("111-123garbage", &lower, &upper) == -EINVAL);
241 assert_se(lower == 9999);
242 assert_se(upper == 9999);
244 assert_se(parse_range("111garbage-123", &lower, &upper) == -EINVAL);
245 assert_se(lower == 9999);
246 assert_se(upper == 9999);
249 lower = upper = 9999;
250 assert_se(parse_range("", &lower, &upper) == -EINVAL);
251 assert_se(lower == 9999);
252 assert_se(upper == 9999);
254 /* 111--123 will pass -123 to safe_atou which returns -ERANGE for negative */
255 assert_se(parse_range("111--123", &lower, &upper) == -ERANGE);
256 assert_se(lower == 9999);
257 assert_se(upper == 9999);
259 assert_se(parse_range("-123", &lower, &upper) == -EINVAL);
260 assert_se(lower == 9999);
261 assert_se(upper == 9999);
263 assert_se(parse_range("-111-123", &lower, &upper) == -EINVAL);
264 assert_se(lower == 9999);
265 assert_se(upper == 9999);
267 assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
268 assert_se(lower == 9999);
269 assert_se(upper == 9999);
271 assert_se(parse_range("111.4-123", &lower, &upper) == -EINVAL);
272 assert_se(lower == 9999);
273 assert_se(upper == 9999);
275 assert_se(parse_range("111-123.4", &lower, &upper) == -EINVAL);
276 assert_se(lower == 9999);
277 assert_se(upper == 9999);
279 assert_se(parse_range("111,4-123", &lower, &upper) == -EINVAL);
280 assert_se(lower == 9999);
281 assert_se(upper == 9999);
283 assert_se(parse_range("111-123,4", &lower, &upper) == -EINVAL);
284 assert_se(lower == 9999);
285 assert_se(upper == 9999);
287 /* Error on trailing dash */
288 assert_se(parse_range("111-", &lower, &upper) == -EINVAL);
289 assert_se(lower == 9999);
290 assert_se(upper == 9999);
292 assert_se(parse_range("111-123-", &lower, &upper) == -EINVAL);
293 assert_se(lower == 9999);
294 assert_se(upper == 9999);
296 assert_se(parse_range("111--", &lower, &upper) == -EINVAL);
297 assert_se(lower == 9999);
298 assert_se(upper == 9999);
300 assert_se(parse_range("111- ", &lower, &upper) == -EINVAL);
301 assert_se(lower == 9999);
302 assert_se(upper == 9999);
304 /* Whitespace is not a separator */
305 assert_se(parse_range("111 123", &lower, &upper) == -EINVAL);
306 assert_se(lower == 9999);
307 assert_se(upper == 9999);
309 assert_se(parse_range("111\t123", &lower, &upper) == -EINVAL);
310 assert_se(lower == 9999);
311 assert_se(upper == 9999);
313 assert_se(parse_range("111 \t 123", &lower, &upper) == -EINVAL);
314 assert_se(lower == 9999);
315 assert_se(upper == 9999);
317 /* Trailing whitespace is invalid (from safe_atou) */
318 assert_se(parse_range("111 ", &lower, &upper) == -EINVAL);
319 assert_se(lower == 9999);
320 assert_se(upper == 9999);
322 assert_se(parse_range("111-123 ", &lower, &upper) == -EINVAL);
323 assert_se(lower == 9999);
324 assert_se(upper == 9999);
326 assert_se(parse_range("111 -123", &lower, &upper) == -EINVAL);
327 assert_se(lower == 9999);
328 assert_se(upper == 9999);
330 assert_se(parse_range("111 -123 ", &lower, &upper) == -EINVAL);
331 assert_se(lower == 9999);
332 assert_se(upper == 9999);
334 assert_se(parse_range("111\t-123\t", &lower, &upper) == -EINVAL);
335 assert_se(lower == 9999);
336 assert_se(upper == 9999);
338 assert_se(parse_range("111 \t -123 \t ", &lower, &upper) == -EINVAL);
339 assert_se(lower == 9999);
340 assert_se(upper == 9999);
342 /* Out of the "unsigned" range, this is 1<<64 */
343 assert_se(parse_range("0-18446744073709551616", &lower, &upper) == -ERANGE);
344 assert_se(lower == 9999);
345 assert_se(upper == 9999);
349 static void test_safe_atolli(void) {
353 r = safe_atolli("12345", &l);
355 assert_se(l == 12345);
357 r = safe_atolli(" 12345", &l);
359 assert_se(l == 12345);
361 r = safe_atolli("-12345", &l);
363 assert_se(l == -12345);
365 r = safe_atolli(" -12345", &l);
367 assert_se(l == -12345);
369 r = safe_atolli("12345678901234567890", &l);
370 assert_se(r == -ERANGE);
372 r = safe_atolli("-12345678901234567890", &l);
373 assert_se(r == -ERANGE);
375 r = safe_atolli("junk", &l);
376 assert_se(r == -EINVAL);
378 r = safe_atolli("123x", &l);
379 assert_se(r == -EINVAL);
381 r = safe_atolli("12.3", &l);
382 assert_se(r == -EINVAL);
384 r = safe_atolli("", &l);
385 assert_se(r == -EINVAL);
388 static void test_safe_atou16(void) {
392 r = safe_atou16("12345", &l);
394 assert_se(l == 12345);
396 r = safe_atou16(" 12345", &l);
398 assert_se(l == 12345);
400 r = safe_atou16("123456", &l);
401 assert_se(r == -ERANGE);
403 r = safe_atou16("-1", &l);
404 assert_se(r == -ERANGE);
406 r = safe_atou16(" -1", &l);
407 assert_se(r == -ERANGE);
409 r = safe_atou16("junk", &l);
410 assert_se(r == -EINVAL);
412 r = safe_atou16("123x", &l);
413 assert_se(r == -EINVAL);
415 r = safe_atou16("12.3", &l);
416 assert_se(r == -EINVAL);
418 r = safe_atou16("", &l);
419 assert_se(r == -EINVAL);
422 static void test_safe_atoi16(void) {
426 r = safe_atoi16("-12345", &l);
428 assert_se(l == -12345);
430 r = safe_atoi16(" -12345", &l);
432 assert_se(l == -12345);
434 r = safe_atoi16("32767", &l);
436 assert_se(l == 32767);
438 r = safe_atoi16(" 32767", &l);
440 assert_se(l == 32767);
442 r = safe_atoi16("36536", &l);
443 assert_se(r == -ERANGE);
445 r = safe_atoi16("-32769", &l);
446 assert_se(r == -ERANGE);
448 r = safe_atoi16("junk", &l);
449 assert_se(r == -EINVAL);
451 r = safe_atoi16("123x", &l);
452 assert_se(r == -EINVAL);
454 r = safe_atoi16("12.3", &l);
455 assert_se(r == -EINVAL);
457 r = safe_atoi16("", &l);
458 assert_se(r == -EINVAL);
461 static void test_safe_atoux16(void) {
465 r = safe_atoux16("1234", &l);
467 assert_se(l == 0x1234);
469 r = safe_atoux16("abcd", &l);
471 assert_se(l == 0xabcd);
473 r = safe_atoux16(" 1234", &l);
475 assert_se(l == 0x1234);
477 r = safe_atoux16("12345", &l);
478 assert_se(r == -ERANGE);
480 r = safe_atoux16("-1", &l);
481 assert_se(r == -ERANGE);
483 r = safe_atoux16(" -1", &l);
484 assert_se(r == -ERANGE);
486 r = safe_atoux16("junk", &l);
487 assert_se(r == -EINVAL);
489 r = safe_atoux16("123x", &l);
490 assert_se(r == -EINVAL);
492 r = safe_atoux16("12.3", &l);
493 assert_se(r == -EINVAL);
495 r = safe_atoux16("", &l);
496 assert_se(r == -EINVAL);
499 static void test_safe_atou64(void) {
503 r = safe_atou64("12345", &l);
505 assert_se(l == 12345);
507 r = safe_atou64(" 12345", &l);
509 assert_se(l == 12345);
511 r = safe_atou64("18446744073709551617", &l);
512 assert_se(r == -ERANGE);
514 r = safe_atou64("-1", &l);
515 assert_se(r == -ERANGE);
517 r = safe_atou64(" -1", &l);
518 assert_se(r == -ERANGE);
520 r = safe_atou64("junk", &l);
521 assert_se(r == -EINVAL);
523 r = safe_atou64("123x", &l);
524 assert_se(r == -EINVAL);
526 r = safe_atou64("12.3", &l);
527 assert_se(r == -EINVAL);
529 r = safe_atou64("", &l);
530 assert_se(r == -EINVAL);
533 static void test_safe_atoi64(void) {
537 r = safe_atoi64("-12345", &l);
539 assert_se(l == -12345);
541 r = safe_atoi64(" -12345", &l);
543 assert_se(l == -12345);
545 r = safe_atoi64("32767", &l);
547 assert_se(l == 32767);
549 r = safe_atoi64(" 32767", &l);
551 assert_se(l == 32767);
553 r = safe_atoi64("9223372036854775813", &l);
554 assert_se(r == -ERANGE);
556 r = safe_atoi64("-9223372036854775813", &l);
557 assert_se(r == -ERANGE);
559 r = safe_atoi64("junk", &l);
560 assert_se(r == -EINVAL);
562 r = safe_atoi64("123x", &l);
563 assert_se(r == -EINVAL);
565 r = safe_atoi64("12.3", &l);
566 assert_se(r == -EINVAL);
568 r = safe_atoi64("", &l);
569 assert_se(r == -EINVAL);
572 static void test_safe_atod(void) {
577 r = safe_atod("junk", &d);
578 assert_se(r == -EINVAL);
580 r = safe_atod("0.2244", &d);
582 assert_se(fabs(d - 0.2244) < 0.000001);
584 r = safe_atod("0,5", &d);
585 assert_se(r == -EINVAL);
589 assert_se(*e == ',');
591 r = safe_atod("", &d);
592 assert_se(r == -EINVAL);
594 /* Check if this really is locale independent */
595 if (setlocale(LC_NUMERIC, "de_DE.utf8")) {
597 r = safe_atod("0.2244", &d);
599 assert_se(fabs(d - 0.2244) < 0.000001);
601 r = safe_atod("0,5", &d);
602 assert_se(r == -EINVAL);
605 /// elogind supports musl_libc, and their strtod doesn't seem to use the set locale.
606 #if defined(__GLIBC__)
607 assert_se(fabs(strtod("0,5", &e) - 0.5) < 0.00001);
610 r = safe_atod("", &d);
611 assert_se(r == -EINVAL);
614 /* And check again, reset */
615 assert_se(setlocale(LC_NUMERIC, "C"));
617 r = safe_atod("0.2244", &d);
619 assert_se(fabs(d - 0.2244) < 0.000001);
621 r = safe_atod("0,5", &d);
622 assert_se(r == -EINVAL);
626 assert_se(*e == ',');
628 r = safe_atod("", &d);
629 assert_se(r == -EINVAL);
632 static void test_parse_percent(void) {
633 assert_se(parse_percent("") == -EINVAL);
634 assert_se(parse_percent("foo") == -EINVAL);
635 assert_se(parse_percent("0") == -EINVAL);
636 assert_se(parse_percent("50") == -EINVAL);
637 assert_se(parse_percent("100") == -EINVAL);
638 assert_se(parse_percent("-1") == -EINVAL);
639 assert_se(parse_percent("0%") == 0);
640 assert_se(parse_percent("55%") == 55);
641 assert_se(parse_percent("100%") == 100);
642 assert_se(parse_percent("-7%") == -ERANGE);
643 assert_se(parse_percent("107%") == -ERANGE);
644 assert_se(parse_percent("%") == -EINVAL);
645 assert_se(parse_percent("%%") == -EINVAL);
646 assert_se(parse_percent("%1") == -EINVAL);
647 assert_se(parse_percent("1%%") == -EINVAL);
648 assert_se(parse_percent("3.2%") == -EINVAL);
651 static void test_parse_percent_unbounded(void) {
652 assert_se(parse_percent_unbounded("101%") == 101);
653 assert_se(parse_percent_unbounded("400%") == 400);
656 static void test_parse_permille(void) {
657 assert_se(parse_permille("") == -EINVAL);
658 assert_se(parse_permille("foo") == -EINVAL);
659 assert_se(parse_permille("0") == -EINVAL);
660 assert_se(parse_permille("50") == -EINVAL);
661 assert_se(parse_permille("100") == -EINVAL);
662 assert_se(parse_permille("-1") == -EINVAL);
664 assert_se(parse_permille("0‰") == 0);
665 assert_se(parse_permille("555‰") == 555);
666 assert_se(parse_permille("1000‰") == 1000);
667 assert_se(parse_permille("-7‰") == -ERANGE);
668 assert_se(parse_permille("1007‰") == -ERANGE);
669 assert_se(parse_permille("‰") == -EINVAL);
670 assert_se(parse_permille("‰‰") == -EINVAL);
671 assert_se(parse_permille("‰1") == -EINVAL);
672 assert_se(parse_permille("1‰‰") == -EINVAL);
673 assert_se(parse_permille("3.2‰") == -EINVAL);
675 assert_se(parse_permille("0%") == 0);
676 assert_se(parse_permille("55%") == 550);
677 assert_se(parse_permille("55.5%") == 555);
678 assert_se(parse_permille("100%") == 1000);
679 assert_se(parse_permille("-7%") == -ERANGE);
680 assert_se(parse_permille("107%") == -ERANGE);
681 assert_se(parse_permille("%") == -EINVAL);
682 assert_se(parse_permille("%%") == -EINVAL);
683 assert_se(parse_permille("%1") == -EINVAL);
684 assert_se(parse_permille("1%%") == -EINVAL);
685 assert_se(parse_permille("3.21%") == -EINVAL);
688 static void test_parse_permille_unbounded(void) {
689 assert_se(parse_permille_unbounded("1001‰") == 1001);
690 assert_se(parse_permille_unbounded("4000‰") == 4000);
691 assert_se(parse_permille_unbounded("2147483647‰") == 2147483647);
692 assert_se(parse_permille_unbounded("2147483648‰") == -ERANGE);
693 assert_se(parse_permille_unbounded("4294967295‰") == -ERANGE);
694 assert_se(parse_permille_unbounded("4294967296‰") == -ERANGE);
696 assert_se(parse_permille_unbounded("101%") == 1010);
697 assert_se(parse_permille_unbounded("400%") == 4000);
698 assert_se(parse_permille_unbounded("214748364.7%") == 2147483647);
699 assert_se(parse_permille_unbounded("214748364.8%") == -ERANGE);
700 assert_se(parse_permille_unbounded("429496729.5%") == -ERANGE);
701 assert_se(parse_permille_unbounded("429496729.6%") == -ERANGE);
704 #if 0 /// UNNEEDED by elogind
705 static void test_parse_nice(void) {
708 assert_se(parse_nice("0", &n) >= 0 && n == 0);
709 assert_se(parse_nice("+0", &n) >= 0 && n == 0);
710 assert_se(parse_nice("-1", &n) >= 0 && n == -1);
711 assert_se(parse_nice("-2", &n) >= 0 && n == -2);
712 assert_se(parse_nice("1", &n) >= 0 && n == 1);
713 assert_se(parse_nice("2", &n) >= 0 && n == 2);
714 assert_se(parse_nice("+1", &n) >= 0 && n == 1);
715 assert_se(parse_nice("+2", &n) >= 0 && n == 2);
716 assert_se(parse_nice("-20", &n) >= 0 && n == -20);
717 assert_se(parse_nice("19", &n) >= 0 && n == 19);
718 assert_se(parse_nice("+19", &n) >= 0 && n == 19);
720 assert_se(parse_nice("", &n) == -EINVAL);
721 assert_se(parse_nice("-", &n) == -EINVAL);
722 assert_se(parse_nice("+", &n) == -EINVAL);
723 assert_se(parse_nice("xx", &n) == -EINVAL);
724 assert_se(parse_nice("-50", &n) == -ERANGE);
725 assert_se(parse_nice("50", &n) == -ERANGE);
726 assert_se(parse_nice("+50", &n) == -ERANGE);
727 assert_se(parse_nice("-21", &n) == -ERANGE);
728 assert_se(parse_nice("20", &n) == -ERANGE);
729 assert_se(parse_nice("+20", &n) == -ERANGE);
733 static void test_parse_dev(void) {
736 assert_se(parse_dev("", &dev) == -EINVAL);
737 assert_se(parse_dev("junk", &dev) == -EINVAL);
738 assert_se(parse_dev("0", &dev) == -EINVAL);
739 assert_se(parse_dev("5", &dev) == -EINVAL);
740 assert_se(parse_dev("5:", &dev) == -EINVAL);
741 assert_se(parse_dev(":5", &dev) == -EINVAL);
743 assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
745 assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
748 static void test_parse_errno(void) {
749 assert_se(parse_errno("EILSEQ") == EILSEQ);
750 assert_se(parse_errno("EINVAL") == EINVAL);
751 assert_se(parse_errno("0") == 0);
752 assert_se(parse_errno("1") == 1);
753 assert_se(parse_errno("4095") == 4095);
755 assert_se(parse_errno("-1") == -ERANGE);
756 assert_se(parse_errno("-3") == -ERANGE);
757 assert_se(parse_errno("4096") == -ERANGE);
759 assert_se(parse_errno("") == -EINVAL);
760 assert_se(parse_errno("12.3") == -EINVAL);
761 assert_se(parse_errno("123junk") == -EINVAL);
762 assert_se(parse_errno("junk123") == -EINVAL);
763 assert_se(parse_errno("255EILSEQ") == -EINVAL);
764 assert_se(parse_errno("EINVAL12") == -EINVAL);
765 assert_se(parse_errno("-EINVAL") == -EINVAL);
766 assert_se(parse_errno("EINVALaaa") == -EINVAL);
769 static void test_parse_syscall_and_errno(void) {
770 _cleanup_free_ char *n = NULL;
773 assert_se(parse_syscall_and_errno("uname:EILSEQ", &n, &e) >= 0);
774 assert_se(streq(n, "uname"));
775 assert_se(e == errno_from_name("EILSEQ") && e >= 0);
778 assert_se(parse_syscall_and_errno("uname:EINVAL", &n, &e) >= 0);
779 assert_se(streq(n, "uname"));
780 assert_se(e == errno_from_name("EINVAL") && e >= 0);
783 assert_se(parse_syscall_and_errno("@sync:4095", &n, &e) >= 0);
784 assert_se(streq(n, "@sync"));
785 assert_se(e == 4095);
788 /* If errno is omitted, then e is set to -1 */
789 assert_se(parse_syscall_and_errno("mount", &n, &e) >= 0);
790 assert_se(streq(n, "mount"));
794 /* parse_syscall_and_errno() does not check the syscall name is valid or not. */
795 assert_se(parse_syscall_and_errno("hoge:255", &n, &e) >= 0);
796 assert_se(streq(n, "hoge"));
800 /* The function checks the syscall name is empty or not. */
801 assert_se(parse_syscall_and_errno("", &n, &e) == -EINVAL);
802 assert_se(parse_syscall_and_errno(":255", &n, &e) == -EINVAL);
804 /* errno must be a valid errno name or number between 0 and ERRNO_MAX == 4095 */
805 assert_se(parse_syscall_and_errno("hoge:4096", &n, &e) == -ERANGE);
806 assert_se(parse_syscall_and_errno("hoge:-3", &n, &e) == -ERANGE);
807 assert_se(parse_syscall_and_errno("hoge:12.3", &n, &e) == -EINVAL);
808 assert_se(parse_syscall_and_errno("hoge:123junk", &n, &e) == -EINVAL);
809 assert_se(parse_syscall_and_errno("hoge:junk123", &n, &e) == -EINVAL);
810 assert_se(parse_syscall_and_errno("hoge:255:EILSEQ", &n, &e) == -EINVAL);
811 assert_se(parse_syscall_and_errno("hoge:-EINVAL", &n, &e) == -EINVAL);
812 assert_se(parse_syscall_and_errno("hoge:EINVALaaa", &n, &e) == -EINVAL);
813 assert_se(parse_syscall_and_errno("hoge:", &n, &e) == -EINVAL);
816 static void test_parse_mtu(void) {
819 assert_se(parse_mtu(AF_UNSPEC, "1500", &mtu) >= 0 && mtu == 1500);
820 assert_se(parse_mtu(AF_UNSPEC, "1400", &mtu) >= 0 && mtu == 1400);
821 assert_se(parse_mtu(AF_UNSPEC, "65535", &mtu) >= 0 && mtu == 65535);
822 assert_se(parse_mtu(AF_UNSPEC, "65536", &mtu) >= 0 && mtu == 65536);
823 assert_se(parse_mtu(AF_UNSPEC, "4294967295", &mtu) >= 0 && mtu == 4294967295);
824 assert_se(parse_mtu(AF_UNSPEC, "500", &mtu) >= 0 && mtu == 500);
825 assert_se(parse_mtu(AF_UNSPEC, "1280", &mtu) >= 0 && mtu == 1280);
826 assert_se(parse_mtu(AF_INET6, "1280", &mtu) >= 0 && mtu == 1280);
827 assert_se(parse_mtu(AF_INET6, "1279", &mtu) == -ERANGE);
828 assert_se(parse_mtu(AF_UNSPEC, "4294967296", &mtu) == -ERANGE);
829 assert_se(parse_mtu(AF_INET6, "4294967296", &mtu) == -ERANGE);
830 assert_se(parse_mtu(AF_INET6, "68", &mtu) == -ERANGE);
831 assert_se(parse_mtu(AF_UNSPEC, "68", &mtu) >= 0 && mtu == 68);
832 assert_se(parse_mtu(AF_UNSPEC, "67", &mtu) == -ERANGE);
833 assert_se(parse_mtu(AF_UNSPEC, "0", &mtu) == -ERANGE);
834 assert_se(parse_mtu(AF_UNSPEC, "", &mtu) == -EINVAL);
837 int main(int argc, char *argv[]) {
838 log_parse_environment();
841 test_parse_boolean();
845 #if 0 /// UNNEEDED by elogind
855 test_parse_percent();
856 test_parse_percent_unbounded();
857 test_parse_permille();
858 test_parse_permille_unbounded();
859 #if 0 /// UNNEEDED by elogind
864 test_parse_syscall_and_errno();