summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--event_log.c40
-rw-r--r--gdb_remote.c14
-rwxr-xr-xrender_sdl.c1
-rw-r--r--util.c72
-rw-r--r--util.h10
5 files changed, 103 insertions, 34 deletions
diff --git a/event_log.c b/event_log.c
index 2c5d9f1..5013d4a 100644
--- a/event_log.c
+++ b/event_log.c
@@ -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 @@ static int num_remotes;
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 @@ void event_log_tcp(char *address, char *port)
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 @@ static void flush_socket(void)
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 @@ static void flush_socket(void)
}
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 @@ static void flush_socket(void)
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 @@ void event_state(uint32_t cycle, serialize_buffer *state)
) {
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(event_reader *reader, uint8_t *data, size_t size)
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 @@ void init_event_reader_tcp(event_reader *reader, char *address, char *port)
}
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 reader_next_event(event_reader *reader, uint32_t *cycle_out)
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 @@ uint8_t reader_next_event(event_reader *reader, uint32_t *cycle_out)
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 --git a/gdb_remote.c b/gdb_remote.c
index 001fe47..6cf1d67 100644
--- a/gdb_remote.c
+++ b/gdb_remote.c
@@ -18,13 +18,13 @@ int gdb_sock;
#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 @@ void gdb_debug_enter(m68k_context * context, uint32_t pc)
}
}
-#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 @@ void gdb_remote_init(void)
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 --git a/render_sdl.c b/render_sdl.c
index f2d050b..5526dd7 100755
--- a/render_sdl.c
+++ b/render_sdl.c
@@ -1136,7 +1136,6 @@ void render_init(int width, int height, char * title, uint8_t fullscreen)
atexit(render_quit);
}
-#include<unistd.h>
static int in_toggle;
void render_config_updated(void)
diff --git a/util.c b/util.c
index 489f159..848fca4 100644
--- a/util.c
+++ b/util.c
@@ -7,7 +7,6 @@
#include <sys/types.h>
#include <sys/stat.h>
-#include <unistd.h>
#include <errno.h>
#ifdef __ANDROID__
@@ -532,6 +531,8 @@ void disable_stdout_messages(void)
}
#ifdef _WIN32
+#define WINVER 0x501
+#include <winsock2.h>
#include <windows.h>
#include <shlobj.h>
@@ -679,7 +680,76 @@ int ensure_dir_exists(const char *path)
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()
{
diff --git a/util.h b/util.h
index 0532fd5..014789f 100644
--- a/util.h
+++ b/util.h
@@ -90,5 +90,15 @@ void debug_message(char *format, ...);
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_