X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=shell%2Fcmdedit.c;h=c5f2e9da2e7e66d322cfad57169807eccd0c8db0;hb=887ca79f04cdf45874ed783c1fb9b950bf25a246;hp=540eb7ea705cb6249dac2d29266318ad1813db71;hpb=7467c8d3b6a50e2cbd8db750963d40b420ad38d1;p=oweals%2Fbusybox.git diff --git a/shell/cmdedit.c b/shell/cmdedit.c index 540eb7ea7..c5f2e9da2 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c @@ -43,7 +43,7 @@ #include "busybox.h" -#ifdef BB_LOCALE_SUPPORT +#ifdef CONFIG_LOCALE_SUPPORT #define Isprint(c) isprint((c)) #else #define Isprint(c) ( (c) >= ' ' && (c) != ((unsigned char)'\233') ) @@ -55,34 +55,34 @@ #else -#define BB_FEATURE_COMMAND_EDITING -#define BB_FEATURE_COMMAND_TAB_COMPLETION -#define BB_FEATURE_COMMAND_USERNAME_COMPLETION -#define BB_FEATURE_NONPRINTABLE_INVERSE_PUT -#define BB_FEATURE_CLEAN_UP +#define CONFIG_FEATURE_COMMAND_EDITING +#define CONFIG_FEATURE_COMMAND_TAB_COMPLETION +#define CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION +#define CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT +#define CONFIG_FEATURE_CLEAN_UP #define D(x) x #endif /* TEST */ -#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION #include #include #endif -#ifdef BB_FEATURE_COMMAND_EDITING +#ifdef CONFIG_FEATURE_COMMAND_EDITING -#ifndef BB_FEATURE_COMMAND_TAB_COMPLETION -#undef BB_FEATURE_COMMAND_USERNAME_COMPLETION +#ifndef CONFIG_FEATURE_COMMAND_TAB_COMPLETION +#undef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION #endif -#if defined(BB_FEATURE_COMMAND_USERNAME_COMPLETION) || defined(BB_FEATURE_SH_FANCY_PROMPT) -#define BB_FEATURE_GETUSERNAME_AND_HOMEDIR +#if defined(CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION) || defined(CONFIG_FEATURE_SH_FANCY_PROMPT) +#define CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR #endif -#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR +#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR # ifndef TEST -# include "pwd_grp/pwd.h" +# include "pwd_.h" # else # include # endif /* TEST */ @@ -136,41 +136,45 @@ static int cursor; /* required global for signal handler */ static int len; /* --- "" - - "" - -"- --""-- --""--- */ static char *command_ps; /* --- "" - - "" - -"- --""-- --""--- */ static -#ifndef BB_FEATURE_SH_FANCY_PROMPT +#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT const #endif char *cmdedit_prompt; /* --- "" - - "" - -"- --""-- --""--- */ -#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR +#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR static char *user_buf = ""; static char *home_pwd_buf = ""; static int my_euid; #endif -#ifdef BB_FEATURE_SH_FANCY_PROMPT +#ifdef CONFIG_FEATURE_SH_FANCY_PROMPT static char *hostname_buf = ""; static int num_ok_lines = 1; #endif -#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION -#ifndef BB_FEATURE_GETUSERNAME_AND_HOMEDIR +#ifndef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR static int my_euid; #endif static int my_uid; static int my_gid; -#endif /* BB_FEATURE_COMMAND_TAB_COMPLETION */ +#endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */ +/* It seems that libc5 doesn't know what a sighandler_t is... */ +#if (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 1) +typedef void (*sighandler_t) (int); +#endif static void cmdedit_setwidth(int w, int redraw_flg); static void win_changed(int nsig) { struct winsize win = { 0, 0, 0, 0 }; - static __sighandler_t previous_SIGWINCH_handler; /* for reset */ + static sighandler_t previous_SIGWINCH_handler; /* for reset */ /* emulate || signal call */ if (nsig == -SIGWINCH || nsig == SIGWINCH) { @@ -203,7 +207,8 @@ static void cmdedit_reset_term(void) handlers_sets &= ~SET_WCHG_HANDLERS; } fflush(stdout); -#ifdef BB_FEATURE_CLEAN_UP +#if 0 +//#ifdef CONFIG_FEATURE_CLEAN_UP if (his_front) { struct history *n; @@ -226,7 +231,7 @@ static void cmdedit_set_out_char(int next_char) if (c == 0) c = ' '; /* destroy end char? */ -#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT +#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT if (!Isprint(c)) { /* Inverse put non-printable characters */ if (c >= 128) c -= 128; @@ -317,7 +322,7 @@ static void put_prompt(void) cmdedit_y = 0; /* new quasireal y */ } -#ifndef BB_FEATURE_SH_FANCY_PROMPT +#ifndef CONFIG_FEATURE_SH_FANCY_PROMPT static void parse_prompt(const char *prmt_ptr) { cmdedit_prompt = prmt_ptr; @@ -355,7 +360,7 @@ static void parse_prompt(const char *prmt_ptr) break; c = *prmt_ptr++; switch (c) { -#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR +#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR case 'u': pbuf = user_buf; break; @@ -378,7 +383,7 @@ static void parse_prompt(const char *prmt_ptr) case '$': c = my_euid == 0 ? '#' : '$'; break; -#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR +#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR case 'w': pbuf = pwd_buf; l = strlen(home_pwd_buf); @@ -522,7 +527,7 @@ static void cmdedit_init(void) } if ((handlers_sets & SET_ATEXIT) == 0) { -#ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR +#ifdef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR struct passwd *entry; my_euid = geteuid(); @@ -533,20 +538,20 @@ static void cmdedit_init(void) } #endif -#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION -#ifndef BB_FEATURE_GETUSERNAME_AND_HOMEDIR +#ifndef CONFIG_FEATURE_GETUSERNAME_AND_HOMEDIR my_euid = geteuid(); #endif my_uid = getuid(); my_gid = getgid(); -#endif /* BB_FEATURE_COMMAND_TAB_COMPLETION */ +#endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */ handlers_sets |= SET_ATEXIT; atexit(cmdedit_reset_term); /* be sure to do this only once */ } } -#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION static int is_execute(const struct stat *st) { @@ -557,7 +562,7 @@ static int is_execute(const struct stat *st) return FALSE; } -#ifdef BB_FEATURE_COMMAND_USERNAME_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION static char **username_tab_completion(char *ud, int *num_matches) { @@ -619,7 +624,7 @@ static char **username_tab_completion(char *ud, int *num_matches) return (matches); } } -#endif /* BB_FEATURE_COMMAND_USERNAME_COMPLETION */ +#endif /* CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION */ enum { FIND_EXE_ONLY = 0, @@ -716,7 +721,7 @@ static char **exe_n_cwd_tab_completion(char *command, int *num_matches, strcpy(dirbuf, command); /* set dir only */ dirbuf[(pfind - command) + 1] = 0; -#ifdef BB_FEATURE_COMMAND_USERNAME_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION if (dirbuf[0] == '~') /* ~/... or ~user/... */ username_tab_completion(dirbuf, 0); #endif @@ -765,7 +770,7 @@ static char **exe_n_cwd_tab_completion(char *command, int *num_matches, goto cont; str_found = add_quote_for_spec_chars(found); if (type == FIND_FILE_ONLY || - (type == FIND_EXE_ONLY && is_execute(&st) == TRUE)) + (type == FIND_EXE_ONLY && is_execute(&st))) strcat(str_found, " "); } /* Add it to the list */ @@ -795,8 +800,8 @@ static int match_compare(const void *a, const void *b) #define QUOT (UCHAR_MAX+1) #define collapse_pos(is, in) { \ - memcpy(int_buf+is, int_buf+in, (BUFSIZ+1-is-in)*sizeof(int)); \ - memcpy(pos_buf+is, pos_buf+in, (BUFSIZ+1-is-in)*sizeof(int)); } + memcpy(int_buf+(is), int_buf+(in), (BUFSIZ+1-(is)-(in))*sizeof(int)); \ + memcpy(pos_buf+(is), pos_buf+(in), (BUFSIZ+1-(is)-(in))*sizeof(int)); } static int find_match(char *matchBuf, int *len_with_quotes) { @@ -822,12 +827,12 @@ static int find_match(char *matchBuf, int *len_with_quotes) collapse_pos(j, j + 1); int_buf[j] |= QUOT; i++; -#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT +#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT if (matchBuf[i] == '\t') /* algorithm equivalent */ int_buf[j] = ' ' | QUOT; #endif } -#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT +#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT else if (matchBuf[i] == '\t') int_buf[j] = ' '; #endif @@ -976,7 +981,7 @@ static void input_tab(int *lastWasTab) } return; } - if (*lastWasTab == FALSE) { + if (! *lastWasTab) { char *tmp; int len_found; @@ -996,7 +1001,7 @@ static void input_tab(int *lastWasTab) /* Free up any memory already allocated */ input_tab(0); -#ifdef BB_FEATURE_COMMAND_USERNAME_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION /* If the word starts with `~' and there is no slash in the word, * then try completing this word as a username. */ @@ -1115,7 +1120,7 @@ static void input_tab(int *lastWasTab) } } } -#endif /* BB_FEATURE_COMMAND_TAB_COMPLETION */ +#endif /* CONFIG_FEATURE_COMMAND_TAB_COMPLETION */ static void get_previous_history(struct history **hp, struct history *p) { @@ -1153,7 +1158,8 @@ enum { * */ -extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) + +int cmdedit_read_input(char *prompt, char command[BUFSIZ]) { int break_out = 0; @@ -1166,25 +1172,21 @@ extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) len = 0; command_ps = command; - if (new_settings.c_cc[VERASE] == 0) { /* first call */ - - getTermSettings(0, (void *) &initial_settings); - memcpy(&new_settings, &initial_settings, sizeof(struct termios)); - new_settings.c_lflag &= ~ICANON; /* unbuffered input */ - /* Turn off echoing and CTRL-C, so we can trap it */ - new_settings.c_lflag &= ~(ECHO | ECHONL | ISIG); + getTermSettings(0, (void *) &initial_settings); + memcpy(&new_settings, &initial_settings, sizeof(struct termios)); + new_settings.c_lflag &= ~ICANON; /* unbuffered input */ + /* Turn off echoing and CTRL-C, so we can trap it */ + new_settings.c_lflag &= ~(ECHO | ECHONL | ISIG); #ifndef linux - /* Hmm, in linux c_cc[] not parsed if set ~ICANON */ - new_settings.c_cc[VMIN] = 1; - new_settings.c_cc[VTIME] = 0; - /* Turn off CTRL-C, so we can trap it */ + /* Hmm, in linux c_cc[] not parsed if set ~ICANON */ + new_settings.c_cc[VMIN] = 1; + new_settings.c_cc[VTIME] = 0; + /* Turn off CTRL-C, so we can trap it */ # ifndef _POSIX_VDISABLE # define _POSIX_VDISABLE '\0' # endif - new_settings.c_cc[VINTR] = _POSIX_VDISABLE; + new_settings.c_cc[VINTR] = _POSIX_VDISABLE; #endif - } - command[0] = 0; setTermSettings(0, (void *) &new_settings); @@ -1231,10 +1233,15 @@ extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) * if the len=0 and no chars to delete */ if (len == 0) { prepare_to_die: +#if !defined(CONFIG_ASH) printf("exit"); goto_new_line(); /* cmdedit_reset_term() called in atexit */ exit(EXIT_SUCCESS); +#else + break_out = -1; /* for control stoped jobs */ + break; +#endif } else { input_delete(); } @@ -1253,10 +1260,24 @@ prepare_to_die: input_backspace(); break; case '\t': -#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION input_tab(&lastWasTab); #endif break; + case 11: + /* Control-k -- clear to end of line */ + *(command + cursor) = 0; + len = cursor; + printf("\033[J"); + break; + case 12: + { + /* Control-l -- clear screen */ + int old_cursor = cursor; + printf("\033[H"); + redraw(0, len-old_cursor); + } + break; case 14: /* Control-n -- Get next command in history */ if (hp && hp->n && hp->n->s) { @@ -1282,7 +1303,6 @@ prepare_to_die: redraw(cmdedit_y, len -= cursor); } break; - case ESC:{ /* escape sequence follows */ if (safe_read(0, &c, 1) < 1) @@ -1293,7 +1313,7 @@ prepare_to_die: goto prepare_to_die; } switch (c) { -#ifdef BB_FEATURE_COMMAND_TAB_COMPLETION +#ifdef CONFIG_FEATURE_COMMAND_TAB_COMPLETION case '\t': /* Alt-Tab */ input_tab(&lastWasTab); @@ -1361,7 +1381,7 @@ prepare_to_die: } default: /* If it's regular input, do the normal thing */ -#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT +#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT /* Control-V -- Add non-printable symbol */ if (c == 22) { if (safe_read(0, &c, 1) < 1) @@ -1451,24 +1471,27 @@ prepare_to_die: history_counter++; } } -#if defined(BB_FEATURE_SH_FANCY_PROMPT) +#if defined(CONFIG_FEATURE_SH_FANCY_PROMPT) num_ok_lines++; #endif } + if(break_out>0) { command[len++] = '\n'; /* set '\n' */ command[len] = 0; -#if defined(BB_FEATURE_CLEAN_UP) && defined(BB_FEATURE_COMMAND_TAB_COMPLETION) + } +#if defined(CONFIG_FEATURE_CLEAN_UP) && defined(CONFIG_FEATURE_COMMAND_TAB_COMPLETION) input_tab(0); /* strong free */ #endif -#if defined(BB_FEATURE_SH_FANCY_PROMPT) +#if defined(CONFIG_FEATURE_SH_FANCY_PROMPT) free(cmdedit_prompt); #endif cmdedit_reset_term(); + return len; } -#endif /* BB_FEATURE_COMMAND_EDITING */ +#endif /* CONFIG_FEATURE_COMMAND_EDITING */ #ifdef TEST @@ -1476,7 +1499,7 @@ prepare_to_die: const char *applet_name = "debug stuff usage"; const char *memory_exhausted = "Memory exhausted"; -#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT +#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT #include #endif @@ -1484,7 +1507,7 @@ int main(int argc, char **argv) { char buff[BUFSIZ]; char *prompt = -#if defined(BB_FEATURE_SH_FANCY_PROMPT) +#if defined(CONFIG_FEATURE_SH_FANCY_PROMPT) "\\[\\033[32;1m\\]\\u@\\[\\x1b[33;1m\\]\\h:\ \\[\\033[34;1m\\]\\w\\[\\033[35;1m\\] \ \\!\\[\\e[36;1m\\]\\$ \\[\\E[0m\\]"; @@ -1492,7 +1515,7 @@ int main(int argc, char **argv) "% "; #endif -#ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT +#ifdef CONFIG_FEATURE_NONPRINTABLE_INVERSE_PUT setlocale(LC_ALL, ""); #endif while(1) {