diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/cmdedit.c | 249 | ||||
-rw-r--r-- | shell/lash.c | 37 |
2 files changed, 112 insertions, 174 deletions
diff --git a/shell/cmdedit.c b/shell/cmdedit.c index a371081..eef1a88 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c @@ -31,8 +31,6 @@ */ -//#define TEST - #include <stdio.h> #include <errno.h> #include <unistd.h> @@ -43,10 +41,16 @@ #include <signal.h> #include <limits.h> -#ifndef TEST - #include "busybox.h" +#ifdef BB_LOCALE_SUPPORT +#define Isprint(c) isprint((c)) +#else +#define Isprint(c) ( (c) >= ' ' && (c) != ((unsigned char)'\233') ) +#endif + +#ifndef TEST + #define D(x) #else @@ -59,13 +63,6 @@ #define D(x) x -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - #endif /* TEST */ #ifdef BB_FEATURE_COMMAND_TAB_COMPLETION @@ -92,29 +89,6 @@ #endif /* advanced FEATURES */ -#ifdef TEST -void *xrealloc(void *old, size_t size) -{ - return realloc(old, size); -} - -void *xmalloc(size_t size) -{ - return malloc(size); -} -char *xstrdup(const char *s) -{ - return strdup(s); -} - -void *xcalloc(size_t size, size_t se) -{ - return calloc(size, se); -} - -#define error_msg(s, d) fprintf(stderr, s, d) -#endif /* TEST */ - struct history { char *s; @@ -238,7 +212,7 @@ static void win_changed(int nsig) static void cmdedit_reset_term(void) { if ((handlers_sets & SET_RESET_TERM) != 0) { - /* sparc and other have broken termios support: use old termio handling. */ +/* sparc and other have broken termios support: use old termio handling. */ setTermSettings(fileno(stdin), (void *) &initial_settings); handlers_sets &= ~SET_RESET_TERM; } @@ -270,9 +244,9 @@ static void cmdedit_set_out_char(int next_char) int c = (int)((unsigned char) command_ps[cursor]); if (c == 0) - c = ' '; /* destroy end char? */ + c = ' '; /* destroy end char? */ #ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT - if (!isprint(c)) { /* Inverse put non-printable characters */ + if (!Isprint(c)) { /* Inverse put non-printable characters */ if (c >= 128) c -= 128; if (c < ' ') @@ -328,7 +302,7 @@ static void input_backward(int num) { if (num > cursor) num = cursor; - cursor -= num; /* new cursor (in command, not terminal) */ + cursor -= num; /* new cursor (in command, not terminal) */ if (cmdedit_x >= num) { /* no to up line */ cmdedit_x -= num; @@ -369,147 +343,116 @@ static void parse_prompt(const char *prmt_ptr) put_prompt(); } #else -static void add_to_prompt(char **prmt_mem_ptr, int *alm, - int *prmt_len, const char *addb) -{ - *prmt_len += strlen(addb); - if (*alm < (*prmt_len) + 1) { - *alm = (*prmt_len) + 1; - *prmt_mem_ptr = xrealloc(*prmt_mem_ptr, *alm); - } - strcat(*prmt_mem_ptr, addb); -} - static void parse_prompt(const char *prmt_ptr) { - int alm = strlen(prmt_ptr) + 1; /* supposedly require memory */ int prmt_len = 0; int sub_len = 0; - int flg_not_length = '['; - char *prmt_mem_ptr = xstrdup(prmt_ptr); - char pwd_buf[PATH_MAX + 1]; - char buf[16]; - int c; - - pwd_buf[0] = 0; - *prmt_mem_ptr = 0; + char flg_not_length = '['; + char *prmt_mem_ptr = xcalloc(1, 1); + char *pwd_buf = xgetcwd(0); + char buf2[PATH_MAX + 1]; + char buf[2]; + char c; + char *pbuf; while (*prmt_ptr) { + pbuf = buf; + pbuf[1] = 0; c = *prmt_ptr++; if (c == '\\') { - c = *prmt_ptr; - if (c == 0) + const char *cp = prmt_ptr; + int l; + + c = process_escape_sequence(&prmt_ptr); + if(prmt_ptr==cp) { + if (*cp == 0) break; - prmt_ptr++; - switch (c) { + c = *prmt_ptr++; + switch (c) { #ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR - case 'u': - add_to_prompt(&prmt_mem_ptr, &alm, &prmt_len, user_buf); - continue; + case 'u': + pbuf = user_buf; + break; #endif - case 'h': - if (hostname_buf[0] == 0) { - hostname_buf = xcalloc(256, 1); - if (gethostname(hostname_buf, 255) < 0) { - strcpy(hostname_buf, "?"); + case 'h': + pbuf = hostname_buf; + if (*pbuf == 0) { + pbuf = xcalloc(256, 1); + if (gethostname(pbuf, 255) < 0) { + strcpy(pbuf, "?"); } else { - char *s = strchr(hostname_buf, '.'); + char *s = strchr(pbuf, '.'); if (s) *s = 0; } + hostname_buf = pbuf; } - add_to_prompt(&prmt_mem_ptr, &alm, &prmt_len, - hostname_buf); - continue; - case '$': + break; + case '$': c = my_euid == 0 ? '#' : '$'; break; #ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR - case 'w': - if (pwd_buf[0] == 0) { - int l; - - getcwd(pwd_buf, PATH_MAX); - l = strlen(home_pwd_buf); - if (home_pwd_buf[0] != 0 && - strncmp(home_pwd_buf, pwd_buf, l) == 0) { - strcpy(pwd_buf + 1, pwd_buf + l); - pwd_buf[0] = '~'; + case 'w': + pbuf = pwd_buf; + l = strlen(home_pwd_buf); + if (home_pwd_buf[0] != 0 && + strncmp(home_pwd_buf, pbuf, l) == 0 && + (pbuf[l]=='/' || pbuf[l]=='\0') && + strlen(pwd_buf+l)<PATH_MAX) { + pbuf = buf2; + *pbuf = '~'; + strcpy(pbuf+1, pwd_buf+l); } - } - add_to_prompt(&prmt_mem_ptr, &alm, &prmt_len, pwd_buf); - continue; + break; #endif - case 'W': - if (pwd_buf[0] == 0) { - char *z; - - getcwd(pwd_buf, PATH_MAX); - z = strrchr(pwd_buf,'/'); - if ( (z != NULL) && (z != pwd_buf) ) { - z++; - strcpy(pwd_buf,z); - } - } - add_to_prompt(&prmt_mem_ptr, &alm, &prmt_len, pwd_buf); - continue; - case '!': - snprintf(buf, sizeof(buf), "%d", num_ok_lines); - add_to_prompt(&prmt_mem_ptr, &alm, &prmt_len, buf); - continue; - case 'e': - case 'E': /* \e \E = \033 */ + case 'W': + pbuf = pwd_buf; + cp = strrchr(pbuf,'/'); + if ( (cp != NULL) && (cp != pbuf) ) + pbuf += (cp-pbuf)+1; + break; + case '!': + snprintf(pbuf = buf2, sizeof(buf2), "%d", num_ok_lines); + break; + case 'e': case 'E': /* \e \E = \033 */ c = '\033'; break; - case 'x': - case 'X': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7':{ - int l; - int ho = 0; - char *eho; - - if (c == 'X') - c = 'x'; - + case 'x': case 'X': for (l = 0; l < 3;) { - - buf[l++] = *prmt_ptr; - buf[l] = 0; - ho = strtol(buf, &eho, c == 'x' ? 16 : 8); - if (ho > UCHAR_MAX || (eho - buf) < l) { + int h; + buf2[l++] = *prmt_ptr; + buf2[l] = 0; + h = strtol(buf2, &pbuf, 16); + if (h > UCHAR_MAX || (pbuf - buf2) < l) { l--; break; } prmt_ptr++; } - buf[l] = 0; - ho = strtol(buf, 0, c == 'x' ? 16 : 8); - c = ho == 0 ? '?' : (char) ho; + buf2[l] = 0; + c = (char)strtol(buf2, 0, 16); + if(c==0) + c = '?'; + pbuf = buf; break; - } - case '[': - case ']': + case '[': case ']': if (c == flg_not_length) { flg_not_length = flg_not_length == '[' ? ']' : '['; continue; } break; - } + } + } } - buf[0] = c; - buf[1] = 0; - add_to_prompt(&prmt_mem_ptr, &alm, &prmt_len, buf); + if(pbuf == buf) + *pbuf = c; + prmt_len += strlen(pbuf); + prmt_mem_ptr = strcat(xrealloc(prmt_mem_ptr, prmt_len+1), pbuf); if (flg_not_length == ']') sub_len++; } + free(pwd_buf); cmdedit_prompt = prmt_mem_ptr; cmdedit_prmt_len = prmt_len - sub_len; put_prompt(); @@ -789,7 +732,7 @@ static char **exe_n_cwd_tab_completion(char *command, int *num_matches, char **paths = path1; int npaths; int i; - char found[BUFSIZ + 4 + PATH_MAX]; + char *found; char *pfind = strrchr(command, '/'); path1[0] = "."; @@ -822,7 +765,6 @@ static char **exe_n_cwd_tab_completion(char *command, int *num_matches, continue; while ((next = readdir(dir)) != NULL) { - const char *str_merge = "%s/%s"; char *str_found = next->d_name; /* matched ? */ @@ -835,25 +777,23 @@ static char **exe_n_cwd_tab_completion(char *command, int *num_matches, else continue; } - if (paths[i][strlen(paths[i]) - 1] == '/') - str_merge = "%s%s"; - sprintf(found, str_merge, paths[i], str_found); + found = concat_path_file(paths[i], str_found); /* hmm, remover in progress? */ - if (stat(found, &st) < 0) - continue; + if (stat(found, &st) < 0) + goto cont; /* find with dirs ? */ if (paths[i] != dirbuf) strcpy(found, next->d_name); /* only name */ if (S_ISDIR(st.st_mode)) { /* name is directory */ - /* algorithmic only "/" ? */ - if (*str_found) - strcat(found, "/"); + str_found = found; + found = concat_path_file(found, ""); + free(str_found); str_found = add_quote_for_spec_chars(found); } else { /* not put found file if search only dirs for cd */ - if (type == FIND_DIR_ONLY) - continue; + if (type == FIND_DIR_ONLY) + goto cont; str_found = add_quote_for_spec_chars(found); if (type == FIND_FILE_ONLY || (type == FIND_EXE_ONLY && is_execute(&st) == TRUE)) @@ -863,6 +803,8 @@ static char **exe_n_cwd_tab_completion(char *command, int *num_matches, matches = xrealloc(matches, (nm + 1) * sizeof(char *)); matches[nm++] = str_found; +cont: + free(found); } closedir(dir); } @@ -1440,7 +1382,7 @@ extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) } } else #endif - if (!isprint(c)) /* Skip non-printable characters */ + if (!Isprint(c)) /* Skip non-printable characters */ break; if (len >= (BUFSIZ - 2)) /* Need to leave space for enter */ @@ -1554,6 +1496,9 @@ extern void cmdedit_terminate(void) #ifdef TEST +const char *applet_name = "debug stuff usage"; +const char *memory_exhausted = "Memory exhausted"; + #ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT #include <locale.h> #endif diff --git a/shell/lash.c b/shell/lash.c index 89325b6..ee45b1a 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -64,7 +64,10 @@ #include <sys/wait.h> #include <unistd.h> #include <getopt.h> + +#ifdef BB_LOCALE_SUPPORT #include <locale.h> +#endif //#define BB_FEATURE_SH_WORDEXP @@ -80,7 +83,6 @@ #include "cmdedit.h" -static const int MAX_LINE = 256; /* size of input buffer for cwd data */ static const int MAX_READ = 128; /* size of input buffer for `read' builtin */ #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n" @@ -230,7 +232,7 @@ static char syntax_err[]="syntax error near unexpected token"; #endif static char *PS1; -static char *PS2; +static char *PS2 = "> "; #ifdef DEBUG_SHELL @@ -294,7 +296,7 @@ static int builtin_cd(struct child_prog *child) printf("cd: %s: %m\n", newdir); return EXIT_FAILURE; } - getcwd(cwd, sizeof(char)*MAX_LINE); + cwd = xgetcwd(cwd); return EXIT_SUCCESS; } @@ -410,7 +412,6 @@ static int builtin_jobs(struct child_prog *child) /* built-in 'pwd' handler */ static int builtin_pwd(struct child_prog *dummy) { - getcwd(cwd, MAX_LINE); printf( "%s\n", cwd); return EXIT_SUCCESS; } @@ -434,13 +435,14 @@ static int builtin_export(struct child_prog *child) #ifndef BB_FEATURE_SH_SIMPLE_PROMPT if (strncmp(v, "PS1=", 4)==0) PS1 = getenv("PS1"); - else if (strncmp(v, "PS2=", 4)==0) - PS2 = getenv("PS2"); #endif + +#ifdef BB_LOCALE_SUPPORT if(strncmp(v, "LC_ALL=", 7)==0) setlocale(LC_ALL, getenv("LC_ALL")); if(strncmp(v, "LC_CTYPE=", 9)==0) setlocale(LC_CTYPE, getenv("LC_CTYPE")); +#endif return (res); } @@ -623,10 +625,7 @@ static int builtin_unset(struct child_prog *child) */ static int run_command_predicate(char *cmd) { - int n=strlen(cmd); - local_pending_command = xmalloc(n+1); - strncpy(local_pending_command, cmd, n); - local_pending_command[n]='\0'; + local_pending_command = xstrdup(cmd); return( busy_loop(NULL)); } #endif @@ -808,15 +807,10 @@ static inline void cmdedit_set_initial_prompt(void) { #ifdef BB_FEATURE_SH_SIMPLE_PROMPT PS1 = NULL; - PS2 = "> "; #else PS1 = getenv("PS1"); - if(PS1==0) { + if(PS1==0) PS1 = "\\w \\$ "; - } - PS2 = getenv("PS2"); - if(PS2==0) - PS2 = "> "; #endif } @@ -954,7 +948,7 @@ static int expand_arguments(char *command) /* Fix up escape sequences to be the Real Thing(tm) */ while( command && command[ix]) { if (command[ix] == '\\') { - char *tmp = command+ix+1; + const char *tmp = command+ix+1; command[ix] = process_escape_sequence( &tmp ); memmove(command+ix + 1, tmp, strlen(tmp)+1); } @@ -1829,8 +1823,10 @@ static int busy_loop(FILE * input) #ifdef BB_FEATURE_CLEAN_UP void free_memory(void) { - if (cwd) + if (cwd) { free(cwd); + cwd = NULL; + } if (local_pending_command) free(local_pending_command); @@ -1850,7 +1846,6 @@ int shell_main(int argc_l, char **argv_l) /* These variables need re-initializing when recursing */ shell_context = 0; - cwd=NULL; local_pending_command = NULL; close_me_head = NULL; job_list.head = NULL; @@ -1921,8 +1916,7 @@ int shell_main(int argc_l, char **argv_l) } /* initialize the cwd -- this is never freed...*/ - cwd=(char*)xmalloc(sizeof(char)*MAX_LINE+1); - getcwd(cwd, sizeof(char)*MAX_LINE); + cwd = xgetcwd(0); #ifdef BB_FEATURE_CLEAN_UP atexit(free_memory); @@ -1932,7 +1926,6 @@ int shell_main(int argc_l, char **argv_l) cmdedit_set_initial_prompt(); #else PS1 = NULL; - PS2 = "> "; #endif return (busy_loop(input)); |