mirror of https://github.com/acidanthera/audk.git
192 lines
5.7 KiB
C
192 lines
5.7 KiB
C
/** @file
|
|
Value transformations between stdio and the UEFI environment.
|
|
|
|
Copyright (c) 2010 - 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 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 <Uefi.h>
|
|
|
|
#include <LibConfig.h>
|
|
#include <sys/EfiCdefs.h>
|
|
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <Efi/SysEfi.h>
|
|
|
|
/** Translate the Open flags into a Uefi Open Modes value.
|
|
|
|
The Open Flags are:
|
|
O_RDONLY, O_WRONLY, O_RDWR // Pick only one
|
|
|
|
O_NONBLOCK, O_APPEND, O_CREAT, O_TRUNC, O_EXCL // ORed with one of the previous
|
|
|
|
The UEFI Open modes are:
|
|
// ******************************************************
|
|
// Open Modes
|
|
// ******************************************************
|
|
#define EFI_FILE_MODE_READ 0x0000000000000001
|
|
#define EFI_FILE_MODE_WRITE 0x0000000000000002
|
|
#define EFI_FILE_MODE_CREATE 0x8000000000000000
|
|
|
|
|
|
*/
|
|
UINT64
|
|
Oflags2EFI( int oflags )
|
|
{
|
|
UINT64 flags;
|
|
|
|
// Build the Open Modes
|
|
flags = (UINT64)((oflags & O_ACCMODE) + 1); // Handle the Read/Write flags
|
|
if(flags & EFI_FILE_MODE_WRITE) { // Asking for write only?
|
|
// EFI says the only two RW modes are read-only and read+write.
|
|
flags = EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE;
|
|
}
|
|
if(oflags & (O_CREAT | O_TRUNC)) { // Now add the Create flag.
|
|
// Also added if O_TRUNC set since we will need to create a new file.
|
|
// We just set the flags here since the only valid EFI mode with create
|
|
// is Read+Write+Create.
|
|
flags = EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE;
|
|
}
|
|
return flags;
|
|
}
|
|
|
|
/* Transform the permissions flags into their equivalent UEFI File Attribute bits.
|
|
This transformation is most frequently used when translating attributes for use
|
|
by the UEFI EFI_FILE_PROTOCOL.SetInfo() function.
|
|
|
|
The UEFI File attributes are:
|
|
// ******************************************************
|
|
// File Attributes
|
|
// ******************************************************
|
|
#define EFI_FILE_READ_ONLY 0x0000000000000001
|
|
#define EFI_FILE_HIDDEN 0x0000000000000002
|
|
#define EFI_FILE_SYSTEM 0x0000000000000004
|
|
#define EFI_FILE_RESERVED 0x0000000000000008
|
|
#define EFI_FILE_DIRECTORY 0x0000000000000010
|
|
#define EFI_FILE_ARCHIVE 0x0000000000000020
|
|
#define EFI_FILE_VALID_ATTR 0x0000000000000037
|
|
|
|
The input permission flags consist of the following flags:
|
|
O_RDONLY -- open for reading only
|
|
O_WRONLY -- open for writing only
|
|
O_RDWR -- open for reading and writing
|
|
O_ACCMODE -- mask for above modes
|
|
O_NONBLOCK -- no delay
|
|
O_APPEND -- set append mode
|
|
O_CREAT -- create if nonexistent
|
|
O_TRUNC -- truncate to zero length
|
|
O_EXCL -- error if already exists
|
|
O_HIDDEN -- Hidden file attribute
|
|
O_SYSTEM -- System file attribute
|
|
O_ARCHIVE -- Archive file attribute
|
|
*/
|
|
UINT64
|
|
Omode2EFI( int mode)
|
|
{
|
|
UINT64 flags = 0;
|
|
|
|
/* File is Read-Only. */
|
|
if((mode & O_ACCMODE) == 0) {
|
|
flags = EFI_FILE_READ_ONLY;
|
|
}
|
|
/* Set the Hidden attribute. */
|
|
if((mode & O_HIDDEN) != 0) {
|
|
flags |= EFI_FILE_HIDDEN;
|
|
}
|
|
/* Set the System attribute. */
|
|
if((mode & O_SYSTEM) != 0) {
|
|
flags |= EFI_FILE_SYSTEM;
|
|
}
|
|
/* Set the Archive attribute. */
|
|
if((mode & O_ARCHIVE) != 0) {
|
|
flags |= EFI_FILE_ARCHIVE;
|
|
}
|
|
return flags;
|
|
}
|
|
|
|
/* Converts the first several EFI status values into the appropriate errno value.
|
|
*/
|
|
int
|
|
EFI2errno( RETURN_STATUS Status)
|
|
{
|
|
int retval;
|
|
|
|
switch(Status) {
|
|
case RETURN_SUCCESS:
|
|
retval = 0;
|
|
break;
|
|
case RETURN_INVALID_PARAMETER:
|
|
retval = EINVAL;
|
|
break;
|
|
case RETURN_UNSUPPORTED:
|
|
retval = ENODEV;
|
|
break;
|
|
case RETURN_BAD_BUFFER_SIZE:
|
|
case RETURN_BUFFER_TOO_SMALL:
|
|
retval = EBUFSIZE;
|
|
break;
|
|
case RETURN_NOT_READY:
|
|
retval = EBUSY;
|
|
break;
|
|
case RETURN_WRITE_PROTECTED:
|
|
retval = EROFS;
|
|
break;
|
|
case RETURN_OUT_OF_RESOURCES: // May be overridden by specific functions
|
|
retval = ENOMEM;
|
|
break;
|
|
case RETURN_VOLUME_FULL:
|
|
retval = ENOSPC;
|
|
break;
|
|
case RETURN_NOT_FOUND:
|
|
case RETURN_NO_MAPPING:
|
|
retval = ENOENT;
|
|
break;
|
|
case RETURN_TIMEOUT:
|
|
retval = ETIMEDOUT;
|
|
break;
|
|
case RETURN_NOT_STARTED:
|
|
retval = EAGAIN;
|
|
break;
|
|
case RETURN_ALREADY_STARTED:
|
|
retval = EALREADY;
|
|
break;
|
|
case RETURN_ABORTED:
|
|
retval = EINTR;
|
|
break;
|
|
case RETURN_ICMP_ERROR:
|
|
case RETURN_TFTP_ERROR:
|
|
case RETURN_PROTOCOL_ERROR:
|
|
retval = EPROTO;
|
|
break;
|
|
case RETURN_INCOMPATIBLE_VERSION:
|
|
retval = EPERM;
|
|
break;
|
|
case RETURN_ACCESS_DENIED:
|
|
case RETURN_SECURITY_VIOLATION:
|
|
retval = EACCES;
|
|
break;
|
|
/* case RETURN_LOAD_ERROR:
|
|
case RETURN_DEVICE_ERROR:
|
|
case RETURN_VOLUME_CORRUPTED:
|
|
case RETURN_NO_MEDIA:
|
|
case RETURN_MEDIA_CHANGED:
|
|
case RETURN_NO_RESPONSE:
|
|
case RETURN_CRC_ERROR:
|
|
case RETURN_END_OF_MEDIA:
|
|
case RETURN_END_OF_FILE:
|
|
case RETURN_INVALID_LANGUAGE:
|
|
*/
|
|
default:
|
|
retval = EIO;
|
|
break;
|
|
}
|
|
return retval;
|
|
}
|