From 95a129eb69f387933a45cff7e59e63c482972445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sat, 15 Jun 2013 15:13:38 -0400 Subject: [PATCH] libfreerdp-client: start splitting termination and printing logic for CLI parsing --- client/X11/cli/xfreerdp.c | 25 +++++++-------- client/X11/xf_client.c | 3 -- client/X11/xf_client.h | 1 + client/common/cmdline.c | 55 ++++++++++++++++---------------- include/freerdp/client/cmdline.h | 1 + winpr/libwinpr/utils/cmdline.c | 22 ++++++++++--- 6 files changed, 59 insertions(+), 48 deletions(-) diff --git a/client/X11/cli/xfreerdp.c b/client/X11/cli/xfreerdp.c index af2b995b9..8e39158c2 100644 --- a/client/X11/cli/xfreerdp.c +++ b/client/X11/cli/xfreerdp.c @@ -27,12 +27,14 @@ #include #include +#include #include "xf_client.h" #include "xfreerdp.h" int main(int argc, char* argv[]) { + int status; HANDLE thread; xfContext* xfc; DWORD dwExitCode; @@ -51,20 +53,17 @@ int main(int argc, char* argv[]) settings = context->settings; xfc = (xfContext*) context; - if (freerdp_client_parse_command_line(context, argc, argv) < 0) - { - if (settings->ConnectionFile) - { - freerdp_client_parse_connection_file(context, settings->ConnectionFile); - } - else - { - if (settings->ListMonitors) - xf_list_monitors(xfc); + status = freerdp_client_parse_command_line(context, argc, argv); - freerdp_client_context_free(context); - return 0; - } + status = freerdp_client_command_line_status_print(argc, argv, settings, status); + + if (status) + { + if (settings->ListMonitors) + xf_list_monitors(xfc); + + freerdp_client_context_free(context); + return 0; } freerdp_client_start(context); diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 67f49f250..a5a58482e 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -667,9 +667,6 @@ BOOL xf_pre_connect(freerdp* instance) instance->OnChannelConnected = xf_on_channel_connected; instance->OnChannelDisconnected = xf_on_channel_disconnected; - //if (status < 0) - // exit(XF_EXIT_PARSE_ARGUMENTS); - freerdp_client_load_addins(channels, instance->settings); freerdp_channels_pre_connect(channels, instance); diff --git a/client/X11/xf_client.h b/client/X11/xf_client.h index be88f099e..6770060ff 100644 --- a/client/X11/xf_client.h +++ b/client/X11/xf_client.h @@ -33,6 +33,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 77353ff81..06514b59a 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -949,32 +949,10 @@ BOOL freerdp_client_detect_command_line(int argc, char** argv, DWORD* flags) return compatibility; } -int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettings* settings) +int freerdp_client_command_line_status_print(int argc, char** argv, rdpSettings* settings, int status) { - char* p; - char* str; - int length; - int status; - DWORD flags; - BOOL compatibility; COMMAND_LINE_ARGUMENT_A* arg; - freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); - - compatibility = freerdp_client_detect_command_line(argc, argv, &flags); - - if (compatibility) - { - fprintf(stderr, "WARNING: Using deprecated command-line interface!\n"); - return freerdp_client_parse_old_command_line_arguments(argc, argv, settings); - } - else - { - CommandLineClearArgumentsA(args); - status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, settings, - freerdp_client_command_line_pre_filter, freerdp_client_command_line_post_filter); - } - if (status == COMMAND_LINE_STATUS_PRINT_HELP) { freerdp_client_print_command_line_help(argc, argv); @@ -1025,13 +1003,36 @@ int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettin return COMMAND_LINE_STATUS_PRINT; } - arg = CommandLineFindArgumentA(args, "v"); + return 0; +} - if (!settings->ConnectionFile && !(arg->Flags & COMMAND_LINE_VALUE_PRESENT)) +int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettings* settings) +{ + char* p; + char* str; + int length; + int status; + DWORD flags; + BOOL compatibility; + COMMAND_LINE_ARGUMENT_A* arg; + + freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0); + + compatibility = freerdp_client_detect_command_line(argc, argv, &flags); + + if (compatibility) { - //fprintf(stderr, "error: server hostname was not specified with /v:[:port]\n"); - //return COMMAND_LINE_ERROR_MISSING_ARGUMENT; + fprintf(stderr, "WARNING: Using deprecated command-line interface!\n"); + return freerdp_client_parse_old_command_line_arguments(argc, argv, settings); } + else + { + CommandLineClearArgumentsA(args); + status = CommandLineParseArgumentsA(argc, (const char**) argv, args, flags, settings, + freerdp_client_command_line_pre_filter, freerdp_client_command_line_post_filter); + } + + arg = CommandLineFindArgumentA(args, "v"); arg = args; diff --git a/include/freerdp/client/cmdline.h b/include/freerdp/client/cmdline.h index e0a424e7e..8e4ab21ed 100644 --- a/include/freerdp/client/cmdline.h +++ b/include/freerdp/client/cmdline.h @@ -28,6 +28,7 @@ extern "C" { #endif FREERDP_API int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettings* settings); +FREERDP_API int freerdp_client_command_line_status_print(int argc, char** argv, rdpSettings* settings, int status); FREERDP_API int freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings); FREERDP_API int freerdp_client_print_version(void); diff --git a/winpr/libwinpr/utils/cmdline.c b/winpr/libwinpr/utils/cmdline.c index 7ba1822c5..0c998ea4c 100644 --- a/winpr/libwinpr/utils/cmdline.c +++ b/winpr/libwinpr/utils/cmdline.c @@ -49,6 +49,7 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* void* context, COMMAND_LINE_PRE_FILTER_FN_A preFilter, COMMAND_LINE_POST_FILTER_FN_A postFilter) { int i, j; + int status; int count; int length; int index; @@ -67,11 +68,16 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* int value_index; int toggle; + status = 0; + if (!argv) - return 0; + return status; if (argc == 1) - return COMMAND_LINE_STATUS_PRINT_HELP; + { + status = COMMAND_LINE_STATUS_PRINT_HELP; + return status; + } for (i = 1; i < argc; i++) { @@ -82,7 +88,10 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* count = preFilter(context, i, argc, argv); if (count < 0) - return COMMAND_LINE_ERROR; + { + status = COMMAND_LINE_ERROR; + return status; + } if (count > 0) { @@ -257,7 +266,10 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* } if (!value && (options[j].Flags & COMMAND_LINE_VALUE_REQUIRED)) - return COMMAND_LINE_ERROR_MISSING_VALUE; + { + status = COMMAND_LINE_ERROR_MISSING_VALUE; + return status; + } options[j].Flags |= COMMAND_LINE_ARGUMENT_PRESENT; @@ -311,7 +323,7 @@ int CommandLineParseArgumentsA(int argc, LPCSTR* argv, COMMAND_LINE_ARGUMENT_A* } } - return 0; + return status; } int CommandLineParseArgumentsW(int argc, LPCWSTR* argv, COMMAND_LINE_ARGUMENT_W* options, DWORD flags,