/* * Copyright (c) 2017 Intel Corporation. All rights reserved. * * This software is available to you under the BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "ft_osd.h" int socketpair(int af, int type, int protocol, int socks[2]) { protocol; /* suppress warning */ struct sockaddr_in in_addr; int lsock; int len = sizeof(in_addr); if (!socks) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } socks[0] = socks[1] = (int)INVALID_SOCKET; if ((lsock = socket(af == AF_UNIX ? AF_INET : af, type, 0)) == INVALID_SOCKET) { return SOCKET_ERROR; } memset(&in_addr, 0, sizeof(in_addr)); in_addr.sin_family = AF_INET; in_addr.sin_addr.s_addr = htonl(0x7f000001); if (bind(lsock, (struct sockaddr*)&in_addr, sizeof(in_addr))) { int err = WSAGetLastError(); closesocket(lsock); WSASetLastError(err); return SOCKET_ERROR; } if (getsockname(lsock, (struct sockaddr*) &in_addr, &len)) { int err = WSAGetLastError(); closesocket(lsock); WSASetLastError(err); return SOCKET_ERROR; } if (listen(lsock, 1)) goto err; if ((socks[0] = WSASocket(af == AF_UNIX ? AF_INET : af, type, 0, NULL, 0, 0)) == INVALID_SOCKET) goto err; if (connect(socks[0], (const struct sockaddr*) &in_addr, sizeof(in_addr))) goto err; if ((socks[1] = accept(lsock, NULL, NULL)) == INVALID_SOCKET) goto err; closesocket(lsock); return 0; int err; err: err = WSAGetLastError(); closesocket(lsock); closesocket(socks[0]); closesocket(socks[1]); WSASetLastError(err); return SOCKET_ERROR; }