parent
378d0fa463
commit
5b020b0444
@ -0,0 +1,71 @@ |
|||||||
|
#include "gdbstub.h" |
||||||
|
|
||||||
|
#include <errno.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <stdio.h> |
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
/* Sockets */ |
||||||
|
#include <sys/types.h> |
||||||
|
#include <netinet/in.h> |
||||||
|
#include <arpa/inet.h> |
||||||
|
#define INVALID_SOCKET -1 |
||||||
|
#define SOCKET_ERROR -1 |
||||||
|
typedef int socket_t; |
||||||
|
typedef struct sockaddr_in sockaddr_in_t; |
||||||
|
typedef struct sockaddr sockaddr_t; |
||||||
|
|
||||||
|
#define GDBSTUB_PORT 1234 |
||||||
|
|
||||||
|
socket_t gdbstub_server_socket; |
||||||
|
socket_t gdb_socket; |
||||||
|
|
||||||
|
/*
|
||||||
|
* Starts a server that will listen for GDB connections |
||||||
|
*/ |
||||||
|
void gdbstub_start() |
||||||
|
{ |
||||||
|
socket_t sock = socket(AF_INET, SOCK_STREAM, 0); |
||||||
|
if(sock == INVALID_SOCKET) |
||||||
|
{ |
||||||
|
fprintf(stderr, "Could not create gdbstub server socket: %s\n", strerror(errno)); |
||||||
|
exit(EXIT_FAILURE); |
||||||
|
} |
||||||
|
sockaddr_in_t sin = {0}; |
||||||
|
sin.sin_addr.s_addr = htonl(INADDR_ANY); |
||||||
|
sin.sin_family = AF_INET; |
||||||
|
sin.sin_port = htons(GDBSTUB_PORT); |
||||||
|
|
||||||
|
if(bind(sock, (sockaddr_t*) &sin, sizeof(sin)) == SOCKET_ERROR) |
||||||
|
{ |
||||||
|
fprintf(stderr, "Could not bind gdbstub server socket: %s\n", strerror(errno)); |
||||||
|
exit(EXIT_FAILURE); |
||||||
|
} |
||||||
|
|
||||||
|
if(listen(sock, 1) == SOCKET_ERROR) |
||||||
|
{ |
||||||
|
fprintf(stderr, "Could not listen gdbstub server socket: %s\n", strerror(errno)); |
||||||
|
exit(EXIT_FAILURE); |
||||||
|
} |
||||||
|
|
||||||
|
gdbstub_server_socket = sock; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait for a client (gdb) to connect to this server |
||||||
|
*/ |
||||||
|
void gdbstub_wait_for_connection() |
||||||
|
{ |
||||||
|
sockaddr_in_t csin = {0}; |
||||||
|
socket_t c_socket; |
||||||
|
socklen_t sinsize = sizeof(csin); |
||||||
|
|
||||||
|
c_socket = accept(gdbstub_server_socket, (sockaddr_t*) &csin, &sinsize); |
||||||
|
if(c_socket == INVALID_SOCKET) |
||||||
|
{ |
||||||
|
fprintf(stderr, "Could not accept client on gdbstub server: %s\n", strerror(errno)); |
||||||
|
exit(EXIT_FAILURE); |
||||||
|
} |
||||||
|
|
||||||
|
gdb_socket = c_socket; |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
#ifndef GDBSTUB_H |
||||||
|
#define GDBSTUB_H |
||||||
|
|
||||||
|
void gdbstub_start(); |
||||||
|
void gdbstub_wait_for_connection(); |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue