get rid of composite error type nonsense
This commit is contained in:
parent
bd4ea8f2e6
commit
3ce2738715
2 changed files with 11 additions and 24 deletions
|
|
@ -29,7 +29,7 @@ static void relf_unmap(relf_t* relf)
|
||||||
relf->image_size = 0;
|
relf->image_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
relf_value_t relf_open(relf_t* relf, const char* path)
|
relf_error_t relf_open(relf_t* relf, const char* path)
|
||||||
{
|
{
|
||||||
// reset struct
|
// reset struct
|
||||||
memset(relf, '\0', sizeof(relf_t));
|
memset(relf, '\0', sizeof(relf_t));
|
||||||
|
|
@ -37,23 +37,23 @@ relf_value_t relf_open(relf_t* relf, const char* path)
|
||||||
// try stat file
|
// try stat file
|
||||||
struct stat st = {0};
|
struct stat st = {0};
|
||||||
if (stat(path, &st))
|
if (stat(path, &st))
|
||||||
return RELF_ERROR(RELF_FAILED_OPEN);
|
return RELF_FAILED_OPEN;
|
||||||
if (check_32bit_limit(st.st_size))
|
if (check_32bit_limit(st.st_size))
|
||||||
return RELF_ERROR(RELF_TOO_BIG);
|
return RELF_TOO_BIG;
|
||||||
|
|
||||||
relf->image_size = (size_t)st.st_size;
|
relf->image_size = (size_t)st.st_size;
|
||||||
TRACE("image_size %lu\n", relf->image_size);
|
TRACE("image_size %lu\n", relf->image_size);
|
||||||
// open file and read ELF header
|
// open file and read ELF header
|
||||||
int fd = open(path, O_RDONLY);
|
int fd = open(path, O_RDONLY);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return RELF_ERROR(RELF_FAILED_OPEN);
|
return RELF_FAILED_OPEN;
|
||||||
|
|
||||||
// read ELF's ident header, which contains magic and type
|
// read ELF's ident header, which contains magic and type
|
||||||
uint8_t e_ident[EI_NIDENT];
|
uint8_t e_ident[EI_NIDENT];
|
||||||
if (read(fd, e_ident, EI_NIDENT) < EI_NIDENT)
|
if (read(fd, e_ident, EI_NIDENT) < EI_NIDENT)
|
||||||
{
|
{
|
||||||
close(fd);
|
close(fd);
|
||||||
return RELF_ERROR(RELF_FAILED_OPEN);
|
return RELF_FAILED_OPEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check magic and decide ELF type
|
// check magic and decide ELF type
|
||||||
|
|
@ -62,7 +62,7 @@ relf_value_t relf_open(relf_t* relf, const char* path)
|
||||||
{
|
{
|
||||||
// not an ELF file at all
|
// not an ELF file at all
|
||||||
close(fd);
|
close(fd);
|
||||||
return RELF_ERROR(RELF_NOT_AN_ELF);
|
return RELF_NOT_AN_ELF;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 32 bit or 64 bit
|
// 32 bit or 64 bit
|
||||||
|
|
@ -72,14 +72,14 @@ relf_value_t relf_open(relf_t* relf, const char* path)
|
||||||
case ELFCLASS64: relf->type = RELF_64BIT; break;
|
case ELFCLASS64: relf->type = RELF_64BIT; break;
|
||||||
default:
|
default:
|
||||||
close(fd);
|
close(fd);
|
||||||
return RELF_ERROR(RELF_UNSUPPORTED);
|
return RELF_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e_ident[EI_DATA] != ELFDATA2LSB)
|
if (e_ident[EI_DATA] != ELFDATA2LSB)
|
||||||
{
|
{
|
||||||
// not little endian, we can't work with that
|
// not little endian, we can't work with that
|
||||||
close(fd);
|
close(fd);
|
||||||
return RELF_ERROR(RELF_UNSUPPORTED);
|
return RELF_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// we don't care about ABI, OS, machine type or ELF type,
|
// we don't care about ABI, OS, machine type or ELF type,
|
||||||
|
|
@ -91,7 +91,7 @@ relf_value_t relf_open(relf_t* relf, const char* path)
|
||||||
if (relf->image == MAP_FAILED)
|
if (relf->image == MAP_FAILED)
|
||||||
{
|
{
|
||||||
TRACE("mmap failed errno %d %s\n", errno, strerror(errno));
|
TRACE("mmap failed errno %d %s\n", errno, strerror(errno));
|
||||||
return RELF_ERROR(RELF_MMAP_FAILED);
|
return RELF_MMAP_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// now we need to parse segments and section headers
|
// now we need to parse segments and section headers
|
||||||
|
|
@ -308,7 +308,7 @@ relf_value_t relf_open(relf_t* relf, const char* path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return RELF_ERROR(RELF_OK);
|
return RELF_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void relf_close(relf_t* relf)
|
void relf_close(relf_t* relf)
|
||||||
|
|
|
||||||
|
|
@ -14,19 +14,6 @@ typedef enum {
|
||||||
RELF_OK = 0,
|
RELF_OK = 0,
|
||||||
} relf_error_t;
|
} relf_error_t;
|
||||||
|
|
||||||
typedef union {
|
|
||||||
relf_error_t error;
|
|
||||||
|
|
||||||
// yeah, we're going to always use 64bit value so
|
|
||||||
// we won't get any undefined behavior regardless
|
|
||||||
// host and target architectures
|
|
||||||
uint64_t value;
|
|
||||||
} relf_value_t;
|
|
||||||
|
|
||||||
// supply relf_value_t type here
|
|
||||||
#define RELF_IS_ERROR(v) (v.error < 0)
|
|
||||||
#define RELF_ERROR(e) ((relf_value_t) {.error = e})
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RELF_32BIT,
|
RELF_32BIT,
|
||||||
RELF_64BIT
|
RELF_64BIT
|
||||||
|
|
@ -108,7 +95,7 @@ typedef struct {
|
||||||
|
|
||||||
// opens ELF file, checks ELF magic and maps it into memory
|
// opens ELF file, checks ELF magic and maps it into memory
|
||||||
// may load additional info like string table
|
// may load additional info like string table
|
||||||
relf_value_t relf_open(relf_t* relf, const char* path);
|
relf_error_t relf_open(relf_t* relf, const char* path);
|
||||||
|
|
||||||
// closes mapping and file, frees any allocated memory in relf instance
|
// closes mapping and file, frees any allocated memory in relf instance
|
||||||
void relf_close(relf_t* relf);
|
void relf_close(relf_t* relf);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue