efi-boot-shim/lib/shell.c
Matthew Garrett 17857eb8b5 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.
2013-09-26 11:57:59 -04:00

58 lines
1.1 KiB
C

/*
* 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;
}