From 1a1c50cc01a5a91013b86708dc2a8e5ad330619e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Fri, 27 Jun 2014 07:54:53 +0200 Subject: core: add option "env" in command /set --- src/core/wee-command.c | 134 ++++++++++++++++++++++++++++++++++++++++------ src/core/wee-completion.c | 81 ++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/core/wee-command.c b/src/core/wee-command.c index 5daa30b9c..76f6a8e9f 100644 --- a/src/core/wee-command.c +++ b/src/core/wee-command.c @@ -37,6 +37,7 @@ #include #include #include +#include #include "weechat.h" #include "wee-command.h" @@ -5678,13 +5679,106 @@ command_set_display_option_lists (char **argv, int arg_start, int arg_end, COMMAND_CALLBACK(set) { char *value; - int number_found, rc, display_only_changed, arg_option_start, arg_option_end; + const char *ptr_string; + int i, number_found, rc, display_only_changed, arg_option_start; + int arg_option_end, list_size; struct t_config_option *ptr_option, *ptr_option_before; + struct t_weelist *list; + struct t_weelist_item *item; /* make C compiler happy */ (void) data; (void) buffer; + /* display/set environment variables */ + if ((argc > 1) && (string_strcasecmp (argv[1], "env") == 0)) + { + if (argc == 2) + { + /* display a sorted list of all environment variables */ + list = weelist_new (); + if (!list) + return WEECHAT_RC_ERROR; + for (i = 0; environ[i]; i++) + { + weelist_add (list, environ[i], WEECHAT_LIST_POS_SORT, NULL); + } + list_size = weelist_size (list); + for (i = 0; i < list_size; i++) + { + item = weelist_get (list, i); + if (item) + { + ptr_string = weelist_string (item); + if (ptr_string) + gui_chat_printf (NULL, "%s", ptr_string); + } + } + weelist_free (list); + return WEECHAT_RC_OK; + } + + if (argc == 3) + { + /* display an environment variable */ + value = getenv (argv[2]); + if (value) + { + gui_chat_printf (NULL, "%s=%s", argv[2], value); + } + else + { + gui_chat_printf (NULL, + _("Environment variable \"%s\" is not " + "defined"), + argv[2]); + } + return WEECHAT_RC_OK; + } + + /* set/unset an environment variable */ + value = string_remove_quotes (argv_eol[3], "'\""); + if (value && value[0]) + { + /* set variable */ + if (setenv (argv[2], value, 1) == 0) + { + gui_chat_printf (NULL, "%s=%s", argv[2], value); + } + else + { + gui_chat_printf (NULL, + _("%sError: failed to set variable " + "\"%s\": %s"), + gui_chat_prefix[GUI_CHAT_PREFIX_ERROR], + argv[2], + strerror (errno)); + } + } + else + { + /* unset variable */ + if (unsetenv (argv[2]) == 0) + { + gui_chat_printf (NULL, + _("Variable \"%s\" unset"), + argv[2]); + } + else + { + gui_chat_printf (NULL, + _("%sError: failed to unset variable " + "\"%s\": %s"), + gui_chat_prefix[GUI_CHAT_PREFIX_ERROR], + argv[2], + strerror (errno)); + } + } + if (value) + free (value); + return WEECHAT_RC_OK; + } + display_only_changed = 0; arg_option_start = 1; arg_option_end = argc - 1; @@ -7618,20 +7712,22 @@ command_init () &command_secure, NULL); hook_command ( NULL, "set", - N_("set config options"), - N_("[