summaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/hush.c')
-rw-r--r--shell/hush.c52
1 files changed, 26 insertions, 26 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 1f83267..9d3f06d 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -9806,41 +9806,41 @@ static int FAST_FUNC builtin_pwd(char **argv UNUSED_PARAM)
static int FAST_FUNC builtin_eval(char **argv)
{
- int rcode = EXIT_SUCCESS;
-
argv = skip_dash_dash(argv);
- if (argv[0]) {
- char *str = NULL;
- if (argv[1]) {
- /* "The eval utility shall construct a command by
- * concatenating arguments together, separating
- * each with a <space> character."
- */
- char *p;
- unsigned len = 0;
- char **pp = argv;
- do
- len += strlen(*pp) + 1;
- while (*++pp);
- str = p = xmalloc(len);
- pp = argv;
- do {
- p = stpcpy(p, *pp);
- *p++ = ' ';
- } while (*++pp);
- p[-1] = '\0';
- }
+ if (!argv[0])
+ return EXIT_SUCCESS;
+ if (!argv[1]) {
/* bash:
* eval "echo Hi; done" ("done" is syntax error):
* "echo Hi" will not execute too.
*/
- parse_and_run_string(str ? str : argv[0]);
+ parse_and_run_string(argv[0]);
+ } else {
+ /* "The eval utility shall construct a command by
+ * concatenating arguments together, separating
+ * each with a <space> character."
+ */
+ char *str, *p;
+ unsigned len = 0;
+ char **pp = argv;
+ do
+ len += strlen(*pp) + 1;
+ while (*++pp);
+ str = p = xmalloc(len);
+ pp = argv;
+ for (;;) {
+ p = stpcpy(p, *pp);
+ pp++;
+ if (!*pp)
+ break;
+ *p++ = ' ';
+ }
+ parse_and_run_string(str);
free(str);
- rcode = G.last_exitcode;
}
- return rcode;
+ return G.last_exitcode;
}
static int FAST_FUNC builtin_exec(char **argv)