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 c;
char *pbuf; char *pbuf;
cmdedit_prmt_len = 0;
if (!pwd_buf) { if (!pwd_buf) {
pwd_buf = (char *)bb_msg_unknown; 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 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) static void cmdedit_setwidth(unsigned w, int redraw_flg)
{ {
cmdedit_termw = w; cmdedit_termw = w;
@ -1241,32 +1235,6 @@ static void win_changed(int nsig)
signal(SIGWINCH, win_changed); /* rearm ourself */ 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 * The emacs and vi modes share much of the code in the big
* command loop. Commands entered when in vi's command mode (aka * 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); setTermSettings(0, (void *) &new_settings);
/* Now initialize things */ /* 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 */ /* Print out the command prompt */
parse_prompt(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 #if ENABLE_FEATURE_SH_FANCY_PROMPT
free((char*)cmdedit_prompt); free((char*)cmdedit_prompt);
#endif #endif
/* restore initial_settings and SIGWINCH handler */ /* restore initial_settings */
cmdedit_reset_term(); setTermSettings(STDIN_FILENO, (void *) &initial_settings);
/* restore SIGWINCH handler */
signal(SIGWINCH, previous_SIGWINCH_handler);
fflush(stdout);
return command_len; return command_len;
} }