From 45693e0265d086b031739132d64d240b9afd038e Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Fri, 28 Mar 2014 09:32:56 +0100 Subject: [PATCH] Add shell_expand function shell_expand expands shell variables in a string. Signed-off-by: Sascha Hauer --- common/hush.c | 33 +++++++++++++++++++++++++++++++++ include/common.h | 9 +++++++++ 2 files changed, 42 insertions(+) diff --git a/common/hush.c b/common/hush.c index bd534c12f..1447fdb7f 100644 --- a/common/hush.c +++ b/common/hush.c @@ -1637,6 +1637,39 @@ static void update_ifs_map(void) mapset(ifs, 2); /* also flow through if quoted */ } +/* + * shell_expand - Expand shell variables in a string. + * @str: The input string containing shell variables like + * $var or ${var} + * Return: The expanded string. Must be freed with free(). + */ +char *shell_expand(char *str) +{ + struct p_context ctx = {}; + o_string o = {}; + char *res, *parsed; + + remove_quotes_in_str(str); + + o.quote = 1; + + initialize_context(&ctx); + + parse_string(&o, &ctx, str); + + parsed = xmemdup(o.data, o.length + 1); + parsed[o.length] = 0; + + res = insert_var_value(parsed); + if (res != parsed) + free(parsed); + + free_pipe_list(ctx.list_head, 0); + b_free(&o); + + return res; +} + /* most recursion does not come through here, the exeception is * from builtin_source() */ static int parse_stream_outer(struct p_context *ctx, struct in_str *inp, int flag) diff --git a/include/common.h b/include/common.h index 6987b4f16..bfd3ce8b7 100644 --- a/include/common.h +++ b/include/common.h @@ -165,6 +165,15 @@ void arch_shutdown(void); int run_shell(void); +#ifdef CONFIG_SHELL_HUSH +char *shell_expand(char *str); +#else +static inline char *shell_expand(char *str) +{ + return strdup(str); +} +#endif + /* Force a compilation error if condition is true */ #define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition))