a17216d5ea74aeaa36c3ae2cd285c3ef23b7407c
[centaur.git] / src / elfhandle.c
1 #include <errno.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <unistd.h>
8
9 #include <libelf.h>
10
11 #include "elfhandle.h"
12
13
14 void openElf(ELFHandles *h, char *fn, Elf_Cmd elfmode)
15 {
16   int openflags = 0;
17   int openmode = 0;
18
19   h->e = NULL;
20
21   switch(elfmode) {
22     case ELF_C_READ:
23       openflags = O_RDONLY;
24       break;
25     case ELF_C_WRITE:
26       openflags = O_WRONLY | O_CREAT;
27       openmode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
28       break;
29     case ELF_C_RDWR:
30       openflags = O_RDWR;
31       break;
32     default:
33       return;
34   }
35
36
37   h->fd = open(fn, openflags, openmode);
38   if (h->fd < 0) {
39     fprintf(stderr, "Cannot open %s: %s\n", fn, strerror(errno));
40     return;
41   }
42
43   h->e = elf_begin(h->fd, elfmode, NULL);
44   if (!h->e) {
45     fprintf(stderr, "elf_begin() failed on %s: %s\n", fn, elf_errmsg(-1));
46     goto ERR;
47   }
48
49   if (elfmode == ELF_C_READ || elfmode == ELF_C_RDWR) {
50     if (elf_kind(h->e) != ELF_K_ELF) {
51       fprintf(stderr, "Not an ELF object: %s", fn);
52       goto ERR;
53     }
54   }
55
56   return;
57
58 ERR:
59   if (h->e) {
60     elf_end(h->e);
61     h->e = NULL;
62   }
63   close(h->fd);
64 }
65
66
67 void closeElf(ELFHandles *h)
68 {
69   if (h->e) {
70     elf_end(h->e);
71     close(h->fd);
72     h->e = NULL;
73   }
74 }