1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
11 #include "tmpfile-util.h"
13 TEST(fdset_new_fill
) {
14 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
15 int fd
= -EBADF
, flags
;
18 log_set_open_when_needed(true);
20 fd
= open("/dev/null", O_CLOEXEC
|O_RDONLY
);
23 assert_se(fdset_new_fill(/* filter_cloexec= */ -1, &fdset
) >= 0);
24 assert_se(fdset_contains(fdset
, fd
));
25 fdset
= fdset_free(fdset
);
26 assert_se(fcntl(fd
, F_GETFD
) < 0);
27 assert_se(errno
== EBADF
);
29 fd
= open("/dev/null", O_CLOEXEC
|O_RDONLY
);
32 assert_se(fdset_new_fill(/* filter_cloexec= */ 0, &fdset
) >= 0);
33 assert_se(!fdset_contains(fdset
, fd
));
34 fdset
= fdset_free(fdset
);
35 assert_se(fcntl(fd
, F_GETFD
) >= 0);
37 assert_se(fdset_new_fill(/* filter_cloexec= */ 1, &fdset
) >= 0);
38 assert_se(fdset_contains(fdset
, fd
));
39 fdset
= fdset_free(fdset
);
40 assert_se(fcntl(fd
, F_GETFD
) < 0);
41 assert_se(errno
== EBADF
);
43 fd
= open("/dev/null", O_RDONLY
);
46 assert_se(fdset_new_fill(/* filter_cloexec= */ 1, &fdset
) >= 0);
47 assert_se(!fdset_contains(fdset
, fd
));
48 fdset
= fdset_free(fdset
);
49 assert_se(fcntl(fd
, F_GETFD
) >= 0);
51 assert_se(fdset_new_fill(/* filter_cloexec= */ 0, &fdset
) >= 0);
52 assert_se(fdset_contains(fdset
, fd
));
53 flags
= fcntl(fd
, F_GETFD
);
54 assert_se(flags
>= 0);
55 assert_se(FLAGS_SET(flags
, FD_CLOEXEC
));
56 fdset
= fdset_free(fdset
);
57 assert_se(fcntl(fd
, F_GETFD
) < 0);
58 assert_se(errno
== EBADF
);
64 _cleanup_close_
int fd
= -EBADF
;
66 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
67 _cleanup_(unlink_tempfilep
) char name
[] = "/tmp/test-fdset_put_dup.XXXXXX";
69 fd
= mkostemp_safe(name
);
74 copyfd
= fdset_put_dup(fdset
, fd
);
75 assert_se(copyfd
>= 0 && copyfd
!= fd
);
76 assert_se(fdset_contains(fdset
, copyfd
));
77 assert_se(!fdset_contains(fdset
, fd
));
82 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
84 _cleanup_(unlink_tempfilep
) char name
[] = "/tmp/test-fdset_cloexec.XXXXXX";
86 fd
= mkostemp_safe(name
);
91 assert_se(fdset_put(fdset
, fd
));
93 assert_se(fdset_cloexec(fdset
, false) >= 0);
94 flags
= fcntl(fd
, F_GETFD
);
95 assert_se(flags
>= 0);
96 assert_se(!(flags
& FD_CLOEXEC
));
98 assert_se(fdset_cloexec(fdset
, true) >= 0);
99 flags
= fcntl(fd
, F_GETFD
);
100 assert_se(flags
>= 0);
101 assert_se(flags
& FD_CLOEXEC
);
104 TEST(fdset_close_others
) {
107 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
109 _cleanup_(unlink_tempfilep
) char name
[] = "/tmp/test-fdset_close_others.XXXXXX";
111 fd
= mkostemp_safe(name
);
116 copyfd
= fdset_put_dup(fdset
, fd
);
117 assert_se(copyfd
>= 0);
119 assert_se(fdset_close_others(fdset
) >= 0);
120 flags
= fcntl(fd
, F_GETFD
);
121 assert_se(flags
< 0);
122 flags
= fcntl(copyfd
, F_GETFD
);
123 assert_se(flags
>= 0);
127 _cleanup_close_
int fd
= -EBADF
;
128 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
129 _cleanup_(unlink_tempfilep
) char name
[] = "/tmp/test-fdset_remove.XXXXXX";
131 fd
= mkostemp_safe(name
);
136 assert_se(fdset_put(fdset
, fd
) >= 0);
137 assert_se(fdset_remove(fdset
, fd
) >= 0);
138 assert_se(!fdset_contains(fdset
, fd
));
140 assert_se(fcntl(fd
, F_GETFD
) >= 0);
143 TEST(fdset_iterate
) {
145 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
146 _cleanup_(unlink_tempfilep
) char name
[] = "/tmp/test-fdset_iterate.XXXXXX";
150 fd
= mkostemp_safe(name
);
155 assert_se(fdset_put(fdset
, fd
) >= 0);
156 assert_se(fdset_put(fdset
, fd
) >= 0);
157 assert_se(fdset_put(fdset
, fd
) >= 0);
159 FDSET_FOREACH(a
, fdset
) {
166 TEST(fdset_isempty
) {
168 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
169 _cleanup_(unlink_tempfilep
) char name
[] = "/tmp/test-fdset_isempty.XXXXXX";
171 fd
= mkostemp_safe(name
);
177 assert_se(fdset_isempty(fdset
));
178 assert_se(fdset_put(fdset
, fd
) >= 0);
179 assert_se(!fdset_isempty(fdset
));
182 TEST(fdset_steal_first
) {
184 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
185 _cleanup_(unlink_tempfilep
) char name
[] = "/tmp/test-fdset_steal_first.XXXXXX";
187 fd
= mkostemp_safe(name
);
193 assert_se(fdset_steal_first(fdset
) < 0);
194 assert_se(fdset_put(fdset
, fd
) >= 0);
195 assert_se(fdset_steal_first(fdset
) == fd
);
196 assert_se(fdset_steal_first(fdset
) < 0);
197 assert_se(fdset_put(fdset
, fd
) >= 0);
200 TEST(fdset_new_array
) {
201 int fds
[] = {10, 11, 12, 13};
202 _cleanup_fdset_free_ FDSet
*fdset
= NULL
;
204 assert_se(fdset_new_array(&fdset
, fds
, 4) >= 0);
205 assert_se(fdset_size(fdset
) == 4);
206 assert_se(fdset_contains(fdset
, 10));
207 assert_se(fdset_contains(fdset
, 11));
208 assert_se(fdset_contains(fdset
, 12));
209 assert_se(fdset_contains(fdset
, 13));
212 DEFINE_TEST_MAIN(LOG_INFO
);