-/*
- * POSIX compatible socket() replacement
- */
-#undef socket
-int
-w32_socket(int domain, int type, int protocol)
-{
- SOCKET sock;
-
- /*
- * We have to use WSASocket() to create non-overlapped IO sockets.
- * Overlapped IO sockets cannot be used with read/write.
- */
- sock = WSASocket(domain, type, protocol, NULL, 0, 0);
- if (sock == INVALID_SOCKET) {
- w32_set_winsock_errno();
- return -1;
- }
- return W32_SOCKET_TO_FD(sock);
-}
-
-/*
- * POSIX compatible connect() replacement
- */
-#undef connect
-int
-w32_connect(int sockfd, const struct sockaddr *addr, int addrlen)
-{
- SOCKET sock = W32_FD_TO_SOCKET(sockfd);
- int result;
-
- result = connect(sock, addr, addrlen);
- if (result == SOCKET_ERROR) {
- /* FIXME map WSAEWOULDBLOCK to EINPROGRESS */
- w32_set_winsock_errno();
- return -1;
- }
- return result;
-}
-
-/*
- * POSIX compatible recv() replacement
- */
-#undef recv
-int
-w32_recv(int sockfd, void *buffer, size_t buf_size, int flags)
-{
- SOCKET socket = W32_FD_TO_SOCKET(sockfd);
- int result;
-
- result = recv(socket, buffer, buf_size, flags);
- if (result == SOCKET_ERROR) {
- w32_set_winsock_errno();
- return -1;
- }
- return result;
-}
-
-/*
- * POSIX compatible send() replacement
- */
-int
-w32_send(int sockfd, const void *buffer, size_t buf_size, int flags)
-{
- SOCKET socket = W32_FD_TO_SOCKET(sockfd);
- int result;
-
- result = send(socket, buffer, buf_size, flags);
- if (result == SOCKET_ERROR)
- w32_set_winsock_errno();
- return result;
-}
-
-/*
- * POSIX compatible close() replacement
- */
-int
-w32_close(int fd)
-{
- SOCKET sock;
-
- if (fd_is_socket(fd, &sock)) {
- if (closesocket(sock)) {
- w32_set_winsock_errno();
- return -1;
- }
- /*
- * This always fails because the underlying handle is already
- * gone, but it closes the fd just fine.
- */
- _close(fd);
- return 0;
- }
- return _close(fd);
-}
-