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