|
|
@@ -1,11 +1,46 @@
|
|
|
-#include "PikaPlatform_socket.h"
|
|
|
+#include "PikaPlatform_socket.h"
|
|
|
/*
|
|
|
The functinos start with PIKA_WEAK are weak functions,
|
|
|
you need to override them in your platform.
|
|
|
*/
|
|
|
|
|
|
+#ifdef _WIN32
|
|
|
+#pragma comment(lib, "ws2_32.lib")
|
|
|
+
|
|
|
+static int pika_platform_winsock_initialized = 0;
|
|
|
+
|
|
|
+int pika_platform_init_winsock() {
|
|
|
+ if(0 == pika_platform_winsock_initialized) {
|
|
|
+ WSADATA wsaData;
|
|
|
+ int res = WSAStartup(MAKEWORD(2, 2), &wsaData);
|
|
|
+ if (res != 0) {
|
|
|
+ __platform_printf("WSAStartup failed with error: %d\n", res);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ pika_platform_winsock_initialized = 1;
|
|
|
+ }
|
|
|
+ else if(0 < pika_platform_winsock_initialized)
|
|
|
+ {
|
|
|
+ pika_platform_winsock_initialized++;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int pika_platform_cleanup_winsock() {
|
|
|
+ if(1 == pika_platform_winsock_initialized) {
|
|
|
+ WSACleanup();
|
|
|
+ pika_platform_winsock_initialized = 0;
|
|
|
+ }
|
|
|
+ else if(1 < pika_platform_winsock_initialized)
|
|
|
+ {
|
|
|
+ pika_platform_winsock_initialized--;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
PIKA_WEAK int pika_platform_socket(int __domain, int __type, int __protocol) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return socket(__domain, __type, __protocol);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -15,7 +50,7 @@ PIKA_WEAK int pika_platform_socket(int __domain, int __type, int __protocol) {
|
|
|
PIKA_WEAK int pika_platform_bind(int __fd,
|
|
|
const struct sockaddr* __addr,
|
|
|
socklen_t __addr_len) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return bind(__fd, __addr, __addr_len);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -23,7 +58,7 @@ PIKA_WEAK int pika_platform_bind(int __fd,
|
|
|
}
|
|
|
|
|
|
PIKA_WEAK int pika_platform_listen(int __fd, int __n) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return listen(__fd, __n);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -33,7 +68,7 @@ PIKA_WEAK int pika_platform_listen(int __fd, int __n) {
|
|
|
PIKA_WEAK int pika_platform_accept(int __fd,
|
|
|
struct sockaddr* __addr,
|
|
|
socklen_t* __addr_len) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return accept(__fd, __addr, __addr_len);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -43,7 +78,7 @@ PIKA_WEAK int pika_platform_accept(int __fd,
|
|
|
PIKA_WEAK int pika_platform_connect(int __fd,
|
|
|
const struct sockaddr* __addr,
|
|
|
socklen_t __addr_len) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return connect(__fd, __addr, __addr_len);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -51,7 +86,7 @@ PIKA_WEAK int pika_platform_connect(int __fd,
|
|
|
}
|
|
|
|
|
|
PIKA_WEAK int pika_platform_htons(int __hostshort) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return htons(__hostshort);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -60,7 +95,7 @@ PIKA_WEAK int pika_platform_htons(int __hostshort) {
|
|
|
|
|
|
/* gethostbyname */
|
|
|
PIKA_WEAK struct hostent* pika_platform_gethostbyname(const char* __name) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return gethostbyname(__name);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -68,9 +103,9 @@ PIKA_WEAK struct hostent* pika_platform_gethostbyname(const char* __name) {
|
|
|
}
|
|
|
|
|
|
/* inet_ntoa */
|
|
|
-PIKA_WEAK char* pika_platform_inet_ntoa(struct in_addr __in) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
- return inet_ntoa(__in);
|
|
|
+PIKA_WEAK char* pika_platform_inet_ntoa(struct in_addr in_addr_val) {
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
+ return inet_ntoa(in_addr_val);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
#endif
|
|
|
@@ -80,7 +115,7 @@ PIKA_WEAK int pika_platform_send(int __fd,
|
|
|
const void* __buf,
|
|
|
size_t __n,
|
|
|
int __flags) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return send(__fd, __buf, __n, __flags);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -91,7 +126,7 @@ PIKA_WEAK int pika_platform_recv(int __fd,
|
|
|
void* __buf,
|
|
|
size_t __n,
|
|
|
int __flags) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return recv(__fd, __buf, __n, __flags);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -101,7 +136,7 @@ PIKA_WEAK int pika_platform_recv(int __fd,
|
|
|
|
|
|
/* gethostname */
|
|
|
PIKA_WEAK int pika_platform_gethostname(char* __name, size_t __len) {
|
|
|
-#if defined(__linux__)
|
|
|
+#if defined(__linux__) || defined(_WIN32)
|
|
|
return gethostname(__name, __len);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -113,7 +148,7 @@ PIKA_WEAK int pika_platform_getaddrinfo(const char* __name,
|
|
|
const char* __service,
|
|
|
const struct addrinfo* __req,
|
|
|
struct addrinfo** __pai) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return getaddrinfo(__name, __service, __req, __pai);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -121,7 +156,7 @@ PIKA_WEAK int pika_platform_getaddrinfo(const char* __name,
|
|
|
}
|
|
|
|
|
|
PIKA_WEAK void pika_platform_freeaddrinfo(struct addrinfo* __ai) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
freeaddrinfo(__ai);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -133,7 +168,7 @@ PIKA_WEAK int pika_platform_setsockopt(int __fd,
|
|
|
int __optname,
|
|
|
const void* __optval,
|
|
|
socklen_t __optlen) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return setsockopt(__fd, __level, __optname, __optval, __optlen);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
@@ -143,6 +178,16 @@ PIKA_WEAK int pika_platform_setsockopt(int __fd,
|
|
|
PIKA_WEAK int pika_platform_fcntl(int fd, int cmd, long arg) {
|
|
|
#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
return fcntl(fd, cmd, arg);
|
|
|
+#elif defined(_WIN32)
|
|
|
+ if (cmd == F_GETFL) {
|
|
|
+ u_long mode = 0;
|
|
|
+ ioctlsocket(fd, FIONBIO, &mode);
|
|
|
+ return (mode ? O_NONBLOCK : 0);
|
|
|
+ } else if (cmd == F_SETFL) {
|
|
|
+ u_long mode = (arg & O_NONBLOCK) ? 1 : 0;
|
|
|
+ return ioctlsocket(fd, FIONBIO, &mode);
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|
|
|
#endif
|
|
|
@@ -152,6 +197,8 @@ PIKA_WEAK int pika_platform_fcntl(int fd, int cmd, long arg) {
|
|
|
PIKA_WEAK int pika_platform_close(int __fd) {
|
|
|
#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
return close(__fd);
|
|
|
+#elif defined(_WIN32)
|
|
|
+ return closesocket(__fd);
|
|
|
#elif PIKA_FREERTOS_ENABLE
|
|
|
return closesocket(__fd);
|
|
|
#else
|
|
|
@@ -160,7 +207,7 @@ PIKA_WEAK int pika_platform_close(int __fd) {
|
|
|
}
|
|
|
|
|
|
PIKA_WEAK int pika_platform_write(int __fd, const void* __buf, size_t __nbyte) {
|
|
|
-#if defined(__linux__) || PIKA_LWIP_ENABLE
|
|
|
+#if defined(__linux__) || defined(_WIN32) || PIKA_LWIP_ENABLE
|
|
|
return write(__fd, __buf, __nbyte);
|
|
|
#else
|
|
|
WEAK_FUNCTION_NEED_OVERRIDE_ERROR();
|