Added mock gdbstub implementation
This commit is contained in:
71
src/gdbstub/gdbstub.c
Normal file
71
src/gdbstub/gdbstub.c
Normal file
@@ -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;
|
||||
}
|
7
src/gdbstub/gdbstub.h
Normal file
7
src/gdbstub/gdbstub.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef GDBSTUB_H
|
||||
#define GDBSTUB_H
|
||||
|
||||
void gdbstub_start();
|
||||
void gdbstub_wait_for_connection();
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user