summaryrefslogtreecommitdiff
path: root/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-02-07 22:04:03 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2010-02-07 22:04:03 +0000
commit85e385f42b3a93dd51d76173eb4083f9caf803d7 (patch)
treef877f01b775eaaab7291c6aa5ce29111c6fe6ad7 /EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
parent3ba736f39cdb1d587089885dcde4b501eea9962e (diff)
downloadedk2-platforms-85e385f42b3a93dd51d76173eb4083f9caf803d7.tar.xz
Added CWD to EfiFileLib. Fix some X64 warnings.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9942 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c')
-rw-r--r--EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c83
1 files changed, 82 insertions, 1 deletions
diff --git a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
index 5effe7fcb9..cbe2aeeceb 100644
--- a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
+++ b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
@@ -55,6 +55,9 @@
#include <Library/EblNetworkLib.h>
+CHAR8 *gCwd = NULL;
+
+
#define EFI_OPEN_FILE_GUARD_HEADER 0x4B4D4641
#define EFI_OPEN_FILE_GUARD_FOOTER 0x444D5A56
@@ -635,6 +638,7 @@ EfiOpen (
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN Size;
EFI_IP_ADDRESS Ip;
+ CHAR8 *CwdPlusPathName;
EblUpdateDeviceLists ();
@@ -656,8 +660,22 @@ EfiOpen (
}
if (FileStart == 0) {
+ if (gCwd == NULL) {
+ // No CWD
+ return NULL;
+ }
+
// We could add a current working diretory concept
- return NULL;
+ CwdPlusPathName = AllocatePool (AsciiStrSize (gCwd) + AsciiStrSize (PathName));
+ if (CwdPlusPathName == NULL) {
+ return NULL;
+ }
+
+ AsciiStrCpy (CwdPlusPathName, gCwd);
+ AsciiStrCat (CwdPlusPathName, PathName);
+ File = EfiOpen (CwdPlusPathName, OpenMode, SectionType);
+ FreePool (CwdPlusPathName);
+ return File;
}
//
@@ -1481,3 +1499,66 @@ EfiWrite (
return Status;
}
+
+
+/**
+ Set the Curent Working Directory (CWD). If a call is made to EfiOpen () and
+ the path does not contain a device name, The CWD is prepended to the path.
+
+ @param Cwd Current Working Directory to set
+
+
+ @return EFI_SUCCESS CWD is set
+ @return EFI_INVALID_PARAMETER Cwd is not a valid device:path
+
+**/
+EFI_STATUS
+EfiSetCwd (
+ IN CHAR8 *Cwd
+ )
+{
+ EFI_OPEN_FILE *File;
+
+ File = EfiOpen (Cwd, EFI_FILE_MODE_READ, 0);
+ if (File == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ EfiClose (File);
+
+ if (gCwd != NULL) {
+ FreePool (gCwd);
+ }
+
+ gCwd = AllocatePool (AsciiStrSize (Cwd));
+ if (gCwd == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+ AsciiStrCpy (gCwd, Cwd);
+ return EFI_SUCCESS;
+}
+
+
+/**
+ Set the Curent Working Directory (CWD). If a call is made to EfiOpen () and
+ the path does not contain a device name, The CWD is prepended to the path.
+ The CWD buffer is only valid until a new call is made to EfiSetCwd(). After
+ a call to EfiSetCwd() it is not legal to use the pointer returned by
+ this funciton.
+
+ @param Cwd Current Working Directory
+
+
+ @return NULL No CWD set
+ @return 'other' Returns buffer that contains CWD.
+
+**/
+CHAR8 *
+EfiGettCwd (
+ VOID
+ )
+{
+ return gCwd;
+}
+
+