aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2012-10-10 12:56:24 +0100
committerRon Yorston <rmy@pobox.com>2012-10-10 12:56:24 +0100
commit981a6fcd1323a77d5829c7d574bb40fd1b96dc4d (patch)
treea1e3aadf4de65d7a525c7dd6172546ff577777d5 /shell
parent19436cc0ee509a5e356c04f0026919abd417bec4 (diff)
parenteab343e7e1e5331df833aa69f14584e4a6c738f1 (diff)
downloadbusybox-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.c41
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}