libbb: shrink lineedit_read_key()
function old new delta lineedit_read_key 237 231 -6 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		| @@ -654,7 +654,7 @@ static int read_bunzip(bunzip_data *bd, char *outbuf, int len) | |||||||
| 				/* Subtract the 1 copy we'd output anyway to get extras */ | 				/* Subtract the 1 copy we'd output anyway to get extras */ | ||||||
| 				--bd->writeCopies; | 				--bd->writeCopies; | ||||||
| 			} | 			} | ||||||
| 		} /* for(;;) */ | 		} /* for (;;) */ | ||||||
|  |  | ||||||
| 		/* Decompression of this input block completed successfully */ | 		/* Decompression of this input block completed successfully */ | ||||||
| 		bd->writeCRC = CRC = ~CRC; | 		bd->writeCRC = CRC = ~CRC; | ||||||
|   | |||||||
| @@ -76,7 +76,7 @@ print_except_N_last_bytes(FILE *fp, unsigned count) | |||||||
| { | { | ||||||
| 	unsigned char *circle = xmalloc(++count); | 	unsigned char *circle = xmalloc(++count); | ||||||
| 	unsigned head = 0; | 	unsigned head = 0; | ||||||
| 	for(;;) { | 	for (;;) { | ||||||
| 		int c; | 		int c; | ||||||
| 		c = getc(fp); | 		c = getc(fp); | ||||||
| 		if (c == EOF) | 		if (c == EOF) | ||||||
| @@ -105,7 +105,7 @@ print_except_N_last_lines(FILE *fp, unsigned count) | |||||||
| { | { | ||||||
| 	char **circle = xzalloc((++count) * sizeof(circle[0])); | 	char **circle = xzalloc((++count) * sizeof(circle[0])); | ||||||
| 	unsigned head = 0; | 	unsigned head = 0; | ||||||
| 	for(;;) { | 	for (;;) { | ||||||
| 		char *c; | 		char *c; | ||||||
| 		c = xmalloc_fgets(fp); | 		c = xmalloc_fgets(fp); | ||||||
| 		if (!c) | 		if (!c) | ||||||
| @@ -127,7 +127,7 @@ print_except_N_last_lines(FILE *fp, unsigned count) | |||||||
| 	} | 	} | ||||||
|  ret: |  ret: | ||||||
| 	head = 0; | 	head = 0; | ||||||
| 	for(;;) { | 	for (;;) { | ||||||
| 		free(circle[head++]); | 		free(circle[head++]); | ||||||
| 		if (head == count) | 		if (head == count) | ||||||
| 			break; | 			break; | ||||||
|   | |||||||
| @@ -418,7 +418,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Loop through the lines in the patch | 	// Loop through the lines in the patch | ||||||
| 	for(;;) { | 	for (;;) { | ||||||
| 		char *patchline; | 		char *patchline; | ||||||
|  |  | ||||||
| 		patchline = xmalloc_fgetline(stdin); | 		patchline = xmalloc_fgetline(stdin); | ||||||
|   | |||||||
| @@ -441,7 +441,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv) | |||||||
| 	TT.filein = TT.fileout = -1; | 	TT.filein = TT.fileout = -1; | ||||||
|  |  | ||||||
| 	// Loop through the lines in the patch | 	// Loop through the lines in the patch | ||||||
| 	for(;;) { | 	for (;;) { | ||||||
| 		char *patchline; | 		char *patchline; | ||||||
|  |  | ||||||
| 		patchline = get_line(TT.filepatch); | 		patchline = get_line(TT.filepatch); | ||||||
|   | |||||||
| @@ -1900,6 +1900,8 @@ enum { | |||||||
|  * (unless fd is in non-blocking mode), |  * (unless fd is in non-blocking mode), | ||||||
|  * subsequent reads will time out after a few milliseconds. |  * subsequent reads will time out after a few milliseconds. | ||||||
|  * Return of -1 means EOF or error (errno == 0 on EOF). |  * Return of -1 means EOF or error (errno == 0 on EOF). | ||||||
|  |  * Nonzero errno is not preserved across the call: | ||||||
|  |  * if there was no error, errno will be cleared to 0. | ||||||
|  * buffer[0] is used as a counter of buffered chars and must be 0 |  * buffer[0] is used as a counter of buffered chars and must be 0 | ||||||
|  * on first call. |  * on first call. | ||||||
|  * timeout: |  * timeout: | ||||||
|   | |||||||
| @@ -2155,7 +2155,7 @@ static int lineedit_read_key(char *read_key_buffer, int timeout) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	fflush_all(); | 	fflush_all(); | ||||||
| 	while (1) { | 	for (;;) { | ||||||
| 		/* Wait for input. TIMEOUT = -1 makes read_key wait even | 		/* Wait for input. TIMEOUT = -1 makes read_key wait even | ||||||
| 		 * on nonblocking stdin, TIMEOUT = 50 makes sure we won't | 		 * on nonblocking stdin, TIMEOUT = 50 makes sure we won't | ||||||
| 		 * insist on full MB_CUR_MAX buffer to declare input like | 		 * insist on full MB_CUR_MAX buffer to declare input like | ||||||
| @@ -2167,24 +2167,30 @@ static int lineedit_read_key(char *read_key_buffer, int timeout) | |||||||
| 		 * | 		 * | ||||||
| 		 * Note: read_key sets errno to 0 on success. | 		 * Note: read_key sets errno to 0 on success. | ||||||
| 		 */ | 		 */ | ||||||
| 		do { | 		for (;;) { | ||||||
| 			if ((state->flags & LI_INTERRUPTIBLE) && bb_got_signal) { | 			if ((state->flags & LI_INTERRUPTIBLE) && bb_got_signal) { | ||||||
| 				errno = EINTR; | 				errno = EINTR; | ||||||
| 				return -1; | 				return -1; | ||||||
| 			} | 			} | ||||||
| //FIXME: still races here with signals, but small window to poll() inside read_key | //FIXME: still races here with signals, but small window to poll() inside read_key | ||||||
| 			IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 1;) | 			IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 1;) | ||||||
|  | 			/* errno = 0; - read_key does this itself */ | ||||||
| 			ic = read_key(STDIN_FILENO, read_key_buffer, timeout); | 			ic = read_key(STDIN_FILENO, read_key_buffer, timeout); | ||||||
| 			IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 0;) | 			IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 0;) | ||||||
| 		} while (!(state->flags & LI_INTERRUPTIBLE) && errno == EINTR); | 			if (errno != EINTR) | ||||||
|  | 				break; | ||||||
|  | 			if (state->flags & LI_INTERRUPTIBLE) { | ||||||
|  | 				/* LI_INTERRUPTIBLE bails out on EINTR, | ||||||
|  | 				 * but nothing really guarantees that bb_got_signal | ||||||
|  | 				 * is nonzero. Follow the least surprise principle: | ||||||
|  | 				 */ | ||||||
|  | 				if (bb_got_signal == 0) | ||||||
|  | 					bb_got_signal = 255; | ||||||
|  | 				goto ret; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		if (errno) { | 		if (errno) { | ||||||
| 			/* LI_INTERRUPTIBLE can bail out with EINTR here, |  | ||||||
| 			 * but nothing really guarantees that bb_got_signal |  | ||||||
| 			 * is nonzero. Follow the least surprise principle: |  | ||||||
| 			 */ |  | ||||||
| 			if (errno == EINTR && bb_got_signal == 0) |  | ||||||
| 				bb_got_signal = 255; /* something nonzero */ |  | ||||||
| #if ENABLE_UNICODE_SUPPORT | #if ENABLE_UNICODE_SUPPORT | ||||||
| 			if (errno == EAGAIN && unicode_idx != 0) | 			if (errno == EAGAIN && unicode_idx != 0) | ||||||
| 				goto pushback; | 				goto pushback; | ||||||
| @@ -2251,7 +2257,7 @@ static int lineedit_read_key(char *read_key_buffer, int timeout) | |||||||
| #endif | #endif | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  ret: | ||||||
| 	return ic; | 	return ic; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -291,6 +291,7 @@ int64_t FAST_FUNC safe_read_key(int fd, char *buffer, int timeout) | |||||||
| { | { | ||||||
| 	int64_t r; | 	int64_t r; | ||||||
| 	do { | 	do { | ||||||
|  | 		/* errno = 0; - read_key does this itself */ | ||||||
| 		r = read_key(fd, buffer, timeout); | 		r = read_key(fd, buffer, timeout); | ||||||
| 	} while (errno == EINTR); | 	} while (errno == EINTR); | ||||||
| 	return r; | 	return r; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user