summaryrefslogtreecommitdiffhomepage
path: root/NetEx
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2022-03-31 22:59:55 +0200
committerAki <please@ignore.pl>2022-03-31 22:59:55 +0200
commit7f4b865a5bf94dea63ff5510a801df0ad315bfdb (patch)
tree77ac1b18a1ba4e76723e87e31661652343913b0c /NetEx
parent72733a1a559f67a5e50ff5ffd444fec4ec6672b2 (diff)
downloadstarshatter-7f4b865a5bf94dea63ff5510a801df0ad315bfdb.zip
starshatter-7f4b865a5bf94dea63ff5510a801df0ad315bfdb.tar.gz
starshatter-7f4b865a5bf94dea63ff5510a801df0ad315bfdb.tar.bz2
Added naive support for posix platforms in NetSock
Diffstat (limited to 'NetEx')
-rw-r--r--NetEx/NetSock.cpp64
1 files changed, 51 insertions, 13 deletions
diff --git a/NetEx/NetSock.cpp b/NetEx/NetSock.cpp
index 38ce9d5..3d3da63 100644
--- a/NetEx/NetSock.cpp
+++ b/NetEx/NetSock.cpp
@@ -13,7 +13,25 @@
#include "NetSock.h"
+#ifdef _WIN32
#include <winsock2.h>
+using socklen_t = int;
+#else
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <unistd.h>
+#include <fcntl.h>
+#define INVALID_SOCKET -1
+#define SOCKET_ERROR -1
+#define WSAENETDOWN ENETDOWN
+#define WSAENETRESET ENETRESET
+#define WSAEINTR EINTR
+#define WSAESHUTDOWN ESHUTDOWN
+#define WSAECONNABORTED ECONNABORTED
+#define WSAECONNRESET ECONNRESET
+#define WSAETIMEDOUT ETIMEDOUT
+#define WSAEWOULDBLOCK EWOULDBLOCK
+#endif
#include <cstdint>
@@ -94,11 +112,11 @@ NetSock::accept(NetAddr* addr)
{
if (closed || s == INVALID_SOCKET) return 0;
- SOCKET conn = INVALID_SOCKET;
+ int conn = INVALID_SOCKET;
if (addr) {
sockaddr a;
- int asize = sizeof(a);
+ socklen_t asize = sizeof(a);
conn = ::accept(s, &a, &asize);
@@ -189,7 +207,7 @@ NetSock::recvfrom(NetAddr* a)
int rlen = 0;
if (a) {
- int addrlen = a->GetSockAddrLength();
+ socklen_t addrlen = a->GetSockAddrLength();
rlen = ::recvfrom(s, rbuf, sizeof(rbuf), 0, a->GetSockAddr(), &addrlen);
a->InitFromSockAddr();
}
@@ -216,21 +234,20 @@ NetSock::select(SELECT_TYPE t, long seconds, long microseconds)
{
if (closed || s == INVALID_SOCKET) return INVALID_SOCKET;
- FD_SET fd;
- ZeroMemory(&fd, sizeof(fd));
+ fd_set fd;
+ std::memset(&fd, 0, sizeof(fd));
FD_SET(s, &fd);
- TIMEVAL timeval = {seconds, microseconds};
- TIMEVAL* timeout = &timeval;
+ struct timeval timeout = {seconds, microseconds};
if (t == SELECT_READ)
- return stat = ::select(1, &fd, 0, 0, timeout);
+ return stat = ::select(1, &fd, 0, 0, &timeout);
else if (t == SELECT_WRITE)
- return stat = ::select(1, 0, &fd, 0, timeout);
+ return stat = ::select(1, 0, &fd, 0, &timeout);
else if (t == (SELECT_READ|SELECT_WRITE))
- return stat = ::select(1, &fd, &fd, 0, timeout);
+ return stat = ::select(1, &fd, &fd, 0, &timeout);
return 0;
}
@@ -245,8 +262,12 @@ NetSock::set_timeout(int msecs)
// zero timeout means non-blocking
if (msecs == 0) {
- u_long nonblocking = 1;
- if (::ioctlsocket(s, FIONBIO, &nonblocking) == SOCKET_ERROR) {
+#ifdef _WIN32
+ u_long nonblocking = 1;
+ if (::ioctlsocket(s, FIONBIO, &nonblocking) == SOCKET_ERROR) {
+#else
+ if (::fcntl(s, F_SETFL, (fcntl(s, F_GETFL, 0) | O_NONBLOCK)) == SOCKET_ERROR) {
+#endif
stat = NetLayer::GetLastError();
return stat;
}
@@ -255,8 +276,12 @@ NetSock::set_timeout(int msecs)
// non-zero timeout means blocking
else {
if (current_timeout == 0) {
+#ifdef _WIN32
u_long nonblocking = 0; // disable non-blocking
if (::ioctlsocket(s, FIONBIO, &nonblocking) == SOCKET_ERROR) {
+#else
+ if (::fcntl(s, F_SETFL, (fcntl(s, F_GETFL, 0) & ~O_NONBLOCK)) == SOCKET_ERROR) {
+#endif
stat = NetLayer::GetLastError();
return stat;
}
@@ -286,7 +311,11 @@ int
NetSock::shutdown_input()
{
if (closed || s == INVALID_SOCKET) return INVALID_SOCKET;
+#ifdef _WIN32
::shutdown(s, SD_RECEIVE);
+#else
+ ::shutdown(s, SHUT_RD);
+#endif
return 0;
}
@@ -296,7 +325,11 @@ int
NetSock::shutdown_output()
{
if (closed || s == INVALID_SOCKET) return INVALID_SOCKET;
+#ifdef _WIN32
::shutdown(s, SD_SEND);
+#else
+ ::shutdown(s, SHUT_WR);
+#endif
return 0;
}
@@ -306,8 +339,13 @@ int
NetSock::close()
{
if (s != INVALID_SOCKET && !closed) {
+#ifdef _WIN32
::shutdown(s, SD_BOTH);
::closesocket(s);
+#else
+ ::shutdown(s, SHUT_RDWR);
+ ::close(s);
+#endif
closed = true;
}
@@ -321,7 +359,7 @@ std::uint32_t
NetSock::max_packet_size() const
{
std::uint32_t size = 0;
- int len = sizeof(size);
+ socklen_t len = sizeof(size);
::getsockopt(s, SOL_SOCKET, 0x2003, (char*) &size, &len);