diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-01-22 07:30:26 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-01-22 07:30:26 +0000 |
commit | 6258fd345465960c74892ad35f4a6926859edb64 (patch) | |
tree | d989cf56bc84eb7af354f93d4507e87bc6213607 /shell | |
parent | 8e1c71529c2bf38a04d4a117e625e59044a0785a (diff) | |
download | busybox-6258fd345465960c74892ad35f4a6926859edb64.tar.gz |
cmdedit: stop playing dirty games with atexit
Diffstat (limited to 'shell')
-rw-r--r-- | shell/cmdedit.c | 61 |
1 files changed, 24 insertions, 37 deletions
diff --git a/shell/cmdedit.c b/shell/cmdedit.c index 554a4ebec..b0a5de7ac 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c @@ -1097,6 +1097,8 @@ static void parse_prompt(const char *prmt_ptr) char c; char *pbuf; + cmdedit_prmt_len = 0; + if (!pwd_buf) { pwd_buf = (char *)bb_msg_unknown; } @@ -1212,14 +1214,6 @@ static void parse_prompt(const char *prmt_ptr) static sighandler_t previous_SIGWINCH_handler; -static void cmdedit_reset_term(void) -{ - setTermSettings(STDIN_FILENO, (void *) &initial_settings); - /* restore SIGWINCH handler */ - signal(SIGWINCH, previous_SIGWINCH_handler); - fflush(stdout); -} - static void cmdedit_setwidth(unsigned w, int redraw_flg) { cmdedit_termw = w; @@ -1241,32 +1235,6 @@ static void win_changed(int nsig) signal(SIGWINCH, win_changed); /* rearm ourself */ } -static void cmdedit_init(void) -{ - cmdedit_prmt_len = 0; - previous_SIGWINCH_handler = signal(SIGWINCH, win_changed); - win_changed(0); /* do initial resizing */ - -#if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR - { - struct passwd *entry; - - entry = getpwuid(geteuid()); - if (entry) { - user_buf = xstrdup(entry->pw_name); - home_pwd_buf = xstrdup(entry->pw_dir); - } - } -#endif - -#if ENABLE_FEATURE_COMMAND_TAB_COMPLETION - my_uid = getuid(); - my_gid = getgid(); -#endif -// Crap. We should be able to do it without atexit. - atexit(cmdedit_reset_term); /* be sure to do this only once */ -} - /* * The emacs and vi modes share much of the code in the big * command loop. Commands entered when in vi's command mode (aka @@ -1329,7 +1297,23 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t setTermSettings(0, (void *) &new_settings); /* Now initialize things */ - cmdedit_init(); + previous_SIGWINCH_handler = signal(SIGWINCH, win_changed); + win_changed(0); /* do initial resizing */ +#if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR + { + struct passwd *entry; + + entry = getpwuid(geteuid()); + if (entry) { + user_buf = xstrdup(entry->pw_name); + home_pwd_buf = xstrdup(entry->pw_dir); + } + } +#endif +#if ENABLE_FEATURE_COMMAND_TAB_COMPLETION + my_uid = getuid(); + my_gid = getgid(); +#endif /* Print out the command prompt */ parse_prompt(prompt); @@ -1746,8 +1730,11 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t #if ENABLE_FEATURE_SH_FANCY_PROMPT free((char*)cmdedit_prompt); #endif - /* restore initial_settings and SIGWINCH handler */ - cmdedit_reset_term(); + /* restore initial_settings */ + setTermSettings(STDIN_FILENO, (void *) &initial_settings); + /* restore SIGWINCH handler */ + signal(SIGWINCH, previous_SIGWINCH_handler); + fflush(stdout); return command_len; } |