close_many(fds, 2);
- assert_se(fcntl(fds[0], F_GETFD) == -1);
- assert_se(fcntl(fds[1], F_GETFD) == -1);
- assert_se(fcntl(fds[2], F_GETFD) >= 0);
+ assert_se(fd_validate(fds[0]) == -EBADF);
+ assert_se(fd_validate(fds[1]) == -EBADF);
+ assert_se(fd_validate(fds[2]) >= 0);
safe_close(fds[2]);
}
assert_se(close_nointr(fd) < 0);
}
+TEST(fd_validate) {
+ assert_se(fd_validate(-EINVAL) == -EBADF);
+ assert_se(fd_validate(-EBADF) == -EBADF);
+
+ _cleanup_close_ int b = -EBADF;
+ assert_se((b = open("/dev/null", O_RDONLY|O_CLOEXEC)) >= 0);
+
+ assert_se(fd_validate(b) == 0);
+ safe_close(b);
+ assert_se(fd_validate(b) == -EBADF);
+ TAKE_FD(b);
+}
+
TEST(same_fd) {
_cleanup_close_pair_ int p[2];
_cleanup_close_ int a, b, c;
continue;
if (opened)
- assert_se(fcntl(fds[i], F_GETFD) >= 0);
+ assert_se(fd_validate(fds[i]) >= 0);
else
- assert_se(fcntl(fds[i], F_GETFD) < 0 && errno == EBADF);
+ assert_se(fd_validate(fds[i]) == -EBADF);
c++;
}
assert_se(fdset_new_fill(/* filter_cloexec= */ -1, &fdset) >= 0);
assert_se(fdset_contains(fdset, fd));
fdset = fdset_free(fdset);
- assert_se(fcntl(fd, F_GETFD) < 0);
- assert_se(errno == EBADF);
+ assert_se(fd_validate(fd) == -EBADF);
fd = open("/dev/null", O_CLOEXEC|O_RDONLY);
assert_se(fd >= 0);
assert_se(fdset_new_fill(/* filter_cloexec= */ 0, &fdset) >= 0);
assert_se(!fdset_contains(fdset, fd));
fdset = fdset_free(fdset);
- assert_se(fcntl(fd, F_GETFD) >= 0);
+ assert_se(fd_validate(fd) >= 0);
assert_se(fdset_new_fill(/* filter_cloexec= */ 1, &fdset) >= 0);
assert_se(fdset_contains(fdset, fd));
fdset = fdset_free(fdset);
- assert_se(fcntl(fd, F_GETFD) < 0);
- assert_se(errno == EBADF);
+ assert_se(fd_validate(fd) == -EBADF);
fd = open("/dev/null", O_RDONLY);
assert_se(fd >= 0);
assert_se(fdset_new_fill(/* filter_cloexec= */ 1, &fdset) >= 0);
assert_se(!fdset_contains(fdset, fd));
fdset = fdset_free(fdset);
- assert_se(fcntl(fd, F_GETFD) >= 0);
+ assert_se(fd_validate(fd) >= 0);
assert_se(fdset_new_fill(/* filter_cloexec= */ 0, &fdset) >= 0);
assert_se(fdset_contains(fdset, fd));
assert_se(flags >= 0);
assert_se(FLAGS_SET(flags, FD_CLOEXEC));
fdset = fdset_free(fdset);
- assert_se(fcntl(fd, F_GETFD) < 0);
- assert_se(errno == EBADF);
+ assert_se(fd_validate(fd) == -EBADF);
log_open();
}
}
TEST(fdset_close_others) {
- int fd = -EBADF;
- int copyfd = -EBADF;
+ int fd = -EBADF, copyfd = -EBADF;
_cleanup_fdset_free_ FDSet *fdset = NULL;
- int flags = -1;
_cleanup_(unlink_tempfilep) char name[] = "/tmp/test-fdset_close_others.XXXXXX";
fd = mkostemp_safe(name);
log_close();
assert_se(fdset_close_others(fdset) >= 0);
- flags = fcntl(fd, F_GETFD);
- assert_se(flags < 0);
+ assert_se(fd_validate(fd) == -EBADF);
/* Open log again after checking that fd is invalid, since reopening the log might make fd a valid
* file descriptor again. */
(void) log_open();
- flags = fcntl(copyfd, F_GETFD);
- assert_se(flags >= 0);
+ assert_se(fd_validate(copyfd) >= 0);
}
TEST(fdset_remove) {
assert_se(fdset_remove(fdset, fd) >= 0);
assert_se(!fdset_contains(fdset, fd));
- assert_se(fcntl(fd, F_GETFD) >= 0);
+ assert_se(fd_validate(fd) >= 0);
}
TEST(fdset_iterate) {