summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--shell/hush.c59
1 files changed, 30 insertions, 29 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 9ea3e3fcb..7b59b0ff9 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -2123,6 +2123,27 @@ static const char* FAST_FUNC get_local_var_value(const char *name)
return NULL;
}
+static void handle_changed_special_names(const char *name, unsigned name_len)
+{
+ if (name_len == 3 && name[0] == 'P' && name[1] == 'S') {
+ cmdedit_update_prompt();
+ return;
+ }
+
+ if ((ENABLE_HUSH_LINENO_VAR || ENABLE_HUSH_GETOPTS)
+ && name_len == 6
+ ) {
+#if ENABLE_HUSH_LINENO_VAR
+ if (strncmp(name, "LINENO", 6) == 0)
+ G.lineno_var = NULL;
+#endif
+#if ENABLE_HUSH_GETOPTS
+ if (strncmp(name, "OPTIND", 6) == 0)
+ G.getopt_count = 0;
+#endif
+ }
+}
+
/* str holds "NAME=VAL" and is expected to be malloced.
* We take ownership of it.
*/
@@ -2264,21 +2285,7 @@ static int set_local_var(char *str, unsigned flags)
}
free(free_me);
- /* Handle special names */
- if (name_len == 4 && cur->varstr[0] == 'P' && cur->varstr[1] == 'S')
- cmdedit_update_prompt();
- else
- if ((ENABLE_HUSH_LINENO_VAR || ENABLE_HUSH_GETOPTS) && name_len == 7) {
-#if ENABLE_HUSH_LINENO_VAR
- if (G.lineno_var && strncmp(cur->varstr, "LINENO", 6) == 0)
- G.lineno_var = NULL;
-#endif
-#if ENABLE_HUSH_GETOPTS
- /* defoptindvar is a "OPTIND=..." constant string */
- if (strncmp(cur->varstr, defoptindvar, 7) == 0)
- G.getopt_count = 0;
-#endif
- }
+ handle_changed_special_names(cur->varstr, name_len - 1);
return 0;
}
@@ -2297,32 +2304,26 @@ static int unset_local_var_len(const char *name, int name_len)
if (!name)
return EXIT_SUCCESS;
- if ((ENABLE_HUSH_LINENO_VAR || ENABLE_HUSH_GETOPTS) && name_len == 6) {
-#if ENABLE_HUSH_GETOPTS
- if (strncmp(name, "OPTIND", 6) == 0)
- G.getopt_count = 0;
-#endif
-#if ENABLE_HUSH_LINENO_VAR
- if (G.lineno_var && strncmp(name, "LINENO", 6) == 0)
- G.lineno_var = NULL;
-#endif
- }
-
cur_pp = &G.top_var;
while ((cur = *cur_pp) != NULL) {
- if (strncmp(cur->varstr, name, name_len) == 0 && cur->varstr[name_len] == '=') {
+ 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 EXIT_FAILURE;
}
+
*cur_pp = cur->next;
debug_printf_env("%s: unsetenv '%s'\n", __func__, cur->varstr);
bb_unsetenv(cur->varstr);
- if (name_len == 3 && cur->varstr[0] == 'P' && cur->varstr[1] == 'S')
- cmdedit_update_prompt();
+
+ handle_changed_special_names(name, name_len);
+
if (!cur->max_len)
free(cur->varstr);
free(cur);
+
return EXIT_SUCCESS;
}
cur_pp = &cur->next;