• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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