diff options
author | Ron Yorston <rmy@pobox.com> | 2012-10-10 12:56:24 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2012-10-10 12:56:24 +0100 |
commit | 981a6fcd1323a77d5829c7d574bb40fd1b96dc4d (patch) | |
tree | a1e3aadf4de65d7a525c7dd6172546ff577777d5 /shell | |
parent | 19436cc0ee509a5e356c04f0026919abd417bec4 (diff) | |
parent | eab343e7e1e5331df833aa69f14584e4a6c738f1 (diff) | |
download | busybox-w32-981a6fcd1323a77d5829c7d574bb40fd1b96dc4d.tar.gz busybox-w32-981a6fcd1323a77d5829c7d574bb40fd1b96dc4d.tar.bz2 busybox-w32-981a6fcd1323a77d5829c7d574bb40fd1b96dc4d.zip |
Merge branch 'busybox' into merge
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/shell/ash.c b/shell/ash.c index 46bf6ed49..5c33bb817 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -6691,7 +6691,8 @@ subevalvar(char *p, char *varname, int strloc, int subtype, | |||
6691 | IF_ASH_BASH_COMPAT(const char *repl = NULL;) | 6691 | IF_ASH_BASH_COMPAT(const char *repl = NULL;) |
6692 | IF_ASH_BASH_COMPAT(int pos, len, orig_len;) | 6692 | IF_ASH_BASH_COMPAT(int pos, len, orig_len;) |
6693 | int saveherefd = herefd; | 6693 | int saveherefd = herefd; |
6694 | int amount, workloc, resetloc; | 6694 | int amount, resetloc; |
6695 | IF_ASH_BASH_COMPAT(int workloc;) | ||
6695 | int zero; | 6696 | int zero; |
6696 | char *(*scan)(char*, char*, char*, char*, int, int); | 6697 | char *(*scan)(char*, char*, char*, char*, int, int); |
6697 | 6698 | ||
@@ -6804,9 +6805,9 @@ subevalvar(char *p, char *varname, int strloc, int subtype, | |||
6804 | rmescend--; | 6805 | rmescend--; |
6805 | str = (char *)stackblock() + strloc; | 6806 | str = (char *)stackblock() + strloc; |
6806 | preglob(str, varflags & VSQUOTE, 0); | 6807 | preglob(str, varflags & VSQUOTE, 0); |
6807 | workloc = expdest - (char *)stackblock(); | ||
6808 | 6808 | ||
6809 | #if ENABLE_ASH_BASH_COMPAT | 6809 | #if ENABLE_ASH_BASH_COMPAT |
6810 | workloc = expdest - (char *)stackblock(); | ||
6810 | if (subtype == VSREPLACE || subtype == VSREPLACEALL) { | 6811 | if (subtype == VSREPLACE || subtype == VSREPLACEALL) { |
6811 | char *idx, *end; | 6812 | char *idx, *end; |
6812 | 6813 | ||
@@ -9786,11 +9787,11 @@ evalcommand(union node *cmd, int flags) | |||
9786 | 9787 | ||
9787 | /* Now locate the command. */ | 9788 | /* Now locate the command. */ |
9788 | if (argc) { | 9789 | if (argc) { |
9789 | const char *oldpath; | ||
9790 | int cmd_flag = DO_ERR; | 9790 | int cmd_flag = DO_ERR; |
9791 | 9791 | #if ENABLE_ASH_CMDCMD | |
9792 | const char *oldpath = path + 5; | ||
9793 | #endif | ||
9792 | path += 5; | 9794 | path += 5; |
9793 | oldpath = path; | ||
9794 | for (;;) { | 9795 | for (;;) { |
9795 | find_command(argv[0], &cmdentry, cmd_flag, path); | 9796 | find_command(argv[0], &cmdentry, cmd_flag, path); |
9796 | if (cmdentry.cmdtype == CMDUNKNOWN) { | 9797 | if (cmdentry.cmdtype == CMDUNKNOWN) { |
@@ -13165,9 +13166,27 @@ exportcmd(int argc UNUSED_PARAM, char **argv) | |||
13165 | char *name; | 13166 | char *name; |
13166 | const char *p; | 13167 | const char *p; |
13167 | char **aptr; | 13168 | char **aptr; |
13168 | int flag = argv[0][0] == 'r' ? VREADONLY : VEXPORT; | 13169 | char opt; |
13170 | int flag; | ||
13171 | int flag_off; | ||
13169 | 13172 | ||
13170 | if (nextopt("p") != 'p') { | 13173 | /* "readonly" in bash accepts, but ignores -n. |
13174 | * We do the same: it saves a conditional in nextopt's param. | ||
13175 | */ | ||
13176 | flag_off = 0; | ||
13177 | while ((opt = nextopt("np")) != '\0') { | ||
13178 | if (opt == 'n') | ||
13179 | flag_off = VEXPORT; | ||
13180 | } | ||
13181 | flag = VEXPORT; | ||
13182 | if (argv[0][0] == 'r') { | ||
13183 | flag = VREADONLY; | ||
13184 | flag_off = 0; /* readonly ignores -n */ | ||
13185 | } | ||
13186 | flag_off = ~flag_off; | ||
13187 | |||
13188 | /*if (opt_p_not_specified) - bash doesnt check this. Try "export -p NAME" */ | ||
13189 | { | ||
13171 | aptr = argptr; | 13190 | aptr = argptr; |
13172 | name = *aptr; | 13191 | name = *aptr; |
13173 | if (name) { | 13192 | if (name) { |
@@ -13178,15 +13197,19 @@ exportcmd(int argc UNUSED_PARAM, char **argv) | |||
13178 | } else { | 13197 | } else { |
13179 | vp = *findvar(hashvar(name), name); | 13198 | vp = *findvar(hashvar(name), name); |
13180 | if (vp) { | 13199 | if (vp) { |
13181 | vp->flags |= flag; | 13200 | vp->flags = ((vp->flags | flag) & flag_off); |
13182 | continue; | 13201 | continue; |
13183 | } | 13202 | } |
13184 | } | 13203 | } |
13185 | setvar(name, p, flag); | 13204 | setvar(name, p, (flag & flag_off)); |
13186 | } while ((name = *++aptr) != NULL); | 13205 | } while ((name = *++aptr) != NULL); |
13187 | return 0; | 13206 | return 0; |
13188 | } | 13207 | } |
13189 | } | 13208 | } |
13209 | |||
13210 | /* No arguments. Show the list of exported or readonly vars. | ||
13211 | * -n is ignored. | ||
13212 | */ | ||
13190 | showvars(argv[0], flag, 0); | 13213 | showvars(argv[0], flag, 0); |
13191 | return 0; | 13214 | return 0; |
13192 | } | 13215 | } |