cmdedit: stop playing dirty games with atexit

This commit is contained in:
Denis Vlasenko 2007-01-22 07:30:26 +00:00
parent 8e1c71529c
commit 6258fd3454

View File

@ -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;
}