blob: 15ad087d1e9712776981a790b18f74540a7b5ac8 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
Rob Hughes25b74362020-01-13 11:14:59 +00003// SPDX-License-Identifier: MIT
4//
5
Jim Flynnbbfe6032020-07-20 16:57:44 +01006#include <common/include/NetworkSockets.hpp>
Rob Hughes25b74362020-01-13 11:14:59 +00007
Jim Flynn6da6a452020-07-14 14:26:27 +01008#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +00009#include <unistd.h>
10#include <fcntl.h>
11#endif
12
Rob Hughes35c31c02020-08-17 15:47:20 +010013#include <common/include/Conversion.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +010014#include <common/include/IgnoreUnused.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +010015#include <common/include/NumericCast.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +010016
17namespace arm
Rob Hughes25b74362020-01-13 11:14:59 +000018{
Jim Flynnbbfe6032020-07-20 16:57:44 +010019namespace pipe
Rob Hughes25b74362020-01-13 11:14:59 +000020{
21
22bool Initialize()
23{
Jim Flynn6da6a452020-07-14 14:26:27 +010024#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000025 return true;
Jim Flynnbbfe6032020-07-20 16:57:44 +010026#elif defined(_MSC_VER) || defined(__MINGW32__)
Rob Hughes25b74362020-01-13 11:14:59 +000027 WSADATA wsaData;
28 return WSAStartup(MAKEWORD(2, 2), &wsaData) == 0;
29#endif
30}
31
32int Close(Socket s)
33{
Jim Flynn6da6a452020-07-14 14:26:27 +010034#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000035 return close(s);
Jim Flynnbbfe6032020-07-20 16:57:44 +010036#elif defined(_MSC_VER) || defined(__MINGW32__)
Rob Hughes25b74362020-01-13 11:14:59 +000037 return closesocket(s);
38#endif
39}
40
41
42bool SetNonBlocking(Socket s)
43{
Jim Flynn6da6a452020-07-14 14:26:27 +010044#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000045 const int currentFlags = fcntl(s, F_GETFL);
46 return fcntl(s, F_SETFL, currentFlags | O_NONBLOCK) == 0;
47#elif defined(_MSC_VER)
48 u_long mode = 1;
49 return ioctlsocket(s, FIONBIO, &mode) == 0;
Jim Flynnbbfe6032020-07-20 16:57:44 +010050#elif defined(__MINGW32__)
51 u_long mode = 1;
52 return ioctlsocket(s, arm::pipe::numeric_cast<long>(FIONBIO), &mode) == 0;
Rob Hughes25b74362020-01-13 11:14:59 +000053#endif
54}
55
56
57long Write(Socket s, const void* buf, size_t len)
58{
Jim Flynn6da6a452020-07-14 14:26:27 +010059#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000060 return write(s, buf, len);
Jim Flynnbbfe6032020-07-20 16:57:44 +010061#elif defined(_MSC_VER) || defined(__MINGW32__)
Rob Hughesb98032f2020-04-24 11:41:34 +010062 return send(s, static_cast<const char*>(buf), static_cast<int>(len), 0);
Rob Hughes25b74362020-01-13 11:14:59 +000063#endif
64}
65
66
67long Read(Socket s, void* buf, size_t len)
68{
Jim Flynn6da6a452020-07-14 14:26:27 +010069#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000070 return read(s, buf, len);
Jim Flynnbbfe6032020-07-20 16:57:44 +010071#elif defined(_MSC_VER) || defined(__MINGW32__)
Rob Hughesb98032f2020-04-24 11:41:34 +010072 return recv(s, static_cast<char*>(buf), static_cast<int>(len), 0);
Rob Hughes25b74362020-01-13 11:14:59 +000073#endif
74}
75
David Monahan5277ad52020-01-22 15:40:34 +000076int Ioctl(Socket s, unsigned long int cmd, void* arg)
Rob Hughes25b74362020-01-13 11:14:59 +000077{
Jim Flynn6da6a452020-07-14 14:26:27 +010078#if defined(__unix__) || defined(__APPLE__)
Jim Flynnbbfe6032020-07-20 16:57:44 +010079 ARM_PIPE_NO_CONVERSION_WARN_BEGIN
David Monahan5277ad52020-01-22 15:40:34 +000080 return ioctl(s, static_cast<int>(cmd), arg);
Jim Flynnbbfe6032020-07-20 16:57:44 +010081 ARM_PIPE_NO_CONVERSION_WARN_END
82#elif defined(_MSC_VER) || defined(__MINGW32__)
83 ARM_PIPE_NO_CONVERSION_WARN_BEGIN
Rob Hughes25b74362020-01-13 11:14:59 +000084 return ioctlsocket(s, cmd, static_cast<u_long*>(arg));
Jim Flynnbbfe6032020-07-20 16:57:44 +010085 ARM_PIPE_NO_CONVERSION_WARN_END
Rob Hughes25b74362020-01-13 11:14:59 +000086#endif
87}
88
89
David Monahan5277ad52020-01-22 15:40:34 +000090int Poll(PollFd* fds, nfds_t numFds, int timeout)
Rob Hughes25b74362020-01-13 11:14:59 +000091{
Jim Flynn6da6a452020-07-14 14:26:27 +010092#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000093 return poll(fds, numFds, timeout);
Jim Flynnbbfe6032020-07-20 16:57:44 +010094#elif defined(_MSC_VER) || defined(__MINGW32__)
95 return WSAPoll(fds, arm::pipe::numeric_cast<unsigned long>(numFds), timeout);
Rob Hughes25b74362020-01-13 11:14:59 +000096#endif
97}
98
99
Jim Flynnbbfe6032020-07-20 16:57:44 +0100100arm::pipe::Socket Accept(Socket s, sockaddr* addr, socklen_t* addrlen, int flags)
Rob Hughes25b74362020-01-13 11:14:59 +0000101{
102#if defined(__unix__)
103 return accept4(s, addr, addrlen, flags);
Jim Flynn6da6a452020-07-14 14:26:27 +0100104#elif defined(__APPLE__)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100105 IgnoreUnused(flags);
Jim Flynn6da6a452020-07-14 14:26:27 +0100106 return accept(s, addr, addrlen);
Jim Flynnbbfe6032020-07-20 16:57:44 +0100107#elif defined(_MSC_VER) || defined(__MINGW32__)
108 IgnoreUnused(flags);
Rob Hughes25b74362020-01-13 11:14:59 +0000109 return accept(s, addr, reinterpret_cast<int*>(addrlen));
110#endif
111}
112
Jim Flynnbbfe6032020-07-20 16:57:44 +0100113} // pipe
114} // arm