]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
d15d0333 | 2 | |
ca78ad1d ZJS |
3 | #include <stdio.h> |
4 | ||
b5efdb8a | 5 | #include "alloc-util.h" |
d15d0333 | 6 | #include "fstab-util.h" |
d15d0333 | 7 | #include "log.h" |
07630cea | 8 | #include "string-util.h" |
d15d0333 ZJS |
9 | |
10 | /* | |
11 | int fstab_filter_options(const char *opts, const char *names, | |
12 | const char **namefound, char **value, char **filtered); | |
13 | */ | |
14 | ||
15 | static void do_fstab_filter_options(const char *opts, | |
16 | const char *remove, | |
17 | int r_expected, | |
18 | const char *name_expected, | |
19 | const char *value_expected, | |
20 | const char *filtered_expected) { | |
21 | ||
22 | int r; | |
23 | const char *name; | |
24 | _cleanup_free_ char *value, *filtered; | |
25 | ||
26 | r = fstab_filter_options(opts, remove, &name, &value, &filtered); | |
27 | log_info("\"%s\" → %d, \"%s\", \"%s\", \"%s\", expected %d, \"%s\", \"%s\", \"%s\"", | |
28 | opts, r, name, value, filtered, | |
29 | r_expected, name_expected, value_expected, filtered_expected ?: opts); | |
30 | assert_se(r == r_expected); | |
31 | assert_se(streq_ptr(name, name_expected)); | |
32 | assert_se(streq_ptr(value, value_expected)); | |
33 | assert_se(streq_ptr(filtered, filtered_expected ?: opts)); | |
34 | ||
35 | /* also test the malloc-less mode */ | |
36 | r = fstab_filter_options(opts, remove, &name, NULL, NULL); | |
37 | log_info("\"%s\" → %d, \"%s\", expected %d, \"%s\"", | |
38 | opts, r, name, | |
39 | r_expected, name_expected); | |
40 | assert_se(r == r_expected); | |
41 | assert_se(streq_ptr(name, name_expected)); | |
42 | } | |
43 | ||
44 | static void test_fstab_filter_options(void) { | |
45 | do_fstab_filter_options("opt=0", "opt\0x-opt\0", 1, "opt", "0", ""); | |
46 | do_fstab_filter_options("opt=0", "x-opt\0opt\0", 1, "opt", "0", ""); | |
47 | do_fstab_filter_options("opt", "opt\0x-opt\0", 1, "opt", NULL, ""); | |
48 | do_fstab_filter_options("opt", "x-opt\0opt\0", 1, "opt", NULL, ""); | |
49 | do_fstab_filter_options("x-opt", "x-opt\0opt\0", 1, "x-opt", NULL, ""); | |
50 | ||
51 | do_fstab_filter_options("opt=0,other", "opt\0x-opt\0", 1, "opt", "0", "other"); | |
52 | do_fstab_filter_options("opt=0,other", "x-opt\0opt\0", 1, "opt", "0", "other"); | |
53 | do_fstab_filter_options("opt,other", "opt\0x-opt\0", 1, "opt", NULL, "other"); | |
54 | do_fstab_filter_options("opt,other", "x-opt\0opt\0", 1, "opt", NULL, "other"); | |
55 | do_fstab_filter_options("x-opt,other", "opt\0x-opt\0", 1, "x-opt", NULL, "other"); | |
56 | ||
57 | do_fstab_filter_options("opto=0,other", "opt\0x-opt\0", 0, NULL, NULL, NULL); | |
58 | do_fstab_filter_options("opto,other", "opt\0x-opt\0", 0, NULL, NULL, NULL); | |
59 | do_fstab_filter_options("x-opto,other", "opt\0x-opt\0", 0, NULL, NULL, NULL); | |
60 | ||
61 | do_fstab_filter_options("first,opt=0", "opt\0x-opt\0", 1, "opt", "0", "first"); | |
62 | do_fstab_filter_options("first=1,opt=0", "opt\0x-opt\0", 1, "opt", "0", "first=1"); | |
63 | do_fstab_filter_options("first,opt=", "opt\0x-opt\0", 1, "opt", "", "first"); | |
64 | do_fstab_filter_options("first=1,opt", "opt\0x-opt\0", 1, "opt", NULL, "first=1"); | |
65 | do_fstab_filter_options("first=1,x-opt", "opt\0x-opt\0", 1, "x-opt", NULL, "first=1"); | |
66 | ||
67 | do_fstab_filter_options("first,opt=0,last=1", "opt\0x-opt\0", 1, "opt", "0", "first,last=1"); | |
68 | do_fstab_filter_options("first=1,opt=0,last=2", "x-opt\0opt\0", 1, "opt", "0", "first=1,last=2"); | |
69 | do_fstab_filter_options("first,opt,last", "opt\0", 1, "opt", NULL, "first,last"); | |
70 | do_fstab_filter_options("first=1,opt,last", "x-opt\0opt\0", 1, "opt", NULL, "first=1,last"); | |
71 | do_fstab_filter_options("first=,opt,last", "opt\0noopt\0", 1, "opt", NULL, "first=,last"); | |
72 | ||
73 | /* check repeated options */ | |
74 | do_fstab_filter_options("first,opt=0,noopt=1,last=1", "opt\0noopt\0", 1, "noopt", "1", "first,last=1"); | |
75 | do_fstab_filter_options("first=1,opt=0,last=2,opt=1", "opt\0", 1, "opt", "1", "first=1,last=2"); | |
76 | do_fstab_filter_options("x-opt=0,x-opt=1", "opt\0x-opt\0", 1, "x-opt", "1", ""); | |
77 | do_fstab_filter_options("opt=0,x-opt=1", "opt\0x-opt\0", 1, "x-opt", "1", ""); | |
78 | ||
79 | /* check that semicolons are not misinterpreted */ | |
80 | do_fstab_filter_options("opt=0;", "opt\0", 1, "opt", "0;", ""); | |
81 | do_fstab_filter_options("opt;=0", "x-opt\0opt\0noopt\0x-noopt\0", 0, NULL, NULL, NULL); | |
82 | do_fstab_filter_options("opt;", "opt\0x-opt\0", 0, NULL, NULL, NULL); | |
83 | ||
84 | /* check that spaces are not misinterpreted */ | |
85 | do_fstab_filter_options("opt=0 ", "opt\0", 1, "opt", "0 ", ""); | |
86 | do_fstab_filter_options("opt =0", "x-opt\0opt\0noopt\0x-noopt\0", 0, NULL, NULL, NULL); | |
87 | do_fstab_filter_options(" opt ", "opt\0x-opt\0", 0, NULL, NULL, NULL); | |
88 | ||
89 | /* check function will NULL args */ | |
90 | do_fstab_filter_options(NULL, "opt\0", 0, NULL, NULL, ""); | |
91 | do_fstab_filter_options("", "opt\0", 0, NULL, NULL, ""); | |
92 | } | |
93 | ||
a75f4e2a ZJS |
94 | static void test_fstab_find_pri(void) { |
95 | int pri = -1; | |
96 | ||
97 | assert_se(fstab_find_pri("pri", &pri) == 0); | |
98 | assert_se(pri == -1); | |
99 | ||
100 | assert_se(fstab_find_pri("pri=11", &pri) == 1); | |
101 | assert_se(pri == 11); | |
102 | ||
103 | assert_se(fstab_find_pri("opt,pri=12,opt", &pri) == 1); | |
104 | assert_se(pri == 12); | |
105 | ||
106 | assert_se(fstab_find_pri("opt,opt,pri=12,pri=13", &pri) == 1); | |
107 | assert_se(pri == 13); | |
108 | } | |
109 | ||
b9f111b9 ZJS |
110 | static void test_fstab_yes_no_option(void) { |
111 | assert_se(fstab_test_yes_no_option("nofail,fail,nofail", "nofail\0fail\0") == true); | |
112 | assert_se(fstab_test_yes_no_option("nofail,nofail,fail", "nofail\0fail\0") == false); | |
113 | assert_se(fstab_test_yes_no_option("abc,cde,afail", "nofail\0fail\0") == false); | |
114 | assert_se(fstab_test_yes_no_option("nofail,fail=0,nofail=0", "nofail\0fail\0") == true); | |
115 | assert_se(fstab_test_yes_no_option("nofail,nofail=0,fail=0", "nofail\0fail\0") == false); | |
116 | } | |
117 | ||
09c303ce RC |
118 | static void test_fstab_node_to_udev_node(void) { |
119 | char *n; | |
120 | ||
121 | n = fstab_node_to_udev_node("LABEL=applé/jack"); | |
122 | puts(n); | |
123 | assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack")); | |
124 | free(n); | |
125 | ||
126 | n = fstab_node_to_udev_node("PARTLABEL=pinkié pie"); | |
127 | puts(n); | |
128 | assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie")); | |
129 | free(n); | |
130 | ||
131 | n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535"); | |
132 | puts(n); | |
133 | assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535")); | |
134 | free(n); | |
135 | ||
136 | n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535"); | |
137 | puts(n); | |
138 | assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535")); | |
139 | free(n); | |
140 | ||
141 | n = fstab_node_to_udev_node("PONIES=awesome"); | |
142 | puts(n); | |
143 | assert_se(streq(n, "PONIES=awesome")); | |
144 | free(n); | |
145 | ||
146 | n = fstab_node_to_udev_node("/dev/xda1"); | |
147 | puts(n); | |
148 | assert_se(streq(n, "/dev/xda1")); | |
149 | free(n); | |
150 | } | |
151 | ||
d15d0333 ZJS |
152 | int main(void) { |
153 | test_fstab_filter_options(); | |
a75f4e2a | 154 | test_fstab_find_pri(); |
b9f111b9 | 155 | test_fstab_yes_no_option(); |
09c303ce RC |
156 | test_fstab_node_to_udev_node(); |
157 | ||
158 | return 0; | |
d15d0333 | 159 | } |