[git commit] ash: implement export -n
Denys Vlasenko
vda.linux at googlemail.com
Mon Oct 1 11:41:17 UTC 2012
commit: http://git.busybox.net/busybox/commit/?id=d5275888821a8382e7a493d90cebb7b23d975795
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master
function old new delta
exportcmd 129 175 +46
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
shell/ash.c | 30 ++++++++++++++++++++++++++----
1 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/shell/ash.c b/shell/ash.c
index d42316a..010924d 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -12630,9 +12630,27 @@ exportcmd(int argc UNUSED_PARAM, char **argv)
char *name;
const char *p;
char **aptr;
- int flag = argv[0][0] == 'r' ? VREADONLY : VEXPORT;
+ char opt;
+ int flag;
+ int flag_off;
+
+ /* "readonly" in bash accepts, but ignores -n.
+ * We do the same: it saves a conditional in nextopt's param.
+ */
+ flag_off = 0;
+ while ((opt = nextopt("np")) != '\0') {
+ if (opt == 'n')
+ flag_off = VEXPORT;
+ }
+ flag = VEXPORT;
+ if (argv[0][0] == 'r') {
+ flag = VREADONLY;
+ flag_off = 0; /* readonly ignores -n */
+ }
+ flag_off = ~flag_off;
- if (nextopt("p") != 'p') {
+ /*if (opt_p_not_specified) - bash doesnt check this. Try "export -p NAME" */
+ {
aptr = argptr;
name = *aptr;
if (name) {
@@ -12643,15 +12661,19 @@ exportcmd(int argc UNUSED_PARAM, char **argv)
} else {
vp = *findvar(hashvar(name), name);
if (vp) {
- vp->flags |= flag;
+ vp->flags = ((vp->flags | flag) & flag_off);
continue;
}
}
- setvar(name, p, flag);
+ setvar(name, p, (flag & flag_off));
} while ((name = *++aptr) != NULL);
return 0;
}
}
+
+ /* No arguments. Show the list of exported or readonly vars.
+ * -n is ignored.
+ */
showvars(argv[0], flag, 0);
return 0;
}
More information about the busybox-cvs
mailing list