|
@@ -0,0 +1,156 @@
|
|
|
+diff -urpN busybox-1.15.1/libbb/lineedit.c busybox-1.15.1-lineedit/libbb/lineedit.c
|
|
|
+--- busybox-1.15.1/libbb/lineedit.c 2009-09-12 17:55:58.000000000 +0200
|
|
|
++++ busybox-1.15.1-lineedit/libbb/lineedit.c 2009-09-28 23:56:03.000000000 +0200
|
|
|
+@@ -114,8 +114,8 @@ struct lineedit_statics {
|
|
|
+ unsigned cmdedit_prmt_len; /* length of prompt (without colors etc) */
|
|
|
+
|
|
|
+ unsigned cursor;
|
|
|
+- unsigned command_len;
|
|
|
+- /* *int* maxsize: we want x in "if (x > S.maxsize)"
|
|
|
++ int command_len; /* must be signed (^D returns -1 len) */
|
|
|
++ /* signed maxsize: we want x in "if (x > S.maxsize)"
|
|
|
+ * to _not_ be promoted to unsigned */
|
|
|
+ int maxsize;
|
|
|
+ CHAR_T *command_ps;
|
|
|
+@@ -1095,15 +1095,15 @@ static void save_command_ps_at_cur_histo
|
|
|
+ int cur = state->cur_history;
|
|
|
+ free(state->history[cur]);
|
|
|
+
|
|
|
+-#if ENABLE_FEATURE_ASSUME_UNICODE
|
|
|
++# if ENABLE_FEATURE_ASSUME_UNICODE
|
|
|
+ {
|
|
|
+ char tbuf[MAX_LINELEN];
|
|
|
+ save_string(tbuf, sizeof(tbuf));
|
|
|
+ state->history[cur] = xstrdup(tbuf);
|
|
|
+ }
|
|
|
+-#else
|
|
|
++# else
|
|
|
+ state->history[cur] = xstrdup(command_ps);
|
|
|
+-#endif
|
|
|
++# endif
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+@@ -1131,7 +1131,7 @@ static int get_next_history(void)
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+-#if ENABLE_FEATURE_EDITING_SAVEHISTORY
|
|
|
++# if ENABLE_FEATURE_EDITING_SAVEHISTORY
|
|
|
+ /* We try to ensure that concurrent additions to the history
|
|
|
+ * do not overwrite each other.
|
|
|
+ * Otherwise shell users get unhappy.
|
|
|
+@@ -1256,10 +1256,10 @@ static void save_history(char *str)
|
|
|
+ free_line_input_t(st_temp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+-#else
|
|
|
+-#define load_history(a) ((void)0)
|
|
|
+-#define save_history(a) ((void)0)
|
|
|
+-#endif /* FEATURE_COMMAND_SAVEHISTORY */
|
|
|
++# else
|
|
|
++# define load_history(a) ((void)0)
|
|
|
++# define save_history(a) ((void)0)
|
|
|
++# endif /* FEATURE_COMMAND_SAVEHISTORY */
|
|
|
+
|
|
|
+ static void remember_in_history(char *str)
|
|
|
+ {
|
|
|
+@@ -1290,15 +1290,15 @@ static void remember_in_history(char *st
|
|
|
+ /* i <= MAX_HISTORY */
|
|
|
+ state->cur_history = i;
|
|
|
+ state->cnt_history = i;
|
|
|
+-#if ENABLE_FEATURE_EDITING_SAVEHISTORY
|
|
|
++# if MAX_HISTORY > 0 && ENABLE_FEATURE_EDITING_SAVEHISTORY
|
|
|
+ if ((state->flags & SAVE_HISTORY) && state->hist_file)
|
|
|
+ save_history(str);
|
|
|
+-#endif
|
|
|
++# endif
|
|
|
+ IF_FEATURE_EDITING_FANCY_PROMPT(num_ok_lines++;)
|
|
|
+ }
|
|
|
+
|
|
|
+ #else /* MAX_HISTORY == 0 */
|
|
|
+-#define remember_in_history(a) ((void)0)
|
|
|
++# define remember_in_history(a) ((void)0)
|
|
|
+ #endif /* MAX_HISTORY */
|
|
|
+
|
|
|
+
|
|
|
+@@ -1476,11 +1476,11 @@ static void parse_and_put_prompt(const c
|
|
|
+ c = *prmt_ptr++;
|
|
|
+
|
|
|
+ switch (c) {
|
|
|
+-#if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR
|
|
|
++# if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR
|
|
|
+ case 'u':
|
|
|
+ pbuf = user_buf ? user_buf : (char*)"";
|
|
|
+ break;
|
|
|
+-#endif
|
|
|
++# endif
|
|
|
+ case 'h':
|
|
|
+ pbuf = free_me = safe_gethostname();
|
|
|
+ *strchrnul(pbuf, '.') = '\0';
|
|
|
+@@ -1488,7 +1488,7 @@ static void parse_and_put_prompt(const c
|
|
|
+ case '$':
|
|
|
+ c = (geteuid() == 0 ? '#' : '$');
|
|
|
+ break;
|
|
|
+-#if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR
|
|
|
++# if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR
|
|
|
+ case 'w':
|
|
|
+ /* /home/user[/something] -> ~[/something] */
|
|
|
+ pbuf = cwd_buf;
|
|
|
+@@ -1501,7 +1501,7 @@ static void parse_and_put_prompt(const c
|
|
|
+ pbuf = free_me = xasprintf("~%s", cwd_buf + l);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+-#endif
|
|
|
++# endif
|
|
|
+ case 'W':
|
|
|
+ pbuf = cwd_buf;
|
|
|
+ cp = strrchr(pbuf, '/');
|
|
|
+@@ -1688,13 +1688,15 @@ int FAST_FUNC read_line_input(const char
|
|
|
+
|
|
|
+ /* With null flags, no other fields are ever used */
|
|
|
+ state = st ? st : (line_input_t*) &const_int_0;
|
|
|
+-#if ENABLE_FEATURE_EDITING_SAVEHISTORY
|
|
|
++#if MAX_HISTORY > 0
|
|
|
++# if ENABLE_FEATURE_EDITING_SAVEHISTORY
|
|
|
+ if ((state->flags & SAVE_HISTORY) && state->hist_file)
|
|
|
+ if (state->cnt_history == 0)
|
|
|
+ load_history(state);
|
|
|
+-#endif
|
|
|
++# endif
|
|
|
+ if (state->flags & DO_HISTORY)
|
|
|
+ state->cur_history = state->cnt_history;
|
|
|
++#endif
|
|
|
+
|
|
|
+ /* prepare before init handlers */
|
|
|
+ cmdedit_y = 0; /* quasireal y, not true if line > xt*yt */
|
|
|
+@@ -1716,7 +1718,7 @@ int FAST_FUNC read_line_input(const char
|
|
|
+ new_settings.c_cc[VTIME] = 0;
|
|
|
+ /* Turn off CTRL-C, so we can trap it */
|
|
|
+ #ifndef _POSIX_VDISABLE
|
|
|
+-#define _POSIX_VDISABLE '\0'
|
|
|
++# define _POSIX_VDISABLE '\0'
|
|
|
+ #endif
|
|
|
+ new_settings.c_cc[VINTR] = _POSIX_VDISABLE;
|
|
|
+ tcsetattr_stdin_TCSANOW(&new_settings);
|
|
|
+@@ -2037,7 +2039,8 @@ int FAST_FUNC read_line_input(const char
|
|
|
+ rewrite_line:
|
|
|
+ /* Rewrite the line with the selected history item */
|
|
|
+ /* change command */
|
|
|
+- command_len = load_string(state->history[state->cur_history] ? : "", maxsize);
|
|
|
++ command_len = load_string(state->history[state->cur_history] ?
|
|
|
++ state->history[state->cur_history] : "", maxsize);
|
|
|
+ /* redraw and go to eol (bol, in vi) */
|
|
|
+ redraw(cmdedit_y, (state->flags & VI_MODE) ? 9999 : 0);
|
|
|
+ break;
|
|
|
+@@ -2121,7 +2124,9 @@ int FAST_FUNC read_line_input(const char
|
|
|
+ #undef command
|
|
|
+
|
|
|
+ #if ENABLE_FEATURE_ASSUME_UNICODE
|
|
|
+- command_len = save_string(command, maxsize - 1);
|
|
|
++ command[0] = '\0';
|
|
|
++ if (command_len > 0)
|
|
|
++ command_len = save_string(command, maxsize - 1);
|
|
|
+ free(command_ps);
|
|
|
+ #endif
|
|
|
+
|