From 53e1e5c647b73e45569ed6e8b8a0a5b276aa685e Mon Sep 17 00:00:00 2001 From: darylm503 Date: Tue, 28 Jun 2011 02:34:10 +0000 Subject: =?UTF-8?q?Add=20device=20abstraction=20code=20for=20the=20UEFI=20?= =?UTF-8?q?Console=20and=20UEFI=20Shell-based=20file=20systems.=20Make=20a?= =?UTF-8?q?rgv=20use=20narrow=20characters=20instead=20of=20wide=20charact?= =?UTF-8?q?ers.=20Add=20setenv=20functionality.=20Add=20poll()=20system=20?= =?UTF-8?q?call.=20Change=20signal=20names=20into=20macros=20=E2=80=93=20r?= =?UTF-8?q?equired=20for=20standards=20compliance.=20=20The=20enums=20were?= =?UTF-8?q?=20renamed=20and=20moved=20to=20sys/signal.h=20and=20the=20new?= =?UTF-8?q?=20macros=20reference=20the=20enums.=20Added=20SIGBREAK,=20whic?= =?UTF-8?q?h=20is=20required=20for=20Python.=20Modify=20stdio=20functions?= =?UTF-8?q?=20to=20fail=20cleanly=20when=20called=20with=20a=20NULL=20File?= =?UTF-8?q?=20Pointer=20argument.=20Added=20=20that=20just=20?= =?UTF-8?q?includes=20.=20=20By=20adding=20this=20wrapper,?= =?UTF-8?q?=20we=20improve=20compatibility=20with=20*nix=20files=20which?= =?UTF-8?q?=20assume=20=20exists.=20Add=20=20Added=20m?= =?UTF-8?q?acros=20for=20bcopy(),=20bcmp()=20and=20strsep().=20Modify=20th?= =?UTF-8?q?e=20clock()=20function=20so=20that=20it=20does=20not=20hang=20w?= =?UTF-8?q?hen=20running=20under=20an=20emulation=20environment=20such=20a?= =?UTF-8?q?s=20NT32.=20Move=20TM=20structure=20specific=20macros=20from=20?= =?UTF-8?q?the=20private=20tzfile.h=20into=20=20Add=20strncasecmp?= =?UTF-8?q?=20function.=20Add=20strptime=20function.=20Add=20gettimeofday?= =?UTF-8?q?=20function.=20Add=20getcwd=20function.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11908 6f19259b-4bc3-4df7-8a09-765794883524 --- StdLib/LibC/Uefi/Devices/Utility/DevSearch.c | 112 +++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 StdLib/LibC/Uefi/Devices/Utility/DevSearch.c (limited to 'StdLib/LibC/Uefi/Devices/Utility/DevSearch.c') diff --git a/StdLib/LibC/Uefi/Devices/Utility/DevSearch.c b/StdLib/LibC/Uefi/Devices/Utility/DevSearch.c new file mode 100644 index 0000000000..b0fc7bacd1 --- /dev/null +++ b/StdLib/LibC/Uefi/Devices/Utility/DevSearch.c @@ -0,0 +1,112 @@ +/** @file + Device Abstraction: Search device list for a matching device. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include + +#include + +#include +#include +#include +#include + +/** Find a DeviceNode matching DevName or DevProto, or both. + + If DevName is NULL, then the device name is not used in the search. + If DevProto is NULL, then the protocol GUID is not used in the search. + If both are NULL, then INVALID_PARAMETER is returned. + If both DevName and DevProto are specified, then both must match. + If both are specified but only one matches, then DEVICE_ERROR is returned. + + @param DevName Name of the Device Abstraction to find. + @param DevProto GUID of the Protocol associated with the Device Abstraction. + @param Node Pointer to the pointer to receive the found Device Node's address. + + @retval RETURN_SUCCESS The desired Device Node was found. + @retval RETURN_INVALID_PARAMETER Both DevName and DevProto are NULL or Node is NULL. + @retval RETURN_DEVICE_ERROR DevName matched but DevProto did not. + @retval RETURN_NOT_FOUND The desired device was not found. +**/ +EFI_STATUS +EFIAPI +__DevSearch( + IN CHAR16 *DevName, + IN GUID *DevProto, + OUT DeviceNode **Node + ) +{ + RETURN_STATUS Status = RETURN_NOT_FOUND; + DeviceNode *WorkNode; + INT32 DevMatched; + + if(((DevName == NULL) && (DevProto == NULL)) || (Node == NULL)) { + Status = RETURN_INVALID_PARAMETER; + } + else { + if(IsListEmpty((LIST_ENTRY *)&daDeviceList)) { + Status = RETURN_NOT_FOUND; + } + else { + /* Traverse the list of Device Nodes hunting for a match */ + WorkNode = (DeviceNode *)GetFirstNode((LIST_ENTRY *)&daDeviceList); + do { + /* Use DevMatched to keep track of the three match conditions. */ + DevMatched = 0; + if(DevName != NULL) { + ++DevMatched; + if(wcsncmp(DevName, WorkNode->DevName, wcslen(WorkNode->DevName)) == 0) { + ++DevMatched; + } + } + /* At this point, DevMatched has one of the following values: + 0 DevName == NULL, no name comparison + 1 DevName did not match WorkNode's name + 2 DevName MATCHED + */ + if((DevMatched != 1) && (DevProto != NULL) && (WorkNode->DevProto != NULL)) { + /* Only bother with the GUID comparison if: + * There was NOT a name mismatch + * DevProto is NOT NULL -- there is a GUID to compare + * WorkNode->DevProto is NOT NULL + */ + if(CompareGuid(DevProto, WorkNode->DevProto)) { + // GUIDs matched, we found it + Status = RETURN_SUCCESS; + *Node = WorkNode; + break; + } + else { + // GUIDs did not match + if(DevMatched == 2) { + // Name matched, GUID did not! + Status = RETURN_DEVICE_ERROR; + break; // Don't try any more, we have an internal problem + } + } + } + else { + if(DevMatched == 2) { + // Device Name matched, GUIDs skipped + Status = RETURN_SUCCESS; + *Node = WorkNode; + break; + } + } + // Check the next device in the list + WorkNode = (DeviceNode *)GetNextNode(&daDeviceList, (LIST_ENTRY *)WorkNode); + } while(&daDeviceList != (LIST_ENTRY *)WorkNode); + } + } + return Status; +} -- cgit v1.2.3