# HG changeset patch # User Michael Pavone # Date 1588313750 25200 # Node ID 5a76a7373823ad9584e806da87251fb03765bb14 # Parent d01527615c7c7fe980181733b154e46eaef64415 Get WIP net play code compiling on Windows and cleanup some unistd.h includes diff -r d01527615c7c -r 5a76a7373823 event_log.c --- a/event_log.c Wed Apr 29 23:53:39 2020 -0700 +++ b/event_log.c Thu Apr 30 23:15:50 2020 -0700 @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #endif @@ -46,6 +45,7 @@ void event_log_tcp(char *address, char *port) { struct addrinfo request, *result; + socket_init(); memset(&request, 0, sizeof(request)); request.ai_family = AF_INET; request.ai_socktype = SOCK_STREAM; @@ -57,19 +57,19 @@ warning("Failed to open event log listen socket on %s:%s\n", address, port); goto cleanup_address; } - int non_block = 1; - setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &non_block, sizeof(non_block)); + int param = 1; + setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, (const char *)¶m, sizeof(param)); if (bind(listen_sock, result->ai_addr, result->ai_addrlen) < 0) { warning("Failed to bind event log listen socket on %s:%s\n", address, port); - close(listen_sock); + socket_close(listen_sock); goto cleanup_address; } if (listen(listen_sock, 3) < 0) { warning("Failed to listen for event log remotes on %s:%s\n", address, port); - close(listen_sock); + socket_close(listen_sock); goto cleanup_address; } - fcntl(listen_sock, F_SETFL, O_NONBLOCK); + socket_blocking(listen_sock, 0); active = 1; cleanup_address: freeaddrinfo(result); @@ -136,7 +136,7 @@ int remote = accept(listen_sock, NULL, NULL); if (remote != -1) { if (num_remotes == 7) { - close(remote); + socket_close(remote); } else { printf("remote %d connected\n", num_remotes); remotes[num_remotes] = remote; @@ -146,7 +146,6 @@ } size_t min_progress = 0; for (int i = 0; i < num_remotes; i++) { - errno = 0; int sent = 1; if (remote_needs_state[i]) { remote_send_progress[i] = buffer.size; @@ -186,8 +185,8 @@ sent = send(remotes[i], buffer.data + remote_send_progress[i], buffer.size - remote_send_progress[i], 0); if (sent >= 0) { remote_send_progress[i] += sent; - } else if (errno != EAGAIN && errno != EWOULDBLOCK) { - close(remotes[i]); + } else if (socket_error_is_wouldblock()) { + socket_close(remotes[i]); remotes[i] = remotes[num_remotes-1]; remote_send_progress[i] = remote_send_progress[num_remotes-1]; remote_needs_state[i] = remote_needs_state[num_remotes-1]; @@ -285,12 +284,12 @@ ) { remote_send_progress[i] = buffer.size; remote_needs_state[i] = 0; - fcntl(remotes[i], F_SETFL, O_NONBLOCK); + socket_blocking(remotes[i], 0); int flag = 1; - setsockopt(remotes[i], IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)); + setsockopt(remotes[i], IPPROTO_TCP, TCP_NODELAY, (const char *)&flag, sizeof(flag)); fully_active = 1; } else { - close(remotes[i]); + socket_close(remotes[i]); remotes[i] = remotes[num_remotes-1]; remote_send_progress[i] = remote_send_progress[num_remotes-1]; remote_needs_state[i] = remote_needs_state[num_remotes-1]; @@ -328,6 +327,7 @@ void init_event_reader_tcp(event_reader *reader, char *address, char *port) { struct addrinfo request, *result; + socket_init(); memset(&request, 0, sizeof(request)); request.ai_family = AF_INET; request.ai_socktype = SOCK_STREAM; @@ -354,9 +354,9 @@ } reader->buffer.size += bytes; } - fcntl(reader->socket, F_SETFL, O_NONBLOCK); + socket_blocking(reader->socket, 0); int flag = 1; - setsockopt(reader->socket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)); + setsockopt(reader->socket, IPPROTO_TCP, TCP_NODELAY, (const char *)&flag, sizeof(flag)); } uint8_t reader_next_event(event_reader *reader, uint32_t *cycle_out) @@ -365,7 +365,7 @@ uint8_t blocking = 0; if (reader->buffer.size - reader->buffer.cur_pos < 9) { //set back to block mode - fcntl(reader->socket, F_SETFL, 0); + socket_blocking(reader->socket, 1); blocking = 1; } if (reader->storage - (reader->buffer.size - reader->buffer.cur_pos) < 128 * 1024) { @@ -384,16 +384,14 @@ int bytes = 128; while (bytes > 127 && reader->buffer.size < reader->storage) { - errno = 0; bytes = recv(reader->socket, reader->buffer.data + reader->buffer.size, reader->storage - reader->buffer.size, 0); if (bytes >= 0) { reader->buffer.size += bytes; if (blocking && reader->buffer.size - reader->buffer.cur_pos >= 9) { - fcntl(reader->socket, F_SETFL, O_NONBLOCK); + socket_blocking(reader->socket, 0); } - } else if (errno != EAGAIN && errno != EWOULDBLOCK) { - puts("Connection closed"); - exit(0); + } else if (!socket_error_is_wouldblock()) { + printf("Connection closed, error = %X\n", socket_last_error()); } } } diff -r d01527615c7c -r 5a76a7373823 gdb_remote.c --- a/gdb_remote.c Wed Apr 29 23:53:39 2020 -0700 +++ b/gdb_remote.c Thu Apr 30 23:15:50 2020 -0700 @@ -18,13 +18,13 @@ #define GDB_OUT_FD STDOUT_FILENO #define GDB_READ read #define GDB_WRITE write +#include #endif #include "gdb_remote.h" #include "68kinst.h" #include "debug.h" #include "util.h" -#include #include #include #include @@ -558,21 +558,13 @@ } } -#ifdef _WIN32 -void gdb_cleanup(void) -{ - WSACleanup(); -} -WSADATA wsa_data; -#endif - void gdb_remote_init(void) { buf = malloc(INITIAL_BUFFER_SIZE); curbuf = NULL; bufsize = INITIAL_BUFFER_SIZE; #ifdef _WIN32 - WSAStartup(MAKEWORD(2,2), &wsa_data); + socket_init(); struct addrinfo request, *result; memset(&request, 0, sizeof(request)); @@ -596,7 +588,7 @@ if (gdb_sock < 0) { fatal_error("accept returned an error while listening on GDB remote debugging socket"); } - closesocket(listen_sock); + socket_close(listen_sock); #else disable_stdout_messages(); #endif diff -r d01527615c7c -r 5a76a7373823 render_sdl.c --- a/render_sdl.c Wed Apr 29 23:53:39 2020 -0700 +++ b/render_sdl.c Thu Apr 30 23:15:50 2020 -0700 @@ -1136,7 +1136,6 @@ atexit(render_quit); } -#include static int in_toggle; void render_config_updated(void) diff -r d01527615c7c -r 5a76a7373823 util.c --- a/util.c Wed Apr 29 23:53:39 2020 -0700 +++ b/util.c Thu Apr 30 23:15:50 2020 -0700 @@ -7,7 +7,6 @@ #include #include -#include #include #ifdef __ANDROID__ @@ -532,6 +531,8 @@ } #ifdef _WIN32 +#define WINVER 0x501 +#include #include #include @@ -679,7 +680,76 @@ return CreateDirectory(path, NULL); } +static WSADATA wsa_data; +static void socket_cleanup(void) +{ + WSACleanup(); +} + +void socket_init(void) +{ + static uint8_t started; + if (!started) { + started = 1; + WSAStartup(MAKEWORD(2,2), &wsa_data); + atexit(socket_cleanup); + } +} + +int socket_blocking(int sock, int should_block) +{ + u_long param = !should_block; + if (ioctlsocket(sock, FIONBIO, ¶m)) { + return WSAGetLastError(); + } + return 0; +} + +void socket_close(int sock) +{ + closesocket(sock); +} + +int socket_last_error(void) +{ + return WSAGetLastError(); +} + +int socket_error_is_wouldblock(void) +{ + return WSAGetLastError() == WSAEWOULDBLOCK; +} + #else +#include +#include + +void socket_init(void) +{ +} + +int socket_blocking(int sock, int should_block) +{ + if (fcntl(listen_sock, F_SETFL, should_block ? 0 : O_NONBLOCK)) { + return errno; + } + return 0; +} + +void socket_close(int sock) +{ + close(sock); +} + +int socket_last_error(void) +{ + return errno; +} + +int socket_error_is_wouldblock(void) +{ + return errno == EAGAIN || errno == EWOULDBLOCK; +} char * get_home_dir() { diff -r d01527615c7c -r 5a76a7373823 util.h --- a/util.h Wed Apr 29 23:53:39 2020 -0700 +++ b/util.h Thu Apr 30 23:15:50 2020 -0700 @@ -90,5 +90,15 @@ void disable_stdout_messages(void); //Deletes a file, returns true on success, false on failure uint8_t delete_file(char *path); +//Initializes the socket library on platforms that need it +void socket_init(void); +//Sets a sockt to blocking or non-blocking mode +int socket_blocking(int sock, int should_block); +//Close a socket +void socket_close(int sock); +//Return the last error on a socket operation +int socket_last_error(void); +//Returns if the last socket error was EAGAIN/EWOULDBLOCK +int socket_error_is_wouldblock(void); #endif //UTIL_H_