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