diff options
-rw-r--r-- | gdb_remote.c | 97 |
1 files changed, 81 insertions, 16 deletions
diff --git a/gdb_remote.c b/gdb_remote.c index 9dbfce4..a40068b 100644 --- a/gdb_remote.c +++ b/gdb_remote.c @@ -7,20 +7,18 @@ #define WINVER 0x501 #include <winsock2.h> #include <ws2tcpip.h> - -int gdb_sock; -#define GDB_IN_FD gdb_sock -#define GDB_OUT_FD gdb_sock -#define GDB_READ(fd, buf, bufsize) recv(fd, buf, bufsize, 0) -#define GDB_WRITE(fd, buf, bufsize) send(fd, buf, bufsize, 0) #else -#define GDB_IN_FD STDIN_FILENO -#define GDB_OUT_FD STDOUT_FILENO -#define GDB_READ read -#define GDB_WRITE write +#include <arpa/inet.h> #include <unistd.h> +#include <errno.h> #endif +#define GDB_READ(fd, buf, bufsize) recv(fd, buf, bufsize, 0) +#define GDB_WRITE(fd, buf, bufsize) send(fd, buf, bufsize, 0) +#define GDB_IN_FD gdb_sock +#define GDB_OUT_FD gdb_sock +#define INITIAL_BUFFER_SIZE (16*1024) + #include "gdb_remote.h" #include "68kinst.h" #include "debug.h" @@ -31,10 +29,6 @@ int gdb_sock; #include <stdio.h> #include <string.h> - - -#define INITIAL_BUFFER_SIZE (16*1024) - #ifdef DO_DEBUG_PRINT #define dfprintf fprintf #else @@ -48,7 +42,7 @@ size_t bufsize; int cont = 0; int expect_break_response=0; uint32_t resume_pc; - +int gdb_sock; static uint16_t branch_t; static uint16_t branch_f; @@ -550,6 +544,61 @@ void gdb_debug_enter(m68k_context * context, uint32_t pc) } } +static int set_socket_reuseaddr(const int socket_fd) +{ + const int val = 1; + const socklen_t len = sizeof(val); + return setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (void*)&val, len); +} + +static inline struct sockaddr_in sockaddr_in_any_ip_with_port(const uint16_t port) +{ + struct sockaddr_in server = {0}; + server.sin_family = AF_INET; + server.sin_addr.s_addr = INADDR_ANY; + server.sin_port = htons(port); + return server; +} + +static inline int SetNonblock(const int fd) +{ + const int flags = fcntl(fd, F_GETFL); + if (flags == -1) { + return errno; + } + const int ret = fcntl(fd, F_SETFL, flags | O_NONBLOCK); + if (ret == -1) { + return errno; + } + return 0; +} + +static int setup_socket(const uint16_t port) +{ + // This creates the socket - or quits + const int socket_fd = socket(AF_INET, SOCK_STREAM, 0); + if (socket_fd == -1) { + perror("Could not create socket"); + return -1; + } + // Make TCP port reusable in case of kill or crash. + // Deliberate explanation: https://stackoverflow.com/a/3233022 + if (set_socket_reuseaddr(socket_fd) == -1) { + perror("setsockopt failed"); + close(socket_fd); + return -1; + } + puts("Socket created"); + const struct sockaddr_in server = sockaddr_in_any_ip_with_port(port); + if (bind(socket_fd, (struct sockaddr *)&server, sizeof(server)) == -1) { + perror("Bind failed"); + close(socket_fd); + return -1; + } + printf("Binding to 0.0.0.0:%u done\n", port); + return socket_fd; +} + void gdb_remote_init(void) { buf = malloc(INITIAL_BUFFER_SIZE); @@ -582,6 +631,22 @@ void gdb_remote_init(void) } socket_close(listen_sock); #else - disable_stdout_messages(); + int listen_sock = setup_socket(3333); + if (listen_sock < 0) { + fatal_error("Failed to open GDB remote debugging socket"); + } + printf("Listening TCP 0.0.0.0:%u\n", 3333); + if (listen(listen_sock, 4) < 0) { + close(listen_sock); + fatal_error("Failed to listen on GDB remote debugging socket"); + } + struct sockaddr client_address = {0}; + socklen_t address_len = 0; + gdb_sock = accept(listen_sock, &client_address, &address_len); + if (gdb_sock < 0) { + close(listen_sock); + fatal_error("accept returned an error while listening on GDB remote debugging socket"); + } + close(listen_sock); #endif } |