/* 3dsspec - Nintendo 3DS Spectrum emulator Copyright (C) 2021 Ian Cowburn This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see ------------------------------------------------------------------------- Provides an interface for debug */ #include #include #include #include #include #include <3ds.h> #include #include #include #include #include #include #include "debug.h" #include "gui.h" #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* ---------------------------------------- GLOBAL EXTERNALS */ int debug_enabled = FALSE; /* ---------------------------------------- PRIVATE DAYA */ static char debug_host[256]; static char debug_port[32]; static int sock = -1; /* ---------------------------------------- PRIVATE FUNCTIONS */ static void Error(const char *format, ...) { static char buff[4096]; va_list va; va_start(va, format); vsnprintf(buff, 4096, format, va); buff[4095] = 0; va_end(va); GUI_Alert(FALSE, buff); } static void OpenDebugConnection(void) { if (sock == -1) { struct addrinfo *addr, *addr_p; struct addrinfo hints = {0}; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if (getaddrinfo(debug_host, debug_port, &hints, &addr) == 0) { for(addr_p = addr; addr_p && sock == -1; addr_p = addr_p->ai_next) { sock = socket(addr_p->ai_family, addr_p->ai_socktype, addr_p->ai_protocol); if (sock != -1) { if (connect(sock, addr_p->ai_addr, addr_p->ai_addrlen) == -1) { Error("Failed to connect socket"); close(sock); sock = -1; } } else { Error("Failed to create socket(%d,%d,%d)\n%d %s", addr_p->ai_family, addr_p->ai_socktype, addr_p->ai_protocol, errno, strerror(errno)); } } } else { Error("Failed to getaddrinfo(%s,%s)", debug_host, debug_port); } } } /* ---------------------------------------- EXPORTED INTERFACES */ void DEBUG_SetAddress(const char *host, const char *port) { strncpy(debug_host, host, (sizeof debug_host) - 1); strncpy(debug_port, port, (sizeof debug_port) - 1); debug_host[(sizeof debug_host) - 1] = 0; debug_port[(sizeof debug_port) - 1] = 0; if (sock != -1) { close(sock); sock = -1; } } void DEBUG_Output(const char *format, ...) { static char buff[4096]; if (debug_enabled) { va_list va; OpenDebugConnection(); va_start(va, format); vsnprintf(buff, 4096, format, va); buff[4095] = 0; va_end(va); if (sock != -1) { send(sock, buff, strlen(buff), 0); } } } /* END OF FILE */