bump copyright date on affected files and version
[AROS.git] / arch / all-hosted / bootstrap / elf_io.c
blobbe0f94223b7b41a19b6da5adb70223bbe0f001ca
1 #include <elfloader.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
6 /*
7 * On MinGW32CE we:
8 * 1. Don't have 'errno'
9 * 2. Have a problem with errno.h (it tries to #include_next <errno.h>, which does not exist.
11 #ifdef __COREDLL__
12 #include <windows.h>
13 #define errno GetLastError()
14 #else
15 #include <errno.h>
16 #endif
18 #include "elf_io.h"
19 #include "filesystem.h"
20 #include "support.h"
22 #include <aros/config.h>
24 struct ExtELFNode
26 struct ELFNode node;
27 char FullName[1]; /* We need to store the full pathname */
30 struct ELFNode *FirstELF = NULL;
31 static struct ELFNode *LastELF = (struct ELFNode *)&FirstELF;
33 int AddKernelFile(char *name)
35 struct ExtELFNode *n;
37 n = malloc(sizeof(struct ExtELFNode) + strlen(name) + 1);
38 if (!n)
39 return 0;
41 n->node.Next = NULL;
42 strcpy(n->FullName, name);
43 #if AROS_MODULES_DEBUG
44 n->node.Name = n->FullName;
45 #else
46 n->node.Name = namepart(n->FullName);
47 #endif
49 LastELF->Next = &n->node;
50 LastELF = &n->node;
52 return 1;
55 void FreeKernelList(void)
57 struct ELFNode *n, *n2;
59 for (n = FirstELF; n; n = n2)
61 n2 = n->Next;
62 free(n);
65 /* Reset list pointers. The list can ocassionally be reused (on Android, for example) */
66 LastELF = (struct ELFNode *)&FirstELF;
69 void *open_file(struct ELFNode *n, unsigned int *err)
71 FILE *f;
73 f = file_open(((struct ExtELFNode *)n)->FullName, "rb");
74 *err = f ? 0 : errno;
76 return f;
79 void close_file(void *file)
81 fclose(file);
85 * read_block interface. we want to read from files here
87 int read_block(void *file, unsigned long offset, void *dest, unsigned long length)
89 int err;
91 err = fseek(file, offset, SEEK_SET);
92 if (err)
93 return errno;
95 err = fread(dest, length, 1, file);
96 if (err == 0)
97 return errno;
99 return 0;
103 * load_block also allocates the memory
105 void *load_block(void *file, unsigned long offset, unsigned long length, unsigned int *err)
107 void *dest = malloc(length);
109 if (dest)
111 *err = read_block(file, offset, dest, length);
112 if (*err)
114 free(dest);
115 return NULL;
117 *err = 0;
119 else
120 *err = errno;
122 return dest;
125 void free_block(void *addr)
127 free(addr);