svn commit: [25887] trunk/busybox/shell: hush_test/hush-vars
vapier at busybox.net
vapier at busybox.net
Mon Mar 30 06:50:54 UTC 2009
Author: vapier
Date: 2009-03-30 06:50:54 +0000 (Mon, 30 Mar 2009)
New Revision: 25887
Log:
implement `unset` semantics as required by POSIX
Added:
trunk/busybox/shell/hush_test/hush-vars/unset.right
trunk/busybox/shell/hush_test/hush-vars/unset.tests
Modified:
trunk/busybox/shell/hush.c
Changeset:
Modified: trunk/busybox/shell/hush.c
===================================================================
--- trunk/busybox/shell/hush.c 2009-03-30 05:26:34 UTC (rev 25886)
+++ trunk/busybox/shell/hush.c 2009-03-30 06:50:54 UTC (rev 25887)
@@ -1000,21 +1000,21 @@
return 0;
}
-static void unset_local_var(const char *name)
+static int unset_local_var(const char *name)
{
struct variable *cur;
struct variable *prev = prev; /* for gcc */
int name_len;
if (!name)
- return;
+ return EXIT_SUCCESS;
name_len = strlen(name);
cur = G.top_var;
while (cur) {
if (strncmp(cur->varstr, name, name_len) == 0 && cur->varstr[name_len] == '=') {
if (cur->flg_read_only) {
bb_error_msg("%s: readonly variable", name);
- return;
+ return EXIT_FAILURE;
}
/* prev is ok to use here because 1st variable, HUSH_VERSION,
* is ro, and we cannot reach this code on the 1st pass */
@@ -1024,11 +1024,12 @@
if (!cur->max_len)
free(cur->varstr);
free(cur);
- return;
+ return EXIT_SUCCESS;
}
prev = cur;
cur = cur->next;
}
+ return EXIT_SUCCESS;
}
@@ -5025,11 +5026,40 @@
return EXIT_SUCCESS;
}
+/* http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#unset */
static int builtin_unset(char **argv)
{
- /* bash always returns true */
- unset_local_var(argv[1]);
- return EXIT_SUCCESS;
+ size_t i;
+ int ret;
+ bool var = true;
+
+ if (!argv[1])
+ return EXIT_SUCCESS;
+
+ i = 0;
+ if (argv[1][0] == '-') {
+ switch (argv[1][1]) {
+ case 'v': break;
+ case 'f': if (ENABLE_HUSH_FUNCTIONS) { var = false; break; }
+ default:
+ bb_error_msg("unset: %s: invalid option", argv[1]);
+ return EXIT_FAILURE;
+ }
+ ++i;
+ }
+
+ ret = EXIT_SUCCESS;
+ while (argv[++i]) {
+ if (var) {
+ if (unset_local_var(argv[i]))
+ ret = EXIT_FAILURE;
+ }
+#if ENABLE_HUSH_FUNCTIONS
+ else
+ unset_local_func(argv[i]);
+#endif
+ }
+ return ret;
}
/* http://www.opengroup.org/onlinepubs/9699919799/utilities/wait.html */
Added: trunk/busybox/shell/hush_test/hush-vars/unset.right
===================================================================
--- trunk/busybox/shell/hush_test/hush-vars/unset.right (rev 0)
+++ trunk/busybox/shell/hush_test/hush-vars/unset.right 2009-03-30 06:50:54 UTC (rev 25887)
@@ -0,0 +1,19 @@
+hush: unset: -: invalid option
+1
+hush: unset: -m: invalid option
+1
+0
+___
+0 f g
+0 g
+0
+___
+0 f g
+0
+0 f g
+0
+___
+hush: HUSH_VERSION: readonly variable
+1 f g
+hush: HUSH_VERSION: readonly variable
+1
Added: trunk/busybox/shell/hush_test/hush-vars/unset.tests
===================================================================
--- trunk/busybox/shell/hush_test/hush-vars/unset.tests (rev 0)
+++ trunk/busybox/shell/hush_test/hush-vars/unset.tests 2009-03-30 06:50:54 UTC (rev 25887)
@@ -0,0 +1,36 @@
+# check invalid options are rejected
+unset -
+echo $?
+unset -m a b c
+echo $?
+
+# check funky usage
+unset
+echo $?
+
+# check normal usage
+echo ___
+f=f g=g
+echo $? $f $g
+unset f
+echo $? $f $g
+unset g
+echo $? $f $g
+
+echo ___
+f=f g=g
+echo $? $f $g
+unset f g
+echo $? $f $g
+f=f g=g
+echo $? $f $g
+unset -v f g
+echo $? $f $g
+
+# check read only vars
+echo ___
+f=f g=g
+unset HUSH_VERSION
+echo $? $f $g
+unset f HUSH_VERSION g
+echo $? $f $g
Property changes on: trunk/busybox/shell/hush_test/hush-vars/unset.tests
___________________________________________________________________
Added: svn:executable
+ *
More information about the busybox-cvs
mailing list