Index: usr.sbin/efibootmgr/efibootmgr.8 =================================================================== --- usr.sbin/efibootmgr/efibootmgr.8 +++ usr.sbin/efibootmgr/efibootmgr.8 @@ -24,20 +24,39 @@ .\" .\" $FreeBSD$ .\" -.Dd December 28, 2018 +.Dd January 1, 2019 .Dt EFIBOOTMGR 8 .Os .Sh NAME -.Nm efibootmgr +.Nm efibootmgr .Nd manipulate the EFI Boot Manager .Sh SYNOPSIS -.Op Fl aAnNB -.Op Fl b Ar bootnum -.Op Fl t Ar timeout -.Op Fl T -.Op Fl o Ar bootorder +.Nm .Op Fl v -.Op Fl c l Ar loader [ Fl k Ar kernel ] [ Fl L Ar label ] [ Fl -dry-run ] +.Nm +.Fl c +.Fl l Ar loader +.Op Fl aD +.Op Fl b Ar bootnum +.Op Fl k Ar kernel +.Op Fl L Ar label +.Nm +.Fl B +.Fl b Ar bootnum +.Nm +.Brq Fl a Ns | Ns Fl A +.Fl b Ar bootnum +.Nm +.Fl n +.Fl b Ar bootnum +.Nm +.Fl N +.Nm +.Fl o Ar bootvarnum1 Ns , Ns Ar bootvarnum2 Ns , Ns Ar ... +.Nm +.Fl t Ar seconds +.Nm +.Fl T .Sh "DESCRIPTION" .Nm manipulates how UEFI Boot Managers boot the system. Index: usr.sbin/efibootmgr/efibootmgr.c =================================================================== --- usr.sbin/efibootmgr/efibootmgr.c +++ usr.sbin/efibootmgr/efibootmgr.c @@ -58,6 +58,8 @@ #include #include +extern const char *__progname; + #ifndef LOAD_OPTION_ACTIVE #define LOAD_OPTION_ACTIVE 0x00000001 #endif @@ -169,23 +171,47 @@ COMMON_ATTRS); } +typedef enum { + EBM_LIST, + EBM_CREATE, + EBM_DELETE, + EBM_ACTIVE, + EBM_BOOTNEXT_SET, + EBM_BOOTNEXT_DELETE, + EBM_ORDER, + EBM_TIMEOUT_SET, + EBM_TIMEOUT_DELETE +} ebm_usage_t; +static const char * const ebm_usage[] = { + [EBM_LIST] = "[-v]", + [EBM_CREATE] = "-c -l loader [-aD] [-b bootnum] [-k kernel] [-L label]", + [EBM_DELETE] = "-B -b bootnum", + [EBM_ACTIVE] = "{-a|-A} -b bootnum", + [EBM_BOOTNEXT_SET] = "-n -b bootnum", + [EBM_BOOTNEXT_DELETE] = "-N", + [EBM_ORDER] = "-o bootvarnum1,bootvarnum2,...", + [EBM_TIMEOUT_SET] = "-t seconds", + [EBM_TIMEOUT_DELETE] = "-T" +}; + +static void +usage(bool help, ebm_usage_t unum) +{ + FILE *s = help ? stdout : stderr; + + fprintf(s, "Usage:\n"); -#define USAGE \ - " [-aAnB -b bootnum] [-N] [-t timeout] [-T] [-o bootorder] [-O] [--verbose] [--help]\n\ - [-c -l loader [-k kernel] [-L label] [--dry-run] [-b bootnum]]" + if (unum >= 0 && unum < nitems(ebm_usage)) + fprintf(s, "\t%s %s\n", __progname, ebm_usage[unum]); + else { + ebm_usage_t i; -#define CREATE_USAGE \ - " efibootmgr -c -l loader [-k kernel] [-L label] [--dry-run] [-b bootnum] [-a]" -#define ORDER_USAGE \ - " efibootmgr -o bootvarnum1,bootvarnum2,..." -#define TIMEOUT_USAGE \ - " efibootmgr -t seconds" -#define DELETE_USAGE \ - " efibootmgr -B -b bootnum" -#define ACTIVE_USAGE \ - " efibootmgr [-a | -A] -b bootnum" -#define BOOTNEXT_USAGE \ - " efibootmgr [-n | -N] -b bootnum" + for (i = 0; i < nitems(ebm_usage); i++) + fprintf(s, "\t%s %s\n", __progname, ebm_usage[i]); + } + + exit (help ? 0 : 1); +} static void parse_args(int argc, char *argv[]) @@ -222,8 +248,7 @@ opts.env = strdup(optarg); break; case 'h': - default: - errx(1, "%s", USAGE); + usage(true, -1); break; case 'k': free(opts.kernel); @@ -261,25 +286,28 @@ case 'v': opts.verbose = true; break; + default: + usage(false, -1); + break; } } if (opts.create) { if (!opts.loader) - errx(1, "%s",CREATE_USAGE); + usage(false, EBM_CREATE); return; } if (opts.order && !(opts.order)) - errx(1, "%s", ORDER_USAGE); + usage(false, EBM_ORDER); if ((opts.set_inactive || opts.set_active) && !opts.has_bootnum) - errx(1, "%s", ACTIVE_USAGE); + usage(false, EBM_ACTIVE); if (opts.delete && !opts.has_bootnum) - errx(1, "%s", DELETE_USAGE); + usage(false, EBM_DELETE); if (opts.set_bootnext && !opts.has_bootnum) - errx(1, "%s", BOOTNEXT_USAGE); + usage(false, EBM_BOOTNEXT_SET); } @@ -344,13 +372,13 @@ new_data[i] = strtoul(next, NULL, 16); if (new_data[i] == 0 && errno == EINVAL) { warnx("can't parse %s as a numb", next); - errx(1, "%s", ORDER_USAGE); + usage(false, EBM_ORDER); } i++; } free(cp); if (set_bootvar("BootOrder", (uint8_t*)new_data, size) < 0) - err(1, "Unabke to set BootOrder to %s", order); + err(1, "Unable to set BootOrder to %s", order); free(new_data); }