util/cbfstool: Allow use of non-ASCII longopt
CB:29744 ("util/cbfstool: Add optional argument ibb") added support for non-ASCII characters for long_options. However, there is a check later on which errors out since this character is not one of the commands[i].optstring. This change adds a function valid_opt() which does the following things: 1. Checks if the returned optchar is among the list of optstring supported by the command. 2. Checks if the returned optchar is a valid non-ASCII option. Currently, we do not maintain a list of non-ASCII options supported by each command. So, this function returns true if the optchar returned by getopt_long falls within the allowed range. Signed-off-by: Furquan Shaikh <furquan@google.com> Change-Id: I27a4f9af9850e4c892573202904fa9e5fbb64df6 Reviewed-on: https://review.coreboot.org/c/coreboot/+/40375 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
8e66b23b35
commit
c42cf911ad
|
@ -1295,7 +1295,9 @@ static const struct command commands[] = {
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
/* begin after ASCII characters */
|
/* begin after ASCII characters */
|
||||||
LONGOPT_IBB = 256,
|
LONGOPT_START = 256,
|
||||||
|
LONGOPT_IBB = LONGOPT_START,
|
||||||
|
LONGOPT_END,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
|
@ -1491,6 +1493,23 @@ static void usage(char *name)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool valid_opt(size_t i, int c)
|
||||||
|
{
|
||||||
|
/* Check if it is one of the optstrings supported by the command. */
|
||||||
|
if (strchr(commands[i].optstring, c))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if it is one of the non-ASCII characters. Currently, the
|
||||||
|
* non-ASCII characters are only checked against the valid list
|
||||||
|
* irrespective of the command.
|
||||||
|
*/
|
||||||
|
if (c >= LONGOPT_START && c < LONGOPT_END)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -1525,9 +1544,8 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Filter out illegal long options */
|
/* Filter out illegal long options */
|
||||||
if (strchr(commands[i].optstring, c) == NULL) {
|
if (!valid_opt(i, c)) {
|
||||||
/* TODO maybe print actual long option instead */
|
ERROR("%s: invalid option -- '%d'\n",
|
||||||
ERROR("%s: invalid option -- '%c'\n",
|
|
||||||
argv[0], c);
|
argv[0], c);
|
||||||
c = '?';
|
c = '?';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue