Fix I/O events related to shutdown

This commit is contained in:
Ruihan Li
2024-07-27 13:10:43 +08:00
committed by Tate, Hongliang Tian
parent 421f6b8e5b
commit a8592a16ea
5 changed files with 230 additions and 49 deletions

View File

@ -326,6 +326,59 @@ FN_TEST(shutdown_connected)
}
END_TEST()
FN_TEST(poll_unbound)
{
int sk;
struct pollfd pfd = { .events = POLLIN | POLLOUT | POLLRDHUP };
sk = TEST_SUCC(socket(PF_UNIX, SOCK_STREAM, 0));
pfd.fd = sk;
TEST_RES(poll(&pfd, 1, 0), pfd.revents == (POLLOUT | POLLHUP));
TEST_SUCC(shutdown(sk, SHUT_WR));
TEST_RES(poll(&pfd, 1, 0), pfd.revents == (POLLOUT | POLLHUP));
TEST_SUCC(shutdown(sk, SHUT_RD));
TEST_RES(poll(&pfd, 1, 0),
pfd.revents == (POLLIN | POLLOUT | POLLRDHUP | POLLHUP));
TEST_SUCC(
bind(sk, (struct sockaddr *)&UNIX_ADDR("\0"), PATH_OFFSET + 1));
TEST_SUCC(listen(sk, 10));
TEST_RES(poll(&pfd, 1, 0),
pfd.revents == (POLLIN | POLLRDHUP | POLLHUP));
TEST_SUCC(close(sk));
}
END_TEST()
FN_TEST(poll_listen)
{
int sk;
struct pollfd pfd = { .events = POLLIN | POLLOUT | POLLRDHUP };
sk = TEST_SUCC(socket(PF_UNIX, SOCK_STREAM, 0));
pfd.fd = sk;
TEST_SUCC(
bind(sk, (struct sockaddr *)&UNIX_ADDR("\0"), PATH_OFFSET + 1));
TEST_SUCC(listen(sk, 10));
TEST_RES(poll(&pfd, 1, 0), pfd.revents == 0);
TEST_SUCC(shutdown(sk, SHUT_RD));
TEST_RES(poll(&pfd, 1, 0), pfd.revents == (POLLIN | POLLRDHUP));
TEST_SUCC(shutdown(sk, SHUT_WR));
TEST_RES(poll(&pfd, 1, 0),
pfd.revents == (POLLIN | POLLRDHUP | POLLHUP));
TEST_SUCC(close(sk));
}
END_TEST()
FN_TEST(poll_connected_close)
{
int fildes[2];