changeset 1949:5a76a7373823

Get WIP net play code compiling on Windows and cleanup some unistd.h includes
author Michael Pavone <pavone@retrodev.com>
date Thu, 30 Apr 2020 23:15:50 -0700
parents d01527615c7c
children 417e0fc958cc
files event_log.c gdb_remote.c render_sdl.c util.c util.h
diffstat 5 files changed, 103 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- 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 <sys/types.h>
 #include <sys/socket.h>
 #include <unistd.h>
-#include <fcntl.h>
 #include <netdb.h>
 #include <netinet/tcp.h>
 #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 *)&param, 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());
 			}
 		}
 	}
--- 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 <unistd.h>
 #endif
 
 #include "gdb_remote.h"
 #include "68kinst.h"
 #include "debug.h"
 #include "util.h"
-#include <unistd.h>
 #include <fcntl.h>
 #include <stddef.h>
 #include <stdlib.h>
@@ -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
--- 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<unistd.h>
 static int in_toggle;
 
 void render_config_updated(void)
--- 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 <sys/types.h>
 #include <sys/stat.h>
-#include <unistd.h>
 #include <errno.h>
 
 #ifdef __ANDROID__
@@ -532,6 +531,8 @@
 }
 
 #ifdef _WIN32
+#define WINVER 0x501
+#include <winsock2.h>
 #include <windows.h>
 #include <shlobj.h>
 
@@ -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, &param)) {
+		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 <fcntl.h>
+#include <unistd.h>
+
+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()
 {
--- 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_