From a2edd3958486dcd15d323663065155645c632c5d Mon Sep 17 00:00:00 2001 From: SenySunny <460135301@qq.com> Date: Sun, 30 Jul 2023 20:30:03 +0800 Subject: [PATCH 1/2] add socket for _WIN32 --- package/socket/PikaPlatform_socket.c | 83 ++++++++++++++++++++++------ package/socket/PikaPlatform_socket.h | 21 ++++++- package/socket/_socket.c | 22 +++++++- 3 files changed, 104 insertions(+), 22 deletions(-) diff --git a/package/socket/PikaPlatform_socket.c b/package/socket/PikaPlatform_socket.c index 7364229f4..3798c0b16 100644 --- a/package/socket/PikaPlatform_socket.c +++ b/package/socket/PikaPlatform_socket.c @@ -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(); diff --git a/package/socket/PikaPlatform_socket.h b/package/socket/PikaPlatform_socket.h index d81e9036e..2cbd48a4a 100644 --- a/package/socket/PikaPlatform_socket.h +++ b/package/socket/PikaPlatform_socket.h @@ -1,4 +1,4 @@ -#include "PikaObj.h" +#include "PikaObj.h" #ifdef __linux__ #include #include @@ -6,6 +6,23 @@ #include #include #include +#elif _WIN32 +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include +#include +#include +#include +#include +#define O_NONBLOCK 0x0004 /* non blocking I/O, from BSD */ + +#define F_GETFL 3 +#define F_SETFL 4 + +int pika_platform_init_winsock(); +int pika_platform_cleanup_winsock(); #elif PIKA_LWIP_ENABLE #include #include "lwip/api.h" @@ -46,7 +63,7 @@ int pika_platform_setsockopt(int __fd, const void* __optval, socklen_t __optlen); int pika_platform_htons(int __hostshort); -char* pika_platform_inet_ntoa(struct in_addr __in); +char* pika_platform_inet_ntoa(struct in_addr in_addr_val); struct hostent* pika_platform_gethostbyname(const char* __name); /* os file API */ diff --git a/package/socket/_socket.c b/package/socket/_socket.c index ef5081d97..07035e173 100644 --- a/package/socket/_socket.c +++ b/package/socket/_socket.c @@ -1,4 +1,4 @@ -#include "PikaPlatform_socket.h" +#include "PikaPlatform_socket.h" #include "_socket_socket.h" #if !PIKASCRIPT_VERSION_REQUIRE_MINIMUN(1, 12, 0) @@ -10,6 +10,9 @@ void _socket_socket__init(PikaObj* self) { int type = obj_getInt(self, "type"); int protocol = obj_getInt(self, "protocol"); int sockfd = 0; +#ifdef _WIN32 + pika_platform_init_winsock(); +#endif sockfd = __platform_socket(family, type, protocol); if (sockfd < 0) { obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR); @@ -23,6 +26,9 @@ void _socket_socket__init(PikaObj* self) { void _socket_socket__close(PikaObj* self) { int sockfd = obj_getInt(self, "sockfd"); __platform_close(sockfd); +#ifdef _WIN32 + pika_platform_cleanup_winsock(); +#endif } void _socket_socket__send(PikaObj* self, Arg* data) { @@ -161,13 +167,22 @@ void _socket_socket__bind(PikaObj* self, char* host, int port) { char* _socket__gethostname(PikaObj* self) { char hostname_buff[128] = {0}; char* hostname = (char*)hostname_buff; - __platform_gethostname(hostname_buff, 128); +#ifdef _WIN32 + pika_platform_init_winsock(); +#endif + pika_platform_gethostname(hostname_buff, 128); +#ifdef _WIN32 + pika_platform_cleanup_winsock(); +#endif return obj_cacheStr(self, hostname); } char* _socket__gethostbyname(PikaObj *self, char* host){ struct hostent *host_entry; char *ip = NULL; +#ifdef _WIN32 + pika_platform_init_winsock(); +#endif host_entry = pika_platform_gethostbyname(host); if (host_entry == NULL) { obj_setErrorCode(self, PIKA_RES_ERR_RUNTIME_ERROR); @@ -175,6 +190,9 @@ char* _socket__gethostbyname(PikaObj *self, char* host){ return NULL; } ip = pika_platform_inet_ntoa(*((struct in_addr *)host_entry->h_addr_list[0])); +#ifdef _WIN32 + pika_platform_cleanup_winsock(); +#endif return obj_cacheStr(self, ip); } From ca3ce131278537fea7e833dfa1892ead84d3c10e Mon Sep 17 00:00:00 2001 From: SenySunny <460135301@qq.com> Date: Sun, 30 Jul 2023 20:38:55 +0800 Subject: [PATCH 2/2] add change for packages.toml --- packages.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages.toml b/packages.toml index 4e4c22619..ef7d91019 100644 --- a/packages.toml +++ b/packages.toml @@ -244,7 +244,8 @@ releases = [ "v0.1.2 6898f52a71e3a43b3126a73487770370a4a7f02c", "v0.1.3 2aafbbdc84eed84edcf5dcd7462a842a14f26a92", "v0.1.4 b9a0109c6125d16270cf02b2a07421a4baf9973c", - "v0.1.5 e74c15979a84615a921447b98c79e35de83a8427" + "v0.1.5 e74c15979a84615a921447b98c79e35de83a8427", + "v0.1.6 a2edd3958486dcd15d323663065155645c632c5d" ] [[packages]]