Line data Source code
1 : /* SPDX-License-Identifier: LGPL-2.1+ */
2 :
3 : #include <fcntl.h>
4 : #include <unistd.h>
5 :
6 : #include "fd-util.h"
7 : #include "fdset.h"
8 : #include "macro.h"
9 : #include "tmpfile-util.h"
10 : #include "util.h"
11 :
12 1 : static void test_fdset_new_fill(void) {
13 1 : int fd = -1;
14 1 : _cleanup_fdset_free_ FDSet *fdset = NULL;
15 1 : char name[] = "/tmp/test-fdset_new_fill.XXXXXX";
16 :
17 1 : fd = mkostemp_safe(name);
18 1 : assert_se(fd >= 0);
19 1 : assert_se(fdset_new_fill(&fdset) >= 0);
20 1 : assert_se(fdset_contains(fdset, fd));
21 :
22 1 : unlink(name);
23 1 : }
24 :
25 1 : static void test_fdset_put_dup(void) {
26 1 : _cleanup_close_ int fd = -1;
27 1 : int copyfd = -1;
28 1 : _cleanup_fdset_free_ FDSet *fdset = NULL;
29 1 : char name[] = "/tmp/test-fdset_put_dup.XXXXXX";
30 :
31 1 : fd = mkostemp_safe(name);
32 1 : assert_se(fd >= 0);
33 :
34 1 : fdset = fdset_new();
35 1 : assert_se(fdset);
36 1 : copyfd = fdset_put_dup(fdset, fd);
37 1 : assert_se(copyfd >= 0 && copyfd != fd);
38 1 : assert_se(fdset_contains(fdset, copyfd));
39 1 : assert_se(!fdset_contains(fdset, fd));
40 :
41 1 : unlink(name);
42 1 : }
43 :
44 1 : static void test_fdset_cloexec(void) {
45 1 : int fd = -1;
46 1 : _cleanup_fdset_free_ FDSet *fdset = NULL;
47 1 : int flags = -1;
48 1 : char name[] = "/tmp/test-fdset_cloexec.XXXXXX";
49 :
50 1 : fd = mkostemp_safe(name);
51 1 : assert_se(fd >= 0);
52 :
53 1 : fdset = fdset_new();
54 1 : assert_se(fdset);
55 1 : assert_se(fdset_put(fdset, fd));
56 :
57 1 : assert_se(fdset_cloexec(fdset, false) >= 0);
58 1 : flags = fcntl(fd, F_GETFD);
59 1 : assert_se(flags >= 0);
60 1 : assert_se(!(flags & FD_CLOEXEC));
61 :
62 1 : assert_se(fdset_cloexec(fdset, true) >= 0);
63 1 : flags = fcntl(fd, F_GETFD);
64 1 : assert_se(flags >= 0);
65 1 : assert_se(flags & FD_CLOEXEC);
66 :
67 1 : unlink(name);
68 1 : }
69 :
70 1 : static void test_fdset_close_others(void) {
71 1 : int fd = -1;
72 1 : int copyfd = -1;
73 1 : _cleanup_fdset_free_ FDSet *fdset = NULL;
74 1 : int flags = -1;
75 1 : char name[] = "/tmp/test-fdset_close_others.XXXXXX";
76 :
77 1 : fd = mkostemp_safe(name);
78 1 : assert_se(fd >= 0);
79 :
80 1 : fdset = fdset_new();
81 1 : assert_se(fdset);
82 1 : copyfd = fdset_put_dup(fdset, fd);
83 1 : assert_se(copyfd >= 0);
84 :
85 1 : assert_se(fdset_close_others(fdset) >= 0);
86 1 : flags = fcntl(fd, F_GETFD);
87 1 : assert_se(flags < 0);
88 1 : flags = fcntl(copyfd, F_GETFD);
89 1 : assert_se(flags >= 0);
90 :
91 1 : unlink(name);
92 1 : }
93 :
94 1 : static void test_fdset_remove(void) {
95 1 : _cleanup_close_ int fd = -1;
96 1 : FDSet *fdset = NULL;
97 1 : char name[] = "/tmp/test-fdset_remove.XXXXXX";
98 :
99 1 : fd = mkostemp_safe(name);
100 1 : assert_se(fd >= 0);
101 :
102 1 : fdset = fdset_new();
103 1 : assert_se(fdset);
104 1 : assert_se(fdset_put(fdset, fd) >= 0);
105 1 : assert_se(fdset_remove(fdset, fd) >= 0);
106 1 : assert_se(!fdset_contains(fdset, fd));
107 1 : fdset_free(fdset);
108 :
109 1 : assert_se(fcntl(fd, F_GETFD) >= 0);
110 :
111 1 : unlink(name);
112 1 : }
113 :
114 1 : static void test_fdset_iterate(void) {
115 1 : int fd = -1;
116 1 : FDSet *fdset = NULL;
117 1 : char name[] = "/tmp/test-fdset_iterate.XXXXXX";
118 : Iterator i;
119 1 : int c = 0;
120 : int a;
121 :
122 1 : fd = mkostemp_safe(name);
123 1 : assert_se(fd >= 0);
124 :
125 1 : fdset = fdset_new();
126 1 : assert_se(fdset);
127 1 : assert_se(fdset_put(fdset, fd) >= 0);
128 1 : assert_se(fdset_put(fdset, fd) >= 0);
129 1 : assert_se(fdset_put(fdset, fd) >= 0);
130 :
131 2 : FDSET_FOREACH(a, fdset, i) {
132 1 : c++;
133 1 : assert_se(a == fd);
134 : }
135 1 : assert_se(c == 1);
136 :
137 1 : fdset_free(fdset);
138 :
139 1 : unlink(name);
140 1 : }
141 :
142 1 : static void test_fdset_isempty(void) {
143 : int fd;
144 1 : _cleanup_fdset_free_ FDSet *fdset = NULL;
145 1 : char name[] = "/tmp/test-fdset_isempty.XXXXXX";
146 :
147 1 : fd = mkostemp_safe(name);
148 1 : assert_se(fd >= 0);
149 :
150 1 : fdset = fdset_new();
151 1 : assert_se(fdset);
152 :
153 1 : assert_se(fdset_isempty(fdset));
154 1 : assert_se(fdset_put(fdset, fd) >= 0);
155 1 : assert_se(!fdset_isempty(fdset));
156 :
157 1 : unlink(name);
158 1 : }
159 :
160 1 : static void test_fdset_steal_first(void) {
161 : int fd;
162 1 : _cleanup_fdset_free_ FDSet *fdset = NULL;
163 1 : char name[] = "/tmp/test-fdset_steal_first.XXXXXX";
164 :
165 1 : fd = mkostemp_safe(name);
166 1 : assert_se(fd >= 0);
167 :
168 1 : fdset = fdset_new();
169 1 : assert_se(fdset);
170 :
171 1 : assert_se(fdset_steal_first(fdset) < 0);
172 1 : assert_se(fdset_put(fdset, fd) >= 0);
173 1 : assert_se(fdset_steal_first(fdset) == fd);
174 1 : assert_se(fdset_steal_first(fdset) < 0);
175 1 : assert_se(fdset_put(fdset, fd) >= 0);
176 :
177 1 : unlink(name);
178 1 : }
179 :
180 1 : static void test_fdset_new_array(void) {
181 1 : int fds[] = {10, 11, 12, 13};
182 1 : _cleanup_fdset_free_ FDSet *fdset = NULL;
183 :
184 1 : assert_se(fdset_new_array(&fdset, fds, 4) >= 0);
185 1 : assert_se(fdset_size(fdset) == 4);
186 1 : assert_se(fdset_contains(fdset, 10));
187 1 : assert_se(fdset_contains(fdset, 11));
188 1 : assert_se(fdset_contains(fdset, 12));
189 1 : assert_se(fdset_contains(fdset, 13));
190 1 : }
191 :
192 1 : int main(int argc, char *argv[]) {
193 1 : test_fdset_new_fill();
194 1 : test_fdset_put_dup();
195 1 : test_fdset_cloexec();
196 1 : test_fdset_close_others();
197 1 : test_fdset_remove();
198 1 : test_fdset_iterate();
199 1 : test_fdset_isempty();
200 1 : test_fdset_steal_first();
201 1 : test_fdset_new_array();
202 :
203 1 : return 0;
204 : }
|