aboutsummaryrefslogtreecommitdiff
path: root/lash.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-03-08 17:44:37 +0000
committerEric Andersen <andersen@codepoet.org>2001-03-08 17:44:37 +0000
commit32f8c170b097fc89f1cbf970846ec3da1a06b20d (patch)
tree77e34758f50e08a338be3eb40b852524208d2173 /lash.c
parentca6045955d8e51b268e242f59f3b63b9fdcf90e6 (diff)
downloadbusybox-32f8c170b097fc89f1cbf970846ec3da1a06b20d.tar.gz
Remember to delete un-expandable variables, and do a better job of expanding
shell-specific things in case the wordexp implementation is broken (ie. the stubbed out wordexp in uClibc). -Erik
Diffstat (limited to 'lash.c')
-rw-r--r--lash.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/lash.c b/lash.c
index 874c0aca9..65a0a25d2 100644
--- a/lash.c
+++ b/lash.c
@@ -959,15 +959,29 @@ static int expand_arguments(char *command)
else
var = itoa(last_bg_pid);
break;
-#if 0
- /* Everything else like $$, $#, $[0-9], etcshould all be
- * expanded by wordexp(), so we can skip that stuff here */
+ /* Everything else like $$, $#, $[0-9], etc should all be
+ * expanded by wordexp(), so we can in theory skip that stuff
+ * here, but just to be on the safe side (i.e. since uClibc
+ * wordexp doesn't do this stuff yet), lets leave it in for
+ * now. */
case '$':
+ var = itoa(getpid());
+ break;
case '#':
+ var = itoa(argc-1);
+ break;
case '0':case '1':case '2':case '3':case '4':
case '5':case '6':case '7':case '8':case '9':
+ {
+ int index=*(dst + 1)-48;
+ if (index >= argc) {
+ var='\0';
+ } else {
+ var = argv[index];
+ }
+ }
break;
-#endif
+
}
}
if (var) {
@@ -982,9 +996,17 @@ static int expand_arguments(char *command)
memmove(dst+subst_len, next_dst+1, subst_len);
/* Now copy in the new stuff */
strncpy(dst, var, subst_len);
+ src = dst;
+ src++;
+ } else {
+ /* Seems we got an un-expandable variable. So delete it. */
+ char *next_dst;
+ if ((next_dst=strpbrk(dst+1, " \t~`!$^&*()=|\\{}[];\"'<>?")) != NULL) {
+ /* Move stuff to the end of the string to accommodate filling
+ * the created gap with the new stuff */
+ memmove(dst, next_dst, next_dst-dst);
+ }
}
- src = dst;
- src++;
}