/*++\r
\r
-Copyright (c) 2006 - 2007, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials \r
are licensed and made available under the terms and conditions of the BSD License \r
which accompanies this distribution. The full text of the license may be found at \r
http://opensource.org/licenses/bsd-license.php \r
if (Private != NULL) {\r
\r
if (Private->VolumeLabel != NULL)\r
- gBS->FreePool (Private->VolumeLabel);\r
+ gBS->FreePool (Private->VolumeLabel);\r
if (Private->FilePath != NULL)\r
- gBS->FreePool (Private->FilePath);\r
+ gBS->FreePool (Private->FilePath);\r
FreeUnicodeStringTable (Private->ControllerNameTable);\r
\r
gBS->FreePool (Private);\r
EFIAPI\r
UnixSimpleFileSystemOpenVolume (\r
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,\r
- OUT EFI_FILE **Root\r
+ OUT EFI_FILE_PROTOCOL **Root\r
)\r
/*++\r
\r
\r
gBS->FreePool (PrivateFile);\r
}\r
+ \r
+ *Root = NULL;\r
}\r
\r
gBS->RestoreTPL (OldTpl);\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemOpen (\r
- IN EFI_FILE *This,\r
- OUT EFI_FILE **NewHandle,\r
- IN CHAR16 *FileName,\r
- IN UINT64 OpenMode,\r
- IN UINT64 Attributes\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ OUT EFI_FILE_PROTOCOL **NewHandle,\r
+ IN CHAR16 *FileName,\r
+ IN UINT64 OpenMode,\r
+ IN UINT64 Attributes\r
)\r
/*++\r
\r
// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
// TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
{\r
- EFI_FILE *Root;\r
+ EFI_FILE_PROTOCOL *Root;\r
UNIX_EFI_FILE_PRIVATE *PrivateFile;\r
UNIX_EFI_FILE_PRIVATE *NewPrivateFile;\r
UNIX_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
NewPrivateFile->IsDirectoryPath = FALSE;\r
}\r
} else {\r
- struct stat finfo;\r
+ STAT_FIX finfo;\r
int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);\r
if (res == 0 && S_ISDIR(finfo.st_mode))\r
NewPrivateFile->IsDirectoryPath = TRUE;\r
// Create a directory\r
//\r
if (NewPrivateFile->UnixThunk->MkDir (NewPrivateFile->FileName, 0777) != 0) {\r
- INTN LastError;\r
+ INTN LastError;\r
\r
LastError = PrivateFile->UnixThunk->GetErrno ();\r
if (LastError != EEXIST) {\r
0666);\r
if (NewPrivateFile->fd < 0) {\r
if (PrivateFile->UnixThunk->GetErrno () == ENOENT) {\r
- Status = EFI_NOT_FOUND;\r
+ Status = EFI_NOT_FOUND;\r
} else {\r
- Status = EFI_ACCESS_DENIED;\r
+ Status = EFI_ACCESS_DENIED;\r
}\r
}\r
}\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemClose (\r
- IN EFI_FILE *This\r
+ IN EFI_FILE_PROTOCOL *This\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemDelete (\r
- IN EFI_FILE *This\r
+ IN EFI_FILE_PROTOCOL *This\r
)\r
/*++\r
\r
struct tm *tm;\r
tm = UnixThunk->GmTime (&SystemTime);\r
Time->Year = tm->tm_year;\r
- Time->Month = tm->tm_mon;\r
+ Time->Month = tm->tm_mon + 1;\r
Time->Day = tm->tm_mday;\r
Time->Hour = tm->tm_hour;\r
Time->Minute = tm->tm_min;\r
UINTN NameSize;\r
UINTN ResultSize;\r
EFI_FILE_INFO *Info;\r
- CHAR8 *RealFileName;\r
- CHAR8 *TempPointer;\r
+ CHAR8 *RealFileName;\r
+ CHAR8 *TempPointer;\r
CHAR16 *BufferFileName;\r
- struct stat buf;\r
+ STAT_FIX buf;\r
\r
if (FileName != NULL) {\r
RealFileName = FileName;\r
}\r
if (PrivateFile->UnixThunk->Stat (\r
FileName == NULL ? PrivateFile->FileName : FileName,\r
- &buf) < 0)\r
+ &buf) < 0)\r
return EFI_DEVICE_ERROR;\r
\r
Status = EFI_SUCCESS;\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemRead (\r
- IN EFI_FILE *This,\r
- IN OUT UINTN *BufferSize,\r
- OUT VOID *Buffer\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
)\r
/*++\r
\r
CHAR8 *FullFileName;\r
EFI_TPL OldTpl;\r
\r
- if (This == NULL || BufferSize == NULL || Buffer == NULL) {\r
+ if (This == NULL || BufferSize == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ if ((*BufferSize != 0) && (Buffer == NULL)) {\r
+ // Buffer can be NULL if *BufferSize is zero\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
}\r
\r
Res = PrivateFile->UnixThunk->Read (\r
- PrivateFile->fd,\r
- Buffer,\r
- *BufferSize);\r
+ PrivateFile->fd,\r
+ Buffer,\r
+ *BufferSize);\r
if (Res < 0) {\r
Status = EFI_DEVICE_ERROR;\r
goto Done;\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
}\r
- \r
+ \r
AsciiStrCpy(FullFileName, PrivateFile->FileName);\r
AsciiStrCat(FullFileName, "/");\r
AsciiStrCat(FullFileName, PrivateFile->Dirent->d_name);\r
Status = UnixSimpleFileSystemFileInfo (PrivateFile,\r
- FullFileName,\r
- BufferSize,\r
- Buffer);\r
+ FullFileName,\r
+ BufferSize,\r
+ Buffer);\r
gBS->FreePool (FullFileName);\r
\r
PrivateFile->Dirent = NULL;\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemWrite (\r
- IN EFI_FILE *This,\r
- IN OUT UINTN *BufferSize,\r
- IN VOID *Buffer\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN OUT UINTN *BufferSize,\r
+ IN VOID *Buffer\r
)\r
/*++\r
\r
}\r
\r
Res = PrivateFile->UnixThunk->Write (\r
- PrivateFile->fd,\r
- Buffer,\r
- *BufferSize);\r
+ PrivateFile->fd,\r
+ Buffer,\r
+ *BufferSize);\r
if (Res == (UINTN)-1) {\r
Status = EFI_DEVICE_ERROR;\r
goto Done;\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemSetPosition (\r
- IN EFI_FILE *This,\r
- IN UINT64 Position\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN UINT64 Position\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemGetPosition (\r
- IN EFI_FILE *This,\r
- OUT UINT64 *Position\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ OUT UINT64 *Position\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemGetInfo (\r
- IN EFI_FILE *This,\r
- IN EFI_GUID *InformationType,\r
- IN OUT UINTN *BufferSize,\r
- OUT VOID *Buffer\r
+ IN EFI_FILE_PROTOCOL *This,\r
+ IN EFI_GUID *InformationType,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
)\r
/*++\r
\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemSetInfo (\r
- IN EFI_FILE *This,\r
+ IN EFI_FILE_PROTOCOL*This,\r
IN EFI_GUID *InformationType,\r
IN UINTN BufferSize,\r
IN VOID *Buffer\r
UINTN OldInfoSize;\r
EFI_TPL OldTpl;\r
mode_t NewAttr;\r
- struct stat OldAttr;\r
+ STAT_FIX OldAttr;\r
CHAR8 *OldFileName;\r
CHAR8 *NewFileName;\r
CHAR8 *CharPointer;\r
//\r
NewFileInfo = (EFI_FILE_INFO *) Buffer;\r
\r
- if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||\r
+ if ((NewFileInfo->Size <= SIZE_OF_EFI_FILE_INFO) ||\r
(NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||\r
(sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)\r
) {\r
}\r
\r
Status = gBS->AllocatePool (EfiBootServicesData, OldInfoSize,\r
- (VOID **)&OldFileInfo);\r
+ (VOID **)&OldFileInfo);\r
\r
if (EFI_ERROR (Status)) {\r
goto Done;\r
} else {\r
Status = gBS->AllocatePool (\r
EfiBootServicesData,\r
- AsciiStrLen (PrivateFile->FileName) + 1 + StrLen (NewFileInfo->FileName) + 1,\r
+ AsciiStrLen (PrivateFile->FileName) + 2 + StrLen (NewFileInfo->FileName) + 1,\r
(VOID **)&NewFileName\r
);\r
\r
\r
AsciiStrCpy (NewFileName, PrivateRoot->FilePath);\r
AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);\r
- while (AsciiFilePtr > NewFileName && AsciiFilePtr[-1] != '/') {\r
- AsciiFilePtr--;\r
+ if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {\r
+ // make sure there is a / between Root FilePath and NewFileInfo Filename\r
+ AsciiFilePtr[0] = '/'; \r
+ AsciiFilePtr[1] = '\0';\r
+ AsciiFilePtr++;\r
}\r
UnicodeFilePtr = NewFileInfo->FileName;\r
}\r
}\r
\r
UnixStatus = PrivateFile->UnixThunk->Chmod (NewFileName, NewAttr);\r
-\r
if (UnixStatus != 0) {\r
Status = EFI_DEVICE_ERROR;\r
}\r
EFI_STATUS\r
EFIAPI\r
UnixSimpleFileSystemFlush (\r
- IN EFI_FILE *This\r
+ IN EFI_FILE_PROTOCOL *This\r
)\r
/*++\r
\r