mirror of
https://github.com/ipxe/ipxe
synced 2025-12-21 04:20:17 +03:00
[console] Restore compatibility with "--key" values in existing scripts
Commit 3ef4f7e ("[console] Avoid overlap between special keys and
Unicode characters") renumbered the special key encoding to avoid
collisions with Unicode key values outside the ASCII range. This
change broke backwards compatibility with existing scripts that
specify key values using e.g. "prompt --key" or "menu --key".
Restore compatibility with existing scripts by tweaking the special
key encoding so that the relative key value (i.e. the delta from
KEY_MIN) is numerically equal to the old pre-Unicode key value, and by
modifying parse_key() to accept a relative key value.
Reported-by: Sven Dreyer <sven@dreyer-net.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -28,6 +28,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
#include <ipxe/netdevice.h>
|
||||
@@ -35,6 +36,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
#include <ipxe/settings.h>
|
||||
#include <ipxe/params.h>
|
||||
#include <ipxe/timer.h>
|
||||
#include <ipxe/keys.h>
|
||||
#include <ipxe/parseopt.h>
|
||||
#include <config/branding.h>
|
||||
|
||||
@@ -213,6 +215,7 @@ int parse_flag ( char *text __unused, int *flag ) {
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int parse_key ( char *text, unsigned int *key ) {
|
||||
int rc;
|
||||
|
||||
/* Interpret single characters as being a literal key character */
|
||||
if ( text[0] && ! text[1] ) {
|
||||
@@ -221,7 +224,17 @@ int parse_key ( char *text, unsigned int *key ) {
|
||||
}
|
||||
|
||||
/* Otherwise, interpret as an integer */
|
||||
return parse_integer ( text, key );
|
||||
if ( ( rc = parse_integer ( text, key ) ) < 0 )
|
||||
return rc;
|
||||
|
||||
/* For backwards compatibility with existing scripts, treat
|
||||
* integers between the ASCII range and special key range as
|
||||
* being relative special key values.
|
||||
*/
|
||||
if ( ( ! isascii ( *key ) ) && ( *key < KEY_MIN ) )
|
||||
*key += KEY_MIN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user