Vishal Bhoj | 82c8071 | 2015-12-15 21:13:33 +0530 | [diff] [blame] | 1 | /** @file
|
| 2 | Device Abstraction Utility Routines
|
| 3 |
|
| 4 | Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
| 5 | This program and the accompanying materials are licensed and made available
|
| 6 | under the terms and conditions of the BSD License which accompanies this
|
| 7 | distribution. The full text of the license may be found at
|
| 8 | http://opensource.org/licenses/bsd-license.php.
|
| 9 |
|
| 10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
| 11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
| 12 |
|
| 13 | Depends upon: <kfile.h>
|
| 14 | **/
|
| 15 | #ifndef __DEV_UTILITY_H__
|
| 16 | #define __DEV_UTILITY_H__
|
| 17 |
|
| 18 | #define CON_COOKIE 0x62416F49 ///< 'IoAb'
|
| 19 |
|
| 20 | typedef enum {
|
| 21 | PathAbsolute = 0,
|
| 22 | PathRelative,
|
| 23 | PathMapping,
|
| 24 | PathError
|
| 25 | } PATH_CLASS;
|
| 26 |
|
| 27 | typedef struct _Device_Node {
|
| 28 | LIST_ENTRY DevList; ///< List of registered device abstractions
|
| 29 | const CHAR16 *DevName;
|
| 30 | const GUID *DevProto;
|
| 31 | void *InstanceList; ///< Array of instances for this device
|
| 32 | FO_OPEN OpenFunc;
|
| 33 | UINT32 InstanceSize; ///< Size of each instance in the InstanceList
|
| 34 | UINT32 NumInstances; ///< Number of instances in InstanceList
|
| 35 | UINT32 OpModes; ///< Supported modes of operation
|
| 36 | } DeviceNode;
|
| 37 |
|
| 38 | __BEGIN_DECLS
|
| 39 |
|
| 40 | extern LIST_ENTRY daDeviceList; ///< List of registered devices.
|
| 41 | extern DeviceNode *daDefaultDevice; ///< Device to use if nothing else found
|
| 42 | extern DeviceNode *daRootDevice; ///< Device containing the root file system
|
| 43 | extern DeviceNode *daCurrentDevice; ///< Device currently being accessed
|
| 44 |
|
| 45 | /** Add a new device to the device list.
|
| 46 |
|
| 47 | @param DevName Name of the device to add.
|
| 48 | @param DevProto Pointer to the GUID identifying the protocol associated with this device.
|
| 49 | If DevProto is NULL, startup code will not try to find instances
|
| 50 | of this device.
|
| 51 | @param OpenFunc Pointer to the device's Open function.
|
| 52 | @param InstanceList Optional pointer to the device's initialized instance list.
|
| 53 | If InstanceList is NULL, the application startup code will
|
| 54 | scan for instances of the protocol identified by DevProto and
|
| 55 | populate the InstanceList in the order those protocols are found.
|
| 56 | @param NumInstance Number of instances in InstanceList.
|
| 57 | @param Modes Bit-mapped flags indicating operations (R, W, RW, ...) permitted to this device.
|
| 58 |
|
| 59 | **/
|
| 60 | DeviceNode * EFIAPI __DevRegister( const CHAR16 *DevName, GUID *DevProto, FO_OPEN OpenFunc,
|
| 61 | void *InstanceList, int NumInstance, UINT32 InstanceSize, UINT32 Modes);
|
| 62 |
|
| 63 | /** Find a DeviceNode matching DevName or DevProto, or both.
|
| 64 |
|
| 65 | If DevName is NULL, then the device name is not used in the search.
|
| 66 | If DevProto is NULL, then the protocol GUID is not used in the search.
|
| 67 | If both are NULL, then INVALID_PARAMETER is returned.
|
| 68 | If both DevName and DevProto are specified, then both must match.
|
| 69 | If both are specified but only one matches, then DEVICE_ERROR is returned.
|
| 70 |
|
| 71 | @param DevName Name of the Device Abstraction to find.
|
| 72 | @param DevProto GUID of the Protocol associated with the Device Abstraction.
|
| 73 | @param Node Pointer to the pointer to receive the found Device Node's address.
|
| 74 |
|
| 75 | @retval RETURN_SUCCESS The desired Device Node was found.
|
| 76 | @retval RETURN_INVALID_PARAMETER Both DevName and DevProto are NULL or Node is NULL.
|
| 77 | @retval RETURN_DEVICE_ERROR One, but not both, of DevNode and DevProto matched.
|
| 78 | **/
|
| 79 | EFI_STATUS EFIAPI __DevSearch( CHAR16 *DevName, GUID *DevProto, DeviceNode **Node);
|
| 80 |
|
| 81 | /** Identify the type of path pointed to by Path.
|
| 82 |
|
| 83 | Paths are classified based upon their initial character sequences.
|
| 84 | ^\\ Absolute Path
|
| 85 | ^\. Relative Path
|
| 86 | ^[^:\\]: Mapping Path
|
| 87 | .* Relative Path
|
| 88 |
|
| 89 | Mapping paths are broken into two parts at the ':'. The part to the left of the ':'
|
| 90 | is the Map Name, pointed to by Path, and the part to the right of the ':' is pointed
|
| 91 | to by NewPath.
|
| 92 |
|
| 93 | If Path was not a Mapping Path, then NewPath is set to Path.
|
| 94 |
|
| 95 | @param[in] Path Pointer to the path to be classified.
|
| 96 | @param[out] NewPath Pointer to the path portion of a mapping path.
|
| 97 |
|
| 98 | @retval PathAbsolute Path is an absolute path. NewPath points to the first '\'.
|
| 99 | @retval PathRelative Path is a relative path. NewPath = Path.
|
| 100 | @retval PathMapping Path is a mapping path. NewPath points to the ':'.
|
| 101 | @retval PathError Path is NULL.
|
| 102 | **/
|
| 103 | PATH_CLASS EFIAPI ClassifyPath(IN wchar_t *Path, OUT wchar_t **NewPath, int * const Length);
|
| 104 |
|
| 105 | /* Normalize a narrow-character path and produce a wide-character path
|
| 106 | that has forward slashes replaced with backslashes.
|
| 107 | Backslashes are directory separators in UEFI File Paths.
|
| 108 |
|
| 109 | It is the caller's responsibility to eventually free() the returned buffer.
|
| 110 |
|
| 111 | @param[in] path A pointer to the narrow-character path to be normalized.
|
| 112 |
|
| 113 | @return A pointer to a buffer containing the normalized, wide-character, path.
|
| 114 | */
|
| 115 | wchar_t *
|
| 116 | NormalizePath( const char *path);
|
| 117 |
|
| 118 | /** Process a MBCS path returning the final absolute path and the target device.
|
| 119 |
|
| 120 | @param path
|
| 121 | @param FullPath
|
| 122 | @param DevNode
|
| 123 |
|
| 124 | @retval RETURN_SUCCESS
|
| 125 | @retval RETURN_INVALID_PARAMETER
|
| 126 | @retval RETURN_NOT_FOUND
|
| 127 | **/
|
| 128 | RETURN_STATUS
|
| 129 | EFIAPI
|
| 130 | ParsePath( const char *path, wchar_t **FullPath, DeviceNode **DevNode, int *Which, wchar_t **MapPath);
|
| 131 |
|
| 132 | /** Process a wide character string representing a Mapping Path and extract the instance number.
|
| 133 |
|
| 134 | The instance number is the sequence of decimal digits immediately to the left
|
| 135 | of the ":" in the Map Name portion of a Mapping Path.
|
| 136 |
|
| 137 | This function is called with a pointer to beginning of the Map Name.
|
| 138 | Thus Path[Length] must be a ':' and Path[Length - 1] must be a decimal digit.
|
| 139 | If either of these are not true, an instance value of 0 is returned.
|
| 140 |
|
| 141 | If Path is NULL, an instance value of 0 is returned.
|
| 142 |
|
| 143 | @param[in] Path Points to the beginning of a Mapping Path
|
| 144 | @param[in] Length Number of valid characters to the left of the ':'
|
| 145 |
|
| 146 | @return Returns either 0 or the value of the contiguous digits to the left of the ':'.
|
| 147 | **/
|
| 148 | int
|
| 149 | EFIAPI
|
| 150 | PathInstance( const wchar_t *Path, int length);
|
| 151 |
|
| 152 | /** Transform a relative path into an absolute path.
|
| 153 |
|
| 154 | If Path is NULL, return NULL.
|
| 155 | Otherwise, pre-pend the CWD to Path then process the resulting path to:
|
| 156 | - Replace "/./" with "/"
|
| 157 | - Replace "/<dirname>/../" with "/"
|
| 158 | - Do not allow one to back up past the root, "/"
|
| 159 |
|
| 160 | Also sets the Current Working Device to the Root Device.
|
| 161 |
|
| 162 | Path must be a previously allocated buffer. PathAdjust will
|
| 163 | allocate a new buffer to hold the results of the transformation
|
| 164 | then free Path. A pointer to the newly allocated buffer is returned.
|
| 165 |
|
| 166 | @param[in] Path A pointer to the path to be transformed. This buffer
|
| 167 | will always be freed.
|
| 168 |
|
| 169 | @return A pointer to a buffer containing the transformed path.
|
| 170 | **/
|
| 171 | wchar_t *
|
| 172 | EFIAPI
|
| 173 | PathAdjust(wchar_t *Path);
|
| 174 |
|
| 175 | /** Replace the leading portion of Path with any aliases.
|
| 176 |
|
| 177 | Aliases are read from /etc/fstab. If there is an associated device, the
|
| 178 | Current Working Device is set to that device.
|
| 179 |
|
| 180 | Path must be a previously allocated buffer. PathAlias will
|
| 181 | allocate a new buffer to hold the results of the transformation
|
| 182 | then free Path. A pointer to the newly allocated buffer is returned.
|
| 183 |
|
| 184 | @param[in] Path A pointer to the original, unaliased, path. This
|
| 185 | buffer is always freed.
|
| 186 | @param[out] Node Filled in with a pointer to the Device Node describing
|
| 187 | the device abstraction associated with this path.
|
| 188 |
|
| 189 | @return A pointer to a buffer containing the aliased path.
|
| 190 | **/
|
| 191 | wchar_t *
|
| 192 | EFIAPI
|
| 193 | PathAlias(wchar_t *Path, DeviceNode **Node);
|
| 194 |
|
| 195 | /**
|
| 196 | Parses a normalized wide character path and returns a pointer to the entry
|
| 197 | following the last \. If a \ is not found in the path the return value will
|
| 198 | be the same as the input value. All error conditions return NULL.
|
| 199 |
|
| 200 | The behavior when passing in a path that has not been normalized is undefined.
|
| 201 |
|
| 202 | @param Path - A pointer to a wide character string containing a path to a
|
| 203 | directory or a file.
|
| 204 |
|
| 205 | @return Pointer to the file name or terminal directory. NULL if an error is
|
| 206 | detected.
|
| 207 | **/
|
| 208 | wchar_t *
|
| 209 | EFIAPI
|
| 210 | GetFileNameFromPath(
|
| 211 | const wchar_t *Path
|
| 212 | );
|
| 213 |
|
| 214 | __END_DECLS
|
| 215 |
|
| 216 | #endif /* __DEV_UTILITY_H__ */
|