From: Egor Date: Mon, 2 May 2022 14:48:54 +0000 (+0300) Subject: add CTRL-C support for Windows X-Git-Url: https://git.patchysicp.xyz/?a=commitdiff_plain;h=ea32d15b547e540544b8c5c9899161364f354a20;p=patchyircd.git add CTRL-C support for Windows --- diff --git a/main.c b/main.c index 40bf94d..be5ceec 100644 --- a/main.c +++ b/main.c @@ -20,8 +20,49 @@ static void set_handler() perror("sigaction"); } #else -#define is_running 1 -#define set_handler() +static int is_running = 1; +static SOCKET self_sock = INVALID_SOCKET; +static BOOL WINAPI on_sigint(DWORD dwCtrlType) +{ + if ((dwCtrlType == CTRL_C_EVENT || dwCtrlType == CTRL_CLOSE_EVENT) && is_running) { + is_running = 0; + char x; + if (self_sock != INVALID_SOCKET) { + send(self_sock, &x, 0, 0); // FIXME: this could EAGAIN in theory + } + return TRUE; + } else { + return FALSE; + } +} +static void set_handler() +{ + SetConsoleCtrlHandler(on_sigint, TRUE); + + self_sock = socket(AF_INET, SOCK_DGRAM, 0); + if (self_sock == INVALID_SOCKET) { + net_perror("ERROR CREATING SELF SOCK"); + return; + } + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(0x7F000069); + int addrlen = sizeof(sin); + if (bind(self_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) + goto err; + if (getsockname(self_sock, (struct sockaddr *)&sin, &addrlen) == -1) + goto err; + if (connect(self_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) + goto err; + if (net_nonblock(self_sock) == -1) + goto err; + return; +err: + net_perror("ERROR CREATING SELF SOCK"); + closesocket(self_sock); + self_sock = INVALID_SOCKET; +} #endif // Client linked list @@ -40,7 +81,6 @@ fd_set readfds; #endif int main() { - set_handler(); int opt = 1; SOCKET serverSocketV4 = 0; SOCKET serverSocketV6 = 0; @@ -53,6 +93,7 @@ int main() { fflush(stdout); net_init(); + set_handler(); databuf.buf = malloc(sizeof(char) * 512); databuf.cap = 512; @@ -151,6 +192,12 @@ int main() { #ifdef SUPPORT_IPV6 FD_SET(serverSocketV6, &readfds); #endif +#ifdef _WIN32 + // we don't need to do highestFD for this on, cuz it's windows only + if (self_sock != INVALID_SOCKET) + FD_SET(self_sock, &readfds); +#endif + // Set highestFD if(serverSocketV4 < serverSocketV6) highestFD = serverSocketV6; else highestFD = serverSocketV4; @@ -171,6 +218,13 @@ int main() { #endif net_perror("ERROR SELECT"); } +#ifdef _WIN32 + if (self_sock != INVALID_SOCKET && FD_ISSET(self_sock, &readfds)) { + char x; + while (recv(self_sock, &x, 0, 0) != -1) + ; + } +#endif // Accept new connections // TODO: Optimize this with goto