1 //
2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include <common/include/NetworkSockets.hpp>
7
8 #if defined(__unix__) || defined(__APPLE__)
9 #include <unistd.h>
10 #include <fcntl.h>
11 #endif
12
13 #include <common/include/Conversion.hpp>
14 #include <common/include/IgnoreUnused.hpp>
15 #include <common/include/NumericCast.hpp>
16
17 namespace arm
18 {
19 namespace pipe
20 {
21
Initialize()22 bool Initialize()
23 {
24 #if defined(__unix__) || defined(__APPLE__)
25 return true;
26 #elif defined(_MSC_VER) || defined(__MINGW32__)
27 WSADATA wsaData;
28 return WSAStartup(MAKEWORD(2, 2), &wsaData) == 0;
29 #endif
30 }
31
Close(Socket s)32 int Close(Socket s)
33 {
34 #if defined(__unix__) || defined(__APPLE__)
35 return close(s);
36 #elif defined(_MSC_VER) || defined(__MINGW32__)
37 return closesocket(s);
38 #endif
39 }
40
41
SetNonBlocking(Socket s)42 bool SetNonBlocking(Socket s)
43 {
44 #if defined(__unix__) || defined(__APPLE__)
45 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;
50 #elif defined(__MINGW32__)
51 u_long mode = 1;
52 return ioctlsocket(s, arm::pipe::numeric_cast<long>(FIONBIO), &mode) == 0;
53 #endif
54 }
55
56
Write(Socket s,const void * buf,size_t len)57 long Write(Socket s, const void* buf, size_t len)
58 {
59 #if defined(__unix__) || defined(__APPLE__)
60 return write(s, buf, len);
61 #elif defined(_MSC_VER) || defined(__MINGW32__)
62 return send(s, static_cast<const char*>(buf), static_cast<int>(len), 0);
63 #endif
64 }
65
66
Read(Socket s,void * buf,size_t len)67 long Read(Socket s, void* buf, size_t len)
68 {
69 #if defined(__unix__) || defined(__APPLE__)
70 return read(s, buf, len);
71 #elif defined(_MSC_VER) || defined(__MINGW32__)
72 return recv(s, static_cast<char*>(buf), static_cast<int>(len), 0);
73 #endif
74 }
75
Ioctl(Socket s,unsigned long int cmd,void * arg)76 int Ioctl(Socket s, unsigned long int cmd, void* arg)
77 {
78 #if defined(__unix__) || defined(__APPLE__)
79 ARM_PIPE_NO_CONVERSION_WARN_BEGIN
80 return ioctl(s, static_cast<int>(cmd), arg);
81 ARM_PIPE_NO_CONVERSION_WARN_END
82 #elif defined(_MSC_VER) || defined(__MINGW32__)
83 ARM_PIPE_NO_CONVERSION_WARN_BEGIN
84 return ioctlsocket(s, cmd, static_cast<u_long*>(arg));
85 ARM_PIPE_NO_CONVERSION_WARN_END
86 #endif
87 }
88
89
Poll(PollFd * fds,nfds_t numFds,int timeout)90 int Poll(PollFd* fds, nfds_t numFds, int timeout)
91 {
92 #if defined(__unix__) || defined(__APPLE__)
93 return poll(fds, numFds, timeout);
94 #elif defined(_MSC_VER) || defined(__MINGW32__)
95 return WSAPoll(fds, arm::pipe::numeric_cast<unsigned long>(numFds), timeout);
96 #endif
97 }
98
99
Accept(Socket s,sockaddr * addr,socklen_t * addrlen,int flags)100 arm::pipe::Socket Accept(Socket s, sockaddr* addr, socklen_t* addrlen, int flags)
101 {
102 #if defined(__unix__)
103 return accept4(s, addr, addrlen, flags);
104 #elif defined(__APPLE__)
105 IgnoreUnused(flags);
106 return accept(s, addr, addrlen);
107 #elif defined(_MSC_VER) || defined(__MINGW32__)
108 IgnoreUnused(flags);
109 return accept(s, addr, reinterpret_cast<int*>(addrlen));
110 #endif
111 }
112
113 } // pipe
114 } // arm
115