PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
elf_loader_stdio.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "elf_loader_common.h"
12
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16
23
24static void *elf_loader_reader_read_elf_file_stdlib_allocation_callback(
25 void *userdata, void *pointer, ptrdiff_t old_size, ptrdiff_t new_size)
26{
27 void *new_ptr;
28 (void)userdata;
29 (void)old_size;
30
31 if ( !new_size )
32 {
33 free(pointer);
34 return NULL;
35 }
36 new_ptr = realloc(pointer, new_size);
37 if ( !new_ptr )
38 {
39 free(pointer);
40 }
41 return new_ptr;
42}
43
44static int elf_loader_reader_read_elf_file_stdio_read_callback(
45 void *userdata, elf_loader_reader_stage_t stage, const elf_loader_reader_segment_info_t *segm_info, size_t segm_count)
46{
48 size_t i;
49
50 procinfo = (elf_loader_reader_info_stdio_t *)userdata;
51 if ( !procinfo->m_fp )
52 return 0;
53 for ( i = 0; i < segm_count; i += 1 )
54 {
55 if ( fseek(procinfo->m_fp, segm_info[i].m_segment_offset, SEEK_SET) )
56 {
57 return 0;
58 }
59 if ( ftell(procinfo->m_fp) != segm_info[i].m_segment_offset )
60 {
61 return 0;
62 }
63 if ( fread(segm_info[i].m_segment_addr, segm_info[i].m_segment_size, 1, procinfo->m_fp) != 1 )
64 {
65 return 0;
66 }
67 }
68 return 1;
69}
70
71static void
72elf_loader_reader_read_elf_file_stdio_result_callback(void *userdata, void *pointer, ptrdiff_t pointer_size, int errval)
73{
75
76 procinfo = (elf_loader_reader_info_stdio_t *)userdata;
77 procinfo->m_resultbuf.m_buf = pointer;
78 procinfo->m_resultbuf.m_bufsize = pointer_size;
79 procinfo->m_resultbuf.m_result = errval;
80}
81
82int elf_loader_reader_read_elf_file_stdio(
83 elf_loader_reader_info_stdio_resultbuf_t *resultbuf, const char *filename, const char *flags)
84{
86
87 procinfo.m_reader_info.m_userdata = &procinfo;
88 procinfo.m_reader_info.m_alloc_callback = elf_loader_reader_read_elf_file_stdlib_allocation_callback;
89 procinfo.m_reader_info.m_read_callback = elf_loader_reader_read_elf_file_stdio_read_callback;
90 procinfo.m_reader_info.m_result_callback = elf_loader_reader_read_elf_file_stdio_result_callback;
91 procinfo.m_fp = fopen(filename, flags);
92 if ( !procinfo.m_fp )
93 return -30;
94 elf_loader_reader_read_elf_file(&procinfo.m_reader_info);
95 if ( procinfo.m_fp )
96 {
97 fclose(procinfo.m_fp);
98 procinfo.m_fp = NULL;
99 }
100 if ( resultbuf )
101 memcpy(resultbuf, &procinfo.m_resultbuf, sizeof(elf_loader_reader_info_stdio_resultbuf_t));
102 return procinfo.m_resultbuf.m_result;
103}