]> PatchyGit - patchyircd.git/commitdiff
add CTRL-C support for Windows
authorEgor <egor@patchysicp.xyz>
Mon, 2 May 2022 14:48:54 +0000 (17:48 +0300)
committerEgor <egor@patchysicp.xyz>
Mon, 2 May 2022 14:54:05 +0000 (17:54 +0300)
main.c

diff --git a/main.c b/main.c
index 40bf94d..be5ceec 100644 (file)
--- 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