diff options
| author | Glenn L McGrath <bug1@ihug.co.nz> | 2001-06-26 02:06:08 +0000 |
|---|---|---|
| committer | Glenn L McGrath <bug1@ihug.co.nz> | 2001-06-26 02:06:08 +0000 |
| commit | 78b0e379d7c2db84eec34ccd89cf9afb67b94901 (patch) | |
| tree | ae5bb34caa3b88968102e93193a01e4d90109b92 /shell | |
| parent | addabd6f16aece578d94d810d3a9e9dc88f2cdb7 (diff) | |
| download | busybox-w32-78b0e379d7c2db84eec34ccd89cf9afb67b94901.tar.gz busybox-w32-78b0e379d7c2db84eec34ccd89cf9afb67b94901.tar.bz2 busybox-w32-78b0e379d7c2db84eec34ccd89cf9afb67b94901.zip | |
Vladimir's last_patch_15
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/cmdedit.c | 92 | ||||
| -rw-r--r-- | shell/hush.c | 2 |
2 files changed, 52 insertions, 42 deletions
diff --git a/shell/cmdedit.c b/shell/cmdedit.c index a2b238603..981253db1 100644 --- a/shell/cmdedit.c +++ b/shell/cmdedit.c | |||
| @@ -81,11 +81,11 @@ | |||
| 81 | #endif | 81 | #endif |
| 82 | 82 | ||
| 83 | #ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR | 83 | #ifdef BB_FEATURE_GETUSERNAME_AND_HOMEDIR |
| 84 | #ifndef TEST | 84 | # ifndef TEST |
| 85 | #include "pwd_grp/pwd.h" | 85 | # include "pwd_grp/pwd.h" |
| 86 | #else | 86 | # else |
| 87 | #include <pwd.h> | 87 | # include <pwd.h> |
| 88 | #endif /* TEST */ | 88 | # endif /* TEST */ |
| 89 | #endif /* advanced FEATURES */ | 89 | #endif /* advanced FEATURES */ |
| 90 | 90 | ||
| 91 | 91 | ||
| @@ -106,28 +106,14 @@ static struct history *his_front = NULL; | |||
| 106 | static struct history *his_end = NULL; | 106 | static struct history *his_end = NULL; |
| 107 | 107 | ||
| 108 | 108 | ||
| 109 | /* ED: sparc termios is broken: revert back to old termio handling. */ | 109 | #include <termios.h> |
| 110 | 110 | #define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp) | |
| 111 | #if #cpu(sparc) | 111 | #define getTermSettings(fd,argp) tcgetattr(fd, argp); |
| 112 | # include <termio.h> | ||
| 113 | # define termios termio | ||
| 114 | # define setTermSettings(fd,argp) ioctl(fd,TCSETAF,argp) | ||
| 115 | # define getTermSettings(fd,argp) ioctl(fd,TCGETA,argp) | ||
| 116 | #else | ||
| 117 | # include <termios.h> | ||
| 118 | # define setTermSettings(fd,argp) tcsetattr(fd,TCSANOW,argp) | ||
| 119 | # define getTermSettings(fd,argp) tcgetattr(fd, argp); | ||
| 120 | #endif | ||
| 121 | 112 | ||
| 122 | /* Current termio and the previous termio before starting sh */ | 113 | /* Current termio and the previous termio before starting sh */ |
| 123 | static struct termios initial_settings, new_settings; | 114 | static struct termios initial_settings, new_settings; |
| 124 | 115 | ||
| 125 | 116 | ||
| 126 | #ifndef _POSIX_VDISABLE | ||
| 127 | #define _POSIX_VDISABLE '\0' | ||
| 128 | #endif | ||
| 129 | |||
| 130 | |||
| 131 | static | 117 | static |
| 132 | volatile int cmdedit_termw = 80; /* actual terminal width */ | 118 | volatile int cmdedit_termw = 80; /* actual terminal width */ |
| 133 | static int history_counter = 0; /* Number of commands in history list */ | 119 | static int history_counter = 0; /* Number of commands in history list */ |
| @@ -356,7 +342,7 @@ static void parse_prompt(const char *prmt_ptr) | |||
| 356 | char *pbuf; | 342 | char *pbuf; |
| 357 | 343 | ||
| 358 | if (!pwd_buf) { | 344 | if (!pwd_buf) { |
| 359 | pwd_buf=unknown; | 345 | pwd_buf=(char *)unknown; |
| 360 | } | 346 | } |
| 361 | 347 | ||
| 362 | while (*prmt_ptr) { | 348 | while (*prmt_ptr) { |
| @@ -1041,9 +1027,30 @@ static void input_tab(int *lastWasTab) | |||
| 1041 | * in the current working directory that matches. */ | 1027 | * in the current working directory that matches. */ |
| 1042 | if (!matches) | 1028 | if (!matches) |
| 1043 | matches = | 1029 | matches = |
| 1044 | exe_n_cwd_tab_completion(matchBuf, &num_matches, | 1030 | exe_n_cwd_tab_completion(matchBuf, |
| 1045 | find_type); | 1031 | &num_matches, find_type); |
| 1046 | 1032 | /* Remove duplicate found */ | |
| 1033 | if(matches) { | ||
| 1034 | int i, j; | ||
| 1035 | /* bubble */ | ||
| 1036 | for(i=0; i<(num_matches-1); i++) | ||
| 1037 | for(j=i+1; j<num_matches; j++) | ||
| 1038 | if(matches[i]!=0 && matches[j]!=0 && | ||
| 1039 | strcmp(matches[i], matches[j])==0) { | ||
| 1040 | free(matches[j]); | ||
| 1041 | matches[j]=0; | ||
| 1042 | } | ||
| 1043 | j=num_matches; | ||
| 1044 | num_matches = 0; | ||
| 1045 | for(i=0; i<j; i++) | ||
| 1046 | if(matches[i]) { | ||
| 1047 | if(!strcmp(matches[i], "./")) | ||
| 1048 | matches[i][1]=0; | ||
| 1049 | else if(!strcmp(matches[i], "../")) | ||
| 1050 | matches[i][2]=0; | ||
| 1051 | matches[num_matches++]=matches[i]; | ||
| 1052 | } | ||
| 1053 | } | ||
| 1047 | /* Did we find exactly one match? */ | 1054 | /* Did we find exactly one match? */ |
| 1048 | if (!matches || num_matches > 1) { | 1055 | if (!matches || num_matches > 1) { |
| 1049 | char *tmp1; | 1056 | char *tmp1; |
| @@ -1169,8 +1176,6 @@ enum { | |||
| 1169 | extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) | 1176 | extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) |
| 1170 | { | 1177 | { |
| 1171 | 1178 | ||
| 1172 | int inputFd = fileno(stdin); | ||
| 1173 | |||
| 1174 | int break_out = 0; | 1179 | int break_out = 0; |
| 1175 | int lastWasTab = FALSE; | 1180 | int lastWasTab = FALSE; |
| 1176 | unsigned char c = 0; | 1181 | unsigned char c = 0; |
| @@ -1181,23 +1186,28 @@ extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) | |||
| 1181 | len = 0; | 1186 | len = 0; |
| 1182 | command_ps = command; | 1187 | command_ps = command; |
| 1183 | 1188 | ||
| 1184 | if (new_settings.c_cc[VMIN] == 0) { /* first call */ | 1189 | if (new_settings.c_cc[VERASE] == 0) { /* first call */ |
| 1185 | 1190 | ||
| 1186 | getTermSettings(inputFd, (void *) &initial_settings); | 1191 | getTermSettings(0, (void *) &initial_settings); |
| 1187 | memcpy(&new_settings, &initial_settings, sizeof(struct termios)); | 1192 | memcpy(&new_settings, &initial_settings, sizeof(struct termios)); |
| 1188 | 1193 | new_settings.c_lflag &= ~ICANON; /* unbuffered input */ | |
| 1194 | /* Turn off echoing and CTRL-C, so we can trap it */ | ||
| 1195 | new_settings.c_lflag &= ~(ECHO | ECHONL | ISIG); | ||
| 1196 | #ifndef linux | ||
| 1197 | /* Hmm, in linux c_cc[] not parsed if set ~ICANON */ | ||
| 1189 | new_settings.c_cc[VMIN] = 1; | 1198 | new_settings.c_cc[VMIN] = 1; |
| 1190 | new_settings.c_cc[VTIME] = 0; | 1199 | new_settings.c_cc[VTIME] = 0; |
| 1191 | /* Turn off CTRL-C, so we can trap it */ | 1200 | /* Turn off CTRL-C, so we can trap it */ |
| 1201 | # ifndef _POSIX_VDISABLE | ||
| 1202 | # define _POSIX_VDISABLE '\0' | ||
| 1203 | # endif | ||
| 1192 | new_settings.c_cc[VINTR] = _POSIX_VDISABLE; | 1204 | new_settings.c_cc[VINTR] = _POSIX_VDISABLE; |
| 1193 | new_settings.c_lflag &= ~ICANON; /* unbuffered input */ | 1205 | #endif |
| 1194 | /* Turn off echoing */ | ||
| 1195 | new_settings.c_lflag &= ~(ECHO | ECHOCTL | ECHONL); | ||
| 1196 | } | 1206 | } |
| 1197 | 1207 | ||
| 1198 | command[0] = 0; | 1208 | command[0] = 0; |
| 1199 | 1209 | ||
| 1200 | setTermSettings(inputFd, (void *) &new_settings); | 1210 | setTermSettings(0, (void *) &new_settings); |
| 1201 | handlers_sets |= SET_RESET_TERM; | 1211 | handlers_sets |= SET_RESET_TERM; |
| 1202 | 1212 | ||
| 1203 | /* Now initialize things */ | 1213 | /* Now initialize things */ |
| @@ -1209,7 +1219,7 @@ extern void cmdedit_read_input(char *prompt, char command[BUFSIZ]) | |||
| 1209 | 1219 | ||
| 1210 | fflush(stdout); /* buffered out to fast */ | 1220 | fflush(stdout); /* buffered out to fast */ |
| 1211 | 1221 | ||
| 1212 | if (read(inputFd, &c, 1) < 1) | 1222 | if (read(0, &c, 1) < 1) |
| 1213 | /* if we can't read input then exit */ | 1223 | /* if we can't read input then exit */ |
| 1214 | goto prepare_to_die; | 1224 | goto prepare_to_die; |
| 1215 | 1225 | ||
| @@ -1296,11 +1306,11 @@ prepare_to_die: | |||
| 1296 | 1306 | ||
| 1297 | case ESC:{ | 1307 | case ESC:{ |
| 1298 | /* escape sequence follows */ | 1308 | /* escape sequence follows */ |
| 1299 | if (read(inputFd, &c, 1) < 1) | 1309 | if (read(0, &c, 1) < 1) |
| 1300 | return; | 1310 | return; |
| 1301 | /* different vt100 emulations */ | 1311 | /* different vt100 emulations */ |
| 1302 | if (c == '[' || c == 'O') { | 1312 | if (c == '[' || c == 'O') { |
| 1303 | if (read(inputFd, &c, 1) < 1) | 1313 | if (read(0, &c, 1) < 1) |
| 1304 | return; | 1314 | return; |
| 1305 | } | 1315 | } |
| 1306 | switch (c) { | 1316 | switch (c) { |
| @@ -1365,7 +1375,7 @@ prepare_to_die: | |||
| 1365 | } | 1375 | } |
| 1366 | if (c >= '1' && c <= '9') | 1376 | if (c >= '1' && c <= '9') |
| 1367 | do | 1377 | do |
| 1368 | if (read(inputFd, &c, 1) < 1) | 1378 | if (read(0, &c, 1) < 1) |
| 1369 | return; | 1379 | return; |
| 1370 | while (c != '~'); | 1380 | while (c != '~'); |
| 1371 | break; | 1381 | break; |
| @@ -1375,7 +1385,7 @@ prepare_to_die: | |||
| 1375 | #ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT | 1385 | #ifdef BB_FEATURE_NONPRINTABLE_INVERSE_PUT |
| 1376 | /* Control-V -- Add non-printable symbol */ | 1386 | /* Control-V -- Add non-printable symbol */ |
| 1377 | if (c == 22) { | 1387 | if (c == 22) { |
| 1378 | if (read(inputFd, &c, 1) < 1) | 1388 | if (read(0, &c, 1) < 1) |
| 1379 | return; | 1389 | return; |
| 1380 | if (c == 0) { | 1390 | if (c == 0) { |
| 1381 | beep(); | 1391 | beep(); |
| @@ -1416,7 +1426,7 @@ prepare_to_die: | |||
| 1416 | lastWasTab = FALSE; | 1426 | lastWasTab = FALSE; |
| 1417 | } | 1427 | } |
| 1418 | 1428 | ||
| 1419 | setTermSettings(inputFd, (void *) &initial_settings); | 1429 | setTermSettings(0, (void *) &initial_settings); |
| 1420 | handlers_sets &= ~SET_RESET_TERM; | 1430 | handlers_sets &= ~SET_RESET_TERM; |
| 1421 | 1431 | ||
| 1422 | /* Handle command history log */ | 1432 | /* Handle command history log */ |
diff --git a/shell/hush.c b/shell/hush.c index b0637f806..859353dcf 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
| @@ -861,7 +861,7 @@ static inline void setup_prompt_string(int promptmode, char **prompt_str) | |||
| 861 | *prompt_str = PS2; | 861 | *prompt_str = PS2; |
| 862 | } | 862 | } |
| 863 | #else | 863 | #else |
| 864 | *prompt_str = (promptmode==0)? PS1 : PS2; | 864 | *prompt_str = (promptmode==1)? PS1 : PS2; |
| 865 | #endif | 865 | #endif |
| 866 | debug_printf("result %s\n",*prompt_str); | 866 | debug_printf("result %s\n",*prompt_str); |
| 867 | } | 867 | } |
