diff options
| author | Matthew Garrett <matthew.garrett@nebula.com> | 2013-05-19 18:13:01 +0100 |
|---|---|---|
| committer | Peter Jones <pjones@redhat.com> | 2013-09-26 11:57:59 -0400 |
| commit | d359712e1b1b0ed7ca611dfd11d9f78754a7a013 (patch) | |
| tree | bb526a90c21e07c1177da069c50788e7a705bc3f /lib/shell.c | |
| parent | c62b9d16de8bcd743ba59b34aff9d53875e5d793 (diff) | |
| download | efi-boot-shim-d359712e1b1b0ed7ca611dfd11d9f78754a7a013.tar.gz efi-boot-shim-d359712e1b1b0ed7ca611dfd11d9f78754a7a013.zip | |
Port MokManager to Linux Foundation loader UI code
This is the first stage of porting the MokManager UI to the UI code used
by the Linux Foundation UEFI loader.
Diffstat (limited to 'lib/shell.c')
| -rw-r--r-- | lib/shell.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/shell.c b/lib/shell.c new file mode 100644 index 00000000..51de4e0d --- /dev/null +++ b/lib/shell.c @@ -0,0 +1,57 @@ +/* + * Copyright 2012 <James.Bottomley@HansenPartnership.com> + * + * see COPYING file + * + * misc shell helper functions + */ +#include <efi.h> +#include <efilib.h> + +#include <shell.h> + +EFI_STATUS +argsplit(EFI_HANDLE image, int *argc, CHAR16*** ARGV) +{ + int i, count = 1; + EFI_STATUS status; + EFI_LOADED_IMAGE *info; + CHAR16 *start; + + *argc = 0; + + status = uefi_call_wrapper(BS->HandleProtocol, 3, image, &LoadedImageProtocol, (VOID **) &info); + if (EFI_ERROR(status)) { + Print(L"Failed to get arguments\n"); + return status; + } + + for (i = 0; i < info->LoadOptionsSize; i += 2) { + CHAR16 *c = (CHAR16 *)(info->LoadOptions + i); + if (*c == L' ' && *(c+1) != '\0') { + (*argc)++; + } + } + + (*argc)++; /* we counted spaces, so add one for initial */ + + *ARGV = AllocatePool(*argc * sizeof(*ARGV)); + if (!*ARGV) { + return EFI_OUT_OF_RESOURCES; + } + (*ARGV)[0] = (CHAR16 *)info->LoadOptions; + for (i = 0; i < info->LoadOptionsSize; i += 2) { + CHAR16 *c = (CHAR16 *)(info->LoadOptions + i); + if (*c == L' ') { + *c = L'\0'; + if (*(c + 1) == '\0') + /* strip trailing space */ + break; + start = c + 1; + (*ARGV)[count++] = start; + } + } + + return EFI_SUCCESS; +} + |
