mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-25 17:23:53 +02:00 
			
		
		
		
	Fix "long double" handling and differences between MSFT and GCC compilers. Fix compliance issues with ISO/IEC 9899:199409 New Function declarations: setenv(), fparseln(), GetFileNameFromPath(), rename() git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12060 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			217 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Device Abstraction Utility Routines
 | |
| 
 | |
|   Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
 | |
|   This program and the accompanying materials are licensed and made available
 | |
|   under the terms and conditions of the BSD License which 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.
 | |
| 
 | |
|   Depends upon: <kfile.h>
 | |
| **/
 | |
| #ifndef __DEV_UTILITY_H__
 | |
| #define __DEV_UTILITY_H__
 | |
| 
 | |
| #define CON_COOKIE    0x62416F49    ///< 'IoAb'
 | |
| 
 | |
| typedef enum {
 | |
|   PathAbsolute = 0,
 | |
|   PathRelative,
 | |
|   PathMapping,
 | |
|   PathError
 | |
| } PATH_CLASS;
 | |
| 
 | |
| typedef struct _Device_Node {
 | |
|   LIST_ENTRY        DevList;        ///< List of registered device abstractions
 | |
|   const CHAR16     *DevName;
 | |
|   const GUID       *DevProto;
 | |
|   void             *InstanceList;   ///< Array of instances for this device
 | |
|   FO_OPEN           OpenFunc;
 | |
|   UINT32            InstanceSize;   ///< Size of each instance in the InstanceList
 | |
|   UINT32            NumInstances;   ///< Number of instances in InstanceList
 | |
|   UINT32            OpModes;        ///< Supported modes of operation
 | |
| } DeviceNode;
 | |
| 
 | |
| __BEGIN_DECLS
 | |
| 
 | |
| extern LIST_ENTRY       daDeviceList;     ///< List of registered devices.
 | |
| extern DeviceNode      *daDefaultDevice;  ///< Device to use if nothing else found
 | |
| extern DeviceNode      *daRootDevice;     ///< Device containing the root file system
 | |
| extern DeviceNode      *daCurrentDevice;  ///< Device currently being accessed
 | |
| 
 | |
| /** Add a new device to the device list.
 | |
| 
 | |
|     @param  DevName       Name of the device to add.
 | |
|     @param  DevProto      Pointer to the GUID identifying the protocol associated with this device.
 | |
|                           If DevProto is NULL, startup code will not try to find instances
 | |
|                           of this device.
 | |
|     @param  OpenFunc      Pointer to the device's Open function.
 | |
|     @param  InstanceList  Optional pointer to the device's initialized instance list.
 | |
|                           If InstanceList is NULL, the application startup code will
 | |
|                           scan for instances of the protocol identified by DevProto and
 | |
|                           populate the InstanceList in the order those protocols are found.
 | |
|     @param  NumInstance   Number of instances in InstanceList.
 | |
|     @param  Modes         Bit-mapped flags indicating operations (R, W, RW, ...) permitted to this device.
 | |
| 
 | |
| **/
 | |
| DeviceNode * EFIAPI __DevRegister( const CHAR16 *DevName, GUID *DevProto, FO_OPEN OpenFunc,
 | |
|                                    void *InstanceList, int NumInstance, UINT32 InstanceSize, UINT32 Modes);
 | |
| 
 | |
| /** 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         One, but not both, of DevNode and DevProto matched.
 | |
| **/
 | |
| EFI_STATUS EFIAPI __DevSearch( CHAR16 *DevName, GUID *DevProto, DeviceNode **Node);
 | |
| 
 | |
| /** Identify the type of path pointed to by Path.
 | |
| 
 | |
|     Paths are classified based upon their initial character sequences.
 | |
|       ^\\       Absolute Path
 | |
|       ^\.       Relative Path
 | |
|       ^[^:\\]:  Mapping Path
 | |
|       .*        Relative Path
 | |
| 
 | |
|     Mapping paths are broken into two parts at the ':'.  The part to the left of the ':'
 | |
|     is the Map Name, pointed to by Path, and the part to the right of the ':' is pointed
 | |
|     to by NewPath.
 | |
| 
 | |
|     If Path was not a Mapping Path, then NewPath is set to Path.
 | |
| 
 | |
|     @param[in]    Path      Pointer to the path to be classified.
 | |
|     @param[out]   NewPath   Pointer to the path portion of a mapping path.
 | |
| 
 | |
|     @retval PathAbsolute  Path is an absolute path. NewPath points to the first '\'.
 | |
|     @retval PathRelative  Path is a relative path. NewPath = Path.
 | |
|     @retval PathMapping   Path is a mapping path.  NewPath points to the ':'.
 | |
|     @retval PathError     Path is NULL.
 | |
| **/
 | |
| PATH_CLASS EFIAPI ClassifyPath(IN wchar_t *Path, OUT wchar_t **NewPath, int * const Length);
 | |
| 
 | |
| /*  Normalize a narrow-character path and produce a wide-character path
 | |
|     that has forward slashes replaced with backslashes.
 | |
|     Backslashes are directory separators in UEFI File Paths.
 | |
| 
 | |
|     It is the caller's responsibility to eventually free() the returned buffer.
 | |
| 
 | |
|     @param[in]    path    A pointer to the narrow-character path to be normalized.
 | |
| 
 | |
|     @return     A pointer to a buffer containing the normalized, wide-character, path.
 | |
| */
 | |
| wchar_t *
 | |
| NormalizePath( const char *path);
 | |
| 
 | |
| /** Process a MBCS path returning the final absolute path and the target device.
 | |
| 
 | |
|     @param path
 | |
|     @param FullPath
 | |
|     @param DevNode
 | |
| 
 | |
|     @retval RETURN_SUCCESS
 | |
|     @retval RETURN_INVALID_PARAMETER
 | |
|     @retval RETURN_NOT_FOUND
 | |
| **/
 | |
| RETURN_STATUS
 | |
| EFIAPI
 | |
| ParsePath( const char *path, wchar_t **FullPath, DeviceNode **DevNode, int *Which, wchar_t **MapPath);
 | |
| 
 | |
| /** Process a wide character string representing a Mapping Path and extract the instance number.
 | |
| 
 | |
|     The instance number is the sequence of decimal digits immediately to the left
 | |
|     of the ":" in the Map Name portion of a Mapping Path.
 | |
| 
 | |
|     This function is called with a pointer to beginning of the Map Name.
 | |
|     Thus Path[Length] must be a ':' and Path[Length - 1] must be a decimal digit.
 | |
|     If either of these are not true, an instance value of 0 is returned.
 | |
| 
 | |
|     If Path is NULL, an instance value of 0 is returned.
 | |
| 
 | |
|     @param[in]  Path    Points to the beginning of a Mapping Path
 | |
|     @param[in]  Length  Number of valid characters to the left of the ':'
 | |
| 
 | |
|     @return   Returns either 0 or the value of the contiguous digits to the left of the ':'.
 | |
| **/
 | |
| int
 | |
| EFIAPI
 | |
| PathInstance( const wchar_t *Path, int length);
 | |
| 
 | |
| /** Transform a relative path into an absolute path.
 | |
| 
 | |
|     If Path is NULL, return NULL.
 | |
|     Otherwise, pre-pend the CWD to Path then process the resulting path to:
 | |
|       - Replace "/./" with "/"
 | |
|       - Replace "/<dirname>/../" with "/"
 | |
|       - Do not allow one to back up past the root, "/"
 | |
| 
 | |
|     Also sets the Current Working Device to the Root Device.
 | |
| 
 | |
|     Path must be a previously allocated buffer.  PathAdjust will
 | |
|     allocate a new buffer to hold the results of the transformation
 | |
|     then free Path.  A pointer to the newly allocated buffer is returned.
 | |
| 
 | |
|     @param[in]  Path    A pointer to the path to be transformed.  This buffer
 | |
|                         will always be freed.
 | |
| 
 | |
|     @return   A pointer to a buffer containing the transformed path.
 | |
| **/
 | |
| wchar_t *
 | |
| EFIAPI
 | |
| PathAdjust(wchar_t *Path);
 | |
| 
 | |
| /** Replace the leading portion of Path with any aliases.
 | |
| 
 | |
|     Aliases are read from /etc/fstab.  If there is an associated device, the
 | |
|     Current Working Device is set to that device.
 | |
| 
 | |
|     Path must be a previously allocated buffer.  PathAlias will
 | |
|     allocate a new buffer to hold the results of the transformation
 | |
|     then free Path.  A pointer to the newly allocated buffer is returned.
 | |
| 
 | |
|     @param[in]    Path    A pointer to the original, unaliased, path.  This
 | |
|                           buffer is always freed.
 | |
|     @param[out]   Node    Filled in with a pointer to the Device Node describing
 | |
|                           the device abstraction associated with this path.
 | |
| 
 | |
|     @return     A pointer to a buffer containing the aliased path.
 | |
| **/
 | |
| wchar_t *
 | |
| EFIAPI
 | |
| PathAlias(wchar_t *Path, DeviceNode **Node);
 | |
| 
 | |
| /**
 | |
|   Parses a normalized wide character path and returns a pointer to the entry
 | |
|   following the last \.  If a \ is not found in the path the return value will
 | |
|   be the same as the input value.  All error conditions return NULL.
 | |
| 
 | |
|   The behavior when passing in a path that has not been normalized is undefined.
 | |
| 
 | |
|   @param  Path - A pointer to a wide character string containing a path to a
 | |
|                  directory or a file.
 | |
| 
 | |
|   @return Pointer to the file name or terminal directory.  NULL if an error is
 | |
|           detected.
 | |
| **/
 | |
| wchar_t *
 | |
| EFIAPI
 | |
| GetFileNameFromPath(
 | |
|   const wchar_t   *Path
 | |
|   );
 | |
| 
 | |
| __END_DECLS
 | |
| 
 | |
| #endif  /* __DEV_UTILITY_H__ */
 |