cmdedit: stop playing dirty games with atexit
This commit is contained in:
parent
8e1c71529c
commit
6258fd3454
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user