return (RetVal);\r
}\r
\r
+/**\r
+ Convert a null-terminated unicode string, in-place, to all lowercase.\r
+ Then return it.\r
+**/\r
+STATIC\r
+CHAR16 *\r
+ToLower (\r
+ CHAR16 *Str\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ for (Index = 0; Str[Index] != L'\0'; Index++) {\r
+ if (Str[Index] >= L'A' && Str[Index] <= L'Z') {\r
+ Str[Index] -= (L'A' - L'a');\r
+ }\r
+ }\r
+ return Str;\r
+}\r
+\r
/**\r
This function returns the command associated with a alias or a list of all\r
alias'.\r
UINTN RetSize;\r
UINT32 Attribs;\r
EFI_STATUS Status;\r
+ CHAR16 *AliasLower;\r
\r
+ // Convert to lowercase to make aliases case-insensitive\r
if (Alias != NULL) {\r
+ AliasLower = AllocateCopyPool (StrSize (Alias), Alias);\r
+ ASSERT (AliasLower != NULL);\r
+ ToLower (AliasLower);\r
+\r
if (Volatile == NULL) {\r
- return (AddBufferToFreeList(GetVariable((CHAR16*)Alias, &gShellAliasGuid)));\r
+ return (AddBufferToFreeList(GetVariable(AliasLower, &gShellAliasGuid)));\r
}\r
RetSize = 0;\r
RetVal = NULL;\r
- Status = gRT->GetVariable((CHAR16*)Alias, &gShellAliasGuid, &Attribs, &RetSize, RetVal);\r
+ Status = gRT->GetVariable(AliasLower, &gShellAliasGuid, &Attribs, &RetSize, RetVal);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
RetVal = AllocateZeroPool(RetSize);\r
- Status = gRT->GetVariable((CHAR16*)Alias, &gShellAliasGuid, &Attribs, &RetSize, RetVal);\r
+ Status = gRT->GetVariable(AliasLower, &gShellAliasGuid, &Attribs, &RetSize, RetVal);\r
}\r
if (EFI_ERROR(Status)) {\r
if (RetVal != NULL) {\r
*Volatile = TRUE;\r
}\r
\r
+ FreePool (AliasLower);\r
return (AddBufferToFreeList(RetVal));\r
}\r
return (AddBufferToFreeList(InternalEfiShellGetListAlias()));\r
IN BOOLEAN Volatile\r
)\r
{\r
+ EFI_STATUS Status;\r
+ CHAR16 *AliasLower;\r
+\r
+ // Convert to lowercase to make aliases case-insensitive\r
+ if (Alias != NULL) {\r
+ AliasLower = AllocateCopyPool (StrSize (Alias), Alias);\r
+ ASSERT (AliasLower != NULL);\r
+ ToLower (AliasLower);\r
+ } else {\r
+ AliasLower = NULL;\r
+ }\r
+\r
//\r
// We must be trying to remove one if Alias is NULL\r
//\r
//\r
// remove an alias (but passed in COMMAND parameter)\r
//\r
- return (gRT->SetVariable((CHAR16*)Command, &gShellAliasGuid, 0, 0, NULL));\r
+ Status = (gRT->SetVariable((CHAR16*)Command, &gShellAliasGuid, 0, 0, NULL));\r
} else {\r
//\r
// Add and replace are the same\r
// We dont check the error return on purpose since the variable may not exist.\r
gRT->SetVariable((CHAR16*)Command, &gShellAliasGuid, 0, 0, NULL);\r
\r
- return (gRT->SetVariable((CHAR16*)Alias, &gShellAliasGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS|(Volatile?0:EFI_VARIABLE_NON_VOLATILE), StrSize(Command), (VOID*)Command));\r
+ Status = (gRT->SetVariable((CHAR16*)Alias, &gShellAliasGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS|(Volatile?0:EFI_VARIABLE_NON_VOLATILE), StrSize(Command), (VOID*)Command));\r
}\r
+\r
+ if (Alias != NULL) {\r
+ FreePool (AliasLower);\r
+ }\r
+ return Status;\r
}\r
\r
/**\r
@retval EFI_NOT_FOUND the Alias intended to be deleted was not found\r
@retval EFI_ACCESS_DENIED The alias is a built-in alias or already existed and Replace was set to\r
FALSE.\r
+ @retval EFI_INVALID_PARAMETER Command is null or the empty string.\r
**/\r
EFI_STATUS\r
EFIAPI\r
IN BOOLEAN Volatile\r
)\r
{\r
- //\r
- // cant set over a built in alias\r
- //\r
if (ShellCommandIsOnAliasList(Alias==NULL?Command:Alias)) {\r
+ //\r
+ // cant set over a built in alias\r
+ //\r
return (EFI_ACCESS_DENIED);\r
- }\r
- if (Command == NULL || *Command == CHAR_NULL || StrLen(Command) == 0) {\r
+ } else if (Command == NULL || *Command == CHAR_NULL || StrLen(Command) == 0) {\r
+ //\r
+ // Command is null or empty\r
+ //\r
return (EFI_INVALID_PARAMETER);\r
- }\r
-\r
- if (EfiShellGetAlias(Command, NULL) != NULL && !Replace) {\r
+ } else if (EfiShellGetAlias(Command, NULL) != NULL && !Replace) {\r
+ //\r
+ // Alias already exists, Replace not set\r
+ //\r
return (EFI_ACCESS_DENIED);\r
+ } else {\r
+ return (InternalSetAlias(Command, Alias, Volatile));\r
}\r
-\r
- return (InternalSetAlias(Command, Alias, Volatile));\r
}\r
\r
// Pure FILE_HANDLE operations are passed to FileHandleLib\r