diff --git a/build.sh b/build.sh index 7fa055d9..d432b37c 100755 --- a/build.sh +++ b/build.sh @@ -5,15 +5,16 @@ clear -echo ' --/ \--' -echo ' --[ Welcome to the elinks build helper ]--' -echo ' --[ ]--' -echo ' --[ [*] select the architecture 1-4 ]--' -echo ' --[ [*] use option 5 for config ]--' -echo ' --[ [*] use option 6 for make ]--' -echo ' --[ [*] use option 7 for test ]--' -echo ' --[ [*] use option 8 for publishing ]--' -echo ' --\ /--' +echo ' --/ \--' +echo ' --[ Welcome to the elinks build helper ]--' +echo ' --[ ]--' +echo ' --[ [*] use option 1 to change arch ]--' +echo ' --[ [*] use option 4 to config and make ]--' +echo ' --[ [*] use option 5 for config ]--' +echo ' --[ [*] use option 6 for make ]--' +echo ' --[ [*] use option 7 for test ]--' +echo ' --[ [*] use option 8 for publishing ]--' +echo ' --\ /--' echo ' ' gen_conf() { @@ -33,6 +34,7 @@ configure() { CC=$1 \ LD=$2 \ LDFLAGS=$4 \ + CFLAGS="-O2 -I/usr/local/include" \ LIBS=$5 \ CXXFLAGS=$6 \ PKG_CONFIG="./pkg-config.sh" \ @@ -43,7 +45,7 @@ configure() { --enable-fastmem \ --enable-utf-8 \ --with-static \ - --without-openssl \ + --with-openssl \ --without-quickjs \ --disable-88-colors \ --disable-backtrace \ @@ -51,6 +53,7 @@ configure() { --disable-debug \ --disable-cgi \ --disable-combining \ + --disable-gpm \ --disable-gopher \ --disable-nls \ --disable-ipv6 \ @@ -178,7 +181,7 @@ set_arch() { MAKE_HOST="x86_64-w64-mingw32" BIN_SUFFIX=".exe" CXXFLAGS="-I/usr/local/include" - LDFLAGS="" + LDFLAGS="-L/usr/local/lib" LIBS="-lws2_32" elif [ "$1" = "arm32" ]; then ARCHIT="$1" diff --git a/docker/win64/Dockerfile b/docker/win64/Dockerfile index e331f82e..775a78de 100644 --- a/docker/win64/Dockerfile +++ b/docker/win64/Dockerfile @@ -1,21 +1,50 @@ # -# [ win64 ] elinks docker development environment v0.1a +# [ win64 ] elinks docker development environment v0.1b # +# [*] base system + +# get latest debian FROM debian:latest -RUN apt-get update; apt-get -y install rsync vim screen git make automake gcc-mingw-w64-x86-64 bash g++-mingw-w64-x86-64 libssl-dev +# prepare system +RUN apt-get update && apt-get -y install bash \ + rsync vim screen git make automake \ + gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 + +# [*] source build tools + +# install sources build tools and update +RUN apt-get install -y apt-src && \ + grep '^deb ' /etc/apt/sources.list | sed 's/deb /deb-src /' >> /etc/apt/sources.list && \ + apt-src update + +# [*] install sources + +# install sources for openssl and zlib1g-dev +RUN cd /root && apt-src install libssl-dev zlib1g-dev # [*] elinks openssl development support -# install sources build tools and update -RUN apt-get install -y apt-src && grep '^deb ' /etc/apt/sources.list | sed 's/deb /deb-src /' >> /etc/apt/sources.list && apt-src update - -# install openssl library source code -RUN cd /root && apt-src install libssl-dev - # build openssl library for win64 -RUN cd /root && cd `ls -d /root/openssl-*` && ./Configure mingw64 --cross-compile-prefix=x86_64-w64-mingw32- --prefix=/usr/local && make && make install +RUN cd /root && cd `ls -d /root/openssl-*` && \ +./Configure mingw64 \ + --prefix=/usr/local \ + --cross-compile-prefix=x86_64-w64-mingw32- && \ + make depend && \ + make && \ + make install_runtime_libs && \ + make install_dev + +# [*} zlib sources + +# build zlib library for win64 +RUN cd /root && cd `ls -d /root/zlib-*` && \ +CC="x86_64-w64-mingw32-gcc" \ +LD="x86_64-w64-mingw32-ldd" \ +./configure --static --prefix=/usr/local && \ +make && \ +make install # [*] elinks sources diff --git a/src/network/socket.c b/src/network/socket.c index e8ed9367..4d963921 100644 --- a/src/network/socket.c +++ b/src/network/socket.c @@ -350,8 +350,14 @@ sock_error: /* Set it non-blocking */ +#ifndef WIN32 if (set_nonblocking_fd(sock) < 0) goto sock_error; +#else + u_long mode = 1; + ioctlsocket(sock, FIONBIO, &mode); +#endif + /* Bind it to some port */ @@ -660,11 +666,16 @@ connect_socket(struct socket *csocket, struct connection_state state) continue; } +#ifndef WIN32 if (set_nonblocking_fd(sock) < 0) { if (errno && !saved_errno) saved_errno = errno; close(sock); continue; } +#else + u_long mode = 1; + ioctlsocket(sock, FIONBIO, &mode); +#endif #ifdef HAVE_INET_PTON if (pf == PF_INET && to_bind) { diff --git a/src/network/ssl/socket.c b/src/network/ssl/socket.c index d707e0a4..2b0c59cc 100644 --- a/src/network/ssl/socket.c +++ b/src/network/ssl/socket.c @@ -70,6 +70,10 @@ #endif +#ifdef WIN32 +#define SOCK_SHIFT 1024 +#endif + /* Definition of X509_NAME causes compilation error on WIN32 * due to X509_NAME redefinition in wincrypt.h */ #ifdef WIN32 @@ -433,6 +437,11 @@ ssl_connect(struct socket *socket) int ret; char *server_name; struct connection *conn = (struct connection *)socket->conn; +#ifdef WIN32 + int ssl_sock_fd = socket->fd - SOCK_SHIFT; +#endif + + /* TODO: Recode server_name to UTF-8. */ server_name = get_uri_string(conn->proxied_uri, URI_HOST); @@ -458,7 +467,12 @@ ssl_connect(struct socket *socket) ssl_set_no_tls(socket); #ifdef USE_OPENSSL + +#ifndef WIN32 SSL_set_fd((SSL *)socket->ssl, socket->fd); +#else + SSL_set_fd((SSL *)socket->ssl, ssl_sock_fd); +#endif if (socket->verify && get_opt_bool("connection.ssl.cert_verify", NULL)) SSL_set_verify((SSL *)socket->ssl, SSL_VERIFY_PEER diff --git a/src/osdep/osdep.c b/src/osdep/osdep.c index f18f9891..6d16a4a3 100644 --- a/src/osdep/osdep.c +++ b/src/osdep/osdep.c @@ -77,13 +77,6 @@ int set_nonblocking_fd(int fd) { -#ifdef WIN32 - /* on current mingw (202204) - * this is correct usage of winsock - * when compiling for win32 */ - u_long mode = 1; // set non-blocking socket - return ioctlsocket(fd, FIONBIO, &mode); -# else #if defined(O_NONBLOCK) || defined(O_NDELAY) int flags = fcntl(fd, F_GETFL, 0); @@ -101,8 +94,6 @@ set_nonblocking_fd(int fd) #else return 0; #endif - -#endif } /* Set a file descriptor to blocking mode. It returns a non-zero value on @@ -110,13 +101,6 @@ set_nonblocking_fd(int fd) int set_blocking_fd(int fd) { -#ifdef WIN32 - /* on current mingw (202204) - * this is correct usage of winsock - * when compiling for win32 */ - u_long mode = 0; // set blocking socket - return ioctlsocket(fd, FIONBIO, &mode); -# else #if defined(O_NONBLOCK) || defined(O_NDELAY) int flags = fcntl(fd, F_GETFL, 0); @@ -134,7 +118,6 @@ set_blocking_fd(int fd) #else return 0; #endif -#endif } void diff --git a/src/osdep/win32/overrides.c b/src/osdep/win32/overrides.c index 88fc9e3f..2df48dc1 100644 --- a/src/osdep/win32/overrides.c +++ b/src/osdep/win32/overrides.c @@ -371,9 +371,13 @@ win32_ioctl(int fd, long option, int *flag) int win32_socket(int pf, int type, int protocol) { - SOCKET s = socket(pf, type, protocol); + // SOCKET s = socket(pf, type, protocol); + + int s; int rc; + s = socket(PF_INET, SOCK_STREAM, 0); + if (s == INVALID_SOCKET) { rc = -1; errno = WSAGetLastError(); @@ -627,6 +631,8 @@ select_one_loop(int num_fds, struct fd_set *rd, struct fd_set *wr, } else if (sel_rc < 0) { errno = WSAGetLastError(); } + /* Lower CPU Usage WIN64 */ + Sleep (0); } } @@ -664,7 +670,7 @@ int win32_select (int num_fds, struct fd_set *rd, struct fd_set *wr, } } - errno = 0; + int errnol = 0; for (rc = 0; !expired; ) { rc += select_one_loop (num_fds, &tmp_rd, wr, &tmp_ex); @@ -679,6 +685,8 @@ int win32_select (int num_fds, struct fd_set *rd, struct fd_set *wr, expired = TRUE; } + /* Lower CPU Usage WIN64 */ + Sleep (1); if (rc) break; } @@ -694,7 +702,7 @@ int win32_select (int num_fds, struct fd_set *rd, struct fd_set *wr, else rc++; } - TRACE("-> rc %d, err %d", rc, rc < 0 ? errno : 0); + TRACE("-> rc %d, err %d", rc, rc < 0 ? errnol : 0); if (get_cmd_opt_int("verbose") == 2) select_dump(num_fds, rd, wr, ex);