From dd9757d686810a385a95ac89a35b7ac3c12eda06 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 21 Aug 2023 13:33:26 +0200 Subject: [PATCH] [server] add exerimental and unmaintained warnings --- client/common/cmdline.c | 76 +++++++++++++++++++++----- cmake/WarnUnmaintained.cmake | 9 +++ include/freerdp/client/cmdline.h | 1 + include/freerdp/server/server-common.h | 4 ++ server/Mac/mfreerdp.c | 2 + server/Windows/CMakeLists.txt | 3 + server/Windows/cli/wfreerdp.c | 3 + server/common/server.c | 75 +++++++++++++++++++++++++ server/shadow/Mac/CMakeLists.txt | 4 ++ server/shadow/Mac/mac_shadow.c | 5 ++ server/shadow/Win/CMakeLists.txt | 3 + server/shadow/Win/win_shadow.c | 5 ++ winpr/include/winpr/wlog.h | 44 +++++++++------ 13 files changed, 204 insertions(+), 30 deletions(-) create mode 100644 cmake/WarnUnmaintained.cmake diff --git a/client/common/cmdline.c b/client/common/cmdline.c index fffc042b3..9d06c909e 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -5134,26 +5134,74 @@ BOOL freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings) return TRUE; } +void freerdp_client_warn_unmaintained(int argc, char* argv[]) +{ + const char* app = (argc > 0) ? argv[0] : "INVALID_ARGV"; + const DWORD log_level = WLOG_WARN; + wLog* log = WLog_Get(TAG); + WINPR_ASSERT(log); + + if (!WLog_IsLevelActive(log, log_level)) + return; + + WLog_Print_unchecked(log, log_level, "[unmaintained] %s client is currently unmaintained!", + app); + WLog_Print_unchecked( + log, log_level, + " If problems occur please check https://github.com/FreeRDP/FreeRDP/issues for " + "know issues!"); + WLog_Print_unchecked( + log, log_level, + "Be prepared to fix issues yourself though as nobody is actively working on this."); + WLog_Print_unchecked( + log, log_level, + " Developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " + "- dont hesitate to ask some questions. (replies might take some time depending " + "on your timezone) - if you intend using this component write us a message"); +} + void freerdp_client_warn_experimental(int argc, char* argv[]) { const char* app = (argc > 0) ? argv[0] : "INVALID_ARGV"; - WLog_WARN(TAG, "[experimental] %s client is currently experimental!", app); - WLog_WARN(TAG, " If problems occur please check https://github.com/FreeRDP/FreeRDP/issues for " - "know issues or create a new one!"); - WLog_WARN(TAG, " Developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " - "- dont hesitate to ask some questions. (replies might take some time depending " - "on your timezone)"); + const DWORD log_level = WLOG_WARN; + wLog* log = WLog_Get(TAG); + WINPR_ASSERT(log); + + if (!WLog_IsLevelActive(log, log_level)) + return; + + WLog_Print_unchecked(log, log_level, "[experimental] %s client is currently experimental!", + app); + WLog_Print_unchecked( + log, log_level, + " If problems occur please check https://github.com/FreeRDP/FreeRDP/issues for " + "know issues or create a new one!"); + WLog_Print_unchecked( + log, log_level, + " Developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " + "- dont hesitate to ask some questions. (replies might take some time depending " + "on your timezone)"); } void freerdp_client_warn_deprecated(int argc, char* argv[]) { const char* app = (argc > 0) ? argv[0] : "INVALID_ARGV"; - WLog_WARN(TAG, "[deprecated] %s client has been deprecated", app); - WLog_WARN(TAG, "As replacement there is a SDL based client available."); - WLog_WARN(TAG, "If you are interested in keeping %s alive get in touch with the developers", - app); - WLog_WARN(TAG, "The project is hosted at https://github.com/freerdp/freerdp and " - " developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " - "- dont hesitate to ask some questions. (replies might take some time depending " - "on your timezone)"); + const DWORD log_level = WLOG_WARN; + wLog* log = WLog_Get(TAG); + WINPR_ASSERT(log); + + if (!WLog_IsLevelActive(log, log_level)) + return; + + WLog_Print_unchecked(log, log_level, "[deprecated] %s client has been deprecated", app); + WLog_Print_unchecked(log, log_level, "As replacement there is a SDL based client available."); + WLog_Print_unchecked( + log, log_level, + "If you are interested in keeping %s alive get in touch with the developers", app); + WLog_Print_unchecked( + log, log_level, + "The project is hosted at https://github.com/freerdp/freerdp and " + " developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " + "- dont hesitate to ask some questions. (replies might take some time depending " + "on your timezone)"); } diff --git a/cmake/WarnUnmaintained.cmake b/cmake/WarnUnmaintained.cmake new file mode 100644 index 000000000..6b2189c06 --- /dev/null +++ b/cmake/WarnUnmaintained.cmake @@ -0,0 +1,9 @@ + +macro(warn_unmaintained name) + message(WARNING "[unmaintained] ${name} is unmaintained!") + message(WARNING "[unmaintained] use at your own risk!") + message(WARNING "[unmaintained] If problems occur please check https://github.com/FreeRDP/FreeRDP/issues for know issues, but be prepared to fix them on your own!") + message(WARNING "[unmaintained] Developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org") + message(WARNING "[unmaintained] - dont hesitate to ask some questions. (replies might take some time depending on your timezone)") + message(WARNING "[unmaintained] - if you intend using this component write us a message") +endmacro() diff --git a/include/freerdp/client/cmdline.h b/include/freerdp/client/cmdline.h index b6f32e005..9b4bbf7ff 100644 --- a/include/freerdp/client/cmdline.h +++ b/include/freerdp/client/cmdline.h @@ -43,6 +43,7 @@ extern "C" const COMMAND_LINE_ARGUMENT_A* custom); FREERDP_API BOOL freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings); + FREERDP_API void freerdp_client_warn_unmaintained(int argc, char* argv[]); FREERDP_API void freerdp_client_warn_experimental(int argc, char* argv[]); FREERDP_API void freerdp_client_warn_deprecated(int argc, char* argv[]); diff --git a/include/freerdp/server/server-common.h b/include/freerdp/server/server-common.h index ae1ff0b82..eba831b4f 100644 --- a/include/freerdp/server/server-common.h +++ b/include/freerdp/server/server-common.h @@ -33,6 +33,10 @@ extern "C" FREERDP_API size_t server_audin_get_formats(AUDIO_FORMAT** dst_formats); FREERDP_API size_t server_rdpsnd_get_formats(AUDIO_FORMAT** dst_formats); + FREERDP_API void freerdp_server_warn_unmaintained(int argc, char* argv[]); + FREERDP_API void freerdp_server_warn_experimental(int argc, char* argv[]); + FREERDP_API void freerdp_server_warn_deprecated(int argc, char* argv[]); + #ifdef __cplusplus } #endif diff --git a/server/Mac/mfreerdp.c b/server/Mac/mfreerdp.c index 9b1c98b34..8a3fffdd6 100644 --- a/server/Mac/mfreerdp.c +++ b/server/Mac/mfreerdp.c @@ -38,6 +38,7 @@ #include #include #include +#include #include "mfreerdp.h" #include "mf_peer.h" @@ -81,6 +82,7 @@ static void mf_server_main_loop(freerdp_listener* instance) int main(int argc, char* argv[]) { + freerdp_server_warn_unmaintained(argc, argv); mf_server_info info = { .key = "server.key", .cert = "server.crt" }; freerdp_listener* instance; diff --git a/server/Windows/CMakeLists.txt b/server/Windows/CMakeLists.txt index b069aee68..87d7e052c 100644 --- a/server/Windows/CMakeLists.txt +++ b/server/Windows/CMakeLists.txt @@ -18,6 +18,9 @@ set(MODULE_NAME "wfreerdp-server") set(MODULE_PREFIX "FREERDP_SERVER_WINDOWS") +include (WarnUnmaintained) +warn_unmaintained(${MODULE_NAME}) + include_directories(.) set(${MODULE_PREFIX}_SRCS diff --git a/server/Windows/cli/wfreerdp.c b/server/Windows/cli/wfreerdp.c index 2b94464a9..bd8a0d1d7 100644 --- a/server/Windows/cli/wfreerdp.c +++ b/server/Windows/cli/wfreerdp.c @@ -31,6 +31,7 @@ #include "wfreerdp.h" +#include #include #define TAG SERVER_TAG("windows") @@ -46,6 +47,8 @@ BOOL CALLBACK moncb(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARA int main(int argc, char* argv[]) { + freerdp_server_warn_unmaintained(argc, argv); + BOOL screen_selected = FALSE; int index; wfServer* server; diff --git a/server/common/server.c b/server/common/server.c index 5796fda1e..992a76893 100644 --- a/server/common/server.c +++ b/server/common/server.c @@ -24,6 +24,9 @@ #include #include +#include + +#define TAG FREERDP_TAG("server.common") size_t server_audin_get_formats(AUDIO_FORMAT** dst_formats) { @@ -159,3 +162,75 @@ fail: return 0; } + +void freerdp_server_warn_unmaintained(int argc, char* argv[]) +{ + const char* app = (argc > 0) ? argv[0] : "INVALID_ARGV"; + const DWORD log_level = WLOG_WARN; + wLog* log = WLog_Get(TAG); + WINPR_ASSERT(log); + + if (!WLog_IsLevelActive(log, log_level)) + return; + + WLog_Print_unchecked(log, log_level, "[unmaintained] %s server is currently unmaintained!", + app); + WLog_Print_unchecked( + log, log_level, + " If problems occur please check https://github.com/FreeRDP/FreeRDP/issues for " + "know issues!"); + WLog_Print_unchecked( + log, log_level, + "Be prepared to fix issues yourself though as nobody is actively working on this."); + WLog_Print_unchecked( + log, log_level, + " Developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " + "- dont hesitate to ask some questions. (replies might take some time depending " + "on your timezone) - if you intend using this component write us a message"); +} + +void freerdp_server_warn_experimental(int argc, char* argv[]) +{ + const char* app = (argc > 0) ? argv[0] : "INVALID_ARGV"; + const DWORD log_level = WLOG_WARN; + wLog* log = WLog_Get(TAG); + WINPR_ASSERT(log); + + if (!WLog_IsLevelActive(log, log_level)) + return; + + WLog_Print_unchecked(log, log_level, "[experimental] %s server is currently experimental!", + app); + WLog_Print_unchecked( + log, log_level, + " If problems occur please check https://github.com/FreeRDP/FreeRDP/issues for " + "know issues or create a new one!"); + WLog_Print_unchecked( + log, log_level, + " Developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " + "- dont hesitate to ask some questions. (replies might take some time depending " + "on your timezone)"); +} + +void freerdp_server_warn_deprecated(int argc, char* argv[]) +{ + const char* app = (argc > 0) ? argv[0] : "INVALID_ARGV"; + const DWORD log_level = WLOG_WARN; + wLog* log = WLog_Get(TAG); + WINPR_ASSERT(log); + + if (!WLog_IsLevelActive(log, log_level)) + return; + + WLog_Print_unchecked(log, log_level, "[deprecated] %s server has been deprecated", app); + WLog_Print_unchecked(log, log_level, "As replacement there is a SDL based client available."); + WLog_Print_unchecked( + log, log_level, + "If you are interested in keeping %s alive get in touch with the developers", app); + WLog_Print_unchecked( + log, log_level, + "The project is hosted at https://github.com/freerdp/freerdp and " + " developers hang out in https://matrix.to/#/#FreeRDP:matrix.org?via=matrix.org " + "- dont hesitate to ask some questions. (replies might take some time depending " + "on your timezone)"); +} diff --git a/server/shadow/Mac/CMakeLists.txt b/server/shadow/Mac/CMakeLists.txt index 936016019..20c9a7bc9 100644 --- a/server/shadow/Mac/CMakeLists.txt +++ b/server/shadow/Mac/CMakeLists.txt @@ -1,3 +1,7 @@ + +include (WarnUnmaintained) +warn_unmaintained("mac shadow server subsystem") + find_library(IOKIT IOKit REQUIRED) find_library(IOSURFACE IOSurface REQUIRED) find_library(CARBON Carbon REQUIRED) diff --git a/server/shadow/Mac/mac_shadow.c b/server/shadow/Mac/mac_shadow.c index 468f93f85..cb703bc11 100644 --- a/server/shadow/Mac/mac_shadow.c +++ b/server/shadow/Mac/mac_shadow.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -663,6 +664,10 @@ FREERDP_API const char* ShadowSubsystemName(void) FREERDP_API int ShadowSubsystemEntry(RDP_SHADOW_ENTRY_POINTS* pEntryPoints) { + const char name[] = "mac shadow subsystem"; + const char* arg[] = { name }; + + freerdp_server_warn_unmaintained(ARRAYSIZE(arg), arg); pEntryPoints->New = (pfnShadowSubsystemNew)mac_shadow_subsystem_new; pEntryPoints->Free = (pfnShadowSubsystemFree)mac_shadow_subsystem_free; pEntryPoints->Init = (pfnShadowSubsystemInit)mac_shadow_subsystem_init; diff --git a/server/shadow/Win/CMakeLists.txt b/server/shadow/Win/CMakeLists.txt index 8f35820ee..f8a920ec9 100644 --- a/server/shadow/Win/CMakeLists.txt +++ b/server/shadow/Win/CMakeLists.txt @@ -1,4 +1,7 @@ +include (WarnUnmaintained) +warn_unmaintained("windows shadow server subsystem") + add_definitions(-DWITH_SHADOW_WIN) add_library(freerdp-shadow-subsystem-impl STATIC win_dxgi.c diff --git a/server/shadow/Win/win_shadow.c b/server/shadow/Win/win_shadow.c index d94fa95dd..d3d5a177e 100644 --- a/server/shadow/Win/win_shadow.c +++ b/server/shadow/Win/win_shadow.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "win_shadow.h" @@ -544,6 +545,10 @@ FREERDP_API const char* ShadowSubsystemName(void) FREERDP_API int ShadowSubsystemEntry(RDP_SHADOW_ENTRY_POINTS* pEntryPoints) { + const char name[] = "windows shadow subsystem"; + const char* arg[] = { name }; + + freerdp_server_warn_unmaintained(ARRAYSIZE(arg), arg); pEntryPoints->New = win_shadow_subsystem_new; pEntryPoints->Free = win_shadow_subsystem_free; pEntryPoints->Init = win_shadow_subsystem_init; diff --git a/winpr/include/winpr/wlog.h b/winpr/include/winpr/wlog.h index 8f2760cb5..c3918f5b4 100644 --- a/winpr/include/winpr/wlog.h +++ b/winpr/include/winpr/wlog.h @@ -127,14 +127,20 @@ extern "C" */ WINPR_API BOOL WLog_SetContext(wLog* log, const char* (*fkt)(void*), void* context); -#define WLog_Print(_log, _log_level, ...) \ - do \ - { \ - if (WLog_IsLevelActive(_log, _log_level)) \ - { \ - WLog_PrintMessage(_log, WLOG_MESSAGE_TEXT, _log_level, __LINE__, __FILE__, __func__, \ - __VA_ARGS__); \ - } \ +#define WLog_Print_unchecked(_log, _log_level, ...) \ + do \ + { \ + WLog_PrintMessage(_log, WLOG_MESSAGE_TEXT, _log_level, __LINE__, __FILE__, __func__, \ + __VA_ARGS__); \ + } while (0) + +#define WLog_Print(_log, _log_level, ...) \ + do \ + { \ + if (WLog_IsLevelActive(_log, _log_level)) \ + { \ + WLog_Print_unchecked(_log, _log_level, ##__VA_ARGS__); \ + } \ } while (0) #define WLog_Print_tag(_tag, _log_level, ...) \ @@ -146,14 +152,20 @@ extern "C" WLog_Print(_log_cached_ptr, _log_level, __VA_ARGS__); \ } while (0) -#define WLog_PrintVA(_log, _log_level, _args) \ - do \ - { \ - if (WLog_IsLevelActive(_log, _log_level)) \ - { \ - WLog_PrintMessageVA(_log, WLOG_MESSAGE_TEXT, _log_level, __LINE__, __FILE__, __func__, \ - _args); \ - } \ +#define WLog_PrintVA_unchecked(_log, _log_level, _args) \ + do \ + { \ + WLog_PrintMessageVA(_log, WLOG_MESSAGE_TEXT, _log_level, __LINE__, __FILE__, __func__, \ + _args); \ + } while (0) + +#define WLog_PrintVA(_log, _log_level, _args) \ + do \ + { \ + if (WLog_IsLevelActive(_log, _log_level)) \ + { \ + WLog_PrintVA_unchecked(_log, _log_level, _args); \ + } \ } while (0) #define WLog_Data(_log, _log_level, ...) \