server: proxy: shutdown gracefully
authorKobi Mizrachi <kmizrachi18@gmail.com>
Tue, 31 Dec 2019 13:52:33 +0000 (15:52 +0200)
committerakallabeth <akallabeth@users.noreply.github.com>
Tue, 14 Jan 2020 06:58:47 +0000 (07:58 +0100)
server/proxy/freerdp_proxy.c
server/proxy/pf_client.c
server/proxy/pf_config.c
server/proxy/pf_config.h

index a90b81f..d340a45 100644 (file)
 
 #include <freerdp/build-config.h>
 #include <winpr/collections.h>
+#include <stdlib.h>
+#include <signal.h>
 
 #define TAG PROXY_TAG("server")
 
+static proxyConfig config = { 0 };
+
+static void cleanup_handler(int signum)
+{
+       printf("\n");
+       WLog_INFO(TAG, "[%s]: caught signal %d, starting cleanup...", __FUNCTION__, signum);
+
+       WLog_INFO(TAG, "freeing loaded modules and plugins.");
+       pf_modules_free();
+
+       WLog_INFO(TAG, "freeing config.");
+       pf_server_config_free_internal(&config);
+
+       WLog_INFO(TAG, "exiting.");
+       exit(signum);
+}
+
 int main(int argc, char* argv[])
 {
        const char* cfg = "config.ini";
        int status = 0;
-       proxyConfig* config = calloc(1, sizeof(proxyConfig));
-
-       if (!config)
-               return -1;
 
        if (argc > 1)
                cfg = argv[1];
 
+       /* Register cleanup handler for graceful termination */
+       signal(SIGINT, cleanup_handler);
+       signal(SIGQUIT, cleanup_handler);
+       signal(SIGTERM, cleanup_handler);
+       signal(SIGKILL, cleanup_handler);
+
        if (!pf_modules_init(FREERDP_PROXY_PLUGINDIR))
        {
                WLog_ERR(TAG, "failed to initialize proxy plugins!");
@@ -49,13 +70,13 @@ int main(int argc, char* argv[])
 
        pf_modules_list_loaded_plugins();
 
-       if (!pf_server_config_load(cfg, config))
+       if (!pf_server_config_load(cfg, &config))
                goto fail;
 
-       pf_server_config_print(config);
-       status = pf_server_start(config);
+       pf_server_config_print(&config);
+       status = pf_server_start(&config);
 fail:
        pf_modules_free();
-       pf_server_config_free(config);
+       pf_server_config_free_internal(&config);
        return status;
 }
index c834c9d..2d39b75 100644 (file)
@@ -431,19 +431,6 @@ static DWORD WINAPI pf_client_thread_proc(LPVOID arg)
        return 0;
 }
 
-/**
- * Optional global initializer.
- * Here we just register a signal handler to print out stack traces
- * if available.
- * */
-static BOOL pf_client_global_init(void)
-{
-       if (freerdp_handle_signals() != 0)
-               return FALSE;
-
-       return TRUE;
-}
-
 static int pf_logon_error_info(freerdp* instance, UINT32 data, UINT32 type)
 {
        const char* str_data = freerdp_get_logon_error_info_data(data);
@@ -563,7 +550,6 @@ int RdpClientEntry(RDP_CLIENT_ENTRY_POINTS* pEntryPoints)
        ZeroMemory(pEntryPoints, sizeof(RDP_CLIENT_ENTRY_POINTS));
        pEntryPoints->Version = RDP_CLIENT_INTERFACE_VERSION;
        pEntryPoints->Size = sizeof(RDP_CLIENT_ENTRY_POINTS_V1);
-       pEntryPoints->GlobalInit = pf_client_global_init;
        pEntryPoints->ContextSize = sizeof(pClientContext);
        /* Client init and finish */
        pEntryPoints->ClientNew = pf_client_client_new;
index b208e82..8aa77de 100644 (file)
@@ -336,10 +336,12 @@ void pf_server_config_print(proxyConfig* config)
        CONFIG_PRINT_STR(config, CapturesDirectory);
 }
 
-void pf_server_config_free(proxyConfig* config)
+void pf_server_config_free_internal(proxyConfig* config)
 {
+       if (config == NULL)
+               return;
+
        free(config->CapturesDirectory);
        free(config->TargetHost);
        free(config->Host);
-       free(config);
 }
index 8fece44..8270936 100644 (file)
@@ -79,6 +79,6 @@ FREERDP_API const char* pf_config_get_str(wIniFile* ini, const char* section, co
 
 BOOL pf_server_config_load(const char* path, proxyConfig* config);
 void pf_server_config_print(proxyConfig* config);
-void pf_server_config_free(proxyConfig* config);
+void pf_server_config_free_internal(proxyConfig* config);
 
 #endif /* FREERDP_SERVER_PROXY_PFCONFIG_H */