CELIX-415: Small improvement in signal handling and use of colors in the shell commands
Project: http://git-wip-us.apache.org/repos/asf/celix/repo Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/c2821398 Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/c2821398 Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/c2821398 Branch: refs/heads/master Commit: c2821398979ffdec94837f8ce7ebd514408240cb Parents: 7d37922 Author: Pepijn Noltes <[email protected]> Authored: Mon Nov 13 21:42:52 2017 +0100 Committer: Pepijn Noltes <[email protected]> Committed: Mon Nov 13 21:42:52 2017 +0100 ---------------------------------------------------------------------- .../private/src/dm_shell_activator.c | 6 ++--- dependency_manager/readme.md | 5 ---- framework/private/src/celix_launcher.c | 15 +++++++---- framework/public/include/bundle_context.h | 2 ++ shell/CMakeLists.txt | 2 +- shell/README.md | 9 +++++-- shell/private/src/activator.c | 1 + shell/private/src/lb_command.c | 20 +++++++++++++-- shell/private/src/shell.c | 1 + shell/public/include/shell_constants.h | 27 ++++++++++++++++++++ shell_tui/private/src/shell_tui.c | 16 +++++++----- 11 files changed, 78 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/dependency_manager/private/src/dm_shell_activator.c ---------------------------------------------------------------------- diff --git a/dependency_manager/private/src/dm_shell_activator.c b/dependency_manager/private/src/dm_shell_activator.c index 833051b..4d6f507 100644 --- a/dependency_manager/private/src/dm_shell_activator.c +++ b/dependency_manager/private/src/dm_shell_activator.c @@ -26,12 +26,10 @@ #include <constants.h> #include "bundle_context.h" -#include "service_registration.h" #include "command.h" #include "dm_shell_list_command.h" - -#define DM_SHELL_USE_ANSI_COLORS "DM_SHELL_USE_ANSI_COLORS" +#include "shell_constants.h" struct bundle_instance { service_registration_pt reg; @@ -55,7 +53,7 @@ celix_status_t bundleActivator_create(bundle_context_pt context, void **userData bi->dmHandle.context = context; const char* config = NULL; - bundleContext_getPropertyWithDefault(context, DM_SHELL_USE_ANSI_COLORS, "true", &config); + bundleContext_getPropertyWithDefault(context, SHELL_USE_ANSI_COLORS, SHELL_USE_ANSI_COLORS_DEFAULT_VALUE, &config); bi->dmHandle.useColors = config != NULL && strncmp("true", config, 5) == 0; (*userData) = bi; http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/dependency_manager/readme.md ---------------------------------------------------------------------- diff --git a/dependency_manager/readme.md b/dependency_manager/readme.md index 864fc3a..8b9ce71 100644 --- a/dependency_manager/readme.md +++ b/dependency_manager/readme.md @@ -121,11 +121,6 @@ There is support for retrieving information of the dm components with use of the `dm` command. This command will print all known dm component, their state, provided interfaces and required interfaces. -#### Dependency Manager Shell Config Options - -- DM_SHELL_USE_ANSI_COLORS - Wether to use ANSI colors when printing dm -info. default is true. - ### References For more information examples please see http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/framework/private/src/celix_launcher.c ---------------------------------------------------------------------- diff --git a/framework/private/src/celix_launcher.c b/framework/private/src/celix_launcher.c index e853f53..ba83f25 100644 --- a/framework/private/src/celix_launcher.c +++ b/framework/private/src/celix_launcher.c @@ -73,11 +73,16 @@ int celixLauncher_launchWithArgs(int argc, char *argv[]) { config_file = DEFAULT_CONFIG_FILE; } - - // Set signal handler - (void) signal(SIGINT, shutdown_framework); - (void) signal(SIGUSR1, ignore); - (void) signal(SIGUSR2, ignore); + struct sigaction sigact; + memset(&sigact, 0, sizeof(sigact)); + sigact.sa_handler = shutdown_framework; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + + memset(&sigact, 0, sizeof(sigact)); + sigact.sa_handler = ignore; + sigaction(SIGUSR1, &sigact, NULL); + sigaction(SIGUSR2, &sigact, NULL); int rc = celixLauncher_launch(config_file, &framework); if (rc == 0) { http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/framework/public/include/bundle_context.h ---------------------------------------------------------------------- diff --git a/framework/public/include/bundle_context.h b/framework/public/include/bundle_context.h index cef7b44..c674e9c 100644 --- a/framework/public/include/bundle_context.h +++ b/framework/public/include/bundle_context.h @@ -33,6 +33,8 @@ * Framework. */ typedef struct bundleContext *bundle_context_pt; +typedef struct bundleContext bundle_context_t; + #include "service_factory.h" #include "service_listener.h" http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/shell/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/shell/CMakeLists.txt b/shell/CMakeLists.txt index 3ffb9e1..974d2ff 100644 --- a/shell/CMakeLists.txt +++ b/shell/CMakeLists.txt @@ -43,7 +43,7 @@ if (SHELL) install_bundle(shell HEADERS - public/include/shell.h public/include/command.h + public/include/shell.h public/include/command.h public/include/shell_constants.h ) include_directories("public/include") http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/shell/README.md ---------------------------------------------------------------------- diff --git a/shell/README.md b/shell/README.md index 71511c3..b830edc 100644 --- a/shell/README.md +++ b/shell/README.md @@ -1,4 +1,4 @@ -## Shell +# Shell The Celix Shell provides a service interface which can be used to interact with the Celix framework. Note that it does not offer a user interface. This modular approach enables having multiple frontends, e.g. textual or graphical. @@ -19,5 +19,10 @@ While the shell can be extended with additional commands by other bundles, it al Further information about a command can be retrieved by using `help` combined with the command. -###### CMake options +## Shell Config Options + +- SHELL_USE_ANSI_COLORS - Wether shell command are allowed to use +ANSI colors when printing info. default is true. + +## CMake options BUILD_SHELL=ON http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/shell/private/src/activator.c ---------------------------------------------------------------------- diff --git a/shell/private/src/activator.c b/shell/private/src/activator.c index 3dddf07..ac298d8 100644 --- a/shell/private/src/activator.c +++ b/shell/private/src/activator.c @@ -24,6 +24,7 @@ * \copyright Apache License, Version 2.0 */ #include <stdlib.h> +#include <string.h> #include "shell_private.h" #include "bundle_activator.h" http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/shell/private/src/lb_command.c ---------------------------------------------------------------------- diff --git a/shell/private/src/lb_command.c b/shell/private/src/lb_command.c index 82812d5..5a97bf8 100644 --- a/shell/private/src/lb_command.c +++ b/shell/private/src/lb_command.c @@ -28,13 +28,22 @@ #include "array_list.h" #include "bundle_context.h" - #include "std_commands.h" +#include "shell_constants.h" + +static const char * const EVEN_COLOR = "\033[1m"; //bold +static const char * const ODD_COLOR = "\033[3m"; //italic +static const char * const END_COLOR = "\033[0m"; static char * psCommand_stateString(bundle_state_e state); celix_status_t psCommand_execute(void *_ptr, char *command_line_str, FILE *out_ptr, FILE *err_ptr) { celix_status_t status = CELIX_SUCCESS; + bundle_context_t* ctx = _ptr; + + const char* config = NULL; + bundleContext_getPropertyWithDefault(ctx, SHELL_USE_ANSI_COLORS, SHELL_USE_ANSI_COLORS_DEFAULT_VALUE, &config); + bool useColors = config != NULL && strncmp("true", config, 5) == 0; bundle_context_pt context_ptr = _ptr; array_list_pt bundles_ptr = NULL; @@ -149,7 +158,14 @@ celix_status_t psCommand_execute(void *_ptr, char *command_line_str, FILE *out_p } if (sub_status == CELIX_SUCCESS) { - fprintf(out_ptr, " %-5ld %-12s %s\n", id, state_str, name_str); + if (useColors) { + const char* start = i % 2 == 0 ? EVEN_COLOR : ODD_COLOR; + const char* end = END_COLOR; + fprintf(out_ptr, "%s %-5ld %-12s %s%s\n", start, id, state_str, name_str, end); + } else { //no colors + fprintf(out_ptr, " %-5ld %-12s %s\n", id, state_str, name_str); + } + } if (sub_status != CELIX_SUCCESS) { http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/shell/private/src/shell.c ---------------------------------------------------------------------- diff --git a/shell/private/src/shell.c b/shell/private/src/shell.c index e4fef47..ac8603e 100644 --- a/shell/private/src/shell.c +++ b/shell/private/src/shell.c @@ -31,6 +31,7 @@ #include "shell_private.h" + #include "utils.h" celix_status_t shell_getCommands(shell_pt shell_ptr, array_list_pt *commands_ptr); http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/shell/public/include/shell_constants.h ---------------------------------------------------------------------- diff --git a/shell/public/include/shell_constants.h b/shell/public/include/shell_constants.h new file mode 100644 index 0000000..1e7f875 --- /dev/null +++ b/shell/public/include/shell_constants.h @@ -0,0 +1,27 @@ +/** + *Licensed to the Apache Software Foundation (ASF) under one + *or more contributor license agreements. See the NOTICE file + *distributed with this work for additional information + *regarding copyright ownership. The ASF licenses this file + *to you under the Apache License, Version 2.0 (the + *"License"); you may not use this file except in compliance + *with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + *Unless required by applicable law or agreed to in writing, + *software distributed under the License is distributed on an + *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + *specific language governing permissions and limitations + *under the License. + */ + + +#ifndef SHELL_CONSTANTS_H_ +#define SHELL_CONSTANTS_H_ + +#define SHELL_USE_ANSI_COLORS "SHELL_USE_ANSI_COLORS" +#define SHELL_USE_ANSI_COLORS_DEFAULT_VALUE "true" + +#endif /* SHELL_CONSTANTS_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/c2821398/shell_tui/private/src/shell_tui.c ---------------------------------------------------------------------- diff --git a/shell_tui/private/src/shell_tui.c b/shell_tui/private/src/shell_tui.c index f421e6e..de16a20 100644 --- a/shell_tui/private/src/shell_tui.c +++ b/shell_tui/private/src/shell_tui.c @@ -23,22 +23,19 @@ * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> * \copyright Apache License, Version 2.0 */ +#include <sys/time.h> +#include <sys/select.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termios.h> #include <unistd.h> -#include <sys/time.h> -#include <sys/select.h> #include "bundle_context.h" -#include "bundle_activator.h" -#include "linked_list.h" #include "shell.h" #include "shell_tui.h" #include "utils.h" #include <signal.h> -#include <unistd.h> #include <fcntl.h> #include "history.h" @@ -145,10 +142,11 @@ static void* shellTui_runnable(void *data) { memset(&ctx, 0, sizeof(ctx)); ctx.hist = historyCreate(); - //setup term struct termios term_org, term_new; if (shellTui->useAnsiControlSequences) { tcgetattr(STDIN_FILENO, &term_org); + + term_new = term_org; term_new.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &term_new); @@ -180,8 +178,12 @@ static void* shellTui_runnable(void *data) { } } } - tcsetattr(STDIN_FILENO, TCSANOW, &term_org); //TODO or after SIGINT + historyDestroy(ctx.hist); + if (shellTui->useAnsiControlSequences) { + tcsetattr(STDIN_FILENO, TCSANOW, &term_org); + } + return NULL; }
