aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2012-10-01 13:41:17 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2012-10-01 13:41:17 +0200
commitd5275888821a8382e7a493d90cebb7b23d975795 (patch)
treeaa1d7897a67090ad6984b82edf512d6ac5e8df91
parentf47ce07b2699134d94dae9320dabc4a91c3c6b83 (diff)
downloadbusybox-w32-d5275888821a8382e7a493d90cebb7b23d975795.tar.gz
busybox-w32-d5275888821a8382e7a493d90cebb7b23d975795.tar.bz2
busybox-w32-d5275888821a8382e7a493d90cebb7b23d975795.zip
ash: implement export -n
function old new delta exportcmd 129 175 +46 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/ash.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/shell/ash.c b/shell/ash.c
index d42316a88..010924db4 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -12630,9 +12630,27 @@ exportcmd(int argc UNUSED_PARAM, char **argv)
12630 char *name; 12630 char *name;
12631 const char *p; 12631 const char *p;
12632 char **aptr; 12632 char **aptr;
12633 int flag = argv[0][0] == 'r' ? VREADONLY : VEXPORT; 12633 char opt;
12634 int flag;
12635 int flag_off;
12636
12637 /* "readonly" in bash accepts, but ignores -n.
12638 * We do the same: it saves a conditional in nextopt's param.
12639 */
12640 flag_off = 0;
12641 while ((opt = nextopt("np")) != '\0') {
12642 if (opt == 'n')
12643 flag_off = VEXPORT;
12644 }
12645 flag = VEXPORT;
12646 if (argv[0][0] == 'r') {
12647 flag = VREADONLY;
12648 flag_off = 0; /* readonly ignores -n */
12649 }
12650 flag_off = ~flag_off;
12634 12651
12635 if (nextopt("p") != 'p') { 12652 /*if (opt_p_not_specified) - bash doesnt check this. Try "export -p NAME" */
12653 {
12636 aptr = argptr; 12654 aptr = argptr;
12637 name = *aptr; 12655 name = *aptr;
12638 if (name) { 12656 if (name) {
@@ -12643,15 +12661,19 @@ exportcmd(int argc UNUSED_PARAM, char **argv)
12643 } else { 12661 } else {
12644 vp = *findvar(hashvar(name), name); 12662 vp = *findvar(hashvar(name), name);
12645 if (vp) { 12663 if (vp) {
12646 vp->flags |= flag; 12664 vp->flags = ((vp->flags | flag) & flag_off);
12647 continue; 12665 continue;
12648 } 12666 }
12649 } 12667 }
12650 setvar(name, p, flag); 12668 setvar(name, p, (flag & flag_off));
12651 } while ((name = *++aptr) != NULL); 12669 } while ((name = *++aptr) != NULL);
12652 return 0; 12670 return 0;
12653 } 12671 }
12654 } 12672 }
12673
12674 /* No arguments. Show the list of exported or readonly vars.
12675 * -n is ignored.
12676 */
12655 showvars(argv[0], flag, 0); 12677 showvars(argv[0], flag, 0);
12656 return 0; 12678 return 0;
12657} 12679}