Change the way efibootmgr works by specifying bootnum via -b parameter
Instead of passing the bootnum to each different parameter, require users to specify -b when running operations that need a bootnum. This allows activation of a new boot entry at the same time it's created by adding -a onto the command line. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D18648
This commit is contained in:
parent
ab00a509ee
commit
9ed0802914
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=342635
@ -1,5 +1,5 @@
|
|||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2017 Netflix, Inc.
|
* Copyright (c) 2017-2018 Netflix, Inc.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -94,16 +94,16 @@ typedef struct _bmgr_opts {
|
|||||||
} bmgr_opts_t;
|
} bmgr_opts_t;
|
||||||
|
|
||||||
static struct option lopts[] = {
|
static struct option lopts[] = {
|
||||||
{"activate", required_argument, NULL, 'a'},
|
{"activate", no_argument, NULL, 'a'},
|
||||||
{"bootnext", required_argument, NULL, 'n'}, /* set bootnext */
|
{"bootnext", no_argument, NULL, 'n'}, /* set bootnext */
|
||||||
{"bootnum", required_argument, NULL, 'b'},
|
{"bootnum", required_argument, NULL, 'b'},
|
||||||
{"bootorder", required_argument, NULL, 'o'}, /* set order */
|
{"bootorder", required_argument, NULL, 'o'}, /* set order */
|
||||||
{"copy", required_argument, NULL, 'C'}, /* Copy boot method */
|
{"copy", required_argument, NULL, 'C'}, /* Copy boot method */
|
||||||
{"create", no_argument, NULL, 'c'},
|
{"create", no_argument, NULL, 'c'},
|
||||||
{"deactivate", required_argument, NULL, 'A'},
|
{"deactivate", no_argument, NULL, 'A'},
|
||||||
{"del-timout", no_argument, NULL, 'T'},
|
{"del-timout", no_argument, NULL, 'T'},
|
||||||
{"delete", required_argument, NULL, 'B'},
|
{"delete", no_argument, NULL, 'B'},
|
||||||
{"delete-bootnext", required_argument, NULL, 'N'},
|
{"delete-bootnext", no_argument, NULL, 'N'},
|
||||||
{"dry-run", no_argument, NULL, 'D'},
|
{"dry-run", no_argument, NULL, 'D'},
|
||||||
{"env", required_argument, NULL, 'e'},
|
{"env", required_argument, NULL, 'e'},
|
||||||
{"help", no_argument, NULL, 'h'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
@ -171,37 +171,35 @@ set_bootvar(const char *name, uint8_t *data, size_t size)
|
|||||||
|
|
||||||
|
|
||||||
#define USAGE \
|
#define USAGE \
|
||||||
" [-aAnNB Bootvar] [-t timeout] [-T] [-o bootorder] [-O] [--verbose] [--help] \n\
|
" [-aAnB -b bootnum] [-N] [-t timeout] [-T] [-o bootorder] [-O] [--verbose] [--help]\n\
|
||||||
[-c -l loader [-k kernel ] [-L label] [--dry-run] [-b Bootvar]]"
|
[-c -l loader [-k kernel] [-L label] [--dry-run] [-b bootnum]]"
|
||||||
|
|
||||||
#define CREATE_USAGE \
|
#define CREATE_USAGE \
|
||||||
" efibootmgr -c -l loader [-k kernel] [-L label] [--dry-run]"
|
" efibootmgr -c -l loader [-k kernel] [-L label] [--dry-run] [-b bootnum] [-a]"
|
||||||
#define ORDER_USAGE \
|
#define ORDER_USAGE \
|
||||||
" efibootmgr -o bootvarnum1,bootvarnum2,..."
|
" efibootmgr -o bootvarnum1,bootvarnum2,..."
|
||||||
#define TIMEOUT_USAGE \
|
#define TIMEOUT_USAGE \
|
||||||
" efibootmgr -t seconds"
|
" efibootmgr -t seconds"
|
||||||
#define DELETE_USAGE \
|
#define DELETE_USAGE \
|
||||||
" efibootmgr -B bootvarnum"
|
" efibootmgr -B -b bootnum"
|
||||||
#define ACTIVE_USAGE \
|
#define ACTIVE_USAGE \
|
||||||
" efibootmgr [-a | -A] bootvarnum"
|
" efibootmgr [-a | -A] -b bootnum"
|
||||||
#define BOOTNEXT_USAGE \
|
#define BOOTNEXT_USAGE \
|
||||||
" efibootmgr [-n | -N] bootvarnum"
|
" efibootmgr [-n | -N] -b bootnum"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parse_args(int argc, char *argv[])
|
parse_args(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int ch;
|
int ch;
|
||||||
|
|
||||||
while ((ch = getopt_long(argc, argv, "A:a:B:b:C:cDe:hk:L:l:Nn:Oo:Tt:v",
|
while ((ch = getopt_long(argc, argv, "AaBb:C:cDe:hk:L:l:NnOo:Tt:v",
|
||||||
lopts, NULL)) != -1) {
|
lopts, NULL)) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'A':
|
case 'A':
|
||||||
opts.set_inactive = true;
|
opts.set_inactive = true;
|
||||||
opts.bootnum = strtoul(optarg, NULL, 16);
|
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
opts.set_active = true;
|
opts.set_active = true;
|
||||||
opts.bootnum = strtoul(optarg, NULL, 16);
|
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
opts.has_bootnum = true;
|
opts.has_bootnum = true;
|
||||||
@ -209,7 +207,6 @@ parse_args(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
opts.delete = true;
|
opts.delete = true;
|
||||||
opts.bootnum = strtoul(optarg, NULL, 16);
|
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
opts.copy = true;
|
opts.copy = true;
|
||||||
@ -246,7 +243,6 @@ parse_args(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
opts.set_bootnext = true;
|
opts.set_bootnext = true;
|
||||||
opts.bootnum = strtoul(optarg, NULL, 16);
|
|
||||||
break;
|
break;
|
||||||
case 'O':
|
case 'O':
|
||||||
opts.once = true;
|
opts.once = true;
|
||||||
@ -275,6 +271,15 @@ parse_args(int argc, char *argv[])
|
|||||||
|
|
||||||
if (opts.order && !(opts.order))
|
if (opts.order && !(opts.order))
|
||||||
errx(1, "%s", ORDER_USAGE);
|
errx(1, "%s", ORDER_USAGE);
|
||||||
|
|
||||||
|
if ((opts.set_inactive || opts.set_active) && !opts.has_bootnum)
|
||||||
|
errx(1, "%s", ACTIVE_USAGE);
|
||||||
|
|
||||||
|
if (opts.delete && !opts.has_bootnum)
|
||||||
|
errx(1, "%s", DELETE_USAGE);
|
||||||
|
|
||||||
|
if (opts.set_bootnext && !opts.has_bootnum)
|
||||||
|
errx(1, "%s", BOOTNEXT_USAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user