[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