blob: 2a656552f117b8cea65f3ee3b9370792b9acb7e0 [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>
Jim Flynnbbfe6032020-07-20 16:57:44 +010011#include <common/include/Conversion.hpp>
Rob Hughes25b74362020-01-13 11:14:59 +000012#endif
13
Jim Flynnbbfe6032020-07-20 16:57:44 +010014#if defined(__APPLE__) || defined(_MSC_VER) || defined(__MINGW32__)
15#include <common/include/IgnoreUnused.hpp>
16#endif
17
18#if defined(__MINGW32__)
19#include <common/include/Conversion.hpp>
20#include <common/include/NumericCast.hpp>
21#endif
22
23namespace arm
Rob Hughes25b74362020-01-13 11:14:59 +000024{
Jim Flynnbbfe6032020-07-20 16:57:44 +010025namespace pipe
Rob Hughes25b74362020-01-13 11:14:59 +000026{
27
28bool Initialize()
29{
Jim Flynn6da6a452020-07-14 14:26:27 +010030#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000031 return true;
Jim Flynnbbfe6032020-07-20 16:57:44 +010032#elif defined(_MSC_VER) || defined(__MINGW32__)
Rob Hughes25b74362020-01-13 11:14:59 +000033 WSADATA wsaData;
34 return WSAStartup(MAKEWORD(2, 2), &wsaData) == 0;
35#endif
36}
37
38int Close(Socket s)
39{
Jim Flynn6da6a452020-07-14 14:26:27 +010040#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000041 return close(s);
Jim Flynnbbfe6032020-07-20 16:57:44 +010042#elif defined(_MSC_VER) || defined(__MINGW32__)
Rob Hughes25b74362020-01-13 11:14:59 +000043 return closesocket(s);
44#endif
45}
46
47
48bool SetNonBlocking(Socket s)
49{
Jim Flynn6da6a452020-07-14 14:26:27 +010050#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000051 const int currentFlags = fcntl(s, F_GETFL);
52 return fcntl(s, F_SETFL, currentFlags | O_NONBLOCK) == 0;
53#elif defined(_MSC_VER)
54 u_long mode = 1;
55 return ioctlsocket(s, FIONBIO, &mode) == 0;
Jim Flynnbbfe6032020-07-20 16:57:44 +010056#elif defined(__MINGW32__)
57 u_long mode = 1;
58 return ioctlsocket(s, arm::pipe::numeric_cast<long>(FIONBIO), &mode) == 0;
Rob Hughes25b74362020-01-13 11:14:59 +000059#endif
60}
61
62
63long Write(Socket s, const void* buf, size_t len)
64{
Jim Flynn6da6a452020-07-14 14:26:27 +010065#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000066 return write(s, buf, len);
Jim Flynnbbfe6032020-07-20 16:57:44 +010067#elif defined(_MSC_VER) || defined(__MINGW32__)
Rob Hughesb98032f2020-04-24 11:41:34 +010068 return send(s, static_cast<const char*>(buf), static_cast<int>(len), 0);
Rob Hughes25b74362020-01-13 11:14:59 +000069#endif
70}
71
72
73long Read(Socket s, void* buf, size_t len)
74{
Jim Flynn6da6a452020-07-14 14:26:27 +010075#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000076 return read(s, buf, len);
Jim Flynnbbfe6032020-07-20 16:57:44 +010077#elif defined(_MSC_VER) || defined(__MINGW32__)
Rob Hughesb98032f2020-04-24 11:41:34 +010078 return recv(s, static_cast<char*>(buf), static_cast<int>(len), 0);
Rob Hughes25b74362020-01-13 11:14:59 +000079#endif
80}
81
David Monahan5277ad52020-01-22 15:40:34 +000082int Ioctl(Socket s, unsigned long int cmd, void* arg)
Rob Hughes25b74362020-01-13 11:14:59 +000083{
Jim Flynn6da6a452020-07-14 14:26:27 +010084#if defined(__unix__) || defined(__APPLE__)
Jim Flynnbbfe6032020-07-20 16:57:44 +010085 ARM_PIPE_NO_CONVERSION_WARN_BEGIN
David Monahan5277ad52020-01-22 15:40:34 +000086 return ioctl(s, static_cast<int>(cmd), arg);
Jim Flynnbbfe6032020-07-20 16:57:44 +010087 ARM_PIPE_NO_CONVERSION_WARN_END
88#elif defined(_MSC_VER) || defined(__MINGW32__)
89 ARM_PIPE_NO_CONVERSION_WARN_BEGIN
Rob Hughes25b74362020-01-13 11:14:59 +000090 return ioctlsocket(s, cmd, static_cast<u_long*>(arg));
Jim Flynnbbfe6032020-07-20 16:57:44 +010091 ARM_PIPE_NO_CONVERSION_WARN_END
Rob Hughes25b74362020-01-13 11:14:59 +000092#endif
93}
94
95
David Monahan5277ad52020-01-22 15:40:34 +000096int Poll(PollFd* fds, nfds_t numFds, int timeout)
Rob Hughes25b74362020-01-13 11:14:59 +000097{
Jim Flynn6da6a452020-07-14 14:26:27 +010098#if defined(__unix__) || defined(__APPLE__)
Rob Hughes25b74362020-01-13 11:14:59 +000099 return poll(fds, numFds, timeout);
Jim Flynnbbfe6032020-07-20 16:57:44 +0100100#elif defined(_MSC_VER) || defined(__MINGW32__)
101 return WSAPoll(fds, arm::pipe::numeric_cast<unsigned long>(numFds), timeout);
Rob Hughes25b74362020-01-13 11:14:59 +0000102#endif
103}
104
105
Jim Flynnbbfe6032020-07-20 16:57:44 +0100106arm::pipe::Socket Accept(Socket s, sockaddr* addr, socklen_t* addrlen, int flags)
Rob Hughes25b74362020-01-13 11:14:59 +0000107{
108#if defined(__unix__)
109 return accept4(s, addr, addrlen, flags);
Jim Flynn6da6a452020-07-14 14:26:27 +0100110#elif defined(__APPLE__)
Jim Flynnbbfe6032020-07-20 16:57:44 +0100111 IgnoreUnused(flags);
Jim Flynn6da6a452020-07-14 14:26:27 +0100112 return accept(s, addr, addrlen);
Jim Flynnbbfe6032020-07-20 16:57:44 +0100113#elif defined(_MSC_VER) || defined(__MINGW32__)
114 IgnoreUnused(flags);
Rob Hughes25b74362020-01-13 11:14:59 +0000115 return accept(s, addr, reinterpret_cast<int*>(addrlen));
116#endif
117}
118
Jim Flynnbbfe6032020-07-20 16:57:44 +0100119} // pipe
120} // arm