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