diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-05-29 10:39:06 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-05-29 10:39:06 +0200 |
| commit | 4b7db4f2ca232c630e334fa56b1eb89848d5fcc5 (patch) | |
| tree | 55608587f33fc1d6f6a8e40dfdf7fea66c750d7a | |
| parent | 171932d7ca62dbb0e0b84a0919e1f3a8a68f03f2 (diff) | |
| download | busybox-w32-4b7db4f2ca232c630e334fa56b1eb89848d5fcc5.tar.gz busybox-w32-4b7db4f2ca232c630e334fa56b1eb89848d5fcc5.tar.bz2 busybox-w32-4b7db4f2ca232c630e334fa56b1eb89848d5fcc5.zip | |
read_key: drop optimization where we read 3 bytes at once
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | include/libbb.h | 96 | ||||
| -rw-r--r-- | libbb/lineedit.c | 11 | ||||
| -rw-r--r-- | libbb/read_key.c | 13 | ||||
| -rw-r--r-- | shell/hush.c | 4 |
4 files changed, 65 insertions, 59 deletions
diff --git a/include/libbb.h b/include/libbb.h index 788140d14..963e2af28 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -933,54 +933,6 @@ void bb_displayroutes(int noresolve, int netstatfmt) FAST_FUNC; | |||
| 933 | #endif | 933 | #endif |
| 934 | 934 | ||
| 935 | 935 | ||
| 936 | /* "Keycodes" that report an escape sequence. | ||
| 937 | * We use something which fits into signed char, | ||
| 938 | * yet doesn't represent any valid Unicode characher. | ||
| 939 | * Also, -1 is reserved for error indication and we don't use it. */ | ||
| 940 | enum { | ||
| 941 | KEYCODE_UP = -2, | ||
| 942 | KEYCODE_DOWN = -3, | ||
| 943 | KEYCODE_RIGHT = -4, | ||
| 944 | KEYCODE_LEFT = -5, | ||
| 945 | KEYCODE_HOME = -6, | ||
| 946 | KEYCODE_END = -7, | ||
| 947 | KEYCODE_INSERT = -8, | ||
| 948 | KEYCODE_DELETE = -9, | ||
| 949 | KEYCODE_PAGEUP = -10, | ||
| 950 | KEYCODE_PAGEDOWN = -11, | ||
| 951 | #if 0 | ||
| 952 | KEYCODE_FUN1 = -12, | ||
| 953 | KEYCODE_FUN2 = -13, | ||
| 954 | KEYCODE_FUN3 = -14, | ||
| 955 | KEYCODE_FUN4 = -15, | ||
| 956 | KEYCODE_FUN5 = -16, | ||
| 957 | KEYCODE_FUN6 = -17, | ||
| 958 | KEYCODE_FUN7 = -18, | ||
| 959 | KEYCODE_FUN8 = -19, | ||
| 960 | KEYCODE_FUN9 = -20, | ||
| 961 | KEYCODE_FUN10 = -21, | ||
| 962 | KEYCODE_FUN11 = -22, | ||
| 963 | KEYCODE_FUN12 = -23, | ||
| 964 | #endif | ||
| 965 | KEYCODE_CURSOR_POS = -0x100, | ||
| 966 | /* How long is the longest ESC sequence we know? | ||
| 967 | * We want it big enough to be able to contain | ||
| 968 | * cursor position sequence "ESC [ 9999 ; 9999 R" | ||
| 969 | */ | ||
| 970 | KEYCODE_BUFFER_SIZE = 16 | ||
| 971 | }; | ||
| 972 | /* Note: fd may be in blocking or non-blocking mode, both make sense. | ||
| 973 | * For one, less uses non-blocking mode. | ||
| 974 | * Only the first read syscall inside read_key may block indefinitely | ||
| 975 | * (unless fd is in non-blocking mode), | ||
| 976 | * subsequent reads will time out after a few milliseconds. | ||
| 977 | * Return of -1 means EOF or error (errno == 0 on EOF). | ||
| 978 | * buffer[0] is used as a counter of buffered chars and must be 0 | ||
| 979 | * on first call. | ||
| 980 | */ | ||
| 981 | int64_t read_key(int fd, char *buffer) FAST_FUNC; | ||
| 982 | |||
| 983 | |||
| 984 | /* Networking */ | 936 | /* Networking */ |
| 985 | int create_icmp_socket(void) FAST_FUNC; | 937 | int create_icmp_socket(void) FAST_FUNC; |
| 986 | int create_icmp6_socket(void) FAST_FUNC; | 938 | int create_icmp6_socket(void) FAST_FUNC; |
| @@ -1209,6 +1161,54 @@ unsigned long long bb_makedev(unsigned int major, unsigned int minor) FAST_FUNC; | |||
| 1209 | #endif | 1161 | #endif |
| 1210 | 1162 | ||
| 1211 | 1163 | ||
| 1164 | /* "Keycodes" that report an escape sequence. | ||
| 1165 | * We use something which fits into signed char, | ||
| 1166 | * yet doesn't represent any valid Unicode characher. | ||
| 1167 | * Also, -1 is reserved for error indication and we don't use it. */ | ||
| 1168 | enum { | ||
| 1169 | KEYCODE_UP = -2, | ||
| 1170 | KEYCODE_DOWN = -3, | ||
| 1171 | KEYCODE_RIGHT = -4, | ||
| 1172 | KEYCODE_LEFT = -5, | ||
| 1173 | KEYCODE_HOME = -6, | ||
| 1174 | KEYCODE_END = -7, | ||
| 1175 | KEYCODE_INSERT = -8, | ||
| 1176 | KEYCODE_DELETE = -9, | ||
| 1177 | KEYCODE_PAGEUP = -10, | ||
| 1178 | KEYCODE_PAGEDOWN = -11, | ||
| 1179 | #if 0 | ||
| 1180 | KEYCODE_FUN1 = -12, | ||
| 1181 | KEYCODE_FUN2 = -13, | ||
| 1182 | KEYCODE_FUN3 = -14, | ||
| 1183 | KEYCODE_FUN4 = -15, | ||
| 1184 | KEYCODE_FUN5 = -16, | ||
| 1185 | KEYCODE_FUN6 = -17, | ||
| 1186 | KEYCODE_FUN7 = -18, | ||
| 1187 | KEYCODE_FUN8 = -19, | ||
| 1188 | KEYCODE_FUN9 = -20, | ||
| 1189 | KEYCODE_FUN10 = -21, | ||
| 1190 | KEYCODE_FUN11 = -22, | ||
| 1191 | KEYCODE_FUN12 = -23, | ||
| 1192 | #endif | ||
| 1193 | KEYCODE_CURSOR_POS = -0x100, | ||
| 1194 | /* How long is the longest ESC sequence we know? | ||
| 1195 | * We want it big enough to be able to contain | ||
| 1196 | * cursor position sequence "ESC [ 9999 ; 9999 R" | ||
| 1197 | */ | ||
| 1198 | KEYCODE_BUFFER_SIZE = 16 | ||
| 1199 | }; | ||
| 1200 | /* Note: fd may be in blocking or non-blocking mode, both make sense. | ||
| 1201 | * For one, less uses non-blocking mode. | ||
| 1202 | * Only the first read syscall inside read_key may block indefinitely | ||
| 1203 | * (unless fd is in non-blocking mode), | ||
| 1204 | * subsequent reads will time out after a few milliseconds. | ||
| 1205 | * Return of -1 means EOF or error (errno == 0 on EOF). | ||
| 1206 | * buffer[0] is used as a counter of buffered chars and must be 0 | ||
| 1207 | * on first call. | ||
| 1208 | */ | ||
| 1209 | int64_t read_key(int fd, char *buffer) FAST_FUNC; | ||
| 1210 | |||
| 1211 | |||
| 1212 | #if ENABLE_FEATURE_EDITING | 1212 | #if ENABLE_FEATURE_EDITING |
| 1213 | /* It's NOT just ENABLEd or disabled. It's a number: */ | 1213 | /* It's NOT just ENABLEd or disabled. It's a number: */ |
| 1214 | # ifdef CONFIG_FEATURE_EDITING_HISTORY | 1214 | # ifdef CONFIG_FEATURE_EDITING_HISTORY |
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index a0b1bcf8e..81f6fdeff 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
| @@ -1451,10 +1451,13 @@ static int lineedit_read_key(char *read_key_buffer) | |||
| 1451 | pfd.events = POLLIN; | 1451 | pfd.events = POLLIN; |
| 1452 | do { | 1452 | do { |
| 1453 | poll_again: | 1453 | poll_again: |
| 1454 | /* Wait for input. Can't just call read_key, it will return | 1454 | if (read_key_buffer[0] == 0) { |
| 1455 | * at once if stdin is in non-blocking mode. */ | 1455 | /* Wait for input. Can't just call read_key, |
| 1456 | safe_poll(&pfd, 1, -1); | 1456 | * it returns at once if stdin |
| 1457 | /* note: read_key sets errno to 0 on success: */ | 1457 | * is in non-blocking mode. */ |
| 1458 | safe_poll(&pfd, 1, -1); | ||
| 1459 | } | ||
| 1460 | /* Note: read_key sets errno to 0 on success: */ | ||
| 1458 | ic = read_key(STDIN_FILENO, read_key_buffer); | 1461 | ic = read_key(STDIN_FILENO, read_key_buffer); |
| 1459 | if (ENABLE_FEATURE_EDITING_ASK_TERMINAL | 1462 | if (ENABLE_FEATURE_EDITING_ASK_TERMINAL |
| 1460 | && (int32_t)ic == KEYCODE_CURSOR_POS | 1463 | && (int32_t)ic == KEYCODE_CURSOR_POS |
diff --git a/libbb/read_key.c b/libbb/read_key.c index 3771045d2..6f6c39e45 100644 --- a/libbb/read_key.c +++ b/libbb/read_key.c | |||
| @@ -69,11 +69,14 @@ int64_t FAST_FUNC read_key(int fd, char *buffer) | |||
| 69 | errno = 0; | 69 | errno = 0; |
| 70 | n = (unsigned char) *buffer++; | 70 | n = (unsigned char) *buffer++; |
| 71 | if (n == 0) { | 71 | if (n == 0) { |
| 72 | /* If no data, block waiting for input. If we read more | 72 | /* If no data, block waiting for input. |
| 73 | * than the minimal ESC sequence size, the "n=0" below | 73 | * It is tempting to read more than one byte here, |
| 74 | * would instead have to figure out how much to keep, | 74 | * but it breaks pasting. Example: at shell prompt, |
| 75 | * resulting in larger code. */ | 75 | * user presses "c","a","t" and then pastes "\nline\n". |
| 76 | n = safe_read(fd, buffer, 3); | 76 | * When we were reading 3 bytes here, we were eating |
| 77 | * "li" too, and cat was getting wrong input. | ||
| 78 | */ | ||
| 79 | n = safe_read(fd, buffer, 1); | ||
| 77 | if (n <= 0) | 80 | if (n <= 0) |
| 78 | return -1; | 81 | return -1; |
| 79 | } | 82 | } |
diff --git a/shell/hush.c b/shell/hush.c index add40eb5f..5fa693b0a 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
| @@ -1006,7 +1006,7 @@ static void restore_G_args(save_arg_t *sv, char **argv) | |||
| 1006 | * Commands run in command substitution ("`cmd`") | 1006 | * Commands run in command substitution ("`cmd`") |
| 1007 | * have SIGTTIN, SIGTTOU, SIGTSTP set to SIG_IGN. | 1007 | * have SIGTTIN, SIGTTOU, SIGTSTP set to SIG_IGN. |
| 1008 | * | 1008 | * |
| 1009 | * Ordinary commands have signals set to SIG_IGN/DFL set as inherited | 1009 | * Ordinary commands have signals set to SIG_IGN/DFL as inherited |
| 1010 | * by the shell from its parent. | 1010 | * by the shell from its parent. |
| 1011 | * | 1011 | * |
| 1012 | * Siganls which differ from SIG_DFL action | 1012 | * Siganls which differ from SIG_DFL action |
| @@ -1285,7 +1285,7 @@ static int set_local_var(char *str, int flg_export, int flg_read_only) | |||
| 1285 | if (strncmp(cur->varstr, str, name_len) != 0) { | 1285 | if (strncmp(cur->varstr, str, name_len) != 0) { |
| 1286 | if (!cur->next) { | 1286 | if (!cur->next) { |
| 1287 | /* Bail out. Note that now cur points | 1287 | /* Bail out. Note that now cur points |
| 1288 | * to last var in linked list */ | 1288 | * to the last var in the linked list */ |
| 1289 | break; | 1289 | break; |
| 1290 | } | 1290 | } |
| 1291 | cur = cur->next; | 1291 | cur = cur->next; |
