diff --git a/test/test-mixed-socket-types.c b/test/test-mixed-socket-types.c new file mode 100644 index 0000000..c2cf5b0 --- /dev/null +++ b/test/test-mixed-socket-types.c @@ -0,0 +1,56 @@ +#include +#include + +#include "error.h" +#include "test-util.h" +#include "wepoll.h" +#include "win.h" + +static void create_and_add_socket(HANDLE epoll_hnd, + int af, + int type, + int protocol) { + SOCKET sock; + u_long one = 1; + int r; + struct epoll_event ev; + + sock = socket(af, type, protocol); + check(sock != INVALID_SOCKET); + + r = ioctlsocket(sock, FIONBIO, &one); + check(r == 0); + + ev.events = EPOLLOUT | EPOLLONESHOT; + ev.data.sock = sock; + r = epoll_ctl(epoll_hnd, EPOLL_CTL_ADD, sock, &ev); + check(r == 0); +} + +int main(void) { + HANDLE epoll_hnd; + int i, r; + struct epoll_event ev; + + epoll_hnd = epoll_create1(0); + check(epoll_hnd != NULL); + + create_and_add_socket(epoll_hnd, AF_INET, SOCK_DGRAM, IPPROTO_UDP); + create_and_add_socket(epoll_hnd, AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + + for (i = 0; i < 2; i++) { + r = epoll_wait(epoll_hnd, &ev, 1, -1); + check(r == 1); + + r = epoll_ctl(epoll_hnd, EPOLL_CTL_DEL, ev.data.sock, NULL); + check(r == 0); + + r = closesocket(ev.data.sock); + check(r == 0); + } + + r = epoll_close(epoll_hnd); + check(r == 0); + + return 0; +}